@babylonjs/core 5.52.0 → 5.53.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 (54) hide show
  1. package/Animations/animatable.js +1 -1
  2. package/Animations/animatable.js.map +1 -1
  3. package/Collisions/pickingInfo.d.ts +2 -1
  4. package/Collisions/pickingInfo.js +4 -3
  5. package/Collisions/pickingInfo.js.map +1 -1
  6. package/DeviceInput/eventFactory.js +4 -0
  7. package/DeviceInput/eventFactory.js.map +1 -1
  8. package/DeviceInput/webDeviceInputSystem.js +17 -9
  9. package/DeviceInput/webDeviceInputSystem.js.map +1 -1
  10. package/Engines/engine.d.ts +2 -0
  11. package/Engines/engine.js +5 -0
  12. package/Engines/engine.js.map +1 -1
  13. package/Engines/thinEngine.js +3 -3
  14. package/Engines/thinEngine.js.map +1 -1
  15. package/Inputs/scene.inputManager.js +5 -12
  16. package/Inputs/scene.inputManager.js.map +1 -1
  17. package/Materials/Textures/Filtering/hdrFiltering.js +4 -0
  18. package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
  19. package/Materials/materialPluginBase.d.ts +3 -2
  20. package/Materials/materialPluginBase.js.map +1 -1
  21. package/Materials/materialPluginManager.js +13 -3
  22. package/Materials/materialPluginManager.js.map +1 -1
  23. package/Materials/uniformBuffer.d.ts +2 -0
  24. package/Materials/uniformBuffer.js +4 -0
  25. package/Materials/uniformBuffer.js.map +1 -1
  26. package/Maths/math.frustum.d.ts +8 -1
  27. package/Maths/math.frustum.js +14 -0
  28. package/Maths/math.frustum.js.map +1 -1
  29. package/Meshes/instancedMesh.d.ts +2 -1
  30. package/Meshes/instancedMesh.js +3 -2
  31. package/Meshes/instancedMesh.js.map +1 -1
  32. package/Meshes/mesh.d.ts +10 -5
  33. package/Meshes/mesh.js +40 -16
  34. package/Meshes/mesh.js.map +1 -1
  35. package/Misc/filesInput.d.ts +5 -2
  36. package/Misc/filesInput.js +39 -20
  37. package/Misc/filesInput.js.map +1 -1
  38. package/Misc/sceneOptimizer.js +3 -0
  39. package/Misc/sceneOptimizer.js.map +1 -1
  40. package/Physics/v2/physicsAggregate.js +3 -3
  41. package/Physics/v2/physicsAggregate.js.map +1 -1
  42. package/Physics/v2/physicsBody.d.ts +27 -16
  43. package/Physics/v2/physicsBody.js +31 -16
  44. package/Physics/v2/physicsBody.js.map +1 -1
  45. package/Physics/v2/physicsConstraint.d.ts +6 -6
  46. package/Physics/v2/physicsConstraint.js +6 -6
  47. package/Physics/v2/physicsConstraint.js.map +1 -1
  48. package/Physics/v2/physicsShape.d.ts +7 -7
  49. package/Physics/v2/physicsShape.js +7 -7
  50. package/Physics/v2/physicsShape.js.map +1 -1
  51. package/XR/features/WebXRControllerTeleportation.d.ts +9 -0
  52. package/XR/features/WebXRControllerTeleportation.js +28 -4
  53. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  54. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"materialPluginBase.js","sourceRoot":"","sources":["../../../../lts/core/generated/Materials/materialPluginBase.ts"],"names":[],"mappings":"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","sourcesContent":["import { SerializationHelper, serialize } from \"../Misc/decorators\";\r\nimport type { Nullable } from \"../types\";\r\nimport { MaterialPluginManager } from \"./materialPluginManager\";\r\nimport type { SmartArray } from \"../Misc/smartArray\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\ndeclare type Engine = import(\"../Engines/engine\").Engine;\r\ndeclare type Scene = import(\"../scene\").Scene;\r\ndeclare type AbstractMesh = import(\"../Meshes/abstractMesh\").AbstractMesh;\r\ndeclare type SubMesh = import(\"../Meshes/subMesh\").SubMesh;\r\ndeclare type IAnimatable = import(\"../Animations/animatable.interface\").IAnimatable;\r\ndeclare type UniformBuffer = import(\"./uniformBuffer\").UniformBuffer;\r\ndeclare type EffectFallbacks = import(\"./effectFallbacks\").EffectFallbacks;\r\ndeclare type MaterialDefines = import(\"./materialDefines\").MaterialDefines;\r\ndeclare type Material = import(\"./material\").Material;\r\ndeclare type BaseTexture = import(\"./Textures/baseTexture\").BaseTexture;\r\ndeclare type RenderTargetTexture = import(\"./Textures/renderTargetTexture\").RenderTargetTexture;\r\n\r\n/**\r\n * Base class for material plugins.\r\n * @since 5.0\r\n */\r\nexport class MaterialPluginBase {\r\n /**\r\n * Defines the name of the plugin\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Defines the priority of the plugin. Lower numbers run first.\r\n */\r\n @serialize()\r\n public priority: number = 500;\r\n\r\n /**\r\n * Indicates that this plugin should be notified for the extra events (HasRenderTargetTextures / FillRenderTargetTextures / HardBindForSubMesh)\r\n */\r\n @serialize()\r\n public registerForExtraEvents: boolean = false;\r\n\r\n protected _material: Material;\r\n protected _pluginManager: MaterialPluginManager;\r\n protected _pluginDefineNames?: { [name: string]: any };\r\n\r\n protected _enable(enable: boolean) {\r\n if (enable) {\r\n this._pluginManager._activatePlugin(this);\r\n }\r\n }\r\n\r\n /**\r\n * Helper function to mark defines as being dirty.\r\n */\r\n public readonly markAllDefinesAsDirty: () => void;\r\n\r\n /**\r\n * Creates a new material plugin\r\n * @param material parent material of the plugin\r\n * @param name name of the plugin\r\n * @param priority priority of the plugin\r\n * @param defines list of defines used by the plugin. The value of the property is the default value for this property\r\n * @param addToPluginList true to add the plugin to the list of plugins managed by the material plugin manager of the material (default: true)\r\n * @param enable true to enable the plugin (it is handy if the plugin does not handle properties to switch its current activation)\r\n */\r\n constructor(material: Material, name: string, priority: number, defines?: { [key: string]: any }, addToPluginList = true, enable = false) {\r\n this._material = material;\r\n this.name = name;\r\n this.priority = priority;\r\n\r\n if (!material.pluginManager) {\r\n material.pluginManager = new MaterialPluginManager(material);\r\n material.onDisposeObservable.add(() => {\r\n material.pluginManager = undefined;\r\n });\r\n }\r\n\r\n this._pluginDefineNames = defines;\r\n this._pluginManager = material.pluginManager;\r\n\r\n if (addToPluginList) {\r\n this._pluginManager._addPlugin(this);\r\n }\r\n\r\n if (enable) {\r\n this._enable(true);\r\n }\r\n\r\n this.markAllDefinesAsDirty = material._dirtyCallbacks[Constants.MATERIAL_AllDirtyFlag];\r\n }\r\n\r\n /**\r\n * Gets the current class name useful for serialization or dynamic coding.\r\n * @returns The class name.\r\n */\r\n public getClassName(): string {\r\n return \"MaterialPluginBase\";\r\n }\r\n\r\n /**\r\n * Specifies that the submesh is ready to be used.\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine the engine this scene belongs to.\r\n * @param subMesh the submesh to check for readiness\r\n * @returns - 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(defines: MaterialDefines, scene: Scene, engine: Engine, subMesh: SubMesh): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Binds the material data (this function is called even if mustRebind() returns false)\r\n * @param uniformBuffer defines the Uniform buffer to fill in.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine defines the engine the material belongs to.\r\n * @param subMesh the submesh to bind data for\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public hardBindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void {}\r\n\r\n /**\r\n * Binds the material data.\r\n * @param uniformBuffer defines the Uniform buffer to fill in.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine the engine this scene belongs to.\r\n * @param subMesh the submesh to bind data for\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void {}\r\n\r\n /**\r\n * Disposes the resources of the material.\r\n * @param forceDisposeTextures - Forces the disposal of all textures.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public dispose(forceDisposeTextures?: boolean): void {}\r\n\r\n /**\r\n * Returns a list of custom shader code fragments to customize the shader.\r\n * @param shaderType \"vertex\" or \"fragment\"\r\n * @returns null if no code to be added, or a list of pointName => code.\r\n * Note that `pointName` can also be a regular expression if it starts with a `!`.\r\n * In that case, the string found by the regular expression (if any) will be\r\n * replaced by the code provided.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getCustomCode(shaderType: string): Nullable<{ [pointName: string]: string }> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Collects all defines.\r\n * @param defines The object to append to.\r\n */\r\n public collectDefines(defines: { [name: string]: { type: string; default: any } }): void {\r\n if (!this._pluginDefineNames) {\r\n return;\r\n }\r\n for (const key of Object.keys(this._pluginDefineNames)) {\r\n if (key[0] === \"_\") {\r\n continue;\r\n }\r\n\r\n const type = typeof this._pluginDefineNames[key];\r\n defines[key] = {\r\n type: type === \"number\" ? \"number\" : type === \"string\" ? \"string\" : type === \"boolean\" ? \"boolean\" : \"object\",\r\n default: this._pluginDefineNames[key],\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Sets the defines for the next rendering. Called before MaterialHelper.PrepareDefinesForAttributes is called.\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene to the material belongs to.\r\n * @param mesh the mesh being rendered\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public prepareDefinesBeforeAttributes(defines: MaterialDefines, scene: Scene, mesh: AbstractMesh): void {}\r\n\r\n /**\r\n * Sets the defines for the next rendering\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene to the material belongs to.\r\n * @param mesh the mesh being rendered\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public prepareDefines(defines: MaterialDefines, scene: Scene, mesh: AbstractMesh): void {}\r\n\r\n /**\r\n * Checks to see if a texture is used in the material.\r\n * @param texture - Base texture to use.\r\n * @returns - Boolean specifying if a texture is used in the material.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public hasTexture(texture: BaseTexture): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n * @returns true if this uses a render target otherwise false.\r\n */\r\n public hasRenderTargetTextures(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Fills the list of render target textures.\r\n * @param renderTargets the list of render targets to update\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public fillRenderTargetTextures(renderTargets: SmartArray<RenderTargetTexture>): void {}\r\n\r\n /**\r\n * Returns an array of the actively used textures.\r\n * @param activeTextures Array of BaseTextures\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getActiveTextures(activeTextures: BaseTexture[]): void {}\r\n\r\n /**\r\n * Returns the animatable textures.\r\n * @param animatables Array of animatable textures.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getAnimatables(animatables: IAnimatable[]): void {}\r\n\r\n /**\r\n * Add fallbacks to the effect fallbacks list.\r\n * @param defines defines the Base texture to use.\r\n * @param fallbacks defines the current fallback list.\r\n * @param currentRank defines the current fallback rank.\r\n * @returns the new fallback rank.\r\n */\r\n public addFallbacks(defines: MaterialDefines, fallbacks: EffectFallbacks, currentRank: number): number {\r\n return currentRank;\r\n }\r\n\r\n /**\r\n * Gets the samplers used by the plugin.\r\n * @param samplers list that the sampler names should be added to.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getSamplers(samplers: string[]): void {}\r\n\r\n /**\r\n * Gets the attributes used by the plugin.\r\n * @param attributes list that the attribute names should be added to.\r\n * @param scene the scene that the material belongs to.\r\n * @param mesh the mesh being rendered.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getAttributes(attributes: string[], scene: Scene, mesh: AbstractMesh): void {}\r\n\r\n /**\r\n * Gets the uniform buffers names added by the plugin.\r\n * @param ubos list that the ubo names should be added to.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getUniformBuffersNames(ubos: string[]): void {}\r\n\r\n /**\r\n * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos)\r\n * @returns the description of the uniforms\r\n */\r\n public getUniforms(): { ubo?: Array<{ name: string; size: number; type: string }>; vertex?: string; fragment?: string } {\r\n return {};\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current configuration into another one.\r\n * @param plugin define the config where to copy the info\r\n */\r\n public copyTo(plugin: MaterialPluginBase): void {\r\n SerializationHelper.Clone(() => plugin, this);\r\n }\r\n\r\n /**\r\n * Serializes this clear coat configuration.\r\n * @returns - An object with the serialized config.\r\n */\r\n public serialize(): any {\r\n return SerializationHelper.Serialize(this);\r\n }\r\n\r\n /**\r\n * Parses a anisotropy Configuration from a serialized object.\r\n * @param source - Serialized object.\r\n * @param scene Defines the scene we are parsing for\r\n * @param rootUrl Defines the rootUrl to load from\r\n */\r\n public parse(source: any, scene: Scene, rootUrl: string): void {\r\n SerializationHelper.Parse(() => this, source, scene, rootUrl);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"materialPluginBase.js","sourceRoot":"","sources":["../../../../lts/core/generated/Materials/materialPluginBase.ts"],"names":[],"mappings":"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","sourcesContent":["import { SerializationHelper, serialize } from \"../Misc/decorators\";\r\nimport type { Nullable } from \"../types\";\r\nimport { MaterialPluginManager } from \"./materialPluginManager\";\r\nimport type { SmartArray } from \"../Misc/smartArray\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\ndeclare type Engine = import(\"../Engines/engine\").Engine;\r\ndeclare type Scene = import(\"../scene\").Scene;\r\ndeclare type AbstractMesh = import(\"../Meshes/abstractMesh\").AbstractMesh;\r\ndeclare type SubMesh = import(\"../Meshes/subMesh\").SubMesh;\r\ndeclare type IAnimatable = import(\"../Animations/animatable.interface\").IAnimatable;\r\ndeclare type UniformBuffer = import(\"./uniformBuffer\").UniformBuffer;\r\ndeclare type EffectFallbacks = import(\"./effectFallbacks\").EffectFallbacks;\r\ndeclare type MaterialDefines = import(\"./materialDefines\").MaterialDefines;\r\ndeclare type Material = import(\"./material\").Material;\r\ndeclare type BaseTexture = import(\"./Textures/baseTexture\").BaseTexture;\r\ndeclare type RenderTargetTexture = import(\"./Textures/renderTargetTexture\").RenderTargetTexture;\r\n\r\n/**\r\n * Base class for material plugins.\r\n * @since 5.0\r\n */\r\nexport class MaterialPluginBase {\r\n /**\r\n * Defines the name of the plugin\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Defines the priority of the plugin. Lower numbers run first.\r\n */\r\n @serialize()\r\n public priority: number = 500;\r\n\r\n /**\r\n * Indicates that this plugin should be notified for the extra events (HasRenderTargetTextures / FillRenderTargetTextures / HardBindForSubMesh)\r\n */\r\n @serialize()\r\n public registerForExtraEvents: boolean = false;\r\n\r\n protected _material: Material;\r\n protected _pluginManager: MaterialPluginManager;\r\n protected _pluginDefineNames?: { [name: string]: any };\r\n\r\n protected _enable(enable: boolean) {\r\n if (enable) {\r\n this._pluginManager._activatePlugin(this);\r\n }\r\n }\r\n\r\n /**\r\n * Helper function to mark defines as being dirty.\r\n */\r\n public readonly markAllDefinesAsDirty: () => void;\r\n\r\n /**\r\n * Creates a new material plugin\r\n * @param material parent material of the plugin\r\n * @param name name of the plugin\r\n * @param priority priority of the plugin\r\n * @param defines list of defines used by the plugin. The value of the property is the default value for this property\r\n * @param addToPluginList true to add the plugin to the list of plugins managed by the material plugin manager of the material (default: true)\r\n * @param enable true to enable the plugin (it is handy if the plugin does not handle properties to switch its current activation)\r\n */\r\n constructor(material: Material, name: string, priority: number, defines?: { [key: string]: any }, addToPluginList = true, enable = false) {\r\n this._material = material;\r\n this.name = name;\r\n this.priority = priority;\r\n\r\n if (!material.pluginManager) {\r\n material.pluginManager = new MaterialPluginManager(material);\r\n material.onDisposeObservable.add(() => {\r\n material.pluginManager = undefined;\r\n });\r\n }\r\n\r\n this._pluginDefineNames = defines;\r\n this._pluginManager = material.pluginManager;\r\n\r\n if (addToPluginList) {\r\n this._pluginManager._addPlugin(this);\r\n }\r\n\r\n if (enable) {\r\n this._enable(true);\r\n }\r\n\r\n this.markAllDefinesAsDirty = material._dirtyCallbacks[Constants.MATERIAL_AllDirtyFlag];\r\n }\r\n\r\n /**\r\n * Gets the current class name useful for serialization or dynamic coding.\r\n * @returns The class name.\r\n */\r\n public getClassName(): string {\r\n return \"MaterialPluginBase\";\r\n }\r\n\r\n /**\r\n * Specifies that the submesh is ready to be used.\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine the engine this scene belongs to.\r\n * @param subMesh the submesh to check for readiness\r\n * @returns - 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(defines: MaterialDefines, scene: Scene, engine: Engine, subMesh: SubMesh): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Binds the material data (this function is called even if mustRebind() returns false)\r\n * @param uniformBuffer defines the Uniform buffer to fill in.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine defines the engine the material belongs to.\r\n * @param subMesh the submesh to bind data for\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public hardBindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void {}\r\n\r\n /**\r\n * Binds the material data.\r\n * @param uniformBuffer defines the Uniform buffer to fill in.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine the engine this scene belongs to.\r\n * @param subMesh the submesh to bind data for\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void {}\r\n\r\n /**\r\n * Disposes the resources of the material.\r\n * @param forceDisposeTextures - Forces the disposal of all textures.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public dispose(forceDisposeTextures?: boolean): void {}\r\n\r\n /**\r\n * Returns a list of custom shader code fragments to customize the shader.\r\n * @param shaderType \"vertex\" or \"fragment\"\r\n * @returns null if no code to be added, or a list of pointName => code.\r\n * Note that `pointName` can also be a regular expression if it starts with a `!`.\r\n * In that case, the string found by the regular expression (if any) will be\r\n * replaced by the code provided.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getCustomCode(shaderType: string): Nullable<{ [pointName: string]: string }> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Collects all defines.\r\n * @param defines The object to append to.\r\n */\r\n public collectDefines(defines: { [name: string]: { type: string; default: any } }): void {\r\n if (!this._pluginDefineNames) {\r\n return;\r\n }\r\n for (const key of Object.keys(this._pluginDefineNames)) {\r\n if (key[0] === \"_\") {\r\n continue;\r\n }\r\n\r\n const type = typeof this._pluginDefineNames[key];\r\n defines[key] = {\r\n type: type === \"number\" ? \"number\" : type === \"string\" ? \"string\" : type === \"boolean\" ? \"boolean\" : \"object\",\r\n default: this._pluginDefineNames[key],\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Sets the defines for the next rendering. Called before MaterialHelper.PrepareDefinesForAttributes is called.\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene to the material belongs to.\r\n * @param mesh the mesh being rendered\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public prepareDefinesBeforeAttributes(defines: MaterialDefines, scene: Scene, mesh: AbstractMesh): void {}\r\n\r\n /**\r\n * Sets the defines for the next rendering\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene to the material belongs to.\r\n * @param mesh the mesh being rendered\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public prepareDefines(defines: MaterialDefines, scene: Scene, mesh: AbstractMesh): void {}\r\n\r\n /**\r\n * Checks to see if a texture is used in the material.\r\n * @param texture - Base texture to use.\r\n * @returns - Boolean specifying if a texture is used in the material.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public hasTexture(texture: BaseTexture): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n * @returns true if this uses a render target otherwise false.\r\n */\r\n public hasRenderTargetTextures(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Fills the list of render target textures.\r\n * @param renderTargets the list of render targets to update\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public fillRenderTargetTextures(renderTargets: SmartArray<RenderTargetTexture>): void {}\r\n\r\n /**\r\n * Returns an array of the actively used textures.\r\n * @param activeTextures Array of BaseTextures\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getActiveTextures(activeTextures: BaseTexture[]): void {}\r\n\r\n /**\r\n * Returns the animatable textures.\r\n * @param animatables Array of animatable textures.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getAnimatables(animatables: IAnimatable[]): void {}\r\n\r\n /**\r\n * Add fallbacks to the effect fallbacks list.\r\n * @param defines defines the Base texture to use.\r\n * @param fallbacks defines the current fallback list.\r\n * @param currentRank defines the current fallback rank.\r\n * @returns the new fallback rank.\r\n */\r\n public addFallbacks(defines: MaterialDefines, fallbacks: EffectFallbacks, currentRank: number): number {\r\n return currentRank;\r\n }\r\n\r\n /**\r\n * Gets the samplers used by the plugin.\r\n * @param samplers list that the sampler names should be added to.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getSamplers(samplers: string[]): void {}\r\n\r\n /**\r\n * Gets the attributes used by the plugin.\r\n * @param attributes list that the attribute names should be added to.\r\n * @param scene the scene that the material belongs to.\r\n * @param mesh the mesh being rendered.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getAttributes(attributes: string[], scene: Scene, mesh: AbstractMesh): void {}\r\n\r\n /**\r\n * Gets the uniform buffers names added by the plugin.\r\n * @param ubos list that the ubo names should be added to.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getUniformBuffersNames(ubos: string[]): void {}\r\n\r\n /**\r\n * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos)\r\n * @returns the description of the uniforms\r\n */\r\n public getUniforms(): { ubo?: Array<{ name: string; size?: number; type?: string; arraySize?: number }>; vertex?: string; fragment?: string } {\r\n return {};\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current configuration into another one.\r\n * @param plugin define the config where to copy the info\r\n */\r\n public copyTo(plugin: MaterialPluginBase): void {\r\n SerializationHelper.Clone(() => plugin, this);\r\n }\r\n\r\n /**\r\n * Serializes this clear coat configuration.\r\n * @returns - An object with the serialized config.\r\n */\r\n public serialize(): any {\r\n return SerializationHelper.Serialize(this);\r\n }\r\n\r\n /**\r\n * Parses a anisotropy Configuration from a serialized object.\r\n * @param source - Serialized object.\r\n * @param scene Defines the scene we are parsing for\r\n * @param rootUrl Defines the rootUrl to load from\r\n */\r\n public parse(source: any, scene: Scene, rootUrl: string): void {\r\n SerializationHelper.Parse(() => this, source, scene, rootUrl);\r\n }\r\n}\r\n"]}
