slosh3d 0.6.0

Cross-platform GPU 3D Material Point Method implementation.
struct RigidParticleIndices_std430_0
{
    @align(8) segment_0 : vec2<u32>,
    @align(8) collider_0 : u32,
};

@binding(0) @group(0) var<storage, read> entryPointParams_rigid_particle_indices_0 : array<RigidParticleIndices_std430_0>;

struct Rot2_std430_0
{
    @align(8) cos_sin_0 : vec2<f32>,
};

struct Sim2_std430_0
{
    @align(8) rotation_0 : Rot2_std430_0,
    @align(8) translation_0 : vec2<f32>,
    @align(8) scale_0 : f32,
};

@binding(1) @group(0) var<storage, read> entryPointParams_poses_0 : array<Sim2_std430_0>;

@binding(2) @group(0) var<storage, read> entryPointParams_local_pts_0 : array<vec2<f32>>;

@binding(3) @group(0) var<storage, read_write> entryPointParams_world_pts_0 : array<vec2<f32>>;

@binding(4) @group(0) var<storage, read> entryPointParams_vertex_collider_ids_0 : array<u32>;

@binding(5) @group(0) var<storage, read> entryPointParams_poses_1 : array<Sim2_std430_0>;

@binding(6) @group(0) var<storage, read> entryPointParams_local_pts_1 : array<vec2<f32>>;

@binding(7) @group(0) var<storage, read_write> entryPointParams_world_pts_1 : array<vec2<f32>>;

fn x2A_0( r_0 : ptr<function, Rot2_std430_0>,  v_0 : vec2<f32>) -> vec2<f32>
{
    var _S1 : f32 = (*r_0).cos_sin_0.x;
    var _S2 : f32 = v_0.x;
    var _S3 : f32 = (*r_0).cos_sin_0.y;
    var _S4 : f32 = v_0.y;
    return vec2<f32>(_S1 * _S2 - _S3 * _S4, _S3 * _S2 + _S1 * _S4);
}

fn Sim2_mul_pt_0( this_0 : ptr<function, Sim2_std430_0>,  pt_0 : vec2<f32>) -> vec2<f32>
{
    var _S5 : Rot2_std430_0 = (*this_0).rotation_0;
    var _S6 : vec2<f32> = x2A_0(&(_S5), pt_0 * vec2<f32>((*this_0).scale_0));
    return _S6 + (*this_0).translation_0;
}

fn getCount_0() -> i32
{
    var _S7 : vec2<u32> = vec2<u32>(arrayLength(&entryPointParams_local_pts_0), 8);
    return i32(_S7.x);
}

@compute
@workgroup_size(64, 1, 1)
fn transform_sample_points(@builtin(global_invocation_id) invocation_id_0 : vec3<u32>)
{
    var _S8 : u32 = invocation_id_0.x;
    var _S9 : i32 = getCount_0();
    if(_S8 < u32(_S9))
    {
        var _S10 : Sim2_std430_0 = entryPointParams_poses_0[entryPointParams_rigid_particle_indices_0[_S8].collider_0];
        var _S11 : vec2<f32> = Sim2_mul_pt_0(&(_S10), entryPointParams_local_pts_0[_S8]);
        entryPointParams_world_pts_0[_S8] = _S11;
    }
    return;
}

fn getCount_1() -> i32
{
    var _S12 : vec2<u32> = vec2<u32>(arrayLength(&entryPointParams_local_pts_1), 8);
    return i32(_S12.x);
}

@compute
@workgroup_size(64, 1, 1)
fn transform_shape_points(@builtin(global_invocation_id) invocation_id_1 : vec3<u32>)
{
    var _S13 : u32 = invocation_id_1.x;
    var _S14 : i32 = getCount_1();
    if(_S13 < u32(_S14))
    {
        var _S15 : Sim2_std430_0 = entryPointParams_poses_1[entryPointParams_vertex_collider_ids_0[_S13]];
        var _S16 : vec2<f32> = Sim2_mul_pt_0(&(_S15), entryPointParams_local_pts_1[_S13]);
        entryPointParams_world_pts_1[_S13] = _S16;
    }
    return;
}