@babylonjs/core 5.40.0 → 5.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/Debug/physicsViewer.d.ts +13 -1
  2. package/Debug/physicsViewer.js +45 -0
  3. package/Debug/physicsViewer.js.map +1 -1
  4. package/Engines/thinEngine.js +2 -2
  5. package/Engines/thinEngine.js.map +1 -1
  6. package/Gizmos/axisDragGizmo.d.ts +13 -1
  7. package/Gizmos/axisDragGizmo.js +22 -12
  8. package/Gizmos/axisDragGizmo.js.map +1 -1
  9. package/Gizmos/axisScaleGizmo.d.ts +13 -4
  10. package/Gizmos/axisScaleGizmo.js +23 -15
  11. package/Gizmos/axisScaleGizmo.js.map +1 -1
  12. package/Gizmos/boundingBoxGizmo.d.ts +8 -3
  13. package/Gizmos/boundingBoxGizmo.js +35 -30
  14. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  15. package/Gizmos/gizmo.d.ts +1 -1
  16. package/Gizmos/gizmo.js +3 -3
  17. package/Gizmos/gizmo.js.map +1 -1
  18. package/Gizmos/planeDragGizmo.d.ts +12 -0
  19. package/Gizmos/planeDragGizmo.js +12 -0
  20. package/Gizmos/planeDragGizmo.js.map +1 -1
  21. package/Gizmos/planeRotationGizmo.d.ts +12 -0
  22. package/Gizmos/planeRotationGizmo.js +12 -0
  23. package/Gizmos/planeRotationGizmo.js.map +1 -1
  24. package/Gizmos/scaleGizmo.d.ts +12 -0
  25. package/Gizmos/scaleGizmo.js +12 -0
  26. package/Gizmos/scaleGizmo.js.map +1 -1
  27. package/Materials/Textures/baseTexture.d.ts +2 -0
  28. package/Materials/Textures/baseTexture.js.map +1 -1
  29. package/Materials/material.d.ts +2 -0
  30. package/Materials/material.js.map +1 -1
  31. package/Materials/shadowDepthWrapper.js +0 -1
  32. package/Materials/shadowDepthWrapper.js.map +1 -1
  33. package/Misc/assetsManager.d.ts +1 -1
  34. package/Misc/assetsManager.js +1 -1
  35. package/Misc/assetsManager.js.map +1 -1
  36. package/Physics/IPhysicsEngine.d.ts +1 -1
  37. package/Physics/IPhysicsEngine.js.map +1 -1
  38. package/Physics/physicsEngineComponent.d.ts +1 -1
  39. package/Physics/physicsEngineComponent.js.map +1 -1
  40. package/Physics/v2/IPhysicsEnginePlugin.d.ts +8 -4
  41. package/Physics/v2/IPhysicsEnginePlugin.js +1 -0
  42. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  43. package/Physics/v2/physicsBody.d.ts +11 -1
  44. package/Physics/v2/physicsBody.js +23 -2
  45. package/Physics/v2/physicsBody.js.map +1 -1
  46. package/Physics/v2/physicsConstraint.d.ts +2 -2
  47. package/Physics/v2/physicsConstraint.js.map +1 -1
  48. package/Physics/v2/physicsEngine.d.ts +19 -8
  49. package/Physics/v2/physicsEngine.js +23 -8
  50. package/Physics/v2/physicsEngine.js.map +1 -1
  51. package/Physics/v2/physicsMaterial.d.ts +2 -2
  52. package/Physics/v2/physicsMaterial.js.map +1 -1
  53. package/Physics/v2/physicsShape.d.ts +1 -1
  54. package/Physics/v2/physicsShape.js +3 -3
  55. package/Physics/v2/physicsShape.js.map +1 -1
  56. package/XR/features/WebXRControllerTeleportation.js +2 -0
  57. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  58. package/node.d.ts +2 -0
  59. package/node.js.map +1 -1
  60. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"material.js","sourceRoot":"","sources":["../../../../lts/core/generated/Materials/material.ts"],"names":[],"mappings":"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","sourcesContent":["import { serialize, SerializationHelper } from \"../Misc/decorators\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport type { SmartArray } from \"../Misc/smartArray\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Matrix } from \"../Maths/math.vector\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { Geometry } from \"../Meshes/geometry\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { Effect } from \"./effect\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { IInspectable } from \"../Misc/iInspectable\";\r\nimport { Plane } from \"../Maths/math.plane\";\r\nimport type { ShadowDepthWrapper } from \"./shadowDepthWrapper\";\r\nimport { MaterialHelper } from \"./materialHelper\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\nimport { DrawWrapper } from \"./drawWrapper\";\r\nimport { MaterialStencilState } from \"./materialStencilState\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport type {\r\n MaterialPluginDisposed,\r\n MaterialPluginIsReadyForSubMesh,\r\n MaterialPluginGetDefineNames,\r\n MaterialPluginBindForSubMesh,\r\n MaterialPluginGetActiveTextures,\r\n MaterialPluginHasTexture,\r\n MaterialPluginGetAnimatables,\r\n MaterialPluginPrepareDefines,\r\n MaterialPluginPrepareEffect,\r\n MaterialPluginPrepareUniformBuffer,\r\n MaterialPluginCreated,\r\n MaterialPluginFillRenderTargetTextures,\r\n MaterialPluginHasRenderTargetTextures,\r\n MaterialPluginHardBindForSubMesh,\r\n} from \"./materialPluginEvent\";\r\nimport { MaterialPluginEvent } from \"./materialPluginEvent\";\r\nimport type { ShaderCustomProcessingFunction } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { IClipPlanesHolder } from \"../Misc/interfaces/iClipPlanesHolder\";\r\n\r\ndeclare type PrePassRenderer = import(\"../Rendering/prePassRenderer\").PrePassRenderer;\r\ndeclare type Mesh = import(\"../Meshes/mesh\").Mesh;\r\ndeclare type Animation = import(\"../Animations/animation\").Animation;\r\ndeclare type InstancedMesh = import(\"../Meshes/instancedMesh\").InstancedMesh;\r\n\r\ndeclare let BABYLON: any;\r\n\r\n/**\r\n * Options for compiling materials.\r\n */\r\nexport interface IMaterialCompilationOptions {\r\n /**\r\n * Defines whether clip planes are enabled.\r\n */\r\n clipPlane: boolean;\r\n\r\n /**\r\n * Defines whether instances are enabled.\r\n */\r\n useInstances: boolean;\r\n}\r\n\r\n/**\r\n * Options passed when calling customShaderNameResolve\r\n */\r\nexport interface ICustomShaderNameResolveOptions {\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: Nullable<ShaderCustomProcessingFunction>;\r\n}\r\n\r\n/**\r\n * Base class for the main features of a material in Babylon.js\r\n */\r\nexport class Material implements IAnimatable, IClipPlanesHolder {\r\n /**\r\n * Returns the triangle fill mode\r\n */\r\n public static readonly TriangleFillMode = Constants.MATERIAL_TriangleFillMode;\r\n /**\r\n * Returns the wireframe mode\r\n */\r\n public static readonly WireFrameFillMode = Constants.MATERIAL_WireFrameFillMode;\r\n /**\r\n * Returns the point fill mode\r\n */\r\n public static readonly PointFillMode = Constants.MATERIAL_PointFillMode;\r\n /**\r\n * Returns the point list draw mode\r\n */\r\n public static readonly PointListDrawMode = Constants.MATERIAL_PointListDrawMode;\r\n /**\r\n * Returns the line list draw mode\r\n */\r\n public static readonly LineListDrawMode = Constants.MATERIAL_LineListDrawMode;\r\n /**\r\n * Returns the line loop draw mode\r\n */\r\n public static readonly LineLoopDrawMode = Constants.MATERIAL_LineLoopDrawMode;\r\n /**\r\n * Returns the line strip draw mode\r\n */\r\n public static readonly LineStripDrawMode = Constants.MATERIAL_LineStripDrawMode;\r\n /**\r\n * Returns the triangle strip draw mode\r\n */\r\n public static readonly TriangleStripDrawMode = Constants.MATERIAL_TriangleStripDrawMode;\r\n /**\r\n * Returns the triangle fan draw mode\r\n */\r\n public static readonly TriangleFanDrawMode = Constants.MATERIAL_TriangleFanDrawMode;\r\n\r\n /**\r\n * Stores the clock-wise side orientation\r\n */\r\n public static readonly ClockWiseSideOrientation = Constants.MATERIAL_ClockWiseSideOrientation;\r\n\r\n /**\r\n * Stores the counter clock-wise side orientation\r\n */\r\n public static readonly CounterClockWiseSideOrientation = Constants.MATERIAL_CounterClockWiseSideOrientation;\r\n\r\n /**\r\n * The dirty texture flag value\r\n */\r\n public static readonly TextureDirtyFlag = Constants.MATERIAL_TextureDirtyFlag;\r\n\r\n /**\r\n * The dirty light flag value\r\n */\r\n public static readonly LightDirtyFlag = Constants.MATERIAL_LightDirtyFlag;\r\n\r\n /**\r\n * The dirty fresnel flag value\r\n */\r\n public static readonly FresnelDirtyFlag = Constants.MATERIAL_FresnelDirtyFlag;\r\n\r\n /**\r\n * The dirty attribute flag value\r\n */\r\n public static readonly AttributesDirtyFlag = Constants.MATERIAL_AttributesDirtyFlag;\r\n\r\n /**\r\n * The dirty misc flag value\r\n */\r\n public static readonly MiscDirtyFlag = Constants.MATERIAL_MiscDirtyFlag;\r\n\r\n /**\r\n * The dirty prepass flag value\r\n */\r\n public static readonly PrePassDirtyFlag = Constants.MATERIAL_PrePassDirtyFlag;\r\n\r\n /**\r\n * The all dirty flag value\r\n */\r\n public static readonly AllDirtyFlag = Constants.MATERIAL_AllDirtyFlag;\r\n\r\n /**\r\n * MaterialTransparencyMode: No transparency mode, Alpha channel is not use.\r\n */\r\n public static readonly MATERIAL_OPAQUE = 0;\r\n\r\n /**\r\n * MaterialTransparencyMode: Alpha Test mode, pixel are discarded below a certain threshold defined by the alpha cutoff value.\r\n */\r\n public static readonly MATERIAL_ALPHATEST = 1;\r\n\r\n /**\r\n * MaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.\r\n */\r\n public static readonly MATERIAL_ALPHABLEND = 2;\r\n\r\n /**\r\n * MaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.\r\n * They are also discarded below the alpha cutoff threshold to improve performances.\r\n */\r\n public static readonly MATERIAL_ALPHATESTANDBLEND = 3;\r\n\r\n /**\r\n * The Whiteout method is used to blend normals.\r\n * Details of the algorithm can be found here: https://blog.selfshadow.com/publications/blending-in-detail/\r\n */\r\n public static readonly MATERIAL_NORMALBLENDMETHOD_WHITEOUT = 0;\r\n\r\n /**\r\n * The Reoriented Normal Mapping method is used to blend normals.\r\n * Details of the algorithm can be found here: https://blog.selfshadow.com/publications/blending-in-detail/\r\n */\r\n public static readonly MATERIAL_NORMALBLENDMETHOD_RNM = 1;\r\n\r\n /**\r\n * Event observable which raises global events common to all materials (like MaterialPluginEvent.Created)\r\n */\r\n public static OnEventObservable = new Observable<Material>();\r\n\r\n /**\r\n * Custom callback helping to override the default shader used in the material.\r\n */\r\n public customShaderNameResolve: (\r\n shaderName: string,\r\n uniforms: string[],\r\n uniformBuffers: string[],\r\n samplers: string[],\r\n defines: MaterialDefines | string[],\r\n attributes?: string[],\r\n options?: ICustomShaderNameResolveOptions\r\n ) => string;\r\n\r\n /**\r\n * Custom shadow depth material to use for shadow rendering instead of the in-built one\r\n */\r\n public shadowDepthWrapper: Nullable<ShadowDepthWrapper> = null;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the material is allowed (if supported) to do shader hot swapping.\r\n * This means that the material can keep using a previous shader while a new one is being compiled.\r\n * This is mostly used when shader parallel compilation is supported (true by default)\r\n */\r\n public allowShaderHotSwapping = true;\r\n\r\n /**\r\n * The ID of the material\r\n */\r\n @serialize()\r\n public id: string;\r\n\r\n /**\r\n * Gets or sets the unique id of the material\r\n */\r\n @serialize()\r\n public uniqueId: number;\r\n\r\n /** @internal */\r\n public _loadedUniqueId: string;\r\n\r\n /**\r\n * The name of the material\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Gets or sets user defined metadata\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /**\r\n * For internal use only. Please do not use.\r\n */\r\n public reservedDataStore: any = null;\r\n\r\n /**\r\n * Specifies if the ready state should be checked on each call\r\n */\r\n @serialize()\r\n public checkReadyOnEveryCall = false;\r\n\r\n /**\r\n * Specifies if the ready state should be checked once\r\n */\r\n @serialize()\r\n public checkReadyOnlyOnce = false;\r\n\r\n /**\r\n * The state of the material\r\n */\r\n @serialize()\r\n public state = \"\";\r\n\r\n /**\r\n * If the material can be rendered to several textures with MRT extension\r\n */\r\n public get canRenderToMRT(): boolean {\r\n // By default, shaders are not compatible with MRTs\r\n // Base classes should override that if their shader supports MRT\r\n return false;\r\n }\r\n\r\n /**\r\n * The alpha value of the material\r\n */\r\n @serialize(\"alpha\")\r\n protected _alpha = 1.0;\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility\r\n */\r\n public inspectableCustomProperties: IInspectable[];\r\n\r\n /**\r\n * Sets the alpha value of the material\r\n */\r\n public set alpha(value: number) {\r\n if (this._alpha === value) {\r\n return;\r\n }\r\n\r\n const oldValue = this._alpha;\r\n this._alpha = value;\r\n\r\n // Only call dirty when there is a state change (no alpha / alpha)\r\n if (oldValue === 1 || value === 1) {\r\n this.markAsDirty(Material.MiscDirtyFlag);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the alpha value of the material\r\n */\r\n public get alpha(): number {\r\n return this._alpha;\r\n }\r\n\r\n /**\r\n * Specifies if back face culling is enabled\r\n */\r\n @serialize(\"backFaceCulling\")\r\n protected _backFaceCulling = true;\r\n\r\n /**\r\n * Sets the culling state (true to enable culling, false to disable)\r\n */\r\n public set backFaceCulling(value: boolean) {\r\n if (this._backFaceCulling === value) {\r\n return;\r\n }\r\n this._backFaceCulling = value;\r\n this.markAsDirty(Material.TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the culling state\r\n */\r\n public get backFaceCulling(): boolean {\r\n return this._backFaceCulling;\r\n }\r\n\r\n /**\r\n * Specifies if back or front faces should be culled (when culling is enabled)\r\n */\r\n @serialize(\"cullBackFaces\")\r\n protected _cullBackFaces = true;\r\n\r\n /**\r\n * Sets the type of faces that should be culled (true for back faces, false for front faces)\r\n */\r\n public set cullBackFaces(value: boolean) {\r\n if (this._cullBackFaces === value) {\r\n return;\r\n }\r\n this._cullBackFaces = value;\r\n this.markAsDirty(Material.TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the type of faces that should be culled\r\n */\r\n public get cullBackFaces(): boolean {\r\n return this._cullBackFaces;\r\n }\r\n\r\n private _blockDirtyMechanism = false;\r\n\r\n /**\r\n * Block the dirty-mechanism for this specific material\r\n * When set to false after being true the material will be marked as dirty.\r\n */\r\n public get blockDirtyMechanism(): boolean {\r\n return this._blockDirtyMechanism;\r\n }\r\n\r\n public set blockDirtyMechanism(value: boolean) {\r\n if (this._blockDirtyMechanism === value) {\r\n return;\r\n }\r\n\r\n this._blockDirtyMechanism = value;\r\n\r\n if (!value) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * This allows you to modify the material without marking it as dirty after every change.\r\n * This function should be used if you need to make more than one dirty-enabling change to the material - adding a texture, setting a new fill mode and so on.\r\n * The callback will pass the material as an argument, so you can make your changes to it.\r\n * @param callback the callback to be executed that will update the material\r\n */\r\n public atomicMaterialsUpdate(callback: (material: this) => void): void {\r\n this.blockDirtyMechanism = true;\r\n try {\r\n callback(this);\r\n } finally {\r\n this.blockDirtyMechanism = false;\r\n }\r\n }\r\n\r\n /**\r\n * Stores the value for side orientation\r\n */\r\n @serialize()\r\n public sideOrientation: number;\r\n\r\n /**\r\n * Callback triggered when the material is compiled\r\n */\r\n public onCompiled: Nullable<(effect: Effect) => void> = null;\r\n\r\n /**\r\n * Callback triggered when an error occurs\r\n */\r\n public onError: Nullable<(effect: Effect, errors: string) => void> = null;\r\n\r\n /**\r\n * Callback triggered to get the render target textures\r\n */\r\n public getRenderTargetTextures: Nullable<() => SmartArray<RenderTargetTexture>> = null;\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public get hasRenderTargetTextures(): boolean {\r\n this._eventInfo.hasRenderTargetTextures = false;\r\n this._callbackPluginEventHasRenderTargetTextures(this._eventInfo);\r\n return this._eventInfo.hasRenderTargetTextures;\r\n }\r\n\r\n /**\r\n * Specifies if the material should be serialized\r\n */\r\n public doNotSerialize = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _storeEffectOnSubMeshes = false;\r\n\r\n /**\r\n * Stores the animations for the material\r\n */\r\n public animations: Nullable<Array<Animation>> = null;\r\n\r\n /**\r\n * An event triggered when the material is disposed\r\n */\r\n public onDisposeObservable = new Observable<Material>();\r\n\r\n /**\r\n * An observer which watches for dispose events\r\n */\r\n private _onDisposeObserver: Nullable<Observer<Material>> = null;\r\n private _onUnBindObservable: Nullable<Observable<Material>> = null;\r\n\r\n /**\r\n * Called during a dispose event\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n private _onBindObservable: Nullable<Observable<AbstractMesh>>;\r\n\r\n /**\r\n * An event triggered when the material is bound\r\n */\r\n public get onBindObservable(): Observable<AbstractMesh> {\r\n if (!this._onBindObservable) {\r\n this._onBindObservable = new Observable<AbstractMesh>();\r\n }\r\n\r\n return this._onBindObservable;\r\n }\r\n\r\n /**\r\n * An observer which watches for bind events\r\n */\r\n private _onBindObserver: Nullable<Observer<AbstractMesh>> = null;\r\n\r\n /**\r\n * Called during a bind event\r\n */\r\n public set onBind(callback: (Mesh: AbstractMesh) => void) {\r\n if (this._onBindObserver) {\r\n this.onBindObservable.remove(this._onBindObserver);\r\n }\r\n this._onBindObserver = this.onBindObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the material is unbound\r\n */\r\n public get onUnBindObservable(): Observable<Material> {\r\n if (!this._onUnBindObservable) {\r\n this._onUnBindObservable = new Observable<Material>();\r\n }\r\n\r\n return this._onUnBindObservable;\r\n }\r\n\r\n protected _onEffectCreatedObservable: Nullable<Observable<{ effect: Effect; subMesh: Nullable<SubMesh> }>>;\r\n\r\n /**\r\n * An event triggered when the effect is (re)created\r\n */\r\n public get onEffectCreatedObservable(): Observable<{ effect: Effect; subMesh: Nullable<SubMesh> }> {\r\n if (!this._onEffectCreatedObservable) {\r\n this._onEffectCreatedObservable = new Observable<{ effect: Effect; subMesh: Nullable<SubMesh> }>();\r\n }\r\n\r\n return this._onEffectCreatedObservable;\r\n }\r\n\r\n /**\r\n * Stores the value of the alpha mode\r\n */\r\n @serialize(\"alphaMode\")\r\n private _alphaMode: number = Constants.ALPHA_COMBINE;\r\n\r\n /**\r\n * Sets the value of the alpha mode.\r\n *\r\n * | Value | Type | Description |\r\n * | --- | --- | --- |\r\n * | 0 | ALPHA_DISABLE | |\r\n * | 1 | ALPHA_ADD | |\r\n * | 2 | ALPHA_COMBINE | |\r\n * | 3 | ALPHA_SUBTRACT | |\r\n * | 4 | ALPHA_MULTIPLY | |\r\n * | 5 | ALPHA_MAXIMIZED | |\r\n * | 6 | ALPHA_ONEONE | |\r\n * | 7 | ALPHA_PREMULTIPLIED | |\r\n * | 8 | ALPHA_PREMULTIPLIED_PORTERDUFF | |\r\n * | 9 | ALPHA_INTERPOLATE | |\r\n * | 10 | ALPHA_SCREENMODE | |\r\n *\r\n */\r\n public set alphaMode(value: number) {\r\n if (this._alphaMode === value) {\r\n return;\r\n }\r\n this._alphaMode = value;\r\n this.markAsDirty(Material.TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the value of the alpha mode\r\n */\r\n public get alphaMode(): number {\r\n return this._alphaMode;\r\n }\r\n\r\n /**\r\n * Stores the state of the need depth pre-pass value\r\n */\r\n @serialize()\r\n private _needDepthPrePass = false;\r\n\r\n /**\r\n * Sets the need depth pre-pass value\r\n */\r\n public set needDepthPrePass(value: boolean) {\r\n if (this._needDepthPrePass === value) {\r\n return;\r\n }\r\n this._needDepthPrePass = value;\r\n if (this._needDepthPrePass) {\r\n this.checkReadyOnEveryCall = true;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the depth pre-pass value\r\n */\r\n public get needDepthPrePass(): boolean {\r\n return this._needDepthPrePass;\r\n }\r\n\r\n /**\r\n * Can this material render to prepass\r\n */\r\n public get isPrePassCapable(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies if depth writing should be disabled\r\n */\r\n @serialize()\r\n public disableDepthWrite = false;\r\n\r\n /**\r\n * Specifies if color writing should be disabled\r\n */\r\n @serialize()\r\n public disableColorWrite = false;\r\n\r\n /**\r\n * Specifies if depth writing should be forced\r\n */\r\n @serialize()\r\n public forceDepthWrite = false;\r\n\r\n /**\r\n * Specifies the depth function that should be used. 0 means the default engine function\r\n */\r\n @serialize()\r\n public depthFunction = 0;\r\n\r\n /**\r\n * Specifies if there should be a separate pass for culling\r\n */\r\n @serialize()\r\n public separateCullingPass = false;\r\n\r\n /**\r\n * Stores the state specifying if fog should be enabled\r\n */\r\n @serialize(\"fogEnabled\")\r\n private _fogEnabled = true;\r\n\r\n /**\r\n * Sets the state for enabling fog\r\n */\r\n public set fogEnabled(value: boolean) {\r\n if (this._fogEnabled === value) {\r\n return;\r\n }\r\n this._fogEnabled = value;\r\n this.markAsDirty(Material.MiscDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the value of the fog enabled state\r\n */\r\n public get fogEnabled(): boolean {\r\n return this._fogEnabled;\r\n }\r\n\r\n /**\r\n * Stores the size of points\r\n */\r\n @serialize()\r\n public pointSize = 1.0;\r\n\r\n /**\r\n * Stores the z offset Factor value\r\n */\r\n @serialize()\r\n public zOffset = 0;\r\n\r\n /**\r\n * Stores the z offset Units value\r\n */\r\n @serialize()\r\n public zOffsetUnits = 0;\r\n\r\n public get wireframe(): boolean {\r\n switch (this._fillMode) {\r\n case Material.WireFrameFillMode:\r\n case Material.LineListDrawMode:\r\n case Material.LineLoopDrawMode:\r\n case Material.LineStripDrawMode:\r\n return true;\r\n }\r\n\r\n return this._scene.forceWireframe;\r\n }\r\n\r\n /**\r\n * Sets the state of wireframe mode\r\n */\r\n public set wireframe(value: boolean) {\r\n this.fillMode = value ? Material.WireFrameFillMode : Material.TriangleFillMode;\r\n }\r\n\r\n /**\r\n * Gets the value specifying if point clouds are enabled\r\n */\r\n @serialize()\r\n public get pointsCloud(): boolean {\r\n switch (this._fillMode) {\r\n case Material.PointFillMode:\r\n case Material.PointListDrawMode:\r\n return true;\r\n }\r\n\r\n return this._scene.forcePointsCloud;\r\n }\r\n\r\n /**\r\n * Sets the state of point cloud mode\r\n */\r\n public set pointsCloud(value: boolean) {\r\n this.fillMode = value ? Material.PointFillMode : Material.TriangleFillMode;\r\n }\r\n\r\n /**\r\n * Gets the material fill mode\r\n */\r\n @serialize()\r\n public get fillMode(): number {\r\n return this._fillMode;\r\n }\r\n\r\n /**\r\n * Sets the material fill mode\r\n */\r\n public set fillMode(value: number) {\r\n if (this._fillMode === value) {\r\n return;\r\n }\r\n\r\n this._fillMode = value;\r\n this.markAsDirty(Material.MiscDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets or sets the active clipplane 1\r\n */\r\n public clipPlane: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 2\r\n */\r\n public clipPlane2: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 3\r\n */\r\n public clipPlane3: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 4\r\n */\r\n public clipPlane4: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 5\r\n */\r\n public clipPlane5: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 6\r\n */\r\n public clipPlane6: Nullable<Plane>;\r\n\r\n /**\r\n * Gives access to the stencil properties of the material\r\n */\r\n public readonly stencil = new MaterialStencilState();\r\n\r\n /**\r\n * @internal\r\n * Stores the effects for the material\r\n */\r\n protected _materialContext: IMaterialContext | undefined;\r\n\r\n protected _drawWrapper: DrawWrapper;\r\n /** @internal */\r\n public _getDrawWrapper(): DrawWrapper {\r\n return this._drawWrapper;\r\n }\r\n /**\r\n * @internal\r\n */\r\n public _setDrawWrapper(drawWrapper: DrawWrapper) {\r\n this._drawWrapper = drawWrapper;\r\n }\r\n\r\n /**\r\n * Specifies if uniform buffers should be used\r\n */\r\n private _useUBO: boolean = false;\r\n\r\n /**\r\n * Stores a reference to the scene\r\n */\r\n private _scene: Scene;\r\n protected _needToBindSceneUbo: boolean;\r\n\r\n /**\r\n * Stores the fill mode state\r\n */\r\n private _fillMode = Material.TriangleFillMode;\r\n\r\n /**\r\n * Specifies if the depth write state should be cached\r\n */\r\n private _cachedDepthWriteState: boolean = false;\r\n\r\n /**\r\n * Specifies if the color write state should be cached\r\n */\r\n private _cachedColorWriteState: boolean = false;\r\n\r\n /**\r\n * Specifies if the depth function state should be cached\r\n */\r\n private _cachedDepthFunctionState: number = 0;\r\n\r\n /**\r\n * Stores the uniform buffer\r\n * @internal\r\n */\r\n public _uniformBuffer: UniformBuffer;\r\n\r\n /** @internal */\r\n public _indexInSceneMaterialArray = -1;\r\n\r\n /** @internal */\r\n public meshMap: Nullable<{ [id: string]: AbstractMesh | undefined }> = null;\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable<AbstractScene> = null;\r\n\r\n /** @internal */\r\n public _dirtyCallbacks: { [code: number]: () => void };\r\n\r\n /** @internal */\r\n public _uniformBufferLayoutBuilt = false;\r\n\r\n protected _eventInfo: MaterialPluginCreated &\r\n MaterialPluginDisposed &\r\n MaterialPluginHasTexture &\r\n MaterialPluginIsReadyForSubMesh &\r\n MaterialPluginGetDefineNames &\r\n MaterialPluginPrepareEffect &\r\n MaterialPluginPrepareDefines &\r\n MaterialPluginPrepareUniformBuffer &\r\n MaterialPluginBindForSubMesh &\r\n MaterialPluginGetAnimatables &\r\n MaterialPluginGetActiveTextures &\r\n MaterialPluginFillRenderTargetTextures &\r\n MaterialPluginHasRenderTargetTextures &\r\n MaterialPluginHardBindForSubMesh = {} as any; // will be initialized before each event notification\r\n\r\n /** @internal */\r\n public _callbackPluginEventGeneric: (\r\n id: number,\r\n info:\r\n | MaterialPluginGetActiveTextures\r\n | MaterialPluginGetAnimatables\r\n | MaterialPluginHasTexture\r\n | MaterialPluginDisposed\r\n | MaterialPluginGetDefineNames\r\n | MaterialPluginPrepareEffect\r\n | MaterialPluginPrepareUniformBuffer\r\n ) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventIsReadyForSubMesh: (eventData: MaterialPluginIsReadyForSubMesh) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventPrepareDefines: (eventData: MaterialPluginPrepareDefines) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventPrepareDefinesBeforeAttributes: (eventData: MaterialPluginPrepareDefines) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventHardBindForSubMesh: (eventData: MaterialPluginHardBindForSubMesh) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventBindForSubMesh: (eventData: MaterialPluginBindForSubMesh) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventHasRenderTargetTextures: (eventData: MaterialPluginHasRenderTargetTextures) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventFillRenderTargetTextures: (eventData: MaterialPluginFillRenderTargetTextures) => void = () => void 0;\r\n\r\n /**\r\n * Creates a material instance\r\n * @param name defines the name of the material\r\n * @param scene defines the scene to reference\r\n * @param doNotAdd specifies if the material should be added to the scene\r\n */\r\n constructor(name: string, scene?: Nullable<Scene>, doNotAdd?: boolean) {\r\n this.name = name;\r\n const setScene = scene || EngineStore.LastCreatedScene;\r\n if (!setScene) {\r\n return;\r\n }\r\n this._scene = setScene;\r\n this._dirtyCallbacks = {};\r\n\r\n this._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag] = this._markAllSubMeshesAsTexturesDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_LightDirtyFlag] = this._markAllSubMeshesAsLightsDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_FresnelDirtyFlag] = this._markAllSubMeshesAsFresnelDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_AttributesDirtyFlag] = this._markAllSubMeshesAsAttributesDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_MiscDirtyFlag] = this._markAllSubMeshesAsMiscDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_PrePassDirtyFlag] = this._markAllSubMeshesAsPrePassDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_AllDirtyFlag] = this._markAllSubMeshesAsAllDirty.bind(this);\r\n\r\n this.id = name || Tools.RandomId();\r\n this.uniqueId = this._scene.getUniqueId();\r\n this._materialContext = this._scene.getEngine().createMaterialContext();\r\n this._drawWrapper = new DrawWrapper(this._scene.getEngine(), false);\r\n this._drawWrapper.materialContext = this._materialContext;\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n this.sideOrientation = Material.ClockWiseSideOrientation;\r\n } else {\r\n this.sideOrientation = Material.CounterClockWiseSideOrientation;\r\n }\r\n\r\n this._uniformBuffer = new UniformBuffer(this._scene.getEngine(), undefined, undefined, name);\r\n this._useUBO = this.getScene().getEngine().supportsUniformBuffers;\r\n\r\n if (!doNotAdd) {\r\n this._scene.addMaterial(this);\r\n }\r\n\r\n if (this._scene.useMaterialMeshMap) {\r\n this.meshMap = {};\r\n }\r\n\r\n Material.OnEventObservable.notifyObservers(this, MaterialPluginEvent.Created);\r\n }\r\n\r\n /**\r\n * Returns a string representation of the current material\r\n * @param fullDetails defines a boolean indicating which levels of logging is desired\r\n * @returns a string with material information\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public toString(fullDetails?: boolean): string {\r\n const ret = \"Name: \" + this.name;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Gets the class name of the material\r\n * @returns a string with the class name of the material\r\n */\r\n public getClassName(): string {\r\n return \"Material\";\r\n }\r\n\r\n /**\r\n * Specifies if updates for the material been locked\r\n */\r\n public get isFrozen(): boolean {\r\n return this.checkReadyOnlyOnce;\r\n }\r\n\r\n /**\r\n * Locks updates for the material\r\n */\r\n public freeze(): void {\r\n this.markDirty();\r\n this.checkReadyOnlyOnce = true;\r\n }\r\n\r\n /**\r\n * Unlocks updates for the material\r\n */\r\n public unfreeze(): void {\r\n this.markDirty();\r\n this.checkReadyOnlyOnce = false;\r\n }\r\n\r\n /**\r\n * Specifies if the material is ready to be used\r\n * @param mesh defines the mesh to check\r\n * @param useInstances specifies if instances should be used\r\n * @returns a boolean indicating if the material is ready to be used\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReady(mesh?: AbstractMesh, useInstances?: boolean): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Specifies that the submesh is ready to be used\r\n * @param mesh defines the mesh to check\r\n * @param subMesh defines which submesh to check\r\n * @param useInstances specifies that instances should be used\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean {\r\n const defines = subMesh.materialDefines;\r\n if (!defines) {\r\n return false;\r\n }\r\n\r\n this._eventInfo.isReadyForSubMesh = true;\r\n this._eventInfo.defines = defines;\r\n this._callbackPluginEventIsReadyForSubMesh(this._eventInfo);\r\n\r\n return this._eventInfo.isReadyForSubMesh;\r\n }\r\n\r\n /**\r\n * Returns the material effect\r\n * @returns the effect associated with the material\r\n */\r\n public getEffect(): Nullable<Effect> {\r\n return this._drawWrapper.effect;\r\n }\r\n\r\n /**\r\n * Returns the current scene\r\n * @returns a Scene\r\n */\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Enforces alpha test in opaque or blend mode in order to improve the performances of some situations.\r\n */\r\n protected _forceAlphaTest = false;\r\n\r\n /**\r\n * The transparency mode of the material.\r\n */\r\n protected _transparencyMode: Nullable<number> = null;\r\n\r\n /**\r\n * Gets the current transparency mode.\r\n */\r\n @serialize()\r\n public get transparencyMode(): Nullable<number> {\r\n return this._transparencyMode;\r\n }\r\n\r\n /**\r\n * Sets the transparency mode of the material.\r\n *\r\n * | Value | Type | Description |\r\n * | ----- | ----------------------------------- | ----------- |\r\n * | 0 | OPAQUE | |\r\n * | 1 | ALPHATEST | |\r\n * | 2 | ALPHABLEND | |\r\n * | 3 | ALPHATESTANDBLEND | |\r\n *\r\n */\r\n public set transparencyMode(value: Nullable<number>) {\r\n if (this._transparencyMode === value) {\r\n return;\r\n }\r\n\r\n this._transparencyMode = value;\r\n\r\n this._forceAlphaTest = value === Material.MATERIAL_ALPHATESTANDBLEND;\r\n\r\n this._markAllSubMeshesAsTexturesAndMiscDirty();\r\n }\r\n\r\n /**\r\n * Returns true if alpha blending should be disabled.\r\n */\r\n protected get _disableAlphaBlending(): boolean {\r\n return this._transparencyMode === Material.MATERIAL_OPAQUE || this._transparencyMode === Material.MATERIAL_ALPHATEST;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha blend mode.\r\n * @returns a boolean specifying if alpha blending is needed\r\n */\r\n public needAlphaBlending(): boolean {\r\n if (this._disableAlphaBlending) {\r\n return false;\r\n }\r\n\r\n return this.alpha < 1.0;\r\n }\r\n\r\n /**\r\n * Specifies if the mesh will require alpha blending\r\n * @param mesh defines the mesh to check\r\n * @returns a boolean specifying if alpha blending is needed for the mesh\r\n */\r\n public needAlphaBlendingForMesh(mesh: AbstractMesh): boolean {\r\n if (mesh.visibility < 1.0) {\r\n return true;\r\n }\r\n\r\n if (this._disableAlphaBlending) {\r\n return false;\r\n }\r\n\r\n return mesh.hasVertexAlpha || this.needAlphaBlending();\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha test mode.\r\n * @returns a boolean specifying if an alpha test is needed.\r\n */\r\n public needAlphaTesting(): boolean {\r\n if (this._forceAlphaTest) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies if material alpha testing should be turned on for the mesh\r\n * @param mesh defines the mesh to check\r\n */\r\n protected _shouldTurnAlphaTestOn(mesh: AbstractMesh): boolean {\r\n return !this.needAlphaBlendingForMesh(mesh) && this.needAlphaTesting();\r\n }\r\n\r\n /**\r\n * Gets the texture used for the alpha test\r\n * @returns the texture to use for alpha testing\r\n */\r\n public getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate that it needs to be re-calculated\r\n */\r\n public markDirty(): void {\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n if (subMesh.getMaterial() !== this) {\r\n continue;\r\n }\r\n\r\n if (!subMesh.effect) {\r\n continue;\r\n }\r\n\r\n subMesh.effect._wasPreviouslyReady = false;\r\n subMesh.effect._wasPreviouslyUsingInstances = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _preBind(effect?: Effect | DrawWrapper, overrideOrientation: Nullable<number> = null): boolean {\r\n const engine = this._scene.getEngine();\r\n\r\n const orientation = overrideOrientation == null ? this.sideOrientation : overrideOrientation;\r\n const reverse = orientation === Material.ClockWiseSideOrientation;\r\n\r\n engine.enableEffect(effect ? effect : this._getDrawWrapper());\r\n engine.setState(\r\n this.backFaceCulling,\r\n this.zOffset,\r\n false,\r\n reverse,\r\n this._scene._mirroredCameraPosition ? !this.cullBackFaces : this.cullBackFaces,\r\n this.stencil,\r\n this.zOffsetUnits\r\n );\r\n\r\n return reverse;\r\n }\r\n\r\n /**\r\n * Binds the material to the mesh\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh to bind the material to\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bind(world: Matrix, mesh?: Mesh): void {}\r\n\r\n /**\r\n * Initializes the uniform buffer layout for the shader.\r\n */\r\n public buildUniformLayout(): void {\r\n const ubo = this._uniformBuffer;\r\n\r\n this._eventInfo.ubo = ubo;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.PrepareUniformBuffer, this._eventInfo);\r\n\r\n ubo.create();\r\n\r\n this._uniformBufferLayoutBuilt = true;\r\n }\r\n\r\n /**\r\n * Binds the submesh to the material\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventBindForSubMesh(this._eventInfo);\r\n }\r\n\r\n /**\r\n * Binds the world matrix to the material\r\n * @param world defines the world transformation matrix\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bindOnlyWorldMatrix(world: Matrix): void {}\r\n\r\n /**\r\n * Binds the view matrix to the effect\r\n * @param effect defines the effect to bind the view matrix to\r\n */\r\n public bindView(effect: Effect): void {\r\n if (!this._useUBO) {\r\n effect.setMatrix(\"view\", this.getScene().getViewMatrix());\r\n } else {\r\n this._needToBindSceneUbo = true;\r\n }\r\n }\r\n\r\n /**\r\n * Binds the view projection and projection matrices to the effect\r\n * @param effect defines the effect to bind the view projection and projection matrices to\r\n */\r\n public bindViewProjection(effect: Effect): void {\r\n if (!this._useUBO) {\r\n effect.setMatrix(\"viewProjection\", this.getScene().getTransformMatrix());\r\n effect.setMatrix(\"projection\", this.getScene().getProjectionMatrix());\r\n } else {\r\n this._needToBindSceneUbo = true;\r\n }\r\n }\r\n\r\n /**\r\n * Binds the view matrix to the effect\r\n * @param effect defines the effect to bind the view matrix to\r\n * @param variableName name of the shader variable that will hold the eye position\r\n */\r\n public bindEyePosition(effect: Effect, variableName?: string): void {\r\n if (!this._useUBO) {\r\n this._scene.bindEyePosition(effect, variableName);\r\n } else {\r\n this._needToBindSceneUbo = true;\r\n }\r\n }\r\n\r\n /**\r\n * Processes to execute after binding the material to a mesh\r\n * @param mesh defines the rendered mesh\r\n * @param effect\r\n */\r\n protected _afterBind(mesh?: Mesh, effect: Nullable<Effect> = null): void {\r\n this._scene._cachedMaterial = this;\r\n if (this._needToBindSceneUbo) {\r\n if (effect) {\r\n this._needToBindSceneUbo = false;\r\n MaterialHelper.BindSceneUniformBuffer(effect, this.getScene().getSceneUniformBuffer());\r\n this._scene.finalizeSceneUbo();\r\n }\r\n }\r\n if (mesh) {\r\n this._scene._cachedVisibility = mesh.visibility;\r\n } else {\r\n this._scene._cachedVisibility = 1;\r\n }\r\n\r\n if (this._onBindObservable && mesh) {\r\n this._onBindObservable.notifyObservers(mesh);\r\n }\r\n\r\n if (this.disableDepthWrite) {\r\n const engine = this._scene.getEngine();\r\n this._cachedDepthWriteState = engine.getDepthWrite();\r\n engine.setDepthWrite(false);\r\n }\r\n\r\n if (this.disableColorWrite) {\r\n const engine = this._scene.getEngine();\r\n this._cachedColorWriteState = engine.getColorWrite();\r\n engine.setColorWrite(false);\r\n }\r\n\r\n if (this.depthFunction !== 0) {\r\n const engine = this._scene.getEngine();\r\n this._cachedDepthFunctionState = engine.getDepthFunction() || 0;\r\n engine.setDepthFunction(this.depthFunction);\r\n }\r\n }\r\n\r\n /**\r\n * Unbinds the material from the mesh\r\n */\r\n public unbind(): void {\r\n if (this._onUnBindObservable) {\r\n this._onUnBindObservable.notifyObservers(this);\r\n }\r\n\r\n if (this.depthFunction !== 0) {\r\n const engine = this._scene.getEngine();\r\n engine.setDepthFunction(this._cachedDepthFunctionState);\r\n }\r\n\r\n if (this.disableDepthWrite) {\r\n const engine = this._scene.getEngine();\r\n engine.setDepthWrite(this._cachedDepthWriteState);\r\n }\r\n\r\n if (this.disableColorWrite) {\r\n const engine = this._scene.getEngine();\r\n engine.setColorWrite(this._cachedColorWriteState);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the animatable textures.\r\n * @returns - Array of animatable textures.\r\n */\r\n public getAnimatables(): IAnimatable[] {\r\n this._eventInfo.animatables = [];\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetAnimatables, this._eventInfo);\r\n return this._eventInfo.animatables;\r\n }\r\n\r\n /**\r\n * Gets the active textures from the material\r\n * @returns an array of textures\r\n */\r\n public getActiveTextures(): BaseTexture[] {\r\n this._eventInfo.activeTextures = [];\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetActiveTextures, this._eventInfo);\r\n return this._eventInfo.activeTextures;\r\n }\r\n\r\n /**\r\n * Specifies if the material uses a texture\r\n * @param texture defines the texture to check against the material\r\n * @returns a boolean specifying if the material uses the texture\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n this._eventInfo.hasTexture = false;\r\n this._eventInfo.texture = texture;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.HasTexture, this._eventInfo);\r\n return this._eventInfo.hasTexture;\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the material, and gives it a new name\r\n * @param name defines the new name for the duplicated material\r\n * @returns the cloned material\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public clone(name: string): Nullable<Material> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the meshes bound to the material\r\n * @returns an array of meshes bound to the material\r\n */\r\n public getBindedMeshes(): AbstractMesh[] {\r\n if (this.meshMap) {\r\n const result = new Array<AbstractMesh>();\r\n for (const meshId in this.meshMap) {\r\n const mesh = this.meshMap[meshId];\r\n if (mesh) {\r\n result.push(mesh);\r\n }\r\n }\r\n return result;\r\n } else {\r\n const meshes = this._scene.meshes;\r\n return meshes.filter((mesh) => mesh.material === this);\r\n }\r\n }\r\n\r\n /**\r\n * Force shader compilation\r\n * @param mesh defines the mesh associated with this material\r\n * @param onCompiled defines a function to execute once the material is compiled\r\n * @param options defines the options to configure the compilation\r\n * @param onError defines a function to execute if the material fails compiling\r\n */\r\n public forceCompilation(\r\n mesh: AbstractMesh,\r\n onCompiled?: (material: Material) => void,\r\n options?: Partial<IMaterialCompilationOptions>,\r\n onError?: (reason: string) => void\r\n ): void {\r\n const localOptions = {\r\n clipPlane: false,\r\n useInstances: false,\r\n ...options,\r\n };\r\n\r\n const scene = this.getScene();\r\n const currentHotSwapingState = this.allowShaderHotSwapping;\r\n this.allowShaderHotSwapping = false; // Turned off to let us evaluate the real compilation state\r\n\r\n const checkReady = () => {\r\n if (!this._scene || !this._scene.getEngine()) {\r\n return;\r\n }\r\n\r\n const clipPlaneState = scene.clipPlane;\r\n\r\n if (localOptions.clipPlane) {\r\n scene.clipPlane = new Plane(0, 0, 0, 1);\r\n }\r\n\r\n if (this._storeEffectOnSubMeshes) {\r\n let allDone = true,\r\n lastError = null;\r\n if (mesh.subMeshes) {\r\n const tempSubMesh = new SubMesh(0, 0, 0, 0, 0, mesh, undefined, false, false);\r\n if (tempSubMesh.materialDefines) {\r\n tempSubMesh.materialDefines._renderId = -1;\r\n }\r\n if (!this.isReadyForSubMesh(mesh, tempSubMesh, localOptions.useInstances)) {\r\n if (tempSubMesh.effect && tempSubMesh.effect.getCompilationError() && tempSubMesh.effect.allFallbacksProcessed()) {\r\n lastError = tempSubMesh.effect.getCompilationError();\r\n } else {\r\n allDone = false;\r\n setTimeout(checkReady, 16);\r\n }\r\n }\r\n }\r\n if (allDone) {\r\n this.allowShaderHotSwapping = currentHotSwapingState;\r\n if (lastError) {\r\n if (onError) {\r\n onError(lastError);\r\n }\r\n }\r\n if (onCompiled) {\r\n onCompiled(this);\r\n }\r\n }\r\n } else {\r\n if (this.isReady()) {\r\n this.allowShaderHotSwapping = currentHotSwapingState;\r\n if (onCompiled) {\r\n onCompiled(this);\r\n }\r\n } else {\r\n setTimeout(checkReady, 16);\r\n }\r\n }\r\n\r\n if (localOptions.clipPlane) {\r\n scene.clipPlane = clipPlaneState;\r\n }\r\n };\r\n\r\n checkReady();\r\n }\r\n\r\n /**\r\n * Force shader compilation\r\n * @param mesh defines the mesh that will use this material\r\n * @param options defines additional options for compiling the shaders\r\n * @returns a promise that resolves when the compilation completes\r\n */\r\n public forceCompilationAsync(mesh: AbstractMesh, options?: Partial<IMaterialCompilationOptions>): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this.forceCompilation(\r\n mesh,\r\n () => {\r\n resolve();\r\n },\r\n options,\r\n (reason) => {\r\n reject(reason);\r\n }\r\n );\r\n });\r\n }\r\n\r\n private static readonly _AllDirtyCallBack = (defines: MaterialDefines) => defines.markAllAsDirty();\r\n private static readonly _ImageProcessingDirtyCallBack = (defines: MaterialDefines) => defines.markAsImageProcessingDirty();\r\n private static readonly _TextureDirtyCallBack = (defines: MaterialDefines) => defines.markAsTexturesDirty();\r\n private static readonly _FresnelDirtyCallBack = (defines: MaterialDefines) => defines.markAsFresnelDirty();\r\n private static readonly _MiscDirtyCallBack = (defines: MaterialDefines) => defines.markAsMiscDirty();\r\n private static readonly _PrePassDirtyCallBack = (defines: MaterialDefines) => defines.markAsPrePassDirty();\r\n private static readonly _LightsDirtyCallBack = (defines: MaterialDefines) => defines.markAsLightDirty();\r\n private static readonly _AttributeDirtyCallBack = (defines: MaterialDefines) => defines.markAsAttributesDirty();\r\n\r\n private static _FresnelAndMiscDirtyCallBack = (defines: MaterialDefines) => {\r\n Material._FresnelDirtyCallBack(defines);\r\n Material._MiscDirtyCallBack(defines);\r\n };\r\n\r\n private static _TextureAndMiscDirtyCallBack = (defines: MaterialDefines) => {\r\n Material._TextureDirtyCallBack(defines);\r\n Material._MiscDirtyCallBack(defines);\r\n };\r\n\r\n private static readonly _DirtyCallbackArray: Array<(defines: MaterialDefines) => void> = [];\r\n private static readonly _RunDirtyCallBacks = (defines: MaterialDefines) => {\r\n for (const cb of Material._DirtyCallbackArray) {\r\n cb(defines);\r\n }\r\n };\r\n\r\n /**\r\n * Marks a define in the material to indicate that it needs to be re-computed\r\n * @param flag defines a flag used to determine which parts of the material have to be marked as dirty\r\n */\r\n public markAsDirty(flag: number): void {\r\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism) {\r\n return;\r\n }\r\n\r\n Material._DirtyCallbackArray.length = 0;\r\n\r\n if (flag & Material.TextureDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._TextureDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.LightDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._LightsDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.FresnelDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._FresnelDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.AttributesDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._AttributeDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.MiscDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._MiscDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.PrePassDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._PrePassDirtyCallBack);\r\n }\r\n\r\n if (Material._DirtyCallbackArray.length) {\r\n this._markAllSubMeshesAsDirty(Material._RunDirtyCallBacks);\r\n }\r\n\r\n this.getScene().resetCachedMaterial();\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache for all submeshes that are using this material\r\n */\r\n public resetDrawCache(): void {\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n if (subMesh.getMaterial() !== this) {\r\n continue;\r\n }\r\n\r\n subMesh.resetDrawCache();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Marks all submeshes of a material to indicate that their material defines need to be re-calculated\r\n * @param func defines a function which checks material defines against the submeshes\r\n */\r\n protected _markAllSubMeshesAsDirty(func: (defines: MaterialDefines) => void) {\r\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism) {\r\n return;\r\n }\r\n\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n // We want to skip the submeshes which are not using this material or which have not yet rendered at least once\r\n if (subMesh.getMaterial(false) !== this) {\r\n continue;\r\n }\r\n\r\n for (const drawWrapper of subMesh._drawWrappers) {\r\n if (!drawWrapper || !drawWrapper.defines || !(drawWrapper.defines as MaterialDefines).markAllAsDirty) {\r\n continue;\r\n }\r\n if (this._materialContext === drawWrapper.materialContext) {\r\n func(drawWrapper.defines as MaterialDefines);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Indicates that the scene should check if the rendering now needs a prepass\r\n */\r\n protected _markScenePrePassDirty() {\r\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism) {\r\n return;\r\n }\r\n\r\n const prePassRenderer = this.getScene().enablePrePassRenderer();\r\n if (prePassRenderer) {\r\n prePassRenderer.markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Indicates that we need to re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsAllDirty() {\r\n this._markAllSubMeshesAsDirty(Material._AllDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that image processing needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsImageProcessingDirty() {\r\n this._markAllSubMeshesAsDirty(Material._ImageProcessingDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that textures need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsTexturesDirty() {\r\n this._markAllSubMeshesAsDirty(Material._TextureDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that fresnel needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsFresnelDirty() {\r\n this._markAllSubMeshesAsDirty(Material._FresnelDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that fresnel and misc need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsFresnelAndMiscDirty() {\r\n this._markAllSubMeshesAsDirty(Material._FresnelAndMiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that lights need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsLightsDirty() {\r\n this._markAllSubMeshesAsDirty(Material._LightsDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that attributes need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsAttributesDirty() {\r\n this._markAllSubMeshesAsDirty(Material._AttributeDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that misc needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsMiscDirty() {\r\n this._markAllSubMeshesAsDirty(Material._MiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that prepass needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsPrePassDirty() {\r\n this._markAllSubMeshesAsDirty(Material._MiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that textures and misc need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsTexturesAndMiscDirty() {\r\n this._markAllSubMeshesAsDirty(Material._TextureAndMiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Sets the required values to the prepass renderer.\r\n * @param prePassRenderer defines the prepass renderer to setup.\r\n * @returns true if the pre pass is needed.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean {\r\n // Do Nothing by default\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the material\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\r\n * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh\r\n */\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void {\r\n const scene = this.getScene();\r\n // Animations\r\n scene.stopAnimation(this);\r\n scene.freeProcessedMaterials();\r\n\r\n // Remove from scene\r\n scene.removeMaterial(this);\r\n\r\n this._eventInfo.forceDisposeTextures = forceDisposeTextures;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.Disposed, this._eventInfo);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.materials.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.materials.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n if (notBoundToMesh !== true) {\r\n // Remove from meshes\r\n if (this.meshMap) {\r\n for (const meshId in this.meshMap) {\r\n const mesh = this.meshMap[meshId];\r\n if (mesh) {\r\n mesh.material = null; // will set the entry in the map to undefined\r\n this.releaseVertexArrayObject(mesh, forceDisposeEffect);\r\n }\r\n }\r\n } else {\r\n const meshes = scene.meshes;\r\n for (const mesh of meshes) {\r\n if (mesh.material === this && !(mesh as InstancedMesh).sourceMesh) {\r\n mesh.material = null;\r\n this.releaseVertexArrayObject(mesh, forceDisposeEffect);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._uniformBuffer.dispose();\r\n\r\n // Shader are kept in cache for further use but we can get rid of this by using forceDisposeEffect\r\n if (forceDisposeEffect && this._drawWrapper.effect) {\r\n if (!this._storeEffectOnSubMeshes) {\r\n this._drawWrapper.effect.dispose();\r\n }\r\n\r\n this._drawWrapper.effect = null;\r\n }\r\n\r\n this.metadata = null;\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n\r\n this.onDisposeObservable.clear();\r\n if (this._onBindObservable) {\r\n this._onBindObservable.clear();\r\n }\r\n\r\n if (this._onUnBindObservable) {\r\n this._onUnBindObservable.clear();\r\n }\r\n\r\n if (this._onEffectCreatedObservable) {\r\n this._onEffectCreatedObservable.clear();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private releaseVertexArrayObject(mesh: AbstractMesh, forceDisposeEffect?: boolean) {\r\n if ((<Mesh>mesh).geometry) {\r\n const geometry = <Geometry>(<Mesh>mesh).geometry;\r\n if (this._storeEffectOnSubMeshes) {\r\n for (const subMesh of mesh.subMeshes) {\r\n geometry._releaseVertexArrayObject(subMesh.effect);\r\n if (forceDisposeEffect && subMesh.effect) {\r\n subMesh.effect.dispose();\r\n }\r\n }\r\n } else {\r\n geometry._releaseVertexArrayObject(this._drawWrapper.effect);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Serializes this material\r\n * @returns the serialized material object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n\r\n serializationObject.stencil = this.stencil.serialize();\r\n serializationObject.uniqueId = this.uniqueId;\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Creates a material from parsed material data\r\n * @param parsedMaterial defines parsed material data\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures\r\n * @returns a new material\r\n */\r\n public static Parse(parsedMaterial: any, scene: Scene, rootUrl: string): Nullable<Material> {\r\n if (!parsedMaterial.customType) {\r\n parsedMaterial.customType = \"BABYLON.StandardMaterial\";\r\n } else if (parsedMaterial.customType === \"BABYLON.PBRMaterial\" && parsedMaterial.overloadedAlbedo) {\r\n parsedMaterial.customType = \"BABYLON.LegacyPBRMaterial\";\r\n if (!BABYLON.LegacyPBRMaterial) {\r\n Logger.Error(\"Your scene is trying to load a legacy version of the PBRMaterial, please, include it from the materials library.\");\r\n return null;\r\n }\r\n }\r\n\r\n const materialType = Tools.Instantiate(parsedMaterial.customType);\r\n const material = materialType.Parse(parsedMaterial, scene, rootUrl);\r\n material._loadedUniqueId = parsedMaterial.uniqueId;\r\n return material;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"material.js","sourceRoot":"","sources":["../../../../lts/core/generated/Materials/material.ts"],"names":[],"mappings":"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","sourcesContent":["import { serialize, SerializationHelper } from \"../Misc/decorators\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport type { SmartArray } from \"../Misc/smartArray\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Matrix } from \"../Maths/math.vector\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { Geometry } from \"../Meshes/geometry\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { Effect } from \"./effect\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { IInspectable } from \"../Misc/iInspectable\";\r\nimport { Plane } from \"../Maths/math.plane\";\r\nimport type { ShadowDepthWrapper } from \"./shadowDepthWrapper\";\r\nimport { MaterialHelper } from \"./materialHelper\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\nimport { DrawWrapper } from \"./drawWrapper\";\r\nimport { MaterialStencilState } from \"./materialStencilState\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport type {\r\n MaterialPluginDisposed,\r\n MaterialPluginIsReadyForSubMesh,\r\n MaterialPluginGetDefineNames,\r\n MaterialPluginBindForSubMesh,\r\n MaterialPluginGetActiveTextures,\r\n MaterialPluginHasTexture,\r\n MaterialPluginGetAnimatables,\r\n MaterialPluginPrepareDefines,\r\n MaterialPluginPrepareEffect,\r\n MaterialPluginPrepareUniformBuffer,\r\n MaterialPluginCreated,\r\n MaterialPluginFillRenderTargetTextures,\r\n MaterialPluginHasRenderTargetTextures,\r\n MaterialPluginHardBindForSubMesh,\r\n} from \"./materialPluginEvent\";\r\nimport { MaterialPluginEvent } from \"./materialPluginEvent\";\r\nimport type { ShaderCustomProcessingFunction } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { IClipPlanesHolder } from \"../Misc/interfaces/iClipPlanesHolder\";\r\n\r\ndeclare type PrePassRenderer = import(\"../Rendering/prePassRenderer\").PrePassRenderer;\r\ndeclare type Mesh = import(\"../Meshes/mesh\").Mesh;\r\ndeclare type Animation = import(\"../Animations/animation\").Animation;\r\ndeclare type InstancedMesh = import(\"../Meshes/instancedMesh\").InstancedMesh;\r\n\r\ndeclare let BABYLON: any;\r\n\r\n/**\r\n * Options for compiling materials.\r\n */\r\nexport interface IMaterialCompilationOptions {\r\n /**\r\n * Defines whether clip planes are enabled.\r\n */\r\n clipPlane: boolean;\r\n\r\n /**\r\n * Defines whether instances are enabled.\r\n */\r\n useInstances: boolean;\r\n}\r\n\r\n/**\r\n * Options passed when calling customShaderNameResolve\r\n */\r\nexport interface ICustomShaderNameResolveOptions {\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: Nullable<ShaderCustomProcessingFunction>;\r\n}\r\n\r\n/**\r\n * Base class for the main features of a material in Babylon.js\r\n */\r\nexport class Material implements IAnimatable, IClipPlanesHolder {\r\n /**\r\n * Returns the triangle fill mode\r\n */\r\n public static readonly TriangleFillMode = Constants.MATERIAL_TriangleFillMode;\r\n /**\r\n * Returns the wireframe mode\r\n */\r\n public static readonly WireFrameFillMode = Constants.MATERIAL_WireFrameFillMode;\r\n /**\r\n * Returns the point fill mode\r\n */\r\n public static readonly PointFillMode = Constants.MATERIAL_PointFillMode;\r\n /**\r\n * Returns the point list draw mode\r\n */\r\n public static readonly PointListDrawMode = Constants.MATERIAL_PointListDrawMode;\r\n /**\r\n * Returns the line list draw mode\r\n */\r\n public static readonly LineListDrawMode = Constants.MATERIAL_LineListDrawMode;\r\n /**\r\n * Returns the line loop draw mode\r\n */\r\n public static readonly LineLoopDrawMode = Constants.MATERIAL_LineLoopDrawMode;\r\n /**\r\n * Returns the line strip draw mode\r\n */\r\n public static readonly LineStripDrawMode = Constants.MATERIAL_LineStripDrawMode;\r\n /**\r\n * Returns the triangle strip draw mode\r\n */\r\n public static readonly TriangleStripDrawMode = Constants.MATERIAL_TriangleStripDrawMode;\r\n /**\r\n * Returns the triangle fan draw mode\r\n */\r\n public static readonly TriangleFanDrawMode = Constants.MATERIAL_TriangleFanDrawMode;\r\n\r\n /**\r\n * Stores the clock-wise side orientation\r\n */\r\n public static readonly ClockWiseSideOrientation = Constants.MATERIAL_ClockWiseSideOrientation;\r\n\r\n /**\r\n * Stores the counter clock-wise side orientation\r\n */\r\n public static readonly CounterClockWiseSideOrientation = Constants.MATERIAL_CounterClockWiseSideOrientation;\r\n\r\n /**\r\n * The dirty texture flag value\r\n */\r\n public static readonly TextureDirtyFlag = Constants.MATERIAL_TextureDirtyFlag;\r\n\r\n /**\r\n * The dirty light flag value\r\n */\r\n public static readonly LightDirtyFlag = Constants.MATERIAL_LightDirtyFlag;\r\n\r\n /**\r\n * The dirty fresnel flag value\r\n */\r\n public static readonly FresnelDirtyFlag = Constants.MATERIAL_FresnelDirtyFlag;\r\n\r\n /**\r\n * The dirty attribute flag value\r\n */\r\n public static readonly AttributesDirtyFlag = Constants.MATERIAL_AttributesDirtyFlag;\r\n\r\n /**\r\n * The dirty misc flag value\r\n */\r\n public static readonly MiscDirtyFlag = Constants.MATERIAL_MiscDirtyFlag;\r\n\r\n /**\r\n * The dirty prepass flag value\r\n */\r\n public static readonly PrePassDirtyFlag = Constants.MATERIAL_PrePassDirtyFlag;\r\n\r\n /**\r\n * The all dirty flag value\r\n */\r\n public static readonly AllDirtyFlag = Constants.MATERIAL_AllDirtyFlag;\r\n\r\n /**\r\n * MaterialTransparencyMode: No transparency mode, Alpha channel is not use.\r\n */\r\n public static readonly MATERIAL_OPAQUE = 0;\r\n\r\n /**\r\n * MaterialTransparencyMode: Alpha Test mode, pixel are discarded below a certain threshold defined by the alpha cutoff value.\r\n */\r\n public static readonly MATERIAL_ALPHATEST = 1;\r\n\r\n /**\r\n * MaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.\r\n */\r\n public static readonly MATERIAL_ALPHABLEND = 2;\r\n\r\n /**\r\n * MaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.\r\n * They are also discarded below the alpha cutoff threshold to improve performances.\r\n */\r\n public static readonly MATERIAL_ALPHATESTANDBLEND = 3;\r\n\r\n /**\r\n * The Whiteout method is used to blend normals.\r\n * Details of the algorithm can be found here: https://blog.selfshadow.com/publications/blending-in-detail/\r\n */\r\n public static readonly MATERIAL_NORMALBLENDMETHOD_WHITEOUT = 0;\r\n\r\n /**\r\n * The Reoriented Normal Mapping method is used to blend normals.\r\n * Details of the algorithm can be found here: https://blog.selfshadow.com/publications/blending-in-detail/\r\n */\r\n public static readonly MATERIAL_NORMALBLENDMETHOD_RNM = 1;\r\n\r\n /**\r\n * Event observable which raises global events common to all materials (like MaterialPluginEvent.Created)\r\n */\r\n public static OnEventObservable = new Observable<Material>();\r\n\r\n /**\r\n * Custom callback helping to override the default shader used in the material.\r\n */\r\n public customShaderNameResolve: (\r\n shaderName: string,\r\n uniforms: string[],\r\n uniformBuffers: string[],\r\n samplers: string[],\r\n defines: MaterialDefines | string[],\r\n attributes?: string[],\r\n options?: ICustomShaderNameResolveOptions\r\n ) => string;\r\n\r\n /**\r\n * Custom shadow depth material to use for shadow rendering instead of the in-built one\r\n */\r\n public shadowDepthWrapper: Nullable<ShadowDepthWrapper> = null;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the material is allowed (if supported) to do shader hot swapping.\r\n * This means that the material can keep using a previous shader while a new one is being compiled.\r\n * This is mostly used when shader parallel compilation is supported (true by default)\r\n */\r\n public allowShaderHotSwapping = true;\r\n\r\n /**\r\n * The ID of the material\r\n */\r\n @serialize()\r\n public id: string;\r\n\r\n /**\r\n * Gets or sets the unique id of the material\r\n */\r\n @serialize()\r\n public uniqueId: number;\r\n\r\n /** @internal */\r\n public _loadedUniqueId: string;\r\n\r\n /**\r\n * The name of the material\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Gets or sets user defined metadata\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /** @internal */\r\n public _internalMetadata: any;\r\n\r\n /**\r\n * For internal use only. Please do not use.\r\n */\r\n public reservedDataStore: any = null;\r\n\r\n /**\r\n * Specifies if the ready state should be checked on each call\r\n */\r\n @serialize()\r\n public checkReadyOnEveryCall = false;\r\n\r\n /**\r\n * Specifies if the ready state should be checked once\r\n */\r\n @serialize()\r\n public checkReadyOnlyOnce = false;\r\n\r\n /**\r\n * The state of the material\r\n */\r\n @serialize()\r\n public state = \"\";\r\n\r\n /**\r\n * If the material can be rendered to several textures with MRT extension\r\n */\r\n public get canRenderToMRT(): boolean {\r\n // By default, shaders are not compatible with MRTs\r\n // Base classes should override that if their shader supports MRT\r\n return false;\r\n }\r\n\r\n /**\r\n * The alpha value of the material\r\n */\r\n @serialize(\"alpha\")\r\n protected _alpha = 1.0;\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility\r\n */\r\n public inspectableCustomProperties: IInspectable[];\r\n\r\n /**\r\n * Sets the alpha value of the material\r\n */\r\n public set alpha(value: number) {\r\n if (this._alpha === value) {\r\n return;\r\n }\r\n\r\n const oldValue = this._alpha;\r\n this._alpha = value;\r\n\r\n // Only call dirty when there is a state change (no alpha / alpha)\r\n if (oldValue === 1 || value === 1) {\r\n this.markAsDirty(Material.MiscDirtyFlag);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the alpha value of the material\r\n */\r\n public get alpha(): number {\r\n return this._alpha;\r\n }\r\n\r\n /**\r\n * Specifies if back face culling is enabled\r\n */\r\n @serialize(\"backFaceCulling\")\r\n protected _backFaceCulling = true;\r\n\r\n /**\r\n * Sets the culling state (true to enable culling, false to disable)\r\n */\r\n public set backFaceCulling(value: boolean) {\r\n if (this._backFaceCulling === value) {\r\n return;\r\n }\r\n this._backFaceCulling = value;\r\n this.markAsDirty(Material.TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the culling state\r\n */\r\n public get backFaceCulling(): boolean {\r\n return this._backFaceCulling;\r\n }\r\n\r\n /**\r\n * Specifies if back or front faces should be culled (when culling is enabled)\r\n */\r\n @serialize(\"cullBackFaces\")\r\n protected _cullBackFaces = true;\r\n\r\n /**\r\n * Sets the type of faces that should be culled (true for back faces, false for front faces)\r\n */\r\n public set cullBackFaces(value: boolean) {\r\n if (this._cullBackFaces === value) {\r\n return;\r\n }\r\n this._cullBackFaces = value;\r\n this.markAsDirty(Material.TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the type of faces that should be culled\r\n */\r\n public get cullBackFaces(): boolean {\r\n return this._cullBackFaces;\r\n }\r\n\r\n private _blockDirtyMechanism = false;\r\n\r\n /**\r\n * Block the dirty-mechanism for this specific material\r\n * When set to false after being true the material will be marked as dirty.\r\n */\r\n public get blockDirtyMechanism(): boolean {\r\n return this._blockDirtyMechanism;\r\n }\r\n\r\n public set blockDirtyMechanism(value: boolean) {\r\n if (this._blockDirtyMechanism === value) {\r\n return;\r\n }\r\n\r\n this._blockDirtyMechanism = value;\r\n\r\n if (!value) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * This allows you to modify the material without marking it as dirty after every change.\r\n * This function should be used if you need to make more than one dirty-enabling change to the material - adding a texture, setting a new fill mode and so on.\r\n * The callback will pass the material as an argument, so you can make your changes to it.\r\n * @param callback the callback to be executed that will update the material\r\n */\r\n public atomicMaterialsUpdate(callback: (material: this) => void): void {\r\n this.blockDirtyMechanism = true;\r\n try {\r\n callback(this);\r\n } finally {\r\n this.blockDirtyMechanism = false;\r\n }\r\n }\r\n\r\n /**\r\n * Stores the value for side orientation\r\n */\r\n @serialize()\r\n public sideOrientation: number;\r\n\r\n /**\r\n * Callback triggered when the material is compiled\r\n */\r\n public onCompiled: Nullable<(effect: Effect) => void> = null;\r\n\r\n /**\r\n * Callback triggered when an error occurs\r\n */\r\n public onError: Nullable<(effect: Effect, errors: string) => void> = null;\r\n\r\n /**\r\n * Callback triggered to get the render target textures\r\n */\r\n public getRenderTargetTextures: Nullable<() => SmartArray<RenderTargetTexture>> = null;\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public get hasRenderTargetTextures(): boolean {\r\n this._eventInfo.hasRenderTargetTextures = false;\r\n this._callbackPluginEventHasRenderTargetTextures(this._eventInfo);\r\n return this._eventInfo.hasRenderTargetTextures;\r\n }\r\n\r\n /**\r\n * Specifies if the material should be serialized\r\n */\r\n public doNotSerialize = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _storeEffectOnSubMeshes = false;\r\n\r\n /**\r\n * Stores the animations for the material\r\n */\r\n public animations: Nullable<Array<Animation>> = null;\r\n\r\n /**\r\n * An event triggered when the material is disposed\r\n */\r\n public onDisposeObservable = new Observable<Material>();\r\n\r\n /**\r\n * An observer which watches for dispose events\r\n */\r\n private _onDisposeObserver: Nullable<Observer<Material>> = null;\r\n private _onUnBindObservable: Nullable<Observable<Material>> = null;\r\n\r\n /**\r\n * Called during a dispose event\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n private _onBindObservable: Nullable<Observable<AbstractMesh>>;\r\n\r\n /**\r\n * An event triggered when the material is bound\r\n */\r\n public get onBindObservable(): Observable<AbstractMesh> {\r\n if (!this._onBindObservable) {\r\n this._onBindObservable = new Observable<AbstractMesh>();\r\n }\r\n\r\n return this._onBindObservable;\r\n }\r\n\r\n /**\r\n * An observer which watches for bind events\r\n */\r\n private _onBindObserver: Nullable<Observer<AbstractMesh>> = null;\r\n\r\n /**\r\n * Called during a bind event\r\n */\r\n public set onBind(callback: (Mesh: AbstractMesh) => void) {\r\n if (this._onBindObserver) {\r\n this.onBindObservable.remove(this._onBindObserver);\r\n }\r\n this._onBindObserver = this.onBindObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the material is unbound\r\n */\r\n public get onUnBindObservable(): Observable<Material> {\r\n if (!this._onUnBindObservable) {\r\n this._onUnBindObservable = new Observable<Material>();\r\n }\r\n\r\n return this._onUnBindObservable;\r\n }\r\n\r\n protected _onEffectCreatedObservable: Nullable<Observable<{ effect: Effect; subMesh: Nullable<SubMesh> }>>;\r\n\r\n /**\r\n * An event triggered when the effect is (re)created\r\n */\r\n public get onEffectCreatedObservable(): Observable<{ effect: Effect; subMesh: Nullable<SubMesh> }> {\r\n if (!this._onEffectCreatedObservable) {\r\n this._onEffectCreatedObservable = new Observable<{ effect: Effect; subMesh: Nullable<SubMesh> }>();\r\n }\r\n\r\n return this._onEffectCreatedObservable;\r\n }\r\n\r\n /**\r\n * Stores the value of the alpha mode\r\n */\r\n @serialize(\"alphaMode\")\r\n private _alphaMode: number = Constants.ALPHA_COMBINE;\r\n\r\n /**\r\n * Sets the value of the alpha mode.\r\n *\r\n * | Value | Type | Description |\r\n * | --- | --- | --- |\r\n * | 0 | ALPHA_DISABLE | |\r\n * | 1 | ALPHA_ADD | |\r\n * | 2 | ALPHA_COMBINE | |\r\n * | 3 | ALPHA_SUBTRACT | |\r\n * | 4 | ALPHA_MULTIPLY | |\r\n * | 5 | ALPHA_MAXIMIZED | |\r\n * | 6 | ALPHA_ONEONE | |\r\n * | 7 | ALPHA_PREMULTIPLIED | |\r\n * | 8 | ALPHA_PREMULTIPLIED_PORTERDUFF | |\r\n * | 9 | ALPHA_INTERPOLATE | |\r\n * | 10 | ALPHA_SCREENMODE | |\r\n *\r\n */\r\n public set alphaMode(value: number) {\r\n if (this._alphaMode === value) {\r\n return;\r\n }\r\n this._alphaMode = value;\r\n this.markAsDirty(Material.TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the value of the alpha mode\r\n */\r\n public get alphaMode(): number {\r\n return this._alphaMode;\r\n }\r\n\r\n /**\r\n * Stores the state of the need depth pre-pass value\r\n */\r\n @serialize()\r\n private _needDepthPrePass = false;\r\n\r\n /**\r\n * Sets the need depth pre-pass value\r\n */\r\n public set needDepthPrePass(value: boolean) {\r\n if (this._needDepthPrePass === value) {\r\n return;\r\n }\r\n this._needDepthPrePass = value;\r\n if (this._needDepthPrePass) {\r\n this.checkReadyOnEveryCall = true;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the depth pre-pass value\r\n */\r\n public get needDepthPrePass(): boolean {\r\n return this._needDepthPrePass;\r\n }\r\n\r\n /**\r\n * Can this material render to prepass\r\n */\r\n public get isPrePassCapable(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies if depth writing should be disabled\r\n */\r\n @serialize()\r\n public disableDepthWrite = false;\r\n\r\n /**\r\n * Specifies if color writing should be disabled\r\n */\r\n @serialize()\r\n public disableColorWrite = false;\r\n\r\n /**\r\n * Specifies if depth writing should be forced\r\n */\r\n @serialize()\r\n public forceDepthWrite = false;\r\n\r\n /**\r\n * Specifies the depth function that should be used. 0 means the default engine function\r\n */\r\n @serialize()\r\n public depthFunction = 0;\r\n\r\n /**\r\n * Specifies if there should be a separate pass for culling\r\n */\r\n @serialize()\r\n public separateCullingPass = false;\r\n\r\n /**\r\n * Stores the state specifying if fog should be enabled\r\n */\r\n @serialize(\"fogEnabled\")\r\n private _fogEnabled = true;\r\n\r\n /**\r\n * Sets the state for enabling fog\r\n */\r\n public set fogEnabled(value: boolean) {\r\n if (this._fogEnabled === value) {\r\n return;\r\n }\r\n this._fogEnabled = value;\r\n this.markAsDirty(Material.MiscDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the value of the fog enabled state\r\n */\r\n public get fogEnabled(): boolean {\r\n return this._fogEnabled;\r\n }\r\n\r\n /**\r\n * Stores the size of points\r\n */\r\n @serialize()\r\n public pointSize = 1.0;\r\n\r\n /**\r\n * Stores the z offset Factor value\r\n */\r\n @serialize()\r\n public zOffset = 0;\r\n\r\n /**\r\n * Stores the z offset Units value\r\n */\r\n @serialize()\r\n public zOffsetUnits = 0;\r\n\r\n public get wireframe(): boolean {\r\n switch (this._fillMode) {\r\n case Material.WireFrameFillMode:\r\n case Material.LineListDrawMode:\r\n case Material.LineLoopDrawMode:\r\n case Material.LineStripDrawMode:\r\n return true;\r\n }\r\n\r\n return this._scene.forceWireframe;\r\n }\r\n\r\n /**\r\n * Sets the state of wireframe mode\r\n */\r\n public set wireframe(value: boolean) {\r\n this.fillMode = value ? Material.WireFrameFillMode : Material.TriangleFillMode;\r\n }\r\n\r\n /**\r\n * Gets the value specifying if point clouds are enabled\r\n */\r\n @serialize()\r\n public get pointsCloud(): boolean {\r\n switch (this._fillMode) {\r\n case Material.PointFillMode:\r\n case Material.PointListDrawMode:\r\n return true;\r\n }\r\n\r\n return this._scene.forcePointsCloud;\r\n }\r\n\r\n /**\r\n * Sets the state of point cloud mode\r\n */\r\n public set pointsCloud(value: boolean) {\r\n this.fillMode = value ? Material.PointFillMode : Material.TriangleFillMode;\r\n }\r\n\r\n /**\r\n * Gets the material fill mode\r\n */\r\n @serialize()\r\n public get fillMode(): number {\r\n return this._fillMode;\r\n }\r\n\r\n /**\r\n * Sets the material fill mode\r\n */\r\n public set fillMode(value: number) {\r\n if (this._fillMode === value) {\r\n return;\r\n }\r\n\r\n this._fillMode = value;\r\n this.markAsDirty(Material.MiscDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets or sets the active clipplane 1\r\n */\r\n public clipPlane: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 2\r\n */\r\n public clipPlane2: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 3\r\n */\r\n public clipPlane3: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 4\r\n */\r\n public clipPlane4: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 5\r\n */\r\n public clipPlane5: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 6\r\n */\r\n public clipPlane6: Nullable<Plane>;\r\n\r\n /**\r\n * Gives access to the stencil properties of the material\r\n */\r\n public readonly stencil = new MaterialStencilState();\r\n\r\n /**\r\n * @internal\r\n * Stores the effects for the material\r\n */\r\n protected _materialContext: IMaterialContext | undefined;\r\n\r\n protected _drawWrapper: DrawWrapper;\r\n /** @internal */\r\n public _getDrawWrapper(): DrawWrapper {\r\n return this._drawWrapper;\r\n }\r\n /**\r\n * @internal\r\n */\r\n public _setDrawWrapper(drawWrapper: DrawWrapper) {\r\n this._drawWrapper = drawWrapper;\r\n }\r\n\r\n /**\r\n * Specifies if uniform buffers should be used\r\n */\r\n private _useUBO: boolean = false;\r\n\r\n /**\r\n * Stores a reference to the scene\r\n */\r\n private _scene: Scene;\r\n protected _needToBindSceneUbo: boolean;\r\n\r\n /**\r\n * Stores the fill mode state\r\n */\r\n private _fillMode = Material.TriangleFillMode;\r\n\r\n /**\r\n * Specifies if the depth write state should be cached\r\n */\r\n private _cachedDepthWriteState: boolean = false;\r\n\r\n /**\r\n * Specifies if the color write state should be cached\r\n */\r\n private _cachedColorWriteState: boolean = false;\r\n\r\n /**\r\n * Specifies if the depth function state should be cached\r\n */\r\n private _cachedDepthFunctionState: number = 0;\r\n\r\n /**\r\n * Stores the uniform buffer\r\n * @internal\r\n */\r\n public _uniformBuffer: UniformBuffer;\r\n\r\n /** @internal */\r\n public _indexInSceneMaterialArray = -1;\r\n\r\n /** @internal */\r\n public meshMap: Nullable<{ [id: string]: AbstractMesh | undefined }> = null;\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable<AbstractScene> = null;\r\n\r\n /** @internal */\r\n public _dirtyCallbacks: { [code: number]: () => void };\r\n\r\n /** @internal */\r\n public _uniformBufferLayoutBuilt = false;\r\n\r\n protected _eventInfo: MaterialPluginCreated &\r\n MaterialPluginDisposed &\r\n MaterialPluginHasTexture &\r\n MaterialPluginIsReadyForSubMesh &\r\n MaterialPluginGetDefineNames &\r\n MaterialPluginPrepareEffect &\r\n MaterialPluginPrepareDefines &\r\n MaterialPluginPrepareUniformBuffer &\r\n MaterialPluginBindForSubMesh &\r\n MaterialPluginGetAnimatables &\r\n MaterialPluginGetActiveTextures &\r\n MaterialPluginFillRenderTargetTextures &\r\n MaterialPluginHasRenderTargetTextures &\r\n MaterialPluginHardBindForSubMesh = {} as any; // will be initialized before each event notification\r\n\r\n /** @internal */\r\n public _callbackPluginEventGeneric: (\r\n id: number,\r\n info:\r\n | MaterialPluginGetActiveTextures\r\n | MaterialPluginGetAnimatables\r\n | MaterialPluginHasTexture\r\n | MaterialPluginDisposed\r\n | MaterialPluginGetDefineNames\r\n | MaterialPluginPrepareEffect\r\n | MaterialPluginPrepareUniformBuffer\r\n ) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventIsReadyForSubMesh: (eventData: MaterialPluginIsReadyForSubMesh) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventPrepareDefines: (eventData: MaterialPluginPrepareDefines) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventPrepareDefinesBeforeAttributes: (eventData: MaterialPluginPrepareDefines) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventHardBindForSubMesh: (eventData: MaterialPluginHardBindForSubMesh) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventBindForSubMesh: (eventData: MaterialPluginBindForSubMesh) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventHasRenderTargetTextures: (eventData: MaterialPluginHasRenderTargetTextures) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventFillRenderTargetTextures: (eventData: MaterialPluginFillRenderTargetTextures) => void = () => void 0;\r\n\r\n /**\r\n * Creates a material instance\r\n * @param name defines the name of the material\r\n * @param scene defines the scene to reference\r\n * @param doNotAdd specifies if the material should be added to the scene\r\n */\r\n constructor(name: string, scene?: Nullable<Scene>, doNotAdd?: boolean) {\r\n this.name = name;\r\n const setScene = scene || EngineStore.LastCreatedScene;\r\n if (!setScene) {\r\n return;\r\n }\r\n this._scene = setScene;\r\n this._dirtyCallbacks = {};\r\n\r\n this._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag] = this._markAllSubMeshesAsTexturesDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_LightDirtyFlag] = this._markAllSubMeshesAsLightsDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_FresnelDirtyFlag] = this._markAllSubMeshesAsFresnelDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_AttributesDirtyFlag] = this._markAllSubMeshesAsAttributesDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_MiscDirtyFlag] = this._markAllSubMeshesAsMiscDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_PrePassDirtyFlag] = this._markAllSubMeshesAsPrePassDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_AllDirtyFlag] = this._markAllSubMeshesAsAllDirty.bind(this);\r\n\r\n this.id = name || Tools.RandomId();\r\n this.uniqueId = this._scene.getUniqueId();\r\n this._materialContext = this._scene.getEngine().createMaterialContext();\r\n this._drawWrapper = new DrawWrapper(this._scene.getEngine(), false);\r\n this._drawWrapper.materialContext = this._materialContext;\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n this.sideOrientation = Material.ClockWiseSideOrientation;\r\n } else {\r\n this.sideOrientation = Material.CounterClockWiseSideOrientation;\r\n }\r\n\r\n this._uniformBuffer = new UniformBuffer(this._scene.getEngine(), undefined, undefined, name);\r\n this._useUBO = this.getScene().getEngine().supportsUniformBuffers;\r\n\r\n if (!doNotAdd) {\r\n this._scene.addMaterial(this);\r\n }\r\n\r\n if (this._scene.useMaterialMeshMap) {\r\n this.meshMap = {};\r\n }\r\n\r\n Material.OnEventObservable.notifyObservers(this, MaterialPluginEvent.Created);\r\n }\r\n\r\n /**\r\n * Returns a string representation of the current material\r\n * @param fullDetails defines a boolean indicating which levels of logging is desired\r\n * @returns a string with material information\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public toString(fullDetails?: boolean): string {\r\n const ret = \"Name: \" + this.name;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Gets the class name of the material\r\n * @returns a string with the class name of the material\r\n */\r\n public getClassName(): string {\r\n return \"Material\";\r\n }\r\n\r\n /**\r\n * Specifies if updates for the material been locked\r\n */\r\n public get isFrozen(): boolean {\r\n return this.checkReadyOnlyOnce;\r\n }\r\n\r\n /**\r\n * Locks updates for the material\r\n */\r\n public freeze(): void {\r\n this.markDirty();\r\n this.checkReadyOnlyOnce = true;\r\n }\r\n\r\n /**\r\n * Unlocks updates for the material\r\n */\r\n public unfreeze(): void {\r\n this.markDirty();\r\n this.checkReadyOnlyOnce = false;\r\n }\r\n\r\n /**\r\n * Specifies if the material is ready to be used\r\n * @param mesh defines the mesh to check\r\n * @param useInstances specifies if instances should be used\r\n * @returns a boolean indicating if the material is ready to be used\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReady(mesh?: AbstractMesh, useInstances?: boolean): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Specifies that the submesh is ready to be used\r\n * @param mesh defines the mesh to check\r\n * @param subMesh defines which submesh to check\r\n * @param useInstances specifies that instances should be used\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean {\r\n const defines = subMesh.materialDefines;\r\n if (!defines) {\r\n return false;\r\n }\r\n\r\n this._eventInfo.isReadyForSubMesh = true;\r\n this._eventInfo.defines = defines;\r\n this._callbackPluginEventIsReadyForSubMesh(this._eventInfo);\r\n\r\n return this._eventInfo.isReadyForSubMesh;\r\n }\r\n\r\n /**\r\n * Returns the material effect\r\n * @returns the effect associated with the material\r\n */\r\n public getEffect(): Nullable<Effect> {\r\n return this._drawWrapper.effect;\r\n }\r\n\r\n /**\r\n * Returns the current scene\r\n * @returns a Scene\r\n */\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Enforces alpha test in opaque or blend mode in order to improve the performances of some situations.\r\n */\r\n protected _forceAlphaTest = false;\r\n\r\n /**\r\n * The transparency mode of the material.\r\n */\r\n protected _transparencyMode: Nullable<number> = null;\r\n\r\n /**\r\n * Gets the current transparency mode.\r\n */\r\n @serialize()\r\n public get transparencyMode(): Nullable<number> {\r\n return this._transparencyMode;\r\n }\r\n\r\n /**\r\n * Sets the transparency mode of the material.\r\n *\r\n * | Value | Type | Description |\r\n * | ----- | ----------------------------------- | ----------- |\r\n * | 0 | OPAQUE | |\r\n * | 1 | ALPHATEST | |\r\n * | 2 | ALPHABLEND | |\r\n * | 3 | ALPHATESTANDBLEND | |\r\n *\r\n */\r\n public set transparencyMode(value: Nullable<number>) {\r\n if (this._transparencyMode === value) {\r\n return;\r\n }\r\n\r\n this._transparencyMode = value;\r\n\r\n this._forceAlphaTest = value === Material.MATERIAL_ALPHATESTANDBLEND;\r\n\r\n this._markAllSubMeshesAsTexturesAndMiscDirty();\r\n }\r\n\r\n /**\r\n * Returns true if alpha blending should be disabled.\r\n */\r\n protected get _disableAlphaBlending(): boolean {\r\n return this._transparencyMode === Material.MATERIAL_OPAQUE || this._transparencyMode === Material.MATERIAL_ALPHATEST;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha blend mode.\r\n * @returns a boolean specifying if alpha blending is needed\r\n */\r\n public needAlphaBlending(): boolean {\r\n if (this._disableAlphaBlending) {\r\n return false;\r\n }\r\n\r\n return this.alpha < 1.0;\r\n }\r\n\r\n /**\r\n * Specifies if the mesh will require alpha blending\r\n * @param mesh defines the mesh to check\r\n * @returns a boolean specifying if alpha blending is needed for the mesh\r\n */\r\n public needAlphaBlendingForMesh(mesh: AbstractMesh): boolean {\r\n if (mesh.visibility < 1.0) {\r\n return true;\r\n }\r\n\r\n if (this._disableAlphaBlending) {\r\n return false;\r\n }\r\n\r\n return mesh.hasVertexAlpha || this.needAlphaBlending();\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha test mode.\r\n * @returns a boolean specifying if an alpha test is needed.\r\n */\r\n public needAlphaTesting(): boolean {\r\n if (this._forceAlphaTest) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies if material alpha testing should be turned on for the mesh\r\n * @param mesh defines the mesh to check\r\n */\r\n protected _shouldTurnAlphaTestOn(mesh: AbstractMesh): boolean {\r\n return !this.needAlphaBlendingForMesh(mesh) && this.needAlphaTesting();\r\n }\r\n\r\n /**\r\n * Gets the texture used for the alpha test\r\n * @returns the texture to use for alpha testing\r\n */\r\n public getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate that it needs to be re-calculated\r\n */\r\n public markDirty(): void {\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n if (subMesh.getMaterial() !== this) {\r\n continue;\r\n }\r\n\r\n if (!subMesh.effect) {\r\n continue;\r\n }\r\n\r\n subMesh.effect._wasPreviouslyReady = false;\r\n subMesh.effect._wasPreviouslyUsingInstances = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _preBind(effect?: Effect | DrawWrapper, overrideOrientation: Nullable<number> = null): boolean {\r\n const engine = this._scene.getEngine();\r\n\r\n const orientation = overrideOrientation == null ? this.sideOrientation : overrideOrientation;\r\n const reverse = orientation === Material.ClockWiseSideOrientation;\r\n\r\n engine.enableEffect(effect ? effect : this._getDrawWrapper());\r\n engine.setState(\r\n this.backFaceCulling,\r\n this.zOffset,\r\n false,\r\n reverse,\r\n this._scene._mirroredCameraPosition ? !this.cullBackFaces : this.cullBackFaces,\r\n this.stencil,\r\n this.zOffsetUnits\r\n );\r\n\r\n return reverse;\r\n }\r\n\r\n /**\r\n * Binds the material to the mesh\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh to bind the material to\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bind(world: Matrix, mesh?: Mesh): void {}\r\n\r\n /**\r\n * Initializes the uniform buffer layout for the shader.\r\n */\r\n public buildUniformLayout(): void {\r\n const ubo = this._uniformBuffer;\r\n\r\n this._eventInfo.ubo = ubo;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.PrepareUniformBuffer, this._eventInfo);\r\n\r\n ubo.create();\r\n\r\n this._uniformBufferLayoutBuilt = true;\r\n }\r\n\r\n /**\r\n * Binds the submesh to the material\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventBindForSubMesh(this._eventInfo);\r\n }\r\n\r\n /**\r\n * Binds the world matrix to the material\r\n * @param world defines the world transformation matrix\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bindOnlyWorldMatrix(world: Matrix): void {}\r\n\r\n /**\r\n * Binds the view matrix to the effect\r\n * @param effect defines the effect to bind the view matrix to\r\n */\r\n public bindView(effect: Effect): void {\r\n if (!this._useUBO) {\r\n effect.setMatrix(\"view\", this.getScene().getViewMatrix());\r\n } else {\r\n this._needToBindSceneUbo = true;\r\n }\r\n }\r\n\r\n /**\r\n * Binds the view projection and projection matrices to the effect\r\n * @param effect defines the effect to bind the view projection and projection matrices to\r\n */\r\n public bindViewProjection(effect: Effect): void {\r\n if (!this._useUBO) {\r\n effect.setMatrix(\"viewProjection\", this.getScene().getTransformMatrix());\r\n effect.setMatrix(\"projection\", this.getScene().getProjectionMatrix());\r\n } else {\r\n this._needToBindSceneUbo = true;\r\n }\r\n }\r\n\r\n /**\r\n * Binds the view matrix to the effect\r\n * @param effect defines the effect to bind the view matrix to\r\n * @param variableName name of the shader variable that will hold the eye position\r\n */\r\n public bindEyePosition(effect: Effect, variableName?: string): void {\r\n if (!this._useUBO) {\r\n this._scene.bindEyePosition(effect, variableName);\r\n } else {\r\n this._needToBindSceneUbo = true;\r\n }\r\n }\r\n\r\n /**\r\n * Processes to execute after binding the material to a mesh\r\n * @param mesh defines the rendered mesh\r\n * @param effect\r\n */\r\n protected _afterBind(mesh?: Mesh, effect: Nullable<Effect> = null): void {\r\n this._scene._cachedMaterial = this;\r\n if (this._needToBindSceneUbo) {\r\n if (effect) {\r\n this._needToBindSceneUbo = false;\r\n MaterialHelper.BindSceneUniformBuffer(effect, this.getScene().getSceneUniformBuffer());\r\n this._scene.finalizeSceneUbo();\r\n }\r\n }\r\n if (mesh) {\r\n this._scene._cachedVisibility = mesh.visibility;\r\n } else {\r\n this._scene._cachedVisibility = 1;\r\n }\r\n\r\n if (this._onBindObservable && mesh) {\r\n this._onBindObservable.notifyObservers(mesh);\r\n }\r\n\r\n if (this.disableDepthWrite) {\r\n const engine = this._scene.getEngine();\r\n this._cachedDepthWriteState = engine.getDepthWrite();\r\n engine.setDepthWrite(false);\r\n }\r\n\r\n if (this.disableColorWrite) {\r\n const engine = this._scene.getEngine();\r\n this._cachedColorWriteState = engine.getColorWrite();\r\n engine.setColorWrite(false);\r\n }\r\n\r\n if (this.depthFunction !== 0) {\r\n const engine = this._scene.getEngine();\r\n this._cachedDepthFunctionState = engine.getDepthFunction() || 0;\r\n engine.setDepthFunction(this.depthFunction);\r\n }\r\n }\r\n\r\n /**\r\n * Unbinds the material from the mesh\r\n */\r\n public unbind(): void {\r\n if (this._onUnBindObservable) {\r\n this._onUnBindObservable.notifyObservers(this);\r\n }\r\n\r\n if (this.depthFunction !== 0) {\r\n const engine = this._scene.getEngine();\r\n engine.setDepthFunction(this._cachedDepthFunctionState);\r\n }\r\n\r\n if (this.disableDepthWrite) {\r\n const engine = this._scene.getEngine();\r\n engine.setDepthWrite(this._cachedDepthWriteState);\r\n }\r\n\r\n if (this.disableColorWrite) {\r\n const engine = this._scene.getEngine();\r\n engine.setColorWrite(this._cachedColorWriteState);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the animatable textures.\r\n * @returns - Array of animatable textures.\r\n */\r\n public getAnimatables(): IAnimatable[] {\r\n this._eventInfo.animatables = [];\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetAnimatables, this._eventInfo);\r\n return this._eventInfo.animatables;\r\n }\r\n\r\n /**\r\n * Gets the active textures from the material\r\n * @returns an array of textures\r\n */\r\n public getActiveTextures(): BaseTexture[] {\r\n this._eventInfo.activeTextures = [];\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetActiveTextures, this._eventInfo);\r\n return this._eventInfo.activeTextures;\r\n }\r\n\r\n /**\r\n * Specifies if the material uses a texture\r\n * @param texture defines the texture to check against the material\r\n * @returns a boolean specifying if the material uses the texture\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n this._eventInfo.hasTexture = false;\r\n this._eventInfo.texture = texture;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.HasTexture, this._eventInfo);\r\n return this._eventInfo.hasTexture;\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the material, and gives it a new name\r\n * @param name defines the new name for the duplicated material\r\n * @returns the cloned material\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public clone(name: string): Nullable<Material> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the meshes bound to the material\r\n * @returns an array of meshes bound to the material\r\n */\r\n public getBindedMeshes(): AbstractMesh[] {\r\n if (this.meshMap) {\r\n const result = new Array<AbstractMesh>();\r\n for (const meshId in this.meshMap) {\r\n const mesh = this.meshMap[meshId];\r\n if (mesh) {\r\n result.push(mesh);\r\n }\r\n }\r\n return result;\r\n } else {\r\n const meshes = this._scene.meshes;\r\n return meshes.filter((mesh) => mesh.material === this);\r\n }\r\n }\r\n\r\n /**\r\n * Force shader compilation\r\n * @param mesh defines the mesh associated with this material\r\n * @param onCompiled defines a function to execute once the material is compiled\r\n * @param options defines the options to configure the compilation\r\n * @param onError defines a function to execute if the material fails compiling\r\n */\r\n public forceCompilation(\r\n mesh: AbstractMesh,\r\n onCompiled?: (material: Material) => void,\r\n options?: Partial<IMaterialCompilationOptions>,\r\n onError?: (reason: string) => void\r\n ): void {\r\n const localOptions = {\r\n clipPlane: false,\r\n useInstances: false,\r\n ...options,\r\n };\r\n\r\n const scene = this.getScene();\r\n const currentHotSwapingState = this.allowShaderHotSwapping;\r\n this.allowShaderHotSwapping = false; // Turned off to let us evaluate the real compilation state\r\n\r\n const checkReady = () => {\r\n if (!this._scene || !this._scene.getEngine()) {\r\n return;\r\n }\r\n\r\n const clipPlaneState = scene.clipPlane;\r\n\r\n if (localOptions.clipPlane) {\r\n scene.clipPlane = new Plane(0, 0, 0, 1);\r\n }\r\n\r\n if (this._storeEffectOnSubMeshes) {\r\n let allDone = true,\r\n lastError = null;\r\n if (mesh.subMeshes) {\r\n const tempSubMesh = new SubMesh(0, 0, 0, 0, 0, mesh, undefined, false, false);\r\n if (tempSubMesh.materialDefines) {\r\n tempSubMesh.materialDefines._renderId = -1;\r\n }\r\n if (!this.isReadyForSubMesh(mesh, tempSubMesh, localOptions.useInstances)) {\r\n if (tempSubMesh.effect && tempSubMesh.effect.getCompilationError() && tempSubMesh.effect.allFallbacksProcessed()) {\r\n lastError = tempSubMesh.effect.getCompilationError();\r\n } else {\r\n allDone = false;\r\n setTimeout(checkReady, 16);\r\n }\r\n }\r\n }\r\n if (allDone) {\r\n this.allowShaderHotSwapping = currentHotSwapingState;\r\n if (lastError) {\r\n if (onError) {\r\n onError(lastError);\r\n }\r\n }\r\n if (onCompiled) {\r\n onCompiled(this);\r\n }\r\n }\r\n } else {\r\n if (this.isReady()) {\r\n this.allowShaderHotSwapping = currentHotSwapingState;\r\n if (onCompiled) {\r\n onCompiled(this);\r\n }\r\n } else {\r\n setTimeout(checkReady, 16);\r\n }\r\n }\r\n\r\n if (localOptions.clipPlane) {\r\n scene.clipPlane = clipPlaneState;\r\n }\r\n };\r\n\r\n checkReady();\r\n }\r\n\r\n /**\r\n * Force shader compilation\r\n * @param mesh defines the mesh that will use this material\r\n * @param options defines additional options for compiling the shaders\r\n * @returns a promise that resolves when the compilation completes\r\n */\r\n public forceCompilationAsync(mesh: AbstractMesh, options?: Partial<IMaterialCompilationOptions>): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this.forceCompilation(\r\n mesh,\r\n () => {\r\n resolve();\r\n },\r\n options,\r\n (reason) => {\r\n reject(reason);\r\n }\r\n );\r\n });\r\n }\r\n\r\n private static readonly _AllDirtyCallBack = (defines: MaterialDefines) => defines.markAllAsDirty();\r\n private static readonly _ImageProcessingDirtyCallBack = (defines: MaterialDefines) => defines.markAsImageProcessingDirty();\r\n private static readonly _TextureDirtyCallBack = (defines: MaterialDefines) => defines.markAsTexturesDirty();\r\n private static readonly _FresnelDirtyCallBack = (defines: MaterialDefines) => defines.markAsFresnelDirty();\r\n private static readonly _MiscDirtyCallBack = (defines: MaterialDefines) => defines.markAsMiscDirty();\r\n private static readonly _PrePassDirtyCallBack = (defines: MaterialDefines) => defines.markAsPrePassDirty();\r\n private static readonly _LightsDirtyCallBack = (defines: MaterialDefines) => defines.markAsLightDirty();\r\n private static readonly _AttributeDirtyCallBack = (defines: MaterialDefines) => defines.markAsAttributesDirty();\r\n\r\n private static _FresnelAndMiscDirtyCallBack = (defines: MaterialDefines) => {\r\n Material._FresnelDirtyCallBack(defines);\r\n Material._MiscDirtyCallBack(defines);\r\n };\r\n\r\n private static _TextureAndMiscDirtyCallBack = (defines: MaterialDefines) => {\r\n Material._TextureDirtyCallBack(defines);\r\n Material._MiscDirtyCallBack(defines);\r\n };\r\n\r\n private static readonly _DirtyCallbackArray: Array<(defines: MaterialDefines) => void> = [];\r\n private static readonly _RunDirtyCallBacks = (defines: MaterialDefines) => {\r\n for (const cb of Material._DirtyCallbackArray) {\r\n cb(defines);\r\n }\r\n };\r\n\r\n /**\r\n * Marks a define in the material to indicate that it needs to be re-computed\r\n * @param flag defines a flag used to determine which parts of the material have to be marked as dirty\r\n */\r\n public markAsDirty(flag: number): void {\r\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism) {\r\n return;\r\n }\r\n\r\n Material._DirtyCallbackArray.length = 0;\r\n\r\n if (flag & Material.TextureDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._TextureDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.LightDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._LightsDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.FresnelDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._FresnelDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.AttributesDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._AttributeDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.MiscDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._MiscDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.PrePassDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._PrePassDirtyCallBack);\r\n }\r\n\r\n if (Material._DirtyCallbackArray.length) {\r\n this._markAllSubMeshesAsDirty(Material._RunDirtyCallBacks);\r\n }\r\n\r\n this.getScene().resetCachedMaterial();\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache for all submeshes that are using this material\r\n */\r\n public resetDrawCache(): void {\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n if (subMesh.getMaterial() !== this) {\r\n continue;\r\n }\r\n\r\n subMesh.resetDrawCache();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Marks all submeshes of a material to indicate that their material defines need to be re-calculated\r\n * @param func defines a function which checks material defines against the submeshes\r\n */\r\n protected _markAllSubMeshesAsDirty(func: (defines: MaterialDefines) => void) {\r\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism) {\r\n return;\r\n }\r\n\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n // We want to skip the submeshes which are not using this material or which have not yet rendered at least once\r\n if (subMesh.getMaterial(false) !== this) {\r\n continue;\r\n }\r\n\r\n for (const drawWrapper of subMesh._drawWrappers) {\r\n if (!drawWrapper || !drawWrapper.defines || !(drawWrapper.defines as MaterialDefines).markAllAsDirty) {\r\n continue;\r\n }\r\n if (this._materialContext === drawWrapper.materialContext) {\r\n func(drawWrapper.defines as MaterialDefines);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Indicates that the scene should check if the rendering now needs a prepass\r\n */\r\n protected _markScenePrePassDirty() {\r\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism) {\r\n return;\r\n }\r\n\r\n const prePassRenderer = this.getScene().enablePrePassRenderer();\r\n if (prePassRenderer) {\r\n prePassRenderer.markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Indicates that we need to re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsAllDirty() {\r\n this._markAllSubMeshesAsDirty(Material._AllDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that image processing needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsImageProcessingDirty() {\r\n this._markAllSubMeshesAsDirty(Material._ImageProcessingDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that textures need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsTexturesDirty() {\r\n this._markAllSubMeshesAsDirty(Material._TextureDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that fresnel needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsFresnelDirty() {\r\n this._markAllSubMeshesAsDirty(Material._FresnelDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that fresnel and misc need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsFresnelAndMiscDirty() {\r\n this._markAllSubMeshesAsDirty(Material._FresnelAndMiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that lights need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsLightsDirty() {\r\n this._markAllSubMeshesAsDirty(Material._LightsDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that attributes need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsAttributesDirty() {\r\n this._markAllSubMeshesAsDirty(Material._AttributeDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that misc needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsMiscDirty() {\r\n this._markAllSubMeshesAsDirty(Material._MiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that prepass needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsPrePassDirty() {\r\n this._markAllSubMeshesAsDirty(Material._MiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that textures and misc need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsTexturesAndMiscDirty() {\r\n this._markAllSubMeshesAsDirty(Material._TextureAndMiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Sets the required values to the prepass renderer.\r\n * @param prePassRenderer defines the prepass renderer to setup.\r\n * @returns true if the pre pass is needed.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean {\r\n // Do Nothing by default\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the material\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\r\n * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh\r\n */\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void {\r\n const scene = this.getScene();\r\n // Animations\r\n scene.stopAnimation(this);\r\n scene.freeProcessedMaterials();\r\n\r\n // Remove from scene\r\n scene.removeMaterial(this);\r\n\r\n this._eventInfo.forceDisposeTextures = forceDisposeTextures;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.Disposed, this._eventInfo);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.materials.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.materials.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n if (notBoundToMesh !== true) {\r\n // Remove from meshes\r\n if (this.meshMap) {\r\n for (const meshId in this.meshMap) {\r\n const mesh = this.meshMap[meshId];\r\n if (mesh) {\r\n mesh.material = null; // will set the entry in the map to undefined\r\n this.releaseVertexArrayObject(mesh, forceDisposeEffect);\r\n }\r\n }\r\n } else {\r\n const meshes = scene.meshes;\r\n for (const mesh of meshes) {\r\n if (mesh.material === this && !(mesh as InstancedMesh).sourceMesh) {\r\n mesh.material = null;\r\n this.releaseVertexArrayObject(mesh, forceDisposeEffect);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._uniformBuffer.dispose();\r\n\r\n // Shader are kept in cache for further use but we can get rid of this by using forceDisposeEffect\r\n if (forceDisposeEffect && this._drawWrapper.effect) {\r\n if (!this._storeEffectOnSubMeshes) {\r\n this._drawWrapper.effect.dispose();\r\n }\r\n\r\n this._drawWrapper.effect = null;\r\n }\r\n\r\n this.metadata = null;\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n\r\n this.onDisposeObservable.clear();\r\n if (this._onBindObservable) {\r\n this._onBindObservable.clear();\r\n }\r\n\r\n if (this._onUnBindObservable) {\r\n this._onUnBindObservable.clear();\r\n }\r\n\r\n if (this._onEffectCreatedObservable) {\r\n this._onEffectCreatedObservable.clear();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private releaseVertexArrayObject(mesh: AbstractMesh, forceDisposeEffect?: boolean) {\r\n if ((<Mesh>mesh).geometry) {\r\n const geometry = <Geometry>(<Mesh>mesh).geometry;\r\n if (this._storeEffectOnSubMeshes) {\r\n for (const subMesh of mesh.subMeshes) {\r\n geometry._releaseVertexArrayObject(subMesh.effect);\r\n if (forceDisposeEffect && subMesh.effect) {\r\n subMesh.effect.dispose();\r\n }\r\n }\r\n } else {\r\n geometry._releaseVertexArrayObject(this._drawWrapper.effect);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Serializes this material\r\n * @returns the serialized material object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n\r\n serializationObject.stencil = this.stencil.serialize();\r\n serializationObject.uniqueId = this.uniqueId;\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Creates a material from parsed material data\r\n * @param parsedMaterial defines parsed material data\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures\r\n * @returns a new material\r\n */\r\n public static Parse(parsedMaterial: any, scene: Scene, rootUrl: string): Nullable<Material> {\r\n if (!parsedMaterial.customType) {\r\n parsedMaterial.customType = \"BABYLON.StandardMaterial\";\r\n } else if (parsedMaterial.customType === \"BABYLON.PBRMaterial\" && parsedMaterial.overloadedAlbedo) {\r\n parsedMaterial.customType = \"BABYLON.LegacyPBRMaterial\";\r\n if (!BABYLON.LegacyPBRMaterial) {\r\n Logger.Error(\"Your scene is trying to load a legacy version of the PBRMaterial, please, include it from the materials library.\");\r\n return null;\r\n }\r\n }\r\n\r\n const materialType = Tools.Instantiate(parsedMaterial.customType);\r\n const material = materialType.Parse(parsedMaterial, scene, rootUrl);\r\n material._loadedUniqueId = parsedMaterial.uniqueId;\r\n return material;\r\n }\r\n}\r\n"]}
