slosh2d 0.4.1

Cross-platform GPU 2D Material Point Method implementation.
struct SimulationParams_std140_0
{
    @align(16) gravity_0 : vec2<f32>,
    @align(8) padding_0 : f32,
    @align(4) dt_0 : f32,
};

@binding(0) @group(0) var<uniform> entryPointParams_sim_params_0 : SimulationParams_std140_0;
struct GridGeneric_std430_0
{
    @align(4) num_active_blocks_0 : u32,
    @align(4) cell_width_0 : f32,
    @align(4) hmap_capacity_0 : u32,
    @align(4) capacity_0 : u32,
};

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

struct BlockVirtualId_std430_0
{
    @align(8) id_0 : vec2<i32>,
};

struct ActiveBlockHeaderGeneric_std430_0
{
    @align(8) virtual_id_0 : BlockVirtualId_std430_0,
    @align(8) first_particle_0 : u32,
    @align(4) num_particles_0 : u32,
};

@binding(2) @group(0) var<storage, read> entryPointParams_active_blocks_0 : array<ActiveBlockHeaderGeneric_std430_0>;

struct NodeCdf_std430_0
{
    @align(4) distance_0 : f32,
    @align(4) affinities_0 : u32,
    @align(4) closest_id_0 : u32,
};

struct Node_std430_0
{
    @align(16) momentum_velocity_mass_0 : vec3<f32>,
    @align(4) cdf_0 : NodeCdf_std430_0,
};

@binding(3) @group(0) var<storage, read_write> entryPointParams_nodes_0 : array<Node_std430_0>;

struct BlockHeaderId_0
{
     id_1 : u32,
};

fn BlockHeaderId_x24init_0( i_0 : u32) -> BlockHeaderId_0
{
    var _S1 : BlockHeaderId_0;
    _S1.id_1 = i_0;
    return _S1;
}

struct BlockPhysicalId_0
{
     id_2 : u32,
};

fn BlockPhysicalId_x24init_0( i_1 : u32) -> BlockPhysicalId_0
{
    var _S2 : BlockPhysicalId_0;
    _S2.id_2 = i_1;
    return _S2;
}

fn block_header_id_to_physical_id_0( hid_0 : BlockHeaderId_0) -> BlockPhysicalId_0
{
    return BlockPhysicalId_x24init_0(hid_0.id_1 * u32(64));
}

struct NodePhysicalId_0
{
     id_3 : u32,
};

fn NodePhysicalId_x24init_0( i_2 : u32) -> NodePhysicalId_0
{
    var _S3 : NodePhysicalId_0;
    _S3.id_3 = i_2;
    return _S3;
}

fn node_id_0( pid_0 : BlockPhysicalId_0,  shift_in_block_0 : vec2<u32>) -> NodePhysicalId_0
{
    return NodePhysicalId_x24init_0(pid_0.id_2 + shift_in_block_0.x + shift_in_block_0.y * u32(8));
}

fn update_single_cell_0( sim_params_0 : ptr<function, SimulationParams_std140_0>,  cell_width_1 : f32,  cell_pos_0 : vec2<f32>,  momentum_velocity_mass_1 : vec3<f32>) -> vec3<f32>
{
    var _S4 : f32 = momentum_velocity_mass_1.z;
    var _S5 : vec2<f32> = vec2<f32>((cell_width_1 / (*sim_params_0).dt_0));
    return vec3<f32>(clamp((momentum_velocity_mass_1.xy + vec2<f32>(_S4) * (*sim_params_0).gravity_0 * vec2<f32>((*sim_params_0).dt_0)) * vec2<f32>(select(0.0f, 1.0f / _S4, _S4 > 0.0f)), (vec2<f32>(0) - _S5), _S5), _S4);
}

@compute
@workgroup_size(8, 8, 1)
fn grid_update(@builtin(workgroup_id) block_id_0 : vec3<u32>, @builtin(local_invocation_id) tid_0 : vec3<u32>, @builtin(local_invocation_index) tid_flat_0 : u32)
{
    var _S6 : u32 = block_id_0.x;
    var _S7 : GridGeneric_std430_0 = entryPointParams_grid_0[i32(0)];
    var _S8 : vec2<u32> = tid_0.xy;
    var _S9 : NodePhysicalId_0 = node_id_0(block_header_id_to_physical_id_0(BlockHeaderId_x24init_0(_S6)), _S8);
    var _S10 : vec2<f32> = vec2<f32>(entryPointParams_active_blocks_0[_S6].virtual_id_0.id_0 * vec2<i32>(i32(8)) + vec2<i32>(_S8)) * vec2<f32>(_S7.cell_width_0);
    var _S11 : SimulationParams_std140_0 = entryPointParams_sim_params_0;
    var _S12 : vec3<f32> = update_single_cell_0(&(_S11), _S7.cell_width_0, _S10, entryPointParams_nodes_0[_S9.id_3].momentum_velocity_mass_0);
    entryPointParams_nodes_0[_S9.id_3].momentum_velocity_mass_0 = _S12;
    return;
}