Wire sand physics pass into render pipeline
This commit is contained in:
parent
66d5f6b251
commit
bf34de9816
2 changed files with 55 additions and 1 deletions
|
|
@ -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),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue