UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

60 lines (59 loc) 2.13 kB
var gsplatCenter_default = ` uniform matrix_model: mat4x4f; uniform matrix_view: mat4x4f; #ifndef GSPLAT_CENTER_NOPROJ uniform camera_params: vec4f; uniform matrix_projection: mat4x4f; #ifdef GSPLAT_FISHEYE uniform fisheye_k: f32; uniform fisheye_inv_k: f32; uniform fisheye_projMat00: f32; uniform fisheye_projMat11: f32; #endif #endif fn initCenter(modelCenter: vec3f, center: ptr<function, SplatCenter>) -> bool { let modelView: mat4x4f = uniform.matrix_view * uniform.matrix_model; let centerView: vec4f = modelView * vec4f(modelCenter, 1.0); #ifndef GSPLAT_CENTER_NOPROJ #ifdef GSPLAT_FISHEYE let v: vec3f = centerView.xyz; let r_xy: f32 = length(v.xy); let neg_z: f32 = -v.z; let theta: f32 = atan2(r_xy, neg_z); let maxTheta: f32 = min(uniform.fisheye_k * 1.5707963, 3.13); if (theta > maxTheta - 0.01 || dot(v, v) < 0.0001) { return false; } let tk: f32 = theta * uniform.fisheye_inv_k; let sin_tk: f32 = sin(tk); let cos_tk: f32 = cos(tk); let g_theta: f32 = uniform.fisheye_k * sin_tk / cos_tk; let fisheye_s: f32 = select(select(0.0, 1.0 / neg_z, neg_z > 0.0), g_theta / r_xy, r_xy > 1e-4); let ndc: vec2f = vec2f(uniform.fisheye_projMat00 * fisheye_s * v.x, uniform.fisheye_projMat11 * fisheye_s * v.y); let near: f32 = uniform.camera_params.z; let far: f32 = uniform.camera_params.y; let linearDepth: f32 = neg_z; let depthNdc: f32 = clamp((linearDepth - near) / (far - near), 0.0, 1.0); center.proj = vec4f(ndc, depthNdc, 1.0); center.projMat00 = uniform.fisheye_projMat00; center.fisheyeSinTK = sin_tk; center.fisheyeCosTK = cos_tk; center.fisheyeRxy = r_xy; #else if (uniform.camera_params.w != 1.0 && centerView.z > 0.0) { return false; } var centerProj: vec4f = uniform.matrix_projection * centerView; centerProj.z = clamp(centerProj.z, 0.0, abs(centerProj.w)); center.proj = centerProj; center.projMat00 = uniform.matrix_projection[0][0]; #endif #endif center.view = centerView.xyz / centerView.w; center.modelView = modelView; return true; } `; export { gsplatCenter_default as default };