@onerjs/core 8.28.1 → 8.28.2

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 (67) hide show
  1. package/Collisions/gpuPicker.d.ts +40 -16
  2. package/Collisions/gpuPicker.js +216 -95
  3. package/Collisions/gpuPicker.js.map +1 -1
  4. package/Decorators/nodeDecorator.d.ts +5 -1
  5. package/Decorators/nodeDecorator.js +4 -0
  6. package/Decorators/nodeDecorator.js.map +1 -1
  7. package/Engines/abstractEngine.js +2 -2
  8. package/Engines/abstractEngine.js.map +1 -1
  9. package/FrameGraph/Node/Blocks/PostProcesses/colorCorrectionPostProcessBlock.d.ts +30 -0
  10. package/FrameGraph/Node/Blocks/PostProcesses/colorCorrectionPostProcessBlock.js +56 -0
  11. package/FrameGraph/Node/Blocks/PostProcesses/colorCorrectionPostProcessBlock.js.map +1 -0
  12. package/FrameGraph/Node/Blocks/PostProcesses/filterPostProcessBlock.d.ts +32 -0
  13. package/FrameGraph/Node/Blocks/PostProcesses/filterPostProcessBlock.js +62 -0
  14. package/FrameGraph/Node/Blocks/PostProcesses/filterPostProcessBlock.js.map +1 -0
  15. package/FrameGraph/Node/Blocks/PostProcesses/tonemapPostProcessBlock.d.ts +36 -0
  16. package/FrameGraph/Node/Blocks/PostProcesses/tonemapPostProcessBlock.js +88 -0
  17. package/FrameGraph/Node/Blocks/PostProcesses/tonemapPostProcessBlock.js.map +1 -0
  18. package/FrameGraph/Node/Blocks/index.d.ts +3 -0
  19. package/FrameGraph/Node/Blocks/index.js +3 -0
  20. package/FrameGraph/Node/Blocks/index.js.map +1 -1
  21. package/FrameGraph/Tasks/PostProcesses/colorCorrectionTask.d.ts +17 -0
  22. package/FrameGraph/Tasks/PostProcesses/colorCorrectionTask.js +18 -0
  23. package/FrameGraph/Tasks/PostProcesses/colorCorrectionTask.js.map +1 -0
  24. package/FrameGraph/Tasks/PostProcesses/filterTask.d.ts +16 -0
  25. package/FrameGraph/Tasks/PostProcesses/filterTask.js +17 -0
  26. package/FrameGraph/Tasks/PostProcesses/filterTask.js.map +1 -0
  27. package/FrameGraph/Tasks/PostProcesses/tonemapTask.d.ts +16 -0
  28. package/FrameGraph/Tasks/PostProcesses/tonemapTask.js +17 -0
  29. package/FrameGraph/Tasks/PostProcesses/tonemapTask.js.map +1 -0
  30. package/FrameGraph/index.d.ts +3 -0
  31. package/FrameGraph/index.js +3 -0
  32. package/FrameGraph/index.js.map +1 -1
  33. package/Materials/effect.d.ts +1 -0
  34. package/Materials/effect.js +7 -1
  35. package/Materials/effect.js.map +1 -1
  36. package/Physics/v2/physicsAggregate.js +4 -3
  37. package/Physics/v2/physicsAggregate.js.map +1 -1
  38. package/PostProcesses/colorCorrectionPostProcess.d.ts +3 -3
  39. package/PostProcesses/colorCorrectionPostProcess.js +21 -21
  40. package/PostProcesses/colorCorrectionPostProcess.js.map +1 -1
  41. package/PostProcesses/filterPostProcess.d.ts +4 -2
  42. package/PostProcesses/filterPostProcess.js +22 -15
  43. package/PostProcesses/filterPostProcess.js.map +1 -1
  44. package/PostProcesses/index.d.ts +3 -0
  45. package/PostProcesses/index.js +3 -0
  46. package/PostProcesses/index.js.map +1 -1
  47. package/PostProcesses/thinColorCorrectionPostProcess.d.ts +30 -0
  48. package/PostProcesses/thinColorCorrectionPostProcess.js +52 -0
  49. package/PostProcesses/thinColorCorrectionPostProcess.js.map +1 -0
  50. package/PostProcesses/thinFilterPostProcess.d.ts +29 -0
  51. package/PostProcesses/thinFilterPostProcess.js +51 -0
  52. package/PostProcesses/thinFilterPostProcess.js.map +1 -0
  53. package/PostProcesses/thinTonemapPostProcess.d.ts +52 -0
  54. package/PostProcesses/thinTonemapPostProcess.js +83 -0
  55. package/PostProcesses/thinTonemapPostProcess.js.map +1 -0
  56. package/PostProcesses/tonemapPostProcess.d.ts +23 -21
  57. package/PostProcesses/tonemapPostProcess.js +55 -46
  58. package/PostProcesses/tonemapPostProcess.js.map +1 -1
  59. package/Shaders/picking.fragment.js +20 -6
  60. package/Shaders/picking.fragment.js.map +1 -1
  61. package/Shaders/picking.vertex.js +4 -3
  62. package/Shaders/picking.vertex.js.map +1 -1
  63. package/ShadersWGSL/picking.fragment.js +11 -6
  64. package/ShadersWGSL/picking.fragment.js.map +1 -1
  65. package/ShadersWGSL/picking.vertex.js +4 -3
  66. package/ShadersWGSL/picking.vertex.js.map +1 -1
  67. package/package.json +1 -1
