@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 2.8 kB
JavaScript
import{math as e}from"../../core/math/math.js";import{UNIFORMTYPE_MAT4 as t,UNIFORMTYPE_MAT4ARRAY as s,UNIFORMTYPE_BVEC4 as a,UNIFORMTYPE_BVEC4ARRAY as i,UNIFORMTYPE_UVEC4 as p,UNIFORMTYPE_UVEC4ARRAY as h,UNIFORMTYPE_IVEC4 as o,UNIFORMTYPE_IVEC4ARRAY as r,UNIFORMTYPE_VEC4 as c,UNIFORMTYPE_VEC4ARRAY as n,UNIFORMTYPE_BVEC3 as u,UNIFORMTYPE_BVEC3ARRAY as d,UNIFORMTYPE_UVEC3 as y,UNIFORMTYPE_UVEC3ARRAY as b,UNIFORMTYPE_IVEC3 as m,UNIFORMTYPE_IVEC3ARRAY as T,UNIFORMTYPE_VEC3 as f,UNIFORMTYPE_VEC3ARRAY as k,UNIFORMTYPE_BVEC2 as l,UNIFORMTYPE_BVEC2ARRAY as S,UNIFORMTYPE_UVEC2 as $,UNIFORMTYPE_UVEC2ARRAY as v,UNIFORMTYPE_IVEC2 as z,UNIFORMTYPE_IVEC2ARRAY as g,UNIFORMTYPE_VEC2 as C,UNIFORMTYPE_VEC2ARRAY as U,UNIFORMTYPE_BOOL as j,UNIFORMTYPE_BOOLARRAY as w,UNIFORMTYPE_UINT as I,UNIFORMTYPE_UINTARRAY as N,UNIFORMTYPE_INT as O,UNIFORMTYPE_INTARRAY as x,UNIFORMTYPE_FLOAT as A,UNIFORMTYPE_FLOATARRAY as D,bindGroupNames as E,uniformTypeToName as M,UNIFORMTYPE_MAT2 as _,UNIFORMTYPE_MAT3 as q}from"./constants.js";const B=[];B[A]=1,B[C]=2,B[f]=3,B[c]=4,B[O]=1,B[z]=2,B[m]=3,B[o]=4,B[j]=1,B[l]=2,B[u]=3,B[a]=4,B[_]=8,B[q]=12,B[t]=16,B[I]=1,B[$]=2,B[y]=3,B[p]=4;class F{get isArrayType(){return this.count>0}constructor(E,M,_=0){if(this.name=void 0,this.type=void 0,this.byteSize=void 0,this.offset=void 0,this.scopeId=void 0,this.count=void 0,this.numComponents=void 0,this.shortName=E,this.name=_?`${E}[0]`:E,this.type=M,this.numComponents=B[M],this.updateType=M,_>0)switch(M){case A:this.updateType=D;break;case O:this.updateType=x;break;case I:this.updateType=N;break;case j:this.updateType=w;break;case C:this.updateType=U;break;case z:this.updateType=g;break;case $:this.updateType=v;break;case l:this.updateType=S;break;case f:this.updateType=k;break;case m:this.updateType=T;break;case y:this.updateType=b;break;case u:this.updateType=d;break;case c:this.updateType=n;break;case o:this.updateType=r;break;case p:this.updateType=h;break;case a:this.updateType=i;break;case t:this.updateType=s}this.count=_;let q=this.numComponents;_&&(q=e.roundUp(q,4)),this.byteSize=4*q,_&&(this.byteSize*=_)}calculateOffset(t){let s=this.byteSize<=8?this.byteSize:16;this.count&&(s=16),t=e.roundUp(t,s),this.offset=t/4}}class G{constructor(t,s){this.byteSize=0,this.map=new Map,this.scope=t.scope,this.uniforms=s;let a=0;for(let e=0;e<s.length;e++){const t=s[e];t.calculateOffset(a),a=4*t.offset+t.byteSize,t.scopeId=this.scope.resolve(t.name),this.map.set(t.name,t)}this.byteSize=e.roundUp(a,16)}get(e){return this.map.get(e)}getShaderDeclaration(e,t){let s=`layout(set = ${e}, binding = ${t}, std140) uniform ub_${E[e]} {\n`;return this.uniforms.forEach((e=>{const t=M[e.type];s+=` ${t} ${e.shortName}${e.count?`[${e.count}]`:""};\n`})),`${s}};\n`}}export{G as UniformBufferFormat,F as UniformFormat};