diff --git a/src/App.ts b/src/App.ts index 6ef22f1..0838c7d 100644 --- a/src/App.ts +++ b/src/App.ts @@ -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), }; } diff --git a/src/Renderer.ts b/src/Renderer.ts index e1e89e1..f835c50 100644 --- a/src/Renderer.ts +++ b/src/Renderer.ts @@ -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,