Wire sand physics pass into render pipeline

This commit is contained in:
Jared Miller 2026-03-11 14:12:16 -04:00
parent 66d5f6b251
commit bf34de9816
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C
2 changed files with 55 additions and 1 deletions

View file

@ -5,6 +5,7 @@ import AntsComputeScene from "./scenes/AntsComputeScene";
import AntsDiscretizeScene from "./scenes/AntsDiscretizeScene";
import DrawScene from "./scenes/DrawScene";
import ScreenScene from "./scenes/ScreenScene";
import SandPhysicsScene from "./scenes/SandPhysicsScene";
import WorldBlurScene from "./scenes/WorldBlurScene";
import WorldComputeScene from "./scenes/WorldComputeScene";
@ -15,6 +16,7 @@ export interface SceneCollection {
discretize: AntsDiscretizeScene;
screen: ScreenScene;
draw: DrawScene;
sandPhysics: SandPhysicsScene;
}
export default new (class App {
@ -57,6 +59,7 @@ export default new (class App {
discretize: new AntsDiscretizeScene(this.renderer),
screen: new ScreenScene(this.renderer),
draw: new DrawScene(this.renderer),
sandPhysics: new SandPhysicsScene(this.renderer),
};
}

View file

@ -16,11 +16,19 @@ import {
generateLookupData,
MaterialRegistry,
} from "./materials";
import {
BEHAVIOR_GAS,
BEHAVIOR_LIQUID,
BEHAVIOR_POWDER,
BEHAVIOR_SOLID,
} from "./materials/types";
import { getBlockOffset } from "./sand/margolus";
interface Resources {
worldRenderTarget: THREE.WebGLRenderTarget;
worldRenderTargetCopy: THREE.WebGLRenderTarget;
worldBlurredRenderTarget: THREE.WebGLRenderTarget;
sandPhysicsRenderTarget: THREE.WebGLRenderTarget;
antsComputeTarget0: THREE.WebGLRenderTarget;
antsComputeTarget1: THREE.WebGLRenderTarget;
antsDiscreteRenderTarget: THREE.WebGLRenderTarget;
@ -30,6 +38,7 @@ interface Resources {
export default class Renderer {
private renderer: THREE.WebGLRenderer;
public resources!: Resources;
private frameCounter = 0;
private colonyStats = new ColonyStats();
public readonly materialRegistry = new MaterialRegistry();
public readonly materialPropsTexture!: THREE.DataTexture;
@ -98,6 +107,17 @@ export default class Renderer {
minFilter: THREE.NearestFilter,
},
),
sandPhysicsRenderTarget: new THREE.WebGLRenderTarget(
Config.worldSize,
Config.worldSize,
{
format: THREE.RGBAFormat,
type: THREE.FloatType,
depthBuffer: false,
magFilter: THREE.NearestFilter,
minFilter: THREE.NearestFilter,
},
),
antsComputeTarget0: Renderer.makeAntsMRT(antTextureSize),
antsComputeTarget1: Renderer.makeAntsMRT(antTextureSize),
antsDiscreteRenderTarget: new THREE.WebGLRenderTarget(
@ -146,10 +166,26 @@ export default class Renderer {
const [antsComputeSource, antsComputeTarget] =
scenes.ants.getRenderTargets();
// sand physics pass
const blockOffset = getBlockOffset(this.frameCounter);
this.setViewportFromRT(this.resources.sandPhysicsRenderTarget);
this.renderer.setRenderTarget(this.resources.sandPhysicsRenderTarget);
scenes.sandPhysics.material.uniforms.uWorld.value =
this.resources.worldRenderTarget.texture;
scenes.sandPhysics.material.uniforms.uMaterialProps.value =
this.materialPropsTexture;
scenes.sandPhysics.material.uniforms.uBlockOffset.value.set(
blockOffset.x,
blockOffset.y,
);
scenes.sandPhysics.material.uniforms.uFrame.value = this.frameCounter;
this.renderer.render(scenes.sandPhysics, scenes.sandPhysics.camera);
this.frameCounter++;
this.setViewportFromRT(this.resources.worldBlurredRenderTarget);
this.renderer.setRenderTarget(this.resources.worldBlurredRenderTarget);
scenes.worldBlur.material.uniforms.tWorld.value =
this.resources.worldRenderTarget.texture;
this.resources.sandPhysicsRenderTarget.texture;
this.renderer.render(scenes.worldBlur, scenes.worldBlur.camera);
this.renderer.setRenderTarget(this.resources.antsPresenceRenderTarget);
@ -272,6 +308,12 @@ export default class Renderer {
MAT_ROCK: String(MAT_ROCK),
MAT_FOOD: String(MAT_FOOD),
MAT_HOME: String(MAT_HOME),
BEHAVIOR_POWDER:
Renderer.convertNumberToFloatString(BEHAVIOR_POWDER),
BEHAVIOR_LIQUID:
Renderer.convertNumberToFloatString(BEHAVIOR_LIQUID),
BEHAVIOR_GAS: Renderer.convertNumberToFloatString(BEHAVIOR_GAS),
BEHAVIOR_SOLID: Renderer.convertNumberToFloatString(BEHAVIOR_SOLID),
};
}
@ -299,6 +341,15 @@ export default class Renderer {
this.renderer.setRenderTarget(this.resources.worldBlurredRenderTarget);
this.renderer.clear();
this.resources.sandPhysicsRenderTarget.setSize(
Config.worldSize,
Config.worldSize,
);
this.renderer.setRenderTarget(this.resources.sandPhysicsRenderTarget);
this.renderer.clear();
this.frameCounter = 0;
this.resources.antsComputeTarget0.setSize(
antTextureSize,
antTextureSize,