1#define_import_path bevy_gaussian_splatting::planar 3#ifdef GAUSSIAN_3D_STRUCTURE 4 #ifdef PRECOMPUTE_COVARIANCE_3D 5 #import bevy_gaussian_splatting::bindings::{ 11 #ifdef BINARY_GAUSSIAN_OP 12 #import bevy_gaussian_splatting::bindings::{ 13 rhs_position_visibility, 14 rhs_spherical_harmonics, 15 rhs_covariance_3d_opacity, 16 out_position_visibility, 17 out_spherical_harmonics, 18 out_covariance_3d_opacity, 22 #import bevy_gaussian_splatting::bindings::{ 26 rotation_scale_opacity, 30 #ifdef BINARY_GAUSSIAN_OP 31 #import bevy_gaussian_splatting::bindings::{ 32 rhs_position_visibility, 33 rhs_spherical_harmonics, 34 out_position_visibility, 35 out_spherical_harmonics, 39 #import bevy_gaussian_splatting::bindings::rhs_rotation_scale_opacity 40 #import bevy_gaussian_splatting::bindings::out_rotation_scale_opacity 44 #import bevy_gaussian_splatting::bindings::{ 54 #import bevy_gaussian_splatting::spherical_harmonics::{ 55 spherical_harmonics_lookup, 58#else ifdef GAUSSIAN_4D 59 #import bevy_gaussian_splatting::bindings::{ 61 spherindrical_harmonics, 67 #ifdef BINARY_GAUSSIAN_OP 68 #import bevy_gaussian_splatting::bindings::{ 69 rhs_position_visibility, 70 rhs_spherindrical_harmonics, 71 rhs_isotropic_rotations, 73 rhs_timestamp_timescale, 77 #import bevy_gaussian_splatting::spherical_harmonics::srgb_to_linear 78 #import bevy_gaussian_splatting::spherindrical_harmonics::spherindrical_harmonics_lookup 81fn planar_position(value: vec4<f32>) -> vec3<f32> { 85fn planar_visibility(value: vec4<f32>) -> f32 { 89#ifdef GAUSSIAN_3D_STRUCTURE 90 fn planar_color_from_sh( 91 ray_direction: vec3<f32>, 92 sh: array<f32, #{SH_COEFF_COUNT}>, 94 let color = spherical_harmonics_lookup(ray_direction, sh); 95 return srgb_to_linear(color); 98 fn planar_scale_from(scale_opacity: vec4<f32>) -> vec3<f32> { 99 return scale_opacity.xyz; 102 fn planar_opacity_from(scale_opacity: vec4<f32>) -> f32 { 103 return scale_opacity.w; 107 fn planar_f16_decode_sh( 108 raw: array<u32, #{HALF_SH_COEFF_COUNT}>, 109 ) -> array<f32, #{SH_COEFF_COUNT}> { 110 var coefficients: array<f32, #{SH_COEFF_COUNT}>; 112 for (var i = 0u; i < #{HALF_SH_COEFF_COUNT}u; i = i + 1u) { 113 let values = unpack2x16float(raw[i]); 115 coefficients[i * 2u] = values[0]; 116 coefficients[i * 2u + 1u] = values[1]; 122 #ifdef PRECOMPUTE_COVARIANCE_3D 123 fn planar_f16_decode_covariance(raw: vec4<u32>) -> array<f32, 6> { 124 let c0 = unpack2x16float(raw.x); 125 let c1 = unpack2x16float(raw.y); 126 let c2 = unpack2x16float(raw.z); 128 var cov3d: array<f32, 6>; 140 fn planar_f16_opacity(raw: vec4<u32>) -> f32 { 141 return unpack2x16float(raw.w).y; 144 fn planar_f16_decode_rotation(raw: vec4<u32>) -> vec4<f32> { 145 let q0 = unpack2x16float(raw.x); 146 let q1 = unpack2x16float(raw.y); 154 fn planar_f16_decode_scale(raw: vec4<u32>) -> vec3<f32> { 155 let s0 = unpack2x16float(raw.z); 156 let s1 = unpack2x16float(raw.w); 164 fn planar_f16_opacity(raw: vec4<u32>) -> f32 { 165 return unpack2x16float(raw.w).x; 171 ray_direction: vec3<f32>, 173 let sh = planar_f16_decode_sh(spherical_harmonics[index]); 174 return planar_color_from_sh(ray_direction, sh); 177 fn get_position(index: u32) -> vec3<f32> { 178 return planar_position(position_visibility[index]); 181 fn get_spherical_harmonics(index: u32) -> array<f32, #{SH_COEFF_COUNT}> { 182 return planar_f16_decode_sh(spherical_harmonics[index]); 185 #ifdef PRECOMPUTE_COVARIANCE_3D 186 fn get_cov3d(index: u32) -> array<f32, 6> { 187 return planar_f16_decode_covariance(covariance_3d_opacity[index]); 190 fn get_rotation(index: u32) -> vec4<f32> { 191 return planar_f16_decode_rotation(rotation_scale_opacity[index]); 194 fn get_scale(index: u32) -> vec3<f32> { 195 return planar_f16_decode_scale(rotation_scale_opacity[index]); 199 fn get_opacity(index: u32) -> f32 { 200 #ifdef PRECOMPUTE_COVARIANCE_3D 201 return planar_f16_opacity(covariance_3d_opacity[index]); 203 return planar_f16_opacity(rotation_scale_opacity[index]); 207 fn get_visibility(index: u32) -> f32 { 208 return planar_visibility(position_visibility[index]); 211 #ifdef BINARY_GAUSSIAN_OP 214 ray_direction: vec3<f32>, 216 let sh = planar_f16_decode_sh(rhs_spherical_harmonics[index]); 217 return planar_color_from_sh(ray_direction, sh); 220 fn get_rhs_position(index: u32) -> vec3<f32> { 221 return planar_position(rhs_position_visibility[index]); 224 fn get_rhs_spherical_harmonics(index: u32) -> array<f32, #{SH_COEFF_COUNT}> { 225 return planar_f16_decode_sh(rhs_spherical_harmonics[index]); 228 #ifdef PRECOMPUTE_COVARIANCE_3D 229 fn get_rhs_cov3d(index: u32) -> array<f32, 6> { 230 return planar_f16_decode_covariance(rhs_covariance_3d_opacity[index]); 233 fn get_rhs_rotation(index: u32) -> vec4<f32> { 234 return planar_f16_decode_rotation(rhs_rotation_scale_opacity[index]); 237 fn get_rhs_scale(index: u32) -> vec3<f32> { 238 return planar_f16_decode_scale(rhs_rotation_scale_opacity[index]); 242 fn get_rhs_opacity(index: u32) -> f32 { 243 #ifdef PRECOMPUTE_COVARIANCE_3D 244 return planar_f16_opacity(rhs_covariance_3d_opacity[index]); 246 return planar_f16_opacity(rhs_rotation_scale_opacity[index]); 250 fn get_rhs_visibility(index: u32) -> f32 { 251 return planar_visibility(rhs_position_visibility[index]); 254 fn set_output_position_visibility( 259 out_position_visibility[index] = vec4<f32>(position, visibility); 262 fn set_output_spherical_harmonics( 264 sh: array<f32, #{SH_COEFF_COUNT}>, 266 for (var i = 0u; i < #{HALF_SH_COEFF_COUNT}; i = i + 1u) { 268 out_spherical_harmonics[index][i] = pack2x16float(vec2<f32>( 275 #ifdef PRECOMPUTE_COVARIANCE_3D 276 fn planar_f16_encode_covariance( 281 pack2x16float(vec2<f32>(cov[1], cov[0])), 282 pack2x16float(vec2<f32>(cov[3], cov[2])), 283 pack2x16float(vec2<f32>(cov[5], cov[4])), 284 pack2x16float(vec2<f32>(0.0, opacity)), 288 fn set_output_covariance( 293 out_covariance_3d_opacity[index] = planar_f16_encode_covariance(cov, opacity); 296 fn planar_f16_encode_rotation_scale_opacity( 302 pack2x16float(vec2<f32>(rotation.y, rotation.x)), 303 pack2x16float(vec2<f32>(rotation.w, rotation.z)), 304 pack2x16float(vec2<f32>(scale.y, scale.x)), 305 pack2x16float(vec2<f32>(opacity, scale.z)), 309 fn set_output_transform( 315 out_rotation_scale_opacity[index] = planar_f16_encode_rotation_scale_opacity( 324 #else ifdef PLANAR_F32 327 ray_direction: vec3<f32>, 329 return planar_color_from_sh(ray_direction, spherical_harmonics[index]); 332 fn get_position(index: u32) -> vec3<f32> { 333 return planar_position(position_visibility[index]); 336 fn get_spherical_harmonics(index: u32) -> array<f32, #{SH_COEFF_COUNT}> { 337 return spherical_harmonics[index]; 340 fn get_rotation(index: u32) -> vec4<f32> { 341 return rotation[index]; 344 fn get_scale(index: u32) -> vec3<f32> { 345 return planar_scale_from(scale_opacity[index]); 348 fn get_opacity(index: u32) -> f32 { 349 return planar_opacity_from(scale_opacity[index]); 352 fn get_visibility(index: u32) -> f32 { 353 return planar_visibility(position_visibility[index]); 356 #ifdef BINARY_GAUSSIAN_OP 359 ray_direction: vec3<f32>, 361 return planar_color_from_sh(ray_direction, rhs_spherical_harmonics[index]); 364 fn get_rhs_position(index: u32) -> vec3<f32> { 365 return planar_position(rhs_position_visibility[index]); 368 fn get_rhs_spherical_harmonics(index: u32) -> array<f32, #{SH_COEFF_COUNT}> { 369 return rhs_spherical_harmonics[index]; 372 fn get_rhs_rotation(index: u32) -> vec4<f32> { 373 return rhs_rotation[index]; 376 fn get_rhs_scale(index: u32) -> vec3<f32> { 377 return planar_scale_from(rhs_scale_opacity[index]); 380 fn get_rhs_opacity(index: u32) -> f32 { 381 return planar_opacity_from(rhs_scale_opacity[index]); 384 fn get_rhs_visibility(index: u32) -> f32 { 385 return planar_visibility(rhs_position_visibility[index]); 388 fn set_output_position_visibility( 393 out_position_visibility[index] = vec4<f32>(position, visibility); 396 fn set_output_spherical_harmonics( 398 sh: array<f32, #{SH_COEFF_COUNT}>, 400 for (var i = 0u; i < #{SH_COEFF_COUNT}; i = i + 1u) { 401 out_spherical_harmonics[index][i] = sh[i]; 405 #ifdef PRECOMPUTE_COVARIANCE_3D 406 fn set_output_covariance( 411 out_covariance_3d_opacity[index][0] = cov[0]; 412 out_covariance_3d_opacity[index][1] = cov[1]; 413 out_covariance_3d_opacity[index][2] = cov[2]; 414 out_covariance_3d_opacity[index][3] = cov[3]; 415 out_covariance_3d_opacity[index][4] = cov[4]; 416 out_covariance_3d_opacity[index][5] = cov[5]; 417 out_covariance_3d_opacity[index][6] = 0.0; 418 out_covariance_3d_opacity[index][7] = opacity; 421 fn set_output_transform( 427 out_rotation[index] = rotation; 428 out_scale_opacity[index] = vec4<f32>(scale, opacity); 434#else ifdef GAUSSIAN_4D 435 fn planar4d_color_from_sh( 436 ray_direction: vec3<f32>, 438 sh: array<f32, #{SH_4D_COEFF_COUNT}>, 440 let color = spherindrical_harmonics_lookup(ray_direction, dir_t, sh); 441 return srgb_to_linear(color); 444 fn planar4d_isotropic_rotations(raw: array<f32, 8>) -> mat2x4<f32> { 461 fn planar4d_scale_from(scale_opacity: vec4<f32>) -> vec3<f32> { 462 return scale_opacity.xyz; 465 fn planar4d_opacity_from(scale_opacity: vec4<f32>) -> f32 { 466 return scale_opacity.w; 469 fn planar4d_timestamp_from(timestamp_timescale: vec4<f32>) -> f32 { 470 return timestamp_timescale.x; 473 fn planar4d_time_scale_from(timestamp_timescale: vec4<f32>) -> f32 { 474 return timestamp_timescale.y; 481 ray_direction: vec3<f32>, 483 return planar4d_color_from_sh(ray_direction, dir_t, spherindrical_harmonics[index]); 486 fn get_isotropic_rotations(index: u32) -> mat2x4<f32> { 487 return planar4d_isotropic_rotations(isotropic_rotations[index]); 490 fn get_scale(index: u32) -> vec3<f32> { 491 return planar4d_scale_from(scale_opacity[index]); 494 fn get_opacity(index: u32) -> f32 { 495 return planar4d_opacity_from(scale_opacity[index]); 498 fn get_position(index: u32) -> vec3<f32> { 499 return planar_position(position_visibility[index]); 502 fn get_visibility(index: u32) -> f32 { 503 return planar_visibility(position_visibility[index]); 506 fn get_spherindrical_harmonics(index: u32) -> array<f32, #{SH_4D_COEFF_COUNT}> { 507 return spherindrical_harmonics[index]; 510 fn get_timestamp(index: u32) -> f32 { 511 return planar4d_timestamp_from(timestamp_timescale[index]); 514 fn get_time_scale(index: u32) -> f32 { 515 return planar4d_time_scale_from(timestamp_timescale[index]); 518 #ifdef BINARY_GAUSSIAN_OP 522 ray_direction: vec3<f32>, 524 return planar4d_color_from_sh(ray_direction, dir_t, rhs_spherindrical_harmonics[index]); 527 fn get_rhs_isotropic_rotations(index: u32) -> mat2x4<f32> { 528 return planar4d_isotropic_rotations(rhs_isotropic_rotations[index]); 531 fn get_rhs_scale(index: u32) -> vec3<f32> { 532 return planar4d_scale_from(rhs_scale_opacity[index]); 535 fn get_rhs_opacity(index: u32) -> f32 { 536 return planar4d_opacity_from(rhs_scale_opacity[index]); 539 fn get_rhs_position(index: u32) -> vec3<f32> { 540 return planar_position(rhs_position_visibility[index]); 543 fn get_rhs_visibility(index: u32) -> f32 { 544 return planar_visibility(rhs_position_visibility[index]); 547 fn get_rhs_spherindrical_harmonics(index: u32) -> array<f32, #{SH_4D_COEFF_COUNT}> { 548 return rhs_spherindrical_harmonics[index]; 551 fn get_rhs_timestamp(index: u32) -> f32 { 552 return planar4d_timestamp_from(rhs_timestamp_timescale[index]); 555 fn get_rhs_time_scale(index: u32) -> f32 { 556 return planar4d_time_scale_from(rhs_timestamp_timescale[index]);