x_ite
Version:
X_ITE X3D Browser and VRML Viewer — View and Manipulate X3D, VRML, glTF and Other 3D Sources in HTML
2 lines • 24.7 kB
JavaScript
/* X_ITE v15.1.12 */
const e=window[Symbol.for("X_ITE.X3D")];(()=>{const t={n:e=>{const i=e&&e.__esModule?()=>e.default:()=>e;return t.d(i,{a:i}),i},d:(e,i)=>{if(Array.isArray(i))for(var n=0;n<i.length;){var r=i[n++],o=i[n++];t.o(e,r)?0===o&&n++:0===o?Object.defineProperty(e,r,{enumerable:!0,value:i[n++]}):Object.defineProperty(e,r,{enumerable:!0,get:o})}else for(var r in i)t.o(i,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:i[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},i=e.Components;var n=t.n(i);const r=e.Fields;var o=t.n(r);const s=e.X3DFieldDefinition;var a=t.n(s);const d=e.FieldDefinitionArray;var c=t.n(d);const l=e.X3DNode;var x=t.n(l);const _=e.X3DChildNode;var u=t.n(_);const p=e.X3DBoundedObject;var h=t.n(p);const f=e.X3DConstants;var S=t.n(f);const T=e.Namespace;var v=t.n(T);function g(e){u().call(this,e),h().call(this,e),this.addType(S().X3DGaussianSplatsNode)}Object.assign(Object.setPrototypeOf(g.prototype,u().prototype),h().prototype,{initialize(){u().prototype.initialize.call(this),h().prototype.initialize.call(this)},dispose(){h().prototype.dispose.call(this),u().prototype.dispose.call(this)}}),Object.defineProperties(g,x().getStaticProperties("X3DGaussianSplatsNode","GaussianSplats",1));const y=g,m=v().add("X3DGaussianSplatsNode",y),D=e.X3DShapeNode;var C=t.n(D);const b=e.URLs;var w=t.n(b);const E=e.GeometryContext;var F=t.n(E);const A=e.GeometryType;var R=t.n(A);const O=e.AlphaMode;var I=t.n(O);const P=e.VertexArray;var N=t.n(P);const z=e.Matrix4;var X=t.n(z);const U=e.ShaderRegistry;var G=t.n(U);const M=()=>"#version 300 es\nprecision highp int;precision highp float;precision highp sampler2D;precision highp sampler2DArray;uniform ivec4 x3d_Viewport;uniform mat4 x3d_ProjectionMatrix;uniform mat4 x3d_ModelViewMatrix;\n#if defined(X3D_XR_SESSION)\nuniform mat4 x3d_EyeMatrix;\n#endif\nuniform int x3d_ViewpointType;uniform vec2 x3d_FocalLength;uniform sampler2D x3d_PositionsTexture;uniform sampler2D x3d_ScalesTexture;uniform mediump sampler2D x3d_OrientationsTexture;uniform mediump sampler2D x3d_OpacitiesTexture;\n#if!defined(X3D_POINTING_PASS)&&!defined(X3D_DEPTH_PASS)\nuniform mediump sampler2DArray x3d_SphericalHarmonicsTexture;\n#endif\nin vec4 x3d_Vertex;in uint x3d_SplatIndex;out vec4 color;out vec2 coordXY;out vec3 conic;\n#if defined(X3D_CLIP_PLANES)||defined(X3D_FOG)||defined(X3D_POINTING_PASS)\nout vec3 vertex;\n#endif\n#if defined(X3D_POINTING_PASS)\nout vec2 texCoord;\n#endif\n#include<Fog>\n#include<Logarithmic>\nconst float SPLAT_SIGMA=3.;const float SH_C0=.28209479177387814;\n#ifdef X3D_GAUSSIAN_SPLATTING_DEGREE_1\nconst float SH_C1_0=-.4886025119029199;const float SH_C1_1=.4886025119029199;const float SH_C1_2=-.4886025119029199;\n#ifdef X3D_GAUSSIAN_SPLATTING_DEGREE_2\nconst float SH_C2_0=1.0925484305920792;const float SH_C2_1=-1.0925484305920792;const float SH_C2_2=.31539156525252005;const float SH_C2_3=-1.0925484305920792;const float SH_C2_4=.5462742152960396;\n#ifdef X3D_GAUSSIAN_SPLATTING_DEGREE_3\nconst float SH_C3_0=-.5900435899266435;const float SH_C3_1=2.890611442640554;const float SH_C3_2=-.4570457994644658;const float SH_C3_3=.3731763325901154;const float SH_C3_4=-.4570457994644658;const float SH_C3_5=1.445305721320277;const float SH_C3_6=-.5900435899266435;\n#endif\n#endif\n#endif\nmat3 computeCov3D(const in vec4 rotation,const in vec3 scale){float qx=rotation.x;float qy=rotation.y;float qz=rotation.z;float qw=-rotation.w;float yy=qy*qy;float zz=qz*qz;float xy=qx*qy;float zw=qz*qw;float xz=qx*qz;float yw=qy*qw;float xx=qx*qx;float yz=qy*qz;float xw=qx*qw;mat3 R=mat3(1.-2.*(yy+zz),2.*(xy+zw),2.*(xz-yw),2.*(xy-zw),1.-2.*(zz+xx),2.*(yz+xw),2.*(xz+yw),2.*(yz-xw),1.-2.*(yy+xx));mat3 S=mat3(scale.x,0.,0.,0.,scale.y,0.,0.,0.,scale.z);mat3 M=S*R;mat3 Sigma=transpose(M)*M;return Sigma;}vec3 computeCov2D(const in vec3 viewSplatCenter,const in mat3 cov3D){mat3 J;if(x3d_ViewpointType==0){float x=viewSplatCenter.x;float y=viewSplatCenter.y;float z=viewSplatCenter.z;float zz=z*z;J=mat3(x3d_FocalLength.x/z,0.,-(x3d_FocalLength.x*x)/zz,0.,x3d_FocalLength.y/z,-(x3d_FocalLength.y*y)/zz,0.,0.,0.);}else{J=mat3(x3d_FocalLength.x,0.,0.,0.,x3d_FocalLength.y,0.,0.,0.,0.);}mat3 W=transpose(mat3(x3d_ModelViewMatrix));mat3 T=W*J;mat3 cov=transpose(T)*cov3D*T;cov[0][0]+=.3;cov[1][1]+=.3;return vec3(cov[0][0],cov[0][1],cov[1][1]);}\n#if!defined(X3D_POINTING_PASS)&&!defined(X3D_DEPTH_PASS)\nvec3 computeColorFromSH(const in ivec2 texelCoord,const in vec3 splatCenter){vec3 sh0=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,0),0).rgb;\n#ifdef X3D_GAUSSIAN_SPLATTING_DEGREE_1\nvec3 sh1_0=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,1),0).rgb;vec3 sh1_1=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,2),0).rgb;vec3 sh1_2=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,3),0).rgb;\n#ifdef X3D_GAUSSIAN_SPLATTING_DEGREE_2\nvec3 sh2_0=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,4),0).rgb;vec3 sh2_1=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,5),0).rgb;vec3 sh2_2=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,6),0).rgb;vec3 sh2_3=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,7),0).rgb;vec3 sh2_4=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,8),0).rgb;\n#ifdef X3D_GAUSSIAN_SPLATTING_DEGREE_3\nvec3 sh3_0=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,9),0).rgb;vec3 sh3_1=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,10),0).rgb;vec3 sh3_2=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,11),0).rgb;vec3 sh3_3=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,12),0).rgb;vec3 sh3_4=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,13),0).rgb;vec3 sh3_5=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,14),0).rgb;vec3 sh3_6=texelFetch(x3d_SphericalHarmonicsTexture,ivec3(texelCoord,15),0).rgb;\n#endif\n#endif\n#endif\nvec3 color=sh0*SH_C0;\n#ifdef X3D_GAUSSIAN_SPLATTING_DEGREE_1\nvec3 x3d_Camera=inverse(x3d_ModelViewMatrix)[3].xyz;vec3 viewDir=normalize(splatCenter-x3d_Camera);float x=viewDir.x;float y=viewDir.y;float z=viewDir.z;color+=SH_C1_1*(-y*sh1_0+z*sh1_1-x*sh1_2);\n#ifdef X3D_GAUSSIAN_SPLATTING_DEGREE_2\nfloat xx=x*x;float yy=y*y;float zz=z*z;float xy=x*y;float yz=y*z;float xz=x*z;color+=SH_C2_0*xy*sh2_0+SH_C2_1*yz*sh2_1+SH_C2_2*(2.*zz-xx-yy)*sh2_2+SH_C2_3*xz*sh2_3+SH_C2_4*(xx-yy)*sh2_4;\n#ifdef X3D_GAUSSIAN_SPLATTING_DEGREE_3\ncolor+=SH_C3_0*y*(3.*xx-yy)*sh3_0+SH_C3_1*xy*z*sh3_1+SH_C3_2*y*(4.*zz-xx-yy)*sh3_2+SH_C3_3*z*(2.*zz-3.*xx-3.*yy)*sh3_3+SH_C3_4*x*(4.*zz-xx-yy)*sh3_4+SH_C3_5*z*(xx-yy)*sh3_5+SH_C3_6*x*(xx-3.*yy)*sh3_6;\n#endif\n#endif\n#endif\ncolor+=.5;return color;}\n#endif\nvoid main(){uint textureWidth=uint(textureSize(x3d_PositionsTexture,0).x);ivec2 texelCoord=ivec2(x3d_SplatIndex % textureWidth,x3d_SplatIndex/textureWidth);vec3 splatCenter=texelFetch(x3d_PositionsTexture,texelCoord,0).xyz;vec4 viewSplatCenter=x3d_ModelViewMatrix*vec4(splatCenter,1.);\n#if defined(X3D_XR_SESSION)\nviewSplatCenter=x3d_EyeMatrix*viewSplatCenter;\n#endif\nvec4 clipSplatCenter=x3d_ProjectionMatrix*viewSplatCenter;clipSplatCenter/=clipSplatCenter.w;if(any(greaterThan(abs(clipSplatCenter.xyz),vec3(1.3)))){gl_Position=vec4(0.,0.,2.,1.);return;}vec4 splatOrientation=texelFetch(x3d_OrientationsTexture,texelCoord,0);vec3 splatScale=texelFetch(x3d_ScalesTexture,texelCoord,0).xyz;float opacity=texelFetch(x3d_OpacitiesTexture,texelCoord,0).r;mat3 cov3d=computeCov3D(normalize(splatOrientation),splatScale);vec3 cov2d=computeCov2D(viewSplatCenter.xyz/viewSplatCenter.w,cov3d);float a=cov2d.x;float b=cov2d.y;float c=cov2d.z;float det=a*c-b*b;if(det==0.){gl_Position=vec4(0.,0.,2.,1.);return;}conic=vec3(c,-b,a)/det;vec2 quadPixelSize=SPLAT_SIGMA*sqrt(vec2(a,c));vec2 quadNdcSize=quadPixelSize/vec2(x3d_Viewport.zw)*2.;clipSplatCenter.xy+=x3d_Vertex.xy*quadNdcSize;float minScreen=float(min(x3d_Viewport.z,x3d_Viewport.w));float maxQuadSize=max(quadPixelSize.x,quadPixelSize.y);if(maxQuadSize>minScreen){gl_Position=vec4(0.,0.,2.,1.);return;}coordXY=x3d_Vertex.xy*quadPixelSize;gl_Position=clipSplatCenter;\n#if defined(X3D_CLIP_PLANES)||defined(X3D_FOG)||defined(X3D_POINTING_PASS)\nvec4 invClipSplatCenter=inverse(x3d_ProjectionMatrix)*clipSplatCenter;vertex=invClipSplatCenter.xyz/invClipSplatCenter.w;\n#endif\n#if defined(X3D_POINTING_PASS)\ntexCoord=(x3d_Vertex.xy+1.)/2.;\n#endif\n#if defined(X3D_LOGARITHMIC_DEPTH_BUFFER)\nlogarithmic(gl_Position);\n#endif\n#if defined(X3D_POINTING_PASS)||defined(X3D_DEPTH_PASS)\ncolor=vec4(vec3(0),opacity);\n#else\ncolor=vec4(computeColorFromSH(texelCoord,splatCenter),opacity);\n#endif\n#if defined(X3D_FOG)&&defined(X3D_FOG_COORDS)\nfog();\n#endif\n}",H=v().add("GaussianSplats.vs",M),B=()=>"#version 300 es\nprecision highp int;precision highp float;precision highp sampler2D;in vec4 color;in vec2 coordXY;in vec3 conic;\n#if defined(X3D_CLIP_PLANES)||defined(X3D_FOG)||defined(X3D_POINTING_PASS)\nin vec3 vertex;\n#endif\n#if defined(X3D_POINTING_PASS)\nin vec2 texCoord;\n#endif\n#if defined(X3D_POINTING_PASS)\nuniform float x3d_Id;layout(location=0)out vec4 x3d_FragData0;layout(location=1)out vec4 x3d_FragData1;layout(location=2)out vec4 x3d_FragData2;\n#elif defined(X3D_DEPTH_PASS)\nuniform int x3d_Id;layout(location=0)out vec4 x3d_FragData0;\n#if defined(X3D_NORMAL_BUFFER)\nlayout(location=1)out vec4 x3d_FragData1;\n#endif\n#else\n#if!defined(X3D_ORDER_INDEPENDENT_TRANSPARENCY)\nout vec4 x3d_FragColor;\n#endif\n#endif\n#include<ToneMapping>\n#include<ClipPlanes>\n#include<Fog>\n#include<OIT>\n#include<Logarithmic>\nvoid main(){\n#if defined(X3D_CLIP_PLANES)\nclip();\n#endif\nfloat exponent=-.5*(conic.x*coordXY.x*coordXY.x+conic.z*coordXY.y*coordXY.y)-conic.y*coordXY.x*coordXY.y;if(exponent>0.)discard;float alpha=min(.99,exp(exponent)*color.a);if(alpha<1./255.)discard;\n#if defined(X3D_POINTING_PASS)\nx3d_FragData0=vec4(vertex,x3d_Id);x3d_FragData1=vec4(0.,0.,1.,0.);x3d_FragData2=vec4(texCoord,0.,1.);\n#elif defined(X3D_DEPTH_PASS)\n#if defined(X3D_NORMAL_BUFFER)\nx3d_FragData0=vec4(gl_FragCoord.z,vec3(x3d_Id));x3d_FragData1=vec4(0.,0.,1.,float(gl_FrontFacing));\n#else\nx3d_FragData0=vec4(vec3(gl_FragCoord.z),1.);\n#endif\n#else\nvec4 finalColor=vec4(color.rgb,alpha);\n#if defined(X3D_FOG)\nfinalColor.rgb=getFogColor(finalColor.rgb);\n#endif\nfinalColor.rgb=toneMap(finalColor.rgb);\n#if defined(X3D_ORDER_INDEPENDENT_TRANSPARENCY)\noit(finalColor);\n#else\nx3d_FragColor=finalColor;\n#endif\n#if defined(X3D_LOGARITHMIC_DEPTH_BUFFER)\nlogarithmic();\n#endif\n#endif\n}",L=v().add("GaussianSplats.fs",B);G().addVertexShader("GaussianSplats",H),G().addFragmentShader("GaussianSplats",L);const V=[1,3,5,7],q=new Float32Array([-1,-1,0,1,1,-1,0,1,1,1,0,1,-1,-1,0,1,1,1,0,1,-1,1,0,1]);function j(e,t){C().call(this,e),this.addChildObjects(S().outputOnly,"rebuild",new(o().SFTime)),this.node=t,this.shaderCache=this.getBrowser().getShaders(),this.currentModelViewMatrix=new Float32Array(16),this.sortModelViewMatrix=new Float32Array(16),this.clipPlanes=[]}Object.assign(Object.setPrototypeOf(j.prototype,C().prototype),{initialize(){C().prototype.initialize.call(this);const e=this.getBrowser(),t=e.getContext();this.geometryContext=new(F()),this.geometryBuffer=t.createBuffer(),this.splatsIndexBuffer=t.createBuffer(),this.vertexArrayObject=new(N())(t),t.bindBuffer(t.ARRAY_BUFFER,this.geometryBuffer),t.bufferData(t.ARRAY_BUFFER,q,t.DYNAMIC_DRAW),this.positionsTexture=this.createTexture(),this.orientationsTexture=this.createTexture(),this.scalesTexture=this.createTexture(),this.sphericalHarmonicsTexture=this.createTexture(t.TEXTURE_2D_ARRAY),this.opacitiesTexture=this.createTexture(),this.positionsTextureUnit=e.popTextureUnit(),this.orientationsTextureUnit=e.popTextureUnit(),this.scalesTextureUnit=e.popTextureUnit(),this.sphericalHarmonicsTextureUnit=e.popTextureUnit(),this.opacitiesTextureUnit=e.popTextureUnit(),e.resetTextureUnits(),this.node._colorSpace.addInterest("set_key__",this),this.node._positions.addInterest("requestRebuild",this),this.node._orientations.addInterest("requestRebuild",this),this.node._scales.addInterest("requestRebuild",this),this.node._opacities.addInterest("requestRebuild",this);for(const[e,t]of V.entries())for(let i=0;i<t;++i)this.node.getField(`sphericalHarmonicsDegree${e}Coef${i}`).addInterest("requestRebuild",this);this._rebuild.addInterest("rebuild",this),this.rebuild()},getShapeKey(){return this.key},getGeometryContext(){return this.geometryContext},getGeometryType:()=>R().POINT,getNumInstances(){return this.numSplats},set_key__(){let e="GS";if(e+=this.degrees,"LIN_REC709_DISPLAY"===this.node._colorSpace.getValue())e+=1;else e+=0;this.key=e},set_bbox__(){const e=this.bbox;this.isDefaultBBoxSize()?e.setArray(this.node._positions.shrinkToFit()):e.set(this._bboxSize.getValue(),this._bboxCenter.getValue()),this.getBBoxSize().assign(e.size),this.getBBoxCenter().assign(e.center)},set_geometry__(){},set_transparent__(){this.setTransparent(!0),this.setAlphaMode(I().BLEND)},createTexture(e){const t=this.getBrowser().getContext(),i=t.createTexture();return e??=t.TEXTURE_2D,t.bindTexture(e,i),t.texParameteri(e,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(e,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texParameteri(e,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(e,t.TEXTURE_MIN_FILTER,t.NEAREST),i},requestRebuild(){this._rebuild=Date.now()/1e3},rebuild(){const e=this.getBrowser().getContext(),t=this.node._positions.length;this.numSplats=t,e.bindBuffer(e.ARRAY_BUFFER,this.splatsIndexBuffer),e.bufferData(e.ARRAY_BUFFER,new Uint32Array(Array(t).keys()),e.DYNAMIC_DRAW);const i=Math.ceil(Math.sqrt(t));if(i){const n=i*i,r=new Float32Array(3*n),o=new Float32Array(4*n),s=new Float32Array(3*n),a=new Float32Array(n);r.set(this.node._positions.getValue().subarray(0,3*t)),o.set(this.node._orientations.getValue().subarray(0,4*t)),s.set(this.node._scales.getValue().subarray(0,3*t)),a.set(this.node._opacities.getValue().subarray(0,t)),this.degrees=-1;for(const[e,t]of V.entries()){if(!Array.from({length:t},(t,i)=>this.node.getField(`sphericalHarmonicsDegree${e}Coef${i}`).length).every(e=>e))break;++this.degrees}const d=(this.degrees+1)**2,c=new Float32Array(3*n*d);let l=0;for(const[e,i]of V.entries()){if(e>this.degrees)break;for(let r=0;r<i;++r){const i=this.node.getField(`sphericalHarmonicsDegree${e}Coef${r}`).getValue();c.set(i.subarray(0,3*t),l),l+=3*n}}e.bindTexture(e.TEXTURE_2D,this.positionsTexture),e.texImage2D(e.TEXTURE_2D,0,e.RGB32F,i,i,0,e.RGB,e.FLOAT,r),e.bindTexture(e.TEXTURE_2D,this.orientationsTexture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA16F,i,i,0,e.RGBA,e.FLOAT,o),e.bindTexture(e.TEXTURE_2D,this.scalesTexture),e.texImage2D(e.TEXTURE_2D,0,e.RGB32F,i,i,0,e.RGB,e.FLOAT,s),e.bindTexture(e.TEXTURE_2D,this.opacitiesTexture),e.texImage2D(e.TEXTURE_2D,0,e.R16F,i,i,0,e.RED,e.FLOAT,a),d&&(e.bindTexture(e.TEXTURE_2D_ARRAY,this.sphericalHarmonicsTexture),e.texImage3D(e.TEXTURE_2D_ARRAY,0,e.RGB16F,i,i,d,0,e.RGB,e.FLOAT,c))}this.initSortWorker(),this.set_key__(),this.set_bbox__(),this.set_objects__()},displaySimple(e,t,i){const{renderObject:n,viewport:r}=t,o=n.getProjectionMatrixArray();e.uniform4i(i.x3d_Viewport,...r),e.uniform1i(i.x3d_ViewpointType,o[15]),e.uniform2f(i.x3d_FocalLength,o[0]*r[2]*.5,o[5]*r[3]*.5),e.activeTexture(e.TEXTURE0+this.positionsTextureUnit),e.bindTexture(e.TEXTURE_2D,this.positionsTexture),e.activeTexture(e.TEXTURE0+this.orientationsTextureUnit),e.bindTexture(e.TEXTURE_2D,this.orientationsTexture),e.activeTexture(e.TEXTURE0+this.scalesTextureUnit),e.bindTexture(e.TEXTURE_2D,this.scalesTexture),e.activeTexture(e.TEXTURE0+this.opacitiesTextureUnit),e.bindTexture(e.TEXTURE_2D,this.opacitiesTexture),this.vertexArrayObject.enable(i.getProgram())&&(e.bindBuffer(e.ARRAY_BUFFER,this.splatsIndexBuffer),e.enableVertexAttribArray(i.x3d_SplatIndex),e.vertexAttribIPointer(i.x3d_SplatIndex,1,e.UNSIGNED_INT,0,0),e.vertexAttribDivisor(i.x3d_SplatIndex,1),i.enableVertexAttribute(e,this.geometryBuffer,0,0)),e.drawArraysInstanced(e.TRIANGLES,0,6,this.numSplats)},display(e,t){const i=this.getShader(t);i.enable(e),i.hasFog(null);const{renderObject:n,viewport:r,modelViewMatrix:o,localObjects:s,fogNode:a}=t,d=n.getProjectionMatrixArray();this.sortIndices(o),i.setClipPlanes(e,s,n),a?.setShaderUniforms(e,i),e.viewport(...r),e.scissor(...r),e.uniform4i(i.x3d_Viewport,...r),e.uniformMatrix4fv(i.x3d_ProjectionMatrix,!1,d),e.uniformMatrix4fv(i.x3d_EyeMatrix,!1,n.getEyeMatrixArray()),e.uniformMatrix4fv(i.x3d_ModelViewMatrix,!1,o),e.uniform1i(i.x3d_ViewpointType,d[15]),e.uniform2f(i.x3d_FocalLength,d[0]*r[2]*.5,d[5]*r[3]*.5),e.activeTexture(e.TEXTURE0+this.positionsTextureUnit),e.bindTexture(e.TEXTURE_2D,this.positionsTexture),e.activeTexture(e.TEXTURE0+this.orientationsTextureUnit),e.bindTexture(e.TEXTURE_2D,this.orientationsTexture),e.activeTexture(e.TEXTURE0+this.scalesTextureUnit),e.bindTexture(e.TEXTURE_2D,this.scalesTexture),e.activeTexture(e.TEXTURE0+this.opacitiesTextureUnit),e.bindTexture(e.TEXTURE_2D,this.opacitiesTexture),e.activeTexture(e.TEXTURE0+this.sphericalHarmonicsTextureUnit),e.bindTexture(e.TEXTURE_2D_ARRAY,this.sphericalHarmonicsTexture),this.vertexArrayObject.enable(i.getProgram())&&(e.bindBuffer(e.ARRAY_BUFFER,this.splatsIndexBuffer),e.enableVertexAttribArray(i.x3d_SplatIndex),e.vertexAttribIPointer(i.x3d_SplatIndex,1,e.UNSIGNED_INT,0,0),e.vertexAttribDivisor(i.x3d_SplatIndex,1),i.enableVertexAttribute(e,this.geometryBuffer,0,0)),e.frontFace(e.CCW),e.enable(e.CULL_FACE),e.drawArraysInstanced(e.TRIANGLES,0,6,this.numSplats)},getShader(e){const{renderObject:t,fogNode:i,localObjectsKeys:n}=e;let r="";return r+=this.key,r+=t.getRenderKey(),r+=i?.getFogType()??0,r+=n.join(""),this.shaderCache.get(r)??this.createShader(r,e)},createShader(e,t){const i=this.getBrowser(),n=i.getContext(),r=i.getDefaultMaterial().getShaderOptions(this.geometryContext,t).filter(e=>!e.startsWith("X3D_COLORSPACE_"));if("LIN_REC709_DISPLAY"===this.node._colorSpace.getValue())r.push("X3D_COLORSPACE_LINEAR");else r.push("X3D_COLORSPACE_SRGB");for(let e=0;e<=this.degrees;++e)r.push(`X3D_GAUSSIAN_SPLATTING_DEGREE_${e}`);const o=i.createShader({name:"GaussianSplats",vertexShader:"GaussianSplats",fragmentShader:"GaussianSplats",options:r,attributes:["x3d_SplatIndex"],uniforms:["x3d_PositionsTexture","x3d_OrientationsTexture","x3d_ScalesTexture","x3d_OpacitiesTexture","x3d_SphericalHarmonicsTexture","x3d_ViewpointType","x3d_FocalLength"]});return this.shaderCache.set(e,o),o.enable(n),n.uniform1i(o.x3d_PositionsTexture,this.positionsTextureUnit),n.uniform1i(o.x3d_OrientationsTexture,this.orientationsTextureUnit),n.uniform1i(o.x3d_ScalesTexture,this.scalesTextureUnit),n.uniform1i(o.x3d_OpacitiesTexture,this.opacitiesTextureUnit),n.uniform1i(o.x3d_SphericalHarmonicsTexture,this.sphericalHarmonicsTextureUnit),o},createPointingShader(e){const t=this.getBrowser(),i=t.getContext(),n=t.createShader({name:"GaussianSplatsPointing",vertexShader:"GaussianSplats",fragmentShader:"GaussianSplats",options:e,attributes:["x3d_SplatIndex"],uniforms:["x3d_PositionsTexture","x3d_OrientationsTexture","x3d_ScalesTexture","x3d_OpacitiesTexture","x3d_ViewpointType","x3d_FocalLength"]});return n.enable(i),i.uniform1i(n.x3d_PositionsTexture,this.positionsTextureUnit),i.uniform1i(n.x3d_OrientationsTexture,this.orientationsTextureUnit),i.uniform1i(n.x3d_ScalesTexture,this.scalesTextureUnit),i.uniform1i(n.x3d_OpacitiesTexture,this.opacitiesTextureUnit),n},createDepthShader(e){return this.createPointingShader(e)},initSortWorker(){if(!this.getBrowser().getBrowserOption("LoadUrlObjects"))return;this.sortWorker?.terminate();const e=`import "${w().getLibraryURL("mkkellogg-sort.worker.js")}";`,t=URL.createObjectURL(new Blob([e],{type:"text/javascript"}));this.sortWorker=new Worker(t,{type:"module"}),URL.revokeObjectURL(t);const i=this.getBrowser(),n=i.getContext();this.sortWorker.onmessage=e=>{switch(this.sortPending=!1,e.data.type){case"ready":this.sortModelViewMatrix.fill(0),i.addBrowserEvent();break;case"sorted":n.bindBuffer(n.ARRAY_BUFFER,this.splatsIndexBuffer),n.bufferData(n.ARRAY_BUFFER,e.data.indices,n.DYNAMIC_DRAW),i.addBrowserEvent();break;case"error":console.error("Sort worker error:",e.data.message)}},this.sortWorker.onerror=e=>{console.error(e),this.sortPending=!1},this.sortWorker.postMessage({type:"init",positions:this.node._positions.getValue().subarray(0,3*this.numSplats),splatCount:this.numSplats}),this.sortPending=!0},sortIndices(e){this.currentModelViewMatrix.set(e),this.sortPending||X().prototype.equals.call(this.currentModelViewMatrix,this.sortModelViewMatrix)||(this.sortModelViewMatrix.set(e),this.sortWorker?.postMessage({type:"sort",viewMatrix:this.sortModelViewMatrix}),this.sortPending=!0)}}),Object.defineProperties(j,{...x().getStaticProperties("GaussianSplatsShape","X_ITE",1,"children","2.0"),fieldDefinitions:{value:new(c())([new(a())(S().inputOutput,"metadata",new(o().SFNode)),new(a())(S().inputOutput,"pointerEvents",new(o().SFBool)(!0)),new(a())(S().inputOutput,"castShadow",new(o().SFBool)(!0)),new(a())(S().inputOutput,"visible",new(o().SFBool)(!0)),new(a())(S().inputOutput,"bboxDisplay",new(o().SFBool)),new(a())(S().initializeOnly,"bboxSize",new(o().SFVec3f)(-1,-1,-1)),new(a())(S().initializeOnly,"bboxCenter",new(o().SFVec3f)),new(a())(S().inputOutput,"appearance",new(o().SFNode)),new(a())(S().inputOutput,"geometry",new(o().SFNode))]),enumerable:!0}});const Y=j,k=v().add("GaussianSplatsShape",Y);function W(e){m.call(this,e),this.addType(S().GaussianSplats),this._positions.setUnit("length"),this.shapeNode=new k(e,this)}Object.assign(Object.setPrototypeOf(W.prototype,m.prototype),{initialize(){m.prototype.initialize.call(this),this._pointerEvents.addFieldInterest(this.shapeNode._pointerEvents),this._castShadow.addFieldInterest(this.shapeNode._castShadow),this._hidden.addFieldInterest(this.shapeNode._hidden),this._visible.addFieldInterest(this.shapeNode._visible),this._bboxDisplay.addFieldInterest(this.shapeNode._bboxDisplay),this._bboxSize.addFieldInterest(this.shapeNode._bboxSize),this._bboxCenter.addFieldInterest(this.shapeNode._bboxCenter),this.shapeNode._pointerEvents=this._pointerEvents,this.shapeNode._hidden=this._hidden,this.shapeNode._visible=this._visible,this.shapeNode._bboxDisplay=this._bboxDisplay,this.shapeNode._bboxSize=this._bboxSize,this.shapeNode._bboxCenter=this._bboxCenter,this.shapeNode.setup()},getInnerNode(){return this.shapeNode},getBBox(e,t){return this.shapeNode.getBBox(e,t)}}),Object.defineProperties(W,{...x().getStaticProperties("GaussianSplats","GaussianSplats",1,"children","4.1"),fieldDefinitions:{value:new(c())([new(a())(S().inputOutput,"metadata",new(o().SFNode)),new(a())(S().inputOutput,"colorSpace",new(o().SFString)("SRGB_REC709_DISPLAY")),new(a())(S().inputOutput,"positions",new(o().MFVec3f)),new(a())(S().inputOutput,"orientations",new(o().MFQuaternion)),new(a())(S().inputOutput,"scales",new(o().MFVec3f)),new(a())(S().inputOutput,"opacities",new(o().MFFloat)),new(a())(S().inputOutput,"sphericalHarmonicsDegree0Coef0",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree1Coef0",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree1Coef1",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree1Coef2",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree2Coef0",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree2Coef1",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree2Coef2",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree2Coef3",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree2Coef4",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree3Coef0",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree3Coef1",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree3Coef2",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree3Coef3",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree3Coef4",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree3Coef5",new(o().MFVec3f)),new(a())(S().inputOutput,"sphericalHarmonicsDegree3Coef6",new(o().MFVec3f)),new(a())(S().inputOutput,"pointerEvents",new(o().SFBool)(!0)),new(a())(S().inputOutput,"castShadow",new(o().SFBool)(!0)),new(a())(S().inputOutput,"visible",new(o().SFBool)(!0)),new(a())(S().inputOutput,"bboxDisplay",new(o().SFBool)),new(a())(S().initializeOnly,"bboxSize",new(o().SFVec3f)(-1,-1,-1)),new(a())(S().initializeOnly,"bboxCenter",new(o().SFVec3f))]),enumerable:!0}});const $=W,J=v().add("GaussianSplats",$);n().add({name:"Layout",concreteNodes:[J],abstractNodes:[m]});v().add("GaussianSplatsComponent",void 0)})();