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) 25.9 kB
import{l as e,m as t,n,P as a,o as r,p as o,q as s,s as i,u as l,v as c,w as p,x as m,y as f,z as _,A as u,C as d,D as g,E as h,G as v,H as b,J as x,K as y,N as w,O as S,Q as B,R as $,V as F,W as T,X as A,Y as M,Z as L,$ as N,a0 as G,a1 as C,a2 as I,a3 as V,a4 as j,a5 as U,a6 as P,a7 as O,a8 as k,F as E,a9 as z,e as W,aa as H,ab as D,ac as R,ad as q,ae as K,af as X}from"./index-DFZFpUG-.esm.min.js";import{S as Y}from"./scene-uniforms-Cr9D1h23.esm.min.js";const Z={f32:{align:4,size:4},u32:{align:4,size:4},i32:{align:4,size:4},"vec2<f32>":{align:8,size:8},"vec3<f32>":{align:16,size:12},"vec4<f32>":{align:16,size:16},"vec4<u32>":{align:16,size:16},"mat4x4<f32>":{align:16,size:64}};function J(e,t){return e+t-1&~(t-1)}function Q(e){const t=Z[e];if(t)return t;const n=/^array<vec4<u32>,\s*(\d+)>$/.exec(e);if(n)return{align:16,size:16*Number(n[1])};throw new Error(`Unknown UBO field type: ${e}`)}function ee(e){const t=new Map,n=[];let a=0;for(const r of e){const e=Q(r._type);a=J(a,e.align),t.set(r._name,a),n.push(`${r._name}: ${r._type},`),a+=e.size}return{_totalBytes:e.length>0?J(a,16):0,_offsets:t,_structBody:n.join("\n")}}function te(e,t){const n=new Set,a=[];for(const t of e)n.has(t._name)||(n.add(t._name),a.push(t));for(const e of t)n.has(e._name)||(n.add(e._name),a.push(e));return a}const ne=/\/\*([A-Z_0-9]+)\*\//g;function ae(e,t,n){return e.replace(ne,(e,a)=>{const r=[];for(const e of t){const t=e[n];t?.[a]&&r.push(t[a])}return r.join("\n")})}function re(e,t){const n=function(e){const t=new Map;for(const n of e){if(t.has(n._id))throw Error();t.set(n._id,n)}const n=new Map,a=new Map;for(const r of e){n.has(r._id)||n.set(r._id,0);for(const e of r._dependencies??[]){if(!t.has(e))throw Error();n.set(r._id,(n.get(r._id)??0)+1);let o=a.get(e);o||(o=[],a.set(e,o)),o.push(r._id)}}const r=[];for(const[e,t]of n)0===t&&r.push(e);r.sort();const o=[];let s=0;for(;s<r.length;){const e=r[s++];o.push(t.get(e));for(const t of a.get(e)??[]){const e=(n.get(t)??1)-1;if(n.set(t,e),0===e){let e=s;for(;e<r.length&&r[e]<t;)e++;r.splice(e,0,t)}}}if(o.length!==e.length)throw Error();return o}(t),a=[],r=[],o=[],s=[],i=[];for(const e of n){e._vertexAttributes&&a.push(...e._vertexAttributes),e._varyings&&r.push(...e._varyings),e._helperFunctions&&o.push(e._helperFunctions),e._vertexHelperFunctions&&s.push(e._vertexHelperFunctions);for(const t of e._vertexBuiltins??[])i.push(`@builtin(${t._builtin}) ${t._name}:${t._type},`)}const l=te(e._baseVertexAttributes,a),c=[],p=[],m=new Map,f=new Map;for(let e=0;e<l.length;e++){const t=l[e];c.push(`@location(${e}) ${t._name}:${t._type},`),t._bufferGroup?(m.has(t._bufferGroup)||(m.set(t._bufferGroup,[]),f.set(t._bufferGroup,t)),m.get(t._bufferGroup).push({loc:e,off:t._offset??0,fmt:t._gpuFormat})):p.push({arrayStride:t._arrayStride,stepMode:t._stepMode??"vertex",attributes:[{shaderLocation:e,offset:t._offset??0,format:t._gpuFormat}]})}for(const[e,t]of m){const n=f.get(e);p.push({arrayStride:n._arrayStride,stepMode:n._stepMode??"vertex",attributes:t.map(e=>({shaderLocation:e.loc,offset:e.off,format:e.fmt}))})}let _=l.length;for(const e of n)if(e._pipelineVertexBuffers){const t=e._pipelineVertexBuffers(_);p.push(...t._buffers),_=t._nextLoc}const u="@builtin(position) clipPos:vec4f,\n"+te(e._baseVaryings,r).map((e,t)=>`@location(${t}) ${e._name}:${e._type},`).join("\n"),d=!!(e._baseMaterialUboFields&&e._baseMaterialUboFields.length>0),g=[...e._baseMeshUboFields],h=d?[...e._baseMaterialUboFields]:[];for(const e of n)e._uboFields?.length&&(d?h:g).push(...e._uboFields);const v=ee(g),b=d?ee(h):void 0,x=[{binding:0,visibility:3,buffer:{type:"uniform"}}];d&&x.push({binding:1,visibility:2,buffer:{type:"uniform"}});const y=[],w=[],S=[];let B=d?2:1,$=0;function F(e,t){const n="shadow"===e._group,a=n?$++:B++,r=n?2:1;(n?y:x).push(function(e,t){const n={binding:e,visibility:t._visibility};switch(t._type._kind){case"uniform-buffer":n.buffer={type:"uniform"};break;case"texture":{const e="texture_depth_2d"===t._type._textureType?"depth":"texture_2d<u32>"===t._type._textureType?"uint":"float";n.texture={sampleType:t._type._sampleType??e,viewDimension:t._type._textureType.includes("array")?"2d-array":t._type._textureType.includes("cube")?"cube":"2d"};break}case"sampler":n.sampler={type:"sampler_comparison"===t._type._samplerType?"comparison":"sampler_non_filtering"===t._type._samplerType?"non-filtering":"filtering"};break;case"storage-texture":n.storageTexture={access:t._type._access,format:t._type._format}}return n}(a,e));const o=function(e,t,n){switch(n._type._kind){case"uniform-buffer":return`@group(${e})@binding(${t}) var<uniform> ${n._name}:${n._name}Uniforms;`;case"texture":return`@group(${e})@binding(${t}) var ${n._name}:${n._type._textureType};`;case"sampler":return`@group(${e})@binding(${t}) var ${n._name}:${"sampler_non_filtering"===n._type._samplerType?"sampler":n._type._samplerType};`;case"storage-texture":return`@group(${e})@binding(${t}) var ${n._name}:texture_storage_2d<${n._type._format},${n._type._access}>;`}}(r,a,e);1&e._visibility&&w.push(o),2&e._visibility&&S.push(o)}for(const t of e._baseVertexBindings??[])F(t);for(const e of n)for(const t of e._vertexBindings??[])F(t);for(const t of e._baseBindings??[])F(t);for(const e of n)for(const t of(e._bindings??[]).filter(e=>"mesh"===(e._group??"mesh")))F(t);for(const e of n)for(const t of(e._bindings??[]).filter(e=>"shadow"===e._group))F(t);const T=n.map(e=>e._id).join("|"),A=(i.length?i.join("\n")+"\n":"")+c.join("\n"),M=`struct MeshUniforms{\n${v._structBody}\n}`,L=b?`\nstruct MaterialUniforms{\n${b._structBody}\n}\n@group(1)@binding(1) var<uniform> material:MaterialUniforms;`:"";let N=e._vertexTemplate;N=N.replace("/*SU*/",Y),N=N.replace("/*MU*/",M),N=N.replace("/*VI*/",`struct VertexInput{\n${c.join("\n")}\n}`),N=N.replace("/*VO*/",`struct VertexOutput{\n${u}\n}`),N=N.replace("/*VD*/",w.join("\n")),N=N.replace("/*VP*/",A),N=N.replace("/*VH*/",s.join("\n")),N=ae(N,n,"_vertexSlots");let G=e._fragmentTemplate;G=G.replace("/*SU*/",Y),G=G.replace("/*MU*/",M+L),G=G.replace("/*FI*/",`struct FragmentInput{\n${u}\n}`),G=G.replace("/*HF*/",o.join("\n")),G=G.replace("/*FB*/",S.join("\n")),G=ae(G,n,"_fragmentSlots");return{_vertexWGSL:N,_fragmentWGSL:G,_meshBGLDescriptor:{entries:x},_shadowBGLDescriptor:y.length?{entries:y}:null,_vertexBufferLayouts:p,_meshUboSpec:v,_materialUboSpec:b,_fragmentKey:T}}function oe(C){const I=new Map,{_singleLightWGSL:V,_getSingleLightBlock:j,_multiLightWGSL:U,_multiLightLoop:P,_toneMappingHelpers:O,_toneMappingCall:k,_fogHelper:E,_fogBlock:z,_createPbrTemplateExt:W,_anisoExt:H,_iblSkyboxCalc:D,_flatNormalWgsl:R,_gammaTemplate:q,_createPbrShadowFragment:K,_shadowLights:X,_createThinInstanceFragment:Y}=C;return function(C,Z=0,J=0,Q=0,ee=0,te="",ne="",ae,oe="",se=0){const ie=`${C}:${Z}:${J}:${Q}:${ee}:${te}${oe}:${se}`,le=I.get(ie);if(le)return le;const ce=e=>0!==(C&e),pe=e=>0!==(J&e),me=e=>0!==(Q&e),fe=ce(l)&&pe(c),_e=ce(l)&&!pe(c),ue=fe||_e,de=ce(L|N)||0!==(Z&G),ge=me(p),he=pe(A),ve=pe(m),be=ce(o),xe=ce(M),ye=ce(f),we=pe(_),Se=0!==(Z&r),Be=pe(u),$e=0!==(Z&a)&&pe(d),Fe=Se||Be||$e,Te=ce(i),Ae=Fe&&W?W({_hasUvTransform:Se,_hasVertexColor:Be,_hasUv2:$e,_uv2Mask:se,_features2:Z,_hasAnyNormal:ue,_hasEmissiveTexture:ye,_hasSpecGloss:ce(g)}):void 0,Me=function(n){const{_hasSingleLight:a=!1,_hasMultiLight:r=!1,_singleLightWGSL:o="",_singleLightBlock:s="",_multiLightWGSL:i="",_multiLightLoop:l="",_normalMode:c="none",_flatGeometricNormal:p=!1,_flatNormalWgsl:m="",_hasEmissiveTexture:f=!1,_hasSpecGloss:_=!1,_hasDoubleSided:u=!1,_hasTonemap:d=!1,_fogHelper:g="",_fogBlock:h="",_toneMappingHelpers:v="",_toneMappingCall:b="",_hasAlphaBlend:x=!1,_hasSpecularAA:y=!1,_hasGammaAlbedo:w=!1,_hasBaseColorFactor:S=!1,_hasMorph:B=!1,_hasOcclusion:$=!1,_hasEmissiveColor:F=!1,_hasReflectanceExt:T=!1,_hasIbl:A=!1,_hasAnisotropy:M=!1,_anisoBrdfFunctions:L="",_anisoTBBlock:N="",_ext:G,_gammaTemplate:C,_noColorOutput:I=!1,_esmShadowOutput:V=!1,_esmShadowDepthCode:j="",_vbStrides:U}=n,P="tangent"===c,O="cotangent"===c,k=P||O,E=[{_name:"position",_type:"vec3<f32>",_gpuFormat:"float32x3",_arrayStride:U?._p?._stride??12,_offset:U?._p?._offset??0},{_name:"normal",_type:"vec3<f32>",_gpuFormat:"float32x3",_arrayStride:U?._n?._stride??12,_offset:U?._n?._offset??0}];P&&E.push({_name:"tangent",_type:"vec4<f32>",_gpuFormat:"float32x4",_arrayStride:U?._t?._stride??16,_offset:U?._t?._offset??0}),E.push({_name:"uv",_type:"vec2<f32>",_gpuFormat:"float32x2",_arrayStride:U?._u?._stride??8,_offset:U?._u?._offset??0}),G&&E.push(...G.extraVertexAttributes);const z=[{_name:"worldPos",_type:"vec3<f32>"},{_name:"worldNormal",_type:"vec3<f32>"}];P&&z.push({_name:"worldTangent",_type:"vec3<f32>"},{_name:"worldBitangent",_type:"vec3<f32>"}),z.push({_name:"uv",_type:"vec2<f32>"}),G&&z.push(...G.extraVaryings);const W=[{_name:"world",_type:"mat4x4<f32>"}];e(W);const H=[{_name:"environmentIntensity",_type:"f32"},{_name:"directIntensity",_type:"f32"},{_name:"reflectance",_type:"f32"},{_name:"materialAlpha",_type:"f32"},...S?[{_name:"baseColorFactor",_type:"vec4<f32>"}]:[],{_name:"metallicFactor",_type:"f32"},{_name:"roughnessFactor",_type:"f32"},{_name:"normalScale",_type:"f32"},{_name:"lightFalloffMode",_type:"f32"},...M?[{_name:"anisotropyParams",_type:"vec4<f32>"}]:[],...G?G.extraMaterialUboFields:[]],D=(e,t)=>[{_name:e,_type:{_kind:"texture",_textureType:"texture_2d<f32>"},_visibility:2},{_name:t,_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2}],R=D("baseColorTexture","baseColorSampler");k&&R.push(...D("normalTexture","normalSampler_")),R.push(...D("ormTexture","ormSampler")),G&&R.push(...G.extraBindings),f&&R.push(...D("emissiveTexture","emissiveSampler")),_&&R.push(...D("specGlossTexture","specGlossSampler")),V&&R.push({_name:"shadowParams",_type:{_kind:"uniform-buffer"},_visibility:2});const q=B?"morphedNorm":"normal",K=`/*SU*/\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n/*VH*/\n/*VD*/\n/*VO*/\n@vertex fn main(\n/*VP*/\n) -> VertexOutput {\nvar out: VertexOutput;\n/*VR*/\nvar finalWorld = mesh.world;\n/*VW*/\nlet worldPos4 = finalWorld * vec4<f32>(${B?"morphedPos":"position"}, 1.0);\nout.worldPos = worldPos4.xyz;\nout.clipPos = scene.viewProjection * worldPos4;\nout.worldNormal = (finalWorld * vec4<f32>(normalize(${q}), 0.0)).xyz;\n${P?`let N_local=normalize(${q});\nlet T_local=normalize(tangent.xyz);\nlet B_local=cross(N_local,T_local)*tangent.w;\nout.worldTangent=(finalWorld*vec4<f32>(T_local,0.0)).xyz;\nout.worldBitangent=(finalWorld*vec4<f32>(B_local,0.0)).xyz;`:""}\nout.uv = uv;\n ${G?G.vertexBodyExtra:""}/*VB*/\nreturn out;\n}`,X=G?.uvForNormal??"input.uv",Y=G?.normalScaleMod??"",Z=G?.normalScaleMod?"scaledNormal":"normalMapRaw",J=G?.normalScaleMod?"scaledNormalCT":"normalMapSample";let Q;Q=P?`let normalMapRaw=textureSample(normalTexture,normalSampler_,${X}).rgb*2.0-1.0;\n${Y}let normalMapNorm=normalize(${Z});\nvar N_geom=normalize(input.worldNormal);\nlet TBN=mat3x3<f32>(input.worldTangent,input.worldBitangent,input.worldNormal);\nvar N=normalize(TBN*normalMapNorm);`:O?`let normalMapSample=textureSample(normalTexture,normalSampler_,${X}).rgb*2.0-1.0;\n${Y.replace(/normalMapRaw/g,"normalMapSample").replace(/scaledNormal/g,"scaledNormalCT")}var N_geom=normalize(input.worldNormal);\nlet dp1=dpdx(input.worldPos);\nlet dp2=dpdy(input.worldPos);\nlet duv1=dpdx(${X});\nlet duv2=dpdy(${X});\nlet dp2perp=cross(dp2,N_geom);\nlet dp1perp=cross(N_geom,dp1);\nlet tangent_ct=dp2perp*duv1.x+dp1perp*duv2.x;\nlet bitangent_ct=-(dp2perp*duv1.y+dp1perp*duv2.y);\nlet det=max(dot(tangent_ct,tangent_ct),dot(bitangent_ct,bitangent_ct));\nlet invmax=select(inverseSqrt(det),0.0,det==0.0);\nlet cotangentFrame=mat3x3<f32>(tangent_ct*invmax,bitangent_ct*invmax,N_geom);\nvar N=normalize(cotangentFrame*normalize(${J}));`:p&&m?`${m}`:"var N_geom=normalize(input.worldNormal);\nvar N=N_geom;";const ee=M?N:"",te=G?.baseColorMod??"",ne=S?"*material.baseColorFactor.rgb":"",ae=S?"*material.baseColorFactor.a":"",re=w?C.gammaBaseColor(ne,ae,te):`var baseColor=baseColorSample.rgb${ne};\nvar alpha=baseColorSample.a${ae};${te}`,oe=_?`let specGloss=textureSample(specGlossTexture,specGlossSampler,${G?.uvForSpecGloss??"input.uv"});\nlet roughness=clamp(1.0-specGloss.a,0.0,1.0);\nlet metallic=0.0;`:"let roughness=clamp(orm.g*material.roughnessFactor,0.0,1.0);\nlet metallic=orm.b*material.metallicFactor;",se=F||!f?"var emissive:vec3f;":`let emissive=textureSample(emissiveTexture,emissiveSampler,${G?.uvForEmissive??"input.uv"}).rgb;`,ie=T?"":G?.occlusionOverride?G.occlusionOverride:$?"let occlusion=orm.r;":"let occlusion=1.0;",le=T?"":_?"var colorF0=specGloss.rgb;\nlet colorF90=vec3<f32>(1.0);\nlet maxSpecular=max(colorF0.r,max(colorF0.g,colorF0.b));\nlet surfaceAlbedo=baseColor*(1.0-maxSpecular);":"let dielectricF0=material.reflectance;\nvar colorF0=mix(vec3<f32>(dielectricF0),baseColor,metallic);\nlet colorF90=vec3<f32>(1.0);\nlet surfaceAlbedo=baseColor*(1.0-dielectricF0)*(1.0-metallic);",ce=y||k?"var AA_factor_x=0.0;\nvar AA_factor_y=0.0;\n{let nDfdx_AA=dpdx(N);\nlet nDfdy_AA=dpdy(N);\nlet slopeSquare_AA=max(dot(nDfdx_AA,nDfdx_AA),dot(nDfdy_AA,nDfdy_AA));\nAA_factor_x=pow(saturate(slopeSquare_AA),0.333);\nAA_factor_y=sqrt(slopeSquare_AA)*0.75;\nalphaG+=AA_factor_y;}":"var AA_factor_x=0.0;\nvar AA_factor_y=0.0;",pe=r?l:a?s:"var directDiffuse=vec3<f32>(0.0);\nvar directSpecular=vec3<f32>(0.0);\n/*BL*/",me=d?b:"color*=scene.vImageInfos.x;",fe=h,_e=I?"":x?`var finalAlpha=alpha*material.materialAlpha;\nvar luminanceOverAlpha=0.0;\n/*BA*/\nluminanceOverAlpha+=dot(${A?"finalSpecularScaled":"directSpecular"},vec3<f32>(0.2126,0.7152,0.0722));\nfinalAlpha=saturate(finalAlpha+luminanceOverAlpha*luminanceOverAlpha);\n/*FA*/\nreturn vec4<f32>(color,finalAlpha);`:"return vec4<f32>(color,alpha*material.materialAlpha);",ue=u?`@fragment fn main(input: FragmentInput, @builtin(front_facing) frontFacing: bool)${I?"":" -> @location(0) vec4<f32>"} {`:`@fragment fn main(input: FragmentInput)${I?"":" -> @location(0) vec4<f32>"} {`,de=u?`if (!frontFacing) { N = -N;${p?"":" N_geom = -N_geom;"} }`:"";return{_vertexTemplate:K,_fragmentTemplate:`/*SU*/\n${V?"struct shadowParamsUniforms { biasAndScale: vec4<f32>, depthValues: vec4<f32>, }":""}\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n/*HF*/\n/*FB*/\n/*FI*/\n\nconst PI:f32=3.14159265358979323846;\nfn distributionGGX(NdotH:f32,alphaG:f32)->f32{\nlet a2=alphaG*alphaG;\nlet d=NdotH*NdotH*(a2-1.0)+1.0;\nreturn a2/(PI*d*d);\n}\nfn geometrySmithGGX(NdotL:f32,NdotV:f32,alphaG:f32)->f32{\nlet a2=alphaG*alphaG;\nlet gl=NdotL*sqrt(NdotV*(NdotV-a2*NdotV)+a2);\nlet gv=NdotV*sqrt(NdotL*(NdotL-a2*NdotL)+a2);\nreturn 0.5/(gl+gv);\n}\nfn fresnelSchlick(cosTheta:f32,F0:vec3<f32>,F90:vec3<f32>)->vec3<f32>{\nlet t=1.0-cosTheta;\nlet t2=t*t;\nreturn F0+(F90-F0)*(t2*t2*t);\n}\n\n${d?v:""}\n${g}\n${M?L:""}\n${r?i:a?o:""}\n${a||r?"@group(0) @binding(1) var<uniform> lights: lightsUniforms;":""}\n${a||r?t("mesh"):""}\n${G?.fragmentHelpers??""}\n${ue}\n${G?.fragmentPrelude??""}/*SV*/\nlet baseColorSample=textureSample(baseColorTexture,baseColorSampler,${G?.uvForBaseColor??"input.uv"});\n${re}\nlet orm=textureSample(ormTexture,ormSampler,${G?.uvForOrm??"input.uv"}).rgb;\n${ie}\n${oe}\n${se}\n/*AT*/\n${I?"return;":V?j:`${Q}\n${de}\n${ee}\n/*AC*/\nlet V=normalize(scene.vEyePosition.xyz-input.worldPos);\nlet NdotVUnclamped=dot(N,V);\nlet NdotV=abs(NdotVUnclamped)+0.0000001;\n${le}\n/*MF*/\nvar alphaG=roughness*roughness+0.0005;\n${ce}\n${pe}\nvar color=directDiffuse+directSpecular+emissive;\n/*AI*/\n/*NI*/\n${fe}\n${me}\ncolor=pow(color,vec3<f32>(1.0/2.2));\ncolor=clamp(color,vec3<f32>(0.0),vec3<f32>(1.0));\nlet highContrast=color*color*(3.0-2.0*color);\nif(scene.vImageInfos.y<1.0){color=mix(vec3<f32>(0.5),color,scene.vImageInfos.y);}\nelse{color=mix(color,highContrast,scene.vImageInfos.y-1.0);}\ncolor=max(color,vec3<f32>(0.0));\n/*BC*/\n${_e}`}\n}`,_baseMeshUboFields:W,_baseMaterialUboFields:H,_baseVertexAttributes:E,_baseVaryings:z,_baseBindings:R}}({_hasSingleLight:1===ee,_hasMultiLight:2===ee,_singleLightWGSL:V,_singleLightBlock:1===ee&&j?j(te):"",_multiLightWGSL:U,_multiLightLoop:P,_normalMode:fe?"tangent":_e?"cotangent":"none",_flatGeometricNormal:!ue&&pe(T),_flatNormalWgsl:R,_hasEmissiveTexture:ye,_hasSpecGloss:ce(g),_hasDoubleSided:ce(F),_hasTonemap:me($),_fogHelper:me(h)?E:"",_fogBlock:me(h)?z:"",_toneMappingHelpers:O,_toneMappingCall:k,_hasAlphaBlend:ce(B),_hasSpecularAA:Te,_hasGammaAlbedo:ce(S),_hasBaseColorFactor:0!==(Z&w),_hasMorph:he,_hasOcclusion:ce(y)&&!de,_hasEmissiveColor:xe,_hasReflectanceExt:de,_hasIbl:ge,_hasAnisotropy:be,_anisoBrdfFunctions:be&&H?H.ANISO_BRDF_FUNCTIONS:"",_anisoTBBlock:be&&H?H.makeAnisotropyTBBlock(fe,0!==(Z&H.PBR2_HAS_ANISO_TEX)):"",_ext:Ae,_gammaTemplate:q,_noColorOutput:0!==(Z&x),_esmShadowOutput:0!==(Z&b),_esmShadowDepthCode:ne,_vbStrides:ae}),Le=[],Ne={_features:C,_features2:Z,_meshFeatures:J,_uv2Mask:$e?se:0,_hasIbl:ge,_hasAnyNormal:ue,_hasSpecularAA:Te,_anisoBentNormalCode:be&&H?H.ANISO_BENT_NORMAL:"",_iblSkyboxCalc:ce(s)?D:""};let Ge;for(const e of n().values())if(e.frag){const t=e.frag(Ne);t&&(Le.push(t),Ge||=t._pc)}if(ve&&K){const e=X.map(e=>({lightIndex:e.lightIndex,shadowType:e.shadowType}));Le.push(K(e))}we&&Y&&Le.push(Y(pe(v)));let Ce=re(Me,Le);return Ge&&(Ce=Ge(Ce)),I.set(ie,Ce),Ce}}async function se(e,t,n){const r=e.surface.engine,o=r._device,s=new Map,i=!!n,c=[];for(let t=0;t<e.lights.length;t++){const n=e.lights[t].shadowGenerator;n&&c.push({lightIndex:t,shadowType:n._shadowType,gen:n})}const m=c.length>0;let f=!1,g=!1,y=!1;const w=[];for(const n of t){const t=C(n,e.lights),a=t>0?1:-t;if(f||=a>0,1!==a||n.receiveShadows&&m)a>0&&(y=!0);else{g=!0;const n=le(e.lights,t-1);w.includes(n)||w.push(n)}}let S=!1,F=!1,T=!1,A=!1,M=!1,L=!1,N=!1,G=!1,Y=!1,Z=!1,J=!1,Q=!1,ee=!1,te=!1,ne=!1,ae=!1,re=!1,se=!1,me=!1,fe=!1,_e=!1;for(let e=0;e<t.length;e++){const n=t[e],a=n.material,r=a.subsurface?.refraction?.intensity??0;S||=!!a.skyboxMode,F||=!!(a.metallicReflectanceTexture||a.reflectanceTexture||a._hasReflExt),T||=!!a.clearCoat?.isEnabled,A||=!!a.sheen?.isEnabled,M||=!!a.iridescence?.isEnabled,L||=!!a.anisotropy?.isEnabled,N||=!!a.subsurface?.translucency,G||=a.alphaCutOff>0,Y||=r>0&&!!a.transmissive,Z||=!!a.emissiveColor,J||=!!n.skeleton,Q||=!!n.morphTargets,ee||=!!n.thinInstances,te||=!!n.thinInstances?._gpuCullingEnabled,ne||=!!a.unlit,ae||=!!a.shadowOnly,re||=!!a._hasUvTx,se||=!!n._gpu.uv2Buffer&&!!a._uv2Mask,me||=!!n._gpu.colorBuffer,fe||=!!n._flatNormal,_e||=!!a.gammaAlbedo}let ue="";if(i){const e=await import("./ibl-fragment-DmravZIP.esm.min.js");if(I(e.pbrExt),S){ue=(await import("./ibl-skybox-wgsl-BuULdvYg.esm.min.js")).IBL_SKYBOX_CALCULATION}}let de="";if(fe){de=(await import("./flat-normal-wgsl-0e9gftFS.esm.min.js")).FLAT_NORMAL_WGSL}let ge=null,he="",ve=null;const be={};let xe="",ye="";if(g){for(const e of w){const t=await ce(e);he=t.SINGLE_LIGHT_STRUCTS,be[e]=t.getSingleLightBlock}ve=e=>be[ie(e)]?.()??""}if(y){const e=await import("./multilight-wgsl-jR97w0WP.esm.min.js");xe=e.MULTI_LIGHT_STRUCTS()+e.COMPUTE_PBR_LIGHT,ye=e.getMultiLightLoop()}if(f&&m){ge=(await import("./pbr-shadow-fragment-CQQ_1Kow.esm.min.js")).createPbrShadowFragment}const we=async e=>{for(const[t,n]of e)t&&I((await n()).pbrExt)};if(await we([[G,()=>import("./alpha-test-fragment-CPNIj4Ud.esm.min.js")],[F,()=>import("./reflectance-fragment-iNNnhxnj.esm.min.js")],[T,()=>import("./clearcoat-fragment-BNAR-eRu.esm.min.js")],[A,()=>import("./sheen-fragment-vqD4XsSh.esm.min.js")],[M,()=>import("./iridescence-fragment-CMgptpWw.esm.min.js")],[N,()=>import("./subsurface-fragment-3RoX-uVJ.esm.min.js")]]),Y){const t=await import("./pbr-refraction-D-HUc70W.esm.min.js");await t.R(e,r,I)}await we([[Z,()=>import("./emissive-fragment-DEPutg3N.esm.min.js")],[ne,()=>import("./unlit-fragment-DQaufJjo.esm.min.js")],[ae,()=>import("./shadow-only-fragment-q6Jo1wVp.esm.min.js")],[J,()=>import("./skeleton-fragment-BxNS3Ej8.esm.min.js")],[Q,()=>import("./morph-fragment-D3jALlPB.esm.min.js")],[re,()=>import("./uv-transform-fragment--ACzvGOq.esm.min.js")]]);let Se=null;L&&(Se=await import("./anisotropy-fragment-BK9WoUeQ.esm.min.js"),I(Se.pbrExt));let Be=null;if(re||me||se){Be=(await import("./pbr-template-ext-DPcV-en5.esm.min.js")).createPbrTemplateExt}const $e=_e?await import("./pbr-template-gamma-BgclrfVn.esm.min.js"):null;let Fe,Te=null,Ae=null,Me=null;if(ee){Te=(await import("./thin-instance-fragment-CalH7f_e.esm.min.js")).createThinInstanceFragment;const e=await import("./thin-instance-gpu-bFS2p2by.esm.min.js");Ae=e.syncThinInstanceBuffers,te&&(Fe=await import("./thin-instance-cull-binding-BdukEKun.esm.min.js")),Me=e.syncThinInstanceForDraw}let Le="",Ne="";const Ge=e.imageProcessing.toneMappingEnabled;if(Ge){const t=e.imageProcessing.toneMapping??V;Le=t.helpersWGSL,Ne=t.callWGSL}let Ce="",Ie="";if(e.fog){const e=await import("./pbr-fog-wgsl-DGm6cyy1.esm.min.js");Ce=e.PBR_FOG_HELPER,Ie=e.PBR_FOG_BLOCK}const Ve=oe({_singleLightWGSL:he,_getSingleLightBlock:ve,_multiLightWGSL:xe,_multiLightLoop:ye,_toneMappingHelpers:Le,_toneMappingCall:Ne,_fogHelper:Ce,_fogBlock:Ie,_createPbrTemplateExt:Be,_anisoExt:Se,_iblSkyboxCalc:ue,_flatNormalWgsl:de,_gammaTemplate:$e,_createPbrShadowFragment:ge,_shadowLights:c,_createThinInstanceFragment:Te}),je=(i?p:0)|(Ge?$:0)|(e.fog?h:0),Ue=new Map,Pe=Ae,Oe=Me,ke=(e,t,i)=>{const p=i??t.material,f=p._renderFeatures??=P(p),g=null!=i,h=C(t,e.lights),y=h>0?1:-h,w=f.features,S=f.features2??0,$=!(0!==(S&(x|b)))&&t.receiveShadows&&m,F=0===y?0:1!==y||$?2:1,T=1===F?le(e.lights,h-1):"",A=O(t,$),M=0!==(S&b)?p._esmShadowDepthCode:"",L=t._gpu._vbLayout,N=t._gpu._vbKey??"",G=p._uv2Mask??0,I=Ve(w,S,A,je,F,T,M,L,N,G),V=k(r,w,S,A,je,I,`${F}:${T}${N}:${G}`,p.stencil??null),j=new E(I._meshUboSpec._totalBytes/4),U=r._makePackMeshWorld?.(e)??z;U(j,t.worldMatrix,0,0),C(t,e.lights,j);const Y=W(r,j),Z=I._materialUboSpec,J=new E(Z._totalBytes/4);pe(J,p,Z);const Q=W(r,J),ee=!!p.transmissive&&0!==(S&H),te=ee?null:D(r,V,I,Y,Q,p,n??null,t);let ne=null;const ae=$?c:[];if(ae.length>0&&V._shadowBGL){let e=Ue.get(V._shadowBGL);if(!e){const t=[];let n=0;for(const e of ae){const a=e.gen;t.push({binding:n++,resource:a._depthTexture.createView()}),t.push({binding:n++,resource:a._depthSampler}),t.push({binding:n++,resource:{buffer:a._shadowUBO}})}e=o.createBindGroup({layout:V._shadowBGL,entries:t}),Ue.set(V._shadowBGL,e)}ne=e}const re=R(p);for(const e of re)q(e);e._meshDisposables.set(t,[()=>{Y.destroy(),Q.destroy()},()=>{for(const e of re)K(e)}]);const oe=0===(S&(x|b))&&0!==(w&B),se=t.renderOrder??(oe||ee?150:100),ie=0!==(w&l),ce=0!==(S&a)&&0!==(A&d),me=0!==(A&u),fe=0!==(A&_),_e=0!==(A&v);let ue=t.worldMatrixVersion,de=e.lights.length,ge=null;const he=oe||ee?[t.worldMatrix[12],t.worldMatrix[13],t.worldMatrix[14]]:null,ve=()=>{const n=t.worldMatrixVersion;n===ue&&e.lights.length===de||(he&&(he[0]=t.worldMatrix[12],he[1]=t.worldMatrix[13],he[2]=t.worldMatrix[14]),U(j,t.worldMatrix,0,0),C(t,e.lights,j),o.queue.writeBuffer(Y,0,j),ue=n,de=e.lights.length);const a=p._uboVersion;if(a!==ye){ye=a;let e=s.get(Z._totalBytes);e?e.fill(0):(e=new E(Z._totalBytes/4),s.set(Z._totalBytes,e)),pe(e,p,Z),o.queue.writeBuffer(Q,0,e.buffer,0,e.byteLength)}fe&&(ge=Oe(r,t.thinInstances,_e,t._gpu.indexCount))},be=r._wrapRenderableForFO?.(ve,e,()=>{ue=-1})??ve,xe={order:se,isTransparent:oe,_transmissive:ee,mesh:t,bind(a,o){const s=X(a,o,V),i=ee?D(r,V,I,Y,Q,p,n??null,t,o._transmissionTexture):te,l=Fe?.tryBind(xe,e,t,r,_e,oe||ee,be,o);return{renderable:xe,pipeline:s,...l?{_updateBatches:[l._updateBatch]}:{},update:l?l.update:be,draw:e=>((e,n,a)=>{if(!g&&t.material!==p)return 0;const o=t._gpu;e.setBindGroup(1,n),ne&&e.setBindGroup(2,ne);let s=0;e.setVertexBuffer(s++,o.positionBuffer),e.setVertexBuffer(s++,o.normalBuffer),ie&&o.tangentBuffer&&e.setVertexBuffer(s++,o.tangentBuffer),e.setVertexBuffer(s++,o.uvBuffer),ce&&o.uv2Buffer&&e.setVertexBuffer(s++,o.uv2Buffer),me&&o.colorBuffer&&e.setVertexBuffer(s++,o.colorBuffer);const i=t.skeleton??t.vat;i&&(e.setVertexBuffer(s++,i.jointsBuffer),e.setVertexBuffer(s++,i.weightsBuffer),i.joints1Buffer&&i.weights1Buffer&&(e.setVertexBuffer(s++,i.joints1Buffer),e.setVertexBuffer(s++,i.weights1Buffer)));const l=fe?t.thinInstances:null;return l&&Pe&&(s=Pe(r,l,e,s,_e,a?.cullDrawBufs)),e.setIndexBuffer(o.indexBuffer,o.indexFormat),a?a.draw(e,o.indexCount,l.count):ge?e.drawIndexedIndirect(ge,0):e.drawIndexed(o.indexCount,l?.count),1})(e,i,l)}}};he&&(xe._worldCenter=he);let ye=p._uboVersion;return xe},Ee=t.map(t=>ke(e,t));return e._pbrGeomContext={_composePbr:Ve,_sceneFeatures:je,_envTextures:n??null,_shadowLights:c,_syncThinInstanceBuffers:Ae,_syncThinInstanceForDraw:Me},e._disposables.push(r._pbrCleanup??=()=>{j(),U(r)}),{renderables:Ee,rebuildSingle:ke}}function ie(e){return"hemispheric"===e||"directional"===e||"spot"===e?e:"point"}function le(e,t){let n=0;for(const a of e)if(a._writeLightUbo){if(n===t)return ie(a.lightType);n++}return"point"}async function ce(e){return"hemispheric"===e?import("./singlelight-hemispheric-wgsl-Blwvz5AY.esm.min.js"):"directional"===e?import("./singlelight-directional-wgsl-CNxdFUbB.esm.min.js"):"spot"===e?import("./singlelight-spot-wgsl-CTHtJobz.esm.min.js"):import("./singlelight-point-wgsl-CwH6HNsE.esm.min.js")}function pe(e,t,a){e[0]=t.environmentIntensity??1,e[1]=t.directIntensity??1,e[2]=t.reflectance??.04,e[3]=t.alpha??1;const r=a._offsets.get("baseColorFactor");if(void 0!==r){const n=r/4,a=t.baseColorFactor;e[n]=a?a[0]:1,e[n+1]=a?a[1]:1,e[n+2]=a?a[2]:1,e[n+3]=a?a[3]:1}if(a._offsets.has("metallicFactor")){const n=a._offsets.get("metallicFactor")/4;e[n]=t.metallicFactor??1,e[n+1]=t.roughnessFactor??1,e[n+2]=t.normalTextureScale??1,e[n+3]=!1===t.usePhysicalLightFalloff?0:1}for(const r of n().values())r.writeUbo&&r.writeUbo(e,t,a._offsets)}export{pe as _writeMaterialData,se as buildPbrRenderables}; //# sourceMappingURL=pbr-renderable-DrZwIDjN.esm.min.js.map