UNPKG

playcanvas

Version:

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

3 lines (2 loc) 3.37 kB
declare const _default: "\n\nuniform mat4 matrix_model;\nuniform mat4 matrix_view;\n#ifndef GSPLAT_CENTER_NOPROJ\n uniform vec4 camera_params; // 1 / far, far, near, isOrtho\n uniform mat4 matrix_projection;\n #ifdef GSPLAT_FISHEYE\n uniform float fisheye_k;\n uniform float fisheye_inv_k; // 1.0 / fisheye_k (precomputed on CPU)\n uniform float fisheye_projMat00; // projection scale X (precomputed on CPU)\n uniform float fisheye_projMat11; // projection scale Y (precomputed on CPU)\n #endif\n#endif\n\n// project the model space gaussian center to view and clip space\nbool initCenter(vec3 modelCenter, inout SplatCenter center) {\n mat4 modelView = matrix_view * matrix_model;\n vec4 centerView = modelView * vec4(modelCenter, 1.0);\n\n #ifndef GSPLAT_CENTER_NOPROJ\n\n #ifdef GSPLAT_FISHEYE\n\n // Generalized fisheye: g(\u03B8) = k\u00B7tan(\u03B8/k)\n // k=2: stereographic, k\u2192\u221E: equidistant\n vec3 v = centerView.xyz;\n float r_xy = length(v.xy);\n float neg_z = -v.z;\n float theta = atan(r_xy, neg_z);\n\n // Cull near the singularity at \u03B8 = k\u00B7\u03C0/2, and at camera origin\n float maxTheta = min(fisheye_k * 1.5707963, 3.13);\n if (theta > maxTheta - 0.01 || dot(v, v) < 0.0001) {\n return false;\n }\n\n float tk = theta * fisheye_inv_k;\n float sin_tk = sin(tk);\n float cos_tk = cos(tk);\n float g_theta = fisheye_k * sin_tk / cos_tk;\n float fisheye_s = (r_xy > 1e-4) ? g_theta / r_xy : (neg_z > 0.0 ? 1.0 / neg_z : 0.0);\n\n vec2 ndc = vec2(fisheye_projMat00 * fisheye_s * v.x, fisheye_projMat11 * fisheye_s * v.y);\n\n float near = camera_params.z;\n float far = camera_params.y;\n float linearDepth = neg_z;\n #if WEBGPU\n float depthNdc = clamp((linearDepth - near) / (far - near), 0.0, 1.0);\n #else\n float depthNdc = clamp(2.0 * (linearDepth - near) / (far - near) - 1.0, -1.0, 1.0);\n #endif\n\n center.proj = vec4(ndc, depthNdc, 1.0);\n center.projMat00 = fisheye_projMat00;\n center.fisheyeSinTK = sin_tk;\n center.fisheyeCosTK = cos_tk;\n center.fisheyeRxy = r_xy;\n\n #else\n\n // early out if splat is behind the camera (perspective only)\n // orthographic projections don't need this check as frustum culling handles it\n if (camera_params.w != 1.0 && centerView.z > 0.0) {\n return false;\n }\n\n vec4 centerProj = matrix_projection * centerView;\n\n // ensure gaussians are not clipped by camera near and far\n #if WEBGPU\n centerProj.z = clamp(centerProj.z, 0, abs(centerProj.w));\n #else\n centerProj.z = clamp(centerProj.z, -abs(centerProj.w), abs(centerProj.w));\n #endif\n\n center.proj = centerProj;\n center.projMat00 = matrix_projection[0][0];\n\n #endif\n\n #endif\n\n center.view = centerView.xyz / centerView.w;\n center.modelView = modelView;\n return true;\n}\n"; export default _default;