slosh2d 0.4.1

Cross-platform GPU 2D Material Point Method implementation.
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(0) @group(0) var<storage, read_write> entryPointParams_grid_0 : array<GridGeneric_std430_0>;

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

struct BlockHeaderId_std430_0
{
    @align(4) id_1 : u32,
};

struct GridHashMapEntryGeneric_std430_0
{
    @align(8) state_0 : u32,
    @align(8) key_0 : BlockVirtualId_std430_0,
    @align(8) value_0 : BlockHeaderId_std430_0,
};

@binding(1) @group(0) var<storage, read_write> entryPointParams_hmap_entries_0 : array<GridHashMapEntryGeneric_std430_0>;

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

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

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

@binding(5) @group(0) var<storage, read> entryPointParams_grid_2 : array<GridGeneric_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(6) @group(0) var<storage, read_write> entryPointParams_nodes_0 : array<Node_std430_0>;

struct NodeLinkedListGeneric_std430_0
{
    @align(4) head_0 : u32,
    @align(4) len_0 : u32,
};

@binding(7) @group(0) var<storage, read_write> entryPointParams_nodes_linked_lists_0 : array<NodeLinkedListGeneric_std430_0>;

@binding(8) @group(0) var<storage, read_write> entryPointParams_rigid_nodes_linked_lists_0 : array<NodeLinkedListGeneric_std430_0>;

struct BlockVirtualId_0
{
     id_0 : vec2<i32>,
};

fn BlockVirtualId_x24init_0( i_0 : vec2<i32>) -> BlockVirtualId_0
{
    var _S1 : BlockVirtualId_0;
    _S1.id_0 = i_0;
    return _S1;
}

struct BlockHeaderId_0
{
     id_1 : u32,
};

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

@compute
@workgroup_size(64, 1, 1)
fn reset_hmap(@builtin(global_invocation_id) invocation_id_0 : vec3<u32>)
{
    var _S3 : u32 = invocation_id_0.x;
    if(_S3 < (entryPointParams_grid_0[i32(0)].hmap_capacity_0))
    {
        entryPointParams_hmap_entries_0[_S3].state_0 = u32(4294967295);
        entryPointParams_hmap_entries_0[_S3].key_0.id_0 = BlockVirtualId_x24init_0(vec2<i32>(vec2<u32>(vec2<i32>(i32(0))))).id_0;
        entryPointParams_hmap_entries_0[_S3].value_0.id_1 = BlockHeaderId_x24init_0(u32(0)).id_1;
    }
    if(_S3 == u32(0))
    {
        entryPointParams_grid_0[i32(0)].num_active_blocks_0 = u32(0);
    }
    return;
}

fn div_ceil_0( x_0 : u32,  y_0 : u32) -> u32
{
    var _S4 : u32 = (x_0 + y_0 - u32(1)) / y_0;
    return _S4;
}

@compute
@workgroup_size(1, 1, 1)
fn init_indirect_workgroups(@builtin(global_invocation_id) invocation_id_1 : vec3<u32>)
{
    var _S5 : GridGeneric_std430_0 = entryPointParams_grid_1[i32(0)];
    var _S6 : u32 = div_ceil_0(_S5.num_active_blocks_0, u32(64));
    entryPointParams_n_block_groups_0[i32(0)] = _S6;
    entryPointParams_n_block_groups_0[i32(1)] = u32(1);
    entryPointParams_n_block_groups_0[i32(2)] = u32(1);
    entryPointParams_n_g2p_p2g_groups_0[i32(0)] = _S5.num_active_blocks_0;
    entryPointParams_n_g2p_p2g_groups_0[i32(1)] = u32(1);
    entryPointParams_n_g2p_p2g_groups_0[i32(2)] = u32(1);
    return;
}

struct NodeCdf_0
{
     distance_0 : f32,
     affinities_0 : u32,
     closest_id_0 : u32,
};

fn NodeCdf_x24init_0( distance_1 : f32,  affinities_1 : u32,  closest_id_1 : u32) -> NodeCdf_0
{
    var _S7 : NodeCdf_0;
    _S7.distance_0 = distance_1;
    _S7.affinities_0 = affinities_1;
    _S7.closest_id_0 = closest_id_1;
    return _S7;
}

@compute
@workgroup_size(64, 1, 1)
fn reset(@builtin(global_invocation_id) invocation_id_2 : vec3<u32>)
{
    var _S8 : u32 = invocation_id_2.x;
    if(_S8 < (entryPointParams_grid_2[i32(0)].num_active_blocks_0 * u32(64)))
    {
        entryPointParams_nodes_0[_S8].momentum_velocity_mass_0 = vec3<f32>(0.0f);
        var _S9 : NodeCdf_0 = NodeCdf_x24init_0(0.0f, u32(0), u32(4294967295));
        entryPointParams_nodes_0[_S8].cdf_0.distance_0 = _S9.distance_0;
        entryPointParams_nodes_0[_S8].cdf_0.affinities_0 = _S9.affinities_0;
        entryPointParams_nodes_0[_S8].cdf_0.closest_id_0 = _S9.closest_id_0;
        entryPointParams_nodes_linked_lists_0[_S8].head_0 = u32(4294967295);
        entryPointParams_nodes_linked_lists_0[_S8].len_0 = u32(0);
        entryPointParams_rigid_nodes_linked_lists_0[_S8].head_0 = u32(4294967295);
        entryPointParams_rigid_nodes_linked_lists_0[_S8].len_0 = u32(0);
    }
    return;
}