This commit is contained in:
parent
39b0160064
commit
2347ecd201
71 changed files with 3779 additions and 1586 deletions
|
|
@ -1,13 +1,2 @@
|
|||
import { vec2 } from 'gl-matrix';
|
||||
|
||||
export interface Agent {
|
||||
position: vec2;
|
||||
angle: number;
|
||||
colorIndex: number;
|
||||
targetPosition: vec2;
|
||||
targetAngle: number;
|
||||
introDelay: number;
|
||||
}
|
||||
|
||||
export const AGENT_FLOAT_COUNT = 8;
|
||||
export const AGENT_SIZE_IN_BYTES = AGENT_FLOAT_COUNT * Float32Array.BYTES_PER_ELEMENT;
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import shader from './agent.wgsl?raw';
|
|||
|
||||
export class AgentPipeline {
|
||||
private static readonly WORKGROUP_SIZE = 64;
|
||||
private static readonly UNIFORM_COUNT = 8;
|
||||
private static readonly UNIFORM_COUNT = 17;
|
||||
|
||||
private readonly bindGroupLayout: GPUBindGroupLayout;
|
||||
private readonly pipeline: GPUComputePipeline;
|
||||
|
|
@ -58,6 +58,15 @@ export class AgentPipeline {
|
|||
sensorOffsetDistance,
|
||||
turnWhenLost,
|
||||
individualTrailWeight,
|
||||
color1ToColor1,
|
||||
color1ToColor2,
|
||||
color1ToColor3,
|
||||
color2ToColor1,
|
||||
color2ToColor2,
|
||||
color2ToColor3,
|
||||
color3ToColor1,
|
||||
color3ToColor2,
|
||||
color3ToColor3,
|
||||
agentCount,
|
||||
introProgress,
|
||||
}: AgentSettings & {
|
||||
|
|
@ -74,6 +83,15 @@ export class AgentPipeline {
|
|||
this.uniformValues[5] = individualTrailWeight;
|
||||
this.uniformValues[6] = agentCount;
|
||||
this.uniformValues[7] = introProgress ?? 1;
|
||||
this.uniformValues[8] = color1ToColor1;
|
||||
this.uniformValues[9] = color1ToColor2;
|
||||
this.uniformValues[10] = color1ToColor3;
|
||||
this.uniformValues[11] = color2ToColor1;
|
||||
this.uniformValues[12] = color2ToColor2;
|
||||
this.uniformValues[13] = color2ToColor3;
|
||||
this.uniformValues[14] = color3ToColor1;
|
||||
this.uniformValues[15] = color3ToColor2;
|
||||
this.uniformValues[16] = color3ToColor3;
|
||||
writeFloat32BufferIfChanged(
|
||||
this.device,
|
||||
this.uniforms,
|
||||
|
|
|
|||
|
|
@ -1,4 +1,13 @@
|
|||
export interface AgentSettings {
|
||||
color1ToColor1: number;
|
||||
color1ToColor2: number;
|
||||
color1ToColor3: number;
|
||||
color2ToColor1: number;
|
||||
color2ToColor2: number;
|
||||
color2ToColor3: number;
|
||||
color3ToColor1: number;
|
||||
color3ToColor2: number;
|
||||
color3ToColor3: number;
|
||||
moveSpeed: number;
|
||||
turnSpeed: number;
|
||||
sensorOffsetAngle: number;
|
||||
|
|
|
|||
|
|
@ -7,6 +7,15 @@ struct Settings {
|
|||
individualTrailWeight: f32,
|
||||
agentCount: f32,
|
||||
introProgress: f32,
|
||||
color1ToColor1: f32,
|
||||
color1ToColor2: f32,
|
||||
color1ToColor3: f32,
|
||||
color2ToColor1: f32,
|
||||
color2ToColor2: f32,
|
||||
color2ToColor3: f32,
|
||||
color3ToColor1: f32,
|
||||
color3ToColor2: f32,
|
||||
color3ToColor3: f32,
|
||||
};
|
||||
|
||||
@group(1) @binding(0) var<uniform> settings: Settings;
|
||||
|
|
@ -58,17 +67,19 @@ fn main(
|
|||
let sourceRightSample = textureLoad(sourceMap, rightSensor, 0);
|
||||
|
||||
let channelMask = get_channel_mask(agent.colorIndex);
|
||||
let friendForward = dot(trailForward.rgb, channelMask);
|
||||
let friendLeft = dot(trailLeft.rgb, channelMask);
|
||||
let friendRight = dot(trailRight.rgb, channelMask);
|
||||
let reactionMask = get_reaction_mask(agent.colorIndex);
|
||||
|
||||
let sourceForward = dot(sourceForwardSample.rgb, channelMask);
|
||||
let sourceLeft = dot(sourceLeftSample.rgb, channelMask);
|
||||
let sourceRight = dot(sourceRightSample.rgb, channelMask);
|
||||
let trailForwardWeight = dot(trailForward.rgb, reactionMask);
|
||||
let trailLeftWeight = dot(trailLeft.rgb, reactionMask);
|
||||
let trailRightWeight = dot(trailRight.rgb, reactionMask);
|
||||
|
||||
let weightForward = friendForward + sourceForward * 24.0;
|
||||
let weightLeft = friendLeft + sourceLeft * 24.0;
|
||||
let weightRight = friendRight + sourceRight * 24.0;
|
||||
let sourceForwardWeight = dot(sourceForwardSample.rgb, reactionMask);
|
||||
let sourceLeftWeight = dot(sourceLeftSample.rgb, reactionMask);
|
||||
let sourceRightWeight = dot(sourceRightSample.rgb, reactionMask);
|
||||
|
||||
let weightForward = trailForwardWeight + sourceForwardWeight * 24.0;
|
||||
let weightLeft = trailLeftWeight + sourceLeftWeight * 24.0;
|
||||
let weightRight = trailRightWeight + sourceRightWeight * 24.0;
|
||||
|
||||
var rotation = (random.r - 0.5) * settings.turnWhenLost;
|
||||
if weightForward >= weightLeft && weightForward >= weightRight {
|
||||
|
|
@ -78,7 +89,8 @@ fn main(
|
|||
}
|
||||
|
||||
let sourceAtAgent = textureLoad(sourceMap, vec2<i32>(agent.position), 0);
|
||||
let sourceAtAgentStrength = clamp(dot(sourceAtAgent.rgb, channelMask), 0.0, 1.0);
|
||||
let positiveReactionMask = max(reactionMask, vec3<f32>(0.0));
|
||||
let sourceAtAgentStrength = clamp(dot(sourceAtAgent.rgb, positiveReactionMask), 0.0, 1.0);
|
||||
var moveRate = settings.moveRate * mix(1.0, 0.08, sourceAtAgentStrength);
|
||||
var introTargetOffset = vec2<f32>(0.0, 0.0);
|
||||
var introTargetDistance = 0.0;
|
||||
|
|
@ -111,7 +123,7 @@ fn main(
|
|||
}
|
||||
|
||||
let sourceBelow = textureLoad(sourceMap, vec2<i32>(nextPosition), 0);
|
||||
let sourceBelowStrength = dot(sourceBelow.rgb, channelMask);
|
||||
let sourceBelowStrength = clamp(dot(sourceBelow.rgb, positiveReactionMask), 0.0, 1.0);
|
||||
let trailWeight = settings.individualTrailWeight * (1.0 + sourceBelowStrength * 16.0);
|
||||
var trailBelow = textureLoad(trailMapIn, vec2<i32>(nextPosition), 0);
|
||||
trailBelow = vec4<f32>(
|
||||
|
|
@ -145,6 +157,28 @@ fn get_channel_mask(colorIndex: f32) -> vec3<f32> {
|
|||
return vec3<f32>(0, 0, 1);
|
||||
}
|
||||
|
||||
fn get_reaction_mask(colorIndex: f32) -> vec3<f32> {
|
||||
if colorIndex < 0.5 {
|
||||
return vec3<f32>(
|
||||
settings.color1ToColor1,
|
||||
settings.color1ToColor2,
|
||||
settings.color1ToColor3
|
||||
);
|
||||
}
|
||||
if colorIndex < 1.5 {
|
||||
return vec3<f32>(
|
||||
settings.color2ToColor1,
|
||||
settings.color2ToColor2,
|
||||
settings.color2ToColor3
|
||||
);
|
||||
}
|
||||
return vec3<f32>(
|
||||
settings.color3ToColor1,
|
||||
settings.color3ToColor2,
|
||||
settings.color3ToColor3
|
||||
);
|
||||
}
|
||||
|
||||
fn angle_delta(sourceAngle: f32, targetAngle: f32) -> f32 {
|
||||
return atan2(sin(targetAngle - sourceAngle), cos(targetAngle - sourceAngle));
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue