UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 2.86 kB
import{extends as e}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{Vec2 as t}from"../../core/math/vec2.js";import{PIXELFORMAT_RGBA32U as r,PIXELFORMAT_RGBA32F as s,FILTER_NEAREST as h,ADDRESS_CLAMP_TO_EDGE as i}from"../../platform/graphics/constants.js";import{Texture as a}from"../../platform/graphics/texture.js";import{BoundingBox as u}from"../../core/shape/bounding-box.js";import{createGSplatCompressedMaterial as n}from"./gsplat-compressed-material.js";class l{constructor(e,t){this.device=void 0,this.numSplats=void 0,this.aabb=void 0,this.centers=void 0,this.packedTexture=void 0,this.chunkTexture=void 0,this.shTexture0=void 0,this.shTexture1=void 0,this.shTexture2=void 0;const{chunkData:h,chunkSize:i,numChunks:a,numSplats:n,vertexData:l,shBands:o}=t;this.device=e,this.numSplats=n,this.aabb=new u,t.calcAabb(this.aabb),this.centers=new Float32Array(3*n),t.getCenters(this.centers),this.packedTexture=this.createTexture("packedData",r,this.evalTextureSize(n),l);const c=this.evalTextureSize(a);c.x*=5,this.chunkTexture=this.createTexture("chunkData",s,c);const x=this.chunkTexture.lock();if(((e,t,r,s,h)=>{for(let i=0;i<h;++i)for(let h=0;h<s;++h)e[i*t+h]=r[i*s+h]})(x,20,h,i,a),12===i)for(let e=0;e<a;++e)x[20*e+15]=1,x[20*e+16]=1,x[20*e+17]=1;if(this.chunkTexture.unlock(),o>0){const{shData:e}=t,s=this.evalTextureSize(n),h=this.createTexture("shTexture0",r,s),i=this.createTexture("shTexture1",r,s),a=this.createTexture("shTexture2",r,s),u=h.lock(),l=i.lock(),c=a.lock(),x=new Uint8Array(u.buffer),T=new Uint8Array(l.buffer),d=new Uint8Array(c.buffer),m=[3,8,15][o-1];for(let t=0;t<n;++t)for(let r=0;r<15;++r)x[16*t+r]=r<m?e[(3*t+0)*m+r]:127,T[16*t+r]=r<m?e[(3*t+1)*m+r]:127,d[16*t+r]=r<m?e[(3*t+2)*m+r]:127;h.unlock(),i.unlock(),a.unlock(),this.shTexture0=h,this.shTexture1=i,this.shTexture2=a}else this.shTexture0=null,this.shTexture1=null,this.shTexture2=null}destroy(){var e,t,r,s,h;null==(e=this.packedTexture)||e.destroy(),null==(t=this.chunkTexture)||t.destroy(),null==(r=this.shTexture0)||r.destroy(),null==(s=this.shTexture1)||s.destroy(),null==(h=this.shTexture2)||h.destroy()}createMaterial(t){const r=null!==this.shTexture0,s=n(e({},r?{defines:["USE_SH"]}:{},t));return s.setParameter("packedTexture",this.packedTexture),s.setParameter("chunkTexture",this.chunkTexture),s.setParameter("tex_params",new Float32Array([this.numSplats,this.packedTexture.width,this.chunkTexture.width/5,0])),r&&(s.setParameter("shTexture0",this.shTexture0),s.setParameter("shTexture1",this.shTexture1),s.setParameter("shTexture2",this.shTexture2)),s}evalTextureSize(e){const r=Math.ceil(Math.sqrt(e)),s=Math.ceil(e/r);return new t(r,s)}createTexture(t,r,s,u){return new a(this.device,e({name:t,width:s.x,height:s.y,format:r,cubemap:!1,mipmaps:!1,minFilter:h,magFilter:h,addressU:i,addressV:i},u?{levels:[u]}:{}))}}export{l as GSplatCompressed};