slosh3d 0.1.0

Cross-platform GPU 3D 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 : atomic<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( _S4 : f32,  _S5 : vec2<f32>,  _S6 : vec3<f32>) -> vec3<f32>
{
    var _S7 : f32 = _S6.z;
    var _S8 : vec2<f32> = vec2<f32>((_S4 / entryPointParams_sim_params_0.dt_0));
    return vec3<f32>(clamp((_S6.xy + vec2<f32>(_S7) * entryPointParams_sim_params_0.gravity_0 * vec2<f32>(entryPointParams_sim_params_0.dt_0)) * vec2<f32>(select(0.0f, 1.0f / _S7, _S7 > 0.0f)), - _S8, _S8), _S7);
}

@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 _S9 : u32 = block_id_0.x;
    var _S10 : vec2<u32> = tid_0.xy;
    var _S11 : NodePhysicalId_0 = node_id_0(block_header_id_to_physical_id_0(BlockHeaderId_x24init_0(_S9)), _S10);
    entryPointParams_nodes_0[_S11.id_3].momentum_velocity_mass_0 = update_single_cell_0(entryPointParams_grid_0[i32(0)].cell_width_0, vec2<f32>(entryPointParams_active_blocks_0[_S9].virtual_id_0.id_0 * vec2<i32>(i32(8)) + vec2<i32>(_S10)) * vec2<f32>(entryPointParams_grid_0[i32(0)].cell_width_0), entryPointParams_nodes_0[_S11.id_3].momentum_velocity_mass_0);
    return;
}