@jdultra/threedtiles 13.3.0 → 13.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/threedtiles.cjs.js
CHANGED
|
@@ -28,7 +28,10 @@ Example:
|
|
|
28
28
|
* @license MIT License
|
|
29
29
|
*/class kt extends Lc{constructor(t=[],a){super(a);wt(this,"_elements",[]);wt(this,"_DEFAULT_COMPARATOR",(t,a)=>{if(typeof t=="object"||typeof a=="object")throw TypeError("When comparing object types, a custom comparator must be defined in the constructor's options parameter.");return t>a?1:t<a?-1:0});wt(this,"_comparator",this._DEFAULT_COMPARATOR);if(a){const{comparator:i}=a;i&&(this._comparator=i)}this.addMany(t)}get elements(){return this._elements}get size(){return this.elements.length}get leaf(){return this.elements[this.size-1]??void 0}static heapify(t,a){return new kt(t,a)}add(t){return this._elements.push(t),this._bubbleUp(this.elements.length-1)}addMany(t){const a=[];for(const i of t)this._toElementFn?a.push(this.add(this._toElementFn(i))):a.push(this.add(i));return a}poll(){if(this.elements.length===0)return;const t=this.elements[0],a=this.elements.pop();return this.elements.length&&(this.elements[0]=a,this._sinkDown(0,this.elements.length>>1)),t}peek(){return this.elements[0]}isEmpty(){return this.size===0}clear(){this._elements=[]}refill(t){return this._elements=t,this.fix()}has(t){return this.elements.includes(t)}delete(t){const a=this.elements.indexOf(t);return!(a<0)&&(a===0?this.poll():a===this.elements.length-1?this.elements.pop():(this.elements.splice(a,1,this.elements.pop()),this._bubbleUp(a),this._sinkDown(a,this.elements.length>>1)),!0)}dfs(t="PRE"){const a=[],i=n=>{const o=2*n+1,s=o+1;n<this.size&&(t==="IN"?(i(o),a.push(this.elements[n]),i(s)):t==="PRE"?(a.push(this.elements[n]),i(o),i(s)):t==="POST"&&(i(o),i(s),a.push(this.elements[n])))};return i(0),a}clone(){return new kt(this,{comparator:this.comparator,toElementFn:this.toElementFn})}sort(){const t=[],a=new kt(this,{comparator:this.comparator});for(;a.size!==0;){const i=a.poll();i!==void 0&&t.push(i)}return t}fix(){const t=[];for(let a=Math.floor(this.size/2);a>=0;a--)t.push(this._sinkDown(a,this.elements.length>>1));return t}filter(t,a){const i=new kt([],{toElementFn:this.toElementFn,comparator:this.comparator});let n=0;for(const o of this)t.call(a,o,n,this)&&i.add(o),n++;return i}map(t,a,i,n){const o=new kt([],{comparator:a,toElementFn:i});let s=0;for(const A of this)o.add(t.call(n,A,s,this)),s++;return o}get comparator(){return this._comparator}*_getIterator(){for(const t of this.elements)yield t}_bubbleUp(t){const a=this.elements[t];for(;t>0;){const i=t-1>>1,n=this.elements[i];if(this.comparator(n,a)<=0)break;this.elements[t]=n,t=i}return this.elements[t]=a,!0}_sinkDown(t,a){const i=this.elements[t];for(;t<a;){let n=t<<1|1;const o=n+1;let s=this.elements[n];if(o<this.elements.length&&this.comparator(s,this.elements[o])>0&&(n=o,s=this.elements[o]),this.comparator(s,i)>=0)break;this.elements[t]=s,t=n}return this.elements[t]=i,!0}}(function(r){r[r.VISIT=0]="VISIT",r[r.PROCESS=1]="PROCESS"})(Qi||(Qi={}));class ea extends kt{constructor(e=[],t){super(e,t)}clone(){return new ea(this,{comparator:this.comparator,toElementFn:this.toElementFn})}filter(e,t){const a=new ea([],{toElementFn:this.toElementFn,comparator:this.comparator});let i=0;for(const n of this)e.call(t,n,i,this)&&a.add(n),i++;return a}map(e,t,a,i){const n=new ea([],{comparator:t,toElementFn:a});let o=0;for(const s of this)n.add(e.call(i,s,o,this)),o++;return n}}class ta extends ea{constructor(e=[],t){super(e,t)}clone(){return new ta(this,{comparator:this.comparator,toElementFn:this.toElementFn})}filter(e,t){const a=new ta([],{toElementFn:this.toElementFn,comparator:this.comparator});let i=0;for(const n of this)e.call(t,n,i,this)&&a.add(n),i++;return a}map(e,t,a,i){const n=new ta([],{comparator:t,toElementFn:a});let o=0;for(const s of this)n.add(e.call(i,s,o,this)),o++;return n}}function Gc(r){return new Worker(""+(typeof document>"u"?require("url").pathToFileURL(__dirname+"/assets/PointsManager.worker-dH1fNyu8.js").href:new URL("assets/PointsManager.worker-dH1fNyu8.js",document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"&&document.currentScript.src||document.baseURI).href),{type:"module",name:r==null?void 0:r.name})}new E.Box3,new E.Vector3,new E.Vector3,new E.Vector3,new E.Vector3;const ua=new E.Vector3,_c=new E.Vector3,qn=new E.Matrix3;qn.set(1,0,0,0,0,1,0,-1,0);const Hc=new E.Matrix4().set(1,0,0,0,0,0,-1,0,0,1,0,0,0,0,0,1);function ar(r,e){return(E.DataUtils.toHalfFloat(r)|E.DataUtils.toHalfFloat(e)<<16)>>>0}class Oc extends E.Mesh{constructor(e,t,a){const n=Math.min(Math.ceil(4)*1024,Math.pow(1024,2));let o=1*Math.pow(1024,2);o=Math.floor(o/n)*n;const s=new E.WebGL3DRenderTarget(1024,1024,1,{magFilter:E.NearestFilter,minFilter:E.NearestFilter,type:E.UnsignedIntType,format:E.RGBAIntegerFormat,anisotropy:0,depthBuffer:!1,resolveDepthBuffer:!1});s.texture.type=E.UnsignedIntType,s.texture.format=E.RGBAIntegerFormat,s.texture.internalFormat="RGBA32UI",e.initRenderTarget(s);const A=new E.WebGL3DRenderTarget(1024,1024,1,{magFilter:E.NearestFilter,minFilter:E.NearestFilter,anisotropy:0,type:E.UnsignedIntType,format:E.RGBAIntegerFormat,depthBuffer:!1,resolveDepthBuffer:!1});A.texture.type=E.UnsignedIntType,A.texture.format=E.RGBAIntegerFormat,A.texture.internalFormat="RGBA32UI",e.initRenderTarget(A);const u=new E.ShaderMaterial({glslVersion:E.GLSL3,uniforms:{textureSize:{value:1024},numSlices:{value:1},covarianceTexture:{value:A.texture},positionColorTexture:{value:s.texture},zUpToYUpMatrix3x3:{value:qn},sizeMultiplier:{value:1},cropRadius:{value:Number.MAX_VALUE},cameraNear:{value:.01},cameraFar:{value:10},computeLinearDepth:{value:!0},viewportPixelSize:{value:new E.Vector2},k:{value:2},beta_k:{value:2},minSplatPixelSize:{value:0},minOpacity:{value:.01},culling:{value:!0},antialiasingFactor:{value:2}},vertexShader:Jn(),fragmentShader:a||Kn(),transparent:!0,side:E.FrontSide,depthTest:!1,depthWrite:!1}),c=new E.InstancedBufferGeometry,d=new Float32Array([-.5,.5,0,.5,.5,0,-.5,-.5,0,.5,-.5,0]);c.setIndex([0,2,1,2,3,1]),c.setAttribute("position",new E.BufferAttribute(d,3));const b=new Uint32Array(o),h=new E.InstancedBufferAttribute(b,1,!1);h.needsUpdate=!0,h.setUsage(E.DynamicDrawUsage),c.setAttribute("order",h),c.instanceCount=0,super(c,u),this.matrixAutoUpdate=!1,this.numBatches=0,this.numVisibleBatches=0,this.orderAttribute=h,this.textureSize=1024,this.numTextures=1,this.batchSize=n,this.maxSplats=o,this.numSplatsRendered=0,this.positionColorRenderTarget=s,this.covarianceRenderTarget=A,this.renderer=e,this.sortID=0,this.freeAddresses=new ta;for(let g=0;g<this.maxSplats;g+=n)this.freeAddresses.add(g);this.worker=new Gc({}),this.sortListeners=[],this.worker.onmessage=g=>{const f=new Uint32Array(g.data.order);if(this.numSplatsRendered=f.length,f.length>this.orderAttribute.count){const m=new E.InstancedBufferGeometry,p=new Float32Array([-.5,.5,0,.5,.5,0,-.5,-.5,0,.5,-.5,0]),C=[0,2,1,2,3,1];m.setIndex(C),m.setAttribute("position",new E.BufferAttribute(p,3));const I=new Uint32Array(this.maxSplats),x=new E.InstancedBufferAttribute(I,1,!1);x.needsUpdate=!0,x.setUsage(E.DynamicDrawUsage),m.setAttribute("order",x),m.instanceCount=0,this.geometry.dispose(),this.geometry=m,this.orderAttribute=x}this.orderAttribute.clearUpdateRanges(),this.orderAttribute.set(f),this.orderAttribute.addUpdateRange(0,f.length),this.orderAttribute.needsUpdate=!0,this.geometry.instanceCount=g.data.count,this.geometry.needsUpdate=!0;for(let m=this.sortListeners.length-1;m>=0;m--)this.sortListeners[m](g.data.id)&&this.sortListeners.splice(m,1)},this.cameraPosition=new E.Vector3(0,0,0),this.viewProjModel,this.rotateOnAxis(new E.Vector3(1,0,0),.5*Math.PI),this.frustumCulled=!1,this.copyMaterial2D=new E.ShaderMaterial({glslVersion:E.GLSL3,uniforms:{sourceTexture:{}},vertexShader:Ni(),fragmentShader:`
|
|
30
30
|
precision highp float;
|
|
31
|
-
|
|
31
|
+
precision highp int;
|
|
32
|
+
precision highp usampler3D;
|
|
33
|
+
|
|
34
|
+
layout(location = 0) out highp uvec4 fragColor;
|
|
32
35
|
uniform highp usampler2D sourceTexture;
|
|
33
36
|
|
|
34
37
|
in vec2 vUv;
|
|
@@ -37,7 +40,10 @@ void main() {
|
|
|
37
40
|
fragColor = texture( sourceTexture, vUv );
|
|
38
41
|
}`,transparent:!1,side:E.FrontSide,depthTest:!1,depthWrite:!1}),this.copyMaterial3D=new E.ShaderMaterial({glslVersion:E.GLSL3,uniforms:{sourceTexture:{},w:{value:0}},vertexShader:Ni(),fragmentShader:`
|
|
39
42
|
precision highp float;
|
|
40
|
-
|
|
43
|
+
precision highp int;
|
|
44
|
+
precision highp usampler3D;
|
|
45
|
+
|
|
46
|
+
layout(location = 0) out highp uvec4 fragColor;
|
|
41
47
|
uniform highp usampler3D sourceTexture;
|
|
42
48
|
uniform float w;
|
|
43
49
|
|
|
@@ -48,6 +54,7 @@ void main() {
|
|
|
48
54
|
}`,transparent:!1,side:E.FrontSide,depthTest:!1,depthWrite:!1}),this.copyCamera=new E.OrthographicCamera(-.5,.5,.5,-.5,.1,10),this.copyCamera.position.z=1,this.copyScene=new E.Scene;const l=new E.PlaneGeometry(1,1);this.copyQuad=new E.Mesh(l,this.copyMaterial2D),this.copyScene.add(this.copyQuad),this.copyScene.matrixAutoUpdate=!1,this.copyQuad.matrixAutoUpdate=!1}setQuality(e){const t=2+2*(e=Math.max(0,Math.min(1,1-e)));this.material.uniforms.k.value=t,this.material.uniforms.beta_k.value=Math.pow(4*Uc(2/t)/t,t/2),this.material.uniforms.minSplatPixelSize.value=5*e,this.material.uniforms.minOpacity.value=.01}setSplatsCPUCulling(e){this.splatsCPUCuling=e,this.material.uniforms.culling.value=!e}updateShaderParams(e){e.projectionMatrix.elements,this.renderer.getSize(this.material.uniforms.viewportPixelSize.value);const t=this.renderer.getPixelRatio();this.material.uniforms.viewportPixelSize.value.multiplyScalar(t),this.material.uniforms.antialiasingFactor.value=2}dispose(){this.material.dispose(),this.copyMaterial2D.dispose(),this.copyMaterial3D.dispose(),this.covarianceRenderTarget.dispose(),this.positionColorRenderTarget.dispose(),this.worker.terminate(),this.worker=null,this.orderAttribute.array=void 0,this.geometry.dispose()}copyTex2D(e,t,a,i){this.copyMaterial2D.uniforms.sourceTexture.value=e;const n=this.renderer.autoClear,o=this.renderer.getRenderTarget();this.renderer.autoClear=!1;const s=a[2]-a[0],A=a[3]-a[1];t.viewport.set(a[0],a[1],s,A),this.renderer.setRenderTarget(t,i),this.renderer.render(this.copyScene,this.copyCamera),this.renderer.setRenderTarget(o),this.renderer.autoClear=n}copyTex3D(e,t,a){this.copyMaterial3D.uniforms.sourceTexture.value=e;const i=this.renderer.autoClear,n=this.renderer.getRenderTarget();this.renderer.autoClear=!1,this.copyQuad.material=this.copyMaterial3D;for(let o=0;o<a;o++)this.renderer.setRenderTarget(t,o),this.copyMaterial3D.uniforms.w.value=(o+.5)/a,this.renderer.render(this.copyScene,this.copyCamera);this.copyQuad.material=this.copyMaterial2D,this.renderer.setRenderTarget(n),this.renderer.autoClear=i}setSplatsSizeMultiplier(e){this.material.uniforms.sizeMultiplier.value=e}setSplatsCropRadius(e){this.material.uniforms.cropRadius.value=e}sort(e,t){this.worker&&(e?this.cameraPosition&&e.equals(this.cameraPosition)||(this.cameraPosition.copy(e),t?(this.viewProjModel||(this.viewProjModel=new E.Matrix4),this.viewProjModel.copy(t),this.viewProjModel.multiply(Hc)):this.viewProjModel=void 0,this.worker.postMessage({method:"sort",xyz:[this.cameraPosition.x,this.cameraPosition.z,-this.cameraPosition.y],vpm:this.viewProjModel&&this.splatsCPUCuling?this.viewProjModel.toArray():void 0,id:this.sortID++})):this.worker.postMessage({method:"sort",xyz:[this.cameraPosition.x,this.cameraPosition.z,-this.cameraPosition.y],vpm:this.viewProjModel&&this.splatsCPUCuling?this.viewProjModel.toArray():void 0,id:this.sortID++}))}raycast(e,t){}addSplatsTile(e,t,a,i){if(!this.worker)return;const n=this,o=e.data?e.data.array:e.array,s=e.data&&e.data.isInterleavedBuffer?e.data.stride:3,A=e.data&&e.data.isInterleavedBuffer?e.offset:0,u=Math.ceil(o.length/(this.batchSize*s)),c=[],d=[];let b=()=>{};const h=new Float32Array(o.length/s*3),l=new Uint32Array(h.buffer,h.byteOffset,h.length);for(let f=0;f<o.length/3;f++)h[3*f]=o[f*s+A],h[3*f+1]=o[f*s+A+1],h[3*f+2]=o[f*s+A+2];b=(f,m,p)=>{const C=p*p;for(let I=0;I<h.length;I+=3){ua.set(h[I],-h[I+2],h[I+1]);const x=_c.copy(ua).sub(f.origin).dot(f.direction);x>0&&f.distanceSqToPoint(ua)<C&&m.push({distance:x,point:ua.clone(),type:"splat"})}},u>this.freeAddresses.size&&this.growTextures();for(let f=0;f<u;f++){const m=this.freeAddresses.poll();isNaN(m)&&console.log("insuficient texture size to store splats info"),c.push(m),d.push(3*m);const p=f*this.batchSize;this.addSplatsBatch(p,m,l,t,a,i)}n.worker.postMessage({method:"addBatches",insertionIndexes:d,positions:o.buffer,offset:A,stride:s,batchSize:n.batchSize},[o.buffer]);let g=!1;return{hide:()=>{g==1&&n.worker&&(n.numVisibleBatches--,g=!1,n.worker.postMessage({method:"hideBatches",insertionIndexes:d,xyz:[n.cameraPosition.x,n.cameraPosition.z,-n.cameraPosition.y],vpm:this.viewProjModel&&this.splatsCPUCuling?this.viewProjModel.toArray():void 0,id:n.sortID++}))},show:f=>{if(g==0&&n.worker){n.numVisibleBatches--,g=!0;const m=n.sortID,p=C=>C>=m&&(f(),!0);n.sortListeners.push(p),n.worker.postMessage({method:"showBatches",insertionIndexes:d,xyz:[n.cameraPosition.x,n.cameraPosition.z,-n.cameraPosition.y],vpm:this.viewProjModel&&this.splatsCPUCuling?this.viewProjModel.toArray():void 0,id:n.sortID++})}},remove:()=>{n.worker&&(b=void 0,n.worker.postMessage({method:"removeBatches",insertionIndexes:d,xyz:[n.cameraPosition.x,n.cameraPosition.z,-n.cameraPosition.y],vpm:this.viewProjModel&&this.splatsCPUCuling?this.viewProjModel.toArray():void 0,id:n.sortID++}),c.forEach(f=>n.freeAddresses.add(f)))},sort:this.sort,raycast:b,isSplatsBatch:!0}}addSplatsBatch(e,t,a,i,n,o){const s=new Uint32Array(4*this.batchSize),A=new Uint32Array(4*this.batchSize);for(let l=t;l<t+this.batchSize;l++){const g=l-t,f=4*g,m=e+g,p=3*(e+g);if(m>=a.count)break;s[f]=a[p],s[f+1]=a[p+1],s[f+2]=a[p+2];const C=0|Math.floor(255*i.getX(m)+.5),I=0|Math.floor(255*i.getY(m)+.5),x=0|Math.floor(255*i.getZ(m)+.5),y=0|Math.floor(255*i.getW(m)+.5);s[f+3]=C|I<<8|x<<16|y<<24,A[f]=ar(n.getX(m),n.getY(m)),A[f+1]=ar(n.getZ(m),o.getX(m)),A[f+2]=ar(o.getY(m),o.getZ(m))}const u=Math.floor(t/Math.pow(this.textureSize,2)),c=Math.ceil(this.batchSize/this.textureSize),d=[0,t/this.textureSize-u*this.textureSize,this.textureSize];d.push(d[1]+c);const b=new E.DataTexture(s,this.textureSize,c,E.RGBAIntegerFormat,E.UnsignedIntType);b.internalFormat="RGBA32UI",b.generateMipmaps=!1,b.magFilter=E.NearestFilter,b.minFilter=E.NearestFilter,b.anisotropy=0,b.needsUpdate=!0,this.renderer.initTexture(b),this.copyTex2D(b,this.positionColorRenderTarget,d,u),b.dispose();const h=new E.DataTexture(A,this.textureSize,c,E.RGBAIntegerFormat,E.UnsignedIntType);h.internalFormat="RGBA32UI",h.generateMipmaps=!1,h.magFilter=E.NearestFilter,h.minFilter=E.NearestFilter,h.anisotropy=0,h.needsUpdate=!0,this.renderer.initTexture(h),this.copyTex2D(h,this.covarianceRenderTarget,d,u),h.dispose()}growTextures(){for(let i=this.maxSplats;i<this.maxSplats+this.textureSize*this.textureSize;i+=this.batchSize)this.freeAddresses.add(i);this.maxSplats+=this.textureSize*this.textureSize;const e=this.numTextures+1,t=new E.WebGL3DRenderTarget(this.textureSize,this.textureSize,e,{magFilter:E.NearestFilter,minFilter:E.NearestFilter,type:E.UnsignedIntType,format:E.RGBAIntegerFormat,anisotropy:0,depthBuffer:!1,resolveDepthBuffer:!1});t.texture.type=E.UnsignedIntType,t.texture.internalFormat="RGBA32UI",t.texture.format=E.RGBAIntegerFormat,this.renderer.initRenderTarget(t),this.copyTex3D(this.positionColorRenderTarget.texture,t,this.numTextures),this.positionColorRenderTarget.dispose(),this.positionColorRenderTarget=t,this.material.uniforms.positionColorTexture.value=this.positionColorRenderTarget.texture;const a=new E.WebGL3DRenderTarget(this.textureSize,this.textureSize,e,{magFilter:E.NearestFilter,minFilter:E.NearestFilter,anisotropy:0,type:E.UnsignedIntType,format:E.RGBAIntegerFormat,depthBuffer:!1,resolveDepthBuffer:!1});a.texture.type=E.UnsignedIntType,a.texture.internalFormat="RGBA32UI",a.texture.format=E.RGBAIntegerFormat,this.renderer.initRenderTarget(a),this.copyTex3D(this.covarianceRenderTarget.texture,a,this.numTextures),this.covarianceRenderTarget.dispose(),this.covarianceRenderTarget=a,this.material.uniforms.covarianceTexture.value=this.covarianceRenderTarget.texture,this.numTextures=e,this.material.uniforms.numSlices.value=this.numTextures}}function Jn(){return`
|
|
49
55
|
precision highp float;
|
|
50
56
|
precision highp int;
|
|
57
|
+
precision highp usampler3D;
|
|
51
58
|
|
|
52
59
|
#include <common>
|
|
53
60
|
#include <packing>
|
|
@@ -55,7 +62,7 @@ precision highp int;
|
|
|
55
62
|
uniform float textureSize;
|
|
56
63
|
uniform float numSlices;
|
|
57
64
|
uniform float sizeMultiplier;
|
|
58
|
-
in uint order;
|
|
65
|
+
in highp uint order;
|
|
59
66
|
out vec4 color;
|
|
60
67
|
out vec2 vUv;
|
|
61
68
|
out vec3 splatPositionWorld;
|
|
@@ -108,7 +115,7 @@ void getVertexData(out vec3 position, out mat3 covariance) {
|
|
|
108
115
|
int( sliceIndex + 0.5 ) ); // z slice
|
|
109
116
|
|
|
110
117
|
// Position
|
|
111
|
-
uvec4 positionColor = texelFetch(positionColorTexture, coord,0);
|
|
118
|
+
highp uvec4 positionColor = texelFetch(positionColorTexture, coord,0);
|
|
112
119
|
position = vec3(uintBitsToFloat(positionColor.r),uintBitsToFloat(positionColor.g),uintBitsToFloat(positionColor.b));
|
|
113
120
|
|
|
114
121
|
color = vec4( (positionColor.a & 255u),
|
|
@@ -117,7 +124,7 @@ void getVertexData(out vec3 position, out mat3 covariance) {
|
|
|
117
124
|
(positionColor.a >> 24) ) / 255.0;
|
|
118
125
|
|
|
119
126
|
|
|
120
|
-
uvec4 cov = texelFetch(covarianceTexture, coord, 0);
|
|
127
|
+
highp uvec4 cov = texelFetch(covarianceTexture, coord, 0);
|
|
121
128
|
vec2 c0 = unpackHalf2x16(cov.r);
|
|
122
129
|
vec2 c1 = unpackHalf2x16(cov.g);
|
|
123
130
|
vec2 c2 = unpackHalf2x16(cov.b);
|
|
@@ -255,6 +262,7 @@ void main() {
|
|
|
255
262
|
`}function Kn(){return`
|
|
256
263
|
precision highp float;
|
|
257
264
|
precision highp int;
|
|
265
|
+
precision highp usampler3D;
|
|
258
266
|
|
|
259
267
|
in float stds;
|
|
260
268
|
in vec4 color;
|
|
@@ -273,10 +281,6 @@ uniform float beta_k; // pow((4.0 * gamma(2.0/k)) /k, k/2)
|
|
|
273
281
|
void main() {
|
|
274
282
|
float l = dot(vUv, vUv);
|
|
275
283
|
if (l > 0.25) discard; // early out unchanged
|
|
276
|
-
/* if (l > 0.245){
|
|
277
|
-
fragColor = vec4(pow(color.xyz, vec3(1.0/2.2)), 0.8);
|
|
278
|
-
return;
|
|
279
|
-
} */
|
|
280
284
|
vec2 p = vUv * stds;
|
|
281
285
|
float r2 = dot(p, p); // r²
|
|
282
286
|
float rk = pow(r2, 0.5 * k); // r^{k}
|
|
@@ -288,6 +292,10 @@ void main() {
|
|
|
288
292
|
|
|
289
293
|
}`}function Ni(){return`
|
|
290
294
|
|
|
295
|
+
precision highp float;
|
|
296
|
+
precision highp int;
|
|
297
|
+
precision highp usampler3D;
|
|
298
|
+
|
|
291
299
|
out vec2 vUv;
|
|
292
300
|
|
|
293
301
|
void main() {
|