ants/src/scenes/AntsComputeScene.ts

61 lines
2.1 KiB
TypeScript

import type { WebGLRenderTarget } from "three";
import * as THREE from "three";
import type Renderer from "../Renderer";
import fragmentShader from "../shaders/antsCompute.frag";
import vertexShader from "../shaders/antsCompute.vert";
import FullScreenTriangleGeometry from "../utils/FullScreenTriangleGeometry";
import AbstractScene from "./AbstractScene";
export default class AntsComputeScene extends AbstractScene {
public camera: THREE.OrthographicCamera = new THREE.OrthographicCamera();
public material: THREE.RawShaderMaterial;
private renderTargets: [WebGLRenderTarget, WebGLRenderTarget];
constructor(renderer: Renderer) {
super(renderer);
const geometry = new FullScreenTriangleGeometry();
const material = new THREE.RawShaderMaterial({
uniforms: {
uTime: { value: 0 },
tLastState: { value: null },
tLastExtState: { value: null },
tWorld: { value: null },
tPresence: { value: null },
uMaterialProps: { value: null },
uForagerRatio: { value: 0 },
uAntSpawn: { value: new THREE.Vector4(0, 0, 0, 0) },
},
vertexShader,
fragmentShader,
defines: this.renderer.getCommonMaterialDefines(),
glslVersion: THREE.GLSL3,
});
const mesh = new THREE.Mesh(geometry, material);
this.add(mesh);
this.material = material;
this.renderTargets = [
this.renderer.resources.antsComputeTarget0,
this.renderer.resources.antsComputeTarget1,
];
}
public getRenderTargets(): [WebGLRenderTarget, WebGLRenderTarget] {
this.renderTargets.reverse();
return this.renderTargets;
}
public recompileMaterials() {
this.material.defines = this.renderer.getCommonMaterialDefines();
this.material.needsUpdate = true;
}
public resize(_width: number, _height: number) {}
public update() {
this.material.uniforms.uTime.value = performance.now();
}
}