1#define_import_path bevy_gaussian_splatting::morph::interpolate 3#import bevy_gaussian_splatting::bindings::gaussian_uniforms 6 #import bevy_gaussian_splatting::packed::{ 11 get_spherical_harmonics, 17 get_rhs_spherical_harmonics, 19 set_output_position_visibility, 20 set_output_spherical_harmonics, 24 #import bevy_gaussian_splatting::planar::{ 29 get_spherical_harmonics, 35 get_rhs_spherical_harmonics, 37 set_output_position_visibility, 38 set_output_spherical_harmonics, 42 #ifdef PRECOMPUTE_COVARIANCE_3D 43 #import bevy_gaussian_splatting::planar::{ 46 set_output_covariance, 51fn interpolation_factor() -> f32 { 52 let duration = gaussian_uniforms.time_stop - gaussian_uniforms.time_start; 53 if abs(duration) < 1e-6 { 54 return select(0.0, 1.0, gaussian_uniforms.time >= gaussian_uniforms.time_stop); 56 return clamp((gaussian_uniforms.time - gaussian_uniforms.time_start) / duration, 0.0, 1.0); 59fn normalize_quaternion(q: vec4<f32>) -> vec4<f32> { 60 let length_squared = dot(q, q); 61 if length_squared <= 0.0 { 62 return vec4<f32>(0.0, 0.0, 0.0, 1.0); 64 return q / sqrt(length_squared); 67const WORKGROUP_SIZE: u32 = 256u; 69@compute @workgroup_size(WORKGROUP_SIZE, 1, 1) 70fn interpolate_gaussians( 71 @builtin(global_invocation_id) global_id: vec3<u32>, 73 let index = global_id.x; 74 if index >= gaussian_uniforms.count { 78 let t = interpolation_factor(); 79 let position_t = vec3<f32>(t); 80 let rotation_t = vec4<f32>(t); 82 let lhs_position = get_position(index); 83 let rhs_position = get_rhs_position(index); 84 let lhs_visibility = get_visibility(index); 85 let rhs_visibility = get_rhs_visibility(index); 87 let position = mix(lhs_position, rhs_position, position_t); 88 let visibility = mix(lhs_visibility, rhs_visibility, t); 89 set_output_position_visibility(index, position, visibility); 91 var sh = get_spherical_harmonics(index); 92 let rhs_sh = get_rhs_spherical_harmonics(index); 93 for (var i = 0u; i < #{SH_COEFF_COUNT}; i = i + 1u) { 94 sh[i] = mix(sh[i], rhs_sh[i], t); 96 set_output_spherical_harmonics(index, sh); 98#ifdef PRECOMPUTE_COVARIANCE_3D 99 var cov = get_cov3d(index); 100 let rhs_cov = get_rhs_cov3d(index); 101 for (var i = 0u; i < 6u; i = i + 1u) { 102 cov[i] = mix(cov[i], rhs_cov[i], t); 104 let opacity = mix(get_opacity(index), get_rhs_opacity(index), t); 105 set_output_covariance(index, cov, opacity); 107 let rotation = normalize_quaternion( 110 get_rhs_rotation(index), 115 let scale = mix(get_scale(index), get_rhs_scale(index), position_t); 116 let opacity = mix(get_opacity(index), get_rhs_opacity(index), t); 117 set_output_transform(index, rotation, scale, opacity);