From 6351a677037a7361df77d8d027b612bd1e2e3645 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Sat, 20 May 2023 11:45:11 +0100 Subject: [PATCH] Use angle instead of direction --- src/game-loop/spawn-agents.ts | 2 +- src/pipelines/agents/agent-pipeline.ts | 3 ++- src/pipelines/agents/agent.ts | 2 +- src/pipelines/agents/agent.wgsl | 24 +++++++++++++----------- src/settings.ts | 4 ++-- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/game-loop/spawn-agents.ts b/src/game-loop/spawn-agents.ts index 0770008..7420a3b 100644 --- a/src/game-loop/spawn-agents.ts +++ b/src/game-loop/spawn-agents.ts @@ -18,7 +18,7 @@ export const spawnAgents = (canvasSize: vec2, agentCount: number): Array return { position, - direction: vec2.fromValues(Math.cos(angle + Math.PI), Math.sin(angle + Math.PI)), + angle: angle + Math.PI, species: 0, timeToLive: Random.randomBetween(10, 15000), }; diff --git a/src/pipelines/agents/agent-pipeline.ts b/src/pipelines/agents/agent-pipeline.ts index 1e3c156..5096ec1 100644 --- a/src/pipelines/agents/agent-pipeline.ts +++ b/src/pipelines/agents/agent-pipeline.ts @@ -52,7 +52,8 @@ export class AgentPipeline { new Float32Array(this.agentsBuffer.getMappedRange()).set( agents.flatMap((agent) => [ ...agent.position, - ...agent.direction, + agent.angle, + 0, // padding agent.species, agent.timeToLive, ]) diff --git a/src/pipelines/agents/agent.ts b/src/pipelines/agents/agent.ts index 84e463d..2f4cd1a 100644 --- a/src/pipelines/agents/agent.ts +++ b/src/pipelines/agents/agent.ts @@ -2,7 +2,7 @@ import { vec2 } from 'gl-matrix'; export interface Agent { position: vec2; - direction: vec2; + angle: number; species: number; timeToLive: number; } diff --git a/src/pipelines/agents/agent.wgsl b/src/pipelines/agents/agent.wgsl index e0dad82..c063fb9 100644 --- a/src/pipelines/agents/agent.wgsl +++ b/src/pipelines/agents/agent.wgsl @@ -1,6 +1,6 @@ struct Agent { position: vec2, - direction: vec2, + angle: f32, species: f32, timeToLive: f32 } @@ -37,7 +37,7 @@ fn main(@builtin(global_invocation_id) global_id: vec3) { // agent.species = 1; // agent.timeToLive = 1000; // agents[id] = agent; - return; + // return; } let random = random_with_seed(agent.position, f32(id) + state.time); @@ -55,9 +55,9 @@ fn main(@builtin(global_invocation_id) global_id: vec3) { } - let trailForward = sense(agent.position, agent.direction, settings.sensorOffset, 0); - let trailLeft = sense(agent.position, agent.direction, settings.sensorOffset, settings.sensorAngle); - let trailRight = sense(agent.position, agent.direction, settings.sensorOffset, -settings.sensorAngle); + let trailForward = sense(agent.position, agent.angle, settings.sensorOffset, 0); + let trailLeft = sense(agent.position, agent.angle, settings.sensorOffset, settings.sensorAngle); + let trailRight = sense(agent.position, agent.angle, settings.sensorOffset, -settings.sensorAngle); var weightForward: f32 = trailForward.a * settings.brushTrailWeight; var weightLeft: f32 = trailLeft.a * settings.brushTrailWeight; @@ -81,13 +81,14 @@ fn main(@builtin(global_invocation_id) global_id: vec3) { rotation = random * settings.turnRate * state.deltaTime; } - var nextDirection = agent.direction * mat2x2(cos(rotation), sin(rotation), -sin(rotation), cos(rotation)); + var nextAngle = agent.angle + rotation; - var nextPosition = agent.position + agent.direction * settings.moveRate * state.deltaTime; + let direction = vec2(cos(agent.angle), sin(agent.angle)); + var nextPosition = agent.position + direction * settings.moveRate * state.deltaTime; nextPosition = clamp(nextPosition, vec2(0, 0), state.size); if nextPosition.x == 0 || nextPosition.x == state.size.x || nextPosition.y == 0 || nextPosition.y == state.size.y { rotation = 3.14159265359 + random - 0.5; - nextDirection = agent.direction * mat2x2(cos(rotation), sin(rotation), -sin(rotation), cos(rotation)); + nextAngle = agent.angle + rotation; } var trail = vec4(0, 1, 0, 0); @@ -99,13 +100,14 @@ fn main(@builtin(global_invocation_id) global_id: vec3) { textureStore(trailMapOut, vec2(nextPosition), vec4(trail.rgb + current.rgb, 0)); agent.position = nextPosition; - agent.direction = nextDirection; + agent.angle = nextAngle; agent.timeToLive -= state.deltaTime; agents[id] = agent; } -fn sense(agentPosition: vec2, agentDirection: vec2, sensorOffset: f32, sensorOffsetAngle: f32) -> vec4 { - let sensorDirection = agentDirection * mat2x2(cos(sensorOffsetAngle), sin(sensorOffsetAngle), -sin(sensorOffsetAngle), cos(sensorOffsetAngle)); +fn sense(agentPosition: vec2, agentAngle: f32, sensorOffset: f32, sensorOffsetAngle: f32) -> vec4 { + let sensorAngle = agentAngle + sensorOffsetAngle; + let sensorDirection = vec2(cos(sensorAngle), sin(sensorAngle)); let sensorPosition = vec2(agentPosition + sensorDirection * sensorOffset); return textureLoad(trailMapIn, sensorPosition, 0); } diff --git a/src/settings.ts b/src/settings.ts index 126c301..f2ed019 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -29,8 +29,8 @@ export const settings: GameLoopSettings & brushWidthRandomness: 8, brushTrailWeight: 5, - moveSpeed: 50, - turnSpeed: 10, + moveSpeed: 40, + turnSpeed: 20, sensorOffsetAngle: 30, sensorOffsetDistance: 60,