From 66d5f6b251e68bd6131ee552184b4d9adea92ba7 Mon Sep 17 00:00:00 2001 From: Jared Miller Date: Wed, 11 Mar 2026 14:10:38 -0400 Subject: [PATCH] Add SandPhysicsScene for Margolus block CA --- src/scenes/SandPhysicsScene.ts | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/scenes/SandPhysicsScene.ts diff --git a/src/scenes/SandPhysicsScene.ts b/src/scenes/SandPhysicsScene.ts new file mode 100644 index 0000000..6c7a531 --- /dev/null +++ b/src/scenes/SandPhysicsScene.ts @@ -0,0 +1,43 @@ +import * as THREE from "three"; +import type Renderer from "../Renderer"; +import fragmentShader from "../shaders/sandPhysics.frag"; +import vertexShader from "../shaders/sandPhysics.vert"; +import FullScreenTriangleGeometry from "../utils/FullScreenTriangleGeometry"; +import AbstractScene from "./AbstractScene"; + +export default class SandPhysicsScene extends AbstractScene { + public readonly camera: THREE.OrthographicCamera = + new THREE.OrthographicCamera(); + public readonly material: THREE.RawShaderMaterial; + + constructor(renderer: Renderer) { + super(renderer); + + const geometry = new FullScreenTriangleGeometry(); + const material = new THREE.RawShaderMaterial({ + uniforms: { + uWorld: { value: null }, + uMaterialProps: { value: null }, + uBlockOffset: { value: new THREE.Vector2(0, 0) }, + uFrame: { value: 0 }, + }, + vertexShader, + fragmentShader, + defines: this.renderer.getCommonMaterialDefines(), + glslVersion: THREE.GLSL3, + }); + const mesh = new THREE.Mesh(geometry, material); + this.add(mesh); + + this.material = material; + } + + public recompileMaterials() { + this.material.defines = this.renderer.getCommonMaterialDefines(); + this.material.needsUpdate = true; + } + + public resize(_width: number, _height: number) {} + + public update() {} +}