slosh3d 0.1.0

Cross-platform GPU 3D Material Point Method implementation.
struct RigidParticleIndices_std430_0
{
    @align(16) triangle_0 : vec3<u32>,
    @align(4) collider_0 : u32,
};

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

struct Quat_std430_0
{
    @align(16) coords_0 : vec4<f32>,
};

struct Sim3_std430_0
{
    @align(16) rotation_0 : Quat_std430_0,
    @align(16) translation_scale_0 : vec4<f32>,
};

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

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

@binding(3) @group(0) var<storage, read_write> entryPointParams_world_pts_0 : array<vec3<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<Sim3_std430_0>;

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

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

struct Quat_0
{
    @align(16) coords_0 : vec4<f32>,
};

fn x2A_0( q_0 : Quat_0,  v_0 : vec3<f32>) -> vec3<f32>
{
    var _S1 : vec3<f32> = q_0.coords_0.xyz;
    var _S2 : vec3<f32> = cross(_S1, v_0) * vec3<f32>(2.0f);
    return _S2 * vec3<f32>(q_0.coords_0.w) + cross(_S1, _S2) + v_0;
}

struct Sim3_0
{
    @align(16) rotation_0 : Quat_0,
    @align(16) translation_scale_0 : vec4<f32>,
};

fn Sim3_mul_pt_0( this_0 : Sim3_0,  pt_0 : vec3<f32>) -> vec3<f32>
{
    return x2A_0(this_0.rotation_0, pt_0 * vec3<f32>(this_0.translation_scale_0.w)) + this_0.translation_scale_0.xyz;
}

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

@compute
@workgroup_size(64, 1, 1)
fn transform_sample_points(@builtin(global_invocation_id) invocation_id_0 : vec3<u32>)
{
    var _S4 : u32 = invocation_id_0.x;
    var _S5 : i32 = getCount_0();
    if(_S4 < u32(_S5))
    {
        var _S6 : Quat_0 = Quat_0( entryPointParams_poses_0[entryPointParams_rigid_particle_indices_0[_S4].collider_0].rotation_0.coords_0 );
        var _S7 : Sim3_0 = Sim3_0( _S6, entryPointParams_poses_0[entryPointParams_rigid_particle_indices_0[_S4].collider_0].translation_scale_0 );
        entryPointParams_world_pts_0[_S4] = Sim3_mul_pt_0(_S7, entryPointParams_local_pts_0[_S4]);
    }
    return;
}

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

@compute
@workgroup_size(64, 1, 1)
fn transform_shape_points(@builtin(global_invocation_id) invocation_id_1 : vec3<u32>)
{
    var _S9 : u32 = invocation_id_1.x;
    var _S10 : i32 = getCount_1();
    if(_S9 < u32(_S10))
    {
        var _S11 : Quat_0 = Quat_0( entryPointParams_poses_1[entryPointParams_vertex_collider_ids_0[_S9]].rotation_0.coords_0 );
        var _S12 : Sim3_0 = Sim3_0( _S11, entryPointParams_poses_1[entryPointParams_vertex_collider_ids_0[_S9]].translation_scale_0 );
        entryPointParams_world_pts_1[_S9] = Sim3_mul_pt_0(_S12, entryPointParams_local_pts_1[_S9]);
    }
    return;
}