UNPKG

@babylonjs/viewer

Version:

The Babylon Viewer aims to simplify a specific but common Babylon.js use case: loading, viewing, and interacting with a 3D model.

3 lines (2 loc) 13 kB
import{ai as r,F as e,r as n,aH as o,B as t,aI as a,T as u}from"./index-DFZFpUG-.esm.min.js";import{syncThinInstanceGpuData as l}from"./thin-instance-gpu-bFS2p2by.esm.min.js";const i=192,s=224,f="\nstruct CullParams{planes:array<vec4<f32>,6>,meshWorld:mat4x4<f32>,localSphere:vec4<f32>,count:u32,boundsPad:f32};\n@group(0)@binding(0)var<storage,read> srcMatrices:array<mat4x4<f32>>;\n@group(0)@binding(1)var<storage,read_write> dstMatrices:array<mat4x4<f32>>;\n@group(0)@binding(2)var<storage,read_write> args:array<atomic<u32>>;\n@group(0)@binding(3)var<uniform> params:CullParams;\nfn visible(world:mat4x4<f32>)->bool{\nlet center=(world*vec4<f32>(params.localSphere.xyz,1.0)).xyz;\nlet sx=length(world[0].xyz);\nlet sy=length(world[1].xyz);\nlet sz=length(world[2].xyz);\nlet radius=params.localSphere.w*max(max(sx,sy),sz)+params.boundsPad+0.0001;\nfor(var i=0u;i<6u;i++){\nlet p=params.planes[i];\nif(dot(p.xyz,center)+p.w < -radius){return false;}\n}\nreturn true;\n}\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) gid:vec3<u32>){\nlet i=gid.x;\nif(i>=params.count){return;}\nlet world=params.meshWorld*srcMatrices[i];\nif(!visible(world)){return;}\nlet outIndex=atomicAdd(&args[1],1u);\ndstMatrices[outIndex]=srcMatrices[i];\n}",d=`${f}\n@group(0)@binding(4)var<storage,read> srcColors:array<vec4<f32>>;\n@group(0)@binding(5)var<storage,read_write> dstColors:array<vec4<f32>>;\n@compute @workgroup_size(64)\nfn mainColor(@builtin(global_invocation_id) gid:vec3<u32>){\nlet i=gid.x;\nif(i>=params.count){return;}\nlet world=params.meshWorld*srcMatrices[i];\nif(!visible(world)){return;}\nlet outIndex=atomicAdd(&args[1],1u);\ndstMatrices[outIndex]=srcMatrices[i];\ndstColors[outIndex]=srcColors[i];\n}`,c="\nstruct CullParams{planes:array<vec4<f32>,6>,meshWorld:mat4x4<f32>,localSphere:vec4<f32>,count:u32,boundsPad:f32,camPosDist:vec4<f32>,lodBand:f32};\n@group(0)@binding(0)var<storage,read> srcMatrices:array<mat4x4<f32>>;\n@group(0)@binding(1)var<storage,read_write> dstMatrices:array<mat4x4<f32>>;\n@group(0)@binding(2)var<storage,read_write> args:array<atomic<u32>>;\n@group(0)@binding(3)var<uniform> params:CullParams;\n@group(0)@binding(6)var<storage,read_write> lodMatrices:array<mat4x4<f32>>;\n@group(0)@binding(7)var<storage,read_write> lodArgs:array<atomic<u32>>;\nfn visible(world:mat4x4<f32>)->bool{\nlet center=(world*vec4<f32>(params.localSphere.xyz,1.0)).xyz;\nlet sx=length(world[0].xyz);\nlet sy=length(world[1].xyz);\nlet sz=length(world[2].xyz);\nlet radius=params.localSphere.w*max(max(sx,sy),sz)+params.boundsPad+0.0001;\nfor(var i=0u;i<6u;i++){\nlet p=params.planes[i];\nif(dot(p.xyz,center)+p.w < -radius){return false;}\n}\nreturn true;\n}\nfn isNear(world:mat4x4<f32>,i:u32)->bool{\nlet center=(world*vec4<f32>(params.localSphere.xyz,1.0)).xyz;\nvar h=i*747796405u+2891336453u;\nh=((h>>((h>>28u)+4u))^h)*277803737u;\nh=(h>>22u)^h;\nlet dither=(f32(h)*(1.0/4294967295.0)-0.5)*params.lodBand;\nreturn distance(center,params.camPosDist.xyz)<params.camPosDist.w+dither;\n}\n@compute @workgroup_size(64)\nfn mainLod(@builtin(global_invocation_id) gid:vec3<u32>){\nlet i=gid.x;\nif(i>=params.count){return;}\nlet world=params.meshWorld*srcMatrices[i];\nif(!visible(world)){return;}\nif(isNear(world,i)){\nlet outIndex=atomicAdd(&args[1],1u);\ndstMatrices[outIndex]=srcMatrices[i];\n}else{\nlet outIndex=atomicAdd(&lodArgs[1],1u);\nlodMatrices[outIndex]=srcMatrices[i];\n}\n}",_=`${c}\n@group(0)@binding(4)var<storage,read> srcColors:array<vec4<f32>>;\n@group(0)@binding(5)var<storage,read_write> dstColors:array<vec4<f32>>;\n@group(0)@binding(8)var<storage,read_write> lodColors:array<vec4<f32>>;\n@compute @workgroup_size(64)\nfn mainLodColor(@builtin(global_invocation_id) gid:vec3<u32>){\nlet i=gid.x;\nif(i>=params.count){return;}\nlet world=params.meshWorld*srcMatrices[i];\nif(!visible(world)){return;}\nif(isNear(world,i)){\nlet outIndex=atomicAdd(&args[1],1u);\ndstMatrices[outIndex]=srcMatrices[i];\ndstColors[outIndex]=srcColors[i];\n}else{\nlet outIndex=atomicAdd(&lodArgs[1],1u);\nlodMatrices[outIndex]=srcMatrices[i];\nlodColors[outIndex]=srcColors[i];\n}\n}`;let g=null,p=null,B=null,m=null,x=null,b=null;function w(r){b??=new WeakMap;let e=b.get(r);if(e)return e;const n=[];let o=0;return e={reset(){o=0},flush(r){if(0===o)return;const e=r._currentEncoder.beginComputePass();let t=null;for(let r=0;r<o;r++){const o=n[r];o.pipeline!==t&&(e.setPipeline(o.pipeline),t=o.pipeline),e.setBindGroup(0,o.bindGroup),e.dispatchWorkgroups(o.workgroupsX)}e.end()},destroy(){n.length=0,o=0,b?.delete(r)},queue(r){n[o++]=r}},b.set(r,e),e}function y(r,e,u,b,w,y,M,A,I){const z=M._camera;if(!w._gpuCullingEnabled||!z||!1===u.visible||0===w.count)return h(r,e);if(y&&!w.colors)return h(r,e);const P=u._cpuPositions;if(!e._localSphereReady||e._localPositions!==P||e._localBoundMin!==u.boundMin||e._localBoundMax!==u.boundMax){if(!function(r,e){const n=r._cpuPositions;if(!n||n.length<3)return!1;let o=1/0,t=1/0,a=1/0,u=-1/0,l=-1/0,i=-1/0;for(let r=0;r<n.length;r+=3){const e=n[r],s=n[r+1],f=n[r+2];e<o&&(o=e),e>u&&(u=e),s<t&&(t=s),s>l&&(l=s),f<a&&(a=f),f>i&&(i=f)}if(!isFinite(o))return!1;const s=.5*(o+u),f=.5*(t+l),d=.5*(a+i),c=u-s,_=l-f,g=i-d;return e[0]=s,e[1]=f,e[2]=d,e[3]=Math.hypot(c,_,g),!0}(u,e._localSphere))return h(r,e);e._localSphereReady=!0,e._localPositions=P,e._localBoundMin=u.boundMin,e._localBoundMax=u.boundMax}l(r,w,y);const S=w._gpuBuffer,E=y?w._colorGpuBuffer:null;if(!S||y&&!E)return h(r,e);const G=I??null;!function(r,e,a,u,l){const i=r._device;if(e._lodActive!==l){if(e._paramsBuffer?.destroy(),e._paramsBuffer=null,e._bindGroup=null,!l){const o=e._lodMatrixBuffer,t=e._lodColorBuffer,a=e._lodArgsBuffer;a&&!e._lodArgsZeroed&&r._currentEncoder.clearBuffer(a,4,4),(o||a)&&n(r,()=>{o?.destroy(),t?.destroy(),a?.destroy()}),e._lodMatrixBuffer=null,e._lodColorBuffer=null,e._lodArgsBuffer=null,e._lodIndexCount=-1,e._lodArgsZeroed=!1}e._lodActive=l,o()}e._capacity<a?(e._visibleMatrixBuffer?.destroy(),e._visibleColorBuffer?.destroy(),e._visibleMatrixBuffer=i.createBuffer({size:Math.max(64*a,4),usage:t.VERTEX|t.STORAGE}),e._visibleColorBuffer=u?i.createBuffer({size:Math.max(16*a,4),usage:t.VERTEX|t.STORAGE}):null,e._capacity=a,e._bindGroup=null,e._drawBuffers=null,o()):u&&!e._visibleColorBuffer&&(e._visibleColorBuffer=i.createBuffer({size:Math.max(16*e._capacity,4),usage:t.VERTEX|t.STORAGE}),e._bindGroup=null,e._drawBuffers=null,o());if(l&&(!e._lodMatrixBuffer||e._lodMatrixBuffer.size<64*e._capacity||u&&!e._lodColorBuffer)){const a=e._lodMatrixBuffer,l=e._lodColorBuffer;a&&n(r,()=>{a.destroy(),l?.destroy()}),e._lodMatrixBuffer=i.createBuffer({size:Math.max(64*e._capacity,4),usage:t.VERTEX|t.STORAGE}),e._lodColorBuffer=u?i.createBuffer({size:Math.max(16*e._capacity,4),usage:t.VERTEX|t.STORAGE}):null,e._bindGroup=null,o()}l&&!e._lodArgsBuffer&&(e._lodArgsBuffer=i.createBuffer({size:20,usage:t.INDIRECT|t.STORAGE|t.COPY_DST}),e._lodIndexCount=-1,e._lodArgsZeroed=!1);e._argsBuffer||(e._argsBuffer=i.createBuffer({size:20,usage:t.INDIRECT|t.STORAGE|t.COPY_DST}));e._paramsBuffer||(e._paramsBuffer=i.createBuffer({size:l?s:192,usage:t.UNIFORM|t.COPY_DST}))}(r,e,w._capacity,y,null!==G);const R=e._visibleMatrixBuffer,D=y?e._visibleColorBuffer:null,T=e._argsBuffer,k=e._paramsBuffer,O=function(r,e,n){const o=r._device;g!==o&&(g=o,p=null,B=null,m=null,x=null);if(n)return e?(x??=o.createComputePipeline({layout:"auto",compute:{module:o.createShaderModule({code:_}),entryPoint:"mainLodColor"}}),x):(m??=o.createComputePipeline({layout:"auto",compute:{module:o.createShaderModule({code:c}),entryPoint:"mainLod"}}),m);if(e)return B??=o.createComputePipeline({layout:"auto",compute:{module:o.createShaderModule({code:d}),entryPoint:"mainColor"}}),B;return p??=o.createComputePipeline({layout:"auto",compute:{module:o.createShaderModule({code:f}),entryPoint:"main"}}),p}(r,y,null!==G);if(null===e._bindGroup||e._srcMatrixBuffer!==S||e._srcColorBuffer!==E||e._hasColor!==y){const n=[{binding:0,resource:{buffer:S}},{binding:1,resource:{buffer:R}},{binding:2,resource:{buffer:T}},{binding:3,resource:{buffer:k}}];y&&n.push({binding:4,resource:{buffer:E}},{binding:5,resource:{buffer:D}}),G&&(n.push({binding:6,resource:{buffer:e._lodMatrixBuffer}},{binding:7,resource:{buffer:e._lodArgsBuffer}}),y&&n.push({binding:8,resource:{buffer:e._lodColorBuffer}})),e._bindGroup=r._device.createBindGroup({layout:O.getBindGroupLayout(0),entries:n}),e._srcMatrixBuffer=S,e._srcColorBuffer=E,e._hasColor=y}const W=z.viewport,X=M.targetWidth/M.targetHeight*(W?W.width/W.height:1);!function(r,e,n,o,t,u,l,f){const d=e._paramsF32,c=a(u,l);if(function(r,e){C(r,0,e[3]+e[0],e[7]+e[4],e[11]+e[8],e[15]+e[12]),C(r,4,e[3]-e[0],e[7]-e[4],e[11]-e[8],e[15]-e[12]),C(r,8,e[3]+e[1],e[7]+e[5],e[11]+e[9],e[15]+e[13]),C(r,12,e[3]-e[1],e[7]-e[5],e[11]-e[9],e[15]-e[13]),C(r,16,e[2],e[6],e[10],e[14]),C(r,20,e[3]-e[2],e[7]-e[6],e[11]-e[10],e[15]-e[14])}(d,c),d.set(n.worldMatrix,24),d.set(e._localSphere,40),e._paramsU32[44]=t,d[45]=n.thinInstances?._cullBoundsPad??0,f){const r=u.worldMatrix;d[48]=r[12],d[49]=r[13],d[50]=r[14],d[51]=n.thinInstances?._lodDistance??0,d[52]=n.thinInstances?._lodBand??0}if(e._indexCount!==o){const n=e._argsData;n[0]=o,n[1]=0,n[2]=0,n[3]=0,n[4]=0,r._device.queue.writeBuffer(e._argsBuffer,0,n.buffer,n.byteOffset,n.byteLength),e._indexCount=o}else r._currentEncoder.clearBuffer(e._argsBuffer,4,4);if(f){const n=f._gpu,o=n?n.indexCount:0;if(e._lodIndexCount!==o){const n=e._argsData;n[0]=o,n[1]=0,n[2]=0,n[3]=0,n[4]=0,r._device.queue.writeBuffer(e._lodArgsBuffer,0,n.buffer,n.byteOffset,n.byteLength),e._lodIndexCount=o}else r._currentEncoder.clearBuffer(e._lodArgsBuffer,4,4);e._lodArgsZeroed=!1}r._device.queue.writeBuffer(e._paramsBuffer,0,e._paramsBytes,0,f?s:i)}(r,e,u,b.indexCount,w.count,z,X,G);const L={pipeline:O,bindGroup:e._bindGroup,workgroupsX:Math.ceil(w.count/64)};if(A)A.queue(L);else{const n=r._currentEncoder.beginComputePass();n.setPipeline(O),n.setBindGroup(0,e._bindGroup),n.dispatchWorkgroups(L.workgroupsX),n.end()}return e._drawBuffers={matrixBuffer:R,colorBuffer:D},v(e,!0),G?{drawBuffers:e._drawBuffers,argsBuffer:T,lodDrawBuffers:{matrixBuffer:e._lodMatrixBuffer,colorBuffer:y?e._lodColorBuffer:null},lodArgsBuffer:e._lodArgsBuffer}:{drawBuffers:e._drawBuffers,argsBuffer:T}}function h(r,e){return e._lodArgsBuffer&&!e._lodArgsZeroed&&(r._currentEncoder.clearBuffer(e._lodArgsBuffer,4,4),e._lodArgsZeroed=!0),v(e,!1),e._drawBuffers=null,null}function v(r,e){r._active!==e&&(r._active=e,o())}function C(r,e,n,o,t,a){const u=1/Math.hypot(n,o,t);r[e]=n*u,r[e+1]=o*u,r[e+2]=t*u,r[e+3]=a*u}function M(n,o,t,a,l,i,s,f){const d=t.thinInstances;if(!d)return;if(d._lodSource)return i&&u(272),n._direct=!0,function(r,e,n,o){const t=()=>{const o=r._lodBuckets?.get(e);return o?.active?(n&&!o.colorBuffer&&u(273),o):null},a={get cullDrawBufs(){return t()},get _args(){return t()?.argsBuffer??null},_updateBatch:w(e),update(r){o?.(r)},draw(e,n,o){const a=t();a?e.drawIndexedIndirect(a.argsBuffer,0):r._lodSource||(r._drawArgsBuffer?e.drawIndexedIndirect(r._drawArgsBuffer,0):e.drawIndexed(n,o))}};return a}(d,f,l,s);if(i||!d._gpuCullingEnabled)return;const c=n,_=c._tiCullStates??=new WeakMap;let g=_.get(f);if(g)g._localSphereReady=!1;else{g=function(){const n=new ArrayBuffer(224);return{_capacity:0,_visibleMatrixBuffer:null,_visibleColorBuffer:null,_argsBuffer:null,_paramsBuffer:null,_bindGroup:null,_srcMatrixBuffer:null,_srcColorBuffer:null,_hasColor:!1,_localSphereReady:!1,_localSphere:new e(4),_paramsBytes:n,_paramsF32:new e(n),_paramsU32:new r(n),_argsData:new r(5),_drawBuffers:null,_indexCount:-1,_active:!1,_lodActive:!1,_lodMatrixBuffer:null,_lodColorBuffer:null,_lodArgsBuffer:null,_lodIndexCount:-1,_lodArgsZeroed:!1}}(),_.set(f,g);const n=g;o._meshDisposables.get(t)?.push(()=>{!function(r){r._visibleMatrixBuffer?.destroy(),r._visibleColorBuffer?.destroy(),r._argsBuffer?.destroy(),r._paramsBuffer?.destroy(),r._lodMatrixBuffer?.destroy(),r._lodColorBuffer?.destroy(),r._lodArgsBuffer?.destroy(),r._visibleMatrixBuffer=null,r._visibleColorBuffer=null,r._argsBuffer=null,r._paramsBuffer=null,r._lodMatrixBuffer=null,r._lodColorBuffer=null,r._lodArgsBuffer=null,r._bindGroup=null,r._drawBuffers=null}(n)})}const p=w(f),B={cullDrawBufs:null,_args:null,_updateBatch:p,update(r){s?.(r);const e=d._lodPartner??null,n=y(a,g,t,t._gpu,d,l,r,p,e);B.cullDrawBufs=n?.drawBuffers??null,B._args=n?.argsBuffer??null,d._lodBuckets&&function(r,e,n){const o=n?.lodDrawBuffers,t=n?.lodArgsBuffer,a=r._lodBuckets;if(o&&t&&a){let r=a.get(e);return r?(r.matrixBuffer=o.matrixBuffer,r.colorBuffer=o.colorBuffer,r.argsBuffer=t,void(r.active=!0)):(r={matrixBuffer:o.matrixBuffer,colorBuffer:o.colorBuffer,argsBuffer:t,active:!0},void a.set(e,r))}const u=r._lodBuckets?.get(e);u&&(u.active=!1)}(d,f,n)},draw(r,e,n){B._args?r.drawIndexedIndirect(B._args,0):d._drawArgsBuffer?r.drawIndexedIndirect(d._drawArgsBuffer,0):r.drawIndexed(e,n)}};return B}export{M as tryBind}; //# sourceMappingURL=thin-instance-cull-binding-BdukEKun.esm.min.js.map