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) 24.6 kB
import{k as e,s as t,u as n,v as a,P as r,w as o,x as s,y as l,z as i,A as c,C as p,D as _,E as f,G as u,H as m,J as d,K as g,N as h,O as v,Q as b,R as x,V as y,W as w,X as B,Y as S,Z as $,$ as F,a0 as T,a1 as M,a2 as A,a3 as L,a4 as N,a5 as G,a6 as C,a7 as V,a8 as I,a9 as U,aa as P,ab as k,ac as j,ad as O,ae as z,af as E,F as W,ag as D,j as H,ah as R,ai as q,aj as K,ak as X,al as Z,am as Q}from"./index-B8IgtevW.esm.min.js";const Y={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 ee(e){const t=Y[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 te(e){const t=new Map,n=[];let a=0;for(const r of e){const e=ee(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 ne(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 ae=/\/\*([A-Z_0-9]+)\*\//g;function re(e,t,n){return e.replace(ae,(e,a)=>{const r=[];for(const e of t){const t=e[n];t?.[a]&&r.push(t[a])}return r.join("\n")})}function oe(t,n){const a=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}(n),r=[],o=[],s=[],l=[],i=[];for(const e of a){e._vertexAttributes&&r.push(...e._vertexAttributes),e._varyings&&o.push(...e._varyings),e._helperFunctions&&s.push(e._helperFunctions),e._vertexHelperFunctions&&l.push(e._vertexHelperFunctions);for(const t of e._vertexBuiltins??[])i.push(`@builtin(${t._builtin}) ${t._name}:${t._type},`)}const c=ne(t._baseVertexAttributes,r),p=[],_=[],f=new Map,u=new Map;for(let e=0;e<c.length;e++){const t=c[e];p.push(`@location(${e}) ${t._name}:${t._type},`),t._bufferGroup?(f.has(t._bufferGroup)||(f.set(t._bufferGroup,[]),u.set(t._bufferGroup,t)),f.get(t._bufferGroup).push({loc:e,off:t._offset??0,fmt:t._gpuFormat})):_.push({arrayStride:t._arrayStride,stepMode:t._stepMode??"vertex",attributes:[{shaderLocation:e,offset:t._offset??0,format:t._gpuFormat}]})}for(const[e,t]of f){const n=u.get(e);_.push({arrayStride:n._arrayStride,stepMode:n._stepMode??"vertex",attributes:t.map(e=>({shaderLocation:e.loc,offset:e.off,format:e.fmt}))})}let m=c.length;for(const e of a)if(e._pipelineVertexBuffers){const t=e._pipelineVertexBuffers(m);_.push(...t._buffers),m=t._nextLoc}const d="@builtin(position) clipPos:vec4f,\n"+ne(t._baseVaryings,o).map((e,t)=>`@location(${t}) ${e._name}:${e._type},`).join("\n"),g=!!(t._baseMaterialUboFields&&t._baseMaterialUboFields.length>0),h=[...t._baseMeshUboFields],v=g?[...t._baseMaterialUboFields]:[];for(const e of a)e._uboFields?.length&&(g?v:h).push(...e._uboFields);const b=te(h),x=g?te(v):void 0,y=[{binding:0,visibility:3,buffer:{type:"uniform"}}];g&&y.push({binding:1,visibility:2,buffer:{type:"uniform"}});const w=[],B=[],S=[];let $=g?2:1,F=0;function T(e,t){const n="shadow"===e._group,a=n?F++:$++,r=n?2:1;(n?w:y).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&&B.push(o),2&e._visibility&&S.push(o)}for(const e of t._baseVertexBindings??[])T(e);for(const e of a)for(const t of e._vertexBindings??[])T(t);for(const e of t._baseBindings??[])T(e);for(const e of a)for(const t of(e._bindings??[]).filter(e=>"mesh"===(e._group??"mesh")))T(t);for(const e of a)for(const t of(e._bindings??[]).filter(e=>"shadow"===e._group))T(t);const M=a.map(e=>e._id).join("|"),A=(i.length?i.join("\n")+"\n":"")+p.join("\n"),L=`struct MeshUniforms{\n${b._structBody}\n}`,N=x?`\nstruct MaterialUniforms{\n${x._structBody}\n}\n@group(1)@binding(1) var<uniform> material:MaterialUniforms;`:"";let G=t._vertexTemplate;G=G.replace("/*SU*/",e),G=G.replace("/*MU*/",L),G=G.replace("/*VI*/",`struct VertexInput{\n${p.join("\n")}\n}`),G=G.replace("/*VO*/",`struct VertexOutput{\n${d}\n}`),G=G.replace("/*VD*/",B.join("\n")),G=G.replace("/*VP*/",A),G=G.replace("/*VH*/",l.join("\n")),G=re(G,a,"_vertexSlots");let C=t._fragmentTemplate;C=C.replace("/*SU*/",e),C=C.replace("/*MU*/",L+N),C=C.replace("/*FI*/",`struct FragmentInput{\n${d}\n}`),C=C.replace("/*HF*/",s.join("\n")),C=C.replace("/*FB*/",S.join("\n")),C=re(C,a,"_fragmentSlots");return{_vertexWGSL:G,_fragmentWGSL:C,_meshBGLDescriptor:{entries:y},_shadowBGLDescriptor:w.length?{entries:w}:null,_vertexBufferLayouts:_,_meshUboSpec:b,_materialUboSpec:x,_fragmentKey:M}}function se(e){const V=new Map,{_singleLightWGSL:I,_getSingleLightBlock:U,_multiLightWGSL:P,_multiLightLoop:k,_toneMappingHelpers:j,_toneMappingCall:O,_fogHelper:z,_fogBlock:E,_createPbrTemplateExt:W,_flatNormalWgsl:D,_createPbrShadowFragment:H,_shadowLights:R,_createThinInstanceFragment:q}=e;return function(e,K=0,X=0,Z=0,Q=0,Y="",J="",ee,te="",ne=0){const ae=`${e}:${K}:${X}:${Z}:${Q}:${Y}${te}:${ne}`,re=V.get(ae);if(re)return re;const se=t=>0!==(e&t),le=e=>0!==(X&e),ie=e=>0!==(Z&e),ce=se(o)&&le(_),pe=se(o)&&!le(_),_e=ce||pe,fe=se(N|G)||0!==(K&C),ue=ie(f),me=le(A),de=le(u),ge=se(m),he=ge?a().get("anisotropy"):void 0,ve=se(i)?a().get("gamma-albedo"):void 0,be=se(c)?a().get("skybox"):void 0,xe=se(L),ye=se(r),we=le(d),Be=0!==(K&l),Se=le(g),$e=0!==(K&s)&&le(h),Fe=Be||Se||$e,Te=se(p),Me=Fe&&W?W({_hasUvTransform:Be,_hasVertexColor:Se,_hasUv2:$e,_uv2Mask:ne,_features2:K,_hasAnyNormal:_e,_hasEmissiveTexture:ye,_hasSpecGloss:se(v)}):void 0,Ae=function(e){const{_hasSingleLight:a=!1,_hasMultiLight:r=!1,_singleLightWGSL:o="",_singleLightBlock:s="",_multiLightWGSL:l="",_multiLightLoop:i="",_normalMode:c="none",_flatGeometricNormal:p=!1,_flatNormalWgsl:_="",_hasEmissiveTexture:f=!1,_hasSpecGloss:u=!1,_hasDoubleSided:m=!1,_hasTonemap:d=!1,_fogHelper:g="",_fogBlock:h="",_toneMappingHelpers:v="",_toneMappingCall:b="",_hasAlphaBlend:x=!1,_hasSpecularAA:y=!1,_hasGammaAlbedo:w=!1,_hasBaseColorFactor:B=!1,_hasMorph:S=!1,_hasOcclusion:$=!1,_hasEmissiveColor:F=!1,_hasReflectanceExt:T=!1,_hasIbl:M=!1,_hasAnisotropy:A=!1,_anisoBrdfFunctions:L="",_anisoTBBlock:N="",_ext:G,_gammaBaseColor:C,_noColorOutput:V=!1,_esmShadowOutput:I=!1,_esmShadowDepthCode:U="",_vbStrides:P}=e,k="tangent"===c,j="cotangent"===c,O=k||j,z=[{_name:"position",_type:"vec3<f32>",_gpuFormat:"float32x3",_arrayStride:P?._p?._stride??12,_offset:P?._p?._offset??0},{_name:"normal",_type:"vec3<f32>",_gpuFormat:"float32x3",_arrayStride:P?._n?._stride??12,_offset:P?._n?._offset??0}];k&&z.push({_name:"tangent",_type:"vec4<f32>",_gpuFormat:"float32x4",_arrayStride:P?._t?._stride??16,_offset:P?._t?._offset??0}),z.push({_name:"uv",_type:"vec2<f32>",_gpuFormat:"float32x2",_arrayStride:P?._u?._stride??8,_offset:P?._u?._offset??0}),G&&z.push(...G.extraVertexAttributes);const E=[{_name:"worldPos",_type:"vec3<f32>"},{_name:"worldNormal",_type:"vec3<f32>"}];k&&E.push({_name:"worldTangent",_type:"vec3<f32>"},{_name:"worldBitangent",_type:"vec3<f32>"}),E.push({_name:"uv",_type:"vec2<f32>"}),G&&E.push(...G.extraVaryings);const W=[{_name:"world",_type:"mat4x4<f32>"}];t(W);const D=[{_name:"environmentIntensity",_type:"f32"},{_name:"directIntensity",_type:"f32"},{_name:"reflectance",_type:"f32"},{_name:"materialAlpha",_type:"f32"},...B?[{_name:"baseColorFactor",_type:"vec4<f32>"}]:[],{_name:"metallicFactor",_type:"f32"},{_name:"roughnessFactor",_type:"f32"},{_name:"normalScale",_type:"f32"},{_name:"lightFalloffMode",_type:"f32"},...A?[{_name:"anisotropyParams",_type:"vec4<f32>"}]:[],...G?G.extraMaterialUboFields:[]],H=(e,t)=>[{_name:e,_type:{_kind:"texture",_textureType:"texture_2d<f32>"},_visibility:2},{_name:t,_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2}],R=H("baseColorTexture","baseColorSampler");O&&R.push(...H("normalTexture","normalSampler_")),R.push(...H("ormTexture","ormSampler")),G&&R.push(...G.extraBindings),f&&R.push(...H("emissiveTexture","emissiveSampler")),u&&R.push(...H("specGlossTexture","specGlossSampler")),I&&R.push({_name:"shadowParams",_type:{_kind:"uniform-buffer"},_visibility:2});const q=S?"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>(${S?"morphedPos":"position"}, 1.0);\nout.worldPos = worldPos4.xyz;\nout.clipPos = scene.viewProjection * worldPos4;\nout.worldNormal = (finalWorld * vec4<f32>(normalize(${q}), 0.0)).xyz;\n${k?`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",Z=G?.normalScaleMod??"",Q=G?.normalScaleMod?"scaledNormal":"normalMapRaw",Y=G?.normalScaleMod?"scaledNormalCT":"normalMapSample";let J;J=k?`let normalMapRaw=textureSample(normalTexture,normalSampler_,${X}).rgb*2.0-1.0;\n${Z}let normalMapNorm=normalize(${Q});\nvar N_geom=normalize(input.worldNormal);\nlet TBN=mat3x3<f32>(input.worldTangent,input.worldBitangent,input.worldNormal);\nvar N=normalize(TBN*normalMapNorm);`:j?`let normalMapSample=textureSample(normalTexture,normalSampler_,${X}).rgb*2.0-1.0;\n${Z.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(${Y}));`:p&&_?`${_}`:"var N_geom=normalize(input.worldNormal);\nvar N=N_geom;";const ee=A?N:"",te=G?.baseColorMod??"",ne=B?"*material.baseColorFactor.rgb":"",ae=B?"*material.baseColorFactor.a":"",re=w?C(ne,ae,te):`var baseColor=baseColorSample.rgb${ne};\nvar alpha=baseColorSample.a${ae};${te}`,oe=u?`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;`,le=T?"":G?.occlusionOverride?G.occlusionOverride:$?"let occlusion=orm.r;":"let occlusion=1.0;",ie=T?"":u?"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||O?"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?i:a?s:"var directDiffuse=vec3<f32>(0.0);\nvar directSpecular=vec3<f32>(0.0);\n/*BL*/",_e=d?b:"color*=scene.vImageInfos.x;",fe=h,ue=V?"":x?`var finalAlpha=alpha*material.materialAlpha;\nvar luminanceOverAlpha=0.0;\n/*BA*/\nluminanceOverAlpha+=dot(${M?"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);",me=m?`@fragment fn main(input: FragmentInput, @builtin(front_facing) frontFacing: bool)${V?"":" -> @location(0) vec4<f32>"} {`:`@fragment fn main(input: FragmentInput)${V?"":" -> @location(0) vec4<f32>"} {`,de=m?`if (!frontFacing) { N = -N;${p?"":" N_geom = -N_geom;"} }`:"";return{_vertexTemplate:K,_fragmentTemplate:`/*SU*/\n${I?"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${A?L:""}\n${r?l:a?o:""}\n${a||r?"@group(0) @binding(1) var<uniform> lights: lightsUniforms;":""}\n${a||r?n("mesh"):""}\n${G?.fragmentHelpers??""}\n${me}\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${le}\n${oe}\n${se}\n/*AT*/\n${V?"return;":I?U:`${J}\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${ie}\n/*MF*/\nvar alphaG=roughness*roughness+0.0005;\n${ce}\n${pe}\nvar color=directDiffuse+directSpecular+emissive;\n/*AI*/\n/*NI*/\n${fe}\n${_e}\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${ue}`}\n}`,_baseMeshUboFields:W,_baseMaterialUboFields:D,_baseVertexAttributes:z,_baseVaryings:E,_baseBindings:R}}({_hasSingleLight:1===Q,_hasMultiLight:2===Q,_singleLightWGSL:I,_singleLightBlock:1===Q&&U?U(Y):"",_multiLightWGSL:P,_multiLightLoop:k,_normalMode:ce?"tangent":pe?"cotangent":"none",_flatGeometricNormal:!_e&&le(M),_flatNormalWgsl:D,_hasEmissiveTexture:ye,_hasSpecGloss:se(v),_hasDoubleSided:se(T),_hasTonemap:ie(F),_fogHelper:ie(b)?z:"",_fogBlock:ie(b)?E:"",_toneMappingHelpers:j,_toneMappingCall:O,_hasAlphaBlend:se($),_hasSpecularAA:Te,_hasGammaAlbedo:se(i),_hasBaseColorFactor:0!==(K&S),_hasMorph:me,_hasOcclusion:se(B)&&!fe,_hasEmissiveColor:xe,_hasReflectanceExt:fe,_hasIbl:ue,_hasAnisotropy:ge,_anisoBrdfFunctions:ge&&he?he._anisoBrdf:"",_anisoTBBlock:ge&&he?he._anisoTB(ce,0!==(K&he._anisoTexBit)):"",_ext:Me,_gammaBaseColor:ve?._gammaBaseColor??null,_noColorOutput:0!==(K&w),_esmShadowOutput:0!==(K&y),_esmShadowDepthCode:J,_vbStrides:ee}),Le=[],Ne={_features:e,_features2:K,_meshFeatures:X,_uv2Mask:$e?ne:0,_hasIbl:ue,_hasAnyNormal:_e,_hasSpecularAA:Te,_anisoBentNormalCode:ge&&he?he._anisoBentNormal:"",_iblSkyboxCalc:be?._skyboxCalc??""};let Ge;for(const e of a().values())if(e.frag){const t=e.frag(Ne);t&&(Le.push(t),Ge||=t._pc)}if(de&&H){const e=R.map(e=>({lightIndex:e.lightIndex,shadowType:e.shadowType}));Le.push(H(e))}we&&q&&Le.push(q(le(x)));let Ce=oe(Ae,Le);return Ge&&(Ce=Ge(Ce)),V.set(ae,Ce),Ce}}async function le(e,t,n){const a=e.surface.engine,r=a._device,l=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 p=c.length>0;let _=!1,u=!1,m=!1;const v=[];for(const n of t){const t=V(n,e.lights),a=t>0?1:-t;if(_||=a>0,1===a){u=!0;const a=ce(e.lights,t-1);v.includes(a)||v.push(a),m||=n.receiveShadows&&p}else a>0&&(m=!0)}let B=!1,S=!1,T=!1,M=!1,A=!1,L=!1,N=!1,G=!1,C=!1;for(let e=0;e<t.length;e++){const n=t[e],a=n.material;B||=!!n.skeleton,S||=!!n.morphTargets,T||=!!n.thinInstances,M||=!!n.thinInstances?._gpuCullingEnabled,A||=!!a._hasUvTx,L||=!!n._gpu.uv2Buffer&&!!a._uv2Mask,N||=!!n._gpu.colorBuffer,G||=!!n._flatNormal,C||=!!a._gammaAlbedo}const Y=e._groups.get(t[0].material._buildGroup);if(C&&Y.r||(Y._w=C?null:e=>e.material?._gammaAlbedo),i){const e=await import("./ibl-fragment-DmravZIP.esm.min.js");I(e.pbrExt)}let J="";if(G){J=(await import("./flat-normal-wgsl-0e9gftFS.esm.min.js")).FLAT_NORMAL_WGSL}let ee=null,te="",ne=null;const ae={};let re="",oe="";if(u){for(const e of v){const t=await pe(e);te=t.SINGLE_LIGHT_STRUCTS,ae[e]=t.getSingleLightBlock}ne=e=>ae[ie(e)]?.()??""}if(m){const e=await import("./multilight-wgsl-BbR8cYH_.esm.min.js");re=e.MULTI_LIGHT_STRUCTS()+e.COMPUTE_PBR_LIGHT,oe=e.getMultiLightLoop()}if(_&&p){ee=(await import("./pbr-shadow-fragment-CQQ_1Kow.esm.min.js")).createPbrShadowFragment}for(const n of U())await n(e,a,t);await(async e=>{for(const[t,n]of e)t&&I((await n()).pbrExt)})([[B,()=>import("./skeleton-fragment-CzcLG9oG.esm.min.js")],[S,()=>import("./morph-fragment-Cg5Z2HxD.esm.min.js")]]);let le=null;if(A||N||L){le=(await import("./pbr-template-ext-C_Lcd3Cb.esm.min.js")).createPbrTemplateExt}let fe,ue=null,me=null,de=null;if(T){ue=(await import("./thin-instance-fragment-CID4ZejI.esm.min.js")).createThinInstanceFragment;const e=await import("./thin-instance-gpu-GPo-3kJo.esm.min.js");me=e.syncThinInstanceBuffers,M&&(fe=await import("./thin-instance-cull-binding-Br9UyFF2.esm.min.js")),de=e.syncThinInstanceForDraw}let ge="",he="";const ve=e.imageProcessing.toneMappingEnabled;if(ve){const t=e.imageProcessing.toneMapping??P;ge=t.helpersWGSL,he=t.callWGSL}let be="",xe="";if(e.fog){const e=await import("./pbr-fog-wgsl-DGm6cyy1.esm.min.js");be=e.PBR_FOG_HELPER,xe=e.PBR_FOG_BLOCK}const ye=se({_singleLightWGSL:te,_getSingleLightBlock:ne,_multiLightWGSL:re,_multiLightLoop:oe,_toneMappingHelpers:ge,_toneMappingCall:he,_fogHelper:be,_fogBlock:xe,_createPbrTemplateExt:le,_flatNormalWgsl:J,_createPbrShadowFragment:ee,_shadowLights:c,_createThinInstanceFragment:ue}),we=(i?f:0)|(ve?F:0)|(e.fog?b:0),Be=new Map,Se=me,$e=de,Fe=(e,t,i)=>{const _=i??t.material,f=_._renderFeatures??=O(_),u=null!=i,m=V(t,e.lights),v=m>0?1:-m,b=f.features,B=f.features2??0,S=!(0!==(B&(w|y)))&&t.receiveShadows&&p,F=0===v?0:1!==v||S?2:1,T=1===F?ce(e.lights,m-1):"",M=z(t,S)|(t._primitiveFeatures??0),A=0!==(B&y)?_._esmShadowDepthCode:"",L=t._gpu._vbLayout,N=t._gpu._vbKey??"",G=_._uv2Mask??0,C=ye(b,B,M,we,F,T,A,L,N,G);C._prim=t._primitive;const I=E(a,b,B,M,we,C,`${F}:${T}${N}:${G}`,_.stencil??null),U=new W(C._meshUboSpec._totalBytes/4),P=a._makePackMeshWorld?.(e)??D;P(U,t.worldMatrix,0,0),V(t,e.lights,U);const k=H(a,U),j=C._materialUboSpec,Y=new W(j._totalBytes/4);_e(Y,_,j);const J=H(a,Y),ee=!!_._transmissive&&0!==(B&R),te=ee?null:q(a,I,C,k,J,_,n??null,t);let ne=null;const ae=S?c:[];if(ae.length>0&&I._shadowBGL){let e=Be.get(I._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=r.createBindGroup({layout:I._shadowBGL,entries:t}),Be.set(I._shadowBGL,e)}ne=e}const re=K(_);for(const e of re)X(e);e._meshDisposables.set(t,[()=>{k.destroy(),J.destroy()},()=>{for(const e of re)Z(e)}]);const oe=0===(B&(w|y))&&0!==(b&$),se=t.renderOrder??(oe||ee?150:100),le=0!==(b&o),ie=0!==(B&s)&&0!==(M&h),pe=0!==(M&g),ue=0!==(M&d),me=0!==(M&x);let de=t.worldMatrixVersion,ge=e.lights.length,he=null;const ve=oe||ee?[t.worldMatrix[12],t.worldMatrix[13],t.worldMatrix[14]]:null,be=()=>{const n=t.worldMatrixVersion;n===de&&e.lights.length===ge||(ve&&(ve[0]=t.worldMatrix[12],ve[1]=t.worldMatrix[13],ve[2]=t.worldMatrix[14]),P(U,t.worldMatrix,0,0),V(t,e.lights,U),r.queue.writeBuffer(k,0,U),de=n,ge=e.lights.length);const o=_._uboVersion;if(o!==Te){Te=o;let e=l.get(j._totalBytes);e?e.fill(0):(e=new W(j._totalBytes/4),l.set(j._totalBytes,e)),_e(e,_,j),r.queue.writeBuffer(J,0,e.buffer,0,e.byteLength)}ue&&(he=$e(a,t.thinInstances,me,t._gpu.indexCount))},xe=a._wrapRenderableForFO?.(be,e,()=>{de=-1})??be,Fe={order:se,isTransparent:oe,_transmissive:ee,mesh:t,bind(r,o){const s=Q(r,o,I),l=ee?q(a,I,C,k,J,_,n??null,t,o._transmissionTexture):te,i=fe?.tryBind(Fe,e,t,a,me,oe||ee,xe,o);return{renderable:Fe,pipeline:s,...i?{_updateBatches:[i._updateBatch]}:{},update:i?i.update:xe,draw:e=>((e,n,r)=>{if(!u&&t.material!==_)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),le&&o.tangentBuffer&&e.setVertexBuffer(s++,o.tangentBuffer),e.setVertexBuffer(s++,o.uvBuffer),ie&&o.uv2Buffer&&e.setVertexBuffer(s++,o.uv2Buffer),pe&&o.colorBuffer&&e.setVertexBuffer(s++,o.colorBuffer);const l=t.skeleton??t.vat;l&&(e.setVertexBuffer(s++,l.jointsBuffer),e.setVertexBuffer(s++,l.weightsBuffer),l.joints1Buffer&&l.weights1Buffer&&(e.setVertexBuffer(s++,l.joints1Buffer),e.setVertexBuffer(s++,l.weights1Buffer)));const i=ue?t.thinInstances:null;return i&&Se&&(s=Se(a,i,e,s,me,r?.cullDrawBufs)),e.setIndexBuffer(o.indexBuffer,o.indexFormat),r?r.draw(e,o.indexCount,i.count):he?e.drawIndexedIndirect(he,0):e.drawIndexed(o.indexCount,i?.count),1})(e,l,i)}}};ve&&(Fe._worldCenter=ve);let Te=_._uboVersion;return Fe},Te=t.map(t=>Fe(e,t));return e._pbrGeomContext={_composePbr:ye,_sceneFeatures:we,_envTextures:n??null,_shadowLights:c,_syncThinInstanceBuffers:me,_syncThinInstanceForDraw:de},e._disposables.push(a._pbrCleanup??=()=>{k(),j(a)}),{renderables:Te,rebuildSingle:Fe,_G:C}}function ie(e){return"hemispheric"===e||"directional"===e||"spot"===e?e:"point"}function ce(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 pe(e){return"hemispheric"===e?import("./singlelight-hemispheric-wgsl-rP4CfYTw.esm.min.js"):"directional"===e?import("./singlelight-directional-wgsl-CrFE39B8.esm.min.js"):"spot"===e?import("./singlelight-spot-wgsl-8jqb5Mlu.esm.min.js"):import("./singlelight-point-wgsl-D9YuuPZQ.esm.min.js")}function _e(e,t,n){e[0]=t.environmentIntensity??1,e[1]=t.directIntensity??1,e[2]=t.reflectance??.04,e[3]=t.alpha??1;const r=n._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(n._offsets.has("metallicFactor")){const a=n._offsets.get("metallicFactor")/4;e[a]=t.metallicFactor??1,e[a+1]=t.roughnessFactor??1,e[a+2]=t.normalTextureScale??1,e[a+3]=!1===t.usePhysicalLightFalloff?0:1}for(const r of a().values())r.writeUbo&&r.writeUbo(e,t,n._offsets)}export{_e as _writeMaterialData,le as buildPbrRenderables}; //# sourceMappingURL=pbr-renderable-BR-cc1W5.esm.min.js.map