UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

38 lines (37 loc) 1.69 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import{glsl as a}from"../../shaderModules/glsl.js";function c(c){c.code.add(a`void computeCovariance3D(in mat3 rotation, in vec3 scale, out vec3 covarianceA, out vec3 covarianceB) { mat3 scaleMatrix = mat3( vec3(scale.x, 0.0, 0.0), vec3(0.0, scale.y, 0.0), vec3(0.0, 0.0, scale.z) ); mat3 M = scaleMatrix * rotation; mat3 covariance3D = transpose(M) * M; covarianceA = vec3(covariance3D[0][0], covariance3D[0][1], covariance3D[0][2]); covarianceB = vec3(covariance3D[1][1], covariance3D[1][2], covariance3D[2][2]); } vec3 computeCovariance2D(vec3 center, float focalLength, vec2 tanFov, float[6] cov3D, mat4 view) { vec4 viewSpacePoint = vec4(center, 1); vec2 max = 1.3 * tanFov; vec2 normalized = viewSpacePoint.xy / viewSpacePoint.z; viewSpacePoint.xy = clamp(normalized, -max, max) * viewSpacePoint.z; float invZ = 1.0 / viewSpacePoint.z; float invZSquared = invZ * invZ; mat3 projectionJacobian = mat3( focalLength * invZ, 0.0, -(focalLength * viewSpacePoint.x) * invZSquared, 0.0, focalLength * invZ, -(focalLength * viewSpacePoint.y) * invZSquared, 0.0, 0.0, 0.0 ); mat3 worldToView = transpose(mat3(view)); mat3 T = worldToView * projectionJacobian; mat3 covariance3D = mat3( cov3D[0], cov3D[1], cov3D[2], cov3D[1], cov3D[3], cov3D[4], cov3D[2], cov3D[4], cov3D[5] ); mat3 covariance2D = transpose(T) * transpose(covariance3D) * T; const float regularization = 0.3; covariance2D[0][0] += regularization; covariance2D[1][1] += regularization; return vec3(covariance2D[0][0], covariance2D[0][1], covariance2D[1][1]); }`)}export{c as ComputeCovariance};