UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

4 lines (2 loc) 1.62 kB
var gsplatCornerVS = "\nuniform vec2 viewport;\nuniform vec4 camera_params;\nbool initCorner(SplatSource source, SplatCenter center, out SplatCorner corner) {\n vec3 covA, covB;\n readCovariance(source, covA, covB);\n mat3 Vrk = mat3(\n covA.x, covA.y, covA.z, \n covA.y, covB.x, covB.y,\n covA.z, covB.y, covB.z\n );\n float focal = viewport.x * center.projMat00;\n vec3 v = camera_params.w == 1.0 ? vec3(0.0, 0.0, 1.0) : center.view.xyz;\n float J1 = focal / v.z;\n vec2 J2 = -J1 / v.z * v.xy;\n mat3 J = mat3(\n J1, 0.0, J2.x, \n 0.0, J1, J2.y, \n 0.0, 0.0, 0.0\n );\n mat3 W = transpose(mat3(center.modelView));\n mat3 T = W * J;\n mat3 cov = transpose(T) * Vrk * T;\n float diagonal1 = cov[0][0] + 0.3;\n float offDiagonal = cov[0][1];\n float diagonal2 = cov[1][1] + 0.3;\n float mid = 0.5 * (diagonal1 + diagonal2);\n float radius = length(vec2((diagonal1 - diagonal2) / 2.0, offDiagonal));\n float lambda1 = mid + radius;\n float lambda2 = max(mid - radius, 0.1);\n float l1 = 2.0 * min(sqrt(2.0 * lambda1), 1024.0);\n float l2 = 2.0 * min(sqrt(2.0 * lambda2), 1024.0);\n if (l1 < 2.0 && l2 < 2.0) {\n return false;\n }\n if (any(greaterThan(abs(center.proj.xy) - vec2(l1, l2) / viewport * center.proj.w, center.proj.ww))) {\n return false;\n }\n vec2 diagonalVector = normalize(vec2(offDiagonal, lambda1 - diagonal1));\n vec2 v1 = l1 * diagonalVector;\n vec2 v2 = l2 * vec2(diagonalVector.y, -diagonalVector.x);\n corner.offset = (source.cornerUV.x * v1 + source.cornerUV.y * v2) / viewport * center.proj.w;\n corner.uv = source.cornerUV;\n return true;\n}\n"; export { gsplatCornerVS as default };