mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
Fixes #1745: Support out-of-order module scope declarations in WGSL Fixes #1044: Forbid local variable shadowing in WGSL Fixes #2076: [wgsl-in] no error for duplicated type definition Fixes #2071: Global item does not support 'const' Fixes #2105: [wgsl-in] Type aliases for a vecN<T> doesn't work when constructing vec from a single argument Fixes #1775: Referencing a function without a return type yields an unknown identifier error. Fixes #2089: Error span reported on the declaration of a variable instead of its use Fixes #1996: [wgsl-in] Confusing error: "expected unsigned/signed integer literal, found '1'" Separate parsing from lowering by generating an AST, which desugars as much as possible down to something like Naga IR. The AST is then used to resolve identifiers while lowering to Naga IR. Co-authored-by: Teodor Tanasoaia <28601907+teoxoy@users.noreply.github.com> Co-authored-by: Jim Blandy <jimb@red-bean.com>
108 lines
2.4 KiB
WebGPU Shading Language
108 lines
2.4 KiB
WebGPU Shading Language
const NUM_PARTICLES: u32 = 1500u;
|
|
|
|
struct Particle {
|
|
pos : vec2<f32>,
|
|
vel : vec2<f32>,
|
|
}
|
|
|
|
struct SimParams {
|
|
deltaT : f32,
|
|
rule1Distance : f32,
|
|
rule2Distance : f32,
|
|
rule3Distance : f32,
|
|
rule1Scale : f32,
|
|
rule2Scale : f32,
|
|
rule3Scale : f32,
|
|
}
|
|
|
|
struct Particles {
|
|
particles : array<Particle>
|
|
}
|
|
|
|
@group(0) @binding(0) var<uniform> params : SimParams;
|
|
@group(0) @binding(1) var<storage> particlesSrc : Particles;
|
|
@group(0) @binding(2) var<storage,read_write> particlesDst : Particles;
|
|
|
|
// https://github.com/austinEng/Project6-Vulkan-Flocking/blob/master/data/shaders/computeparticles/particle.comp
|
|
@compute @workgroup_size(64)
|
|
fn main(@builtin(global_invocation_id) global_invocation_id : vec3<u32>) {
|
|
let index : u32 = global_invocation_id.x;
|
|
if index >= NUM_PARTICLES {
|
|
return;
|
|
}
|
|
|
|
var vPos = particlesSrc.particles[index].pos;
|
|
var vVel = particlesSrc.particles[index].vel;
|
|
|
|
var cMass = vec2<f32>(0.0, 0.0);
|
|
var cVel = vec2<f32>(0.0, 0.0);
|
|
var colVel = vec2<f32>(0.0, 0.0);
|
|
var cMassCount : i32 = 0;
|
|
var cVelCount : i32 = 0;
|
|
|
|
var pos : vec2<f32>;
|
|
var vel : vec2<f32>;
|
|
var i : u32 = 0u;
|
|
loop {
|
|
if i >= NUM_PARTICLES {
|
|
break;
|
|
}
|
|
if i == index {
|
|
continue;
|
|
}
|
|
|
|
pos = particlesSrc.particles[i].pos;
|
|
vel = particlesSrc.particles[i].vel;
|
|
|
|
if distance(pos, vPos) < params.rule1Distance {
|
|
cMass = cMass + pos;
|
|
cMassCount = cMassCount + 1;
|
|
}
|
|
if distance(pos, vPos) < params.rule2Distance {
|
|
colVel = colVel - (pos - vPos);
|
|
}
|
|
if distance(pos, vPos) < params.rule3Distance {
|
|
cVel = cVel + vel;
|
|
cVelCount = cVelCount + 1;
|
|
}
|
|
|
|
continuing {
|
|
i = i + 1u;
|
|
}
|
|
}
|
|
if cMassCount > 0 {
|
|
cMass = cMass / f32(cMassCount) - vPos;
|
|
}
|
|
if cVelCount > 0 {
|
|
cVel = cVel / f32(cVelCount);
|
|
}
|
|
|
|
vVel = vVel + (cMass * params.rule1Scale) +
|
|
(colVel * params.rule2Scale) +
|
|
(cVel * params.rule3Scale);
|
|
|
|
// clamp velocity for a more pleasing simulation
|
|
vVel = normalize(vVel) * clamp(length(vVel), 0.0, 0.1);
|
|
|
|
// kinematic update
|
|
vPos = vPos + (vVel * params.deltaT);
|
|
|
|
// Wrap around boundary
|
|
if vPos.x < -1.0 {
|
|
vPos.x = 1.0;
|
|
}
|
|
if vPos.x > 1.0 {
|
|
vPos.x = -1.0;
|
|
}
|
|
if vPos.y < -1.0 {
|
|
vPos.y = 1.0;
|
|
}
|
|
if vPos.y > 1.0 {
|
|
vPos.y = -1.0;
|
|
}
|
|
|
|
// Write back
|
|
particlesDst.particles[index].pos = vPos;
|
|
particlesDst.particles[index].vel = vVel;
|
|
}
|