@@ -126,6 +126,7 @@ export class MaterialPluginManager {
126
126
  }
127
127
  }
128
128
  _handlePluginEvent(id, info) {
129
+ var _a;
129
130
  switch (id) {
130
131
  case MaterialPluginEvent.GetActiveTextures: {
131
132
  const eventData = info;
@@ -196,8 +197,11 @@ export class MaterialPluginManager {
196
197
  if (uniforms) {
197
198
  if (uniforms.ubo) {
198
199
  for (const uniform of uniforms.ubo) {
199
- eventData.ubo.addUniform(uniform.name, uniform.size);
200
- this._uboDeclaration += `${uniform.type} ${uniform.name};\r\n`;
200
+ if (uniform.size && uniform.type) {
201
+ const arraySize = (_a = uniform.arraySize) !== null && _a !== void 0 ? _a : 0;
202
+ eventData.ubo.addUniform(uniform.name, uniform.size, arraySize);
203
+ this._uboDeclaration += `${uniform.type} ${uniform.name}${arraySize > 0 ? `[${arraySize}]` : ""};\r\n`;
204
+ }
201
205
  this._uniformList.push(uniform.name);
202
206
  }
203
207
  }
@@ -302,6 +306,7 @@ MaterialPluginManager._MaterialPluginClassToMainDefine = {};
302
306
  MaterialPluginManager._MaterialPluginCounter = 0;
303
307
  const plugins = [];
304
308
  let inited = false;
309
+ let observer = null;
305
310
  /**
306
311
  * Registers a new material plugin through a factory, or updates it. This makes the plugin available to all materials instantiated after its registration.
307
312
  * @param pluginName The plugin name
@@ -310,7 +315,7 @@ let inited = false;
310
315
  // eslint-disable-next-line @typescript-eslint/naming-convention
311
316
  export function RegisterMaterialPlugin(pluginName, factory) {
312
317
  if (!inited) {
313
- Material.OnEventObservable.add((material) => {
318
+ observer = Material.OnEventObservable.add((material) => {
314
319
  for (const [, factory] of plugins) {
315
320
  factory(material);
316
321
  }
@@ -335,6 +340,9 @@ export function UnregisterMaterialPlugin(pluginName) {
335
340
  for (let i = 0; i < plugins.length; ++i) {
336
341
  if (plugins[i][0] === pluginName) {
337
342
  plugins.splice(i, 1);
343
+ if (plugins.length === 0) {
344
+ UnregisterAllMaterialPlugins();
345
+ }
338
346
  return true;
339
347
  }
340
348
  }
@@ -346,5 +354,7 @@ export function UnregisterMaterialPlugin(pluginName) {
346
354
  // eslint-disable-next-line @typescript-eslint/naming-convention
347
355
  export function UnregisterAllMaterialPlugins() {
348
356
  plugins.length = 0;
357
+ inited = false;
358
+ Material.OnEventObservable.remove(observer);
349
359
  }
350
360
  //# sourceMappingURL=materialPluginManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"materialPluginManager.js","sourceRoot":"","sources":["../../../../lts/core/generated/Materials/materialPluginManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ShaderCustomProcessingFunction } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Material } from \"./material\";\r\nimport type {\r\n MaterialPluginPrepareEffect,\r\n MaterialPluginBindForSubMesh,\r\n MaterialPluginDisposed,\r\n MaterialPluginGetActiveTextures,\r\n MaterialPluginGetAnimatables,\r\n MaterialPluginGetDefineNames,\r\n MaterialPluginHasTexture,\r\n MaterialPluginIsReadyForSubMesh,\r\n MaterialPluginPrepareDefines,\r\n MaterialPluginPrepareUniformBuffer,\r\n MaterialPluginHardBindForSubMesh,\r\n MaterialPluginHasRenderTargetTextures,\r\n MaterialPluginFillRenderTargetTextures,\r\n} from \"./materialPluginEvent\";\r\nimport { MaterialPluginEvent } from \"./materialPluginEvent\";\r\n\r\ndeclare type Scene = import(\"../scene\").Scene;\r\ndeclare type Engine = import(\"../Engines/engine\").Engine;\r\ndeclare type MaterialPluginBase = import(\"./materialPluginBase\").MaterialPluginBase;\r\n\r\ndeclare module \"./material\" {\r\n export interface Material {\r\n /**\r\n * Plugin manager for this material\r\n */\r\n pluginManager?: MaterialPluginManager;\r\n }\r\n}\r\n\r\nconst rxOption = new RegExp(\"^([gimus]+)!\");\r\n\r\n/**\r\n * Class that manages the plugins of a material\r\n * @since 5.0\r\n */\r\nexport class MaterialPluginManager {\r\n /** Map a plugin class name to a #define name (used in the vertex/fragment shaders as a marker of the plugin usage) */\r\n private static _MaterialPluginClassToMainDefine: { [name: string]: string } = {};\r\n private static _MaterialPluginCounter: number = 0;\r\n\r\n protected _material: Material;\r\n protected _scene: Scene;\r\n protected _engine: Engine;\r\n protected _plugins: MaterialPluginBase[] = [];\r\n protected _activePlugins: MaterialPluginBase[] = [];\r\n protected _activePluginsForExtraEvents: MaterialPluginBase[] = [];\r\n protected _codeInjectionPoints: { [shaderType: string]: { [codeName: string]: boolean } };\r\n protected _defineNamesFromPlugins?: { [name: string]: { type: string; default: any } };\r\n protected _uboDeclaration: string;\r\n protected _vertexDeclaration: string;\r\n protected _fragmentDeclaration: string;\r\n protected _uniformList: string[];\r\n protected _samplerList: string[];\r\n protected _uboList: string[];\r\n\r\n /**\r\n * Creates a new instance of the plugin manager\r\n * @param material material that this manager will manage the plugins for\r\n */\r\n constructor(material: Material) {\r\n this._material = material;\r\n this._scene = material.getScene();\r\n this._engine = this._scene.getEngine();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _addPlugin(plugin: MaterialPluginBase): void {\r\n for (let i = 0; i < this._plugins.length; ++i) {\r\n if (this._plugins[i].name === plugin.name) {\r\n throw `Plugin \"${plugin.name}\" already added to the material \"${this._material.name}\"!`;\r\n }\r\n }\r\n\r\n if (this._material._uniformBufferLayoutBuilt) {\r\n throw `The plugin \"${plugin.name}\" can't be added to the material \"${this._material.name}\" because this material has already been used for rendering! Please add plugins to materials before any rendering with this material occurs.`;\r\n }\r\n\r\n const pluginClassName = plugin.getClassName();\r\n if (!MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName]) {\r\n MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName] = \"MATERIALPLUGIN_\" + ++MaterialPluginManager._MaterialPluginCounter;\r\n }\r\n\r\n this._material._callbackPluginEventGeneric = this._handlePluginEvent.bind(this);\r\n\r\n this._plugins.push(plugin);\r\n this._plugins.sort((a, b) => a.priority - b.priority);\r\n\r\n this._codeInjectionPoints = {};\r\n\r\n const defineNamesFromPlugins: { [name: string]: { type: string; default: any } } = {};\r\n defineNamesFromPlugins[MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName]] = {\r\n type: \"boolean\",\r\n default: true,\r\n };\r\n\r\n for (const plugin of this._plugins) {\r\n plugin.collectDefines(defineNamesFromPlugins);\r\n this._collectPointNames(\"vertex\", plugin.getCustomCode(\"vertex\"));\r\n this._collectPointNames(\"fragment\", plugin.getCustomCode(\"fragment\"));\r\n }\r\n\r\n this._defineNamesFromPlugins = defineNamesFromPlugins;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _activatePlugin(plugin: MaterialPluginBase): void {\r\n if (this._activePlugins.indexOf(plugin) === -1) {\r\n this._activePlugins.push(plugin);\r\n this._activePlugins.sort((a, b) => a.priority - b.priority);\r\n\r\n this._material._callbackPluginEventIsReadyForSubMesh = this._handlePluginEventIsReadyForSubMesh.bind(this);\r\n this._material._callbackPluginEventPrepareDefinesBeforeAttributes = this._handlePluginEventPrepareDefinesBeforeAttributes.bind(this);\r\n this._material._callbackPluginEventPrepareDefines = this._handlePluginEventPrepareDefines.bind(this);\r\n this._material._callbackPluginEventBindForSubMesh = this._handlePluginEventBindForSubMesh.bind(this);\r\n\r\n if (plugin.registerForExtraEvents) {\r\n this._activePluginsForExtraEvents.push(plugin);\r\n this._activePluginsForExtraEvents.sort((a, b) => a.priority - b.priority);\r\n this._material._callbackPluginEventHasRenderTargetTextures = this._handlePluginEventHasRenderTargetTextures.bind(this);\r\n this._material._callbackPluginEventFillRenderTargetTextures = this._handlePluginEventFillRenderTargetTextures.bind(this);\r\n this._material._callbackPluginEventHardBindForSubMesh = this._handlePluginEventHardBindForSubMesh.bind(this);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets a plugin from the list of plugins managed by this manager\r\n * @param name name of the plugin\r\n * @returns the plugin if found, else null\r\n */\r\n public getPlugin(name: string): Nullable<MaterialPluginBase> {\r\n for (let i = 0; i < this._plugins.length; ++i) {\r\n if (this._plugins[i].name === name) {\r\n return this._plugins[i];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n protected _handlePluginEventIsReadyForSubMesh(eventData: MaterialPluginIsReadyForSubMesh): void {\r\n let isReady = true;\r\n for (const plugin of this._activePlugins) {\r\n isReady = isReady && plugin.isReadyForSubMesh(eventData.defines, this._scene, this._engine, eventData.subMesh);\r\n }\r\n eventData.isReadyForSubMesh = isReady;\r\n }\r\n\r\n protected _handlePluginEventPrepareDefinesBeforeAttributes(eventData: MaterialPluginPrepareDefines): void {\r\n for (const plugin of this._activePlugins) {\r\n plugin.prepareDefinesBeforeAttributes(eventData.defines, this._scene, eventData.mesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventPrepareDefines(eventData: MaterialPluginPrepareDefines): void {\r\n for (const plugin of this._activePlugins) {\r\n plugin.prepareDefines(eventData.defines, this._scene, eventData.mesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventHardBindForSubMesh(eventData: MaterialPluginHardBindForSubMesh): void {\r\n for (const plugin of this._activePluginsForExtraEvents) {\r\n plugin.hardBindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, eventData.subMesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventBindForSubMesh(eventData: MaterialPluginBindForSubMesh): void {\r\n for (const plugin of this._activePlugins) {\r\n plugin.bindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, eventData.subMesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventHasRenderTargetTextures(eventData: MaterialPluginHasRenderTargetTextures): void {\r\n let hasRenderTargetTextures = false;\r\n for (const plugin of this._activePluginsForExtraEvents) {\r\n hasRenderTargetTextures = plugin.hasRenderTargetTextures();\r\n if (hasRenderTargetTextures) {\r\n break;\r\n }\r\n }\r\n eventData.hasRenderTargetTextures = hasRenderTargetTextures;\r\n }\r\n\r\n protected _handlePluginEventFillRenderTargetTextures(eventData: MaterialPluginFillRenderTargetTextures): void {\r\n for (const plugin of this._activePluginsForExtraEvents) {\r\n plugin.fillRenderTargetTextures(eventData.renderTargets);\r\n }\r\n }\r\n\r\n protected _handlePluginEvent(\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 {\r\n switch (id) {\r\n case MaterialPluginEvent.GetActiveTextures: {\r\n const eventData = info as MaterialPluginGetActiveTextures;\r\n for (const plugin of this._activePlugins) {\r\n plugin.getActiveTextures(eventData.activeTextures);\r\n }\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.GetAnimatables: {\r\n const eventData = info as MaterialPluginGetAnimatables;\r\n for (const plugin of this._activePlugins) {\r\n plugin.getAnimatables(eventData.animatables);\r\n }\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.HasTexture: {\r\n const eventData = info as MaterialPluginHasTexture;\r\n let hasTexture = false;\r\n for (const plugin of this._activePlugins) {\r\n hasTexture = plugin.hasTexture(eventData.texture);\r\n if (hasTexture) {\r\n break;\r\n }\r\n }\r\n eventData.hasTexture = hasTexture;\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.Disposed: {\r\n const eventData = info as MaterialPluginDisposed;\r\n for (const plugin of this._plugins) {\r\n plugin.dispose(eventData.forceDisposeTextures);\r\n }\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.GetDefineNames: {\r\n const eventData = info as MaterialPluginGetDefineNames;\r\n eventData.defineNames = this._defineNamesFromPlugins;\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.PrepareEffect: {\r\n const eventData = info as MaterialPluginPrepareEffect;\r\n for (const plugin of this._activePlugins) {\r\n eventData.fallbackRank = plugin.addFallbacks(eventData.defines, eventData.fallbacks, eventData.fallbackRank);\r\n plugin.getAttributes(eventData.attributes, this._scene, eventData.mesh);\r\n }\r\n if (this._uniformList.length > 0) {\r\n eventData.uniforms.push(...this._uniformList);\r\n }\r\n if (this._samplerList.length > 0) {\r\n eventData.samplers.push(...this._samplerList);\r\n }\r\n if (this._uboList.length > 0) {\r\n eventData.uniformBuffersNames.push(...this._uboList);\r\n }\r\n eventData.customCode = this._injectCustomCode(eventData.customCode);\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.PrepareUniformBuffer: {\r\n const eventData = info as MaterialPluginPrepareUniformBuffer;\r\n this._uboDeclaration = \"\";\r\n this._vertexDeclaration = \"\";\r\n this._fragmentDeclaration = \"\";\r\n this._uniformList = [];\r\n this._samplerList = [];\r\n this._uboList = [];\r\n for (const plugin of this._plugins) {\r\n const uniforms = plugin.getUniforms();\r\n if (uniforms) {\r\n if (uniforms.ubo) {\r\n for (const uniform of uniforms.ubo) {\r\n eventData.ubo.addUniform(uniform.name, uniform.size);\r\n this._uboDeclaration += `${uniform.type} ${uniform.name};\\r\\n`;\r\n this._uniformList.push(uniform.name);\r\n }\r\n }\r\n if (uniforms.vertex) {\r\n this._vertexDeclaration += uniforms.vertex + \"\\r\\n\";\r\n }\r\n if (uniforms.fragment) {\r\n this._fragmentDeclaration += uniforms.fragment + \"\\r\\n\";\r\n }\r\n }\r\n plugin.getSamplers(this._samplerList);\r\n plugin.getUniformBuffersNames(this._uboList);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n protected _collectPointNames(shaderType: string, customCode: Nullable<{ [pointName: string]: string }> | undefined): void {\r\n if (!customCode) {\r\n return;\r\n }\r\n for (const pointName in customCode) {\r\n if (!this._codeInjectionPoints[shaderType]) {\r\n this._codeInjectionPoints[shaderType] = {};\r\n }\r\n this._codeInjectionPoints[shaderType][pointName] = true;\r\n }\r\n }\r\n\r\n protected _injectCustomCode(existingCallback?: (shaderType: string, code: string) => string): ShaderCustomProcessingFunction {\r\n return (shaderType: string, code: string) => {\r\n if (existingCallback) {\r\n code = existingCallback(shaderType, code);\r\n }\r\n if (this._uboDeclaration) {\r\n code = code.replace(\"#define ADDITIONAL_UBO_DECLARATION\", this._uboDeclaration);\r\n }\r\n if (this._vertexDeclaration) {\r\n code = code.replace(\"#define ADDITIONAL_VERTEX_DECLARATION\", this._vertexDeclaration);\r\n }\r\n if (this._fragmentDeclaration) {\r\n code = code.replace(\"#define ADDITIONAL_FRAGMENT_DECLARATION\", this._fragmentDeclaration);\r\n }\r\n const points = this._codeInjectionPoints?.[shaderType];\r\n if (!points) {\r\n return code;\r\n }\r\n for (let pointName in points) {\r\n let injectedCode = \"\";\r\n for (const plugin of this._activePlugins) {\r\n const customCode = plugin.getCustomCode(shaderType);\r\n if (customCode?.[pointName]) {\r\n injectedCode += customCode[pointName] + \"\\r\\n\";\r\n }\r\n }\r\n if (injectedCode.length > 0) {\r\n if (pointName.charAt(0) === \"!\") {\r\n // pointName is a regular expression\r\n pointName = pointName.substring(1);\r\n\r\n let regexFlags = \"g\";\r\n if (pointName.charAt(0) === \"!\") {\r\n // no flags\r\n regexFlags = \"\";\r\n pointName = pointName.substring(1);\r\n } else {\r\n // get the flag(s)\r\n const matchOption = rxOption.exec(pointName);\r\n if (matchOption && matchOption.length >= 2) {\r\n regexFlags = matchOption[1];\r\n pointName = pointName.substring(regexFlags.length + 1);\r\n }\r\n }\r\n\r\n if (regexFlags.indexOf(\"g\") < 0) {\r\n // we force the \"g\" flag so that the regexp object is stateful!\r\n regexFlags += \"g\";\r\n }\r\n\r\n const sourceCode = code;\r\n const rx = new RegExp(pointName, regexFlags);\r\n let match = rx.exec(sourceCode);\r\n while (match !== null) {\r\n let newCode = injectedCode;\r\n for (let i = 0; i < match.length; ++i) {\r\n newCode = newCode.replace(\"$\" + i, match[i]);\r\n }\r\n code = code.replace(match[0], newCode);\r\n match = rx.exec(sourceCode);\r\n }\r\n } else {\r\n const fullPointName = \"#define \" + pointName;\r\n code = code.replace(fullPointName, \"\\r\\n\" + injectedCode + \"\\r\\n\" + fullPointName);\r\n }\r\n }\r\n }\r\n return code;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Type for plugin material factories.\r\n */\r\nexport type PluginMaterialFactory = (material: Material) => Nullable<MaterialPluginBase>;\r\n\r\nconst plugins: Array<[string, PluginMaterialFactory]> = [];\r\nlet inited = false;\r\n\r\n/**\r\n * Registers a new material plugin through a factory, or updates it. This makes the plugin available to all materials instantiated after its registration.\r\n * @param pluginName The plugin name\r\n * @param factory The factory function which allows to create the plugin\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterMaterialPlugin(pluginName: string, factory: PluginMaterialFactory): void {\r\n if (!inited) {\r\n Material.OnEventObservable.add((material: Material) => {\r\n for (const [, factory] of plugins) {\r\n factory(material);\r\n }\r\n }, MaterialPluginEvent.Created);\r\n inited = true;\r\n }\r\n const existing = plugins.filter(([name, _factory]) => name === pluginName);\r\n if (existing.length > 0) {\r\n existing[0][1] = factory;\r\n } else {\r\n plugins.push([pluginName, factory]);\r\n }\r\n}\r\n\r\n/**\r\n * Removes a material plugin from the list of global plugins.\r\n * @param pluginName The plugin name\r\n * @returns true if the plugin has been removed, else false\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function UnregisterMaterialPlugin(pluginName: string): boolean {\r\n for (let i = 0; i < plugins.length; ++i) {\r\n if (plugins[i][0] === pluginName) {\r\n plugins.splice(i, 1);\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Clear the list of global material plugins\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function UnregisterAllMaterialPlugins(): void {\r\n plugins.length = 0;\r\n}\r\n"]}
1
+ {"version":3,"file":"materialPluginManager.js","sourceRoot":"","sources":["../../../../lts/core/generated/Materials/materialPluginManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ShaderCustomProcessingFunction } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Material } from \"./material\";\r\nimport type {\r\n MaterialPluginPrepareEffect,\r\n MaterialPluginBindForSubMesh,\r\n MaterialPluginDisposed,\r\n MaterialPluginGetActiveTextures,\r\n MaterialPluginGetAnimatables,\r\n MaterialPluginGetDefineNames,\r\n MaterialPluginHasTexture,\r\n MaterialPluginIsReadyForSubMesh,\r\n MaterialPluginPrepareDefines,\r\n MaterialPluginPrepareUniformBuffer,\r\n MaterialPluginHardBindForSubMesh,\r\n MaterialPluginHasRenderTargetTextures,\r\n MaterialPluginFillRenderTargetTextures,\r\n} from \"./materialPluginEvent\";\r\nimport { MaterialPluginEvent } from \"./materialPluginEvent\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\n\r\ndeclare type Scene = import(\"../scene\").Scene;\r\ndeclare type Engine = import(\"../Engines/engine\").Engine;\r\ndeclare type MaterialPluginBase = import(\"./materialPluginBase\").MaterialPluginBase;\r\n\r\ndeclare module \"./material\" {\r\n export interface Material {\r\n /**\r\n * Plugin manager for this material\r\n */\r\n pluginManager?: MaterialPluginManager;\r\n }\r\n}\r\n\r\nconst rxOption = new RegExp(\"^([gimus]+)!\");\r\n\r\n/**\r\n * Class that manages the plugins of a material\r\n * @since 5.0\r\n */\r\nexport class MaterialPluginManager {\r\n /** Map a plugin class name to a #define name (used in the vertex/fragment shaders as a marker of the plugin usage) */\r\n private static _MaterialPluginClassToMainDefine: { [name: string]: string } = {};\r\n private static _MaterialPluginCounter: number = 0;\r\n\r\n protected _material: Material;\r\n protected _scene: Scene;\r\n protected _engine: Engine;\r\n protected _plugins: MaterialPluginBase[] = [];\r\n protected _activePlugins: MaterialPluginBase[] = [];\r\n protected _activePluginsForExtraEvents: MaterialPluginBase[] = [];\r\n protected _codeInjectionPoints: { [shaderType: string]: { [codeName: string]: boolean } };\r\n protected _defineNamesFromPlugins?: { [name: string]: { type: string; default: any } };\r\n protected _uboDeclaration: string;\r\n protected _vertexDeclaration: string;\r\n protected _fragmentDeclaration: string;\r\n protected _uniformList: string[];\r\n protected _samplerList: string[];\r\n protected _uboList: string[];\r\n\r\n /**\r\n * Creates a new instance of the plugin manager\r\n * @param material material that this manager will manage the plugins for\r\n */\r\n constructor(material: Material) {\r\n this._material = material;\r\n this._scene = material.getScene();\r\n this._engine = this._scene.getEngine();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _addPlugin(plugin: MaterialPluginBase): void {\r\n for (let i = 0; i < this._plugins.length; ++i) {\r\n if (this._plugins[i].name === plugin.name) {\r\n throw `Plugin \"${plugin.name}\" already added to the material \"${this._material.name}\"!`;\r\n }\r\n }\r\n\r\n if (this._material._uniformBufferLayoutBuilt) {\r\n throw `The plugin \"${plugin.name}\" can't be added to the material \"${this._material.name}\" because this material has already been used for rendering! Please add plugins to materials before any rendering with this material occurs.`;\r\n }\r\n\r\n const pluginClassName = plugin.getClassName();\r\n if (!MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName]) {\r\n MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName] = \"MATERIALPLUGIN_\" + ++MaterialPluginManager._MaterialPluginCounter;\r\n }\r\n\r\n this._material._callbackPluginEventGeneric = this._handlePluginEvent.bind(this);\r\n\r\n this._plugins.push(plugin);\r\n this._plugins.sort((a, b) => a.priority - b.priority);\r\n\r\n this._codeInjectionPoints = {};\r\n\r\n const defineNamesFromPlugins: { [name: string]: { type: string; default: any } } = {};\r\n defineNamesFromPlugins[MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName]] = {\r\n type: \"boolean\",\r\n default: true,\r\n };\r\n\r\n for (const plugin of this._plugins) {\r\n plugin.collectDefines(defineNamesFromPlugins);\r\n this._collectPointNames(\"vertex\", plugin.getCustomCode(\"vertex\"));\r\n this._collectPointNames(\"fragment\", plugin.getCustomCode(\"fragment\"));\r\n }\r\n\r\n this._defineNamesFromPlugins = defineNamesFromPlugins;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _activatePlugin(plugin: MaterialPluginBase): void {\r\n if (this._activePlugins.indexOf(plugin) === -1) {\r\n this._activePlugins.push(plugin);\r\n this._activePlugins.sort((a, b) => a.priority - b.priority);\r\n\r\n this._material._callbackPluginEventIsReadyForSubMesh = this._handlePluginEventIsReadyForSubMesh.bind(this);\r\n this._material._callbackPluginEventPrepareDefinesBeforeAttributes = this._handlePluginEventPrepareDefinesBeforeAttributes.bind(this);\r\n this._material._callbackPluginEventPrepareDefines = this._handlePluginEventPrepareDefines.bind(this);\r\n this._material._callbackPluginEventBindForSubMesh = this._handlePluginEventBindForSubMesh.bind(this);\r\n\r\n if (plugin.registerForExtraEvents) {\r\n this._activePluginsForExtraEvents.push(plugin);\r\n this._activePluginsForExtraEvents.sort((a, b) => a.priority - b.priority);\r\n this._material._callbackPluginEventHasRenderTargetTextures = this._handlePluginEventHasRenderTargetTextures.bind(this);\r\n this._material._callbackPluginEventFillRenderTargetTextures = this._handlePluginEventFillRenderTargetTextures.bind(this);\r\n this._material._callbackPluginEventHardBindForSubMesh = this._handlePluginEventHardBindForSubMesh.bind(this);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets a plugin from the list of plugins managed by this manager\r\n * @param name name of the plugin\r\n * @returns the plugin if found, else null\r\n */\r\n public getPlugin(name: string): Nullable<MaterialPluginBase> {\r\n for (let i = 0; i < this._plugins.length; ++i) {\r\n if (this._plugins[i].name === name) {\r\n return this._plugins[i];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n protected _handlePluginEventIsReadyForSubMesh(eventData: MaterialPluginIsReadyForSubMesh): void {\r\n let isReady = true;\r\n for (const plugin of this._activePlugins) {\r\n isReady = isReady && plugin.isReadyForSubMesh(eventData.defines, this._scene, this._engine, eventData.subMesh);\r\n }\r\n eventData.isReadyForSubMesh = isReady;\r\n }\r\n\r\n protected _handlePluginEventPrepareDefinesBeforeAttributes(eventData: MaterialPluginPrepareDefines): void {\r\n for (const plugin of this._activePlugins) {\r\n plugin.prepareDefinesBeforeAttributes(eventData.defines, this._scene, eventData.mesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventPrepareDefines(eventData: MaterialPluginPrepareDefines): void {\r\n for (const plugin of this._activePlugins) {\r\n plugin.prepareDefines(eventData.defines, this._scene, eventData.mesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventHardBindForSubMesh(eventData: MaterialPluginHardBindForSubMesh): void {\r\n for (const plugin of this._activePluginsForExtraEvents) {\r\n plugin.hardBindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, eventData.subMesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventBindForSubMesh(eventData: MaterialPluginBindForSubMesh): void {\r\n for (const plugin of this._activePlugins) {\r\n plugin.bindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, eventData.subMesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventHasRenderTargetTextures(eventData: MaterialPluginHasRenderTargetTextures): void {\r\n let hasRenderTargetTextures = false;\r\n for (const plugin of this._activePluginsForExtraEvents) {\r\n hasRenderTargetTextures = plugin.hasRenderTargetTextures();\r\n if (hasRenderTargetTextures) {\r\n break;\r\n }\r\n }\r\n eventData.hasRenderTargetTextures = hasRenderTargetTextures;\r\n }\r\n\r\n protected _handlePluginEventFillRenderTargetTextures(eventData: MaterialPluginFillRenderTargetTextures): void {\r\n for (const plugin of this._activePluginsForExtraEvents) {\r\n plugin.fillRenderTargetTextures(eventData.renderTargets);\r\n }\r\n }\r\n\r\n protected _handlePluginEvent(\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 {\r\n switch (id) {\r\n case MaterialPluginEvent.GetActiveTextures: {\r\n const eventData = info as MaterialPluginGetActiveTextures;\r\n for (const plugin of this._activePlugins) {\r\n plugin.getActiveTextures(eventData.activeTextures);\r\n }\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.GetAnimatables: {\r\n const eventData = info as MaterialPluginGetAnimatables;\r\n for (const plugin of this._activePlugins) {\r\n plugin.getAnimatables(eventData.animatables);\r\n }\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.HasTexture: {\r\n const eventData = info as MaterialPluginHasTexture;\r\n let hasTexture = false;\r\n for (const plugin of this._activePlugins) {\r\n hasTexture = plugin.hasTexture(eventData.texture);\r\n if (hasTexture) {\r\n break;\r\n }\r\n }\r\n eventData.hasTexture = hasTexture;\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.Disposed: {\r\n const eventData = info as MaterialPluginDisposed;\r\n for (const plugin of this._plugins) {\r\n plugin.dispose(eventData.forceDisposeTextures);\r\n }\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.GetDefineNames: {\r\n const eventData = info as MaterialPluginGetDefineNames;\r\n eventData.defineNames = this._defineNamesFromPlugins;\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.PrepareEffect: {\r\n const eventData = info as MaterialPluginPrepareEffect;\r\n for (const plugin of this._activePlugins) {\r\n eventData.fallbackRank = plugin.addFallbacks(eventData.defines, eventData.fallbacks, eventData.fallbackRank);\r\n plugin.getAttributes(eventData.attributes, this._scene, eventData.mesh);\r\n }\r\n if (this._uniformList.length > 0) {\r\n eventData.uniforms.push(...this._uniformList);\r\n }\r\n if (this._samplerList.length > 0) {\r\n eventData.samplers.push(...this._samplerList);\r\n }\r\n if (this._uboList.length > 0) {\r\n eventData.uniformBuffersNames.push(...this._uboList);\r\n }\r\n eventData.customCode = this._injectCustomCode(eventData.customCode);\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.PrepareUniformBuffer: {\r\n const eventData = info as MaterialPluginPrepareUniformBuffer;\r\n this._uboDeclaration = \"\";\r\n this._vertexDeclaration = \"\";\r\n this._fragmentDeclaration = \"\";\r\n this._uniformList = [];\r\n this._samplerList = [];\r\n this._uboList = [];\r\n for (const plugin of this._plugins) {\r\n const uniforms = plugin.getUniforms();\r\n if (uniforms) {\r\n if (uniforms.ubo) {\r\n for (const uniform of uniforms.ubo) {\r\n if (uniform.size && uniform.type) {\r\n const arraySize = uniform.arraySize ?? 0;\r\n eventData.ubo.addUniform(uniform.name, uniform.size, arraySize);\r\n this._uboDeclaration += `${uniform.type} ${uniform.name}${arraySize > 0 ? `[${arraySize}]` : \"\"};\\r\\n`;\r\n }\r\n this._uniformList.push(uniform.name);\r\n }\r\n }\r\n if (uniforms.vertex) {\r\n this._vertexDeclaration += uniforms.vertex + \"\\r\\n\";\r\n }\r\n if (uniforms.fragment) {\r\n this._fragmentDeclaration += uniforms.fragment + \"\\r\\n\";\r\n }\r\n }\r\n plugin.getSamplers(this._samplerList);\r\n plugin.getUniformBuffersNames(this._uboList);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n protected _collectPointNames(shaderType: string, customCode: Nullable<{ [pointName: string]: string }> | undefined): void {\r\n if (!customCode) {\r\n return;\r\n }\r\n for (const pointName in customCode) {\r\n if (!this._codeInjectionPoints[shaderType]) {\r\n this._codeInjectionPoints[shaderType] = {};\r\n }\r\n this._codeInjectionPoints[shaderType][pointName] = true;\r\n }\r\n }\r\n\r\n protected _injectCustomCode(existingCallback?: (shaderType: string, code: string) => string): ShaderCustomProcessingFunction {\r\n return (shaderType: string, code: string) => {\r\n if (existingCallback) {\r\n code = existingCallback(shaderType, code);\r\n }\r\n if (this._uboDeclaration) {\r\n code = code.replace(\"#define ADDITIONAL_UBO_DECLARATION\", this._uboDeclaration);\r\n }\r\n if (this._vertexDeclaration) {\r\n code = code.replace(\"#define ADDITIONAL_VERTEX_DECLARATION\", this._vertexDeclaration);\r\n }\r\n if (this._fragmentDeclaration) {\r\n code = code.replace(\"#define ADDITIONAL_FRAGMENT_DECLARATION\", this._fragmentDeclaration);\r\n }\r\n const points = this._codeInjectionPoints?.[shaderType];\r\n if (!points) {\r\n return code;\r\n }\r\n for (let pointName in points) {\r\n let injectedCode = \"\";\r\n for (const plugin of this._activePlugins) {\r\n const customCode = plugin.getCustomCode(shaderType);\r\n if (customCode?.[pointName]) {\r\n injectedCode += customCode[pointName] + \"\\r\\n\";\r\n }\r\n }\r\n if (injectedCode.length > 0) {\r\n if (pointName.charAt(0) === \"!\") {\r\n // pointName is a regular expression\r\n pointName = pointName.substring(1);\r\n\r\n let regexFlags = \"g\";\r\n if (pointName.charAt(0) === \"!\") {\r\n // no flags\r\n regexFlags = \"\";\r\n pointName = pointName.substring(1);\r\n } else {\r\n // get the flag(s)\r\n const matchOption = rxOption.exec(pointName);\r\n if (matchOption && matchOption.length >= 2) {\r\n regexFlags = matchOption[1];\r\n pointName = pointName.substring(regexFlags.length + 1);\r\n }\r\n }\r\n\r\n if (regexFlags.indexOf(\"g\") < 0) {\r\n // we force the \"g\" flag so that the regexp object is stateful!\r\n regexFlags += \"g\";\r\n }\r\n\r\n const sourceCode = code;\r\n const rx = new RegExp(pointName, regexFlags);\r\n let match = rx.exec(sourceCode);\r\n while (match !== null) {\r\n let newCode = injectedCode;\r\n for (let i = 0; i < match.length; ++i) {\r\n newCode = newCode.replace(\"$\" + i, match[i]);\r\n }\r\n code = code.replace(match[0], newCode);\r\n match = rx.exec(sourceCode);\r\n }\r\n } else {\r\n const fullPointName = \"#define \" + pointName;\r\n code = code.replace(fullPointName, \"\\r\\n\" + injectedCode + \"\\r\\n\" + fullPointName);\r\n }\r\n }\r\n }\r\n return code;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Type for plugin material factories.\r\n */\r\nexport type PluginMaterialFactory = (material: Material) => Nullable<MaterialPluginBase>;\r\n\r\nconst plugins: Array<[string, PluginMaterialFactory]> = [];\r\nlet inited = false;\r\nlet observer: Nullable<Observer<Material>> = null;\r\n\r\n/**\r\n * Registers a new material plugin through a factory, or updates it. This makes the plugin available to all materials instantiated after its registration.\r\n * @param pluginName The plugin name\r\n * @param factory The factory function which allows to create the plugin\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterMaterialPlugin(pluginName: string, factory: PluginMaterialFactory): void {\r\n if (!inited) {\r\n observer = Material.OnEventObservable.add((material: Material) => {\r\n for (const [, factory] of plugins) {\r\n factory(material);\r\n }\r\n }, MaterialPluginEvent.Created);\r\n inited = true;\r\n }\r\n const existing = plugins.filter(([name, _factory]) => name === pluginName);\r\n if (existing.length > 0) {\r\n existing[0][1] = factory;\r\n } else {\r\n plugins.push([pluginName, factory]);\r\n }\r\n}\r\n\r\n/**\r\n * Removes a material plugin from the list of global plugins.\r\n * @param pluginName The plugin name\r\n * @returns true if the plugin has been removed, else false\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function UnregisterMaterialPlugin(pluginName: string): boolean {\r\n for (let i = 0; i < plugins.length; ++i) {\r\n if (plugins[i][0] === pluginName) {\r\n plugins.splice(i, 1);\r\n if (plugins.length === 0) {\r\n UnregisterAllMaterialPlugins();\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Clear the list of global material plugins\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function UnregisterAllMaterialPlugins(): void {\r\n plugins.length = 0;\r\n inited = false;\r\n Material.OnEventObservable.remove(observer);\r\n}\r\n"]}
@@ -314,6 +314,8 @@ export declare class UniformBuffer {
314
314
  get _indexBuffer(): number;
315
315
  /** Gets the name of this buffer */
316
316
  get name(): string;
317
+ /** Gets the current effect */
318
+ get currentEffect(): Nullable<Effect>;
317
319
  private _buffersEqual;
318
320
  private _copyBuffer;
319
321
  /**
@@ -345,6 +345,10 @@ export class UniformBuffer {
345
345
  get name() {
346
346
  return this._name;
347
347
  }
348
+ /** Gets the current effect */
349
+ get currentEffect() {
350
+ return this._currentEffect;
351
+ }
348
352
  _buffersEqual(buf1, buf2) {
349
353
  for (let i = 0; i < buf1.length; ++i) {
350
354
  if (buf1[i] !== buf2[i]) {