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_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>;
@binding(2) @group(0) var<storage, read_write> entryPointParams_particles_model_0 : array<u32>;
struct Position_std430_0
{
@align(8) pt_0 : vec2<f32>,
};
@binding(3) @group(0) var<storage, read_write> entryPointParams_particles_pos_0 : array<Position_std430_0>;
struct _MatrixStorage_float2x2std430_0
{
@align(8) data_0 : array<vec2<f32>, i32(2)>,
};
struct Cdf_std430_0
{
@align(8) normal_0 : vec2<f32>,
@align(8) rigid_vel_0 : vec2<f32>,
@align(8) signed_distance_0 : f32,
@align(4) affinity_0 : u32,
};
struct Dynamics_std430_0
{
@align(8) velocity_0 : vec2<f32>,
@align(8) def_grad_0 : _MatrixStorage_float2x2std430_0,
@align(8) affine_0 : _MatrixStorage_float2x2std430_0,
@align(8) vel_grad_det_0 : f32,
@align(8) cdf_0 : Cdf_std430_0,
@align(8) init_volume_0 : f32,
@align(4) init_radius_0 : f32,
@align(8) mass_0 : f32,
@align(4) phase_0 : f32,
@align(8) enabled_0 : u32,
};
@binding(4) @group(0) var<storage, read_write> entryPointParams_particles_dyn_0 : array<Dynamics_std430_0>;
@binding(5) @group(0) var<uniform> entryPointParams_particles_len_0 : u32;
fn stable_atan2_0( y_0 : f32, x_0 : f32) -> f32
{
var _S1 : f32 = atan(y_0 / x_0);
if(x_0 > 0.0f)
{
return _S1;
}
var _S2 : bool = x_0 < 0.0f;
var _S3 : bool;
if(_S2)
{
_S3 = y_0 > 0.0f;
}
else
{
_S3 = false;
}
if(_S3)
{
return _S1 + 3.14159274101257324f;
}
if(_S2)
{
_S3 = y_0 < 0.0f;
}
else
{
_S3 = false;
}
if(_S3)
{
return _S1 - 3.14159274101257324f;
}
return 0.0f;
}
struct Svd2_0
{
U_0 : mat2x2<f32>,
S_0 : vec2<f32>,
Vt_0 : mat2x2<f32>,
};
fn Svd2_x24init_0( U_1 : mat2x2<f32>, S_1 : vec2<f32>, Vt_1 : mat2x2<f32>) -> Svd2_0
{
var _S4 : Svd2_0;
_S4.U_0 = U_1;
_S4.S_0 = S_1;
_S4.Vt_0 = Vt_1;
return _S4;
}
fn Svd2_x24init_1( m_0 : mat2x2<f32>) -> Svd2_0
{
var _S5 : f32 = m_0[i32(0)].x;
var _S6 : f32 = m_0[i32(1)].y;
var _S7 : f32 = (_S5 + _S6) * 0.5f;
var _S8 : f32 = (_S5 - _S6) * 0.5f;
var _S9 : f32 = m_0[i32(0)].y;
var _S10 : f32 = m_0[i32(1)].x;
var _S11 : f32 = (_S9 + _S10) * 0.5f;
var _S12 : f32 = (_S9 - _S10) * 0.5f;
var _S13 : f32 = sqrt(_S7 * _S7 + _S12 * _S12);
var _S14 : f32 = sqrt(_S8 * _S8 + _S11 * _S11);
var _S15 : f32 = _S13 - _S14;
var _S16 : f32 = select(1.0f, -1.0f, _S15 < 0.0f);
var _S17 : vec2<f32> = vec2<f32>(_S13 + _S14, _S15 * _S16);
var _S18 : f32 = stable_atan2_0(_S11, _S8);
var _S19 : f32 = stable_atan2_0(_S12, _S7);
var _S20 : f32 = (_S19 - _S18) * 0.5f;
var _S21 : f32 = (_S19 + _S18) * 0.5f;
var _S22 : f32 = sin(_S20);
var _S23 : f32 = cos(_S20);
var _S24 : f32 = sin(_S21);
var _S25 : f32 = cos(_S21);
var _S26 : mat2x2<f32> = mat2x2<f32>(vec2<f32>(_S25, _S24), vec2<f32>(- _S24, _S25));
var _S27 : mat2x2<f32> = mat2x2<f32>(vec2<f32>(_S23, _S22 * _S16), vec2<f32>(- _S22, _S23 * _S16));
var _S28 : Svd2_0;
_S28.U_0 = _S26;
_S28.S_0 = _S17;
_S28.Vt_0 = _S27;
var _S29 : Svd2_0 = Svd2_x24init_0(_S26, _S17, _S27);
_S28 = _S29;
return _S29;
}
fn Svd2_recompose_0( this_0 : Svd2_0) -> mat2x2<f32>
{
return (((mat2x2<f32>(this_0.U_0[i32(0)] * vec2<f32>(this_0.S_0.x), this_0.U_0[i32(1)] * vec2<f32>(this_0.S_0.y))) * (this_0.Vt_0)));
}
struct LinearElasticModel_0
{
lambda_0 : f32,
mu_0 : f32,
cfl_coeff_0 : f32,
};
fn LinearElasticModel_kirchoff_stress_0( this_1 : LinearElasticModel_0, deformation_gradient_0 : mat2x2<f32>) -> mat2x2<f32>
{
var svd_0 : Svd2_0 = Svd2_x24init_1(deformation_gradient_0);
var _S30 : f32 = svd_0.S_0.x * svd_0.S_0.y;
svd_0.S_0 = svd_0.S_0 - vec2<f32>(1.0f);
var _S31 : f32 = this_1.lambda_0 * (_S30 - 1.0f) * _S30;
var _S32 : mat2x2<f32> = (((Svd2_recompose_0(svd_0)) * (transpose(deformation_gradient_0))));
var _S33 : mat2x2<f32> = mat2x2<f32>(2.0f * this_1.mu_0, 2.0f * this_1.mu_0, 2.0f * this_1.mu_0, 2.0f * this_1.mu_0);
var result_0 : mat2x2<f32> = mat2x2<f32>(_S32[0] * _S33[0], _S32[1] * _S33[1]);
result_0[i32(0)][i32(0)] = result_0[i32(0)][i32(0)] + _S31;
result_0[i32(1)][i32(1)] = result_0[i32(1)][i32(1)] + _S31;
return result_0;
}
struct ModelUpdateResult_0
{
kirchoff_stress_0 : mat2x2<f32>,
};
fn ModelUpdateResult_x24init_0( stress_0 : mat2x2<f32>) -> ModelUpdateResult_0
{
var _S34 : ModelUpdateResult_0;
_S34.kirchoff_stress_0 = stress_0;
return _S34;
}
struct NeoHookeanModel_0
{
lambda_1 : f32,
mu_1 : f32,
cfl_coeff_1 : f32,
};
fn NeoHookeanModel_kirchoff_stress_0( this_2 : NeoHookeanModel_0, deformation_gradient_1 : mat2x2<f32>) -> mat2x2<f32>
{
var _S35 : f32 = this_2.lambda_1 * log(max(determinant(deformation_gradient_1), 1.00000001335143196e-10f)) - this_2.mu_1;
var _S36 : mat2x2<f32> = (((deformation_gradient_1) * (transpose(deformation_gradient_1))));
var _S37 : mat2x2<f32> = mat2x2<f32>(this_2.mu_1, this_2.mu_1, this_2.mu_1, this_2.mu_1);
var stress_1 : mat2x2<f32> = mat2x2<f32>(_S37[0] * _S36[0], _S37[1] * _S36[1]);
stress_1[i32(0)][i32(0)] = stress_1[i32(0)][i32(0)] + _S35;
stress_1[i32(1)][i32(1)] = stress_1[i32(1)][i32(1)] + _S35;
return stress_1;
}
struct DruckerPragerPlasticState_0
{
plastic_deformation_gradient_det_0 : f32,
plastic_hardening_0 : f32,
log_vol_gain_0 : f32,
};
struct DruckerPragerResult_0
{
state_0 : DruckerPragerPlasticState_0,
deformation_gradient_2 : mat2x2<f32>,
};
fn DruckerPragerResult_x24init_0( state_1 : DruckerPragerPlasticState_0, deformation_gradient_3 : mat2x2<f32>) -> DruckerPragerResult_0
{
var _S38 : DruckerPragerResult_0;
_S38.state_0 = state_1;
_S38.deformation_gradient_2 = deformation_gradient_3;
return _S38;
}
struct DruckerPragerPlasticity_0
{
ha_0 : f32,
hb_0 : f32,
hc_0 : f32,
hd_0 : f32,
lambda_2 : f32,
mu_2 : f32,
};
fn DruckerPragerPlasticity_alpha_0( this_3 : DruckerPragerPlasticity_0, q_0 : f32) -> f32
{
var _S39 : f32 = sin(this_3.ha_0 + (this_3.hb_0 * q_0 - this_3.hd_0) * exp(- this_3.hc_0 * q_0));
return sqrt(0.66666668653488159f) * (2.0f * _S39) / (3.0f - _S39);
}
struct DruckerPragerProjectionResult_0
{
singular_values_0 : vec2<f32>,
plastic_hardening_1 : f32,
valid_0 : bool,
};
fn DruckerPragerProjectionResult_x24init_0( singular_values_1 : vec2<f32>, plastic_hardening_2 : f32, valid_1 : bool) -> DruckerPragerProjectionResult_0
{
var _S40 : DruckerPragerProjectionResult_0;
_S40.singular_values_0 = singular_values_1;
_S40.plastic_hardening_1 = plastic_hardening_2;
_S40.valid_0 = valid_1;
return _S40;
}
fn DruckerPragerPlasticity_project_deformation_gradient_0( this_4 : DruckerPragerPlasticity_0, singular_values_2 : vec2<f32>, log_vol_gain_1 : f32, alpha_0 : f32) -> DruckerPragerProjectionResult_0
{
var _S41 : vec2<f32> = log(singular_values_2) + vec2<f32>((log_vol_gain_1 / 2.0f));
var _S42 : f32 = _S41.x + _S41.y;
var _S43 : vec2<f32> = _S41 - vec2<f32>((_S42 / 2.0f));
var _S44 : bool;
if(_S42 > 0.0f)
{
_S44 = true;
}
else
{
_S44 = (all((_S43 == vec2<f32>(0.0f))));
}
if(_S44)
{
return DruckerPragerProjectionResult_x24init_0(vec2<f32>(1.0f), length(_S41), true);
}
var _S45 : f32 = length(_S43);
var _S46 : f32 = 2.0f * this_4.mu_2;
var _S47 : f32 = _S45 + (2.0f * this_4.lambda_2 + _S46) / _S46 * _S42 * alpha_0;
if(_S47 <= 0.0f)
{
return DruckerPragerProjectionResult_x24init_0(vec2<f32>(0.0f), 0.0f, false);
}
return DruckerPragerProjectionResult_x24init_0(exp(_S41 - _S43 * vec2<f32>((_S47 / _S45))), _S47, true);
}
fn DruckerPragerPlasticState_x24init_0( plastic_deformation_gradient_det_1 : f32, plastic_hardening_3 : f32, log_vol_gain_2 : f32) -> DruckerPragerPlasticState_0
{
var _S48 : DruckerPragerPlasticState_0;
_S48.plastic_deformation_gradient_det_0 = plastic_deformation_gradient_det_1;
_S48.plastic_hardening_0 = plastic_hardening_3;
_S48.log_vol_gain_0 = log_vol_gain_2;
return _S48;
}
fn DruckerPragerPlasticity_project_0( this_5 : DruckerPragerPlasticity_0, state_2 : DruckerPragerPlasticState_0, deformation_gradient_4 : mat2x2<f32>) -> DruckerPragerResult_0
{
if((this_5.lambda_2) == 0.0f)
{
return DruckerPragerResult_x24init_0(state_2, deformation_gradient_4);
}
var _S49 : Svd2_0 = Svd2_x24init_1(deformation_gradient_4);
var _S50 : DruckerPragerProjectionResult_0 = DruckerPragerPlasticity_project_deformation_gradient_0(this_5, _S49.S_0, state_2.log_vol_gain_0, DruckerPragerPlasticity_alpha_0(this_5, state_2.plastic_hardening_0));
if(_S50.valid_0)
{
var _S51 : f32 = _S49.S_0.x * _S49.S_0.y;
var _S52 : f32 = _S50.singular_values_0.x * _S50.singular_values_0.y;
return DruckerPragerResult_x24init_0(DruckerPragerPlasticState_x24init_0(state_2.plastic_deformation_gradient_det_0 * _S51 / _S52, state_2.plastic_hardening_0 + _S50.plastic_hardening_1, state_2.log_vol_gain_0 + log(_S51) - log(_S52)), Svd2_recompose_0(Svd2_x24init_0(_S49.U_0, _S50.singular_values_0, _S49.Vt_0)));
}
else
{
return DruckerPragerResult_x24init_0(state_2, deformation_gradient_4);
}
}
struct SandModel_0
{
plastic_state_0 : DruckerPragerPlasticState_0,
plastic_0 : DruckerPragerPlasticity_0,
elastic_0 : LinearElasticModel_0,
};
fn SandModel_state_offset_0( this_6 : SandModel_0) -> u32
{
return u32(0);
}
struct SandModel_1
{
plastic_state_0 : DruckerPragerPlasticState_0,
plastic_0 : DruckerPragerPlasticity_0,
elastic_0 : NeoHookeanModel_0,
};
fn SandModel_state_offset_1( this_7 : SandModel_1) -> u32
{
return u32(0);
}
fn project_velocity_0( vel_0 : vec2<f32>, n_0 : vec2<f32>) -> vec2<f32>
{
var _S53 : f32 = dot(vel_0, n_0);
if(_S53 < 0.0f)
{
var _S54 : vec2<f32> = vel_0 - n_0 * vec2<f32>(_S53);
var _S55 : f32 = length(_S54);
return select(vec2<f32>(0.0f), _S54 / vec2<f32>(_S55), _S55 > 9.99999993922529029e-09f) * vec2<f32>(max(0.0f, _S55 + 20.0f * _S53));
}
else
{
return vel_0;
}
}
fn diag_0( d_0 : vec2<f32>) -> mat2x2<f32>
{
return mat2x2<f32>(vec2<f32>(d_0.x, 0.0f), vec2<f32>(0.0f, d_0.y));
}
struct ParticleUpdateData_0
{
dt_1 : f32,
cell_width_1 : f32,
particle_id_0 : u32,
init_volume_1 : f32,
phase_1 : f32,
};
fn ParticleUpdateData_x24init_0( dt_2 : f32, cell_width_2 : f32, particle_id_1 : u32, init_volume_2 : f32, phase_2 : f32) -> ParticleUpdateData_0
{
var _S56 : ParticleUpdateData_0;
_S56.dt_1 = dt_2;
_S56.cell_width_1 = cell_width_2;
_S56.particle_id_0 = particle_id_1;
_S56.init_volume_1 = init_volume_2;
_S56.phase_1 = phase_2;
return _S56;
}
fn QuadraticKernel_inv_d_0( cell_width_3 : f32) -> f32
{
return 4.0f / (cell_width_3 * cell_width_3);
}
struct DefaultParticleModel_0
{
dummy_0 : u32,
};
fn DefaultParticleModel_model_flags_0( _S57 : DefaultParticleModel_0, _S58 : u32) -> i32
{
return i32(0);
}
fn DefaultParticleModel_update_0( _S59 : DefaultParticleModel_0, _S60 : ParticleUpdateData_0, _S61 : mat2x2<f32>, _S62 : ptr<function, mat2x2<f32>>) -> ModelUpdateResult_0
{
var _S63 : u32 = _S60.particle_id_0 * u32(52);
var _S64 : u32 = _S63 + u32(4);
var _S65 : u32 = entryPointParams_particles_model_0[(u32(i32(_S63)))/4];
switch(i32(_S65))
{
case i32(0):
{
var _S66 : u32 = entryPointParams_particles_model_0[(_S64)/4];
var _S67 : f32 = bitcast<f32>(_S66);
var _S68 : u32 = entryPointParams_particles_model_0[(_S64 + u32(4))/4];
var _S69 : f32 = bitcast<f32>(_S68);
var _S70 : u32 = entryPointParams_particles_model_0[(_S64 + u32(8))/4];
var _S71 : LinearElasticModel_0 = LinearElasticModel_0( _S67, _S69, bitcast<f32>(_S70) );
return ModelUpdateResult_x24init_0(LinearElasticModel_kirchoff_stress_0(_S71, (*_S62)));
}
case i32(1):
{
var _S72 : u32 = entryPointParams_particles_model_0[(_S64)/4];
var _S73 : f32 = bitcast<f32>(_S72);
var _S74 : u32 = entryPointParams_particles_model_0[(_S64 + u32(4))/4];
var _S75 : f32 = bitcast<f32>(_S74);
var _S76 : u32 = entryPointParams_particles_model_0[(_S64 + u32(8))/4];
var _S77 : NeoHookeanModel_0 = NeoHookeanModel_0( _S73, _S75, bitcast<f32>(_S76) );
return ModelUpdateResult_x24init_0(NeoHookeanModel_kirchoff_stress_0(_S77, (*_S62)));
}
case i32(2):
{
var _S78 : u32 = entryPointParams_particles_model_0[(_S64)/4];
var _S79 : f32 = bitcast<f32>(_S78);
var _S80 : u32 = entryPointParams_particles_model_0[(_S64 + u32(4))/4];
var _S81 : f32 = bitcast<f32>(_S80);
var _S82 : u32 = entryPointParams_particles_model_0[(_S64 + u32(8))/4];
var _S83 : DruckerPragerPlasticState_0 = DruckerPragerPlasticState_0( _S79, _S81, bitcast<f32>(_S82) );
var _S84 : u32 = entryPointParams_particles_model_0[(_S64 + u32(12))/4];
var _S85 : f32 = bitcast<f32>(_S84);
var _S86 : u32 = entryPointParams_particles_model_0[(_S64 + u32(16))/4];
var _S87 : f32 = bitcast<f32>(_S86);
var _S88 : u32 = entryPointParams_particles_model_0[(_S64 + u32(20))/4];
var _S89 : f32 = bitcast<f32>(_S88);
var _S90 : u32 = entryPointParams_particles_model_0[(_S64 + u32(24))/4];
var _S91 : f32 = bitcast<f32>(_S90);
var _S92 : u32 = entryPointParams_particles_model_0[(_S64 + u32(28))/4];
var _S93 : f32 = bitcast<f32>(_S92);
var _S94 : u32 = entryPointParams_particles_model_0[(_S64 + u32(32))/4];
var _S95 : DruckerPragerPlasticity_0 = DruckerPragerPlasticity_0( _S85, _S87, _S89, _S91, _S93, bitcast<f32>(_S94) );
var _S96 : u32 = entryPointParams_particles_model_0[(_S64 + u32(36))/4];
var _S97 : f32 = bitcast<f32>(_S96);
var _S98 : u32 = entryPointParams_particles_model_0[(_S64 + u32(40))/4];
var _S99 : f32 = bitcast<f32>(_S98);
var _S100 : u32 = entryPointParams_particles_model_0[(_S64 + u32(44))/4];
var _S101 : LinearElasticModel_0 = LinearElasticModel_0( _S97, _S99, bitcast<f32>(_S100) );
var _S102 : SandModel_0 = SandModel_0( _S83, _S95, _S101 );
var _S103 : DruckerPragerResult_0 = DruckerPragerPlasticity_project_0(_S95, _S83, (*_S62));
var _S104 : u32 = _S64 + SandModel_state_offset_0(_S102);
entryPointParams_particles_model_0[(_S104)/4] = bitcast<u32>(_S103.state_0.plastic_deformation_gradient_det_0);
entryPointParams_particles_model_0[(_S104 + u32(4))/4] = bitcast<u32>(_S103.state_0.plastic_hardening_0);
entryPointParams_particles_model_0[(_S104 + u32(8))/4] = bitcast<u32>(_S103.state_0.log_vol_gain_0);
var _S105 : mat2x2<f32> = LinearElasticModel_kirchoff_stress_0(_S101, _S103.deformation_gradient_2);
(*_S62) = _S103.deformation_gradient_2;
return ModelUpdateResult_x24init_0(_S105);
}
case i32(3):
{
var _S106 : u32 = entryPointParams_particles_model_0[(_S64)/4];
var _S107 : f32 = bitcast<f32>(_S106);
var _S108 : u32 = entryPointParams_particles_model_0[(_S64 + u32(4))/4];
var _S109 : f32 = bitcast<f32>(_S108);
var _S110 : u32 = entryPointParams_particles_model_0[(_S64 + u32(8))/4];
var _S111 : DruckerPragerPlasticState_0 = DruckerPragerPlasticState_0( _S107, _S109, bitcast<f32>(_S110) );
var _S112 : u32 = entryPointParams_particles_model_0[(_S64 + u32(12))/4];
var _S113 : f32 = bitcast<f32>(_S112);
var _S114 : u32 = entryPointParams_particles_model_0[(_S64 + u32(16))/4];
var _S115 : f32 = bitcast<f32>(_S114);
var _S116 : u32 = entryPointParams_particles_model_0[(_S64 + u32(20))/4];
var _S117 : f32 = bitcast<f32>(_S116);
var _S118 : u32 = entryPointParams_particles_model_0[(_S64 + u32(24))/4];
var _S119 : f32 = bitcast<f32>(_S118);
var _S120 : u32 = entryPointParams_particles_model_0[(_S64 + u32(28))/4];
var _S121 : f32 = bitcast<f32>(_S120);
var _S122 : u32 = entryPointParams_particles_model_0[(_S64 + u32(32))/4];
var _S123 : DruckerPragerPlasticity_0 = DruckerPragerPlasticity_0( _S113, _S115, _S117, _S119, _S121, bitcast<f32>(_S122) );
var _S124 : u32 = entryPointParams_particles_model_0[(_S64 + u32(36))/4];
var _S125 : f32 = bitcast<f32>(_S124);
var _S126 : u32 = entryPointParams_particles_model_0[(_S64 + u32(40))/4];
var _S127 : f32 = bitcast<f32>(_S126);
var _S128 : u32 = entryPointParams_particles_model_0[(_S64 + u32(44))/4];
var _S129 : NeoHookeanModel_0 = NeoHookeanModel_0( _S125, _S127, bitcast<f32>(_S128) );
var _S130 : SandModel_1 = SandModel_1( _S111, _S123, _S129 );
var _S131 : DruckerPragerResult_0 = DruckerPragerPlasticity_project_0(_S123, _S111, (*_S62));
var _S132 : u32 = _S64 + SandModel_state_offset_1(_S130);
entryPointParams_particles_model_0[(_S132)/4] = bitcast<u32>(_S131.state_0.plastic_deformation_gradient_det_0);
entryPointParams_particles_model_0[(_S132 + u32(4))/4] = bitcast<u32>(_S131.state_0.plastic_hardening_0);
entryPointParams_particles_model_0[(_S132 + u32(8))/4] = bitcast<u32>(_S131.state_0.log_vol_gain_0);
var _S133 : mat2x2<f32> = NeoHookeanModel_kirchoff_stress_0(_S129, _S131.deformation_gradient_2);
(*_S62) = _S131.deformation_gradient_2;
return ModelUpdateResult_x24init_0(_S133);
}
default :
{
return ModelUpdateResult_x24init_0(mat2x2<f32>(0.0f, 0.0f, 0.0f, 0.0f));
}
}
}
@compute
@workgroup_size(64, 1, 1)
fn particle_update(@builtin(global_invocation_id) invocation_id_0 : vec3<u32>)
{
var _S134 : u32 = invocation_id_0.x;
if(_S134 >= entryPointParams_particles_len_0)
{
return;
}
var _S135 : DefaultParticleModel_0 = DefaultParticleModel_0( );
var _S136 : i32 = DefaultParticleModel_model_flags_0(_S135, _S134);
var _S137 : f32 = entryPointParams_params_0.dt_0;
var _S138 : GridGeneric_std430_0 = entryPointParams_grid_0[i32(0)];
var _S139 : Dynamics_std430_0 = entryPointParams_particles_dyn_0[_S134];
var _S140 : vec2<f32> = entryPointParams_particles_pos_0[_S134].pt_0;
var _S141 : bool = (entryPointParams_particles_dyn_0[_S134].cdf_0.signed_distance_0) < (-0.05000000074505806f * _S138.cell_width_0);
var new_particle_vel_0 : vec2<f32>;
if(_S141)
{
new_particle_vel_0 = _S139.cdf_0.rigid_vel_0 + project_velocity_0(_S139.velocity_0 - _S139.cdf_0.rigid_vel_0, _S139.cdf_0.normal_0);
}
else
{
new_particle_vel_0 = _S139.velocity_0;
}
var _S142 : f32 = length(new_particle_vel_0);
if(_S142 > (_S138.cell_width_0 / _S137))
{
new_particle_vel_0 = new_particle_vel_0 / vec2<f32>(_S142) * vec2<f32>(_S138.cell_width_0) / vec2<f32>(_S137);
}
var _S143 : vec2<f32> = _S140 + new_particle_vel_0 * vec2<f32>(_S137);
if(_S141)
{
new_particle_vel_0 = new_particle_vel_0 + vec2<f32>((_S137 * - max(_S139.cdf_0.signed_distance_0, -0.30000001192092896f * _S138.cell_width_0) * 1000.0f)) * _S139.cdf_0.normal_0;
}
var new_deformation_gradient_0 : mat2x2<f32>;
if(((_S136 & (i32(1)))) == i32(0))
{
var _S144 : mat2x2<f32> = mat2x2<f32>(_S139.def_grad_0.data_0[i32(0)][i32(0)], _S139.def_grad_0.data_0[i32(0)][i32(1)], _S139.def_grad_0.data_0[i32(1)][i32(0)], _S139.def_grad_0.data_0[i32(1)][i32(1)]);
var _S145 : mat2x2<f32> = mat2x2<f32>(_S139.affine_0.data_0[i32(0)][i32(0)], _S139.affine_0.data_0[i32(0)][i32(1)], _S139.affine_0.data_0[i32(1)][i32(0)], _S139.affine_0.data_0[i32(1)][i32(1)]);
var _S146 : mat2x2<f32> = mat2x2<f32>(_S137, _S137, _S137, _S137);
new_deformation_gradient_0 = _S144 + (((mat2x2<f32>(_S145[0] * _S146[0], _S145[1] * _S146[1])) * (_S144)));
}
else
{
var _S147 : mat2x2<f32> = mat2x2<f32>(_S139.def_grad_0.data_0[i32(0)][i32(0)], _S139.def_grad_0.data_0[i32(0)][i32(1)], _S139.def_grad_0.data_0[i32(1)][i32(0)], _S139.def_grad_0.data_0[i32(1)][i32(1)]);
new_deformation_gradient_0 = diag_0(vec2<f32>((_S147[i32(0)][i32(0)] + _S147[i32(0)][i32(0)] * _S139.vel_grad_det_0 * _S137)));
}
var _S148 : mat2x2<f32> = mat2x2<f32>(_S139.affine_0.data_0[i32(0)][i32(0)], _S139.affine_0.data_0[i32(0)][i32(1)], _S139.affine_0.data_0[i32(1)][i32(0)], _S139.affine_0.data_0[i32(1)][i32(1)]);
var _S149 : ModelUpdateResult_0 = DefaultParticleModel_update_0(_S135, ParticleUpdateData_x24init_0(_S137, _S138.cell_width_0, _S134, _S139.init_volume_0, _S139.phase_0), _S148, &(new_deformation_gradient_0));
var _S150 : mat2x2<f32> = mat2x2<f32>(_S139.mass_0, _S139.mass_0, _S139.mass_0, _S139.mass_0);
var _S151 : mat2x2<f32> = mat2x2<f32>(_S139.init_volume_0 * QuadraticKernel_inv_d_0(_S138.cell_width_0) * _S137, _S139.init_volume_0 * QuadraticKernel_inv_d_0(_S138.cell_width_0) * _S137, _S139.init_volume_0 * QuadraticKernel_inv_d_0(_S138.cell_width_0) * _S137, _S139.init_volume_0 * QuadraticKernel_inv_d_0(_S138.cell_width_0) * _S137);
var _S152 : mat2x2<f32> = _S149.kirchoff_stress_0;
var _S153 : mat2x2<f32> = mat2x2<f32>(_S148[0] * _S150[0], _S148[1] * _S150[1]) - mat2x2<f32>(_S152[0] * _S151[0], _S152[1] * _S151[1]);
var _S154 : bool;
if((all((_S143 == _S143))))
{
_S154 = (determinant(new_deformation_gradient_0)) > 0.0f;
}
else
{
_S154 = false;
}
if(_S154)
{
entryPointParams_particles_pos_0[_S134].pt_0 = _S143;
entryPointParams_particles_dyn_0[_S134].velocity_0 = new_particle_vel_0;
var _S155 : array<vec2<f32>, i32(2)> = array<vec2<f32>, i32(2)>( vec2<f32>(new_deformation_gradient_0[i32(0)][i32(0)], new_deformation_gradient_0[i32(0)][i32(1)]), vec2<f32>(new_deformation_gradient_0[i32(1)][i32(0)], new_deformation_gradient_0[i32(1)][i32(1)]) );
entryPointParams_particles_dyn_0[_S134].def_grad_0.data_0 = _S155;
var _S156 : array<vec2<f32>, i32(2)> = array<vec2<f32>, i32(2)>( vec2<f32>(_S153[i32(0)][i32(0)], _S153[i32(0)][i32(1)]), vec2<f32>(_S153[i32(1)][i32(0)], _S153[i32(1)][i32(1)]) );
entryPointParams_particles_dyn_0[_S134].affine_0.data_0 = _S156;
}
else
{
entryPointParams_particles_dyn_0[_S134].enabled_0 = u32(0);
entryPointParams_particles_dyn_0[_S134].velocity_0 = vec2<f32>(0.0f);
var _S157 : mat2x2<f32> = diag_0(vec2<f32>(1.0f));
var _S158 : array<vec2<f32>, i32(2)> = array<vec2<f32>, i32(2)>( vec2<f32>(_S157[i32(0)][i32(0)], _S157[i32(0)][i32(1)]), vec2<f32>(_S157[i32(1)][i32(0)], _S157[i32(1)][i32(1)]) );
entryPointParams_particles_dyn_0[_S134].def_grad_0.data_0 = _S158;
var _S159 : mat2x2<f32> = mat2x2<f32>(0.0f, 0.0f, 0.0f, 0.0f);
var _S160 : array<vec2<f32>, i32(2)> = array<vec2<f32>, i32(2)>( vec2<f32>(_S159[i32(0)][i32(0)], _S159[i32(0)][i32(1)]), vec2<f32>(_S159[i32(1)][i32(0)], _S159[i32(1)][i32(1)]) );
entryPointParams_particles_dyn_0[_S134].affine_0.data_0 = _S160;
entryPointParams_particles_dyn_0[_S134].mass_0 = 0.0f;
}
return;
}