diff --git a/src/pipelines/agents/agent.wgsl b/src/pipelines/agents/agent.wgsl index d06066c..8aec868 100644 --- a/src/pipelines/agents/agent.wgsl +++ b/src/pipelines/agents/agent.wgsl @@ -53,11 +53,7 @@ fn main(@builtin(global_invocation_id) global_id: vec3) { agent.angle += 3.14159265359 + random - 0.5; } - textureStore( - TrailMapOut, - vec2(newPos * settings.size), - vec4(1) - ); + textureStore(TrailMapOut, vec2(newPos * settings.size), vec4(1, 0, 0, 0)); agent.position = newPos; agents[id] = agent; @@ -67,7 +63,7 @@ fn sense(agent: Agent, sensorAngleOffset: f32) -> f32 { let sensorAngle: f32 = agent.angle + sensorAngleOffset; let sensorDir: vec2 = vec2(cos(sensorAngle), sin(sensorAngle)) / normalize(settings.size); let sensorPos: vec2 = agent.position + sensorDir * settings.sensorOffsetDst; - return textureLoad(TrailMapIn, vec2(sensorPos * settings.size), 0).x; + return length(textureLoad(TrailMapIn, vec2(sensorPos * settings.size), 0)); } fn random(state0: u32) -> f32 { diff --git a/src/pipelines/brush/brush-pipeline.ts b/src/pipelines/brush/brush-pipeline.ts index e5afdc4..ada27d0 100644 --- a/src/pipelines/brush/brush-pipeline.ts +++ b/src/pipelines/brush/brush-pipeline.ts @@ -75,11 +75,15 @@ export class BrushPipeline { format: 'rgba16float', blend: { color: { + operation: 'add', + srcFactor: 'zero', + dstFactor: 'one', + }, + alpha: { operation: 'max', srcFactor: 'one', dstFactor: 'one', }, - alpha: {}, }, }, ], diff --git a/src/pipelines/brush/brush.wgsl b/src/pipelines/brush/brush.wgsl index b6319c0..071845e 100644 --- a/src/pipelines/brush/brush.wgsl +++ b/src/pipelines/brush/brush.wgsl @@ -45,5 +45,6 @@ fn fragment( discard; } - return vec4(clamp((settings.brushWidth - distance) / settings.brushBlurWidth, 0, 1)); + let strength = clamp((settings.brushWidth - distance) / settings.brushBlurWidth, 0, 1); + return vec4(0, 0, 0, strength); } diff --git a/src/pipelines/render/render-pipeline.ts b/src/pipelines/render/render-pipeline.ts index 94cc75d..a0384d3 100644 --- a/src/pipelines/render/render-pipeline.ts +++ b/src/pipelines/render/render-pipeline.ts @@ -5,7 +5,7 @@ import { RenderSettings } from './render-settings'; import shader from './render.wgsl'; export class RenderPipeline { - private static readonly UNIFORM_COUNT = 4; + private static readonly UNIFORM_COUNT = 16; private readonly pipeline: GPURenderPipeline; private readonly uniforms: GPUBuffer; @@ -48,11 +48,24 @@ export class RenderPipeline { canvasSize, deltaTime, time, + brushColor, + speciesColorA, + speciesColorB, }: CommonParameters & RenderSettings) { this.device.queue.writeBuffer( this.uniforms, 0, - new Float32Array([...canvasSize, deltaTime, time]) + new Float32Array([ + ...canvasSize, + deltaTime, + time, + ...brushColor, + 0, //padding + ...speciesColorA, + 0, //padding + ...speciesColorB, + 0, //padding + ]) ); } diff --git a/src/pipelines/render/render-settings.ts b/src/pipelines/render/render-settings.ts index efa387a..99ff690 100644 --- a/src/pipelines/render/render-settings.ts +++ b/src/pipelines/render/render-settings.ts @@ -1 +1,7 @@ -export interface RenderSettings {} +import { vec3 } from 'gl-matrix'; + +export interface RenderSettings { + brushColor: vec3; + speciesColorA: vec3; + speciesColorB: vec3; +} diff --git a/src/pipelines/render/render.wgsl b/src/pipelines/render/render.wgsl index 878e28e..18c8d82 100644 --- a/src/pipelines/render/render.wgsl +++ b/src/pipelines/render/render.wgsl @@ -2,6 +2,9 @@ struct Settings { size: vec2, deltaTime: f32, time: f32, + brushColor: vec3, + speciesColorA: vec3, + speciesColorB: vec3, }; @group(0) @binding(0) var settings: Settings; @@ -10,6 +13,15 @@ struct Settings { @fragment fn fragment(@location(0) uv: vec2) -> @location(0) vec4 { - return vec4(textureSample(TargetTexture, mySampler, uv).rgb, 1.0); - return vec4(0, settings.deltaTime * 0.0, 0.0, 1.0); + let traces = textureSample(TargetTexture, mySampler, uv); + + let speciesAStrength = traces.r; + let speciesBStrength = traces.g; + let brushStrength = traces.a; + return vec4( + settings.speciesColorA * speciesAStrength + + settings.speciesColorB * speciesBStrength + + settings.brushColor * brushStrength, + 1 + ); } diff --git a/src/settings.ts b/src/settings.ts index d51adb2..057a637 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -5,6 +5,15 @@ import { DiffusionSettings } from './pipelines/diffusion/diffusion-settings'; import { RenderSettings } from './pipelines/render/render-settings'; import { rgb255 } from './utils/colors/rgb255'; +const palette = { + blue: rgb255(0, 110, 202), + red: rgb255(232, 141, 122), + green: rgb255(90, 188, 94), + purple: rgb255(161, 90, 188), + yellow: rgb255(255, 204, 0), + beige: rgb255(229, 204, 175), +}; + export const settings: GameLoopSettings & AgentSettings & BrushSettings & @@ -23,15 +32,10 @@ export const settings: GameLoopSettings & sensorAngleDegrees: 30, sensorOffsetDst: 0.025, - decayRate: 0.01, - diffusionRate: 0.8, -}; + decayRate: 0.005, + diffusionRate: 0.9, -const paletteMap = { - blue: rgb255(0, 110, 202), - red: rgb255(232, 141, 122), - green: rgb255(90, 188, 94), - purple: rgb255(161, 90, 188), - yellow: rgb255(255, 204, 0), - beige: rgb255(229, 204, 175), + brushColor: palette.beige, + speciesColorA: palette.yellow, + speciesColorB: palette.green, };