diff --git a/src/scenes/DrawScene.ts b/src/scenes/DrawScene.ts index 41ded5d..b2edcb7 100644 --- a/src/scenes/DrawScene.ts +++ b/src/scenes/DrawScene.ts @@ -18,7 +18,7 @@ export default class DrawScene extends AbstractScene { uniforms: { tWorld: { value: null }, pointerPosition: { value: new THREE.Vector2() }, - drawMode: { value: 0 }, + drawMode: { value: -1 }, brushRadius: { value: 0 }, }, vertexShader, diff --git a/src/scenes/ScreenScene.ts b/src/scenes/ScreenScene.ts index a4ea054..40bc485 100644 --- a/src/scenes/ScreenScene.ts +++ b/src/scenes/ScreenScene.ts @@ -1,5 +1,13 @@ import * as THREE from "three"; import Config from "../Config"; +import { + MAT_AIR, + MAT_DIRT, + MAT_FOOD, + MAT_HOME, + MAT_ROCK, + MAT_SAND, +} from "../constants"; import type Renderer from "../Renderer"; import fragmentShaderAnts from "../shaders/ants.frag"; import vertexShaderAnts from "../shaders/ants.vert"; @@ -7,21 +15,13 @@ import fragmentShaderGround from "../shaders/screenWorld.frag"; import vertexShaderGround from "../shaders/screenWorld.vert"; import AbstractScene from "./AbstractScene"; -enum PointerState { - None, - Food, - Home, - Obstacle, - Erase, -} - export default class ScreenScene extends AbstractScene { public readonly camera: THREE.OrthographicCamera; public readonly material: THREE.ShaderMaterial; public ants!: THREE.InstancedMesh; public readonly groundMaterial: THREE.ShaderMaterial; public readonly pointerPosition: THREE.Vector2 = new THREE.Vector2(); - public drawMode: PointerState = PointerState.None; + public drawMode: number = -1; // zoom stored in Config.cameraZoom private isPointerDown: boolean = false; public renderWidth: number = 1; @@ -148,26 +148,34 @@ export default class ScreenScene extends AbstractScene { window.addEventListener("keydown", (e) => { switch (e.code) { case "KeyQ": { - this.drawMode = PointerState.Home; + this.drawMode = MAT_HOME; break; } case "KeyW": { - this.drawMode = PointerState.Food; + this.drawMode = MAT_FOOD; break; } case "KeyE": { - this.drawMode = PointerState.Obstacle; + this.drawMode = MAT_ROCK; break; } case "KeyR": { - this.drawMode = PointerState.Erase; + this.drawMode = MAT_AIR; + break; + } + case "Digit1": { + this.drawMode = MAT_SAND; + break; + } + case "Digit2": { + this.drawMode = MAT_DIRT; break; } } }); window.addEventListener("keyup", () => { - this.drawMode = PointerState.None; + this.drawMode = -1; }); } diff --git a/src/shaders/draw.frag b/src/shaders/draw.frag index 483942e..bae8c11 100644 --- a/src/shaders/draw.frag +++ b/src/shaders/draw.frag @@ -13,24 +13,12 @@ uniform float brushRadius; void main() { vec4 lastState = texture(tWorld, vUv); - int cellData = int(lastState.x); - int isFood = cellData & 1; - int isHome = (cellData & 2) >> 1; - int isObstacle = (cellData & 4) >> 2; + float materialId = lastState.x; - if (distance(pointerPosition, vUv) < brushRadius / WORLD_SIZE) { - if (drawMode == 1.) { - isFood = 1; - } else if (drawMode == 2.) { - isHome = 1; - } else if (drawMode == 3.) { - isObstacle = 1; - } else if (drawMode == 4.) { - isFood = 0; - isHome = 0; - isObstacle = 0; - } + // drawMode >= 0 means painting that material ID; -1 means not drawing + if (drawMode >= 0. && distance(pointerPosition, vUv) < brushRadius / WORLD_SIZE) { + materialId = drawMode; } - FragColor = vec4(float(isFood + (isHome << 1) + (isObstacle << 2)), lastState.yzw); -} \ No newline at end of file + FragColor = vec4(materialId, lastState.yzw); +}