Skip to main content

INTEGRATE_SHADER

Constant INTEGRATE_SHADER 

Source
pub const INTEGRATE_SHADER: &str = r#"
struct SimParams {
    nworld: u32,
    nv: u32,
    dt: f32,
    _padding: u32,
}

@group(0) @binding(0) var<uniform> params: SimParams;
@group(0) @binding(1) var<storage, read_write> q: array<f32>;
@group(0) @binding(2) var<storage, read_write> v: array<f32>;
@group(0) @binding(3) var<storage, read> qdd: array<f32>;

@compute @workgroup_size(256)
fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
    let idx = gid.x;
    let total_dofs = params.nworld * params.nv;

    if (idx >= total_dofs) {
        return;
    }

    let dt = params.dt;

    // Semi-implicit Euler: v' = v + dt * qdd, q' = q + dt * v'
    let v_old = v[idx];
    let qdd_val = qdd[idx];
    let v_new = v_old + dt * qdd_val;
    let q_old = q[idx];
    let q_new = q_old + dt * v_new;

    v[idx] = v_new;
    q[idx] = q_new;
}
"#;
Expand description

WGSL shader for semi-implicit Euler integration.

Each work item processes one DOF across all worlds in parallel.