@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) • 3.02 kB
JavaScript
import{bq as t,br as s,bo as e,bp as n}from"./index-BPURObVq.esm.min.js";import{b as i,A as a}from"./glTFLoader.pure-Bdyl6AcK.esm.min.js";import"./morphTargetManager-CdEb1BHc.esm.min.js";import"./bone.pure-BcPT5kCP.esm.min.js";import"./skeleton-DinTjF3y.esm.min.js";import"./assetContainer-CAncviZo.esm.min.js";import"./objectModelMapping-ClgDmo5Q.esm.min.js";import"./spotLight.pure-5s2DDDIt.esm.min.js";const o="KHR_gaussian_splatting",r=.28209479177387814,l=[0,3,5,7];function c(t){return t<=0?0:t>=255?255:t+.5|0}class m{constructor(t){this.name=o,this._loader=t,this.enabled=this._loader.isExtensionUsed(o)}dispose(){this._loader=null}_loadMeshPrimitiveAsync(e,n,o,m,_,u){return i.LoadExtensionAsync(e,_,this.name,async o=>{if(null!=_.mode&&0!==_.mode)throw new Error(`${o}: Gaussian splatting primitives must use POINTS mode`);const m=this._loader,p=t=>{const s=_.attributes[t];if(null==s)return null;const n=a.Get(`${e}/attributes/${t}`,m.gltf.accessors,s);return m._loadFloatAccessorAsync(`/accessors/${n.index}`,n)},g=p("POSITION");if(!g)throw new Error(`${o}: Gaussian splatting primitive is missing the POSITION attribute`);let d=0;const f=[];for(let t=1;t<=3&&null!=_.attributes[`KHR_gaussian_splatting:SH_DEGREE_${t}_COEF_0`];t++){d=t;for(let s=0;s<l[t];s++)f.push(`KHR_gaussian_splatting:SH_DEGREE_${t}_COEF_${s}`)}const b=m.babylonScene;b._blockEntityCollection=!!m._assetContainer;const h=new t(n,null,b);h._parentContainer=m._assetContainer,b._blockEntityCollection=!1,i.AddPointerMetadata(h,e),m.parent.onMeshLoadedObservable.notifyObservers(h),u(h);const E=b.getEngine().getCaps(),[O,A,C,y,R,w,...H]=await Promise.all([g,p("KHR_gaussian_splatting:ROTATION"),p("KHR_gaussian_splatting:SCALE"),p("KHR_gaussian_splatting:OPACITY"),p("KHR_gaussian_splatting:SH_DEGREE_0_COEF_0"),p("COLOR_0"),...f.map(t=>p(t))]),j=O.length/3,S=w?w.length/j:0,T=new ArrayBuffer(32*j),v=new Float32Array(T),M=new Uint8Array(T);let $=null;if(d>0){const t=3*((d+1)*(d+1)-1),e=Math.ceil(t/16),n=E.maxTextureSize,i=Math.ceil(j/n);$=s(e,i*n*4*4)}for(let t=0;t<j;t++){const s=8*t,e=32*t,n=3*t;if(v[s+0]=O[n+0],v[s+1]=O[n+1],v[s+2]=O[n+2],v[s+3]=C?C[n+0]:1,v[s+4]=C?C[n+1]:1,v[s+5]=C?C[n+2]:1,R)M[e+24]=c(255*(.5+r*R[n+0])),M[e+25]=c(255*(.5+r*R[n+1])),M[e+26]=c(255*(.5+r*R[n+2]));else if(w){const s=t*S;M[e+24]=c(255*w[s+0]),M[e+25]=c(255*w[s+1]),M[e+26]=c(255*w[s+2])}else M[e+24]=255,M[e+25]=255,M[e+26]=255;M[e+27]=y?c(255*y[t]):w&&S>=4?c(255*w[t*S+3]):255;const i=4*t,a=A?A[i+0]:0,o=A?A[i+1]:0,l=A?A[i+2]:0,m=A?A[i+3]:1;if(M[e+28]=c(127.5*m+127.5),M[e+29]=c(127.5*a+127.5),M[e+30]=c(127.5*o+127.5),M[e+31]=c(127.5*l+127.5),$){const s=16*t;for(let t=0;t<H.length;t++){const e=H[t];if(e)for(let i=0;i<3;i++){const a=3*t+i,o=15&a;$[a>>4][s+o]=c(128*e[n+i]+128)}}}}return await h.updateDataAsync(T,$??void 0,void 0,d||void 0),h})}}let _=!1;function u(){_||(_=!0,e(o),n(o,!0,t=>new m(t)))}u();export{m as KHR_gaussian_splatting,u as RegisterKHR_gaussian_splatting};
//# sourceMappingURL=KHR_gaussian_splatting-BCPWBMOJ.esm.min.js.map