struct SimulationParams_std140_0
{
@align(16) gravity_0 : vec3<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>;
struct DruckerPragerPlasticity_std430_0
{
@align(4) ha_0 : f32,
@align(4) hb_0 : f32,
@align(4) hc_0 : f32,
@align(4) hd_0 : f32,
@align(4) lambda_0 : f32,
@align(4) mu_0 : f32,
};
@binding(2) @group(0) var<storage, read> entryPointParams_plasticity_0 : array<DruckerPragerPlasticity_std430_0>;
struct LinearElasticCoefficients_std430_0
{
@align(4) lambda_1 : f32,
@align(4) mu_1 : f32,
};
@binding(3) @group(0) var<storage, read> entryPointParams_constitutive_model_0 : array<LinearElasticCoefficients_std430_0>;
struct DruckerPragerPlasticState_std430_0
{
@align(4) plastic_deformation_gradient_det_0 : f32,
@align(4) plastic_hardening_0 : f32,
@align(4) log_vol_gain_0 : f32,
};
@binding(4) @group(0) var<storage, read_write> entryPointParams_plastic_state_0 : array<DruckerPragerPlasticState_std430_0>;
struct Position_std430_0
{
@align(16) pt_0 : vec3<f32>,
};
@binding(5) @group(0) var<storage, read_write> entryPointParams_particles_pos_0 : array<Position_std430_0>;
struct _MatrixStorage_float3x3std430_0
{
@align(16) data_0 : array<vec3<f32>, i32(3)>,
};
struct Cdf_std430_0
{
@align(16) normal_0 : vec3<f32>,
@align(16) rigid_vel_0 : vec3<f32>,
@align(4) signed_distance_0 : f32,
@align(16) affinity_0 : u32,
};
struct Dynamics_std430_0
{
@align(16) velocity_0 : vec3<f32>,
@align(16) def_grad_0 : _MatrixStorage_float3x3std430_0,
@align(16) affine_0 : _MatrixStorage_float3x3std430_0,
@align(16) cdf_0 : Cdf_std430_0,
@align(16) init_volume_0 : f32,
@align(4) init_radius_0 : f32,
@align(8) mass_0 : f32,
};
@binding(6) @group(0) var<storage, read_write> entryPointParams_particles_dyn_0 : array<Dynamics_std430_0>;
struct Phase_std430_0
{
@align(4) phase_0 : f32,
@align(4) max_stretch_0 : f32,
};
@binding(7) @group(0) var<storage, read_write> entryPointParams_phases_0 : array<Phase_std430_0>;
fn project_velocity_0( vel_0 : vec3<f32>, n_0 : vec3<f32>) -> vec3<f32>
{
var _S1 : f32 = dot(vel_0, n_0);
if(_S1 < 0.0f)
{
var _S2 : vec3<f32> = vel_0 - n_0 * vec3<f32>(_S1);
var _S3 : f32 = length(_S2);
return select(vec3<f32>(0.0f), _S2 / vec3<f32>(_S3), _S3 > 9.99999993922529029e-09f) * vec3<f32>(max(0.0f, _S3 + 20.0f * _S1));
}
else
{
return vel_0;
}
}
struct Symmetric3x3_0
{
mxx_0 : f32,
myx_0 : f32,
myy_0 : f32,
mzx_0 : f32,
mzy_0 : f32,
mzz_0 : f32,
};
fn Symmetric3x3_x24init_0( mxx_1 : f32, myx_1 : f32, myy_1 : f32, mzx_1 : f32, mzy_1 : f32, mzz_1 : f32) -> Symmetric3x3_0
{
var _S4 : Symmetric3x3_0;
_S4.mxx_0 = mxx_1;
_S4.myx_0 = myx_1;
_S4.myy_0 = myy_1;
_S4.mzx_0 = mzx_1;
_S4.mzy_0 = mzy_1;
_S4.mzz_0 = mzz_1;
return _S4;
}
struct Quat_0
{
coords_0 : vec4<f32>,
};
fn Quat_x24init_0() -> Quat_0
{
var _S5 : Quat_0;
_S5.coords_0 = vec4<f32>(0.0f, 0.0f, 0.0f, 1.0f);
return _S5;
}
struct givens_0
{
ch_0 : f32,
sh_0 : f32,
};
fn givens_x24init_0( ch_1 : f32, sh_1 : f32) -> givens_0
{
var _S6 : givens_0;
_S6.ch_0 = ch_1;
_S6.sh_0 = sh_1;
return _S6;
}
fn rsqrt_0( val_0 : f32) -> f32
{
var _S7 : f32 = -0.5f * val_0;
var x_0 : f32 = bitcast<f32>(i32(1597463170) - ((bitcast<i32>(val_0) >> (u32(1)))));
var i_0 : u32 = u32(0);
for(;;)
{
if(i_0 < u32(4))
{
}
else
{
break;
}
var _S8 : f32 = x_0 * fma(x_0 * x_0, _S7, 1.5f);
var _S9 : u32 = i_0 + u32(1);
x_0 = _S8;
i_0 = _S9;
}
return x_0;
}
fn approximateGivensQuaternion_0( A_0 : ptr<function, Symmetric3x3_0>) -> givens_0
{
var _S10 : givens_0 = givens_x24init_0(2.0f * ((*A_0).mxx_0 - (*A_0).myy_0), (*A_0).myx_0);
var _S11 : f32 = _S10.ch_0;
var _S12 : bool = (5.82842731475830078f * _S10.sh_0 * _S10.sh_0) < (_S11 * _S11);
var _S13 : f32 = rsqrt_0(fma(_S10.ch_0, _S10.ch_0, _S10.sh_0 * _S10.sh_0));
var b_0 : bool;
if(_S13 != _S13)
{
b_0 = false;
}
else
{
b_0 = _S12;
}
if(b_0)
{
return givens_x24init_0(_S13 * _S10.ch_0, _S13 * _S10.sh_0);
}
else
{
return givens_x24init_0(0.92387950420379639f, 0.38268342614173889f);
}
}
fn jacobiConjugation_0( x_1 : i32, y_0 : i32, z_0 : i32, S_0 : ptr<function, Symmetric3x3_0>, q_0 : ptr<function, Quat_0>)
{
var _S14 : givens_0 = approximateGivensQuaternion_0(&((*S_0)));
var g_0 : givens_0 = _S14;
var _S15 : f32 = 1.0f / fma(g_0.ch_0, g_0.ch_0, g_0.sh_0 * g_0.sh_0);
var _S16 : f32 = fma(g_0.ch_0, g_0.ch_0, - g_0.sh_0 * g_0.sh_0) * _S15;
var _S17 : f32 = 2.0f * g_0.sh_0 * g_0.ch_0 * _S15;
var U_S_0 : Symmetric3x3_0 = (*S_0);
(*S_0).mxx_0 = fma(_S16, fma(_S16, U_S_0.mxx_0, _S17 * U_S_0.myx_0), _S17 * fma(_S16, U_S_0.myx_0, _S17 * U_S_0.myy_0));
var _S18 : f32 = - _S17;
(*S_0).myx_0 = fma(_S16, fma(_S18, U_S_0.mxx_0, _S16 * U_S_0.myx_0), _S17 * fma(_S18, U_S_0.myx_0, _S16 * U_S_0.myy_0));
(*S_0).myy_0 = fma(_S18, fma(_S18, U_S_0.mxx_0, _S16 * U_S_0.myx_0), _S16 * fma(_S18, U_S_0.myx_0, _S16 * U_S_0.myy_0));
(*S_0).mzx_0 = fma(_S16, U_S_0.mzx_0, _S17 * U_S_0.mzy_0);
(*S_0).mzy_0 = fma(_S18, U_S_0.mzx_0, _S16 * U_S_0.mzy_0);
(*S_0).mzz_0 = U_S_0.mzz_0;
var tmp_0 : array<f32, i32(3)> = array<f32, i32(3)>( (*q_0).coords_0[i32(0)] * g_0.sh_0, (*q_0).coords_0[i32(1)] * g_0.sh_0, (*q_0).coords_0[i32(2)] * g_0.sh_0 );
var _S19 : f32 = g_0.sh_0 * (*q_0).coords_0[i32(3)];
g_0.sh_0 = _S19;
(*q_0).coords_0[z_0] = fma((*q_0).coords_0[z_0], g_0.ch_0, _S19);
(*q_0).coords_0[i32(3)] = fma((*q_0).coords_0[i32(3)], g_0.ch_0, - tmp_0[z_0]);
(*q_0).coords_0[x_1] = fma((*q_0).coords_0[x_1], g_0.ch_0, tmp_0[y_0]);
(*q_0).coords_0[y_0] = fma((*q_0).coords_0[y_0], g_0.ch_0, - tmp_0[x_1]);
U_S_0.mxx_0 = (*S_0).myy_0;
U_S_0.myx_0 = (*S_0).mzy_0;
U_S_0.myy_0 = (*S_0).mzz_0;
U_S_0.mzx_0 = (*S_0).myx_0;
U_S_0.mzy_0 = (*S_0).mzx_0;
var _S20 : f32 = (*S_0).mxx_0;
U_S_0.mzz_0 = (*S_0).mxx_0;
(*S_0).mxx_0 = U_S_0.mxx_0;
(*S_0).myx_0 = U_S_0.myx_0;
(*S_0).myy_0 = U_S_0.myy_0;
(*S_0).mzx_0 = U_S_0.mzx_0;
(*S_0).mzy_0 = U_S_0.mzy_0;
(*S_0).mzz_0 = _S20;
return;
}
fn jacobiEigenanalysis_0( S_1 : Symmetric3x3_0) -> Quat_0
{
var mat_0 : Symmetric3x3_0 = S_1;
var q_1 : Quat_0 = Quat_x24init_0();
var i_1 : u32 = u32(0);
for(;;)
{
if(i_1 < u32(12))
{
}
else
{
break;
}
jacobiConjugation_0(i32(0), i32(1), i32(2), &(mat_0), &(q_1));
jacobiConjugation_0(i32(1), i32(2), i32(0), &(mat_0), &(q_1));
jacobiConjugation_0(i32(2), i32(0), i32(1), &(mat_0), &(q_1));
i_1 = i_1 + u32(1);
}
return q_1;
}
fn Quat_to_matrix_0( this_0 : Quat_0) -> mat3x3<f32>
{
var _S21 : f32 = this_0.coords_0.x;
var _S22 : f32 = this_0.coords_0.y;
var _S23 : f32 = this_0.coords_0.z;
var _S24 : f32 = this_0.coords_0.w;
var _S25 : f32 = _S24 * _S24;
var _S26 : f32 = _S21 * _S21;
var _S27 : f32 = _S22 * _S22;
var _S28 : f32 = _S23 * _S23;
var _S29 : f32 = _S21 * _S22 * 2.0f;
var _S30 : f32 = _S24 * _S23 * 2.0f;
var _S31 : f32 = _S24 * _S22 * 2.0f;
var _S32 : f32 = _S21 * _S23 * 2.0f;
var _S33 : f32 = _S22 * _S23 * 2.0f;
var _S34 : f32 = _S24 * _S21 * 2.0f;
var _S35 : f32 = _S25 - _S26;
return mat3x3<f32>(vec3<f32>(_S25 + _S26 - _S27 - _S28, _S30 + _S29, _S32 - _S31), vec3<f32>(_S29 - _S30, _S35 + _S27 - _S28, _S34 + _S33), vec3<f32>(_S31 + _S32, _S33 - _S34, _S35 - _S27 + _S28));
}
fn condNegSwapVec_0( c_0 : bool, x_2 : ptr<function, vec3<f32>>, y_1 : ptr<function, vec3<f32>>)
{
var _S36 : vec3<f32> = - (*x_2);
var _S37 : vec3<bool> = vec3<bool>(c_0);
(*x_2) = select((*x_2), (*y_1), _S37);
(*y_1) = select((*y_1), _S36, _S37);
return;
}
fn condSwap_0( c_1 : bool, x_3 : ptr<function, f32>, y_2 : ptr<function, f32>)
{
var _S38 : f32 = (*x_3);
(*x_3) = select((*x_3), (*y_2), c_1);
(*y_2) = select((*y_2), _S38, c_1);
return;
}
struct SortedSingularValues_0
{
B_0 : mat3x3<f32>,
V_0 : mat3x3<f32>,
};
fn SortedSingularValues_x24init_0( B_1 : mat3x3<f32>, V_1 : mat3x3<f32>) -> SortedSingularValues_0
{
var _S39 : SortedSingularValues_0;
_S39.B_0 = B_1;
_S39.V_0 = V_1;
return _S39;
}
fn sortSingularValues_0( B_2 : mat3x3<f32>, V_2 : mat3x3<f32>) -> SortedSingularValues_0
{
var bx_0 : vec3<f32> = B_2[i32(0)];
var by_0 : vec3<f32> = B_2[i32(1)];
var bz_0 : vec3<f32> = B_2[i32(2)];
var vx_0 : vec3<f32> = V_2[i32(0)];
var vy_0 : vec3<f32> = V_2[i32(1)];
var vz_0 : vec3<f32> = V_2[i32(2)];
var _S40 : f32 = dot(B_2[i32(0)], B_2[i32(0)]);
var rho1_0 : f32 = _S40;
var _S41 : f32 = dot(B_2[i32(1)], B_2[i32(1)]);
var rho2_0 : f32 = _S41;
var _S42 : f32 = dot(B_2[i32(2)], B_2[i32(2)]);
var rho3_0 : f32 = _S42;
var c_2 : bool = _S40 < _S41;
condNegSwapVec_0(c_2, &(bx_0), &(by_0));
condNegSwapVec_0(c_2, &(vx_0), &(vy_0));
condSwap_0(c_2, &(rho1_0), &(rho2_0));
var c_3 : bool = rho1_0 < _S42;
condNegSwapVec_0(c_3, &(bx_0), &(bz_0));
condNegSwapVec_0(c_3, &(vx_0), &(vz_0));
condSwap_0(c_3, &(rho1_0), &(rho3_0));
var c_4 : bool = rho2_0 < rho3_0;
condNegSwapVec_0(c_4, &(by_0), &(bz_0));
condNegSwapVec_0(c_4, &(vy_0), &(vz_0));
return SortedSingularValues_x24init_0(mat3x3<f32>(bx_0, by_0, bz_0), mat3x3<f32>(vx_0, vy_0, vz_0));
}
fn rsqrt1_0( val_1 : f32) -> f32
{
var _S43 : f32 = -0.5f * val_1;
var x_4 : f32 = bitcast<f32>(i32(1597463170) - ((bitcast<i32>(val_1) >> (u32(1)))));
var i_2 : u32 = u32(0);
for(;;)
{
if(i_2 < u32(6))
{
}
else
{
break;
}
var _S44 : f32 = x_4 * fma(x_4 * x_4, _S43, 1.5f);
var _S45 : u32 = i_2 + u32(1);
x_4 = _S44;
i_2 = _S45;
}
return x_4;
}
fn accurateSqrt_0( x_5 : f32) -> f32
{
return 1.0f / rsqrt1_0(x_5);
}
fn QRGivensQuaternion_0( a1_0 : f32, a2_0 : f32) -> givens_0
{
var _S46 : f32 = accurateSqrt_0(fma(a1_0, a1_0, a2_0 * a2_0));
var ch_2 : f32 = abs(a1_0) + max(_S46, 9.99999997475242708e-07f);
var sh_2 : f32 = select(0.0f, a2_0, _S46 > 9.99999997475242708e-07f);
condSwap_0(a1_0 < 0.0f, &(sh_2), &(ch_2));
var _S47 : f32 = rsqrt_0(fma(ch_2, ch_2, sh_2 * sh_2));
var _S48 : f32 = ch_2 * _S47;
ch_2 = _S48;
var _S49 : f32 = sh_2 * _S47;
sh_2 = _S49;
return givens_x24init_0(_S48, _S49);
}
struct QR_0
{
Q_0 : mat3x3<f32>,
R_0 : mat3x3<f32>,
};
fn QR_x24init_0( Q_1 : mat3x3<f32>, R_1 : mat3x3<f32>) -> QR_0
{
var _S50 : QR_0;
_S50.Q_0 = Q_1;
_S50.R_0 = R_1;
return _S50;
}
fn QRDecomposition_0( in_B_0 : mat3x3<f32>) -> QR_0
{
var _S51 : f32 = in_B_0[i32(0)].x;
var _S52 : f32 = in_B_0[i32(0)].y;
var _S53 : givens_0 = QRGivensQuaternion_0(_S51, _S52);
var _S54 : f32 = _S53.sh_0;
var a_0 : f32 = fma(-2.0f, _S54 * _S54, 1.0f);
var b_1 : f32 = 2.0f * _S53.ch_0 * _S53.sh_0;
var r00_0 : f32 = fma(a_0, _S51, b_1 * _S52);
var _S55 : f32 = in_B_0[i32(1)].x;
var _S56 : f32 = in_B_0[i32(1)].y;
var r01_0 : f32 = fma(a_0, _S55, b_1 * _S56);
var _S57 : f32 = in_B_0[i32(2)].x;
var _S58 : f32 = in_B_0[i32(2)].y;
var r02_0 : f32 = fma(a_0, _S57, b_1 * _S58);
var _S59 : f32 = - b_1;
var r10_0 : f32 = fma(_S59, _S51, a_0 * _S52);
var r11_0 : f32 = fma(_S59, _S55, a_0 * _S56);
var r12_0 : f32 = fma(_S59, _S57, a_0 * _S58);
var r20_0 : f32 = in_B_0[i32(0)].z;
var r21_0 : f32 = in_B_0[i32(1)].z;
var r22_0 : f32 = in_B_0[i32(2)].z;
var _S60 : givens_0 = QRGivensQuaternion_0(r00_0, r20_0);
var _S61 : f32 = _S60.sh_0;
var a_1 : f32 = fma(-2.0f, _S61 * _S61, 1.0f);
var b_2 : f32 = 2.0f * _S60.ch_0 * _S60.sh_0;
var _S62 : f32 = - b_2;
var b20_0 : f32 = fma(_S62, r00_0, a_1 * r20_0);
var b21_0 : f32 = fma(_S62, r01_0, a_1 * r21_0);
var b22_0 : f32 = fma(_S62, r02_0, a_1 * r22_0);
var _S63 : givens_0 = QRGivensQuaternion_0(r11_0, b21_0);
var _S64 : f32 = _S63.sh_0;
var a_2 : f32 = fma(-2.0f, _S64 * _S64, 1.0f);
var b_3 : f32 = 2.0f * _S63.ch_0 * _S63.sh_0;
var _S65 : f32 = - b_3;
var _S66 : f32 = 2.0f * fma(_S53.sh_0, _S53.sh_0, -0.5f);
var _S67 : f32 = 2.0f * fma(_S60.sh_0, _S60.sh_0, -0.5f);
var _S68 : f32 = 2.0f * fma(_S63.sh_0, _S63.sh_0, -0.5f);
var _S69 : f32 = -2.0f * _S63.ch_0;
return QR_x24init_0(mat3x3<f32>(vec3<f32>(_S66 * _S67, -2.0f * _S53.ch_0 * _S53.sh_0 * _S67, b_2), vec3<f32>(fma(4.0f * _S60.ch_0 * _S63.ch_0, _S66 * _S60.sh_0 * _S63.sh_0, b_1 * _S68), fma(-8.0f * _S53.ch_0 * _S60.ch_0 * _S63.ch_0, _S53.sh_0 * _S60.sh_0 * _S63.sh_0, _S66 * _S68), _S69 * _S67 * _S63.sh_0), vec3<f32>(fma(4.0f * _S53.ch_0 * _S63.ch_0, _S53.sh_0 * _S63.sh_0, -2.0f * _S60.ch_0 * _S66 * _S60.sh_0 * _S68), fma(_S69, _S63.sh_0, 4.0f * _S53.sh_0 * fma(_S63.ch_0 * _S53.sh_0, _S63.sh_0, _S53.ch_0 * _S60.ch_0 * _S60.sh_0 * _S68)), _S67 * _S68)), mat3x3<f32>(vec3<f32>(fma(a_1, r00_0, b_2 * r20_0), fma(a_2, r10_0, b_3 * b20_0), fma(_S65, r10_0, a_2 * b20_0)), vec3<f32>(fma(a_1, r01_0, b_2 * r21_0), fma(a_2, r11_0, b_3 * b21_0), fma(_S65, r11_0, a_2 * b21_0)), vec3<f32>(fma(a_1, r02_0, b_2 * r22_0), fma(a_2, r12_0, b_3 * b22_0), fma(_S65, r12_0, a_2 * b22_0))));
}
struct Svd3_0
{
U_0 : mat3x3<f32>,
S_2 : vec3<f32>,
Vt_0 : mat3x3<f32>,
};
fn Svd3_x24init_0( A_1 : mat3x3<f32>) -> Svd3_0
{
var _S70 : mat3x3<f32> = (((transpose(A_1)) * (A_1)));
var _S71 : mat3x3<f32> = Quat_to_matrix_0(jacobiEigenanalysis_0(Symmetric3x3_x24init_0(_S70[i32(0)].x, _S70[i32(0)].y, _S70[i32(1)].y, _S70[i32(0)].z, _S70[i32(1)].z, _S70[i32(2)].z)));
var _S72 : SortedSingularValues_0 = sortSingularValues_0((((A_1) * (_S71))), _S71);
var _S73 : QR_0 = QRDecomposition_0(_S72.B_0);
var _S74 : vec3<f32> = vec3<f32>(_S73.R_0[i32(0)].x, _S73.R_0[i32(1)].y, _S73.R_0[i32(2)].z);
var _S75 : Svd3_0;
_S75.U_0 = _S73.Q_0;
_S75.S_2 = _S74;
_S75.Vt_0 = transpose(_S72.V_0);
return _S75;
}
struct DruckerPragerPlasticState_0
{
@align(4) plastic_deformation_gradient_det_0 : f32,
@align(4) plastic_hardening_0 : f32,
@align(4) log_vol_gain_0 : f32,
};
struct DruckerPragerResult_0
{
state_0 : DruckerPragerPlasticState_0,
deformation_gradient_0 : mat3x3<f32>,
};
fn DruckerPragerResult_x24init_0( state_1 : DruckerPragerPlasticState_0, deformation_gradient_1 : mat3x3<f32>) -> DruckerPragerResult_0
{
var _S76 : DruckerPragerResult_0;
_S76.state_0 = state_1;
_S76.deformation_gradient_0 = deformation_gradient_1;
return _S76;
}
struct DruckerPragerPlasticity_0
{
@align(4) ha_0 : f32,
@align(4) hb_0 : f32,
@align(4) hc_0 : f32,
@align(4) hd_0 : f32,
@align(4) lambda_0 : f32,
@align(4) mu_0 : f32,
};
fn DruckerPragerPlasticity_alpha_0( this_1 : DruckerPragerPlasticity_0, q_2 : f32) -> f32
{
var _S77 : f32 = sin(this_1.ha_0 + (this_1.hb_0 * q_2 - this_1.hd_0) * exp(- this_1.hc_0 * q_2));
return sqrt(0.66666668653488159f) * (2.0f * _S77) / (3.0f - _S77);
}
struct DruckerPragerProjectionResult_0
{
singular_values_0 : vec3<f32>,
plastic_hardening_1 : f32,
valid_0 : bool,
};
fn DruckerPragerProjectionResult_x24init_0( singular_values_1 : vec3<f32>, plastic_hardening_2 : f32, valid_1 : bool) -> DruckerPragerProjectionResult_0
{
var _S78 : DruckerPragerProjectionResult_0;
_S78.singular_values_0 = singular_values_1;
_S78.plastic_hardening_1 = plastic_hardening_2;
_S78.valid_0 = valid_1;
return _S78;
}
fn DruckerPragerPlasticity_project_deformation_gradient_0( this_2 : DruckerPragerPlasticity_0, singular_values_2 : vec3<f32>, log_vol_gain_1 : f32, alpha_0 : f32) -> DruckerPragerProjectionResult_0
{
var _S79 : vec3<f32> = log(singular_values_2) + vec3<f32>((log_vol_gain_1 / 3.0f));
var _S80 : f32 = _S79.x + _S79.y + _S79.z;
var _S81 : vec3<f32> = _S79 - vec3<f32>((_S80 / 3.0f));
var _S82 : bool;
if(_S80 > 0.0f)
{
_S82 = true;
}
else
{
_S82 = all(_S81 == vec3<f32>(0.0f));
}
if(_S82)
{
return DruckerPragerProjectionResult_x24init_0(vec3<f32>(1.0f), length(_S79), true);
}
var _S83 : f32 = length(_S81);
var _S84 : f32 = 2.0f * this_2.mu_0;
var _S85 : f32 = _S83 + (3.0f * this_2.lambda_0 + _S84) / _S84 * _S80 * alpha_0;
if(_S85 <= 0.0f)
{
return DruckerPragerProjectionResult_x24init_0(vec3<f32>(0.0f), 0.0f, false);
}
return DruckerPragerProjectionResult_x24init_0(exp(_S79 - _S81 * vec3<f32>((_S85 / _S83))), _S85, true);
}
fn Svd3_x24init_1( U_1 : mat3x3<f32>, S_3 : vec3<f32>, Vt_1 : mat3x3<f32>) -> Svd3_0
{
var _S86 : Svd3_0;
_S86.U_0 = U_1;
_S86.S_2 = S_3;
_S86.Vt_0 = Vt_1;
return _S86;
}
fn Svd3_recompose_0( this_3 : Svd3_0) -> mat3x3<f32>
{
return (((mat3x3<f32>(this_3.U_0[i32(0)] * vec3<f32>(this_3.S_2.x), this_3.U_0[i32(1)] * vec3<f32>(this_3.S_2.y), this_3.U_0[i32(2)] * vec3<f32>(this_3.S_2.z))) * (this_3.Vt_0)));
}
fn DruckerPragerPlasticState_x24init_0( plastic_deformation_gradient_det_1 : f32, plastic_hardening_3 : f32, log_vol_gain_2 : f32) -> DruckerPragerPlasticState_0
{
var _S87 : DruckerPragerPlasticState_0;
_S87.plastic_deformation_gradient_det_0 = plastic_deformation_gradient_det_1;
_S87.plastic_hardening_0 = plastic_hardening_3;
_S87.log_vol_gain_0 = log_vol_gain_2;
return _S87;
}
fn DruckerPragerPlasticity_project_0( this_4 : DruckerPragerPlasticity_0, state_2 : DruckerPragerPlasticState_0, deformation_gradient_2 : mat3x3<f32>) -> DruckerPragerResult_0
{
if((this_4.lambda_0) == 0.0f)
{
return DruckerPragerResult_x24init_0(state_2, deformation_gradient_2);
}
var _S88 : Svd3_0 = Svd3_x24init_0(deformation_gradient_2);
var _S89 : DruckerPragerProjectionResult_0 = DruckerPragerPlasticity_project_deformation_gradient_0(this_4, _S88.S_2, state_2.log_vol_gain_0, DruckerPragerPlasticity_alpha_0(this_4, state_2.plastic_hardening_0));
if(_S89.valid_0)
{
var _S90 : f32 = _S88.S_2.x * _S88.S_2.y * _S88.S_2.z;
var _S91 : f32 = _S89.singular_values_0.x * _S89.singular_values_0.y * _S89.singular_values_0.z;
return DruckerPragerResult_x24init_0(DruckerPragerPlasticState_x24init_0(state_2.plastic_deformation_gradient_det_0 * _S90 / _S91, state_2.plastic_hardening_0 + _S89.plastic_hardening_1, state_2.log_vol_gain_0 + log(_S90) - log(_S91)), Svd3_recompose_0(Svd3_x24init_1(_S88.U_0, _S89.singular_values_0, _S88.Vt_0)));
}
else
{
return DruckerPragerResult_x24init_0(state_2, deformation_gradient_2);
}
}
struct LinearElasticCoefficients_0
{
@align(4) lambda_1 : f32,
@align(4) mu_1 : f32,
};
fn LinearElasticCoefficients_kirchoff_stress_0( this_5 : LinearElasticCoefficients_0, deformation_gradient_3 : mat3x3<f32>) -> mat3x3<f32>
{
var svd_0 : Svd3_0 = Svd3_x24init_0(deformation_gradient_3);
var _S92 : f32 = svd_0.S_2.x * svd_0.S_2.y * svd_0.S_2.z;
svd_0.S_2 = svd_0.S_2 - vec3<f32>(1.0f);
var _S93 : f32 = this_5.lambda_1 * (_S92 - 1.0f) * _S92;
var _S94 : mat3x3<f32> = (((Svd3_recompose_0(svd_0)) * (transpose(deformation_gradient_3))));
var _S95 : mat3x3<f32> = mat3x3<f32>(2.0f * this_5.mu_1, 2.0f * this_5.mu_1, 2.0f * this_5.mu_1, 2.0f * this_5.mu_1, 2.0f * this_5.mu_1, 2.0f * this_5.mu_1, 2.0f * this_5.mu_1, 2.0f * this_5.mu_1, 2.0f * this_5.mu_1);
var result_0 : mat3x3<f32> = mat3x3<f32>(_S94[0] * _S95[0], _S94[1] * _S95[1], _S94[2] * _S95[2]);
result_0[i32(0)][i32(0)] = result_0[i32(0)][i32(0)] + _S93;
result_0[i32(1)][i32(1)] = result_0[i32(1)][i32(1)] + _S93;
result_0[i32(2)][i32(2)] = result_0[i32(2)][i32(2)] + _S93;
return result_0;
}
fn QuadraticKernel_inv_d_0( cell_width_1 : f32) -> f32
{
return 4.0f / (cell_width_1 * cell_width_1);
}
fn getCount_0() -> i32
{
var _S96 : vec2<u32> = vec2<u32>(arrayLength(&entryPointParams_particles_pos_0), 16);
return i32(_S96.x);
}
@compute
@workgroup_size(64, 1, 1)
fn particle_update(@builtin(global_invocation_id) invocation_id_0 : vec3<u32>)
{
var _S97 : u32 = invocation_id_0.x;
var _S98 : i32 = getCount_0();
if(_S97 >= u32(_S98))
{
return;
}
var _S99 : f32 = entryPointParams_params_0.dt_0;
var _S100 : f32 = entryPointParams_grid_0[i32(0)].cell_width_0;
var _S101 : vec3<f32> = entryPointParams_particles_dyn_0[_S97].velocity_0;
var _S102 : mat3x3<f32> = mat3x3<f32>(entryPointParams_particles_dyn_0[_S97].def_grad_0.data_0[i32(0)][i32(0)], entryPointParams_particles_dyn_0[_S97].def_grad_0.data_0[i32(0)][i32(1)], entryPointParams_particles_dyn_0[_S97].def_grad_0.data_0[i32(0)][i32(2)], entryPointParams_particles_dyn_0[_S97].def_grad_0.data_0[i32(1)][i32(0)], entryPointParams_particles_dyn_0[_S97].def_grad_0.data_0[i32(1)][i32(1)], entryPointParams_particles_dyn_0[_S97].def_grad_0.data_0[i32(1)][i32(2)], entryPointParams_particles_dyn_0[_S97].def_grad_0.data_0[i32(2)][i32(0)], entryPointParams_particles_dyn_0[_S97].def_grad_0.data_0[i32(2)][i32(1)], entryPointParams_particles_dyn_0[_S97].def_grad_0.data_0[i32(2)][i32(2)]);
var _S103 : mat3x3<f32> = mat3x3<f32>(entryPointParams_particles_dyn_0[_S97].affine_0.data_0[i32(0)][i32(0)], entryPointParams_particles_dyn_0[_S97].affine_0.data_0[i32(0)][i32(1)], entryPointParams_particles_dyn_0[_S97].affine_0.data_0[i32(0)][i32(2)], entryPointParams_particles_dyn_0[_S97].affine_0.data_0[i32(1)][i32(0)], entryPointParams_particles_dyn_0[_S97].affine_0.data_0[i32(1)][i32(1)], entryPointParams_particles_dyn_0[_S97].affine_0.data_0[i32(1)][i32(2)], entryPointParams_particles_dyn_0[_S97].affine_0.data_0[i32(2)][i32(0)], entryPointParams_particles_dyn_0[_S97].affine_0.data_0[i32(2)][i32(1)], entryPointParams_particles_dyn_0[_S97].affine_0.data_0[i32(2)][i32(2)]);
var _S104 : vec3<f32> = entryPointParams_particles_dyn_0[_S97].cdf_0.normal_0;
var _S105 : vec3<f32> = entryPointParams_particles_dyn_0[_S97].cdf_0.rigid_vel_0;
var _S106 : f32 = entryPointParams_particles_dyn_0[_S97].cdf_0.signed_distance_0;
var _S107 : f32 = entryPointParams_particles_dyn_0[_S97].init_volume_0;
var _S108 : f32 = entryPointParams_particles_dyn_0[_S97].mass_0;
var _S109 : vec3<f32> = entryPointParams_particles_pos_0[_S97].pt_0;
var _S110 : bool = (entryPointParams_particles_dyn_0[_S97].cdf_0.signed_distance_0) < (-0.05000000074505806f * entryPointParams_grid_0[i32(0)].cell_width_0);
var new_particle_vel_0 : vec3<f32>;
if(_S110)
{
new_particle_vel_0 = _S105 + project_velocity_0(_S101 - _S105, _S104);
}
else
{
new_particle_vel_0 = _S101;
}
var _S111 : f32 = length(new_particle_vel_0);
if(_S111 > (_S100 / _S99))
{
new_particle_vel_0 = new_particle_vel_0 / vec3<f32>(_S111) * vec3<f32>(_S100) / vec3<f32>(_S99);
}
else
{
}
var _S112 : vec3<f32> = _S109 + new_particle_vel_0 * vec3<f32>(_S99);
if(_S110)
{
new_particle_vel_0 = new_particle_vel_0 + vec3<f32>((_S99 * - max(_S106, -0.30000001192092896f * _S100) * 1000.0f)) * _S104;
}
else
{
}
var _S113 : mat3x3<f32> = mat3x3<f32>(_S99, _S99, _S99, _S99, _S99, _S99, _S99, _S99, _S99);
var _S114 : mat3x3<f32> = _S102 + (((mat3x3<f32>(_S103[0] * _S113[0], _S103[1] * _S113[1], _S103[2] * _S113[2])) * (_S102)));
var phase_1 : f32 = entryPointParams_phases_0[_S97].phase_0;
var _S115 : f32 = entryPointParams_phases_0[_S97].max_stretch_0;
var _S116 : bool;
if((entryPointParams_phases_0[_S97].phase_0) > 0.0f)
{
_S116 = _S115 > 0.0f;
}
else
{
_S116 = false;
}
var phase_2 : f32;
if(_S116)
{
var _S117 : Svd3_0 = Svd3_x24init_0(_S114);
if((_S117.S_2.x) > _S115)
{
_S116 = true;
}
else
{
_S116 = (_S117.S_2.y) > _S115;
}
if(_S116)
{
_S116 = true;
}
else
{
_S116 = (_S117.S_2.z) > _S115;
}
if(_S116)
{
entryPointParams_phases_0[_S97].phase_0 = 0.0f;
phase_2 = 0.0f;
}
else
{
phase_2 = phase_1;
}
}
else
{
phase_2 = phase_1;
}
var new_deformation_gradient_0 : mat3x3<f32>;
if(phase_2 == 0.0f)
{
var _S118 : DruckerPragerPlasticity_0 = DruckerPragerPlasticity_0( entryPointParams_plasticity_0[_S97].ha_0, entryPointParams_plasticity_0[_S97].hb_0, entryPointParams_plasticity_0[_S97].hc_0, entryPointParams_plasticity_0[_S97].hd_0, entryPointParams_plasticity_0[_S97].lambda_0, entryPointParams_plasticity_0[_S97].mu_0 );
var _S119 : DruckerPragerPlasticState_0 = DruckerPragerPlasticState_0( entryPointParams_plastic_state_0[_S97].plastic_deformation_gradient_det_0, entryPointParams_plastic_state_0[_S97].plastic_hardening_0, entryPointParams_plastic_state_0[_S97].log_vol_gain_0 );
var _S120 : DruckerPragerResult_0 = DruckerPragerPlasticity_project_0(_S118, _S119, _S114);
entryPointParams_plastic_state_0[_S97].plastic_deformation_gradient_det_0 = _S120.state_0.plastic_deformation_gradient_det_0;
entryPointParams_plastic_state_0[_S97].plastic_hardening_0 = _S120.state_0.plastic_hardening_0;
entryPointParams_plastic_state_0[_S97].log_vol_gain_0 = _S120.state_0.log_vol_gain_0;
new_deformation_gradient_0 = _S120.deformation_gradient_0;
}
else
{
new_deformation_gradient_0 = _S114;
}
var _S121 : LinearElasticCoefficients_0 = LinearElasticCoefficients_0( entryPointParams_constitutive_model_0[_S97].lambda_1, entryPointParams_constitutive_model_0[_S97].mu_1 );
var _S122 : mat3x3<f32> = LinearElasticCoefficients_kirchoff_stress_0(_S121, new_deformation_gradient_0);
var _S123 : mat3x3<f32> = mat3x3<f32>(_S108, _S108, _S108, _S108, _S108, _S108, _S108, _S108, _S108);
var _S124 : mat3x3<f32> = mat3x3<f32>(_S107 * QuadraticKernel_inv_d_0(_S100) * _S99, _S107 * QuadraticKernel_inv_d_0(_S100) * _S99, _S107 * QuadraticKernel_inv_d_0(_S100) * _S99, _S107 * QuadraticKernel_inv_d_0(_S100) * _S99, _S107 * QuadraticKernel_inv_d_0(_S100) * _S99, _S107 * QuadraticKernel_inv_d_0(_S100) * _S99, _S107 * QuadraticKernel_inv_d_0(_S100) * _S99, _S107 * QuadraticKernel_inv_d_0(_S100) * _S99, _S107 * QuadraticKernel_inv_d_0(_S100) * _S99);
var _S125 : mat3x3<f32> = mat3x3<f32>(_S103[0] * _S123[0], _S103[1] * _S123[1], _S103[2] * _S123[2]) - mat3x3<f32>(_S122[0] * _S124[0], _S122[1] * _S124[1], _S122[2] * _S124[2]);
entryPointParams_particles_pos_0[_S97].pt_0 = _S112;
entryPointParams_particles_dyn_0[_S97].velocity_0 = new_particle_vel_0;
var _S126 : array<vec3<f32>, i32(3)> = array<vec3<f32>, i32(3)>( vec3<f32>(new_deformation_gradient_0[i32(0)][i32(0)], new_deformation_gradient_0[i32(0)][i32(1)], new_deformation_gradient_0[i32(0)][i32(2)]), vec3<f32>(new_deformation_gradient_0[i32(1)][i32(0)], new_deformation_gradient_0[i32(1)][i32(1)], new_deformation_gradient_0[i32(1)][i32(2)]), vec3<f32>(new_deformation_gradient_0[i32(2)][i32(0)], new_deformation_gradient_0[i32(2)][i32(1)], new_deformation_gradient_0[i32(2)][i32(2)]) );
entryPointParams_particles_dyn_0[_S97].def_grad_0.data_0 = _S126;
var _S127 : array<vec3<f32>, i32(3)> = array<vec3<f32>, i32(3)>( vec3<f32>(_S125[i32(0)][i32(0)], _S125[i32(0)][i32(1)], _S125[i32(0)][i32(2)]), vec3<f32>(_S125[i32(1)][i32(0)], _S125[i32(1)][i32(1)], _S125[i32(1)][i32(2)]), vec3<f32>(_S125[i32(2)][i32(0)], _S125[i32(2)][i32(1)], _S125[i32(2)][i32(2)]) );
entryPointParams_particles_dyn_0[_S97].affine_0.data_0 = _S127;
return;
}