@@ -198,7 +198,6 @@ export class ShadowDepthWrapper {
198
198
  if (fragmentCodeToInjectAtEnd) {
199
199
  fragmentCode = fragmentCode.replace(/}\s*$/g, fragmentCodeToInjectAtEnd + "}");
200
200
  }
201
- fragmentCode = fragmentCode.replace(/#define SHADER_NAME.*?\n|out vec4 glFragColor;\n/g, "");
202
201
  uniforms.push("biasAndScaleSM", "depthValuesSM", "lightDataSM", "softTransparentShadowSM");
203
202
  }
204
203
  params.mainDrawWrapper.effect = engine.createEffect({
@@ -1 +1 @@
1
- {"version":3,"file":"shadowDepthWrapper.js","sourceRoot":"","sources":["../../../../lts/core/generated/Materials/shadowDepthWrapper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { Material } from \"./material\";\r\nimport type { IEffectCreationOptions } from \"./effect\";\r\nimport { Effect } from \"./effect\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Node } from \"../node\";\r\nimport type { ShadowGenerator } from \"../Lights/Shadows/shadowGenerator\";\r\nimport { RandomGUID } from \"../Misc/guid\";\r\nimport { DrawWrapper } from \"./drawWrapper\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n/**\r\n * Options to be used when creating a shadow depth material\r\n */\r\nexport interface IIOptionShadowDepthMaterial {\r\n /** Variables in the vertex shader code that need to have their names remapped.\r\n * The format is: [\"var_name\", \"var_remapped_name\", \"var_name\", \"var_remapped_name\", ...]\r\n * \"var_name\" should be either: worldPos or vNormalW\r\n * So, if the variable holding the world position in your vertex shader is not named worldPos, you must tell the system\r\n * the name to use instead by using: [\"worldPos\", \"myWorldPosVar\"] assuming the variable is named myWorldPosVar in your code.\r\n * If the normal must also be remapped: [\"worldPos\", \"myWorldPosVar\", \"vNormalW\", \"myWorldNormal\"]\r\n */\r\n remappedVariables?: string[];\r\n\r\n /** Set standalone to true if the base material wrapped by ShadowDepthMaterial is not used for a regular object but for depth shadow generation only */\r\n standalone?: boolean;\r\n\r\n /** Set doNotInjectCode if the specific shadow map generation code is already implemented by the material. That will prevent this code to be injected twice by ShadowDepthWrapper */\r\n doNotInjectCode?: boolean;\r\n}\r\n\r\nclass MapMap<Ka, Kb, V> {\r\n readonly mm = new Map<Ka, Map<Kb, V>>();\r\n\r\n get(a: Ka, b: Kb): V | undefined {\r\n const m = this.mm.get(a);\r\n if (m !== undefined) {\r\n return m.get(b);\r\n }\r\n return undefined;\r\n }\r\n\r\n set(a: Ka, b: Kb, v: V): void {\r\n let m = this.mm.get(a);\r\n if (m === undefined) {\r\n this.mm.set(a, (m = new Map()));\r\n }\r\n m.set(b, v);\r\n }\r\n}\r\n\r\n/**\r\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\r\n */\r\nexport class ShadowDepthWrapper {\r\n private _scene: Scene;\r\n private _options?: IIOptionShadowDepthMaterial;\r\n private _baseMaterial: Material;\r\n private _onEffectCreatedObserver: Nullable<Observer<{ effect: Effect; subMesh: Nullable<SubMesh> }>>;\r\n private _subMeshToEffect: Map<Nullable<SubMesh>, [Effect, number]>;\r\n private _subMeshToDepthWrapper: MapMap<\r\n Nullable<SubMesh>,\r\n ShadowGenerator,\r\n { drawWrapper: Array<Nullable<DrawWrapper>>; mainDrawWrapper: DrawWrapper; depthDefines: string; token: string }\r\n >; // key is (subMesh + shadowGenerator)\r\n private _meshes: Map<AbstractMesh, Nullable<Observer<Node>>>;\r\n\r\n /** Gets the standalone status of the wrapper */\r\n public get standalone(): boolean {\r\n return this._options?.standalone ?? false;\r\n }\r\n\r\n /** Gets the base material the wrapper is built upon */\r\n public get baseMaterial(): Material {\r\n return this._baseMaterial;\r\n }\r\n\r\n /** Gets the doNotInjectCode status of the wrapper */\r\n public get doNotInjectCode(): boolean {\r\n return this._options?.doNotInjectCode ?? false;\r\n }\r\n\r\n /**\r\n * Instantiate a new shadow depth wrapper.\r\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\r\n * generate the shadow depth map. For more information, please refer to the documentation:\r\n * https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows\r\n * @param baseMaterial Material to wrap\r\n * @param scene Define the scene the material belongs to\r\n * @param options Options used to create the wrapper\r\n */\r\n constructor(baseMaterial: Material, scene?: Scene, options?: IIOptionShadowDepthMaterial) {\r\n this._baseMaterial = baseMaterial;\r\n this._scene = scene ?? <Scene>EngineStore.LastCreatedScene;\r\n this._options = options;\r\n\r\n this._subMeshToEffect = new Map();\r\n this._subMeshToDepthWrapper = new MapMap();\r\n this._meshes = new Map();\r\n\r\n // Register for onEffectCreated to store the effect of the base material when it is (re)generated. This effect will be used\r\n // to create the depth effect later on\r\n this._onEffectCreatedObserver = this._baseMaterial.onEffectCreatedObservable.add((params: { effect: Effect; subMesh: Nullable<SubMesh> }) => {\r\n const mesh = params.subMesh?.getMesh();\r\n\r\n if (mesh && !this._meshes.has(mesh)) {\r\n // Register for mesh onDispose to clean up our internal maps when a mesh is disposed\r\n this._meshes.set(\r\n mesh,\r\n mesh.onDisposeObservable.add((mesh: Node) => {\r\n const iterator = this._subMeshToEffect.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const subMesh = key.value;\r\n if (subMesh?.getMesh() === (mesh as AbstractMesh)) {\r\n this._subMeshToEffect.delete(subMesh);\r\n this._subMeshToDepthWrapper.mm.delete(subMesh);\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n this._subMeshToEffect.set(params.subMesh, [params.effect, this._scene.getEngine().currentRenderPassId]);\r\n this._subMeshToDepthWrapper.mm.delete(params.subMesh); // trigger a depth effect recreation\r\n });\r\n }\r\n\r\n /**\r\n * Gets the effect to use to generate the depth map\r\n * @param subMesh subMesh to get the effect for\r\n * @param shadowGenerator shadow generator to get the effect for\r\n * @param passIdForDrawWrapper Id of the pass for which the effect from the draw wrapper must be retrieved from\r\n * @returns the effect to use to generate the depth map for the subMesh + shadow generator specified\r\n */\r\n public getEffect(subMesh: Nullable<SubMesh>, shadowGenerator: ShadowGenerator, passIdForDrawWrapper: number): Nullable<DrawWrapper> {\r\n const entry = this._subMeshToDepthWrapper.mm.get(subMesh)?.get(shadowGenerator);\r\n if (!entry) {\r\n return null;\r\n }\r\n let drawWrapper = entry.drawWrapper[passIdForDrawWrapper];\r\n if (!drawWrapper) {\r\n drawWrapper = entry.drawWrapper[passIdForDrawWrapper] = new DrawWrapper(this._scene.getEngine());\r\n drawWrapper.setEffect(entry.mainDrawWrapper.effect, entry.mainDrawWrapper.defines);\r\n }\r\n\r\n return drawWrapper;\r\n }\r\n\r\n /**\r\n * Specifies that the submesh is ready to be used for depth rendering\r\n * @param subMesh submesh to check\r\n * @param defines the list of defines to take into account when checking the effect\r\n * @param shadowGenerator combined with subMesh, it defines the effect to check\r\n * @param useInstances specifies that instances should be used\r\n * @param passIdForDrawWrapper Id of the pass for which the draw wrapper should be created\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n public isReadyForSubMesh(subMesh: SubMesh, defines: string[], shadowGenerator: ShadowGenerator, useInstances: boolean, passIdForDrawWrapper: number): boolean {\r\n if (this.standalone) {\r\n // will ensure the effect is (re)created for the base material\r\n if (!this._baseMaterial.isReadyForSubMesh(subMesh.getMesh(), subMesh, useInstances)) {\r\n return false;\r\n }\r\n }\r\n\r\n return this._makeEffect(subMesh, defines, shadowGenerator, passIdForDrawWrapper)?.isReady() ?? false;\r\n }\r\n\r\n /**\r\n * Disposes the resources\r\n */\r\n public dispose(): void {\r\n this._baseMaterial.onEffectCreatedObservable.remove(this._onEffectCreatedObserver);\r\n this._onEffectCreatedObserver = null;\r\n\r\n const iterator = this._meshes.entries();\r\n for (let entry = iterator.next(); entry.done !== true; entry = iterator.next()) {\r\n const [mesh, observer] = entry.value;\r\n\r\n mesh.onDisposeObservable.remove(observer);\r\n }\r\n }\r\n\r\n private _makeEffect(subMesh: SubMesh, defines: string[], shadowGenerator: ShadowGenerator, passIdForDrawWrapper: number): Nullable<Effect> {\r\n const engine = this._scene.getEngine();\r\n const origEffectAndRenderPassId = this._subMeshToEffect.get(subMesh);\r\n\r\n if (!origEffectAndRenderPassId) {\r\n return null;\r\n }\r\n\r\n const [origEffect, origRenderPassId] = origEffectAndRenderPassId;\r\n\r\n let params = this._subMeshToDepthWrapper.get(subMesh, shadowGenerator);\r\n if (!params) {\r\n const mainDrawWrapper = new DrawWrapper(engine);\r\n mainDrawWrapper.defines = subMesh._getDrawWrapper(origRenderPassId)?.defines ?? null;\r\n\r\n params = {\r\n drawWrapper: [],\r\n mainDrawWrapper,\r\n depthDefines: \"\",\r\n token: RandomGUID(),\r\n };\r\n params.drawWrapper[passIdForDrawWrapper] = mainDrawWrapper;\r\n this._subMeshToDepthWrapper.set(subMesh, shadowGenerator, params);\r\n }\r\n\r\n const join = defines.join(\"\\n\");\r\n\r\n if (params.mainDrawWrapper.effect) {\r\n if (join === params.depthDefines) {\r\n // we already created the depth effect and it is still up to date for this submesh + shadow generator\r\n return params.mainDrawWrapper.effect;\r\n }\r\n }\r\n\r\n params.depthDefines = join;\r\n\r\n const uniforms = origEffect.getUniformNames().slice();\r\n\r\n // the depth effect is either out of date or has not been created yet\r\n let vertexCode = origEffect.vertexSourceCodeBeforeMigration,\r\n fragmentCode = origEffect.fragmentSourceCodeBeforeMigration;\r\n\r\n if (!this.doNotInjectCode) {\r\n // vertex code\r\n const vertexNormalBiasCode =\r\n this._options && this._options.remappedVariables\r\n ? `#include<shadowMapVertexNormalBias>(${this._options.remappedVariables.join(\",\")})`\r\n : Effect.IncludesShadersStore[\"shadowMapVertexNormalBias\"],\r\n vertexMetricCode =\r\n this._options && this._options.remappedVariables\r\n ? `#include<shadowMapVertexMetric>(${this._options.remappedVariables.join(\",\")})`\r\n : Effect.IncludesShadersStore[\"shadowMapVertexMetric\"],\r\n fragmentSoftTransparentShadow =\r\n this._options && this._options.remappedVariables\r\n ? `#include<shadowMapFragmentSoftTransparentShadow>(${this._options.remappedVariables.join(\",\")})`\r\n : Effect.IncludesShadersStore[\"shadowMapFragmentSoftTransparentShadow\"],\r\n fragmentBlockCode = Effect.IncludesShadersStore[\"shadowMapFragment\"];\r\n\r\n vertexCode = vertexCode.replace(/void\\s+?main/g, Effect.IncludesShadersStore[\"shadowMapVertexExtraDeclaration\"] + \"\\r\\nvoid main\");\r\n vertexCode = vertexCode.replace(/#define SHADOWDEPTH_NORMALBIAS|#define CUSTOM_VERTEX_UPDATE_WORLDPOS/g, vertexNormalBiasCode);\r\n\r\n if (vertexCode.indexOf(\"#define SHADOWDEPTH_METRIC\") !== -1) {\r\n vertexCode = vertexCode.replace(/#define SHADOWDEPTH_METRIC/g, vertexMetricCode);\r\n } else {\r\n vertexCode = vertexCode.replace(/}\\s*$/g, vertexMetricCode + \"\\r\\n}\");\r\n }\r\n vertexCode = vertexCode.replace(/#define SHADER_NAME.*?\\n|out vec4 glFragColor;\\n/g, \"\");\r\n\r\n // fragment code\r\n const hasLocationForSoftTransparentShadow =\r\n fragmentCode.indexOf(\"#define SHADOWDEPTH_SOFTTRANSPARENTSHADOW\") >= 0 || fragmentCode.indexOf(\"#define CUSTOM_FRAGMENT_BEFORE_FOG\") >= 0;\r\n const hasLocationForFragment = fragmentCode.indexOf(\"#define SHADOWDEPTH_FRAGMENT\") !== -1;\r\n\r\n let fragmentCodeToInjectAtEnd = \"\";\r\n\r\n if (!hasLocationForSoftTransparentShadow) {\r\n fragmentCodeToInjectAtEnd = fragmentSoftTransparentShadow + \"\\r\\n\";\r\n } else {\r\n fragmentCode = fragmentCode.replace(/#define SHADOWDEPTH_SOFTTRANSPARENTSHADOW|#define CUSTOM_FRAGMENT_BEFORE_FOG/g, fragmentSoftTransparentShadow);\r\n }\r\n\r\n fragmentCode = fragmentCode.replace(/void\\s+?main/g, Effect.IncludesShadersStore[\"shadowMapFragmentExtraDeclaration\"] + \"\\r\\nvoid main\");\r\n\r\n if (hasLocationForFragment) {\r\n fragmentCode = fragmentCode.replace(/#define SHADOWDEPTH_FRAGMENT/g, fragmentBlockCode);\r\n } else {\r\n fragmentCodeToInjectAtEnd += fragmentBlockCode + \"\\r\\n\";\r\n }\r\n if (fragmentCodeToInjectAtEnd) {\r\n fragmentCode = fragmentCode.replace(/}\\s*$/g, fragmentCodeToInjectAtEnd + \"}\");\r\n }\r\n\r\n fragmentCode = fragmentCode.replace(/#define SHADER_NAME.*?\\n|out vec4 glFragColor;\\n/g, \"\");\r\n\r\n uniforms.push(\"biasAndScaleSM\", \"depthValuesSM\", \"lightDataSM\", \"softTransparentShadowSM\");\r\n }\r\n\r\n params.mainDrawWrapper.effect = engine.createEffect(\r\n {\r\n vertexSource: vertexCode,\r\n fragmentSource: fragmentCode,\r\n vertexToken: params.token,\r\n fragmentToken: params.token,\r\n },\r\n <IEffectCreationOptions>{\r\n attributes: origEffect.getAttributesNames(),\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: origEffect.getUniformBuffersNames(),\r\n samplers: origEffect.getSamplers(),\r\n defines: join + \"\\n\" + origEffect.defines.replace(\"#define SHADOWS\", \"\").replace(/#define SHADOW\\d/g, \"\"),\r\n indexParameters: origEffect.getIndexParameters(),\r\n },\r\n engine\r\n );\r\n\r\n for (let id = 0; id < params.drawWrapper.length; ++id) {\r\n if (id !== passIdForDrawWrapper) {\r\n params.drawWrapper[id]?.setEffect(params.mainDrawWrapper.effect, params.mainDrawWrapper.defines);\r\n }\r\n }\r\n return params.mainDrawWrapper.effect;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"shadowDepthWrapper.js","sourceRoot":"","sources":["../../../../lts/core/generated/Materials/shadowDepthWrapper.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAsBrD,MAAM,MAAM;IAAZ;QACa,OAAE,GAAG,IAAI,GAAG,EAAkB,CAAC;IAiB5C,CAAC;IAfG,GAAG,CAAC,CAAK,EAAE,CAAK;QACZ,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,SAAS,EAAE;YACjB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACnB;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,CAAK,EAAE,CAAK,EAAE,CAAI;QAClB,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,SAAS,EAAE;YACjB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;SACnC;QACD,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,OAAO,kBAAkB;IA4B3B;;;;;;;;OAQG;IACH,YAAY,YAAsB,EAAE,KAAa,EAAE,OAAqC;QACpF,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAW,WAAW,CAAC,gBAAgB,CAAC;QAC3D,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAExB,IAAI,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,sBAAsB,GAAG,IAAI,MAAM,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QAEzB,2HAA2H;QAC3H,sCAAsC;QACtC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,MAAsD,EAAE,EAAE;;YACxI,MAAM,IAAI,GAAG,MAAA,MAAM,CAAC,OAAO,0CAAE,OAAO,EAAE,CAAC;YAEvC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACjC,oFAAoF;gBACpF,IAAI,CAAC,OAAO,CAAC,GAAG,CACZ,IAAI,EACJ,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAU,EAAE,EAAE;oBACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;oBAC9C,KAAK,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE;wBACtE,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC;wBAC1B,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,EAAE,MAAM,IAAqB,EAAE;4BAC/C,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;4BACtC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;yBAClD;qBACJ;gBACL,CAAC,CAAC,CACL,CAAC;aACL;YAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACxG,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC;QAC/F,CAAC,CAAC,CAAC;IACP,CAAC;IA1DD,gDAAgD;IAChD,IAAW,UAAU;;QACjB,OAAO,MAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,UAAU,mCAAI,KAAK,CAAC;IAC9C,CAAC;IAED,uDAAuD;IACvD,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,qDAAqD;IACrD,IAAW,eAAe;;QACtB,OAAO,MAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,eAAe,mCAAI,KAAK,CAAC;IACnD,CAAC;IA+CD;;;;;;OAMG;IACI,SAAS,CAAC,OAA0B,EAAE,eAAgC,EAAE,oBAA4B;;QACvG,MAAM,KAAK,GAAG,MAAA,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,0CAAE,GAAG,CAAC,eAAe,CAAC,CAAC;QAChF,IAAI,CAAC,KAAK,EAAE;YACR,OAAO,IAAI,CAAC;SACf;QACD,IAAI,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;QAC1D,IAAI,CAAC,WAAW,EAAE;YACd,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YACjG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;SACtF;QAED,OAAO,WAAW,CAAC;IACvB,CAAC;IAED;;;;;;;;OAQG;IACI,iBAAiB,CAAC,OAAgB,EAAE,OAAiB,EAAE,eAAgC,EAAE,YAAqB,EAAE,oBAA4B;;QAC/I,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,8DAA8D;YAC9D,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE;gBACjF,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,OAAO,MAAA,MAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,oBAAoB,CAAC,0CAAE,OAAO,EAAE,mCAAI,KAAK,CAAC;IACzG,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACnF,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACxC,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE;YAC5E,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;YAErC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SAC7C;IACL,CAAC;IAEO,WAAW,CAAC,OAAgB,EAAE,OAAiB,EAAE,eAAgC,EAAE,oBAA4B;;QACnH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,yBAAyB,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAErE,IAAI,CAAC,yBAAyB,EAAE;YAC5B,OAAO,IAAI,CAAC;SACf;QAED,MAAM,CAAC,UAAU,EAAE,gBAAgB,CAAC,GAAG,yBAAyB,CAAC;QAEjE,IAAI,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,EAAE;YACT,MAAM,eAAe,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;YAChD,eAAe,CAAC,OAAO,GAAG,MAAA,MAAA,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,0CAAE,OAAO,mCAAI,IAAI,CAAC;YAErF,MAAM,GAAG;gBACL,WAAW,EAAE,EAAE;gBACf,eAAe;gBACf,YAAY,EAAE,EAAE;gBAChB,KAAK,EAAE,UAAU,EAAE;aACtB,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,eAAe,CAAC;YAC3D,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;SACrE;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhC,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE;YAC/B,IAAI,IAAI,KAAK,MAAM,CAAC,YAAY,EAAE;gBAC9B,qGAAqG;gBACrG,OAAO,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;aACxC;SACJ;QAED,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;QAE3B,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,CAAC;QAEtD,qEAAqE;QACrE,IAAI,UAAU,GAAG,UAAU,CAAC,+BAA+B,EACvD,YAAY,GAAG,UAAU,CAAC,iCAAiC,CAAC;QAEhE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACvB,cAAc;YACd,MAAM,oBAAoB,GAClB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB;gBAC5C,CAAC,CAAC,uCAAuC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;gBACrF,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,EAClE,gBAAgB,GACZ,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB;gBAC5C,CAAC,CAAC,mCAAmC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;gBACjF,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,uBAAuB,CAAC,EAC9D,6BAA6B,GACzB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB;gBAC5C,CAAC,CAAC,oDAAoD,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;gBAClG,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,wCAAwC,CAAC,EAC/E,iBAAiB,GAAG,MAAM,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;YAEzE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,oBAAoB,CAAC,iCAAiC,CAAC,GAAG,eAAe,CAAC,CAAC;YACnI,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,uEAAuE,EAAE,oBAAoB,CAAC,CAAC;YAE/H,IAAI,UAAU,CAAC,OAAO,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,EAAE;gBACzD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,6BAA6B,EAAE,gBAAgB,CAAC,CAAC;aACpF;iBAAM;gBACH,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC;aACzE;YACD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,mDAAmD,EAAE,EAAE,CAAC,CAAC;YAEzF,gBAAgB;YAChB,MAAM,mCAAmC,GACrC,YAAY,CAAC,OAAO,CAAC,2CAA2C,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,oCAAoC,CAAC,IAAI,CAAC,CAAC;YAC9I,MAAM,sBAAsB,GAAG,YAAY,CAAC,OAAO,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC,CAAC;YAE3F,IAAI,yBAAyB,GAAG,EAAE,CAAC;YAEnC,IAAI,CAAC,mCAAmC,EAAE;gBACtC,yBAAyB,GAAG,6BAA6B,GAAG,MAAM,CAAC;aACtE;iBAAM;gBACH,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,+EAA+E,EAAE,6BAA6B,CAAC,CAAC;aACvJ;YAED,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,oBAAoB,CAAC,mCAAmC,CAAC,GAAG,eAAe,CAAC,CAAC;YAEzI,IAAI,sBAAsB,EAAE;gBACxB,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,+BAA+B,EAAE,iBAAiB,CAAC,CAAC;aAC3F;iBAAM;gBACH,yBAAyB,IAAI,iBAAiB,GAAG,MAAM,CAAC;aAC3D;YACD,IAAI,yBAAyB,EAAE;gBAC3B,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,yBAAyB,GAAG,GAAG,CAAC,CAAC;aAClF;YAED,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,yBAAyB,CAAC,CAAC;SAC9F;QAED,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,CAC/C;YACI,YAAY,EAAE,UAAU;YACxB,cAAc,EAAE,YAAY;YAC5B,WAAW,EAAE,MAAM,CAAC,KAAK;YACzB,aAAa,EAAE,MAAM,CAAC,KAAK;SAC9B,EACuB;YACpB,UAAU,EAAE,UAAU,CAAC,kBAAkB,EAAE;YAC3C,aAAa,EAAE,QAAQ;YACvB,mBAAmB,EAAE,UAAU,CAAC,sBAAsB,EAAE;YACxD,QAAQ,EAAE,UAAU,CAAC,WAAW,EAAE;YAClC,OAAO,EAAE,IAAI,GAAG,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;YACzG,eAAe,EAAE,UAAU,CAAC,kBAAkB,EAAE;SACnD,EACD,MAAM,CACT,CAAC;QAEF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;YACnD,IAAI,EAAE,KAAK,oBAAoB,EAAE;gBAC7B,MAAA,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,0CAAE,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;aACpG;SACJ;QACD,OAAO,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;IACzC,CAAC;CACJ","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { Material } from \"./material\";\r\nimport type { IEffectCreationOptions } from \"./effect\";\r\nimport { Effect } from \"./effect\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Node } from \"../node\";\r\nimport type { ShadowGenerator } from \"../Lights/Shadows/shadowGenerator\";\r\nimport { RandomGUID } from \"../Misc/guid\";\r\nimport { DrawWrapper } from \"./drawWrapper\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n/**\r\n * Options to be used when creating a shadow depth material\r\n */\r\nexport interface IIOptionShadowDepthMaterial {\r\n /** Variables in the vertex shader code that need to have their names remapped.\r\n * The format is: [\"var_name\", \"var_remapped_name\", \"var_name\", \"var_remapped_name\", ...]\r\n * \"var_name\" should be either: worldPos or vNormalW\r\n * So, if the variable holding the world position in your vertex shader is not named worldPos, you must tell the system\r\n * the name to use instead by using: [\"worldPos\", \"myWorldPosVar\"] assuming the variable is named myWorldPosVar in your code.\r\n * If the normal must also be remapped: [\"worldPos\", \"myWorldPosVar\", \"vNormalW\", \"myWorldNormal\"]\r\n */\r\n remappedVariables?: string[];\r\n\r\n /** Set standalone to true if the base material wrapped by ShadowDepthMaterial is not used for a regular object but for depth shadow generation only */\r\n standalone?: boolean;\r\n\r\n /** Set doNotInjectCode if the specific shadow map generation code is already implemented by the material. That will prevent this code to be injected twice by ShadowDepthWrapper */\r\n doNotInjectCode?: boolean;\r\n}\r\n\r\nclass MapMap<Ka, Kb, V> {\r\n readonly mm = new Map<Ka, Map<Kb, V>>();\r\n\r\n get(a: Ka, b: Kb): V | undefined {\r\n const m = this.mm.get(a);\r\n if (m !== undefined) {\r\n return m.get(b);\r\n }\r\n return undefined;\r\n }\r\n\r\n set(a: Ka, b: Kb, v: V): void {\r\n let m = this.mm.get(a);\r\n if (m === undefined) {\r\n this.mm.set(a, (m = new Map()));\r\n }\r\n m.set(b, v);\r\n }\r\n}\r\n\r\n/**\r\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\r\n */\r\nexport class ShadowDepthWrapper {\r\n private _scene: Scene;\r\n private _options?: IIOptionShadowDepthMaterial;\r\n private _baseMaterial: Material;\r\n private _onEffectCreatedObserver: Nullable<Observer<{ effect: Effect; subMesh: Nullable<SubMesh> }>>;\r\n private _subMeshToEffect: Map<Nullable<SubMesh>, [Effect, number]>;\r\n private _subMeshToDepthWrapper: MapMap<\r\n Nullable<SubMesh>,\r\n ShadowGenerator,\r\n { drawWrapper: Array<Nullable<DrawWrapper>>; mainDrawWrapper: DrawWrapper; depthDefines: string; token: string }\r\n >; // key is (subMesh + shadowGenerator)\r\n private _meshes: Map<AbstractMesh, Nullable<Observer<Node>>>;\r\n\r\n /** Gets the standalone status of the wrapper */\r\n public get standalone(): boolean {\r\n return this._options?.standalone ?? false;\r\n }\r\n\r\n /** Gets the base material the wrapper is built upon */\r\n public get baseMaterial(): Material {\r\n return this._baseMaterial;\r\n }\r\n\r\n /** Gets the doNotInjectCode status of the wrapper */\r\n public get doNotInjectCode(): boolean {\r\n return this._options?.doNotInjectCode ?? false;\r\n }\r\n\r\n /**\r\n * Instantiate a new shadow depth wrapper.\r\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\r\n * generate the shadow depth map. For more information, please refer to the documentation:\r\n * https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows\r\n * @param baseMaterial Material to wrap\r\n * @param scene Define the scene the material belongs to\r\n * @param options Options used to create the wrapper\r\n */\r\n constructor(baseMaterial: Material, scene?: Scene, options?: IIOptionShadowDepthMaterial) {\r\n this._baseMaterial = baseMaterial;\r\n this._scene = scene ?? <Scene>EngineStore.LastCreatedScene;\r\n this._options = options;\r\n\r\n this._subMeshToEffect = new Map();\r\n this._subMeshToDepthWrapper = new MapMap();\r\n this._meshes = new Map();\r\n\r\n // Register for onEffectCreated to store the effect of the base material when it is (re)generated. This effect will be used\r\n // to create the depth effect later on\r\n this._onEffectCreatedObserver = this._baseMaterial.onEffectCreatedObservable.add((params: { effect: Effect; subMesh: Nullable<SubMesh> }) => {\r\n const mesh = params.subMesh?.getMesh();\r\n\r\n if (mesh && !this._meshes.has(mesh)) {\r\n // Register for mesh onDispose to clean up our internal maps when a mesh is disposed\r\n this._meshes.set(\r\n mesh,\r\n mesh.onDisposeObservable.add((mesh: Node) => {\r\n const iterator = this._subMeshToEffect.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const subMesh = key.value;\r\n if (subMesh?.getMesh() === (mesh as AbstractMesh)) {\r\n this._subMeshToEffect.delete(subMesh);\r\n this._subMeshToDepthWrapper.mm.delete(subMesh);\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n this._subMeshToEffect.set(params.subMesh, [params.effect, this._scene.getEngine().currentRenderPassId]);\r\n this._subMeshToDepthWrapper.mm.delete(params.subMesh); // trigger a depth effect recreation\r\n });\r\n }\r\n\r\n /**\r\n * Gets the effect to use to generate the depth map\r\n * @param subMesh subMesh to get the effect for\r\n * @param shadowGenerator shadow generator to get the effect for\r\n * @param passIdForDrawWrapper Id of the pass for which the effect from the draw wrapper must be retrieved from\r\n * @returns the effect to use to generate the depth map for the subMesh + shadow generator specified\r\n */\r\n public getEffect(subMesh: Nullable<SubMesh>, shadowGenerator: ShadowGenerator, passIdForDrawWrapper: number): Nullable<DrawWrapper> {\r\n const entry = this._subMeshToDepthWrapper.mm.get(subMesh)?.get(shadowGenerator);\r\n if (!entry) {\r\n return null;\r\n }\r\n let drawWrapper = entry.drawWrapper[passIdForDrawWrapper];\r\n if (!drawWrapper) {\r\n drawWrapper = entry.drawWrapper[passIdForDrawWrapper] = new DrawWrapper(this._scene.getEngine());\r\n drawWrapper.setEffect(entry.mainDrawWrapper.effect, entry.mainDrawWrapper.defines);\r\n }\r\n\r\n return drawWrapper;\r\n }\r\n\r\n /**\r\n * Specifies that the submesh is ready to be used for depth rendering\r\n * @param subMesh submesh to check\r\n * @param defines the list of defines to take into account when checking the effect\r\n * @param shadowGenerator combined with subMesh, it defines the effect to check\r\n * @param useInstances specifies that instances should be used\r\n * @param passIdForDrawWrapper Id of the pass for which the draw wrapper should be created\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n public isReadyForSubMesh(subMesh: SubMesh, defines: string[], shadowGenerator: ShadowGenerator, useInstances: boolean, passIdForDrawWrapper: number): boolean {\r\n if (this.standalone) {\r\n // will ensure the effect is (re)created for the base material\r\n if (!this._baseMaterial.isReadyForSubMesh(subMesh.getMesh(), subMesh, useInstances)) {\r\n return false;\r\n }\r\n }\r\n\r\n return this._makeEffect(subMesh, defines, shadowGenerator, passIdForDrawWrapper)?.isReady() ?? false;\r\n }\r\n\r\n /**\r\n * Disposes the resources\r\n */\r\n public dispose(): void {\r\n this._baseMaterial.onEffectCreatedObservable.remove(this._onEffectCreatedObserver);\r\n this._onEffectCreatedObserver = null;\r\n\r\n const iterator = this._meshes.entries();\r\n for (let entry = iterator.next(); entry.done !== true; entry = iterator.next()) {\r\n const [mesh, observer] = entry.value;\r\n\r\n mesh.onDisposeObservable.remove(observer);\r\n }\r\n }\r\n\r\n private _makeEffect(subMesh: SubMesh, defines: string[], shadowGenerator: ShadowGenerator, passIdForDrawWrapper: number): Nullable<Effect> {\r\n const engine = this._scene.getEngine();\r\n const origEffectAndRenderPassId = this._subMeshToEffect.get(subMesh);\r\n\r\n if (!origEffectAndRenderPassId) {\r\n return null;\r\n }\r\n\r\n const [origEffect, origRenderPassId] = origEffectAndRenderPassId;\r\n\r\n let params = this._subMeshToDepthWrapper.get(subMesh, shadowGenerator);\r\n if (!params) {\r\n const mainDrawWrapper = new DrawWrapper(engine);\r\n mainDrawWrapper.defines = subMesh._getDrawWrapper(origRenderPassId)?.defines ?? null;\r\n\r\n params = {\r\n drawWrapper: [],\r\n mainDrawWrapper,\r\n depthDefines: \"\",\r\n token: RandomGUID(),\r\n };\r\n params.drawWrapper[passIdForDrawWrapper] = mainDrawWrapper;\r\n this._subMeshToDepthWrapper.set(subMesh, shadowGenerator, params);\r\n }\r\n\r\n const join = defines.join(\"\\n\");\r\n\r\n if (params.mainDrawWrapper.effect) {\r\n if (join === params.depthDefines) {\r\n // we already created the depth effect and it is still up to date for this submesh + shadow generator\r\n return params.mainDrawWrapper.effect;\r\n }\r\n }\r\n\r\n params.depthDefines = join;\r\n\r\n const uniforms = origEffect.getUniformNames().slice();\r\n\r\n // the depth effect is either out of date or has not been created yet\r\n let vertexCode = origEffect.vertexSourceCodeBeforeMigration,\r\n fragmentCode = origEffect.fragmentSourceCodeBeforeMigration;\r\n\r\n if (!this.doNotInjectCode) {\r\n // vertex code\r\n const vertexNormalBiasCode =\r\n this._options && this._options.remappedVariables\r\n ? `#include<shadowMapVertexNormalBias>(${this._options.remappedVariables.join(\",\")})`\r\n : Effect.IncludesShadersStore[\"shadowMapVertexNormalBias\"],\r\n vertexMetricCode =\r\n this._options && this._options.remappedVariables\r\n ? `#include<shadowMapVertexMetric>(${this._options.remappedVariables.join(\",\")})`\r\n : Effect.IncludesShadersStore[\"shadowMapVertexMetric\"],\r\n fragmentSoftTransparentShadow =\r\n this._options && this._options.remappedVariables\r\n ? `#include<shadowMapFragmentSoftTransparentShadow>(${this._options.remappedVariables.join(\",\")})`\r\n : Effect.IncludesShadersStore[\"shadowMapFragmentSoftTransparentShadow\"],\r\n fragmentBlockCode = Effect.IncludesShadersStore[\"shadowMapFragment\"];\r\n\r\n vertexCode = vertexCode.replace(/void\\s+?main/g, Effect.IncludesShadersStore[\"shadowMapVertexExtraDeclaration\"] + \"\\r\\nvoid main\");\r\n vertexCode = vertexCode.replace(/#define SHADOWDEPTH_NORMALBIAS|#define CUSTOM_VERTEX_UPDATE_WORLDPOS/g, vertexNormalBiasCode);\r\n\r\n if (vertexCode.indexOf(\"#define SHADOWDEPTH_METRIC\") !== -1) {\r\n vertexCode = vertexCode.replace(/#define SHADOWDEPTH_METRIC/g, vertexMetricCode);\r\n } else {\r\n vertexCode = vertexCode.replace(/}\\s*$/g, vertexMetricCode + \"\\r\\n}\");\r\n }\r\n vertexCode = vertexCode.replace(/#define SHADER_NAME.*?\\n|out vec4 glFragColor;\\n/g, \"\");\r\n\r\n // fragment code\r\n const hasLocationForSoftTransparentShadow =\r\n fragmentCode.indexOf(\"#define SHADOWDEPTH_SOFTTRANSPARENTSHADOW\") >= 0 || fragmentCode.indexOf(\"#define CUSTOM_FRAGMENT_BEFORE_FOG\") >= 0;\r\n const hasLocationForFragment = fragmentCode.indexOf(\"#define SHADOWDEPTH_FRAGMENT\") !== -1;\r\n\r\n let fragmentCodeToInjectAtEnd = \"\";\r\n\r\n if (!hasLocationForSoftTransparentShadow) {\r\n fragmentCodeToInjectAtEnd = fragmentSoftTransparentShadow + \"\\r\\n\";\r\n } else {\r\n fragmentCode = fragmentCode.replace(/#define SHADOWDEPTH_SOFTTRANSPARENTSHADOW|#define CUSTOM_FRAGMENT_BEFORE_FOG/g, fragmentSoftTransparentShadow);\r\n }\r\n\r\n fragmentCode = fragmentCode.replace(/void\\s+?main/g, Effect.IncludesShadersStore[\"shadowMapFragmentExtraDeclaration\"] + \"\\r\\nvoid main\");\r\n\r\n if (hasLocationForFragment) {\r\n fragmentCode = fragmentCode.replace(/#define SHADOWDEPTH_FRAGMENT/g, fragmentBlockCode);\r\n } else {\r\n fragmentCodeToInjectAtEnd += fragmentBlockCode + \"\\r\\n\";\r\n }\r\n if (fragmentCodeToInjectAtEnd) {\r\n fragmentCode = fragmentCode.replace(/}\\s*$/g, fragmentCodeToInjectAtEnd + \"}\");\r\n }\r\n\r\n uniforms.push(\"biasAndScaleSM\", \"depthValuesSM\", \"lightDataSM\", \"softTransparentShadowSM\");\r\n }\r\n\r\n params.mainDrawWrapper.effect = engine.createEffect(\r\n {\r\n vertexSource: vertexCode,\r\n fragmentSource: fragmentCode,\r\n vertexToken: params.token,\r\n fragmentToken: params.token,\r\n },\r\n <IEffectCreationOptions>{\r\n attributes: origEffect.getAttributesNames(),\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: origEffect.getUniformBuffersNames(),\r\n samplers: origEffect.getSamplers(),\r\n defines: join + \"\\n\" + origEffect.defines.replace(\"#define SHADOWS\", \"\").replace(/#define SHADOW\\d/g, \"\"),\r\n indexParameters: origEffect.getIndexParameters(),\r\n },\r\n engine\r\n );\r\n\r\n for (let id = 0; id < params.drawWrapper.length; ++id) {\r\n if (id !== passIdForDrawWrapper) {\r\n params.drawWrapper[id]?.setEffect(params.mainDrawWrapper.effect, params.mainDrawWrapper.defines);\r\n }\r\n }\r\n return params.mainDrawWrapper.effect;\r\n }\r\n}\r\n"]}
@@ -896,7 +896,7 @@ export declare class AssetsManager {
896
896
  * @param taskName defines the name of the new task
897
897
  * @param url defines the url of the file to load
898
898
  * @param noMipmap defines if the texture must not receive mipmaps (false by default)
899
- * @param invertY defines if you want to invert Y axis of the loaded texture (false by default)
899
+ * @param invertY defines if you want to invert Y axis of the loaded texture (true by default)
900
900
  * @param samplingMode defines the sampling mode to use (Texture.TRILINEAR_SAMPLINGMODE by default)
901
901
  * @returns a new TextureAssetTask object
902
902
  */
@@ -739,7 +739,7 @@ export class AssetsManager {
739
739
  * @param taskName defines the name of the new task
740
740
  * @param url defines the url of the file to load
741
741
  * @param noMipmap defines if the texture must not receive mipmaps (false by default)
742
- * @param invertY defines if you want to invert Y axis of the loaded texture (false by default)
742
+ * @param invertY defines if you want to invert Y axis of the loaded texture (true by default)
743
743
  * @param samplingMode defines the sampling mode to use (Texture.TRILINEAR_SAMPLINGMODE by default)
744
744
  * @returns a new TextureAssetTask object
745
745
  */