ac029581775b320365b4a3af65ff2a204f1deae0ff8c380784141e497b249b11.json 36 KB

1
  1. {"ast":null,"code":"import { Effect } from \"./effect.js\";\nimport { RandomGUID } from \"../Misc/guid.js\";\nimport { DrawWrapper } from \"./drawWrapper.js\";\nimport { EngineStore } from \"../Engines/engineStore.js\";\nclass MapMap {\n constructor() {\n this.mm = new Map();\n }\n get(a, b) {\n const m = this.mm.get(a);\n if (m !== undefined) {\n return m.get(b);\n }\n return undefined;\n }\n set(a, b, v) {\n let m = this.mm.get(a);\n if (m === undefined) {\n this.mm.set(a, m = new Map());\n }\n m.set(b, v);\n }\n}\n/**\n * Class that can be used to wrap a base material to generate accurate shadows when using custom vertex/fragment code in the base material\n */\nexport class ShadowDepthWrapper {\n /** Gets the standalone status of the wrapper */\n get standalone() {\n var _this$_options$standa, _this$_options;\n return (_this$_options$standa = (_this$_options = this._options) === null || _this$_options === void 0 ? void 0 : _this$_options.standalone) !== null && _this$_options$standa !== void 0 ? _this$_options$standa : false;\n }\n /** Gets the base material the wrapper is built upon */\n get baseMaterial() {\n return this._baseMaterial;\n }\n /** Gets the doNotInjectCode status of the wrapper */\n get doNotInjectCode() {\n var _this$_options$doNotI, _this$_options2;\n return (_this$_options$doNotI = (_this$_options2 = this._options) === null || _this$_options2 === void 0 ? void 0 : _this$_options2.doNotInjectCode) !== null && _this$_options$doNotI !== void 0 ? _this$_options$doNotI : false;\n }\n /**\n * Instantiate a new shadow depth wrapper.\n * It works by injecting some specific code in the vertex/fragment shaders of the base material and is used by a shadow generator to\n * generate the shadow depth map. For more information, please refer to the documentation:\n * https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows\n * @param baseMaterial Material to wrap\n * @param scene Define the scene the material belongs to\n * @param options Options used to create the wrapper\n */\n constructor(baseMaterial, scene, options) {\n this._baseMaterial = baseMaterial;\n this._scene = scene !== null && scene !== void 0 ? scene : EngineStore.LastCreatedScene;\n this._options = options;\n this._subMeshToEffect = new Map();\n this._subMeshToDepthWrapper = new MapMap();\n this._meshes = new Map();\n // Register for onEffectCreated to store the effect of the base material when it is (re)generated. This effect will be used\n // to create the depth effect later on\n this._onEffectCreatedObserver = this._baseMaterial.onEffectCreatedObservable.add(params => {\n var _params$subMesh, _this$_subMeshToEffec;\n const mesh = (_params$subMesh = params.subMesh) === null || _params$subMesh === void 0 ? void 0 : _params$subMesh.getMesh();\n if (mesh && !this._meshes.has(mesh)) {\n // Register for mesh onDispose to clean up our internal maps when a mesh is disposed\n this._meshes.set(mesh, mesh.onDisposeObservable.add(mesh => {\n const iterator = this._subMeshToEffect.keys();\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\n const subMesh = key.value;\n if ((subMesh === null || subMesh === void 0 ? void 0 : subMesh.getMesh()) === mesh) {\n this._subMeshToEffect.delete(subMesh);\n this._deleteDepthWrapperEffect(subMesh);\n }\n }\n }));\n }\n if (((_this$_subMeshToEffec = this._subMeshToEffect.get(params.subMesh)) === null || _this$_subMeshToEffec === void 0 ? void 0 : _this$_subMeshToEffec[0]) !== params.effect) {\n this._subMeshToEffect.set(params.subMesh, [params.effect, this._scene.getEngine().currentRenderPassId]);\n this._deleteDepthWrapperEffect(params.subMesh);\n }\n });\n }\n _deleteDepthWrapperEffect(subMesh) {\n const depthWrapperEntries = this._subMeshToDepthWrapper.mm.get(subMesh);\n if (depthWrapperEntries) {\n // find and release the previous depth effect\n depthWrapperEntries.forEach(depthWrapper => {\n var _depthWrapper$mainDra;\n (_depthWrapper$mainDra = depthWrapper.mainDrawWrapper.effect) === null || _depthWrapper$mainDra === void 0 || _depthWrapper$mainDra.dispose();\n });\n this._subMeshToDepthWrapper.mm.delete(subMesh); // trigger a depth effect recreation\n }\n }\n /**\n * Gets the effect to use to generate the depth map\n * @param subMesh subMesh to get the effect for\n * @param shadowGenerator shadow generator to get the effect for\n * @param passIdForDrawWrapper Id of the pass for which the effect from the draw wrapper must be retrieved from\n * @returns the effect to use to generate the depth map for the subMesh + shadow generator specified\n */\n getEffect(subMesh, shadowGenerator, passIdForDrawWrapper) {\n var _this$_subMeshToDepth;\n const entry = (_this$_subMeshToDepth = this._subMeshToDepthWrapper.mm.get(subMesh)) === null || _this$_subMeshToDepth === void 0 ? void 0 : _this$_subMeshToDepth.get(shadowGenerator);\n if (!entry) {\n return null;\n }\n let drawWrapper = entry.drawWrapper[passIdForDrawWrapper];\n if (!drawWrapper) {\n drawWrapper = entry.drawWrapper[passIdForDrawWrapper] = new DrawWrapper(this._scene.getEngine());\n drawWrapper.setEffect(entry.mainDrawWrapper.effect, entry.mainDrawWrapper.defines);\n }\n return drawWrapper;\n }\n /**\n * Specifies that the submesh is ready to be used for depth rendering\n * @param subMesh submesh to check\n * @param defines the list of defines to take into account when checking the effect\n * @param shadowGenerator combined with subMesh, it defines the effect to check\n * @param useInstances specifies that instances should be used\n * @param passIdForDrawWrapper Id of the pass for which the draw wrapper should be created\n * @returns a boolean indicating that the submesh is ready or not\n */\n isReadyForSubMesh(subMesh, defines, shadowGenerator, useInstances, passIdForDrawWrapper) {\n var _this$_makeEffect$isR, _this$_makeEffect;\n if (this.standalone) {\n // will ensure the effect is (re)created for the base material\n if (!this._baseMaterial.isReadyForSubMesh(subMesh.getMesh(), subMesh, useInstances)) {\n return false;\n }\n }\n return (_this$_makeEffect$isR = (_this$_makeEffect = this._makeEffect(subMesh, defines, shadowGenerator, passIdForDrawWrapper)) === null || _this$_makeEffect === void 0 ? void 0 : _this$_makeEffect.isReady()) !== null && _this$_makeEffect$isR !== void 0 ? _this$_makeEffect$isR : false;\n }\n /**\n * Disposes the resources\n */\n dispose() {\n this._baseMaterial.onEffectCreatedObservable.remove(this._onEffectCreatedObserver);\n this._onEffectCreatedObserver = null;\n const iterator = this._meshes.entries();\n for (let entry = iterator.next(); entry.done !== true; entry = iterator.next()) {\n const [mesh, observer] = entry.value;\n mesh.onDisposeObservable.remove(observer);\n }\n }\n _makeEffect(subMesh, defines, shadowGenerator, passIdForDrawWrapper) {\n const engine = this._scene.getEngine();\n const origEffectAndRenderPassId = this._subMeshToEffect.get(subMesh);\n if (!origEffectAndRenderPassId) {\n return null;\n }\n const [origEffect, origRenderPassId] = origEffectAndRenderPassId;\n let params = this._subMeshToDepthWrapper.get(subMesh, shadowGenerator);\n if (!params) {\n var _subMesh$_getDrawWrap, _subMesh$_getDrawWrap2;\n const mainDrawWrapper = new DrawWrapper(engine);\n mainDrawWrapper.defines = (_subMesh$_getDrawWrap = (_subMesh$_getDrawWrap2 = subMesh._getDrawWrapper(origRenderPassId)) === null || _subMesh$_getDrawWrap2 === void 0 ? void 0 : _subMesh$_getDrawWrap2.defines) !== null && _subMesh$_getDrawWrap !== void 0 ? _subMesh$_getDrawWrap : null;\n params = {\n drawWrapper: [],\n mainDrawWrapper,\n depthDefines: \"\",\n token: RandomGUID()\n };\n params.drawWrapper[passIdForDrawWrapper] = mainDrawWrapper;\n this._subMeshToDepthWrapper.set(subMesh, shadowGenerator, params);\n }\n const join = defines.join(\"\\n\");\n if (params.mainDrawWrapper.effect) {\n if (join === params.depthDefines) {\n // we already created the depth effect and it is still up to date for this submesh + shadow generator\n return params.mainDrawWrapper.effect;\n }\n }\n params.depthDefines = join;\n const uniforms = origEffect.getUniformNames().slice();\n // the depth effect is either out of date or has not been created yet\n let vertexCode = origEffect.vertexSourceCodeBeforeMigration,\n fragmentCode = origEffect.fragmentSourceCodeBeforeMigration;\n if (!this.doNotInjectCode) {\n // Declare the shadow map includes\n const vertexNormalBiasCode = this._options && this._options.remappedVariables ? `#include<shadowMapVertexNormalBias>(${this._options.remappedVariables.join(\",\")})` : `#include<shadowMapVertexNormalBias>`,\n vertexMetricCode = this._options && this._options.remappedVariables ? `#include<shadowMapVertexMetric>(${this._options.remappedVariables.join(\",\")})` : `#include<shadowMapVertexMetric>`,\n fragmentSoftTransparentShadow = this._options && this._options.remappedVariables ? `#include<shadowMapFragmentSoftTransparentShadow>(${this._options.remappedVariables.join(\",\")})` : `#include<shadowMapFragmentSoftTransparentShadow>`,\n fragmentBlockCode = `#include<shadowMapFragment>`,\n vertexExtraDeclartion = `#include<shadowMapVertexExtraDeclaration>`;\n // vertex code\n if (origEffect.shaderLanguage === 0 /* ShaderLanguage.GLSL */) {\n vertexCode = vertexCode.replace(/void\\s+?main/g, `\\n${vertexExtraDeclartion}\\nvoid main`);\n } else {\n vertexCode = vertexCode.replace(/@vertex/g, `\\n${vertexExtraDeclartion}\\n@vertex`);\n }\n vertexCode = vertexCode.replace(/#define SHADOWDEPTH_NORMALBIAS|#define CUSTOM_VERTEX_UPDATE_WORLDPOS/g, vertexNormalBiasCode);\n if (vertexCode.indexOf(\"#define SHADOWDEPTH_METRIC\") !== -1) {\n vertexCode = vertexCode.replace(/#define SHADOWDEPTH_METRIC/g, vertexMetricCode);\n } else {\n vertexCode = vertexCode.replace(/}\\s*$/g, vertexMetricCode + \"\\n}\");\n }\n vertexCode = vertexCode.replace(/#define SHADER_NAME.*?\\n|out vec4 glFragColor;\\n/g, \"\");\n // fragment code\n const hasLocationForSoftTransparentShadow = fragmentCode.indexOf(\"#define SHADOWDEPTH_SOFTTRANSPARENTSHADOW\") >= 0 || fragmentCode.indexOf(\"#define CUSTOM_FRAGMENT_BEFORE_FOG\") >= 0;\n const hasLocationForFragment = fragmentCode.indexOf(\"#define SHADOWDEPTH_FRAGMENT\") !== -1;\n let fragmentCodeToInjectAtEnd = \"\";\n if (!hasLocationForSoftTransparentShadow) {\n fragmentCodeToInjectAtEnd = fragmentSoftTransparentShadow + \"\\n\";\n } else {\n fragmentCode = fragmentCode.replace(/#define SHADOWDEPTH_SOFTTRANSPARENTSHADOW|#define CUSTOM_FRAGMENT_BEFORE_FOG/g, fragmentSoftTransparentShadow);\n }\n fragmentCode = fragmentCode.replace(/void\\s+?main/g, Effect.IncludesShadersStore[\"shadowMapFragmentExtraDeclaration\"] + \"\\nvoid main\");\n if (hasLocationForFragment) {\n fragmentCode = fragmentCode.replace(/#define SHADOWDEPTH_FRAGMENT/g, fragmentBlockCode);\n } else {\n fragmentCodeToInjectAtEnd += fragmentBlockCode + \"\\n\";\n }\n if (fragmentCodeToInjectAtEnd) {\n fragmentCode = fragmentCode.replace(/}\\s*$/g, fragmentCodeToInjectAtEnd + \"}\");\n }\n uniforms.push(\"biasAndScaleSM\", \"depthValuesSM\", \"lightDataSM\", \"softTransparentShadowSM\");\n }\n params.mainDrawWrapper.effect = engine.createEffect({\n vertexSource: vertexCode,\n fragmentSource: fragmentCode,\n vertexToken: params.token,\n fragmentToken: params.token\n }, {\n attributes: origEffect.getAttributesNames(),\n uniformsNames: uniforms,\n uniformBuffersNames: origEffect.getUniformBuffersNames(),\n samplers: origEffect.getSamplers(),\n defines: join + \"\\n\" + origEffect.defines.replace(\"#define SHADOWS\", \"\").replace(/#define SHADOW\\d/g, \"\"),\n indexParameters: origEffect.getIndexParameters(),\n shaderLanguage: origEffect.shaderLanguage\n }, engine);\n for (let id = 0; id < params.drawWrapper.length; ++id) {\n if (id !== passIdForDrawWrapper) {\n var _params$drawWrapper$i;\n (_params$drawWrapper$i = params.drawWrapper[id]) === null || _params$drawWrapper$i === void 0 || _params$drawWrapper$i.setEffect(params.mainDrawWrapper.effect, params.mainDrawWrapper.defines);\n }\n }\n return params.mainDrawWrapper.effect;\n }\n}","map":{"version":3,"names":["Effect","RandomGUID","DrawWrapper","EngineStore","MapMap","constructor","mm","Map","get","a","b","m","undefined","set","v","ShadowDepthWrapper","standalone","_this$_options$standa","_this$_options","_options","baseMaterial","_baseMaterial","doNotInjectCode","_this$_options$doNotI","_this$_options2","scene","options","_scene","LastCreatedScene","_subMeshToEffect","_subMeshToDepthWrapper","_meshes","_onEffectCreatedObserver","onEffectCreatedObservable","add","params","_params$subMesh","_this$_subMeshToEffec","mesh","subMesh","getMesh","has","onDisposeObservable","iterator","keys","key","next","done","value","delete","_deleteDepthWrapperEffect","effect","getEngine","currentRenderPassId","depthWrapperEntries","forEach","depthWrapper","_depthWrapper$mainDra","mainDrawWrapper","dispose","getEffect","shadowGenerator","passIdForDrawWrapper","_this$_subMeshToDepth","entry","drawWrapper","setEffect","defines","isReadyForSubMesh","useInstances","_this$_makeEffect$isR","_this$_makeEffect","_makeEffect","isReady","remove","entries","observer","engine","origEffectAndRenderPassId","origEffect","origRenderPassId","_subMesh$_getDrawWrap","_subMesh$_getDrawWrap2","_getDrawWrapper","depthDefines","token","join","uniforms","getUniformNames","slice","vertexCode","vertexSourceCodeBeforeMigration","fragmentCode","fragmentSourceCodeBeforeMigration","vertexNormalBiasCode","remappedVariables","vertexMetricCode","fragmentSoftTransparentShadow","fragmentBlockCode","vertexExtraDeclartion","shaderLanguage","replace","indexOf","hasLocationForSoftTransparentShadow","hasLocationForFragment","fragmentCodeToInjectAtEnd","IncludesShadersStore","push","createEffect","vertexSource","fragmentSource","vertexToken","fragmentToken","attributes","getAttributesNames","uniformsNames","uniformBuffersNames","getUniformBuffersNames","samplers","getSamplers","indexParameters","getIndexParameters","id","length","_params$drawWrapper$i"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/Materials/shadowDepthWrapper.js"],"sourcesContent":["import { Effect } from \"./effect.js\";\nimport { RandomGUID } from \"../Misc/guid.js\";\nimport { DrawWrapper } from \"./drawWrapper.js\";\nimport { EngineStore } from \"../Engines/engineStore.js\";\nclass MapMap {\n constructor() {\n this.mm = new Map();\n }\n get(a, b) {\n const m = this.mm.get(a);\n if (m !== undefined) {\n return m.get(b);\n }\n return undefined;\n }\n set(a, b, v) {\n let m = this.mm.get(a);\n if (m === undefined) {\n this.mm.set(a, (m = new Map()));\n }\n m.set(b, v);\n }\n}\n/**\n * Class that can be used to wrap a base material to generate accurate shadows when using custom vertex/fragment code in the base material\n */\nexport class ShadowDepthWrapper {\n /** Gets the standalone status of the wrapper */\n get standalone() {\n return this._options?.standalone ?? false;\n }\n /** Gets the base material the wrapper is built upon */\n get baseMaterial() {\n return this._baseMaterial;\n }\n /** Gets the doNotInjectCode status of the wrapper */\n get doNotInjectCode() {\n return this._options?.doNotInjectCode ?? false;\n }\n /**\n * Instantiate a new shadow depth wrapper.\n * It works by injecting some specific code in the vertex/fragment shaders of the base material and is used by a shadow generator to\n * generate the shadow depth map. For more information, please refer to the documentation:\n * https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows\n * @param baseMaterial Material to wrap\n * @param scene Define the scene the material belongs to\n * @param options Options used to create the wrapper\n */\n constructor(baseMaterial, scene, options) {\n this._baseMaterial = baseMaterial;\n this._scene = scene ?? EngineStore.LastCreatedScene;\n this._options = options;\n this._subMeshToEffect = new Map();\n this._subMeshToDepthWrapper = new MapMap();\n this._meshes = new Map();\n // Register for onEffectCreated to store the effect of the base material when it is (re)generated. This effect will be used\n // to create the depth effect later on\n this._onEffectCreatedObserver = this._baseMaterial.onEffectCreatedObservable.add((params) => {\n const mesh = params.subMesh?.getMesh();\n if (mesh && !this._meshes.has(mesh)) {\n // Register for mesh onDispose to clean up our internal maps when a mesh is disposed\n this._meshes.set(mesh, mesh.onDisposeObservable.add((mesh) => {\n const iterator = this._subMeshToEffect.keys();\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\n const subMesh = key.value;\n if (subMesh?.getMesh() === mesh) {\n this._subMeshToEffect.delete(subMesh);\n this._deleteDepthWrapperEffect(subMesh);\n }\n }\n }));\n }\n if (this._subMeshToEffect.get(params.subMesh)?.[0] !== params.effect) {\n this._subMeshToEffect.set(params.subMesh, [params.effect, this._scene.getEngine().currentRenderPassId]);\n this._deleteDepthWrapperEffect(params.subMesh);\n }\n });\n }\n _deleteDepthWrapperEffect(subMesh) {\n const depthWrapperEntries = this._subMeshToDepthWrapper.mm.get(subMesh);\n if (depthWrapperEntries) {\n // find and release the previous depth effect\n depthWrapperEntries.forEach((depthWrapper) => {\n depthWrapper.mainDrawWrapper.effect?.dispose();\n });\n this._subMeshToDepthWrapper.mm.delete(subMesh); // trigger a depth effect recreation\n }\n }\n /**\n * Gets the effect to use to generate the depth map\n * @param subMesh subMesh to get the effect for\n * @param shadowGenerator shadow generator to get the effect for\n * @param passIdForDrawWrapper Id of the pass for which the effect from the draw wrapper must be retrieved from\n * @returns the effect to use to generate the depth map for the subMesh + shadow generator specified\n */\n getEffect(subMesh, shadowGenerator, passIdForDrawWrapper) {\n const entry = this._subMeshToDepthWrapper.mm.get(subMesh)?.get(shadowGenerator);\n if (!entry) {\n return null;\n }\n let drawWrapper = entry.drawWrapper[passIdForDrawWrapper];\n if (!drawWrapper) {\n drawWrapper = entry.drawWrapper[passIdForDrawWrapper] = new DrawWrapper(this._scene.getEngine());\n drawWrapper.setEffect(entry.mainDrawWrapper.effect, entry.mainDrawWrapper.defines);\n }\n return drawWrapper;\n }\n /**\n * Specifies that the submesh is ready to be used for depth rendering\n * @param subMesh submesh to check\n * @param defines the list of defines to take into account when checking the effect\n * @param shadowGenerator combined with subMesh, it defines the effect to check\n * @param useInstances specifies that instances should be used\n * @param passIdForDrawWrapper Id of the pass for which the draw wrapper should be created\n * @returns a boolean indicating that the submesh is ready or not\n */\n isReadyForSubMesh(subMesh, defines, shadowGenerator, useInstances, passIdForDrawWrapper) {\n if (this.standalone) {\n // will ensure the effect is (re)created for the base material\n if (!this._baseMaterial.isReadyForSubMesh(subMesh.getMesh(), subMesh, useInstances)) {\n return false;\n }\n }\n return this._makeEffect(subMesh, defines, shadowGenerator, passIdForDrawWrapper)?.isReady() ?? false;\n }\n /**\n * Disposes the resources\n */\n dispose() {\n this._baseMaterial.onEffectCreatedObservable.remove(this._onEffectCreatedObserver);\n this._onEffectCreatedObserver = null;\n const iterator = this._meshes.entries();\n for (let entry = iterator.next(); entry.done !== true; entry = iterator.next()) {\n const [mesh, observer] = entry.value;\n mesh.onDisposeObservable.remove(observer);\n }\n }\n _makeEffect(subMesh, defines, shadowGenerator, passIdForDrawWrapper) {\n const engine = this._scene.getEngine();\n const origEffectAndRenderPassId = this._subMeshToEffect.get(subMesh);\n if (!origEffectAndRenderPassId) {\n return null;\n }\n const [origEffect, origRenderPassId] = origEffectAndRenderPassId;\n let params = this._subMeshToDepthWrapper.get(subMesh, shadowGenerator);\n if (!params) {\n const mainDrawWrapper = new DrawWrapper(engine);\n mainDrawWrapper.defines = subMesh._getDrawWrapper(origRenderPassId)?.defines ?? null;\n params = {\n drawWrapper: [],\n mainDrawWrapper,\n depthDefines: \"\",\n token: RandomGUID(),\n };\n params.drawWrapper[passIdForDrawWrapper] = mainDrawWrapper;\n this._subMeshToDepthWrapper.set(subMesh, shadowGenerator, params);\n }\n const join = defines.join(\"\\n\");\n if (params.mainDrawWrapper.effect) {\n if (join === params.depthDefines) {\n // we already created the depth effect and it is still up to date for this submesh + shadow generator\n return params.mainDrawWrapper.effect;\n }\n }\n params.depthDefines = join;\n const uniforms = origEffect.getUniformNames().slice();\n // the depth effect is either out of date or has not been created yet\n let vertexCode = origEffect.vertexSourceCodeBeforeMigration, fragmentCode = origEffect.fragmentSourceCodeBeforeMigration;\n if (!this.doNotInjectCode) {\n // Declare the shadow map includes\n const vertexNormalBiasCode = this._options && this._options.remappedVariables\n ? `#include<shadowMapVertexNormalBias>(${this._options.remappedVariables.join(\",\")})`\n : `#include<shadowMapVertexNormalBias>`, vertexMetricCode = this._options && this._options.remappedVariables\n ? `#include<shadowMapVertexMetric>(${this._options.remappedVariables.join(\",\")})`\n : `#include<shadowMapVertexMetric>`, fragmentSoftTransparentShadow = this._options && this._options.remappedVariables\n ? `#include<shadowMapFragmentSoftTransparentShadow>(${this._options.remappedVariables.join(\",\")})`\n : `#include<shadowMapFragmentSoftTransparentShadow>`, fragmentBlockCode = `#include<shadowMapFragment>`, vertexExtraDeclartion = `#include<shadowMapVertexExtraDeclaration>`;\n // vertex code\n if (origEffect.shaderLanguage === 0 /* ShaderLanguage.GLSL */) {\n vertexCode = vertexCode.replace(/void\\s+?main/g, `\\n${vertexExtraDeclartion}\\nvoid main`);\n }\n else {\n vertexCode = vertexCode.replace(/@vertex/g, `\\n${vertexExtraDeclartion}\\n@vertex`);\n }\n vertexCode = vertexCode.replace(/#define SHADOWDEPTH_NORMALBIAS|#define CUSTOM_VERTEX_UPDATE_WORLDPOS/g, vertexNormalBiasCode);\n if (vertexCode.indexOf(\"#define SHADOWDEPTH_METRIC\") !== -1) {\n vertexCode = vertexCode.replace(/#define SHADOWDEPTH_METRIC/g, vertexMetricCode);\n }\n else {\n vertexCode = vertexCode.replace(/}\\s*$/g, vertexMetricCode + \"\\n}\");\n }\n vertexCode = vertexCode.replace(/#define SHADER_NAME.*?\\n|out vec4 glFragColor;\\n/g, \"\");\n // fragment code\n const hasLocationForSoftTransparentShadow = fragmentCode.indexOf(\"#define SHADOWDEPTH_SOFTTRANSPARENTSHADOW\") >= 0 || fragmentCode.indexOf(\"#define CUSTOM_FRAGMENT_BEFORE_FOG\") >= 0;\n const hasLocationForFragment = fragmentCode.indexOf(\"#define SHADOWDEPTH_FRAGMENT\") !== -1;\n let fragmentCodeToInjectAtEnd = \"\";\n if (!hasLocationForSoftTransparentShadow) {\n fragmentCodeToInjectAtEnd = fragmentSoftTransparentShadow + \"\\n\";\n }\n else {\n fragmentCode = fragmentCode.replace(/#define SHADOWDEPTH_SOFTTRANSPARENTSHADOW|#define CUSTOM_FRAGMENT_BEFORE_FOG/g, fragmentSoftTransparentShadow);\n }\n fragmentCode = fragmentCode.replace(/void\\s+?main/g, Effect.IncludesShadersStore[\"shadowMapFragmentExtraDeclaration\"] + \"\\nvoid main\");\n if (hasLocationForFragment) {\n fragmentCode = fragmentCode.replace(/#define SHADOWDEPTH_FRAGMENT/g, fragmentBlockCode);\n }\n else {\n fragmentCodeToInjectAtEnd += fragmentBlockCode + \"\\n\";\n }\n if (fragmentCodeToInjectAtEnd) {\n fragmentCode = fragmentCode.replace(/}\\s*$/g, fragmentCodeToInjectAtEnd + \"}\");\n }\n uniforms.push(\"biasAndScaleSM\", \"depthValuesSM\", \"lightDataSM\", \"softTransparentShadowSM\");\n }\n params.mainDrawWrapper.effect = engine.createEffect({\n vertexSource: vertexCode,\n fragmentSource: fragmentCode,\n vertexToken: params.token,\n fragmentToken: params.token,\n }, {\n attributes: origEffect.getAttributesNames(),\n uniformsNames: uniforms,\n uniformBuffersNames: origEffect.getUniformBuffersNames(),\n samplers: origEffect.getSamplers(),\n defines: join + \"\\n\" + origEffect.defines.replace(\"#define SHADOWS\", \"\").replace(/#define SHADOW\\d/g, \"\"),\n indexParameters: origEffect.getIndexParameters(),\n shaderLanguage: origEffect.shaderLanguage,\n }, engine);\n for (let id = 0; id < params.drawWrapper.length; ++id) {\n if (id !== passIdForDrawWrapper) {\n params.drawWrapper[id]?.setEffect(params.mainDrawWrapper.effect, params.mainDrawWrapper.defines);\n }\n }\n return params.mainDrawWrapper.effect;\n }\n}\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}