Integrate foliage rendering system into RuntimeHost

This commit is contained in:
2026-05-02 04:54:32 +02:00
parent 04c53b1ae6
commit 6e312864ac
3 changed files with 52 additions and 0 deletions

View File

@@ -41,6 +41,7 @@ import {
createModelInstanceRenderGroup,
disposeModelInstance
} from "../assets/model-instance-rendering";
import { FoliageInstancedRenderer } from "../foliage/foliage-instanced-renderer";
import type { LoadedModelAsset } from "../assets/gltf-model-import";
import type { LoadedImageAsset } from "../assets/image-assets";
import type { LoadedAudioAsset } from "../assets/audio-assets";
@@ -759,6 +760,11 @@ export class RuntimeHost {
LightVolumeRenderObjects
>();
private readonly modelRenderObjects = new Map<string, Group>();
private readonly foliageRenderer = new FoliageInstancedRenderer({
onRebuilt: () => {
this.applyShadowState();
}
});
private readonly materialTextureCache = new Map<
string,
CachedMaterialTexture
@@ -882,6 +888,7 @@ export class RuntimeHost {
this.scene.add(this.lightVolumeGroup);
this.scene.add(this.brushGroup);
this.scene.add(this.terrainGroup);
this.scene.add(this.foliageRenderer.group);
this.scene.add(this.modelGroup);
this.targetingLuxMesh.renderOrder = 10000;
this.targetingLuxGlowMesh.renderOrder = 9999;
@@ -1208,6 +1215,7 @@ export class RuntimeHost {
this.rebuildLightVolumes(runtimeScene.volumes.light);
this.rebuildBrushMeshes(runtimeScene.brushes);
this.rebuildTerrainMeshes(runtimeScene.terrains);
this.rebuildFoliage(runtimeScene);
this.rebuildModelRenderObjects(
runtimeScene.modelInstances,
runtimeScene.npcDefinitions
@@ -1404,6 +1412,7 @@ export class RuntimeHost {
this.clearLightVolumes();
this.clearBrushMeshes();
this.clearTerrainMeshes();
this.foliageRenderer.dispose();
this.clearModelRenderObjects();
this.collisionWorldRequestId += 1;
this.clearCollisionWorld();
@@ -3163,6 +3172,11 @@ export class RuntimeHost {
);
}
applyAdvancedRenderingRenderableShadowFlags(
this.foliageRenderer.group,
shadowsEnabled
);
for (const renderGroup of this.modelRenderObjects.values()) {
applyAdvancedRenderingRenderableShadowFlags(renderGroup, shadowsEnabled);
}
@@ -5012,6 +5026,14 @@ export class RuntimeHost {
this.terrainMeshes.clear();
}
private rebuildFoliage(runtimeScene: RuntimeSceneDefinition) {
this.foliageRenderer.sync({
terrains: runtimeScene.foliage.terrains,
foliageLayers: runtimeScene.foliage.layers,
foliagePrototypes: runtimeScene.foliage.prototypes
});
}
private disposeUniqueMaterials(materials: Material[]) {
for (const material of new Set(materials)) {
material.dispose();