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

View file

@ -16,11 +16,19 @@ import {
generateLookupData, generateLookupData,
MaterialRegistry, MaterialRegistry,
} from "./materials"; } from "./materials";
import {
BEHAVIOR_GAS,
BEHAVIOR_LIQUID,
BEHAVIOR_POWDER,
BEHAVIOR_SOLID,
} from "./materials/types";
import { getBlockOffset } from "./sand/margolus";
interface Resources { interface Resources {
worldRenderTarget: THREE.WebGLRenderTarget; worldRenderTarget: THREE.WebGLRenderTarget;
worldRenderTargetCopy: THREE.WebGLRenderTarget; worldRenderTargetCopy: THREE.WebGLRenderTarget;
worldBlurredRenderTarget: THREE.WebGLRenderTarget; worldBlurredRenderTarget: THREE.WebGLRenderTarget;
sandPhysicsRenderTarget: THREE.WebGLRenderTarget;
antsComputeTarget0: THREE.WebGLRenderTarget; antsComputeTarget0: THREE.WebGLRenderTarget;
antsComputeTarget1: THREE.WebGLRenderTarget; antsComputeTarget1: THREE.WebGLRenderTarget;
antsDiscreteRenderTarget: THREE.WebGLRenderTarget; antsDiscreteRenderTarget: THREE.WebGLRenderTarget;
@ -30,6 +38,7 @@ interface Resources {
export default class Renderer { export default class Renderer {
private renderer: THREE.WebGLRenderer; private renderer: THREE.WebGLRenderer;
public resources!: Resources; public resources!: Resources;
private frameCounter = 0;
private colonyStats = new ColonyStats(); private colonyStats = new ColonyStats();
public readonly materialRegistry = new MaterialRegistry(); public readonly materialRegistry = new MaterialRegistry();
public readonly materialPropsTexture!: THREE.DataTexture; public readonly materialPropsTexture!: THREE.DataTexture;
@ -98,6 +107,17 @@ export default class Renderer {
minFilter: THREE.NearestFilter, 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), antsComputeTarget0: Renderer.makeAntsMRT(antTextureSize),
antsComputeTarget1: Renderer.makeAntsMRT(antTextureSize), antsComputeTarget1: Renderer.makeAntsMRT(antTextureSize),
antsDiscreteRenderTarget: new THREE.WebGLRenderTarget( antsDiscreteRenderTarget: new THREE.WebGLRenderTarget(
@ -146,10 +166,26 @@ export default class Renderer {
const [antsComputeSource, antsComputeTarget] = const [antsComputeSource, antsComputeTarget] =
scenes.ants.getRenderTargets(); 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.setViewportFromRT(this.resources.worldBlurredRenderTarget);
this.renderer.setRenderTarget(this.resources.worldBlurredRenderTarget); this.renderer.setRenderTarget(this.resources.worldBlurredRenderTarget);
scenes.worldBlur.material.uniforms.tWorld.value = scenes.worldBlur.material.uniforms.tWorld.value =
this.resources.worldRenderTarget.texture; this.resources.sandPhysicsRenderTarget.texture;
this.renderer.render(scenes.worldBlur, scenes.worldBlur.camera); this.renderer.render(scenes.worldBlur, scenes.worldBlur.camera);
this.renderer.setRenderTarget(this.resources.antsPresenceRenderTarget); this.renderer.setRenderTarget(this.resources.antsPresenceRenderTarget);
@ -272,6 +308,12 @@ export default class Renderer {
MAT_ROCK: String(MAT_ROCK), MAT_ROCK: String(MAT_ROCK),
MAT_FOOD: String(MAT_FOOD), MAT_FOOD: String(MAT_FOOD),
MAT_HOME: String(MAT_HOME), 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.setRenderTarget(this.resources.worldBlurredRenderTarget);
this.renderer.clear(); 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( this.resources.antsComputeTarget0.setSize(
antTextureSize, antTextureSize,
antTextureSize, antTextureSize,