@@ -259,6 +259,7 @@ export declare class Effect implements IDisposable {
259
259
  private _processingContext;
260
260
  private _processCodeAfterIncludes;
261
261
  private _processFinalCode;
262
+ private _onReleaseEffectsObserver;
262
263
  /**
263
264
  * Gets the shader language type used to write vertex and fragment source code.
264
265
  */
@@ -132,6 +132,7 @@ export class Effect {
132
132
  this._rawFragmentSourceCode = "";
133
133
  this._processCodeAfterIncludes = undefined;
134
134
  this._processFinalCode = null;
135
+ this._onReleaseEffectsObserver = null;
135
136
  this.name = baseName;
136
137
  this._key = key;
137
138
  const pipelineName = this._key.replace(/\r/g, "").replace(/\n/g, "|");
@@ -195,7 +196,8 @@ export class Effect {
195
196
  this._pipelineContext.program.__SPECTOR_rebuildProgram = this._rebuildProgram.bind(this);
196
197
  }
197
198
  }
198
- this._engine.onReleaseEffectsObservable.addOnce(() => {
199
+ this._onReleaseEffectsObserver = this._engine.onReleaseEffectsObservable.addOnce(() => {
200
+ this._onReleaseEffectsObserver = null;
199
201
  if (this.isDisposed) {
200
202
  return;
201
203
  }
@@ -1167,6 +1169,10 @@ export class Effect {
1167
1169
  // Others are still using the effect or the effect was already disposed
1168
1170
  return;
1169
1171
  }
1172
+ if (this._onReleaseEffectsObserver) {
1173
+ this._engine.onReleaseEffectsObservable.remove(this._onReleaseEffectsObserver);
1174
+ this._onReleaseEffectsObserver = null;
1175
+ }
1170
1176
  if (this._pipelineContext) {
1171
1177
  resetCachedPipeline(this._pipelineContext);
1172
1178
  }
@@ -1 +1 @@
1
- {"version":3,"file":"effect.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/effect.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from \"../Misc/observable\";\r\nimport type { FloatArray, Nullable } from \"../types\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { IDisposable } from \"../scene\";\r\nimport type { IPipelineContext } from \"../Engines/IPipelineContext\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport type { IShaderProcessor } from \"../Engines/Processors/iShaderProcessor\";\r\nimport type { _IProcessingOptions, ShaderCustomProcessingFunction, _IShaderProcessingContext } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { IMatrixLike, IVector2Like, IVector3Like, IVector4Like, IColor3Like, IColor4Like, IQuaternionLike } from \"../Maths/math.like\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { IEffectFallbacks } from \"./iEffectFallbacks\";\r\nimport { ShaderStore as EngineShaderStore } from \"../Engines/shaderStore\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { IPipelineGenerationOptions } from \"./effect.functions\";\r\nimport { _ProcessShaderCode, getCachedPipeline, createAndPreparePipelineContext, resetCachedPipeline } from \"./effect.functions\";\r\nimport { _RetryWithInterval } from \"core/Misc/timingTools\";\r\n\r\n/**\r\n * Defines the route to the shader code. The priority is as follows:\r\n * * object: `{ vertexSource: \"vertex shader code string\", fragmentSource: \"fragment shader code string\" }` for directly passing the shader code\r\n * * object: `{ vertexElement: \"vertexShaderCode\", fragmentElement: \"fragmentShaderCode\" }`, used with shader code in script tags\r\n * * object: `{ vertex: \"custom\", fragment: \"custom\" }`, used with `Effect.ShadersStore[\"customVertexShader\"]` and `Effect.ShadersStore[\"customFragmentShader\"]`\r\n * * string: `\"./COMMON_NAME\"`, used with external files COMMON_NAME.vertex.fx and COMMON_NAME.fragment.fx in index.html folder.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport type IShaderPath = {\r\n // Should not have `I` prefix as it is a type and not an interface\r\n /**\r\n * Directly pass the shader code\r\n */\r\n vertexSource?: string;\r\n /**\r\n * Directly pass the shader code\r\n */\r\n fragmentSource?: string;\r\n /**\r\n * Used with Effect.ShadersStore. If the `vertex` is set to `\"custom`, then\r\n * Babylon.js will read from Effect.ShadersStore[\"customVertexShader\"]\r\n */\r\n vertex?: string;\r\n /**\r\n * Used with Effect.ShadersStore. If the `fragment` is set to `\"custom`, then\r\n * Babylon.js will read from Effect.ShadersStore[\"customFragmentShader\"]\r\n */\r\n fragment?: string;\r\n /**\r\n * Used with shader code in script tags\r\n */\r\n vertexElement?: string;\r\n /**\r\n * Used with shader code in script tags\r\n */\r\n fragmentElement?: string;\r\n /**\r\n * Defines the name appearing in spector when framgent/vertex...source are being used\r\n */\r\n spectorName?: string;\r\n};\r\n\r\n/**\r\n * Options to be used when creating an effect.\r\n */\r\nexport interface IEffectCreationOptions {\r\n /**\r\n * Attributes that will be used in the shader.\r\n */\r\n attributes: string[];\r\n /**\r\n * Uniform variable names that will be set in the shader.\r\n */\r\n uniformsNames: string[];\r\n /**\r\n * Uniform buffer variable names that will be set in the shader.\r\n */\r\n uniformBuffersNames?: string[];\r\n /**\r\n * Sampler texture variable names that will be set in the shader.\r\n */\r\n samplers: string[];\r\n /**\r\n * Define statements that will be set in the shader.\r\n */\r\n defines: any;\r\n /**\r\n * Possible fallbacks for this effect to improve performance when needed.\r\n */\r\n fallbacks: Nullable<IEffectFallbacks>;\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n onCompiled: Nullable<(effect: Effect) => void>;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n onError: Nullable<(effect: Effect, errors: string) => void>;\r\n /**\r\n * Parameters to be used with Babylons include syntax to iterate over an array (eg. \\{lights: 10\\})\r\n */\r\n indexParameters?: any;\r\n /**\r\n * Max number of lights that can be used in the shader.\r\n */\r\n maxSimultaneousLights?: number;\r\n /**\r\n * See https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/transformFeedbackVaryings\r\n */\r\n transformFeedbackVaryings?: Nullable<string[]>;\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 * If provided, will be called two times with the vertex and fragment code so that this code can be updated after the #include have been processed\r\n */\r\n processCodeAfterIncludes?: Nullable<ShaderCustomProcessingFunction>;\r\n /**\r\n * Is this effect rendering to several color attachments ?\r\n */\r\n multiTarget?: boolean;\r\n /**\r\n * The language the shader is written in (default: GLSL)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n\r\n /**\r\n * Provide an existing pipeline context to avoid creating a new one\r\n */\r\n existingPipelineContext?: IPipelineContext;\r\n /**\r\n * Additional async code to run before preparing the effect\r\n */\r\n extraInitializationsAsync?: () => Promise<void>;\r\n\r\n /**\r\n * If set to true the shader will not be compiles asynchronously, even if the engine allows it.\r\n */\r\n disableParallelShaderCompilation?: boolean;\r\n}\r\n\r\n/**\r\n * Effect containing vertex and fragment shader that can be executed on an object.\r\n */\r\nexport class Effect implements IDisposable {\r\n /**\r\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\r\n */\r\n public static get ShadersRepository(): string {\r\n return EngineShaderStore.ShadersRepository;\r\n }\r\n public static set ShadersRepository(repo: string) {\r\n EngineShaderStore.ShadersRepository = repo;\r\n }\r\n /**\r\n * Enable logging of the shader code when a compilation error occurs\r\n */\r\n public static LogShaderCodeOnCompilationError = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that effect ref counting is disabled\r\n * If true, the effect will persist in memory until engine is disposed\r\n */\r\n public static PersistentMode: boolean = false;\r\n\r\n /**\r\n * Use this with caution\r\n * See ClearCodeCache function comments\r\n */\r\n public static AutomaticallyClearCodeCache = false;\r\n\r\n /**\r\n * Name of the effect.\r\n */\r\n public name: IShaderPath | string;\r\n /**\r\n * String container all the define statements that should be set on the shader.\r\n */\r\n public defines: string = \"\";\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n public onCompiled: Nullable<(effect: Effect) => void> = null;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n public onError: Nullable<(effect: Effect, errors: string) => void> = null;\r\n /**\r\n * Callback that will be called when effect is bound.\r\n */\r\n public onBind: Nullable<(effect: Effect) => void> = null;\r\n /**\r\n * Unique ID of the effect.\r\n */\r\n public uniqueId = 0;\r\n /**\r\n * Observable that will be called when the shader is compiled.\r\n * It is recommended to use executeWhenCompile() or to make sure that scene.isReady() is called to get this observable raised.\r\n */\r\n public onCompileObservable = new Observable<Effect>();\r\n /**\r\n * Observable that will be called if an error occurs during shader compilation.\r\n */\r\n public onErrorObservable = new Observable<Effect>();\r\n\r\n /** @internal */\r\n public _onBindObservable: Nullable<Observable<Effect>> = null;\r\n\r\n private _isDisposed = false;\r\n\r\n /**\r\n * Gets a boolean indicating that the effect was already disposed\r\n */\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /** @internal */\r\n public _refCount = 1;\r\n\r\n /**\r\n * Observable that will be called when effect is bound.\r\n */\r\n public get onBindObservable(): Observable<Effect> {\r\n if (!this._onBindObservable) {\r\n this._onBindObservable = new Observable<Effect>();\r\n }\r\n\r\n return this._onBindObservable;\r\n }\r\n\r\n /** @internal */\r\n public _bonesComputationForcedToCPU = false;\r\n /** @internal */\r\n public _uniformBuffersNames: { [key: string]: number } = {};\r\n /** @internal */\r\n public _samplerList: string[];\r\n /** @internal */\r\n public _multiTarget: boolean = false;\r\n\r\n private static _UniqueIdSeed = 0;\r\n /** @internal */\r\n public _engine: AbstractEngine;\r\n private _uniformBuffersNamesList: string[];\r\n private _uniformsNames: string[];\r\n /** @internal */\r\n public _samplers: { [key: string]: number } = {};\r\n private _isReady = false;\r\n private _compilationError = \"\";\r\n private _allFallbacksProcessed = false;\r\n private _attributesNames: string[];\r\n private _attributes: number[];\r\n private _attributeLocationByName: { [name: string]: number };\r\n /** @internal */\r\n public _uniforms: { [key: string]: Nullable<WebGLUniformLocation> } = {};\r\n /**\r\n * Key for the effect.\r\n * @internal\r\n */\r\n public _key: string = \"\";\r\n private _indexParameters: any;\r\n private _fallbacks: Nullable<IEffectFallbacks> = null;\r\n private _vertexSourceCodeOverride: string = \"\";\r\n private _fragmentSourceCodeOverride: string = \"\";\r\n private _transformFeedbackVaryings: Nullable<string[]> = null;\r\n private _shaderLanguage: ShaderLanguage;\r\n private _disableParallelShaderCompilation: boolean = false;\r\n /**\r\n * Compiled shader to webGL program.\r\n * @internal\r\n */\r\n public _pipelineContext: Nullable<IPipelineContext> = null;\r\n /** @internal */\r\n public _vertexSourceCode: string = \"\";\r\n /** @internal */\r\n public _fragmentSourceCode: string = \"\";\r\n\r\n /** @internal */\r\n public _vertexSourceCodeBeforeMigration: string = \"\";\r\n /** @internal */\r\n public _fragmentSourceCodeBeforeMigration: string = \"\";\r\n\r\n /** @internal */\r\n public _rawVertexSourceCode: string = \"\";\r\n /** @internal */\r\n public _rawFragmentSourceCode: string = \"\";\r\n\r\n private static _BaseCache: { [key: number]: DataBuffer } = {};\r\n private _processingContext: Nullable<_IShaderProcessingContext>;\r\n\r\n private _processCodeAfterIncludes: ShaderCustomProcessingFunction | undefined = undefined;\r\n private _processFinalCode: Nullable<ShaderCustomProcessingFunction> = null;\r\n\r\n /**\r\n * Gets the shader language type used to write vertex and fragment source code.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates an effect.\r\n * An effect can be used to create/manage/execute vertex and fragment shaders.\r\n * @param baseName Name of the effect.\r\n * @param attributesNamesOrOptions List of attribute names that will be passed to the shader or set of all options to create the effect.\r\n * @param uniformsNamesOrEngine List of uniform variable names that will be passed to the shader or the engine that will be used to render effect.\r\n * @param samplers List of sampler variables that will be passed to the shader.\r\n * @param engine Engine to be used to render the effect\r\n * @param defines Define statements to be added to the shader.\r\n * @param fallbacks Possible fallbacks for this effect to improve performance when needed.\r\n * @param onCompiled Callback that will be called when the shader is compiled.\r\n * @param onError Callback that will be called if an error occurs during shader compilation.\r\n * @param indexParameters Parameters to be used with Babylons include syntax to iterate over an array (eg. \\{lights: 10\\})\r\n * @param key Effect Key identifying uniquely compiled shader variants\r\n * @param shaderLanguage the language the shader is written in (default: GLSL)\r\n * @param extraInitializationsAsync additional async code to run before preparing the effect\r\n */\r\n constructor(\r\n baseName: IShaderPath | string,\r\n attributesNamesOrOptions: string[] | IEffectCreationOptions,\r\n uniformsNamesOrEngine: string[] | AbstractEngine,\r\n samplers: Nullable<string[]> = null,\r\n engine?: AbstractEngine,\r\n defines: Nullable<string> = null,\r\n fallbacks: Nullable<IEffectFallbacks> = null,\r\n onCompiled: Nullable<(effect: Effect) => void> = null,\r\n onError: Nullable<(effect: Effect, errors: string) => void> = null,\r\n indexParameters?: any,\r\n key: string = \"\",\r\n shaderLanguage = ShaderLanguage.GLSL,\r\n extraInitializationsAsync?: () => Promise<void>\r\n ) {\r\n this.name = baseName;\r\n this._key = key;\r\n const pipelineName = this._key.replace(/\\r/g, \"\").replace(/\\n/g, \"|\");\r\n let cachedPipeline: IPipelineContext | undefined = undefined;\r\n\r\n if ((<IEffectCreationOptions>attributesNamesOrOptions).attributes) {\r\n const options = <IEffectCreationOptions>attributesNamesOrOptions;\r\n this._engine = <AbstractEngine>uniformsNamesOrEngine;\r\n\r\n this._attributesNames = options.attributes;\r\n this._uniformsNames = options.uniformsNames.concat(options.samplers);\r\n this._samplerList = options.samplers.slice();\r\n this.defines = options.defines;\r\n this.onError = options.onError;\r\n this.onCompiled = options.onCompiled;\r\n this._fallbacks = options.fallbacks;\r\n this._indexParameters = options.indexParameters;\r\n this._transformFeedbackVaryings = options.transformFeedbackVaryings || null;\r\n this._multiTarget = !!options.multiTarget;\r\n this._shaderLanguage = options.shaderLanguage ?? ShaderLanguage.GLSL;\r\n this._disableParallelShaderCompilation = !!options.disableParallelShaderCompilation;\r\n\r\n if (options.uniformBuffersNames) {\r\n this._uniformBuffersNamesList = options.uniformBuffersNames.slice();\r\n for (let i = 0; i < options.uniformBuffersNames.length; i++) {\r\n this._uniformBuffersNames[options.uniformBuffersNames[i]] = i;\r\n }\r\n }\r\n\r\n this._processFinalCode = options.processFinalCode ?? null;\r\n this._processCodeAfterIncludes = options.processCodeAfterIncludes ?? undefined;\r\n extraInitializationsAsync = options.extraInitializationsAsync;\r\n\r\n cachedPipeline = options.existingPipelineContext;\r\n } else {\r\n this._engine = <AbstractEngine>engine;\r\n this.defines = defines == null ? \"\" : defines;\r\n this._uniformsNames = (<string[]>uniformsNamesOrEngine).concat(<string[]>samplers);\r\n this._samplerList = samplers ? samplers.slice() : [];\r\n this._attributesNames = <string[]>attributesNamesOrOptions;\r\n this._uniformBuffersNamesList = [];\r\n this._shaderLanguage = shaderLanguage;\r\n\r\n this.onError = onError;\r\n this.onCompiled = onCompiled;\r\n\r\n this._indexParameters = indexParameters;\r\n this._fallbacks = fallbacks;\r\n }\r\n\r\n // Use the cache if we can. For now, WebGL2 only.\r\n if (this._engine.shaderPlatformName === \"WEBGL2\") {\r\n cachedPipeline = getCachedPipeline(pipelineName, (this._engine as any)._gl) ?? cachedPipeline;\r\n }\r\n\r\n this._attributeLocationByName = {};\r\n\r\n this.uniqueId = Effect._UniqueIdSeed++;\r\n if (!cachedPipeline) {\r\n // Floating promise - should be checked here.\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._processShaderCodeAsync(null, false, null, extraInitializationsAsync);\r\n } else {\r\n this._pipelineContext = cachedPipeline;\r\n this._pipelineContext.setEngine(this._engine);\r\n this._onRenderingStateCompiled(this._pipelineContext);\r\n // rebuildRebind for spector\r\n if ((this._pipelineContext as any).program) {\r\n (this._pipelineContext as any).program.__SPECTOR_rebuildProgram = this._rebuildProgram.bind(this);\r\n }\r\n }\r\n\r\n this._engine.onReleaseEffectsObservable.addOnce(() => {\r\n if (this.isDisposed) {\r\n return;\r\n }\r\n\r\n this.dispose(true);\r\n });\r\n }\r\n\r\n /** @internal */\r\n public async _processShaderCodeAsync(\r\n shaderProcessor: Nullable<IShaderProcessor> = null,\r\n keepExistingPipelineContext = false,\r\n shaderProcessingContext: Nullable<_IShaderProcessingContext> = null,\r\n extraInitializationsAsync?: () => Promise<void>\r\n ) {\r\n if (extraInitializationsAsync) {\r\n await extraInitializationsAsync();\r\n }\r\n\r\n this._processingContext = shaderProcessingContext || this._engine._getShaderProcessingContext(this._shaderLanguage, false);\r\n\r\n const processorOptions: _IProcessingOptions = {\r\n defines: this.defines.split(\"\\n\"),\r\n indexParameters: this._indexParameters,\r\n isFragment: false,\r\n shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader,\r\n processor: shaderProcessor ?? this._engine._getShaderProcessor(this._shaderLanguage),\r\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\r\n shadersRepository: EngineShaderStore.GetShadersRepository(this._shaderLanguage),\r\n includesShadersStore: EngineShaderStore.GetIncludesShadersStore(this._shaderLanguage),\r\n version: (this._engine.version * 100).toString(),\r\n platformName: this._engine.shaderPlatformName,\r\n processingContext: this._processingContext,\r\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\r\n processCodeAfterIncludes: this._processCodeAfterIncludes,\r\n };\r\n\r\n _ProcessShaderCode(\r\n processorOptions,\r\n this.name,\r\n this._processFinalCode,\r\n (migratedVertexCode, migratedFragmentCode) => {\r\n this._vertexSourceCode = migratedVertexCode;\r\n this._fragmentSourceCode = migratedFragmentCode;\r\n this._prepareEffect(keepExistingPipelineContext);\r\n },\r\n this._shaderLanguage,\r\n this._engine,\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * Unique key for this effect\r\n */\r\n public get key(): string {\r\n return this._key;\r\n }\r\n\r\n /**\r\n * If the effect has been compiled and prepared.\r\n * @returns if the effect is compiled and prepared.\r\n */\r\n public isReady(): boolean {\r\n try {\r\n return this._isReadyInternal();\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private _isReadyInternal(): boolean {\r\n if (this._engine.isDisposed) {\r\n // Engine is disposed, we return true to prevent looping over the setTimeout call in _checkIsReady\r\n return true;\r\n }\r\n if (this._isReady) {\r\n return true;\r\n }\r\n if (this._pipelineContext) {\r\n return this._pipelineContext.isReady;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * The engine the effect was initialized with.\r\n * @returns the engine.\r\n */\r\n public getEngine(): AbstractEngine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * The pipeline context for this effect\r\n * @returns the associated pipeline context\r\n */\r\n public getPipelineContext(): Nullable<IPipelineContext> {\r\n return this._pipelineContext;\r\n }\r\n\r\n /**\r\n * The set of names of attribute variables for the shader.\r\n * @returns An array of attribute names.\r\n */\r\n public getAttributesNames(): string[] {\r\n return this._attributesNames;\r\n }\r\n\r\n /**\r\n * Returns the attribute at the given index.\r\n * @param index The index of the attribute.\r\n * @returns The location of the attribute.\r\n */\r\n public getAttributeLocation(index: number): number {\r\n return this._attributes[index];\r\n }\r\n\r\n /**\r\n * Returns the attribute based on the name of the variable.\r\n * @param name of the attribute to look up.\r\n * @returns the attribute location.\r\n */\r\n public getAttributeLocationByName(name: string): number {\r\n return this._attributeLocationByName[name];\r\n }\r\n\r\n /**\r\n * The number of attributes.\r\n * @returns the number of attributes.\r\n */\r\n public getAttributesCount(): number {\r\n return this._attributes.length;\r\n }\r\n\r\n /**\r\n * Gets the index of a uniform variable.\r\n * @param uniformName of the uniform to look up.\r\n * @returns the index.\r\n */\r\n public getUniformIndex(uniformName: string): number {\r\n return this._uniformsNames.indexOf(uniformName);\r\n }\r\n\r\n /**\r\n * Returns the attribute based on the name of the variable.\r\n * @param uniformName of the uniform to look up.\r\n * @returns the location of the uniform.\r\n */\r\n public getUniform(uniformName: string): Nullable<WebGLUniformLocation> {\r\n return this._uniforms[uniformName];\r\n }\r\n\r\n /**\r\n * Returns an array of sampler variable names\r\n * @returns The array of sampler variable names.\r\n */\r\n public getSamplers(): string[] {\r\n return this._samplerList;\r\n }\r\n\r\n /**\r\n * Returns an array of uniform variable names\r\n * @returns The array of uniform variable names.\r\n */\r\n public getUniformNames(): string[] {\r\n return this._uniformsNames;\r\n }\r\n\r\n /**\r\n * Returns an array of uniform buffer variable names\r\n * @returns The array of uniform buffer variable names.\r\n */\r\n public getUniformBuffersNames(): string[] {\r\n return this._uniformBuffersNamesList;\r\n }\r\n\r\n /**\r\n * Returns the index parameters used to create the effect\r\n * @returns The index parameters object\r\n */\r\n public getIndexParameters(): any {\r\n return this._indexParameters;\r\n }\r\n\r\n /**\r\n * The error from the last compilation.\r\n * @returns the error string.\r\n */\r\n public getCompilationError(): string {\r\n return this._compilationError;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that all fallbacks were used during compilation\r\n * @returns true if all fallbacks were used\r\n */\r\n public allFallbacksProcessed(): boolean {\r\n return this._allFallbacksProcessed;\r\n }\r\n\r\n /**\r\n * Wait until compilation before fulfilling.\r\n * @returns a promise to wait for completion.\r\n */\r\n public async whenCompiledAsync(): Promise<Effect> {\r\n return await new Promise((resolve) => {\r\n this.executeWhenCompiled(resolve);\r\n });\r\n }\r\n\r\n /**\r\n * Adds a callback to the onCompiled observable and call the callback immediately if already ready.\r\n * @param func The callback to be used.\r\n */\r\n public executeWhenCompiled(func: (effect: Effect) => void): void {\r\n if (this.isReady()) {\r\n func(this);\r\n return;\r\n }\r\n\r\n this.onCompileObservable.add((effect) => {\r\n func(effect);\r\n });\r\n\r\n if (!this._pipelineContext || this._pipelineContext.isAsync) {\r\n this._checkIsReady(null);\r\n }\r\n }\r\n\r\n private _checkIsReady(previousPipelineContext: Nullable<IPipelineContext>) {\r\n _RetryWithInterval(\r\n () => {\r\n return this._isReadyInternal() || this._isDisposed;\r\n },\r\n () => {\r\n // no-op - done in the _isReadyInternal call\r\n },\r\n (e) => {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n },\r\n 16,\r\n 120000,\r\n true,\r\n ` - Effect: ${typeof this.name === \"string\" ? this.name : this.key}`\r\n );\r\n }\r\n\r\n /**\r\n * Gets the vertex shader source code of this effect\r\n * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)\r\n */\r\n public get vertexSourceCode(): string {\r\n return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride\r\n ? this._vertexSourceCodeOverride\r\n : (this._pipelineContext?._getVertexShaderCode() ?? this._vertexSourceCode);\r\n }\r\n\r\n /**\r\n * Gets the fragment shader source code of this effect\r\n * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)\r\n */\r\n public get fragmentSourceCode(): string {\r\n return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride\r\n ? this._fragmentSourceCodeOverride\r\n : (this._pipelineContext?._getFragmentShaderCode() ?? this._fragmentSourceCode);\r\n }\r\n\r\n /**\r\n * Gets the vertex shader source code before migration.\r\n * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.\r\n * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).\r\n */\r\n public get vertexSourceCodeBeforeMigration(): string {\r\n return this._vertexSourceCodeBeforeMigration;\r\n }\r\n\r\n /**\r\n * Gets the fragment shader source code before migration.\r\n * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.\r\n * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).\r\n */\r\n public get fragmentSourceCodeBeforeMigration(): string {\r\n return this._fragmentSourceCodeBeforeMigration;\r\n }\r\n\r\n /**\r\n * Gets the vertex shader source code before it has been modified by any processing\r\n */\r\n public get rawVertexSourceCode(): string {\r\n return this._rawVertexSourceCode;\r\n }\r\n\r\n /**\r\n * Gets the fragment shader source code before it has been modified by any processing\r\n */\r\n public get rawFragmentSourceCode(): string {\r\n return this._rawFragmentSourceCode;\r\n }\r\n\r\n public getPipelineGenerationOptions(): IPipelineGenerationOptions {\r\n return {\r\n platformName: this._engine.shaderPlatformName,\r\n shaderLanguage: this._shaderLanguage,\r\n shaderNameOrContent: this.name,\r\n key: this._key,\r\n defines: this.defines.split(\"\\n\"),\r\n addGlobalDefines: false,\r\n extendedProcessingOptions: {\r\n indexParameters: this._indexParameters,\r\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\r\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\r\n },\r\n extendedCreatePipelineOptions: {\r\n transformFeedbackVaryings: this._transformFeedbackVaryings,\r\n createAsRaw: !!(this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride),\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Recompiles the webGL program\r\n * @param vertexSourceCode The source code for the vertex shader.\r\n * @param fragmentSourceCode The source code for the fragment shader.\r\n * @param onCompiled Callback called when completed.\r\n * @param onError Callback called on error.\r\n * @internal\r\n */\r\n public _rebuildProgram(vertexSourceCode: string, fragmentSourceCode: string, onCompiled: (pipelineContext: IPipelineContext) => void, onError: (message: string) => void) {\r\n this._isReady = false;\r\n\r\n this._vertexSourceCodeOverride = vertexSourceCode;\r\n this._fragmentSourceCodeOverride = fragmentSourceCode;\r\n this.onError = (effect, error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n };\r\n this.onCompiled = () => {\r\n const scenes = this.getEngine().scenes;\r\n if (scenes) {\r\n for (let i = 0; i < scenes.length; i++) {\r\n scenes[i].markAllMaterialsAsDirty(Constants.MATERIAL_AllDirtyFlag);\r\n }\r\n }\r\n\r\n this._pipelineContext!._handlesSpectorRebuildCallback?.(onCompiled);\r\n };\r\n this._fallbacks = null;\r\n this._prepareEffect();\r\n }\r\n\r\n private _onRenderingStateCompiled(pipelineContext: IPipelineContext) {\r\n this._pipelineContext = pipelineContext;\r\n this._pipelineContext.setEngine(this._engine);\r\n this._attributes = [];\r\n this._pipelineContext._fillEffectInformation(\r\n this,\r\n this._uniformBuffersNames,\r\n this._uniformsNames,\r\n this._uniforms,\r\n this._samplerList,\r\n this._samplers,\r\n this._attributesNames,\r\n this._attributes\r\n );\r\n\r\n // Caches attribute locations.\r\n if (this._attributesNames) {\r\n for (let i = 0; i < this._attributesNames.length; i++) {\r\n const name = this._attributesNames[i];\r\n this._attributeLocationByName[name] = this._attributes[i];\r\n }\r\n }\r\n\r\n this._engine.bindSamplers(this);\r\n\r\n this._compilationError = \"\";\r\n this._isReady = true;\r\n if (this.onCompiled) {\r\n this.onCompiled(this);\r\n }\r\n this.onCompileObservable.notifyObservers(this);\r\n this.onCompileObservable.clear();\r\n\r\n // Unbind mesh reference in fallbacks\r\n if (this._fallbacks) {\r\n this._fallbacks.unBindMesh();\r\n }\r\n\r\n if (Effect.AutomaticallyClearCodeCache) {\r\n this.clearCodeCache();\r\n }\r\n }\r\n\r\n /**\r\n * Prepares the effect\r\n * @internal\r\n */\r\n public _prepareEffect(keepExistingPipelineContext = false) {\r\n const previousPipelineContext = this._pipelineContext;\r\n\r\n this._isReady = false;\r\n\r\n try {\r\n const overrides = !!(this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride);\r\n const defines = overrides ? null : this.defines;\r\n const vertex = overrides ? this._vertexSourceCodeOverride : this._vertexSourceCode;\r\n const fragment = overrides ? this._fragmentSourceCodeOverride : this._fragmentSourceCode;\r\n const engine = this._engine;\r\n this._pipelineContext = createAndPreparePipelineContext(\r\n {\r\n existingPipelineContext: keepExistingPipelineContext ? previousPipelineContext : null,\r\n vertex,\r\n fragment,\r\n context: engine.shaderPlatformName === \"WEBGL2\" || engine.shaderPlatformName === \"WEBGL1\" ? (engine as any)._gl : undefined,\r\n rebuildRebind: (\r\n vertexSourceCode: string,\r\n fragmentSourceCode: string,\r\n onCompiled: (pipelineContext: IPipelineContext) => void,\r\n onError: (message: string) => void\r\n ) => this._rebuildProgram(vertexSourceCode, fragmentSourceCode, onCompiled, onError),\r\n defines,\r\n transformFeedbackVaryings: this._transformFeedbackVaryings,\r\n name: this._key.replace(/\\r/g, \"\").replace(/\\n/g, \"|\"),\r\n createAsRaw: overrides,\r\n disableParallelCompilation: this._disableParallelShaderCompilation,\r\n shaderProcessingContext: this._processingContext,\r\n onRenderingStateCompiled: (pipelineContext) => {\r\n if (previousPipelineContext && !keepExistingPipelineContext) {\r\n this._engine._deletePipelineContext(previousPipelineContext);\r\n }\r\n if (pipelineContext) {\r\n this._onRenderingStateCompiled(pipelineContext);\r\n }\r\n },\r\n },\r\n this._engine.createPipelineContext.bind(this._engine),\r\n this._engine._preparePipelineContextAsync.bind(this._engine),\r\n this._engine._executeWhenRenderingStateIsCompiled.bind(this._engine)\r\n );\r\n\r\n if (this._pipelineContext.isAsync) {\r\n this._checkIsReady(previousPipelineContext);\r\n }\r\n } catch (e) {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n }\r\n }\r\n\r\n private _getShaderCodeAndErrorLine(code: Nullable<string>, error: Nullable<string>, isFragment: boolean): [Nullable<string>, Nullable<string>] {\r\n const regexp = isFragment ? /FRAGMENT SHADER ERROR: 0:(\\d+?):/ : /VERTEX SHADER ERROR: 0:(\\d+?):/;\r\n\r\n let errorLine = null;\r\n\r\n if (error && code) {\r\n const res = error.match(regexp);\r\n if (res && res.length === 2) {\r\n const lineNumber = parseInt(res[1]);\r\n const lines = code.split(\"\\n\", -1);\r\n if (lines.length >= lineNumber) {\r\n errorLine = `Offending line [${lineNumber}] in ${isFragment ? \"fragment\" : \"vertex\"} code: ${lines[lineNumber - 1]}`;\r\n }\r\n }\r\n }\r\n\r\n return [code, errorLine];\r\n }\r\n\r\n private _processCompilationErrors(e: any, previousPipelineContext: Nullable<IPipelineContext> = null) {\r\n this._compilationError = e.message;\r\n const attributesNames = this._attributesNames;\r\n const fallbacks = this._fallbacks;\r\n\r\n // Let's go through fallbacks then\r\n Logger.Error(\"Unable to compile effect:\");\r\n Logger.Error(`Uniforms: ${this._uniformsNames.join(\" \")}`);\r\n Logger.Error(`Attributes: ${attributesNames.join(\" \")}`);\r\n Logger.Error(\"Defines:\\n\" + this.defines);\r\n if (Effect.LogShaderCodeOnCompilationError) {\r\n let lineErrorVertex = null,\r\n lineErrorFragment = null,\r\n code = null;\r\n if (this._pipelineContext?._getVertexShaderCode()) {\r\n [code, lineErrorVertex] = this._getShaderCodeAndErrorLine(this._pipelineContext._getVertexShaderCode(), this._compilationError, false);\r\n if (code) {\r\n Logger.Error(\"Vertex code:\");\r\n Logger.Error(code);\r\n }\r\n }\r\n if (this._pipelineContext?._getFragmentShaderCode()) {\r\n [code, lineErrorFragment] = this._getShaderCodeAndErrorLine(this._pipelineContext?._getFragmentShaderCode(), this._compilationError, true);\r\n if (code) {\r\n Logger.Error(\"Fragment code:\");\r\n Logger.Error(code);\r\n }\r\n }\r\n if (lineErrorVertex) {\r\n Logger.Error(lineErrorVertex);\r\n }\r\n if (lineErrorFragment) {\r\n Logger.Error(lineErrorFragment);\r\n }\r\n }\r\n Logger.Error(\"Error: \" + this._compilationError);\r\n\r\n const notifyErrors = () => {\r\n if (this.onError) {\r\n this.onError(this, this._compilationError);\r\n }\r\n this.onErrorObservable.notifyObservers(this);\r\n this._engine.onEffectErrorObservable.notifyObservers({ effect: this, errors: this._compilationError });\r\n };\r\n\r\n // In case a previous compilation was successful, we need to restore the previous pipeline context\r\n if (previousPipelineContext) {\r\n this._pipelineContext = previousPipelineContext;\r\n this._isReady = true;\r\n notifyErrors();\r\n }\r\n\r\n // Lets try to compile fallbacks as long as we have some.\r\n if (fallbacks) {\r\n this._pipelineContext = null;\r\n if (fallbacks.hasMoreFallbacks) {\r\n this._allFallbacksProcessed = false;\r\n Logger.Error(\"Trying next fallback.\");\r\n this.defines = fallbacks.reduce(this.defines, this);\r\n this._prepareEffect();\r\n } else {\r\n // Sorry we did everything we can\r\n this._allFallbacksProcessed = true;\r\n notifyErrors();\r\n this.onErrorObservable.clear();\r\n\r\n // Unbind mesh reference in fallbacks\r\n if (this._fallbacks) {\r\n this._fallbacks.unBindMesh();\r\n }\r\n }\r\n } else {\r\n this._allFallbacksProcessed = true;\r\n\r\n // In case of error, without any prior successful compilation, let s notify observers\r\n if (!previousPipelineContext) {\r\n notifyErrors();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the effect is supported. (Must be called after compilation)\r\n */\r\n public get isSupported(): boolean {\r\n return this._compilationError === \"\";\r\n }\r\n\r\n /**\r\n * Binds a texture to the engine to be used as output of the shader.\r\n * @param channel Name of the output variable.\r\n * @param texture Texture to bind.\r\n * @internal\r\n */\r\n public _bindTexture(channel: string, texture: Nullable<InternalTexture>): void {\r\n this._engine._bindTexture(this._samplers[channel], texture, channel);\r\n }\r\n\r\n /**\r\n * Sets a texture on the engine to be used in the shader.\r\n * @param channel Name of the sampler variable.\r\n * @param texture Texture to set.\r\n */\r\n public setTexture(channel: string, texture: Nullable<ThinTexture>): void {\r\n this._engine.setTexture(this._samplers[channel], this._uniforms[channel], texture, channel);\r\n }\r\n\r\n /**\r\n * Sets an array of textures on the engine to be used in the shader.\r\n * @param channel Name of the variable.\r\n * @param textures Textures to set.\r\n */\r\n public setTextureArray(channel: string, textures: ThinTexture[]): void {\r\n const exName = channel + \"Ex\";\r\n if (this._samplerList.indexOf(exName + \"0\") === -1) {\r\n const initialPos = this._samplerList.indexOf(channel);\r\n for (let index = 1; index < textures.length; index++) {\r\n const currentExName = exName + (index - 1).toString();\r\n this._samplerList.splice(initialPos + index, 0, currentExName);\r\n }\r\n\r\n // Reset every channels\r\n let channelIndex = 0;\r\n for (const key of this._samplerList) {\r\n this._samplers[key] = channelIndex;\r\n channelIndex += 1;\r\n }\r\n }\r\n\r\n this._engine.setTextureArray(this._samplers[channel], this._uniforms[channel], textures, channel);\r\n }\r\n\r\n /**\r\n * Binds a buffer to a uniform.\r\n * @param buffer Buffer to bind.\r\n * @param name Name of the uniform variable to bind to.\r\n */\r\n public bindUniformBuffer(buffer: DataBuffer, name: string): void {\r\n const bufferName = this._uniformBuffersNames[name];\r\n if (bufferName === undefined || (Effect._BaseCache[bufferName] === buffer && this._engine._features.useUBOBindingCache)) {\r\n return;\r\n }\r\n Effect._BaseCache[bufferName] = buffer;\r\n this._engine.bindUniformBufferBase(buffer, bufferName, name);\r\n }\r\n\r\n /**\r\n * Binds block to a uniform.\r\n * @param blockName Name of the block to bind.\r\n * @param index Index to bind.\r\n */\r\n public bindUniformBlock(blockName: string, index: number): void {\r\n this._engine.bindUniformBlock(this._pipelineContext!, blockName, index);\r\n }\r\n\r\n /**\r\n * Sets an integer value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value Value to be set.\r\n * @returns this effect.\r\n */\r\n public setInt(uniformName: string, value: number): Effect {\r\n this._pipelineContext!.setInt(uniformName, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int2 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int2.\r\n * @param y Second int in int2.\r\n * @returns this effect.\r\n */\r\n public setInt2(uniformName: string, x: number, y: number): Effect {\r\n this._pipelineContext!.setInt2(uniformName, x, y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int3 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int3.\r\n * @param y Second int in int3.\r\n * @param z Third int in int3.\r\n * @returns this effect.\r\n */\r\n public setInt3(uniformName: string, x: number, y: number, z: number): Effect {\r\n this._pipelineContext!.setInt3(uniformName, x, y, z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int4 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int4.\r\n * @param y Second int in int4.\r\n * @param z Third int in int4.\r\n * @param w Fourth int in int4.\r\n * @returns this effect.\r\n */\r\n public setInt4(uniformName: string, x: number, y: number, z: number, w: number): Effect {\r\n this._pipelineContext!.setInt4(uniformName, x, y, z, w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray2(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray3(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray4(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned integer value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value Value to be set.\r\n * @returns this effect.\r\n */\r\n public setUInt(uniformName: string, value: number): Effect {\r\n this._pipelineContext!.setUInt(uniformName, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int2 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint2.\r\n * @param y Second unsigned int in uint2.\r\n * @returns this effect.\r\n */\r\n public setUInt2(uniformName: string, x: number, y: number): Effect {\r\n this._pipelineContext!.setUInt2(uniformName, x, y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int3 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint3.\r\n * @param y Second unsigned int in uint3.\r\n * @param z Third unsigned int in uint3.\r\n * @returns this effect.\r\n */\r\n public setUInt3(uniformName: string, x: number, y: number, z: number): Effect {\r\n this._pipelineContext!.setUInt3(uniformName, x, y, z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int4 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint4.\r\n * @param y Second unsigned int in uint4.\r\n * @param z Third unsigned int in uint4.\r\n * @param w Fourth unsigned int in uint4.\r\n * @returns this effect.\r\n */\r\n public setUInt4(uniformName: string, x: number, y: number, z: number, w: number): Effect {\r\n this._pipelineContext!.setUInt4(uniformName, x, y, z, w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray2(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray3(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray4(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray2(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray3(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray4(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray2(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray3(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray4(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets matrices on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param matrices matrices to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrices(uniformName: string, matrices: Float32Array | Array<number>): Effect {\r\n this._pipelineContext!.setMatrices(uniformName, matrices as Float32Array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets matrix on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrix(uniformName: string, matrix: IMatrixLike): Effect {\r\n this._pipelineContext!.setMatrix(uniformName, matrix);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix)\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrix3x3(uniformName: string, matrix: Float32Array | Array<number>): Effect {\r\n // the cast is ok because it is gl.uniformMatrix3fv() which is called at the end, and this function accepts Float32Array and Array<number>\r\n this._pipelineContext!.setMatrix3x3(uniformName, matrix as Float32Array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix)\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrix2x2(uniformName: string, matrix: Float32Array | Array<number>): Effect {\r\n // the cast is ok because it is gl.uniformMatrix3fv() which is called at the end, and this function accepts Float32Array and Array<number>\r\n this._pipelineContext!.setMatrix2x2(uniformName, matrix as Float32Array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value value to be set.\r\n * @returns this effect.\r\n */\r\n public setFloat(uniformName: string, value: number): Effect {\r\n this._pipelineContext!.setFloat(uniformName, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a boolean on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param bool value to be set.\r\n * @returns this effect.\r\n */\r\n public setBool(uniformName: string, bool: boolean): Effect {\r\n this._pipelineContext!.setInt(uniformName, bool ? 1 : 0);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Vector2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector2 vector2 to be set.\r\n * @returns this effect.\r\n */\r\n public setVector2(uniformName: string, vector2: IVector2Like): Effect {\r\n this._pipelineContext!.setVector2(uniformName, vector2);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float2.\r\n * @param y Second float in float2.\r\n * @returns this effect.\r\n */\r\n public setFloat2(uniformName: string, x: number, y: number): Effect {\r\n this._pipelineContext!.setFloat2(uniformName, x, y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Vector3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector3 Value to be set.\r\n * @returns this effect.\r\n */\r\n public setVector3(uniformName: string, vector3: IVector3Like): Effect {\r\n this._pipelineContext!.setVector3(uniformName, vector3);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float3.\r\n * @param y Second float in float3.\r\n * @param z Third float in float3.\r\n * @returns this effect.\r\n */\r\n public setFloat3(uniformName: string, x: number, y: number, z: number): Effect {\r\n this._pipelineContext!.setFloat3(uniformName, x, y, z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Vector4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector4 Value to be set.\r\n * @returns this effect.\r\n */\r\n public setVector4(uniformName: string, vector4: IVector4Like): Effect {\r\n this._pipelineContext!.setVector4(uniformName, vector4);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Quaternion on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param quaternion Value to be set.\r\n * @returns this effect.\r\n */\r\n public setQuaternion(uniformName: string, quaternion: IQuaternionLike): Effect {\r\n this._pipelineContext!.setQuaternion(uniformName, quaternion);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float4.\r\n * @param y Second float in float4.\r\n * @param z Third float in float4.\r\n * @param w Fourth float in float4.\r\n * @returns this effect.\r\n */\r\n public setFloat4(uniformName: string, x: number, y: number, z: number, w: number): Effect {\r\n this._pipelineContext!.setFloat4(uniformName, x, y, z, w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Color3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param color3 Value to be set.\r\n * @returns this effect.\r\n */\r\n public setColor3(uniformName: string, color3: IColor3Like): Effect {\r\n this._pipelineContext!.setColor3(uniformName, color3);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Color4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param color3 Value to be set.\r\n * @param alpha Alpha value to be set.\r\n * @returns this effect.\r\n */\r\n public setColor4(uniformName: string, color3: IColor3Like, alpha: number): Effect {\r\n this._pipelineContext!.setColor4(uniformName, color3, alpha);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Color4 on a uniform variable\r\n * @param uniformName defines the name of the variable\r\n * @param color4 defines the value to be set\r\n * @returns this effect.\r\n */\r\n public setDirectColor4(uniformName: string, color4: IColor4Like): Effect {\r\n this._pipelineContext!.setDirectColor4(uniformName, color4);\r\n return this;\r\n }\r\n\r\n /**\r\n * Use this wisely: It will remove the cached code from this effect\r\n * It is probably ok to call it if you are not using ShadowDepthWrapper or if everything is already up and running\r\n * DO NOT CALL IT if you want to have support for context lost recovery\r\n */\r\n public clearCodeCache() {\r\n this._vertexSourceCode = \"\";\r\n this._fragmentSourceCode = \"\";\r\n this._fragmentSourceCodeBeforeMigration = \"\";\r\n this._vertexSourceCodeBeforeMigration = \"\";\r\n }\r\n\r\n /**\r\n * Release all associated resources.\r\n * @param force specifies if the effect must be released no matter what\r\n **/\r\n public dispose(force = false) {\r\n if (force) {\r\n this._refCount = 0;\r\n } else {\r\n if (Effect.PersistentMode) {\r\n return;\r\n }\r\n this._refCount--;\r\n }\r\n\r\n if (this._refCount > 0 || this._isDisposed) {\r\n // Others are still using the effect or the effect was already disposed\r\n return;\r\n }\r\n\r\n if (this._pipelineContext) {\r\n resetCachedPipeline(this._pipelineContext);\r\n }\r\n this._engine._releaseEffect(this);\r\n\r\n this.clearCodeCache();\r\n\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * This function will add a new shader to the shader store\r\n * @param name the name of the shader\r\n * @param pixelShader optional pixel shader content\r\n * @param vertexShader optional vertex shader content\r\n * @param shaderLanguage the language the shader is written in (default: GLSL)\r\n */\r\n public static RegisterShader(name: string, pixelShader?: string, vertexShader?: string, shaderLanguage = ShaderLanguage.GLSL) {\r\n if (pixelShader) {\r\n EngineShaderStore.GetShadersStore(shaderLanguage)[`${name}PixelShader`] = pixelShader;\r\n }\r\n\r\n if (vertexShader) {\r\n EngineShaderStore.GetShadersStore(shaderLanguage)[`${name}VertexShader`] = vertexShader;\r\n }\r\n }\r\n\r\n /**\r\n * Store of each shader (The can be looked up using effect.key)\r\n */\r\n public static ShadersStore: { [key: string]: string } = EngineShaderStore.ShadersStore;\r\n /**\r\n * Store of each included file for a shader (The can be looked up using effect.key)\r\n */\r\n public static IncludesShadersStore: { [key: string]: string } = EngineShaderStore.IncludesShadersStore;\r\n\r\n /**\r\n * Resets the cache of effects.\r\n */\r\n public static ResetCache() {\r\n Effect._BaseCache = {};\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"effect.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/effect.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { FloatArray, Nullable } from \"../types\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { IDisposable } from \"../scene\";\r\nimport type { IPipelineContext } from \"../Engines/IPipelineContext\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport type { IShaderProcessor } from \"../Engines/Processors/iShaderProcessor\";\r\nimport type { _IProcessingOptions, ShaderCustomProcessingFunction, _IShaderProcessingContext } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { IMatrixLike, IVector2Like, IVector3Like, IVector4Like, IColor3Like, IColor4Like, IQuaternionLike } from \"../Maths/math.like\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { IEffectFallbacks } from \"./iEffectFallbacks\";\r\nimport { ShaderStore as EngineShaderStore } from \"../Engines/shaderStore\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { IPipelineGenerationOptions } from \"./effect.functions\";\r\nimport { _ProcessShaderCode, getCachedPipeline, createAndPreparePipelineContext, resetCachedPipeline } from \"./effect.functions\";\r\nimport { _RetryWithInterval } from \"core/Misc/timingTools\";\r\n\r\n/**\r\n * Defines the route to the shader code. The priority is as follows:\r\n * * object: `{ vertexSource: \"vertex shader code string\", fragmentSource: \"fragment shader code string\" }` for directly passing the shader code\r\n * * object: `{ vertexElement: \"vertexShaderCode\", fragmentElement: \"fragmentShaderCode\" }`, used with shader code in script tags\r\n * * object: `{ vertex: \"custom\", fragment: \"custom\" }`, used with `Effect.ShadersStore[\"customVertexShader\"]` and `Effect.ShadersStore[\"customFragmentShader\"]`\r\n * * string: `\"./COMMON_NAME\"`, used with external files COMMON_NAME.vertex.fx and COMMON_NAME.fragment.fx in index.html folder.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport type IShaderPath = {\r\n // Should not have `I` prefix as it is a type and not an interface\r\n /**\r\n * Directly pass the shader code\r\n */\r\n vertexSource?: string;\r\n /**\r\n * Directly pass the shader code\r\n */\r\n fragmentSource?: string;\r\n /**\r\n * Used with Effect.ShadersStore. If the `vertex` is set to `\"custom`, then\r\n * Babylon.js will read from Effect.ShadersStore[\"customVertexShader\"]\r\n */\r\n vertex?: string;\r\n /**\r\n * Used with Effect.ShadersStore. If the `fragment` is set to `\"custom`, then\r\n * Babylon.js will read from Effect.ShadersStore[\"customFragmentShader\"]\r\n */\r\n fragment?: string;\r\n /**\r\n * Used with shader code in script tags\r\n */\r\n vertexElement?: string;\r\n /**\r\n * Used with shader code in script tags\r\n */\r\n fragmentElement?: string;\r\n /**\r\n * Defines the name appearing in spector when framgent/vertex...source are being used\r\n */\r\n spectorName?: string;\r\n};\r\n\r\n/**\r\n * Options to be used when creating an effect.\r\n */\r\nexport interface IEffectCreationOptions {\r\n /**\r\n * Attributes that will be used in the shader.\r\n */\r\n attributes: string[];\r\n /**\r\n * Uniform variable names that will be set in the shader.\r\n */\r\n uniformsNames: string[];\r\n /**\r\n * Uniform buffer variable names that will be set in the shader.\r\n */\r\n uniformBuffersNames?: string[];\r\n /**\r\n * Sampler texture variable names that will be set in the shader.\r\n */\r\n samplers: string[];\r\n /**\r\n * Define statements that will be set in the shader.\r\n */\r\n defines: any;\r\n /**\r\n * Possible fallbacks for this effect to improve performance when needed.\r\n */\r\n fallbacks: Nullable<IEffectFallbacks>;\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n onCompiled: Nullable<(effect: Effect) => void>;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n onError: Nullable<(effect: Effect, errors: string) => void>;\r\n /**\r\n * Parameters to be used with Babylons include syntax to iterate over an array (eg. \\{lights: 10\\})\r\n */\r\n indexParameters?: any;\r\n /**\r\n * Max number of lights that can be used in the shader.\r\n */\r\n maxSimultaneousLights?: number;\r\n /**\r\n * See https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/transformFeedbackVaryings\r\n */\r\n transformFeedbackVaryings?: Nullable<string[]>;\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 * If provided, will be called two times with the vertex and fragment code so that this code can be updated after the #include have been processed\r\n */\r\n processCodeAfterIncludes?: Nullable<ShaderCustomProcessingFunction>;\r\n /**\r\n * Is this effect rendering to several color attachments ?\r\n */\r\n multiTarget?: boolean;\r\n /**\r\n * The language the shader is written in (default: GLSL)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n\r\n /**\r\n * Provide an existing pipeline context to avoid creating a new one\r\n */\r\n existingPipelineContext?: IPipelineContext;\r\n /**\r\n * Additional async code to run before preparing the effect\r\n */\r\n extraInitializationsAsync?: () => Promise<void>;\r\n\r\n /**\r\n * If set to true the shader will not be compiles asynchronously, even if the engine allows it.\r\n */\r\n disableParallelShaderCompilation?: boolean;\r\n}\r\n\r\n/**\r\n * Effect containing vertex and fragment shader that can be executed on an object.\r\n */\r\nexport class Effect implements IDisposable {\r\n /**\r\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\r\n */\r\n public static get ShadersRepository(): string {\r\n return EngineShaderStore.ShadersRepository;\r\n }\r\n public static set ShadersRepository(repo: string) {\r\n EngineShaderStore.ShadersRepository = repo;\r\n }\r\n /**\r\n * Enable logging of the shader code when a compilation error occurs\r\n */\r\n public static LogShaderCodeOnCompilationError = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that effect ref counting is disabled\r\n * If true, the effect will persist in memory until engine is disposed\r\n */\r\n public static PersistentMode: boolean = false;\r\n\r\n /**\r\n * Use this with caution\r\n * See ClearCodeCache function comments\r\n */\r\n public static AutomaticallyClearCodeCache = false;\r\n\r\n /**\r\n * Name of the effect.\r\n */\r\n public name: IShaderPath | string;\r\n /**\r\n * String container all the define statements that should be set on the shader.\r\n */\r\n public defines: string = \"\";\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n public onCompiled: Nullable<(effect: Effect) => void> = null;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n public onError: Nullable<(effect: Effect, errors: string) => void> = null;\r\n /**\r\n * Callback that will be called when effect is bound.\r\n */\r\n public onBind: Nullable<(effect: Effect) => void> = null;\r\n /**\r\n * Unique ID of the effect.\r\n */\r\n public uniqueId = 0;\r\n /**\r\n * Observable that will be called when the shader is compiled.\r\n * It is recommended to use executeWhenCompile() or to make sure that scene.isReady() is called to get this observable raised.\r\n */\r\n public onCompileObservable = new Observable<Effect>();\r\n /**\r\n * Observable that will be called if an error occurs during shader compilation.\r\n */\r\n public onErrorObservable = new Observable<Effect>();\r\n\r\n /** @internal */\r\n public _onBindObservable: Nullable<Observable<Effect>> = null;\r\n\r\n private _isDisposed = false;\r\n\r\n /**\r\n * Gets a boolean indicating that the effect was already disposed\r\n */\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /** @internal */\r\n public _refCount = 1;\r\n\r\n /**\r\n * Observable that will be called when effect is bound.\r\n */\r\n public get onBindObservable(): Observable<Effect> {\r\n if (!this._onBindObservable) {\r\n this._onBindObservable = new Observable<Effect>();\r\n }\r\n\r\n return this._onBindObservable;\r\n }\r\n\r\n /** @internal */\r\n public _bonesComputationForcedToCPU = false;\r\n /** @internal */\r\n public _uniformBuffersNames: { [key: string]: number } = {};\r\n /** @internal */\r\n public _samplerList: string[];\r\n /** @internal */\r\n public _multiTarget: boolean = false;\r\n\r\n private static _UniqueIdSeed = 0;\r\n /** @internal */\r\n public _engine: AbstractEngine;\r\n private _uniformBuffersNamesList: string[];\r\n private _uniformsNames: string[];\r\n /** @internal */\r\n public _samplers: { [key: string]: number } = {};\r\n private _isReady = false;\r\n private _compilationError = \"\";\r\n private _allFallbacksProcessed = false;\r\n private _attributesNames: string[];\r\n private _attributes: number[];\r\n private _attributeLocationByName: { [name: string]: number };\r\n /** @internal */\r\n public _uniforms: { [key: string]: Nullable<WebGLUniformLocation> } = {};\r\n /**\r\n * Key for the effect.\r\n * @internal\r\n */\r\n public _key: string = \"\";\r\n private _indexParameters: any;\r\n private _fallbacks: Nullable<IEffectFallbacks> = null;\r\n private _vertexSourceCodeOverride: string = \"\";\r\n private _fragmentSourceCodeOverride: string = \"\";\r\n private _transformFeedbackVaryings: Nullable<string[]> = null;\r\n private _shaderLanguage: ShaderLanguage;\r\n private _disableParallelShaderCompilation: boolean = false;\r\n /**\r\n * Compiled shader to webGL program.\r\n * @internal\r\n */\r\n public _pipelineContext: Nullable<IPipelineContext> = null;\r\n /** @internal */\r\n public _vertexSourceCode: string = \"\";\r\n /** @internal */\r\n public _fragmentSourceCode: string = \"\";\r\n\r\n /** @internal */\r\n public _vertexSourceCodeBeforeMigration: string = \"\";\r\n /** @internal */\r\n public _fragmentSourceCodeBeforeMigration: string = \"\";\r\n\r\n /** @internal */\r\n public _rawVertexSourceCode: string = \"\";\r\n /** @internal */\r\n public _rawFragmentSourceCode: string = \"\";\r\n\r\n private static _BaseCache: { [key: number]: DataBuffer } = {};\r\n private _processingContext: Nullable<_IShaderProcessingContext>;\r\n\r\n private _processCodeAfterIncludes: ShaderCustomProcessingFunction | undefined = undefined;\r\n private _processFinalCode: Nullable<ShaderCustomProcessingFunction> = null;\r\n\r\n private _onReleaseEffectsObserver: Nullable<Observer<AbstractEngine>> = null;\r\n\r\n /**\r\n * Gets the shader language type used to write vertex and fragment source code.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates an effect.\r\n * An effect can be used to create/manage/execute vertex and fragment shaders.\r\n * @param baseName Name of the effect.\r\n * @param attributesNamesOrOptions List of attribute names that will be passed to the shader or set of all options to create the effect.\r\n * @param uniformsNamesOrEngine List of uniform variable names that will be passed to the shader or the engine that will be used to render effect.\r\n * @param samplers List of sampler variables that will be passed to the shader.\r\n * @param engine Engine to be used to render the effect\r\n * @param defines Define statements to be added to the shader.\r\n * @param fallbacks Possible fallbacks for this effect to improve performance when needed.\r\n * @param onCompiled Callback that will be called when the shader is compiled.\r\n * @param onError Callback that will be called if an error occurs during shader compilation.\r\n * @param indexParameters Parameters to be used with Babylons include syntax to iterate over an array (eg. \\{lights: 10\\})\r\n * @param key Effect Key identifying uniquely compiled shader variants\r\n * @param shaderLanguage the language the shader is written in (default: GLSL)\r\n * @param extraInitializationsAsync additional async code to run before preparing the effect\r\n */\r\n constructor(\r\n baseName: IShaderPath | string,\r\n attributesNamesOrOptions: string[] | IEffectCreationOptions,\r\n uniformsNamesOrEngine: string[] | AbstractEngine,\r\n samplers: Nullable<string[]> = null,\r\n engine?: AbstractEngine,\r\n defines: Nullable<string> = null,\r\n fallbacks: Nullable<IEffectFallbacks> = null,\r\n onCompiled: Nullable<(effect: Effect) => void> = null,\r\n onError: Nullable<(effect: Effect, errors: string) => void> = null,\r\n indexParameters?: any,\r\n key: string = \"\",\r\n shaderLanguage = ShaderLanguage.GLSL,\r\n extraInitializationsAsync?: () => Promise<void>\r\n ) {\r\n this.name = baseName;\r\n this._key = key;\r\n const pipelineName = this._key.replace(/\\r/g, \"\").replace(/\\n/g, \"|\");\r\n let cachedPipeline: IPipelineContext | undefined = undefined;\r\n\r\n if ((<IEffectCreationOptions>attributesNamesOrOptions).attributes) {\r\n const options = <IEffectCreationOptions>attributesNamesOrOptions;\r\n this._engine = <AbstractEngine>uniformsNamesOrEngine;\r\n\r\n this._attributesNames = options.attributes;\r\n this._uniformsNames = options.uniformsNames.concat(options.samplers);\r\n this._samplerList = options.samplers.slice();\r\n this.defines = options.defines;\r\n this.onError = options.onError;\r\n this.onCompiled = options.onCompiled;\r\n this._fallbacks = options.fallbacks;\r\n this._indexParameters = options.indexParameters;\r\n this._transformFeedbackVaryings = options.transformFeedbackVaryings || null;\r\n this._multiTarget = !!options.multiTarget;\r\n this._shaderLanguage = options.shaderLanguage ?? ShaderLanguage.GLSL;\r\n this._disableParallelShaderCompilation = !!options.disableParallelShaderCompilation;\r\n\r\n if (options.uniformBuffersNames) {\r\n this._uniformBuffersNamesList = options.uniformBuffersNames.slice();\r\n for (let i = 0; i < options.uniformBuffersNames.length; i++) {\r\n this._uniformBuffersNames[options.uniformBuffersNames[i]] = i;\r\n }\r\n }\r\n\r\n this._processFinalCode = options.processFinalCode ?? null;\r\n this._processCodeAfterIncludes = options.processCodeAfterIncludes ?? undefined;\r\n extraInitializationsAsync = options.extraInitializationsAsync;\r\n\r\n cachedPipeline = options.existingPipelineContext;\r\n } else {\r\n this._engine = <AbstractEngine>engine;\r\n this.defines = defines == null ? \"\" : defines;\r\n this._uniformsNames = (<string[]>uniformsNamesOrEngine).concat(<string[]>samplers);\r\n this._samplerList = samplers ? samplers.slice() : [];\r\n this._attributesNames = <string[]>attributesNamesOrOptions;\r\n this._uniformBuffersNamesList = [];\r\n this._shaderLanguage = shaderLanguage;\r\n\r\n this.onError = onError;\r\n this.onCompiled = onCompiled;\r\n\r\n this._indexParameters = indexParameters;\r\n this._fallbacks = fallbacks;\r\n }\r\n\r\n // Use the cache if we can. For now, WebGL2 only.\r\n if (this._engine.shaderPlatformName === \"WEBGL2\") {\r\n cachedPipeline = getCachedPipeline(pipelineName, (this._engine as any)._gl) ?? cachedPipeline;\r\n }\r\n\r\n this._attributeLocationByName = {};\r\n\r\n this.uniqueId = Effect._UniqueIdSeed++;\r\n if (!cachedPipeline) {\r\n // Floating promise - should be checked here.\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._processShaderCodeAsync(null, false, null, extraInitializationsAsync);\r\n } else {\r\n this._pipelineContext = cachedPipeline;\r\n this._pipelineContext.setEngine(this._engine);\r\n this._onRenderingStateCompiled(this._pipelineContext);\r\n // rebuildRebind for spector\r\n if ((this._pipelineContext as any).program) {\r\n (this._pipelineContext as any).program.__SPECTOR_rebuildProgram = this._rebuildProgram.bind(this);\r\n }\r\n }\r\n\r\n this._onReleaseEffectsObserver = this._engine.onReleaseEffectsObservable.addOnce(() => {\r\n this._onReleaseEffectsObserver = null;\r\n if (this.isDisposed) {\r\n return;\r\n }\r\n\r\n this.dispose(true);\r\n });\r\n }\r\n\r\n /** @internal */\r\n public async _processShaderCodeAsync(\r\n shaderProcessor: Nullable<IShaderProcessor> = null,\r\n keepExistingPipelineContext = false,\r\n shaderProcessingContext: Nullable<_IShaderProcessingContext> = null,\r\n extraInitializationsAsync?: () => Promise<void>\r\n ) {\r\n if (extraInitializationsAsync) {\r\n await extraInitializationsAsync();\r\n }\r\n\r\n this._processingContext = shaderProcessingContext || this._engine._getShaderProcessingContext(this._shaderLanguage, false);\r\n\r\n const processorOptions: _IProcessingOptions = {\r\n defines: this.defines.split(\"\\n\"),\r\n indexParameters: this._indexParameters,\r\n isFragment: false,\r\n shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader,\r\n processor: shaderProcessor ?? this._engine._getShaderProcessor(this._shaderLanguage),\r\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\r\n shadersRepository: EngineShaderStore.GetShadersRepository(this._shaderLanguage),\r\n includesShadersStore: EngineShaderStore.GetIncludesShadersStore(this._shaderLanguage),\r\n version: (this._engine.version * 100).toString(),\r\n platformName: this._engine.shaderPlatformName,\r\n processingContext: this._processingContext,\r\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\r\n processCodeAfterIncludes: this._processCodeAfterIncludes,\r\n };\r\n\r\n _ProcessShaderCode(\r\n processorOptions,\r\n this.name,\r\n this._processFinalCode,\r\n (migratedVertexCode, migratedFragmentCode) => {\r\n this._vertexSourceCode = migratedVertexCode;\r\n this._fragmentSourceCode = migratedFragmentCode;\r\n this._prepareEffect(keepExistingPipelineContext);\r\n },\r\n this._shaderLanguage,\r\n this._engine,\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * Unique key for this effect\r\n */\r\n public get key(): string {\r\n return this._key;\r\n }\r\n\r\n /**\r\n * If the effect has been compiled and prepared.\r\n * @returns if the effect is compiled and prepared.\r\n */\r\n public isReady(): boolean {\r\n try {\r\n return this._isReadyInternal();\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private _isReadyInternal(): boolean {\r\n if (this._engine.isDisposed) {\r\n // Engine is disposed, we return true to prevent looping over the setTimeout call in _checkIsReady\r\n return true;\r\n }\r\n if (this._isReady) {\r\n return true;\r\n }\r\n if (this._pipelineContext) {\r\n return this._pipelineContext.isReady;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * The engine the effect was initialized with.\r\n * @returns the engine.\r\n */\r\n public getEngine(): AbstractEngine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * The pipeline context for this effect\r\n * @returns the associated pipeline context\r\n */\r\n public getPipelineContext(): Nullable<IPipelineContext> {\r\n return this._pipelineContext;\r\n }\r\n\r\n /**\r\n * The set of names of attribute variables for the shader.\r\n * @returns An array of attribute names.\r\n */\r\n public getAttributesNames(): string[] {\r\n return this._attributesNames;\r\n }\r\n\r\n /**\r\n * Returns the attribute at the given index.\r\n * @param index The index of the attribute.\r\n * @returns The location of the attribute.\r\n */\r\n public getAttributeLocation(index: number): number {\r\n return this._attributes[index];\r\n }\r\n\r\n /**\r\n * Returns the attribute based on the name of the variable.\r\n * @param name of the attribute to look up.\r\n * @returns the attribute location.\r\n */\r\n public getAttributeLocationByName(name: string): number {\r\n return this._attributeLocationByName[name];\r\n }\r\n\r\n /**\r\n * The number of attributes.\r\n * @returns the number of attributes.\r\n */\r\n public getAttributesCount(): number {\r\n return this._attributes.length;\r\n }\r\n\r\n /**\r\n * Gets the index of a uniform variable.\r\n * @param uniformName of the uniform to look up.\r\n * @returns the index.\r\n */\r\n public getUniformIndex(uniformName: string): number {\r\n return this._uniformsNames.indexOf(uniformName);\r\n }\r\n\r\n /**\r\n * Returns the attribute based on the name of the variable.\r\n * @param uniformName of the uniform to look up.\r\n * @returns the location of the uniform.\r\n */\r\n public getUniform(uniformName: string): Nullable<WebGLUniformLocation> {\r\n return this._uniforms[uniformName];\r\n }\r\n\r\n /**\r\n * Returns an array of sampler variable names\r\n * @returns The array of sampler variable names.\r\n */\r\n public getSamplers(): string[] {\r\n return this._samplerList;\r\n }\r\n\r\n /**\r\n * Returns an array of uniform variable names\r\n * @returns The array of uniform variable names.\r\n */\r\n public getUniformNames(): string[] {\r\n return this._uniformsNames;\r\n }\r\n\r\n /**\r\n * Returns an array of uniform buffer variable names\r\n * @returns The array of uniform buffer variable names.\r\n */\r\n public getUniformBuffersNames(): string[] {\r\n return this._uniformBuffersNamesList;\r\n }\r\n\r\n /**\r\n * Returns the index parameters used to create the effect\r\n * @returns The index parameters object\r\n */\r\n public getIndexParameters(): any {\r\n return this._indexParameters;\r\n }\r\n\r\n /**\r\n * The error from the last compilation.\r\n * @returns the error string.\r\n */\r\n public getCompilationError(): string {\r\n return this._compilationError;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that all fallbacks were used during compilation\r\n * @returns true if all fallbacks were used\r\n */\r\n public allFallbacksProcessed(): boolean {\r\n return this._allFallbacksProcessed;\r\n }\r\n\r\n /**\r\n * Wait until compilation before fulfilling.\r\n * @returns a promise to wait for completion.\r\n */\r\n public async whenCompiledAsync(): Promise<Effect> {\r\n return await new Promise((resolve) => {\r\n this.executeWhenCompiled(resolve);\r\n });\r\n }\r\n\r\n /**\r\n * Adds a callback to the onCompiled observable and call the callback immediately if already ready.\r\n * @param func The callback to be used.\r\n */\r\n public executeWhenCompiled(func: (effect: Effect) => void): void {\r\n if (this.isReady()) {\r\n func(this);\r\n return;\r\n }\r\n\r\n this.onCompileObservable.add((effect) => {\r\n func(effect);\r\n });\r\n\r\n if (!this._pipelineContext || this._pipelineContext.isAsync) {\r\n this._checkIsReady(null);\r\n }\r\n }\r\n\r\n private _checkIsReady(previousPipelineContext: Nullable<IPipelineContext>) {\r\n _RetryWithInterval(\r\n () => {\r\n return this._isReadyInternal() || this._isDisposed;\r\n },\r\n () => {\r\n // no-op - done in the _isReadyInternal call\r\n },\r\n (e) => {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n },\r\n 16,\r\n 120000,\r\n true,\r\n ` - Effect: ${typeof this.name === \"string\" ? this.name : this.key}`\r\n );\r\n }\r\n\r\n /**\r\n * Gets the vertex shader source code of this effect\r\n * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)\r\n */\r\n public get vertexSourceCode(): string {\r\n return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride\r\n ? this._vertexSourceCodeOverride\r\n : (this._pipelineContext?._getVertexShaderCode() ?? this._vertexSourceCode);\r\n }\r\n\r\n /**\r\n * Gets the fragment shader source code of this effect\r\n * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)\r\n */\r\n public get fragmentSourceCode(): string {\r\n return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride\r\n ? this._fragmentSourceCodeOverride\r\n : (this._pipelineContext?._getFragmentShaderCode() ?? this._fragmentSourceCode);\r\n }\r\n\r\n /**\r\n * Gets the vertex shader source code before migration.\r\n * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.\r\n * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).\r\n */\r\n public get vertexSourceCodeBeforeMigration(): string {\r\n return this._vertexSourceCodeBeforeMigration;\r\n }\r\n\r\n /**\r\n * Gets the fragment shader source code before migration.\r\n * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.\r\n * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).\r\n */\r\n public get fragmentSourceCodeBeforeMigration(): string {\r\n return this._fragmentSourceCodeBeforeMigration;\r\n }\r\n\r\n /**\r\n * Gets the vertex shader source code before it has been modified by any processing\r\n */\r\n public get rawVertexSourceCode(): string {\r\n return this._rawVertexSourceCode;\r\n }\r\n\r\n /**\r\n * Gets the fragment shader source code before it has been modified by any processing\r\n */\r\n public get rawFragmentSourceCode(): string {\r\n return this._rawFragmentSourceCode;\r\n }\r\n\r\n public getPipelineGenerationOptions(): IPipelineGenerationOptions {\r\n return {\r\n platformName: this._engine.shaderPlatformName,\r\n shaderLanguage: this._shaderLanguage,\r\n shaderNameOrContent: this.name,\r\n key: this._key,\r\n defines: this.defines.split(\"\\n\"),\r\n addGlobalDefines: false,\r\n extendedProcessingOptions: {\r\n indexParameters: this._indexParameters,\r\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\r\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\r\n },\r\n extendedCreatePipelineOptions: {\r\n transformFeedbackVaryings: this._transformFeedbackVaryings,\r\n createAsRaw: !!(this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride),\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Recompiles the webGL program\r\n * @param vertexSourceCode The source code for the vertex shader.\r\n * @param fragmentSourceCode The source code for the fragment shader.\r\n * @param onCompiled Callback called when completed.\r\n * @param onError Callback called on error.\r\n * @internal\r\n */\r\n public _rebuildProgram(vertexSourceCode: string, fragmentSourceCode: string, onCompiled: (pipelineContext: IPipelineContext) => void, onError: (message: string) => void) {\r\n this._isReady = false;\r\n\r\n this._vertexSourceCodeOverride = vertexSourceCode;\r\n this._fragmentSourceCodeOverride = fragmentSourceCode;\r\n this.onError = (effect, error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n };\r\n this.onCompiled = () => {\r\n const scenes = this.getEngine().scenes;\r\n if (scenes) {\r\n for (let i = 0; i < scenes.length; i++) {\r\n scenes[i].markAllMaterialsAsDirty(Constants.MATERIAL_AllDirtyFlag);\r\n }\r\n }\r\n\r\n this._pipelineContext!._handlesSpectorRebuildCallback?.(onCompiled);\r\n };\r\n this._fallbacks = null;\r\n this._prepareEffect();\r\n }\r\n\r\n private _onRenderingStateCompiled(pipelineContext: IPipelineContext) {\r\n this._pipelineContext = pipelineContext;\r\n this._pipelineContext.setEngine(this._engine);\r\n this._attributes = [];\r\n this._pipelineContext._fillEffectInformation(\r\n this,\r\n this._uniformBuffersNames,\r\n this._uniformsNames,\r\n this._uniforms,\r\n this._samplerList,\r\n this._samplers,\r\n this._attributesNames,\r\n this._attributes\r\n );\r\n\r\n // Caches attribute locations.\r\n if (this._attributesNames) {\r\n for (let i = 0; i < this._attributesNames.length; i++) {\r\n const name = this._attributesNames[i];\r\n this._attributeLocationByName[name] = this._attributes[i];\r\n }\r\n }\r\n\r\n this._engine.bindSamplers(this);\r\n\r\n this._compilationError = \"\";\r\n this._isReady = true;\r\n if (this.onCompiled) {\r\n this.onCompiled(this);\r\n }\r\n this.onCompileObservable.notifyObservers(this);\r\n this.onCompileObservable.clear();\r\n\r\n // Unbind mesh reference in fallbacks\r\n if (this._fallbacks) {\r\n this._fallbacks.unBindMesh();\r\n }\r\n\r\n if (Effect.AutomaticallyClearCodeCache) {\r\n this.clearCodeCache();\r\n }\r\n }\r\n\r\n /**\r\n * Prepares the effect\r\n * @internal\r\n */\r\n public _prepareEffect(keepExistingPipelineContext = false) {\r\n const previousPipelineContext = this._pipelineContext;\r\n\r\n this._isReady = false;\r\n\r\n try {\r\n const overrides = !!(this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride);\r\n const defines = overrides ? null : this.defines;\r\n const vertex = overrides ? this._vertexSourceCodeOverride : this._vertexSourceCode;\r\n const fragment = overrides ? this._fragmentSourceCodeOverride : this._fragmentSourceCode;\r\n const engine = this._engine;\r\n this._pipelineContext = createAndPreparePipelineContext(\r\n {\r\n existingPipelineContext: keepExistingPipelineContext ? previousPipelineContext : null,\r\n vertex,\r\n fragment,\r\n context: engine.shaderPlatformName === \"WEBGL2\" || engine.shaderPlatformName === \"WEBGL1\" ? (engine as any)._gl : undefined,\r\n rebuildRebind: (\r\n vertexSourceCode: string,\r\n fragmentSourceCode: string,\r\n onCompiled: (pipelineContext: IPipelineContext) => void,\r\n onError: (message: string) => void\r\n ) => this._rebuildProgram(vertexSourceCode, fragmentSourceCode, onCompiled, onError),\r\n defines,\r\n transformFeedbackVaryings: this._transformFeedbackVaryings,\r\n name: this._key.replace(/\\r/g, \"\").replace(/\\n/g, \"|\"),\r\n createAsRaw: overrides,\r\n disableParallelCompilation: this._disableParallelShaderCompilation,\r\n shaderProcessingContext: this._processingContext,\r\n onRenderingStateCompiled: (pipelineContext) => {\r\n if (previousPipelineContext && !keepExistingPipelineContext) {\r\n this._engine._deletePipelineContext(previousPipelineContext);\r\n }\r\n if (pipelineContext) {\r\n this._onRenderingStateCompiled(pipelineContext);\r\n }\r\n },\r\n },\r\n this._engine.createPipelineContext.bind(this._engine),\r\n this._engine._preparePipelineContextAsync.bind(this._engine),\r\n this._engine._executeWhenRenderingStateIsCompiled.bind(this._engine)\r\n );\r\n\r\n if (this._pipelineContext.isAsync) {\r\n this._checkIsReady(previousPipelineContext);\r\n }\r\n } catch (e) {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n }\r\n }\r\n\r\n private _getShaderCodeAndErrorLine(code: Nullable<string>, error: Nullable<string>, isFragment: boolean): [Nullable<string>, Nullable<string>] {\r\n const regexp = isFragment ? /FRAGMENT SHADER ERROR: 0:(\\d+?):/ : /VERTEX SHADER ERROR: 0:(\\d+?):/;\r\n\r\n let errorLine = null;\r\n\r\n if (error && code) {\r\n const res = error.match(regexp);\r\n if (res && res.length === 2) {\r\n const lineNumber = parseInt(res[1]);\r\n const lines = code.split(\"\\n\", -1);\r\n if (lines.length >= lineNumber) {\r\n errorLine = `Offending line [${lineNumber}] in ${isFragment ? \"fragment\" : \"vertex\"} code: ${lines[lineNumber - 1]}`;\r\n }\r\n }\r\n }\r\n\r\n return [code, errorLine];\r\n }\r\n\r\n private _processCompilationErrors(e: any, previousPipelineContext: Nullable<IPipelineContext> = null) {\r\n this._compilationError = e.message;\r\n const attributesNames = this._attributesNames;\r\n const fallbacks = this._fallbacks;\r\n\r\n // Let's go through fallbacks then\r\n Logger.Error(\"Unable to compile effect:\");\r\n Logger.Error(`Uniforms: ${this._uniformsNames.join(\" \")}`);\r\n Logger.Error(`Attributes: ${attributesNames.join(\" \")}`);\r\n Logger.Error(\"Defines:\\n\" + this.defines);\r\n if (Effect.LogShaderCodeOnCompilationError) {\r\n let lineErrorVertex = null,\r\n lineErrorFragment = null,\r\n code = null;\r\n if (this._pipelineContext?._getVertexShaderCode()) {\r\n [code, lineErrorVertex] = this._getShaderCodeAndErrorLine(this._pipelineContext._getVertexShaderCode(), this._compilationError, false);\r\n if (code) {\r\n Logger.Error(\"Vertex code:\");\r\n Logger.Error(code);\r\n }\r\n }\r\n if (this._pipelineContext?._getFragmentShaderCode()) {\r\n [code, lineErrorFragment] = this._getShaderCodeAndErrorLine(this._pipelineContext?._getFragmentShaderCode(), this._compilationError, true);\r\n if (code) {\r\n Logger.Error(\"Fragment code:\");\r\n Logger.Error(code);\r\n }\r\n }\r\n if (lineErrorVertex) {\r\n Logger.Error(lineErrorVertex);\r\n }\r\n if (lineErrorFragment) {\r\n Logger.Error(lineErrorFragment);\r\n }\r\n }\r\n Logger.Error(\"Error: \" + this._compilationError);\r\n\r\n const notifyErrors = () => {\r\n if (this.onError) {\r\n this.onError(this, this._compilationError);\r\n }\r\n this.onErrorObservable.notifyObservers(this);\r\n this._engine.onEffectErrorObservable.notifyObservers({ effect: this, errors: this._compilationError });\r\n };\r\n\r\n // In case a previous compilation was successful, we need to restore the previous pipeline context\r\n if (previousPipelineContext) {\r\n this._pipelineContext = previousPipelineContext;\r\n this._isReady = true;\r\n notifyErrors();\r\n }\r\n\r\n // Lets try to compile fallbacks as long as we have some.\r\n if (fallbacks) {\r\n this._pipelineContext = null;\r\n if (fallbacks.hasMoreFallbacks) {\r\n this._allFallbacksProcessed = false;\r\n Logger.Error(\"Trying next fallback.\");\r\n this.defines = fallbacks.reduce(this.defines, this);\r\n this._prepareEffect();\r\n } else {\r\n // Sorry we did everything we can\r\n this._allFallbacksProcessed = true;\r\n notifyErrors();\r\n this.onErrorObservable.clear();\r\n\r\n // Unbind mesh reference in fallbacks\r\n if (this._fallbacks) {\r\n this._fallbacks.unBindMesh();\r\n }\r\n }\r\n } else {\r\n this._allFallbacksProcessed = true;\r\n\r\n // In case of error, without any prior successful compilation, let s notify observers\r\n if (!previousPipelineContext) {\r\n notifyErrors();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the effect is supported. (Must be called after compilation)\r\n */\r\n public get isSupported(): boolean {\r\n return this._compilationError === \"\";\r\n }\r\n\r\n /**\r\n * Binds a texture to the engine to be used as output of the shader.\r\n * @param channel Name of the output variable.\r\n * @param texture Texture to bind.\r\n * @internal\r\n */\r\n public _bindTexture(channel: string, texture: Nullable<InternalTexture>): void {\r\n this._engine._bindTexture(this._samplers[channel], texture, channel);\r\n }\r\n\r\n /**\r\n * Sets a texture on the engine to be used in the shader.\r\n * @param channel Name of the sampler variable.\r\n * @param texture Texture to set.\r\n */\r\n public setTexture(channel: string, texture: Nullable<ThinTexture>): void {\r\n this._engine.setTexture(this._samplers[channel], this._uniforms[channel], texture, channel);\r\n }\r\n\r\n /**\r\n * Sets an array of textures on the engine to be used in the shader.\r\n * @param channel Name of the variable.\r\n * @param textures Textures to set.\r\n */\r\n public setTextureArray(channel: string, textures: ThinTexture[]): void {\r\n const exName = channel + \"Ex\";\r\n if (this._samplerList.indexOf(exName + \"0\") === -1) {\r\n const initialPos = this._samplerList.indexOf(channel);\r\n for (let index = 1; index < textures.length; index++) {\r\n const currentExName = exName + (index - 1).toString();\r\n this._samplerList.splice(initialPos + index, 0, currentExName);\r\n }\r\n\r\n // Reset every channels\r\n let channelIndex = 0;\r\n for (const key of this._samplerList) {\r\n this._samplers[key] = channelIndex;\r\n channelIndex += 1;\r\n }\r\n }\r\n\r\n this._engine.setTextureArray(this._samplers[channel], this._uniforms[channel], textures, channel);\r\n }\r\n\r\n /**\r\n * Binds a buffer to a uniform.\r\n * @param buffer Buffer to bind.\r\n * @param name Name of the uniform variable to bind to.\r\n */\r\n public bindUniformBuffer(buffer: DataBuffer, name: string): void {\r\n const bufferName = this._uniformBuffersNames[name];\r\n if (bufferName === undefined || (Effect._BaseCache[bufferName] === buffer && this._engine._features.useUBOBindingCache)) {\r\n return;\r\n }\r\n Effect._BaseCache[bufferName] = buffer;\r\n this._engine.bindUniformBufferBase(buffer, bufferName, name);\r\n }\r\n\r\n /**\r\n * Binds block to a uniform.\r\n * @param blockName Name of the block to bind.\r\n * @param index Index to bind.\r\n */\r\n public bindUniformBlock(blockName: string, index: number): void {\r\n this._engine.bindUniformBlock(this._pipelineContext!, blockName, index);\r\n }\r\n\r\n /**\r\n * Sets an integer value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value Value to be set.\r\n * @returns this effect.\r\n */\r\n public setInt(uniformName: string, value: number): Effect {\r\n this._pipelineContext!.setInt(uniformName, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int2 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int2.\r\n * @param y Second int in int2.\r\n * @returns this effect.\r\n */\r\n public setInt2(uniformName: string, x: number, y: number): Effect {\r\n this._pipelineContext!.setInt2(uniformName, x, y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int3 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int3.\r\n * @param y Second int in int3.\r\n * @param z Third int in int3.\r\n * @returns this effect.\r\n */\r\n public setInt3(uniformName: string, x: number, y: number, z: number): Effect {\r\n this._pipelineContext!.setInt3(uniformName, x, y, z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int4 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int4.\r\n * @param y Second int in int4.\r\n * @param z Third int in int4.\r\n * @param w Fourth int in int4.\r\n * @returns this effect.\r\n */\r\n public setInt4(uniformName: string, x: number, y: number, z: number, w: number): Effect {\r\n this._pipelineContext!.setInt4(uniformName, x, y, z, w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray2(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray3(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray4(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned integer value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value Value to be set.\r\n * @returns this effect.\r\n */\r\n public setUInt(uniformName: string, value: number): Effect {\r\n this._pipelineContext!.setUInt(uniformName, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int2 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint2.\r\n * @param y Second unsigned int in uint2.\r\n * @returns this effect.\r\n */\r\n public setUInt2(uniformName: string, x: number, y: number): Effect {\r\n this._pipelineContext!.setUInt2(uniformName, x, y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int3 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint3.\r\n * @param y Second unsigned int in uint3.\r\n * @param z Third unsigned int in uint3.\r\n * @returns this effect.\r\n */\r\n public setUInt3(uniformName: string, x: number, y: number, z: number): Effect {\r\n this._pipelineContext!.setUInt3(uniformName, x, y, z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int4 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint4.\r\n * @param y Second unsigned int in uint4.\r\n * @param z Third unsigned int in uint4.\r\n * @param w Fourth unsigned int in uint4.\r\n * @returns this effect.\r\n */\r\n public setUInt4(uniformName: string, x: number, y: number, z: number, w: number): Effect {\r\n this._pipelineContext!.setUInt4(uniformName, x, y, z, w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray2(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray3(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray4(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray2(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray3(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray4(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray2(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray3(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray4(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets matrices on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param matrices matrices to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrices(uniformName: string, matrices: Float32Array | Array<number>): Effect {\r\n this._pipelineContext!.setMatrices(uniformName, matrices as Float32Array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets matrix on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrix(uniformName: string, matrix: IMatrixLike): Effect {\r\n this._pipelineContext!.setMatrix(uniformName, matrix);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix)\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrix3x3(uniformName: string, matrix: Float32Array | Array<number>): Effect {\r\n // the cast is ok because it is gl.uniformMatrix3fv() which is called at the end, and this function accepts Float32Array and Array<number>\r\n this._pipelineContext!.setMatrix3x3(uniformName, matrix as Float32Array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix)\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrix2x2(uniformName: string, matrix: Float32Array | Array<number>): Effect {\r\n // the cast is ok because it is gl.uniformMatrix3fv() which is called at the end, and this function accepts Float32Array and Array<number>\r\n this._pipelineContext!.setMatrix2x2(uniformName, matrix as Float32Array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value value to be set.\r\n * @returns this effect.\r\n */\r\n public setFloat(uniformName: string, value: number): Effect {\r\n this._pipelineContext!.setFloat(uniformName, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a boolean on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param bool value to be set.\r\n * @returns this effect.\r\n */\r\n public setBool(uniformName: string, bool: boolean): Effect {\r\n this._pipelineContext!.setInt(uniformName, bool ? 1 : 0);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Vector2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector2 vector2 to be set.\r\n * @returns this effect.\r\n */\r\n public setVector2(uniformName: string, vector2: IVector2Like): Effect {\r\n this._pipelineContext!.setVector2(uniformName, vector2);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float2.\r\n * @param y Second float in float2.\r\n * @returns this effect.\r\n */\r\n public setFloat2(uniformName: string, x: number, y: number): Effect {\r\n this._pipelineContext!.setFloat2(uniformName, x, y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Vector3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector3 Value to be set.\r\n * @returns this effect.\r\n */\r\n public setVector3(uniformName: string, vector3: IVector3Like): Effect {\r\n this._pipelineContext!.setVector3(uniformName, vector3);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float3.\r\n * @param y Second float in float3.\r\n * @param z Third float in float3.\r\n * @returns this effect.\r\n */\r\n public setFloat3(uniformName: string, x: number, y: number, z: number): Effect {\r\n this._pipelineContext!.setFloat3(uniformName, x, y, z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Vector4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector4 Value to be set.\r\n * @returns this effect.\r\n */\r\n public setVector4(uniformName: string, vector4: IVector4Like): Effect {\r\n this._pipelineContext!.setVector4(uniformName, vector4);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Quaternion on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param quaternion Value to be set.\r\n * @returns this effect.\r\n */\r\n public setQuaternion(uniformName: string, quaternion: IQuaternionLike): Effect {\r\n this._pipelineContext!.setQuaternion(uniformName, quaternion);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float4.\r\n * @param y Second float in float4.\r\n * @param z Third float in float4.\r\n * @param w Fourth float in float4.\r\n * @returns this effect.\r\n */\r\n public setFloat4(uniformName: string, x: number, y: number, z: number, w: number): Effect {\r\n this._pipelineContext!.setFloat4(uniformName, x, y, z, w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Color3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param color3 Value to be set.\r\n * @returns this effect.\r\n */\r\n public setColor3(uniformName: string, color3: IColor3Like): Effect {\r\n this._pipelineContext!.setColor3(uniformName, color3);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Color4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param color3 Value to be set.\r\n * @param alpha Alpha value to be set.\r\n * @returns this effect.\r\n */\r\n public setColor4(uniformName: string, color3: IColor3Like, alpha: number): Effect {\r\n this._pipelineContext!.setColor4(uniformName, color3, alpha);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Color4 on a uniform variable\r\n * @param uniformName defines the name of the variable\r\n * @param color4 defines the value to be set\r\n * @returns this effect.\r\n */\r\n public setDirectColor4(uniformName: string, color4: IColor4Like): Effect {\r\n this._pipelineContext!.setDirectColor4(uniformName, color4);\r\n return this;\r\n }\r\n\r\n /**\r\n * Use this wisely: It will remove the cached code from this effect\r\n * It is probably ok to call it if you are not using ShadowDepthWrapper or if everything is already up and running\r\n * DO NOT CALL IT if you want to have support for context lost recovery\r\n */\r\n public clearCodeCache() {\r\n this._vertexSourceCode = \"\";\r\n this._fragmentSourceCode = \"\";\r\n this._fragmentSourceCodeBeforeMigration = \"\";\r\n this._vertexSourceCodeBeforeMigration = \"\";\r\n }\r\n\r\n /**\r\n * Release all associated resources.\r\n * @param force specifies if the effect must be released no matter what\r\n **/\r\n public dispose(force = false) {\r\n if (force) {\r\n this._refCount = 0;\r\n } else {\r\n if (Effect.PersistentMode) {\r\n return;\r\n }\r\n this._refCount--;\r\n }\r\n\r\n if (this._refCount > 0 || this._isDisposed) {\r\n // Others are still using the effect or the effect was already disposed\r\n return;\r\n }\r\n\r\n if (this._onReleaseEffectsObserver) {\r\n this._engine.onReleaseEffectsObservable.remove(this._onReleaseEffectsObserver);\r\n this._onReleaseEffectsObserver = null;\r\n }\r\n\r\n if (this._pipelineContext) {\r\n resetCachedPipeline(this._pipelineContext);\r\n }\r\n this._engine._releaseEffect(this);\r\n\r\n this.clearCodeCache();\r\n\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * This function will add a new shader to the shader store\r\n * @param name the name of the shader\r\n * @param pixelShader optional pixel shader content\r\n * @param vertexShader optional vertex shader content\r\n * @param shaderLanguage the language the shader is written in (default: GLSL)\r\n */\r\n public static RegisterShader(name: string, pixelShader?: string, vertexShader?: string, shaderLanguage = ShaderLanguage.GLSL) {\r\n if (pixelShader) {\r\n EngineShaderStore.GetShadersStore(shaderLanguage)[`${name}PixelShader`] = pixelShader;\r\n }\r\n\r\n if (vertexShader) {\r\n EngineShaderStore.GetShadersStore(shaderLanguage)[`${name}VertexShader`] = vertexShader;\r\n }\r\n }\r\n\r\n /**\r\n * Store of each shader (The can be looked up using effect.key)\r\n */\r\n public static ShadersStore: { [key: string]: string } = EngineShaderStore.ShadersStore;\r\n /**\r\n * Store of each included file for a shader (The can be looked up using effect.key)\r\n */\r\n public static IncludesShadersStore: { [key: string]: string } = EngineShaderStore.IncludesShadersStore;\r\n\r\n /**\r\n * Resets the cache of effects.\r\n */\r\n public static ResetCache() {\r\n Effect._BaseCache = {};\r\n }\r\n}\r\n"]}
@@ -46,6 +46,8 @@ export class PhysicsAggregate {
46
46
  this._options.mass = _options.mass === void 0 ? 0 : _options.mass;
47
47
  this._options.friction = _options.friction === void 0 ? 0.2 : _options.friction;
48
48
  this._options.restitution = _options.restitution === void 0 ? 0.2 : _options.restitution;
49
+ this._options.isTriggerShape = _options.isTriggerShape ?? false;
50
+ this._options.mesh = _options.mesh ?? (m._isMesh ? m : undefined);
49
51
  const motionType = this._options.mass === 0 ? 0 /* PhysicsMotionType.STATIC */ : 2 /* PhysicsMotionType.DYNAMIC */;
50
52
  const startAsleep = this._options.startAsleep ?? false;
51
53
  this.body = new PhysicsBody(transformNode, motionType, startAsleep, this._scene);
@@ -149,6 +151,7 @@ export class PhysicsAggregate {
149
151
  this._options.mass = _options.mass === void 0 ? 0 : _options.mass;
150
152
  this._options.friction = _options.friction === void 0 ? 0.2 : _options.friction;
151
153
  this._options.restitution = _options.restitution === void 0 ? 0.2 : _options.restitution;
154
+ this._options.isTriggerShape = _options.isTriggerShape ?? false;
152
155
  const motionType = this._options.mass === 0 ? 0 /* PhysicsMotionType.STATIC */ : 2 /* PhysicsMotionType.DYNAMIC */;
153
156
  const startAsleep = this._options.startAsleep ?? false;
154
157
  if (motionType !== this.body.motionType) {
@@ -158,9 +161,7 @@ export class PhysicsAggregate {
158
161
  this.body.startAsleep = startAsleep;
159
162
  }
160
163
  this._addSizeOptions();
161
- if (this._options.isTriggerShape) {
162
- this.shape.isTrigger = true;
163
- }
164
+ this.shape.isTrigger = this._options.isTriggerShape;
164
165
  if (this.material) {
165
166
  this.material.friction = this._options.friction;
166
167
  this.material.restitution = this._options.restitution;
@@ -1 +1 @@
1
- {"version":3,"file":"physicsAggregate.js","sourceRoot":"","sources":["../../../../../dev/core/src/Physics/v2/physicsAggregate.ts"],"names":[],"mappings":"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","sourcesContent":["import { PhysicsBody } from \"./physicsBody\";\r\nimport type { PhysicsMaterial } from \"./physicsMaterial\";\r\nimport { PhysicsShape } from \"./physicsShape\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Quaternion, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport { WithinEpsilon } from \"../../Maths/math.scalar.functions\";\r\nimport { PhysicsMotionType, PhysicsShapeType } from \"./IPhysicsEnginePlugin\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Node } from \"../../node\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { BoundingBox } from \"../../Culling/boundingBox\";\r\n\r\n/**\r\n * The interface for the physics aggregate parameters\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface PhysicsAggregateParameters {\r\n /**\r\n * The mass of the physics aggregate\r\n */\r\n mass: number;\r\n\r\n /**\r\n * The friction of the physics aggregate\r\n */\r\n friction?: number;\r\n\r\n /**\r\n * The coefficient of restitution of the physics aggregate\r\n */\r\n restitution?: number;\r\n\r\n /**\r\n * Radius for sphere, cylinder and capsule\r\n */\r\n radius?: number;\r\n\r\n /**\r\n * Starting point for cylinder/capsule\r\n */\r\n pointA?: Vector3;\r\n\r\n /**\r\n * Ending point for cylinder/capsule\r\n */\r\n pointB?: Vector3;\r\n\r\n /**\r\n * Extents for box\r\n */\r\n extents?: Vector3;\r\n\r\n /**\r\n * Orientation for box\r\n */\r\n rotation?: Quaternion;\r\n\r\n /**\r\n * mesh local center\r\n */\r\n center?: Vector3;\r\n\r\n /**\r\n * mesh object. Used for mesh and convex hull aggregates.\r\n */\r\n mesh?: Mesh;\r\n\r\n /**\r\n * Physics engine will try to make this body sleeping and not active\r\n */\r\n startAsleep?: boolean;\r\n\r\n /**\r\n * If true, mark the created shape as a trigger shape\r\n */\r\n isTriggerShape?: boolean;\r\n}\r\n/**\r\n * Helper class to create and interact with a PhysicsAggregate.\r\n * This is a transition object that works like Physics Plugin V1 Impostors.\r\n * This helper instantiates all mandatory physics objects to get a body/shape and material.\r\n * It's less efficient than handling body and shapes independently but for prototyping or\r\n * a small numbers of physics objects, it's good enough.\r\n */\r\nexport class PhysicsAggregate {\r\n /**\r\n * The body that is associated with this aggregate\r\n */\r\n public body: PhysicsBody;\r\n\r\n /**\r\n * The shape that is associated with this aggregate\r\n */\r\n public shape: PhysicsShape;\r\n\r\n /**\r\n * The material that is associated with this aggregate\r\n */\r\n public material: PhysicsMaterial;\r\n\r\n private _disposeShapeWhenDisposed = true;\r\n\r\n private _nodeDisposeObserver: Nullable<Observer<Node>>;\r\n\r\n constructor(\r\n /**\r\n * The physics-enabled object used as the physics aggregate\r\n */\r\n public transformNode: TransformNode,\r\n /**\r\n * The type of the physics aggregate\r\n */\r\n public type: PhysicsShapeType | PhysicsShape,\r\n private _options: PhysicsAggregateParameters = { mass: 0 },\r\n private _scene?: Scene\r\n ) {\r\n //sanity check!\r\n if (!this.transformNode) {\r\n Logger.Error(\"No object was provided. A physics object is obligatory\");\r\n return;\r\n }\r\n const m = transformNode as Mesh;\r\n if (this.transformNode.parent && this._options.mass !== 0 && m.hasThinInstances) {\r\n Logger.Warn(\r\n \"A physics body has been created for an object which has a parent and thin instances. Babylon physics currently works in local space so unexpected issues may occur.\"\r\n );\r\n }\r\n\r\n // Legacy support for old syntax.\r\n if (!this._scene && transformNode.getScene) {\r\n this._scene = transformNode.getScene();\r\n }\r\n\r\n if (!this._scene) {\r\n return;\r\n }\r\n\r\n //default options params\r\n this._options.mass = _options.mass === void 0 ? 0 : _options.mass;\r\n this._options.friction = _options.friction === void 0 ? 0.2 : _options.friction;\r\n this._options.restitution = _options.restitution === void 0 ? 0.2 : _options.restitution;\r\n\r\n const motionType = this._options.mass === 0 ? PhysicsMotionType.STATIC : PhysicsMotionType.DYNAMIC;\r\n const startAsleep = this._options.startAsleep ?? false;\r\n this.body = new PhysicsBody(transformNode, motionType, startAsleep, this._scene);\r\n this._addSizeOptions();\r\n if ((type as any).getClassName && (type as any).getClassName() === \"PhysicsShape\") {\r\n this.shape = type as PhysicsShape;\r\n this._disposeShapeWhenDisposed = false;\r\n } else {\r\n this.shape = new PhysicsShape({ type: type as PhysicsShapeType, parameters: this._options as any }, this._scene);\r\n }\r\n\r\n if (this._options.isTriggerShape) {\r\n this.shape.isTrigger = true;\r\n }\r\n\r\n this.material = { friction: this._options.friction, restitution: this._options.restitution };\r\n this.body.shape = this.shape;\r\n this.shape.material = this.material;\r\n\r\n this.body.setMassProperties({ mass: this._options.mass });\r\n\r\n this._nodeDisposeObserver = this.transformNode.onDisposeObservable.add(() => {\r\n this.dispose();\r\n });\r\n }\r\n\r\n private _getObjectBoundingBox() {\r\n if ((this.transformNode as AbstractMesh).getRawBoundingInfo) {\r\n return (this.transformNode as AbstractMesh).getRawBoundingInfo().boundingBox;\r\n } else {\r\n return new BoundingBox(new Vector3(-0.5, -0.5, -0.5), new Vector3(0.5, 0.5, 0.5));\r\n }\r\n }\r\n\r\n private _hasVertices(node: TransformNode): boolean {\r\n return (node as any)?.getTotalVertices() > 0;\r\n }\r\n\r\n private _addSizeOptions(): void {\r\n this.transformNode.computeWorldMatrix(true);\r\n const bb = this._getObjectBoundingBox();\r\n const extents = TmpVectors.Vector3[0];\r\n extents.copyFrom(bb.extendSize);\r\n extents.scaleInPlace(2);\r\n extents.multiplyInPlace(this.transformNode.absoluteScaling);\r\n // In case we had any negative scaling, we need to take the absolute value of the extents.\r\n extents.x = Math.abs(extents.x);\r\n extents.y = Math.abs(extents.y);\r\n extents.z = Math.abs(extents.z);\r\n\r\n const min = TmpVectors.Vector3[1];\r\n min.copyFrom(bb.minimum);\r\n min.multiplyInPlace(this.transformNode.absoluteScaling);\r\n\r\n if (!this._options.center) {\r\n const center = new Vector3();\r\n center.copyFrom(bb.center);\r\n center.multiplyInPlace(this.transformNode.absoluteScaling);\r\n this._options.center = center;\r\n }\r\n\r\n switch (this.type) {\r\n case PhysicsShapeType.SPHERE:\r\n if (!this._options.radius && WithinEpsilon(extents.x, extents.y, 0.0001) && WithinEpsilon(extents.x, extents.z, 0.0001)) {\r\n this._options.radius = extents.x / 2;\r\n } else if (!this._options.radius) {\r\n Logger.Warn(\"Non uniform scaling is unsupported for sphere shapes. Setting the radius to the biggest bounding box extent.\");\r\n this._options.radius = Math.max(extents.x, extents.y, extents.z) / 2;\r\n }\r\n break;\r\n case PhysicsShapeType.CAPSULE:\r\n {\r\n const capRadius = extents.x / 2;\r\n this._options.radius = this._options.radius ?? capRadius;\r\n this._options.pointA = this._options.pointA ?? new Vector3(0, min.y + capRadius, 0);\r\n this._options.pointB = this._options.pointB ?? new Vector3(0, min.y + extents.y - capRadius, 0);\r\n }\r\n break;\r\n case PhysicsShapeType.CYLINDER:\r\n {\r\n const capRadius = extents.x / 2;\r\n this._options.radius = this._options.radius ?? capRadius;\r\n this._options.pointA = this._options.pointA ?? new Vector3(0, min.y, 0);\r\n this._options.pointB = this._options.pointB ?? new Vector3(0, min.y + extents.y, 0);\r\n }\r\n break;\r\n case PhysicsShapeType.MESH:\r\n case PhysicsShapeType.CONVEX_HULL:\r\n case PhysicsShapeType.HEIGHTFIELD:\r\n if (!this._options.mesh && this._hasVertices(this.transformNode)) {\r\n this._options.mesh = this.transformNode as Mesh;\r\n } else if (!this._options.mesh || !this._hasVertices(this._options.mesh)) {\r\n throw new Error(\r\n \"No valid mesh was provided for mesh or convex hull shape parameter. Please provide a mesh with valid geometry (number of vertices greater than 0).\"\r\n );\r\n }\r\n break;\r\n case PhysicsShapeType.BOX:\r\n this._options.extents = this._options.extents ?? new Vector3(extents.x, extents.y, extents.z);\r\n this._options.rotation = this._options.rotation ?? Quaternion.Identity();\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Updates the options for the physics aggregate with the provided parameters.\r\n * @param _options - The new set of options to update the physics aggregate with.\r\n */\r\n public updateOptions(_options: PhysicsAggregateParameters) {\r\n this._options.mass = _options.mass === void 0 ? 0 : _options.mass;\r\n this._options.friction = _options.friction === void 0 ? 0.2 : _options.friction;\r\n this._options.restitution = _options.restitution === void 0 ? 0.2 : _options.restitution;\r\n const motionType = this._options.mass === 0 ? PhysicsMotionType.STATIC : PhysicsMotionType.DYNAMIC;\r\n const startAsleep = this._options.startAsleep ?? false;\r\n if (motionType !== this.body.motionType) {\r\n this.body.setMotionType(motionType);\r\n }\r\n if (startAsleep !== this.body.startAsleep) {\r\n this.body.startAsleep = startAsleep;\r\n }\r\n this._addSizeOptions();\r\n if (this._options.isTriggerShape) {\r\n this.shape.isTrigger = true;\r\n }\r\n if (this.material) {\r\n this.material.friction = this._options.friction;\r\n this.material.restitution = this._options.restitution;\r\n }\r\n this.body.setMassProperties({ mass: this._options.mass });\r\n }\r\n\r\n /**\r\n * Releases the body, shape and material\r\n */\r\n public dispose(): void {\r\n if (this._nodeDisposeObserver) {\r\n this.body.transformNode.onDisposeObservable.remove(this._nodeDisposeObserver);\r\n this._nodeDisposeObserver = null;\r\n }\r\n this.body.dispose();\r\n if (this._disposeShapeWhenDisposed) {\r\n this.shape.dispose();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"physicsAggregate.js","sourceRoot":"","sources":["../../../../../dev/core/src/Physics/v2/physicsAggregate.ts"],"names":[],"mappings":"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","sourcesContent":["import { PhysicsBody } from \"./physicsBody\";\r\nimport type { PhysicsMaterial } from \"./physicsMaterial\";\r\nimport { PhysicsShape } from \"./physicsShape\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Quaternion, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport { WithinEpsilon } from \"../../Maths/math.scalar.functions\";\r\nimport { PhysicsMotionType, PhysicsShapeType } from \"./IPhysicsEnginePlugin\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Node } from \"../../node\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { BoundingBox } from \"../../Culling/boundingBox\";\r\n\r\n/**\r\n * The interface for the physics aggregate parameters\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface PhysicsAggregateParameters {\r\n /**\r\n * The mass of the physics aggregate\r\n */\r\n mass: number;\r\n\r\n /**\r\n * The friction of the physics aggregate\r\n */\r\n friction?: number;\r\n\r\n /**\r\n * The coefficient of restitution of the physics aggregate\r\n */\r\n restitution?: number;\r\n\r\n /**\r\n * Radius for sphere, cylinder and capsule\r\n */\r\n radius?: number;\r\n\r\n /**\r\n * Starting point for cylinder/capsule\r\n */\r\n pointA?: Vector3;\r\n\r\n /**\r\n * Ending point for cylinder/capsule\r\n */\r\n pointB?: Vector3;\r\n\r\n /**\r\n * Extents for box\r\n */\r\n extents?: Vector3;\r\n\r\n /**\r\n * Orientation for box\r\n */\r\n rotation?: Quaternion;\r\n\r\n /**\r\n * mesh local center\r\n */\r\n center?: Vector3;\r\n\r\n /**\r\n * mesh object. Used for mesh and convex hull aggregates.\r\n */\r\n mesh?: Mesh;\r\n\r\n /**\r\n * Physics engine will try to make this body sleeping and not active\r\n */\r\n startAsleep?: boolean;\r\n\r\n /**\r\n * If true, mark the created shape as a trigger shape\r\n */\r\n isTriggerShape?: boolean;\r\n}\r\n/**\r\n * Helper class to create and interact with a PhysicsAggregate.\r\n * This is a transition object that works like Physics Plugin V1 Impostors.\r\n * This helper instantiates all mandatory physics objects to get a body/shape and material.\r\n * It's less efficient than handling body and shapes independently but for prototyping or\r\n * a small numbers of physics objects, it's good enough.\r\n */\r\nexport class PhysicsAggregate {\r\n /**\r\n * The body that is associated with this aggregate\r\n */\r\n public body: PhysicsBody;\r\n\r\n /**\r\n * The shape that is associated with this aggregate\r\n */\r\n public shape: PhysicsShape;\r\n\r\n /**\r\n * The material that is associated with this aggregate\r\n */\r\n public material: PhysicsMaterial;\r\n\r\n private _disposeShapeWhenDisposed = true;\r\n\r\n private _nodeDisposeObserver: Nullable<Observer<Node>>;\r\n\r\n constructor(\r\n /**\r\n * The physics-enabled object used as the physics aggregate\r\n */\r\n public transformNode: TransformNode,\r\n /**\r\n * The type of the physics aggregate\r\n */\r\n public type: PhysicsShapeType | PhysicsShape,\r\n private _options: PhysicsAggregateParameters = { mass: 0 },\r\n private _scene?: Scene\r\n ) {\r\n //sanity check!\r\n if (!this.transformNode) {\r\n Logger.Error(\"No object was provided. A physics object is obligatory\");\r\n return;\r\n }\r\n const m = transformNode as Mesh;\r\n if (this.transformNode.parent && this._options.mass !== 0 && m.hasThinInstances) {\r\n Logger.Warn(\r\n \"A physics body has been created for an object which has a parent and thin instances. Babylon physics currently works in local space so unexpected issues may occur.\"\r\n );\r\n }\r\n\r\n // Legacy support for old syntax.\r\n if (!this._scene && transformNode.getScene) {\r\n this._scene = transformNode.getScene();\r\n }\r\n\r\n if (!this._scene) {\r\n return;\r\n }\r\n\r\n //default options params\r\n this._options.mass = _options.mass === void 0 ? 0 : _options.mass;\r\n this._options.friction = _options.friction === void 0 ? 0.2 : _options.friction;\r\n this._options.restitution = _options.restitution === void 0 ? 0.2 : _options.restitution;\r\n this._options.isTriggerShape = _options.isTriggerShape ?? false;\r\n this._options.mesh = _options.mesh ?? (m._isMesh ? m : undefined);\r\n\r\n const motionType = this._options.mass === 0 ? PhysicsMotionType.STATIC : PhysicsMotionType.DYNAMIC;\r\n const startAsleep = this._options.startAsleep ?? false;\r\n this.body = new PhysicsBody(transformNode, motionType, startAsleep, this._scene);\r\n this._addSizeOptions();\r\n if ((type as any).getClassName && (type as any).getClassName() === \"PhysicsShape\") {\r\n this.shape = type as PhysicsShape;\r\n this._disposeShapeWhenDisposed = false;\r\n } else {\r\n this.shape = new PhysicsShape({ type: type as PhysicsShapeType, parameters: this._options as any }, this._scene);\r\n }\r\n\r\n if (this._options.isTriggerShape) {\r\n this.shape.isTrigger = true;\r\n }\r\n\r\n this.material = { friction: this._options.friction, restitution: this._options.restitution };\r\n this.body.shape = this.shape;\r\n this.shape.material = this.material;\r\n\r\n this.body.setMassProperties({ mass: this._options.mass });\r\n\r\n this._nodeDisposeObserver = this.transformNode.onDisposeObservable.add(() => {\r\n this.dispose();\r\n });\r\n }\r\n\r\n private _getObjectBoundingBox() {\r\n if ((this.transformNode as AbstractMesh).getRawBoundingInfo) {\r\n return (this.transformNode as AbstractMesh).getRawBoundingInfo().boundingBox;\r\n } else {\r\n return new BoundingBox(new Vector3(-0.5, -0.5, -0.5), new Vector3(0.5, 0.5, 0.5));\r\n }\r\n }\r\n\r\n private _hasVertices(node: TransformNode): boolean {\r\n return (node as any)?.getTotalVertices() > 0;\r\n }\r\n\r\n private _addSizeOptions(): void {\r\n this.transformNode.computeWorldMatrix(true);\r\n const bb = this._getObjectBoundingBox();\r\n const extents = TmpVectors.Vector3[0];\r\n extents.copyFrom(bb.extendSize);\r\n extents.scaleInPlace(2);\r\n extents.multiplyInPlace(this.transformNode.absoluteScaling);\r\n // In case we had any negative scaling, we need to take the absolute value of the extents.\r\n extents.x = Math.abs(extents.x);\r\n extents.y = Math.abs(extents.y);\r\n extents.z = Math.abs(extents.z);\r\n\r\n const min = TmpVectors.Vector3[1];\r\n min.copyFrom(bb.minimum);\r\n min.multiplyInPlace(this.transformNode.absoluteScaling);\r\n\r\n if (!this._options.center) {\r\n const center = new Vector3();\r\n center.copyFrom(bb.center);\r\n center.multiplyInPlace(this.transformNode.absoluteScaling);\r\n this._options.center = center;\r\n }\r\n\r\n switch (this.type) {\r\n case PhysicsShapeType.SPHERE:\r\n if (!this._options.radius && WithinEpsilon(extents.x, extents.y, 0.0001) && WithinEpsilon(extents.x, extents.z, 0.0001)) {\r\n this._options.radius = extents.x / 2;\r\n } else if (!this._options.radius) {\r\n Logger.Warn(\"Non uniform scaling is unsupported for sphere shapes. Setting the radius to the biggest bounding box extent.\");\r\n this._options.radius = Math.max(extents.x, extents.y, extents.z) / 2;\r\n }\r\n break;\r\n case PhysicsShapeType.CAPSULE:\r\n {\r\n const capRadius = extents.x / 2;\r\n this._options.radius = this._options.radius ?? capRadius;\r\n this._options.pointA = this._options.pointA ?? new Vector3(0, min.y + capRadius, 0);\r\n this._options.pointB = this._options.pointB ?? new Vector3(0, min.y + extents.y - capRadius, 0);\r\n }\r\n break;\r\n case PhysicsShapeType.CYLINDER:\r\n {\r\n const capRadius = extents.x / 2;\r\n this._options.radius = this._options.radius ?? capRadius;\r\n this._options.pointA = this._options.pointA ?? new Vector3(0, min.y, 0);\r\n this._options.pointB = this._options.pointB ?? new Vector3(0, min.y + extents.y, 0);\r\n }\r\n break;\r\n case PhysicsShapeType.MESH:\r\n case PhysicsShapeType.CONVEX_HULL:\r\n case PhysicsShapeType.HEIGHTFIELD:\r\n if (!this._options.mesh && this._hasVertices(this.transformNode)) {\r\n this._options.mesh = this.transformNode as Mesh;\r\n } else if (!this._options.mesh || !this._hasVertices(this._options.mesh)) {\r\n throw new Error(\r\n \"No valid mesh was provided for mesh or convex hull shape parameter. Please provide a mesh with valid geometry (number of vertices greater than 0).\"\r\n );\r\n }\r\n break;\r\n case PhysicsShapeType.BOX:\r\n this._options.extents = this._options.extents ?? new Vector3(extents.x, extents.y, extents.z);\r\n this._options.rotation = this._options.rotation ?? Quaternion.Identity();\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Updates the options for the physics aggregate with the provided parameters.\r\n * @param _options - The new set of options to update the physics aggregate with.\r\n */\r\n public updateOptions(_options: PhysicsAggregateParameters) {\r\n this._options.mass = _options.mass === void 0 ? 0 : _options.mass;\r\n this._options.friction = _options.friction === void 0 ? 0.2 : _options.friction;\r\n this._options.restitution = _options.restitution === void 0 ? 0.2 : _options.restitution;\r\n this._options.isTriggerShape = _options.isTriggerShape ?? false;\r\n const motionType = this._options.mass === 0 ? PhysicsMotionType.STATIC : PhysicsMotionType.DYNAMIC;\r\n const startAsleep = this._options.startAsleep ?? false;\r\n if (motionType !== this.body.motionType) {\r\n this.body.setMotionType(motionType);\r\n }\r\n if (startAsleep !== this.body.startAsleep) {\r\n this.body.startAsleep = startAsleep;\r\n }\r\n this._addSizeOptions();\r\n this.shape.isTrigger = this._options.isTriggerShape;\r\n if (this.material) {\r\n this.material.friction = this._options.friction;\r\n this.material.restitution = this._options.restitution;\r\n }\r\n this.body.setMassProperties({ mass: this._options.mass });\r\n }\r\n\r\n /**\r\n * Releases the body, shape and material\r\n */\r\n public dispose(): void {\r\n if (this._nodeDisposeObserver) {\r\n this.body.transformNode.onDisposeObservable.remove(this._nodeDisposeObserver);\r\n this._nodeDisposeObserver = null;\r\n }\r\n this.body.dispose();\r\n if (this._disposeShapeWhenDisposed) {\r\n this.shape.dispose();\r\n }\r\n }\r\n}\r\n"]}