From a95a5f83a36de3e484d50e2cbe23144daa86ffd9 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Sat, 27 May 2023 20:44:05 +0100 Subject: [PATCH] Improve agent agression --- src/game-loop/game-loop-settings.ts | 1 - src/game-loop/game-loop.ts | 10 +-- src/game-loop/game-rules.ts | 14 ---- src/page/set-up-settings-page.ts | 11 ++- src/pipelines/agents/agent-pipeline.ts | 18 ++--- src/pipelines/agents/agent-settings.ts | 2 + src/pipelines/agents/agent.wgsl | 99 ++++++++++++-------------- src/settings.ts | 3 +- 8 files changed, 66 insertions(+), 92 deletions(-) diff --git a/src/game-loop/game-loop-settings.ts b/src/game-loop/game-loop-settings.ts index bebdae1..085c9d8 100644 --- a/src/game-loop/game-loop-settings.ts +++ b/src/game-loop/game-loop-settings.ts @@ -4,7 +4,6 @@ export interface GameLoopSettings { renderSpeed: number; simulatedDelayMs: number; - aggressionFactor: number; spawnRadius: number; spawnInterval: number; diff --git a/src/game-loop/game-loop.ts b/src/game-loop/game-loop.ts index 79514f3..4aab844 100644 --- a/src/game-loop/game-loop.ts +++ b/src/game-loop/game-loop.ts @@ -188,15 +188,7 @@ export default class GameLoop { ].forEach((pipeline) => pipeline.setParameters({ time, - evenGenerationAggression: - this.gameRules.nextGenerationId % 2 - ? -1 - : this.gameRules.nextGenerationAgression, - oddGenerationAggression: - this.gameRules.nextGenerationId % 2 - ? this.gameRules.nextGenerationAgression - : -1, - nextGenerationId: this.gameRules.nextGenerationId, + isNextGenerationOdd: this.gameRules.nextGenerationId % 2, deltaTime, canvasSize: this.canvasSize, brushColor: GamePresentation.getGenerationColor( diff --git a/src/game-loop/game-rules.ts b/src/game-loop/game-rules.ts index 2117cad..d743313 100644 --- a/src/game-loop/game-rules.ts +++ b/src/game-loop/game-rules.ts @@ -1,6 +1,5 @@ import { GenerationCounts } from '../pipelines/agents/agent-generation/generation-counts'; import { settings } from '../settings'; -import { clamp01 } from '../utils/clamp'; import { Random } from '../utils/random'; import { vec2 } from 'gl-matrix'; @@ -65,17 +64,4 @@ export class GameRules { nextGenerationCount, }; } - - public get nextGenerationAgression(): number { - if (this.generationCounts.currentGenerationCount === 0) { - return 0; - } - - return clamp01( - (this.generationCounts.nextGenerationCount / - this.generationCounts.currentGenerationCount - - 1) * - settings.aggressionFactor - ); - } } diff --git a/src/page/set-up-settings-page.ts b/src/page/set-up-settings-page.ts index 847db07..8104217 100644 --- a/src/page/set-up-settings-page.ts +++ b/src/page/set-up-settings-page.ts @@ -21,9 +21,14 @@ export const setUpSettingsPage = ( rounding: Math.round, }), - new SettingsSlider(settings, 'aggressionFactor', { - min: 0, - max: 10, + new SettingsSlider(settings, 'currentGenerationAggression', { + min: -20, + max: 20, + }), + + new SettingsSlider(settings, 'nextGenerationAggression', { + min: -20, + max: 20, }), new SettingsSlider(settings, 'spawnRadius', { diff --git a/src/pipelines/agents/agent-pipeline.ts b/src/pipelines/agents/agent-pipeline.ts index e3dc8f8..9a2a863 100644 --- a/src/pipelines/agents/agent-pipeline.ts +++ b/src/pipelines/agents/agent-pipeline.ts @@ -49,9 +49,9 @@ export class AgentPipeline { turnSpeed, sensorOffsetAngle, sensorOffsetDistance, - evenGenerationAggression, - oddGenerationAggression, - nextGenerationId, + currentGenerationAggression, + nextGenerationAggression, + isNextGenerationOdd, center, radius, turnWhenGoingInTheRightDirection, @@ -60,9 +60,9 @@ export class AgentPipeline { deinfectionProbability, agentCount, }: AgentSettings & { - evenGenerationAggression: number; - oddGenerationAggression: number; - nextGenerationId: number; + currentGenerationAggression: number; + nextGenerationAggression: number; + isNextGenerationOdd: number; center: vec2; radius: number; agentCount: number; @@ -77,9 +77,9 @@ export class AgentPipeline { turnSpeed, (sensorOffsetAngle * Math.PI) / 180, sensorOffsetDistance, - evenGenerationAggression, - oddGenerationAggression, - nextGenerationId, + currentGenerationAggression, + nextGenerationAggression, + isNextGenerationOdd, ...center, radius, turnWhenGoingInTheRightDirection, diff --git a/src/pipelines/agents/agent-settings.ts b/src/pipelines/agents/agent-settings.ts index d72fa43..57d2706 100644 --- a/src/pipelines/agents/agent-settings.ts +++ b/src/pipelines/agents/agent-settings.ts @@ -8,4 +8,6 @@ export interface AgentSettings { turnWhenLost: number; individualTrailWeight: number; deinfectionProbability: number; + currentGenerationAggression: number; + nextGenerationAggression: number; } diff --git a/src/pipelines/agents/agent.wgsl b/src/pipelines/agents/agent.wgsl index 3de8ef7..ec4dc2c 100644 --- a/src/pipelines/agents/agent.wgsl +++ b/src/pipelines/agents/agent.wgsl @@ -6,9 +6,9 @@ struct Settings { sensorAngle: f32, sensorOffset: f32, - evenGenerationAggression: f32, - oddGenerationAggression: f32, - nextGenerationId: f32, + currentGenerationAggression: f32, + nextGenerationAggression: f32, + isNextGenerationOdd: f32, center: vec2, radius: f32, @@ -43,23 +43,6 @@ fn main( } var agent = agents[id]; - var trailBelow = textureLoad(trailMapIn, vec2(agent.position), 0); - - if settings.radius > 0 && length(settings.center - agent.position) < settings.radius { - agents[id].generation = settings.nextGenerationId; - - // clear trail map below so the agent won't die immediately - if (settings.nextGenerationId % 2 == 0) { - trailBelow.r += trailBelow.g; - trailBelow.g = 0; - } else { - trailBelow.g += trailBelow.r; - trailBelow.r = 0; - } - - textureStore(trailMapOut, vec2(agent.position), trailBelow); - return; - } let random = textureSampleLevel( noise, @@ -69,26 +52,26 @@ fn main( 0 ).a; - let isFromEvenGeneration = agent.generation % 2 == 0; - let isFromNextGeneration = agent.generation == settings.nextGenerationId; - let isFromCurrentGeneration = !isFromNextGeneration; + let isFromCurrentGeneration = abs(agent.generation - settings.isNextGenerationOdd); + let isFromOddGeneration = agent.generation == 1.0; - let trailForward = sense(agent.position, agent.angle, settings.sensorOffset , 0); + 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 = f32(isFromCurrentGeneration) * trailForward.a * settings.brushTrailWeight; - var weightLeft: f32 = f32(isFromCurrentGeneration) * trailLeft.a * settings.brushTrailWeight; - var weightRight: f32 = f32(isFromCurrentGeneration) * trailRight.a * settings.brushTrailWeight; + var weightForward: f32 = isFromCurrentGeneration * trailForward.a * settings.brushTrailWeight; + var weightLeft: f32 = isFromCurrentGeneration * trailLeft.a * settings.brushTrailWeight; + var weightRight: f32 = isFromCurrentGeneration * trailRight.a * settings.brushTrailWeight; - if (isFromEvenGeneration) { - weightForward += trailForward.r + settings.evenGenerationAggression * trailForward.g; - weightLeft += trailLeft.r + settings.evenGenerationAggression * trailLeft.g; - weightRight += trailRight.r + settings.evenGenerationAggression * trailRight.g; + let agression = isFromCurrentGeneration * settings.currentGenerationAggression + (1.0 - isFromCurrentGeneration) * settings.nextGenerationAggression; + if (isFromOddGeneration) { + weightForward += trailForward.g + agression * trailForward.r; + weightLeft += trailLeft.g + agression * trailLeft.r; + weightRight += trailRight.g + agression * trailRight.r; } else { - weightForward += trailForward.g + settings.oddGenerationAggression * trailForward.r; - weightLeft += trailLeft.g + settings.oddGenerationAggression * trailLeft.r; - weightRight += trailRight.g + settings.oddGenerationAggression * trailRight.r; + weightForward += trailForward.r + agression * trailForward.g; + weightLeft += trailLeft.r + agression * trailLeft.g; + weightRight += trailRight.r + agression * trailRight.g; } var rotation: f32 = 0; @@ -109,33 +92,39 @@ fn main( rotation = 3.14159265359 + random - 0.5; } - var trail = vec4(0, settings.individualTrailWeight, 0, 0); - if isFromEvenGeneration { - trail = vec4(settings.individualTrailWeight, 0, 0, 0); + var trail = vec4(settings.individualTrailWeight, 0, 0, 0); + if isFromOddGeneration { + trail = vec4(0, settings.individualTrailWeight, 0, 0); + } + + var trailBelow = textureLoad(trailMapIn, vec2(agent.position), 0); + + if settings.radius > 0 && length(settings.center - agent.position) < settings.radius { + agents[id].generation = settings.isNextGenerationOdd; + + // clear trail map below so the agent won't die immediately + if (settings.isNextGenerationOdd == 1.0) { + trailBelow.g += trailBelow.r; + trailBelow.r = 0; + } else { + trailBelow.r += trailBelow.g; + trailBelow.g = 0; + } + + textureStore(trailMapOut, vec2(agent.position), trailBelow); + return; } let next = vec4(trail.rgb + trailBelow.rgb, trailBelow.a); textureStore(trailMapOut, vec2(nextPosition), next); - - if isFromEvenGeneration { - if next.r < next.g { - if agent.generation == settings.nextGenerationId { - if random < settings.deinfectionProbability { - agent.generation -= 1; - } - } else { - agent.generation += 1; - } + + if isFromOddGeneration { + if next.g < next.r && (isFromCurrentGeneration == 1.0 || (isFromCurrentGeneration == 0.0 && random < settings.deinfectionProbability)) { + agent.generation = 0; } } else { - if next.g < next.r { - if agent.generation == settings.nextGenerationId { - if random < settings.deinfectionProbability { - agent.generation -= 1; - } - } else { - agent.generation += 1; - } + if next.r < next.g && (isFromCurrentGeneration == 1.0 || (isFromCurrentGeneration == 0.0 && random < settings.deinfectionProbability)) { + agent.generation = 1; } } diff --git a/src/settings.ts b/src/settings.ts index 0c8adc0..4cf4033 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -12,7 +12,8 @@ export const settings: { [key: string]: number } & GameLoopSettings & RenderSettings = persist({ agentCount: 1_000_000, - aggressionFactor: 3, + currentGenerationAggression: 0.1, + nextGenerationAggression: 10, moveSpeed: 80, turnSpeed: 550,