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 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),
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue