@babylonjs/core 8.22.1 → 8.22.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.
@@ -794,13 +794,13 @@ export class AbstractEngine {
794
794
  */
795
795
  // Not mixed with Version for tooling purpose.
796
796
  static get NpmPackage() {
797
- return "babylonjs@8.22.1";
797
+ return "babylonjs@8.22.2";
798
798
  }
799
799
  /**
800
800
  * Returns the current version of the framework
801
801
  */
802
802
  static get Version() {
803
- return "8.22.1";
803
+ return "8.22.2";
804
804
  }
805
805
  /**
806
806
  * Gets the HTML canvas attached with the current webGL context
@@ -1 +1 @@
1
- {"version":3,"file":"abstractEngine.js","sourceRoot":"","sources":["../../../../dev/core/src/Engines/abstractEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport type { DataArray, FloatArray, IndicesArray, Nullable } from \"../types\";\r\nimport type { PerfCounter } from \"../Misc/perfCounter\";\r\nimport type { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { IColor4Like, IViewportLike } from \"../Maths/math.like\";\r\nimport type { ICanvas, IImage, IPath2D } from \"./ICanvas\";\r\nimport type { IHardwareTextureWrapper } from \"../Materials/Textures/hardwareTextureWrapper\";\r\nimport type { EngineCapabilities } from \"./engineCapabilities\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport type { RenderTargetWrapper } from \"./renderTargetWrapper\";\r\nimport type { IShaderProcessor } from \"./Processors/iShaderProcessor\";\r\nimport type { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\nimport type { IAudioEngineOptions } from \"../Audio/Interfaces/IAudioEngineOptions\";\r\nimport type { EngineFeatures } from \"./engineFeatures\";\r\nimport type { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport type { StorageBuffer } from \"../Buffers/storageBuffer\";\r\nimport type { IEffectCreationOptions, IShaderPath } from \"../Materials/effect\";\r\nimport type { IOfflineProvider } from \"../Offline/IOfflineProvider\";\r\nimport type { IWebRequest } from \"../Misc/interfaces/iWebRequest\";\r\nimport type { IFileRequest } from \"../Misc/fileRequest\";\r\nimport type { Texture } from \"../Materials/Textures/texture\";\r\nimport type { LoadFileError } from \"../Misc/fileTools\";\r\nimport type { _IShaderProcessingContext } from \"./Processors/shaderProcessingOptions\";\r\nimport type { IPipelineContext } from \"./IPipelineContext\";\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { InternalTextureCreationOptions, TextureSize } from \"../Materials/Textures/textureCreationOptions\";\r\nimport type { EffectFallbacks } from \"../Materials/effectFallbacks\";\r\nimport type { IMaterialContext } from \"./IMaterialContext\";\r\nimport type { IStencilState } from \"../States/IStencilState\";\r\nimport type { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { IDrawContext } from \"./IDrawContext\";\r\nimport type { VertexBuffer } from \"../Meshes/buffer\";\r\nimport type { IAudioEngine } from \"../Audio/Interfaces/IAudioEngine\";\r\nimport type { WebRequest } from \"core/Misc/webRequest\";\r\nimport type { PerformanceMonitor } from \"core/Misc/performanceMonitor\";\r\nimport type { ILoadingScreen } from \"../Loading/loadingScreen\";\r\nimport { EngineStore } from \"./engineStore\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { PerformanceConfigurator } from \"./performanceConfigurator\";\r\nimport { PrecisionDate } from \"../Misc/precisionDate\";\r\nimport { DepthCullingState } from \"../States/depthCullingState\";\r\nimport { StencilStateComposer } from \"../States/stencilStateComposer\";\r\nimport { StencilState } from \"../States/stencilState\";\r\nimport { AlphaState } from \"../States/alphaCullingState\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { InternalTexture, InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport { IsDocumentAvailable, IsNavigatorAvailable, IsWindowObjectExist } from \"../Misc/domManagement\";\r\nimport { Constants } from \"./constants\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { EngineFunctionContext, _LoadFile } from \"./abstractEngine.functions\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { _GetCompatibleTextureLoader } from \"core/Materials/Textures/Loaders/textureLoaderManager\";\r\n\r\n/**\r\n * Defines the interface used by objects working like Scene\r\n * @internal\r\n */\r\nexport interface ISceneLike {\r\n /** Add pending data (to load) */\r\n addPendingData(data: any): void;\r\n /** Remove pending data */\r\n removePendingData(data: any): void;\r\n /** Offline provider */\r\n offlineProvider: IOfflineProvider;\r\n}\r\n\r\n/**\r\n * Queue a new function into the requested animation frame pool (ie. this function will be executed by the browser (or the javascript engine) for the next frame)\r\n * @param func - the function to be called\r\n * @param requester - the object that will request the next frame. Falls back to window.\r\n * @returns frame number\r\n */\r\nexport function QueueNewFrame(func: () => void, requester?: any): number {\r\n // Note that there is kind of a typing issue here, as `setTimeout` might return something else than a number (NodeJs returns a NodeJS.Timeout object).\r\n // Also if the global `requestAnimationFrame`'s returnType is number, `requester.requestPostAnimationFrame` and `requester.requestAnimationFrame` types\r\n // are `any`.\r\n\r\n if (!IsWindowObjectExist()) {\r\n if (typeof requestAnimationFrame === \"function\") {\r\n return requestAnimationFrame(func);\r\n }\r\n } else {\r\n const { requestAnimationFrame } = (requester || window) as { requestAnimationFrame: (callback: FrameRequestCallback) => number };\r\n if (typeof requestAnimationFrame === \"function\") {\r\n return requestAnimationFrame(func);\r\n }\r\n }\r\n\r\n // fallback to the global `setTimeout`.\r\n // In most cases (aka in the browser), `window` is the global object, so instead of calling `window.setTimeout` we could call the global `setTimeout`.\r\n return setTimeout(func, 16) as unknown as number;\r\n}\r\n\r\n/** Interface defining initialization parameters for AbstractEngine class */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface AbstractEngineOptions {\r\n /**\r\n * Defines if the engine should no exceed a specified device ratio\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio\r\n */\r\n limitDeviceRatio?: number;\r\n /**\r\n * Defines if webaudio should be initialized as well\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/audio/playingSoundsMusic\r\n */\r\n audioEngine?: boolean;\r\n /**\r\n * Specifies options for the audio engine\r\n */\r\n audioEngineOptions?: IAudioEngineOptions;\r\n\r\n /**\r\n * Defines if animations should run using a deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n */\r\n deterministicLockstep?: boolean;\r\n /** Defines the maximum steps to use with deterministic lock step mode */\r\n lockstepMaxSteps?: number;\r\n /** Defines the seconds between each deterministic lock step */\r\n timeStep?: number;\r\n /**\r\n * Defines that engine should ignore context lost events\r\n * If this event happens when this parameter is true, you will have to reload the page to restore rendering\r\n */\r\n doNotHandleContextLost?: boolean;\r\n /**\r\n * Defines that engine should ignore modifying touch action attribute and style\r\n * If not handle, you might need to set it up on your side for expected touch devices behavior.\r\n */\r\n doNotHandleTouchAction?: boolean;\r\n\r\n /**\r\n * Make the matrix computations to be performed in 64 bits instead of 32 bits. False by default\r\n */\r\n useHighPrecisionMatrix?: boolean;\r\n\r\n /**\r\n * Defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n adaptToDeviceRatio?: boolean;\r\n\r\n /**\r\n * Defines whether MSAA is enabled on the canvas.\r\n */\r\n antialias?: boolean;\r\n\r\n /**\r\n * Defines whether the stencil buffer should be enabled.\r\n */\r\n stencil?: boolean;\r\n\r\n /**\r\n * Defines whether the canvas should be created in \"premultiplied\" mode (if false, the canvas is created in the \"opaque\" mode) (true by default)\r\n */\r\n premultipliedAlpha?: boolean;\r\n /**\r\n * True if the more expensive but exact conversions should be used for transforming colors to and from linear space within shaders.\r\n * Otherwise, the default is to use a cheaper approximation.\r\n */\r\n useExactSrgbConversions?: boolean;\r\n}\r\n\r\n/**\r\n * Information about the current host\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface HostInformation {\r\n /**\r\n * Defines if the current host is a mobile\r\n */\r\n isMobile: boolean;\r\n}\r\n\r\nexport type PrepareTextureProcessFunction = (\r\n width: number,\r\n height: number,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n extension: string,\r\n texture: InternalTexture,\r\n continuationCallback: () => void\r\n) => boolean;\r\n\r\nexport type PrepareTextureFunction = (\r\n texture: InternalTexture,\r\n extension: string,\r\n scene: Nullable<ISceneLike>,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n invertY: boolean,\r\n noMipmap: boolean,\r\n isCompressed: boolean,\r\n processFunction: PrepareTextureProcessFunction,\r\n samplingMode: number\r\n) => void;\r\n\r\n/**\r\n * The parent class for specialized engines (WebGL, WebGPU)\r\n */\r\nexport abstract class AbstractEngine {\r\n // States\r\n /** @internal */\r\n protected _colorWrite = true;\r\n /** @internal */\r\n protected _colorWriteChanged = true;\r\n /** @internal */\r\n public _depthCullingState = new DepthCullingState();\r\n /** @internal */\r\n protected _stencilStateComposer = new StencilStateComposer();\r\n /** @internal */\r\n public _stencilState = new StencilState();\r\n /** @internal */\r\n public _alphaState = new AlphaState();\r\n /** @internal */\r\n public _alphaMode = Array(8).fill(-1);\r\n /** @internal */\r\n public _alphaEquation = Array(8).fill(-1);\r\n\r\n protected _activeRequests: IFileRequest[] = [];\r\n\r\n /** @internal */\r\n public _badOS = false;\r\n /** @internal */\r\n public _badDesktopOS = false;\r\n /** @internal */\r\n public _videoTextureSupported: boolean;\r\n\r\n protected _compatibilityMode = true;\r\n /** @internal */\r\n public _pointerLockRequested: boolean;\r\n /** @internal */\r\n public _loadingScreen: ILoadingScreen;\r\n /** @internal */\r\n public _renderingCanvas: Nullable<HTMLCanvasElement>;\r\n /** @internal */\r\n public _internalTexturesCache = new Array<InternalTexture>();\r\n protected _currentEffect: Nullable<Effect>;\r\n /** @internal */\r\n protected _cachedVertexBuffers: any;\r\n /** @internal */\r\n protected _cachedIndexBuffer: Nullable<DataBuffer>;\r\n /** @internal */\r\n protected _cachedEffectForVertexBuffers: Nullable<Effect>;\r\n /** @internal */\r\n public _currentRenderTarget: Nullable<RenderTargetWrapper> = null;\r\n /** @internal */\r\n public _caps: EngineCapabilities;\r\n /** @internal */\r\n protected _cachedViewport: Nullable<IViewportLike>;\r\n /** @internal */\r\n public _currentDrawContext: IDrawContext;\r\n /** @internal */\r\n public _currentMaterialContext: IMaterialContext;\r\n\r\n /** @internal */\r\n protected _boundTexturesCache: { [key: string]: Nullable<InternalTexture> } = {};\r\n /** @internal */\r\n protected _activeChannel = 0;\r\n /** @internal */\r\n protected _currentTextureChannel = -1;\r\n /** @internal */\r\n protected _viewportCached = { x: 0, y: 0, z: 0, w: 0 };\r\n\r\n /** @internal */\r\n protected _isWebGPU: boolean = false;\r\n\r\n // Focus\r\n /** @internal */\r\n public _onFocus: () => void;\r\n /** @internal */\r\n public _onBlur: () => void;\r\n /** @internal */\r\n public _onCanvasPointerOut: (event: PointerEvent) => void;\r\n /** @internal */\r\n public _onCanvasBlur: () => void;\r\n /** @internal */\r\n public _onCanvasFocus: () => void;\r\n /** @internal */\r\n public _onCanvasContextMenu: (evt: Event) => void;\r\n /** @internal */\r\n public _onFullscreenChange: () => void;\r\n\r\n /**\r\n * Observable event triggered each time the canvas loses focus\r\n */\r\n public onCanvasBlurObservable = new Observable<AbstractEngine>();\r\n /**\r\n * Observable event triggered each time the canvas gains focus\r\n */\r\n public onCanvasFocusObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Event raised when a new scene is created\r\n */\r\n public onNewSceneAddedObservable = new Observable<Scene>();\r\n\r\n /**\r\n * Observable event triggered each time the rendering canvas is resized\r\n */\r\n public onResizeObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Observable event triggered each time the canvas receives pointerout event\r\n */\r\n public onCanvasPointerOutObservable = new Observable<PointerEvent>();\r\n\r\n /**\r\n * Observable event triggered each time an effect compilation fails\r\n */\r\n public onEffectErrorObservable = new Observable<{ effect: Effect; errors: string }>();\r\n\r\n /**\r\n * Turn this value on if you want to pause FPS computation when in background\r\n */\r\n public disablePerformanceMonitorInBackground = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that vertex array object must be disabled even if they are supported\r\n */\r\n public disableVertexArrayObjects = false;\r\n\r\n /** @internal */\r\n protected _frameId = 0;\r\n /**\r\n * Gets the current frame id\r\n */\r\n public get frameId(): number {\r\n return this._frameId;\r\n }\r\n /**\r\n * Gets a boolean indicating if the engine runs in WebGPU or not.\r\n */\r\n public get isWebGPU(): boolean {\r\n return this._isWebGPU;\r\n }\r\n\r\n protected _shaderProcessor: Nullable<IShaderProcessor>;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getShaderProcessor(_shaderLanguage: ShaderLanguage): Nullable<IShaderProcessor> {\r\n return this._shaderProcessor;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _resetAlphaMode(): void {\r\n this._alphaMode.fill(-1);\r\n this._alphaEquation.fill(-1);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if all created effects are ready\r\n * @returns true if all effects are ready\r\n */\r\n public abstract areAllEffectsReady(): boolean;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _executeWhenRenderingStateIsCompiled(pipelineContext: IPipelineContext, action: () => void): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _setTexture(channel: number, texture: Nullable<ThinTexture>, isPartOfTextureArray?: boolean, depthStencilTexture?: boolean, name?: string): boolean;\r\n\r\n /**\r\n * Sets a texture to the according uniform.\r\n * @param channel The texture channel\r\n * @param unused unused parameter\r\n * @param texture The texture to apply\r\n * @param name The name of the uniform in the effect\r\n */\r\n public abstract setTexture(channel: number, unused: Nullable<WebGLUniformLocation>, texture: Nullable<ThinTexture>, name: string): void;\r\n\r\n /**\r\n * Binds an effect to the webGL context\r\n * @param effect defines the effect to bind\r\n */\r\n public abstract bindSamplers(effect: Effect): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _bindTexture(channel: number, texture: Nullable<InternalTexture>, name: string): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _deletePipelineContext(pipelineContext: IPipelineContext): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _preparePipelineContextAsync(\r\n pipelineContext: IPipelineContext,\r\n vertexSourceCode: string,\r\n fragmentSourceCode: string,\r\n createAsRaw: boolean,\r\n rawVertexSourceCode: string,\r\n rawFragmentSourceCode: string,\r\n rebuildRebind: any,\r\n defines: Nullable<string>,\r\n transformFeedbackVaryings: Nullable<string[]>,\r\n key: string,\r\n onReady: () => void\r\n ): void;\r\n\r\n /** @internal */\r\n protected _shaderPlatformName: string;\r\n /**\r\n * Gets the shader platform name used by the effects.\r\n */\r\n public get shaderPlatformName(): string {\r\n return this._shaderPlatformName;\r\n }\r\n\r\n /**\r\n * Gets information about the current host\r\n */\r\n public hostInformation: HostInformation = {\r\n isMobile: false,\r\n };\r\n\r\n /**\r\n * Gets a boolean indicating if the engine is currently rendering in fullscreen mode\r\n */\r\n public isFullscreen = false;\r\n\r\n /**\r\n * Gets or sets a boolean to enable/disable IndexedDB support and avoid XHR on .manifest\r\n **/\r\n public enableOfflineSupport = false;\r\n\r\n /**\r\n * Gets or sets a boolean to enable/disable checking manifest if IndexedDB support is enabled (js will always consider the database is up to date)\r\n **/\r\n public disableManifestCheck = false;\r\n\r\n /**\r\n * Gets or sets a boolean to enable/disable the context menu (right-click) from appearing on the main canvas\r\n */\r\n public disableContextMenu: boolean = true;\r\n\r\n /**\r\n * Gets or sets the current render pass id\r\n */\r\n public currentRenderPassId = Constants.RENDERPASS_MAIN;\r\n\r\n /**\r\n * Gets a boolean indicating if the pointer is currently locked\r\n */\r\n public isPointerLock = false;\r\n\r\n /**\r\n * Gets the list of created postprocesses\r\n */\r\n public postProcesses: PostProcess[] = [];\r\n\r\n /** Gets or sets the tab index to set to the rendering canvas. 1 is the minimum value to set to be able to capture keyboard events */\r\n public canvasTabIndex = 1;\r\n\r\n /** @internal */\r\n protected _onContextLost: (evt: Event) => void;\r\n /** @internal */\r\n protected _onContextRestored: (evt: Event) => void;\r\n /** @internal */\r\n protected _contextWasLost = false;\r\n\r\n private _emptyTexture: Nullable<InternalTexture>;\r\n private _emptyCubeTexture: Nullable<InternalTexture>;\r\n private _emptyTexture3D: Nullable<InternalTexture>;\r\n private _emptyTexture2DArray: Nullable<InternalTexture>;\r\n\r\n protected _clearEmptyResources(): void {\r\n this._emptyTexture = null;\r\n this._emptyCubeTexture = null;\r\n this._emptyTexture3D = null;\r\n this._emptyTexture2DArray = null;\r\n }\r\n\r\n public abstract wipeCaches(bruteForce?: boolean): void;\r\n\r\n private _useReverseDepthBuffer = false;\r\n /**\r\n * Gets or sets a boolean indicating if depth buffer should be reverse, going from far to near.\r\n * This can provide greater z depth for distant objects.\r\n */\r\n public get useReverseDepthBuffer(): boolean {\r\n return this._useReverseDepthBuffer;\r\n }\r\n\r\n public set useReverseDepthBuffer(useReverse) {\r\n if (useReverse === this._useReverseDepthBuffer) {\r\n return;\r\n }\r\n\r\n this._useReverseDepthBuffer = useReverse;\r\n\r\n if (useReverse) {\r\n this._depthCullingState.depthFunc = Constants.GEQUAL;\r\n } else {\r\n this._depthCullingState.depthFunc = Constants.LEQUAL;\r\n }\r\n }\r\n\r\n /**\r\n * Enable or disable color writing\r\n * @param enable defines the state to set\r\n */\r\n public setColorWrite(enable: boolean): void {\r\n if (enable !== this._colorWrite) {\r\n this._colorWriteChanged = true;\r\n this._colorWrite = enable;\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if color writing is enabled\r\n * @returns the current color writing state\r\n */\r\n public getColorWrite(): boolean {\r\n return this._colorWrite;\r\n }\r\n\r\n /**\r\n * Gets the depth culling state manager\r\n */\r\n public get depthCullingState(): DepthCullingState {\r\n return this._depthCullingState;\r\n }\r\n\r\n /**\r\n * Gets the alpha state manager\r\n */\r\n public get alphaState(): AlphaState {\r\n return this._alphaState;\r\n }\r\n\r\n /**\r\n * Gets the stencil state manager\r\n */\r\n public get stencilState(): StencilState {\r\n return this._stencilState;\r\n }\r\n\r\n /**\r\n * Gets the stencil state composer\r\n */\r\n public get stencilStateComposer(): StencilStateComposer {\r\n return this._stencilStateComposer;\r\n }\r\n\r\n /**\r\n * Indicates if the z range in NDC space is 0..1 (value: true) or -1..1 (value: false)\r\n */\r\n public readonly isNDCHalfZRange: boolean = false;\r\n\r\n /**\r\n * Indicates that the origin of the texture/framebuffer space is the bottom left corner. If false, the origin is top left\r\n */\r\n public readonly hasOriginBottomLeft: boolean = true;\r\n\r\n /**\r\n * Gets a boolean indicating if the exact sRGB conversions or faster approximations are used for converting to and from linear space.\r\n */\r\n public readonly useExactSrgbConversions: boolean;\r\n\r\n /** @internal */\r\n public _getGlobalDefines(defines?: { [key: string]: string }): string | undefined {\r\n if (defines) {\r\n if (this.isNDCHalfZRange) {\r\n defines[\"IS_NDC_HALF_ZRANGE\"] = \"\";\r\n } else {\r\n delete defines[\"IS_NDC_HALF_ZRANGE\"];\r\n }\r\n if (this.useReverseDepthBuffer) {\r\n defines[\"USE_REVERSE_DEPTHBUFFER\"] = \"\";\r\n } else {\r\n delete defines[\"USE_REVERSE_DEPTHBUFFER\"];\r\n }\r\n if (this.useExactSrgbConversions) {\r\n defines[\"USE_EXACT_SRGB_CONVERSIONS\"] = \"\";\r\n } else {\r\n delete defines[\"USE_EXACT_SRGB_CONVERSIONS\"];\r\n }\r\n return;\r\n } else {\r\n let s = \"\";\r\n if (this.isNDCHalfZRange) {\r\n s += \"#define IS_NDC_HALF_ZRANGE\";\r\n }\r\n if (this.useReverseDepthBuffer) {\r\n if (s) {\r\n s += \"\\n\";\r\n }\r\n s += \"#define USE_REVERSE_DEPTHBUFFER\";\r\n }\r\n if (this.useExactSrgbConversions) {\r\n if (s) {\r\n s += \"\\n\";\r\n }\r\n s += \"#define USE_EXACT_SRGB_CONVERSIONS\";\r\n }\r\n return s;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _renderTargetWrapperCache = new Array<RenderTargetWrapper>();\r\n /** @internal */\r\n protected _compiledEffects: { [key: string]: Effect } = {};\r\n\r\n private _rebuildInternalTextures(): void {\r\n const currentState = this._internalTexturesCache.slice(); // Do a copy because the rebuild will add proxies\r\n\r\n for (const internalTexture of currentState) {\r\n internalTexture._rebuild();\r\n }\r\n }\r\n\r\n private _rebuildRenderTargetWrappers(): void {\r\n const currentState = this._renderTargetWrapperCache.slice(); // Do a copy because the rebuild will add proxies\r\n\r\n for (const renderTargetWrapper of currentState) {\r\n renderTargetWrapper._rebuild();\r\n }\r\n }\r\n\r\n private _rebuildEffects(): void {\r\n for (const key in this._compiledEffects) {\r\n const effect = this._compiledEffects[key];\r\n\r\n effect._pipelineContext = null; // because _prepareEffect will try to dispose this pipeline before recreating it and that would lead to webgl errors\r\n effect._prepareEffect();\r\n }\r\n\r\n Effect.ResetCache();\r\n }\r\n\r\n protected _rebuildGraphicsResources(): void {\r\n // Ensure webgl and engine states are matching\r\n this.wipeCaches(true);\r\n\r\n // Rebuild effects\r\n this._rebuildEffects();\r\n this._rebuildComputeEffects?.();\r\n\r\n // Note:\r\n // The call to _rebuildBuffers must be made before the call to _rebuildInternalTextures because in the process of _rebuildBuffers the buffers used by the post process managers will be rebuilt\r\n // and we may need to use the post process manager of the scene during _rebuildInternalTextures (in WebGL1, non-POT textures are rescaled using a post process + post process manager of the scene)\r\n\r\n // Rebuild buffers\r\n this._rebuildBuffers();\r\n // Rebuild textures\r\n this._rebuildInternalTextures();\r\n // Rebuild textures\r\n this._rebuildTextures();\r\n // Rebuild textures\r\n this._rebuildRenderTargetWrappers();\r\n\r\n // Reset engine states after all the buffer/textures/... have been rebuilt\r\n this.wipeCaches(true);\r\n }\r\n\r\n protected _flagContextRestored(): void {\r\n Logger.Warn(this.name + \" context successfully restored.\");\r\n this.onContextRestoredObservable.notifyObservers(this);\r\n this._contextWasLost = false;\r\n }\r\n\r\n protected _restoreEngineAfterContextLost(initEngine: () => void): void {\r\n // Adding a timeout to avoid race condition at browser level\r\n setTimeout(() => {\r\n this._clearEmptyResources();\r\n\r\n const depthTest = this._depthCullingState.depthTest; // backup those values because the call to initEngine / wipeCaches will reset them\r\n const depthFunc = this._depthCullingState.depthFunc;\r\n const depthMask = this._depthCullingState.depthMask;\r\n const stencilTest = this._stencilState.stencilTest;\r\n\r\n // Rebuild context\r\n initEngine();\r\n this._rebuildGraphicsResources();\r\n\r\n this._depthCullingState.depthTest = depthTest;\r\n this._depthCullingState.depthFunc = depthFunc;\r\n this._depthCullingState.depthMask = depthMask;\r\n this._stencilState.stencilTest = stencilTest;\r\n\r\n this._flagContextRestored();\r\n }, 0);\r\n }\r\n\r\n /** @internal */\r\n protected _isDisposed = false;\r\n\r\n /** Gets a boolean indicating if the engine was disposed */\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * Gets the list of created scenes\r\n */\r\n public scenes: Scene[] = [];\r\n\r\n /** @internal */\r\n public _virtualScenes = new Array<Scene>();\r\n\r\n /** @internal */\r\n public _features: EngineFeatures;\r\n\r\n /**\r\n * Enables or disables the snapshot rendering mode\r\n * Note that the WebGL engine does not support snapshot rendering so setting the value won't have any effect for this engine\r\n */\r\n public get snapshotRendering(): boolean {\r\n return false;\r\n }\r\n\r\n public set snapshotRendering(activate) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Gets or sets the snapshot rendering mode\r\n */\r\n public get snapshotRenderingMode(): number {\r\n return Constants.SNAPSHOTRENDERING_STANDARD;\r\n }\r\n\r\n public set snapshotRenderingMode(mode: number) {}\r\n\r\n /**\r\n * Observable event triggered before each texture is initialized\r\n */\r\n public onBeforeTextureInitObservable = new Observable<Texture>();\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the engine must keep rendering even if the window is not in foreground\r\n */\r\n public renderEvenInBackground = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that cache can be kept between frames\r\n */\r\n public preventCacheWipeBetweenFrames = false;\r\n\r\n /**\r\n * Returns the string \"AbstractEngine\"\r\n * @returns \"AbstractEngine\"\r\n */\r\n public getClassName(): string {\r\n return \"AbstractEngine\";\r\n }\r\n\r\n /**\r\n * Gets the default empty texture\r\n */\r\n public get emptyTexture(): InternalTexture {\r\n if (!this._emptyTexture) {\r\n this._emptyTexture = this.createRawTexture(new Uint8Array(4), 1, 1, Constants.TEXTUREFORMAT_RGBA, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n return this._emptyTexture;\r\n }\r\n\r\n /**\r\n * Gets the default empty 3D texture\r\n */\r\n public get emptyTexture3D(): InternalTexture {\r\n if (!this._emptyTexture3D) {\r\n this._emptyTexture3D = this.createRawTexture3D(new Uint8Array(4), 1, 1, 1, Constants.TEXTUREFORMAT_RGBA, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n return this._emptyTexture3D;\r\n }\r\n\r\n /**\r\n * Gets the default empty 2D array texture\r\n */\r\n public get emptyTexture2DArray(): InternalTexture {\r\n if (!this._emptyTexture2DArray) {\r\n this._emptyTexture2DArray = this.createRawTexture2DArray(\r\n new Uint8Array(4),\r\n 1,\r\n 1,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE\r\n );\r\n }\r\n\r\n return this._emptyTexture2DArray;\r\n }\r\n\r\n /**\r\n * Gets the default empty cube texture\r\n */\r\n public get emptyCubeTexture(): InternalTexture {\r\n if (!this._emptyCubeTexture) {\r\n const faceData = new Uint8Array(4);\r\n const cubeData = [faceData, faceData, faceData, faceData, faceData, faceData];\r\n this._emptyCubeTexture = this.createRawCubeTexture(\r\n cubeData,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE\r\n );\r\n }\r\n\r\n return this._emptyCubeTexture;\r\n }\r\n\r\n /** @internal */\r\n public _frameHandler: number = 0;\r\n\r\n /** @internal */\r\n protected _activeRenderLoops = new Array<() => void>();\r\n\r\n /**\r\n * Gets the list of current active render loop functions\r\n * @returns a read only array with the current render loop functions\r\n */\r\n public get activeRenderLoops(): ReadonlyArray<() => void> {\r\n return this._activeRenderLoops;\r\n }\r\n\r\n /**\r\n * stop executing a render loop function and remove it from the execution array\r\n * @param renderFunction defines the function to be removed. If not provided all functions will be removed.\r\n */\r\n public stopRenderLoop(renderFunction?: () => void): void {\r\n if (!renderFunction) {\r\n this._activeRenderLoops.length = 0;\r\n this._cancelFrame();\r\n return;\r\n }\r\n\r\n const index = this._activeRenderLoops.indexOf(renderFunction);\r\n\r\n if (index >= 0) {\r\n this._activeRenderLoops.splice(index, 1);\r\n if (this._activeRenderLoops.length == 0) {\r\n this._cancelFrame();\r\n }\r\n }\r\n }\r\n\r\n protected _cancelFrame() {\r\n if (this._frameHandler !== 0) {\r\n const handlerToCancel = this._frameHandler;\r\n this._frameHandler = 0;\r\n\r\n if (!IsWindowObjectExist()) {\r\n if (typeof cancelAnimationFrame === \"function\") {\r\n return cancelAnimationFrame(handlerToCancel);\r\n }\r\n } else {\r\n const { cancelAnimationFrame } = this.getHostWindow() || window;\r\n if (typeof cancelAnimationFrame === \"function\") {\r\n return cancelAnimationFrame(handlerToCancel);\r\n }\r\n }\r\n return clearTimeout(handlerToCancel);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _windowIsBackground = false;\r\n\r\n /**\r\n * Begin a new frame\r\n */\r\n public beginFrame(): void {\r\n this.onBeginFrameObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * End the current frame\r\n */\r\n public endFrame(): void {\r\n this._frameId++;\r\n\r\n this.onEndFrameObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Gets the performance monitor attached to this engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation\r\n */\r\n public abstract get performanceMonitor(): PerformanceMonitor;\r\n\r\n /** @internal */\r\n public _boundRenderFunction: any = (timestamp: number) => this._renderLoop(timestamp);\r\n\r\n protected _maxFPS: number | undefined;\r\n protected _minFrameTime: number;\r\n protected _lastFrameTime: number = 0;\r\n protected _renderAccumulator: number = 0;\r\n\r\n /**\r\n * Skip frame rendering but keep the frame heartbeat (begin/end frame).\r\n * This is useful if you need all the plumbing but not the rendering work.\r\n * (for instance when capturing a screenshot where you do not want to mix rendering to the screen and to the screenshot)\r\n */\r\n public skipFrameRender = false;\r\n\r\n /** Gets or sets max frame per second allowed. Will return undefined if not capped */\r\n public get maxFPS(): number | undefined {\r\n return this._maxFPS;\r\n }\r\n\r\n public set maxFPS(value: number | undefined) {\r\n this._maxFPS = value;\r\n\r\n if (value === undefined) {\r\n return;\r\n }\r\n\r\n if (value <= 0) {\r\n this._minFrameTime = Number.MAX_VALUE;\r\n return;\r\n }\r\n\r\n this._minFrameTime = 1000 / value;\r\n }\r\n\r\n protected _isOverFrameTime(timestamp?: number): boolean {\r\n if (!timestamp || this._maxFPS === undefined) {\r\n return false;\r\n }\r\n\r\n const elapsedTime = timestamp - this._lastFrameTime;\r\n this._lastFrameTime = timestamp;\r\n\r\n this._renderAccumulator += elapsedTime;\r\n\r\n if (this._renderAccumulator < this._minFrameTime) {\r\n return true;\r\n }\r\n\r\n this._renderAccumulator -= this._minFrameTime;\r\n\r\n if (this._renderAccumulator > this._minFrameTime) {\r\n this._renderAccumulator = this._minFrameTime;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n protected _processFrame(timestamp?: number) {\r\n this._frameHandler = 0;\r\n\r\n if (!this._contextWasLost && !this._isOverFrameTime(timestamp)) {\r\n let shouldRender = true;\r\n if (this.isDisposed || (!this.renderEvenInBackground && this._windowIsBackground)) {\r\n shouldRender = false;\r\n }\r\n\r\n if (shouldRender) {\r\n // Start new frame\r\n this.beginFrame();\r\n\r\n // Child canvases\r\n if (!this.skipFrameRender && !this._renderViews()) {\r\n // Main frame\r\n this._renderFrame();\r\n }\r\n\r\n // Present\r\n this.endFrame();\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _renderLoop(timestamp: number | undefined): void {\r\n this._processFrame(timestamp);\r\n\r\n // The first condition prevents queuing another frame if we no longer have active render loops (e.g., if\r\n // `stopRenderLoop` is called mid frame). The second condition prevents queuing another frame if one has\r\n // already been queued (e.g., if `stopRenderLoop` and `runRenderLoop` is called mid frame).\r\n if (this._activeRenderLoops.length > 0 && this._frameHandler === 0) {\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _renderFrame() {\r\n for (let index = 0; index < this._activeRenderLoops.length; index++) {\r\n const renderFunction = this._activeRenderLoops[index];\r\n\r\n renderFunction();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _renderViews() {\r\n return false;\r\n }\r\n\r\n /**\r\n * Can be used to override the current requestAnimationFrame requester.\r\n * @internal\r\n */\r\n protected _queueNewFrame(bindedRenderFunction: any, requester?: any): number {\r\n return QueueNewFrame(bindedRenderFunction, requester);\r\n }\r\n\r\n /**\r\n * Register and execute a render loop. The engine can have more than one render function\r\n * @param renderFunction defines the function to continuously execute\r\n */\r\n public runRenderLoop(renderFunction: () => void): void {\r\n if (this._activeRenderLoops.indexOf(renderFunction) !== -1) {\r\n return;\r\n }\r\n\r\n this._activeRenderLoops.push(renderFunction);\r\n\r\n // On the first added function, start the render loop.\r\n if (this._activeRenderLoops.length === 1 && this._frameHandler === 0) {\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if depth testing is enabled\r\n * @returns the current state\r\n */\r\n public getDepthBuffer(): boolean {\r\n return this._depthCullingState.depthTest;\r\n }\r\n\r\n /**\r\n * Enable or disable depth buffering\r\n * @param enable defines the state to set\r\n */\r\n public setDepthBuffer(enable: boolean): void {\r\n this._depthCullingState.depthTest = enable;\r\n }\r\n\r\n /**\r\n * Set the z offset Factor to apply to current rendering\r\n * @param value defines the offset to apply\r\n */\r\n public setZOffset(value: number): void {\r\n this._depthCullingState.zOffset = this.useReverseDepthBuffer ? -value : value;\r\n }\r\n\r\n /**\r\n * Gets the current value of the zOffset Factor\r\n * @returns the current zOffset Factor state\r\n */\r\n public getZOffset(): number {\r\n const zOffset = this._depthCullingState.zOffset;\r\n return this.useReverseDepthBuffer ? -zOffset : zOffset;\r\n }\r\n\r\n /**\r\n * Set the z offset Units to apply to current rendering\r\n * @param value defines the offset to apply\r\n */\r\n public setZOffsetUnits(value: number): void {\r\n this._depthCullingState.zOffsetUnits = this.useReverseDepthBuffer ? -value : value;\r\n }\r\n\r\n /**\r\n * Gets the current value of the zOffset Units\r\n * @returns the current zOffset Units state\r\n */\r\n public getZOffsetUnits(): number {\r\n const zOffsetUnits = this._depthCullingState.zOffsetUnits;\r\n return this.useReverseDepthBuffer ? -zOffsetUnits : zOffsetUnits;\r\n }\r\n\r\n /**\r\n * Gets host window\r\n * @returns the host window object\r\n */\r\n public getHostWindow(): Nullable<Window> {\r\n if (!IsWindowObjectExist()) {\r\n return null;\r\n }\r\n\r\n if (this._renderingCanvas && this._renderingCanvas.ownerDocument && this._renderingCanvas.ownerDocument.defaultView) {\r\n return this._renderingCanvas.ownerDocument.defaultView;\r\n }\r\n\r\n return window;\r\n }\r\n\r\n /**\r\n * (WebGPU only) True (default) to be in compatibility mode, meaning rendering all existing scenes without artifacts (same rendering than WebGL).\r\n * Setting the property to false will improve performances but may not work in some scenes if some precautions are not taken.\r\n * See https://doc.babylonjs.com/setup/support/webGPU/webGPUOptimization/webGPUNonCompatibilityMode for more details\r\n */\r\n public get compatibilityMode() {\r\n return this._compatibilityMode;\r\n }\r\n\r\n public set compatibilityMode(mode: boolean) {\r\n // not supported in WebGL\r\n this._compatibilityMode = true;\r\n }\r\n\r\n /**\r\n * Observable raised when the engine is about to compile a shader\r\n */\r\n public onBeforeShaderCompilationObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Observable raised when the engine has just compiled a shader\r\n */\r\n public onAfterShaderCompilationObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Observable raised when the engine begins a new frame\r\n */\r\n public onBeginFrameObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Observable raised when the engine ends the current frame (requires a render loop, e.g. 'engine.runRenderLoop(...)')\r\n */\r\n public onEndFrameObservable = new Observable<AbstractEngine>();\r\n\r\n protected _rebuildTextures(): void {\r\n for (const scene of this.scenes) {\r\n scene._rebuildTextures();\r\n }\r\n\r\n for (const scene of this._virtualScenes) {\r\n scene._rebuildTextures();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _getRGBABufferInternalSizedFormat(type: number, format?: number, useSRGBBuffer?: boolean): number;\r\n\r\n /** @internal */\r\n public abstract _getUnpackAlignement(): number;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _uploadCompressedDataToTextureDirectly(\r\n texture: InternalTexture,\r\n internalFormat: number,\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n faceIndex: number,\r\n lod?: number\r\n ): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _bindTextureDirectly(target: number, texture: Nullable<InternalTexture>, forTextureDataUpdate?: boolean, force?: boolean): boolean;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _uploadDataToTextureDirectly(\r\n texture: InternalTexture,\r\n imageData: ArrayBufferView,\r\n faceIndex?: number,\r\n lod?: number,\r\n babylonInternalFormat?: number,\r\n useTextureWidthAndHeight?: boolean\r\n ): void;\r\n\r\n /** @internal */\r\n public abstract _unpackFlipY(value: boolean): void;\r\n\r\n /**\r\n * Reads pixels from the current frame buffer. Please note that this function can be slow\r\n * @param x defines the x coordinate of the rectangle where pixels must be read\r\n * @param y defines the y coordinate of the rectangle where pixels must be read\r\n * @param width defines the width of the rectangle where pixels must be read\r\n * @param height defines the height of the rectangle where pixels must be read\r\n * @param hasAlpha defines whether the output should have alpha or not (defaults to true)\r\n * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels\r\n * @returns a ArrayBufferView promise (Uint8Array) containing RGBA colors\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public abstract readPixels(x: number, y: number, width: number, height: number, hasAlpha?: boolean, flushRenderer?: boolean): Promise<ArrayBufferView>;\r\n\r\n /**\r\n * Generates mipmaps for a texture\r\n * @param texture The texture to generate the mipmaps for\r\n */\r\n public abstract generateMipmaps(texture: InternalTexture): void;\r\n\r\n /**\r\n * Force a flush (ie. a flush of all waiting commands)\r\n */\r\n public abstract flushFramebuffer(): void;\r\n\r\n /** @internal */\r\n public abstract _currentFrameBufferIsDefaultFrameBuffer(): boolean;\r\n\r\n /**\r\n * Creates an internal texture without binding it to a framebuffer\r\n * @internal\r\n * @param size defines the size of the texture\r\n * @param options defines the options used to create the texture\r\n * @param delayGPUTextureCreation true to delay the texture creation the first time it is really needed. false to create it right away\r\n * @param source source type of the texture\r\n * @returns a new internal texture\r\n */\r\n public abstract _createInternalTexture(\r\n size: TextureSize,\r\n options: boolean | InternalTextureCreationOptions,\r\n delayGPUTextureCreation?: boolean,\r\n source?: InternalTextureSource\r\n ): InternalTexture;\r\n\r\n /** @internal */\r\n public abstract applyStates(): void;\r\n\r\n /**\r\n * Binds the frame buffer to the specified texture.\r\n * @param texture The render target wrapper to render to\r\n * @param faceIndex The face of the texture to render to in case of cube texture\r\n * @param requiredWidth The width of the target to render to\r\n * @param requiredHeight The height of the target to render to\r\n * @param forceFullscreenViewport Forces the viewport to be the entire texture/screen if true\r\n * @param lodLevel defines the lod level to bind to the frame buffer\r\n * @param layer defines the 2d array index to bind to frame buffer to\r\n */\r\n public abstract bindFramebuffer(\r\n texture: RenderTargetWrapper,\r\n faceIndex?: number,\r\n requiredWidth?: number,\r\n requiredHeight?: number,\r\n forceFullscreenViewport?: boolean,\r\n lodLevel?: number,\r\n layer?: number\r\n ): void;\r\n\r\n /**\r\n * Update the sampling mode of a given texture\r\n * @param texture defines the texture to update\r\n * @param wrapU defines the texture wrap mode of the u coordinates\r\n * @param wrapV defines the texture wrap mode of the v coordinates\r\n * @param wrapR defines the texture wrap mode of the r coordinates\r\n */\r\n public abstract updateTextureWrappingMode(texture: InternalTexture, wrapU: Nullable<number>, wrapV?: Nullable<number>, wrapR?: Nullable<number>): void;\r\n\r\n /**\r\n * Unbind the current render target and bind the default framebuffer\r\n */\r\n public abstract restoreDefaultFramebuffer(): void;\r\n\r\n /**\r\n * Draw a list of indexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param indexStart defines the starting index\r\n * @param indexCount defines the number of index to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public abstract drawElementsType(fillMode: number, indexStart: number, indexCount: number, instancesCount?: number): void;\r\n\r\n /**\r\n * Unbind the current render target texture from the webGL context\r\n * @param texture defines the render target wrapper to unbind\r\n * @param disableGenerateMipMaps defines a boolean indicating that mipmaps must not be generated\r\n * @param onBeforeUnbind defines a function which will be called before the effective unbind\r\n */\r\n public abstract unBindFramebuffer(texture: RenderTargetWrapper, disableGenerateMipMaps?: boolean, onBeforeUnbind?: () => void): void;\r\n\r\n /**\r\n * Generates mipmaps for the texture of the (single) render target\r\n * @param texture The render target containing the texture to generate the mipmaps for\r\n */\r\n public abstract generateMipMapsFramebuffer(texture: RenderTargetWrapper): void;\r\n\r\n /**\r\n * Resolves the MSAA texture of the (single) render target into its non-MSAA version.\r\n * Note that if \"texture\" is not a MSAA render target, no resolve is performed.\r\n * @param texture The render target texture containing the MSAA texture to resolve\r\n */\r\n public abstract resolveFramebuffer(texture: RenderTargetWrapper): void;\r\n\r\n /**Gets driver info if available */\r\n public abstract extractDriverInfo(): string;\r\n\r\n /**\r\n * Bind a list of vertex buffers to the webGL context\r\n * @param vertexBuffers defines the list of vertex buffers to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n * @param effect defines the effect associated with the vertex buffers\r\n * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers\r\n */\r\n public abstract bindBuffers(\r\n vertexBuffers: { [key: string]: Nullable<VertexBuffer> },\r\n indexBuffer: Nullable<DataBuffer>,\r\n effect: Effect,\r\n overrideVertexBuffers?: { [kind: string]: Nullable<VertexBuffer> }\r\n ): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseRenderTargetWrapper(rtWrapper: RenderTargetWrapper): void {\r\n const index = this._renderTargetWrapperCache.indexOf(rtWrapper);\r\n if (index !== -1) {\r\n this._renderTargetWrapperCache.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Activates an effect, making it the current one (i.e. the one used for rendering)\r\n * @param effect defines the effect to activate\r\n */\r\n public abstract enableEffect(effect: Nullable<Effect | DrawWrapper>): void;\r\n\r\n /**\r\n * Sets the type of faces to cull\r\n * @param cullBackFaces true to cull back faces, false to cull front faces (if culling is enabled)\r\n * @param force defines if states must be applied even if cache is up to date\r\n */\r\n public abstract setStateCullFaceType(cullBackFaces?: boolean, force?: boolean): void;\r\n\r\n /**\r\n * Set various states to the webGL context\r\n * @param culling defines culling state: true to enable culling, false to disable it\r\n * @param zOffset defines the value to apply to zOffset (0 by default)\r\n * @param force defines if states must be applied even if cache is up to date\r\n * @param reverseSide defines if culling must be reversed (CCW if false, CW if true)\r\n * @param cullBackFaces true to cull back faces, false to cull front faces (if culling is enabled)\r\n * @param stencil stencil states to set\r\n * @param zOffsetUnits defines the value to apply to zOffsetUnits (0 by default)\r\n */\r\n public abstract setState(\r\n culling: boolean,\r\n zOffset?: number,\r\n force?: boolean,\r\n reverseSide?: boolean,\r\n cullBackFaces?: boolean,\r\n stencil?: IStencilState,\r\n zOffsetUnits?: number\r\n ): void;\r\n\r\n /**\r\n * Creates a new material context\r\n * @returns the new context\r\n */\r\n public abstract createMaterialContext(): IMaterialContext | undefined;\r\n\r\n /**\r\n * Creates a new draw context\r\n * @returns the new context\r\n */\r\n public abstract createDrawContext(): IDrawContext | undefined;\r\n\r\n /**\r\n * Create a new effect (used to store vertex/fragment shaders)\r\n * @param baseName defines the base name of the effect (The name of file without .fragment.fx or .vertex.fx)\r\n * @param attributesNamesOrOptions defines either a list of attribute names or an IEffectCreationOptions object\r\n * @param uniformsNamesOrEngine defines either a list of uniform names or the engine to use\r\n * @param samplers defines an array of string used to represent textures\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails\r\n * @param onCompiled defines a function to call when the effect creation is successful\r\n * @param onError defines a function to call when the effect creation has failed\r\n * @param indexParameters defines an object containing the index values to use to compile shaders (like the maximum number of simultaneous lights)\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 * @returns the new Effect\r\n */\r\n public abstract createEffect(\r\n baseName: string | (IShaderPath & { vertexToken?: string; fragmentToken?: string }),\r\n attributesNamesOrOptions: string[] | IEffectCreationOptions,\r\n uniformsNamesOrEngine: string[] | AbstractEngine,\r\n samplers?: string[],\r\n defines?: string,\r\n fallbacks?: EffectFallbacks,\r\n onCompiled?: Nullable<(effect: Effect) => void>,\r\n onError?: Nullable<(effect: Effect, errors: string) => void>,\r\n indexParameters?: any,\r\n shaderLanguage?: ShaderLanguage,\r\n extraInitializationsAsync?: () => Promise<void>\r\n ): Effect;\r\n\r\n /**\r\n * Clear the current render buffer or the current render target (if any is set up)\r\n * @param color defines the color to use\r\n * @param backBuffer defines if the back buffer must be cleared\r\n * @param depth defines if the depth buffer must be cleared\r\n * @param stencil defines if the stencil buffer must be cleared\r\n * @param stencilClearValue defines the value to use to clear the stencil buffer\r\n */\r\n public abstract clear(color: Nullable<IColor4Like>, backBuffer: boolean, depth: boolean, stencil?: boolean, stencilClearValue?: number): void;\r\n\r\n /**\r\n * Gets a boolean indicating that only power of 2 textures are supported\r\n * Please note that you can still use non power of 2 textures but in this case the engine will forcefully convert them\r\n */\r\n public abstract get needPOTTextures(): boolean;\r\n\r\n /**\r\n * Creates a new index buffer\r\n * @param indices defines the content of the index buffer\r\n * @param _updatable defines if the index buffer must be updatable\r\n * @param label defines the label of the buffer (for debug purpose)\r\n * @returns a new buffer\r\n */\r\n public abstract createIndexBuffer(indices: IndicesArray, _updatable?: boolean, label?: string): DataBuffer;\r\n\r\n /**\r\n * Draw a list of unindexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public abstract drawArraysType(fillMode: number, verticesStart: number, verticesCount: number, instancesCount?: number): void;\r\n\r\n /**\r\n * Force the engine to release all cached effects.\r\n * This means that next effect compilation will have to be done completely even if a similar effect was already compiled\r\n */\r\n public abstract releaseEffects(): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _viewport(x: number, y: number, width: number, height: number): void;\r\n\r\n /**\r\n * Gets the current viewport\r\n */\r\n public get currentViewport(): Nullable<IViewportLike> {\r\n return this._cachedViewport;\r\n }\r\n\r\n /**\r\n * Set the WebGL's viewport\r\n * @param viewport defines the viewport element to be used\r\n * @param requiredWidth defines the width required for rendering. If not provided the rendering canvas' width is used\r\n * @param requiredHeight defines the height required for rendering. If not provided the rendering canvas' height is used\r\n */\r\n public setViewport(viewport: IViewportLike, requiredWidth?: number, requiredHeight?: number): void {\r\n const width = requiredWidth || this.getRenderWidth();\r\n const height = requiredHeight || this.getRenderHeight();\r\n const x = viewport.x || 0;\r\n const y = viewport.y || 0;\r\n\r\n this._cachedViewport = viewport;\r\n\r\n this._viewport(x * width, y * height, width * viewport.width, height * viewport.height);\r\n }\r\n\r\n /**\r\n * Update the sampling mode of a given texture\r\n * @param samplingMode defines the required sampling mode\r\n * @param texture defines the texture to update\r\n * @param generateMipMaps defines whether to generate mipmaps for the texture\r\n */\r\n public abstract updateTextureSamplingMode(samplingMode: number, texture: InternalTexture, generateMipMaps?: boolean): void;\r\n\r\n /**\r\n * Sets an array of texture to the webGL context\r\n * @param channel defines the channel where the texture array must be set\r\n * @param uniform defines the associated uniform location\r\n * @param textures defines the array of textures to bind\r\n * @param name name of the channel\r\n */\r\n public abstract setTextureArray(channel: number, uniform: Nullable<WebGLUniformLocation>, textures: ThinTexture[], name: string): void;\r\n\r\n /** @internal */\r\n public _transformTextureUrl: Nullable<(url: string) => string> = null;\r\n\r\n /**\r\n * Unbind all instance attributes\r\n */\r\n public abstract unbindInstanceAttributes(): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _getUseSRGBBuffer(useSRGBBuffer: boolean, noMipmap: boolean): boolean;\r\n\r\n /**\r\n * Create an image to use with canvas\r\n * @returns IImage interface\r\n */\r\n public createCanvasImage(): IImage {\r\n return document.createElement(\"img\");\r\n }\r\n\r\n /**\r\n * Create a 2D path to use with canvas\r\n * @returns IPath2D interface\r\n * @param d SVG path string\r\n */\r\n public createCanvasPath2D(d?: string): IPath2D {\r\n return new Path2D(d);\r\n }\r\n\r\n /**\r\n * Returns a string describing the current engine\r\n */\r\n public get description(): string {\r\n let description = this.name + this.version;\r\n\r\n if (this._caps.parallelShaderCompile) {\r\n description += \" - Parallel shader compilation\";\r\n }\r\n\r\n return description;\r\n }\r\n\r\n protected _createTextureBase(\r\n url: Nullable<string>,\r\n noMipmap: boolean,\r\n invertY: boolean,\r\n scene: Nullable<ISceneLike>,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<(texture: InternalTexture) => void> = null,\r\n onError: Nullable<(message: string, exception: any) => void> = null,\r\n prepareTexture: PrepareTextureFunction,\r\n prepareTextureProcess: PrepareTextureProcessFunction,\r\n buffer: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap> = null,\r\n fallback: Nullable<InternalTexture> = null,\r\n format: Nullable<number> = null,\r\n forcedExtension: Nullable<string> = null,\r\n mimeType?: string,\r\n loaderOptions?: any,\r\n useSRGBBuffer?: boolean\r\n ): InternalTexture {\r\n url = url || \"\";\r\n const fromData = url.substring(0, 5) === \"data:\";\r\n const fromBlob = url.substring(0, 5) === \"blob:\";\r\n const isBase64 = fromData && url.indexOf(\";base64,\") !== -1;\r\n\r\n const texture = fallback ? fallback : new InternalTexture(this, InternalTextureSource.Url);\r\n\r\n if (texture !== fallback) {\r\n texture.label = url.substring(0, 60); // default label, can be overriden by the caller\r\n }\r\n\r\n const originalUrl = url;\r\n if (this._transformTextureUrl && !isBase64 && !fallback && !buffer) {\r\n url = this._transformTextureUrl(url);\r\n }\r\n\r\n if (originalUrl !== url) {\r\n texture._originalUrl = originalUrl;\r\n }\r\n\r\n // establish the file extension, if possible\r\n const lastDot = url.lastIndexOf(\".\");\r\n let extension = forcedExtension ? forcedExtension : lastDot > -1 ? url.substring(lastDot).toLowerCase() : \"\";\r\n\r\n // Remove query string\r\n const queryStringIndex = extension.indexOf(\"?\");\r\n\r\n if (queryStringIndex > -1) {\r\n extension = extension.split(\"?\")[0];\r\n }\r\n\r\n const loaderPromise = _GetCompatibleTextureLoader(extension, mimeType);\r\n\r\n if (scene) {\r\n scene.addPendingData(texture);\r\n }\r\n texture.url = url;\r\n texture.generateMipMaps = !noMipmap;\r\n texture.samplingMode = samplingMode;\r\n texture.invertY = invertY;\r\n texture._useSRGBBuffer = this._getUseSRGBBuffer(!!useSRGBBuffer, noMipmap);\r\n\r\n if (!this._doNotHandleContextLost) {\r\n // Keep a link to the buffer only if we plan to handle context lost\r\n texture._buffer = buffer;\r\n }\r\n\r\n let onLoadObserver: Nullable<Observer<InternalTexture>> = null;\r\n if (onLoad && !fallback) {\r\n onLoadObserver = texture.onLoadedObservable.add(onLoad);\r\n }\r\n\r\n if (!fallback) {\r\n this._internalTexturesCache.push(texture);\r\n }\r\n\r\n const onInternalError = (message?: string, exception?: any) => {\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n if (url === originalUrl) {\r\n if (onLoadObserver) {\r\n texture.onLoadedObservable.remove(onLoadObserver);\r\n }\r\n\r\n if (EngineStore.UseFallbackTexture && url !== EngineStore.FallbackTexture) {\r\n this._createTextureBase(\r\n EngineStore.FallbackTexture,\r\n noMipmap,\r\n texture.invertY,\r\n scene,\r\n samplingMode,\r\n null,\r\n onError,\r\n prepareTexture,\r\n prepareTextureProcess,\r\n buffer,\r\n texture\r\n );\r\n }\r\n\r\n message = (message || \"Unknown error\") + (EngineStore.UseFallbackTexture ? \" - Fallback texture was used\" : \"\");\r\n texture.onErrorObservable.notifyObservers({ message, exception });\r\n if (onError) {\r\n onError(message, exception);\r\n }\r\n } else {\r\n // fall back to the original url if the transformed url fails to load\r\n Logger.Warn(`Failed to load ${url}, falling back to ${originalUrl}`);\r\n this._createTextureBase(\r\n originalUrl,\r\n noMipmap,\r\n texture.invertY,\r\n scene,\r\n samplingMode,\r\n onLoad,\r\n onError,\r\n prepareTexture,\r\n prepareTextureProcess,\r\n buffer,\r\n texture,\r\n format,\r\n forcedExtension,\r\n mimeType,\r\n loaderOptions,\r\n useSRGBBuffer\r\n );\r\n }\r\n };\r\n\r\n // processing for non-image formats\r\n if (loaderPromise) {\r\n const callbackAsync = async (data: ArrayBufferView) => {\r\n const loader = await loaderPromise;\r\n loader.loadData(\r\n data,\r\n texture,\r\n (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void, loadFailed) => {\r\n if (loadFailed) {\r\n onInternalError(\"TextureLoader failed to load data\");\r\n } else {\r\n prepareTexture(\r\n texture,\r\n extension,\r\n scene,\r\n { width, height },\r\n texture.invertY,\r\n !loadMipmap,\r\n isCompressed,\r\n () => {\r\n done();\r\n return false;\r\n },\r\n samplingMode\r\n );\r\n }\r\n },\r\n loaderOptions\r\n );\r\n };\r\n\r\n if (!buffer) {\r\n this._loadFile(\r\n url,\r\n (data) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n callbackAsync(new Uint8Array(data as ArrayBuffer));\r\n },\r\n undefined,\r\n scene ? scene.offlineProvider : undefined,\r\n true,\r\n (request?: IWebRequest, exception?: any) => {\r\n onInternalError(\"Unable to load \" + (request ? request.responseURL : url, exception));\r\n }\r\n );\r\n } else {\r\n if (buffer instanceof ArrayBuffer) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n callbackAsync(new Uint8Array(buffer));\r\n } else if (ArrayBuffer.isView(buffer)) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n callbackAsync(buffer);\r\n } else {\r\n if (onError) {\r\n onError(\"Unable to load: only ArrayBuffer or ArrayBufferView is supported\", null);\r\n }\r\n }\r\n }\r\n } else {\r\n const onload = (img: HTMLImageElement | ImageBitmap) => {\r\n if (fromBlob && !this._doNotHandleContextLost) {\r\n // We need to store the image if we need to rebuild the texture\r\n // in case of a webgl context lost\r\n texture._buffer = img;\r\n }\r\n\r\n prepareTexture(texture, extension, scene, img, texture.invertY, noMipmap, false, prepareTextureProcess, samplingMode);\r\n };\r\n // According to the WebGL spec section 6.10, ImageBitmaps must be inverted on creation.\r\n // So, we pass imageOrientation to _FileToolsLoadImage() as it may create an ImageBitmap.\r\n\r\n if (!fromData || isBase64) {\r\n if (buffer && (typeof (<HTMLImageElement>buffer).decoding === \"string\" || (<ImageBitmap>buffer).close)) {\r\n onload(<HTMLImageElement>buffer);\r\n } else {\r\n AbstractEngine._FileToolsLoadImage(\r\n url || \"\",\r\n onload,\r\n onInternalError,\r\n scene ? scene.offlineProvider : null,\r\n mimeType,\r\n texture.invertY && this._features.needsInvertingBitmap ? { imageOrientation: \"flipY\" } : undefined,\r\n this\r\n );\r\n }\r\n } else if (typeof buffer === \"string\" || buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer) || buffer instanceof Blob) {\r\n AbstractEngine._FileToolsLoadImage(\r\n buffer,\r\n onload,\r\n onInternalError,\r\n scene ? scene.offlineProvider : null,\r\n mimeType,\r\n texture.invertY && this._features.needsInvertingBitmap ? { imageOrientation: \"flipY\" } : undefined,\r\n this\r\n );\r\n } else if (buffer) {\r\n onload(buffer);\r\n }\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * Creates a new pipeline context\r\n * @param shaderProcessingContext defines the shader processing context used during the processing if available\r\n * @returns the new pipeline\r\n */\r\n public abstract createPipelineContext(shaderProcessingContext: Nullable<_IShaderProcessingContext>): IPipelineContext;\r\n\r\n /**\r\n * Inline functions in shader code that are marked to be inlined\r\n * @param code code to inline\r\n * @returns inlined code\r\n */\r\n public abstract inlineShaderCode(code: string): string;\r\n\r\n /**\r\n * Gets a boolean indicating that the engine supports uniform buffers\r\n */\r\n public abstract get supportsUniformBuffers(): boolean;\r\n\r\n /**\r\n * Returns the version of the engine\r\n */\r\n public abstract get version(): number;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _releaseEffect(effect: Effect): void;\r\n\r\n /**\r\n * Bind a buffer to the current draw context\r\n * @param buffer defines the buffer to bind\r\n * @param _location not used in WebGPU\r\n * @param name Name of the uniform variable to bind\r\n */\r\n public abstract bindUniformBufferBase(buffer: DataBuffer, _location: number, name: string): void;\r\n\r\n /**\r\n * Bind a specific block at a given index in a specific shader program\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param blockName defines the block name\r\n * @param index defines the index where to bind the block\r\n */\r\n public abstract bindUniformBlock(pipelineContext: IPipelineContext, blockName: string, index: number): void;\r\n\r\n /** @internal */\r\n public _uniformBuffers = new Array<UniformBuffer>();\r\n /** @internal */\r\n public _storageBuffers = new Array<StorageBuffer>();\r\n protected _rebuildBuffers(): void {\r\n // Uniforms\r\n for (const uniformBuffer of this._uniformBuffers) {\r\n uniformBuffer._rebuildAfterContextLost();\r\n }\r\n }\r\n\r\n protected _highPrecisionShadersAllowed = true;\r\n /** @internal */\r\n public get _shouldUseHighPrecisionShader(): boolean {\r\n return !!(this._caps.highPrecisionShaderSupported && this._highPrecisionShadersAllowed);\r\n }\r\n /**\r\n * @internal\r\n */\r\n public abstract _getShaderProcessingContext(shaderLanguage: ShaderLanguage, pureMode: boolean): Nullable<_IShaderProcessingContext>;\r\n\r\n /**\r\n * Gets host document\r\n * @returns the host document object\r\n */\r\n public getHostDocument(): Nullable<Document> {\r\n if (this._renderingCanvas && this._renderingCanvas.ownerDocument) {\r\n return this._renderingCanvas.ownerDocument;\r\n }\r\n\r\n return IsDocumentAvailable() ? document : null;\r\n }\r\n\r\n // Lost context\r\n /**\r\n * Observable signaled when a context lost event is raised\r\n */\r\n public onContextLostObservable = new Observable<AbstractEngine>();\r\n /**\r\n * Observable signaled when a context restored event is raised\r\n */\r\n public onContextRestoredObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Gets the list of loaded textures\r\n * @returns an array containing all loaded textures\r\n */\r\n public getLoadedTexturesCache(): InternalTexture[] {\r\n return this._internalTexturesCache;\r\n }\r\n\r\n /**\r\n * Clears the list of texture accessible through engine.\r\n * This can help preventing texture load conflict due to name collision.\r\n */\r\n public clearInternalTexturesCache() {\r\n this._internalTexturesCache.length = 0;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _releaseTexture(texture: InternalTexture): void;\r\n\r\n /**\r\n * Gets the object containing all engine capabilities\r\n * @returns the EngineCapabilities object\r\n */\r\n public getCaps(): EngineCapabilities {\r\n return this._caps;\r\n }\r\n\r\n /**\r\n * Reset the texture cache to empty state\r\n */\r\n public resetTextureCache() {\r\n for (const key in this._boundTexturesCache) {\r\n if (!Object.prototype.hasOwnProperty.call(this._boundTexturesCache, key)) {\r\n continue;\r\n }\r\n this._boundTexturesCache[key] = null;\r\n }\r\n\r\n this._currentTextureChannel = -1;\r\n }\r\n\r\n /** @internal */\r\n protected _name = \"\";\r\n\r\n /**\r\n * Gets or sets the name of the engine\r\n */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n public set name(value: string) {\r\n this._name = value;\r\n }\r\n\r\n /**\r\n * Returns the current npm package of the sdk\r\n */\r\n // Not mixed with Version for tooling purpose.\r\n public static get NpmPackage(): string {\r\n return \"babylonjs@8.22.1\";\r\n }\r\n\r\n /**\r\n * Returns the current version of the framework\r\n */\r\n public static get Version(): string {\r\n return \"8.22.1\";\r\n }\r\n\r\n /**\r\n * The time (in milliseconds elapsed since the current page has been loaded) when the engine was initialized\r\n */\r\n public readonly startTime: number;\r\n\r\n /** @internal */\r\n protected _audioContext: Nullable<AudioContext>;\r\n /** @internal */\r\n protected _audioDestination: Nullable<AudioDestinationNode | MediaStreamAudioDestinationNode>;\r\n /**\r\n * Gets the HTML canvas attached with the current webGL context\r\n * @returns a HTML canvas\r\n */\r\n public getRenderingCanvas(): Nullable<HTMLCanvasElement> {\r\n return this._renderingCanvas;\r\n }\r\n\r\n /**\r\n * Gets the audio context specified in engine initialization options\r\n * @deprecated please use AudioEngineV2 instead\r\n * @returns an Audio Context\r\n */\r\n public getAudioContext(): Nullable<AudioContext> {\r\n return this._audioContext;\r\n }\r\n\r\n /**\r\n * Gets the audio destination specified in engine initialization options\r\n * @deprecated please use AudioEngineV2 instead\r\n * @returns an audio destination node\r\n */\r\n public getAudioDestination(): Nullable<AudioDestinationNode | MediaStreamAudioDestinationNode> {\r\n return this._audioDestination;\r\n }\r\n\r\n /**\r\n * Defines whether the engine has been created with the premultipliedAlpha option on or not.\r\n */\r\n public premultipliedAlpha: boolean = true;\r\n\r\n /**\r\n * If set to true zooming in and out in the browser will rescale the hardware-scaling correctly.\r\n */\r\n public adaptToDeviceRatio: boolean = false;\r\n\r\n /** @internal */\r\n protected _lastDevicePixelRatio: number = 1.0;\r\n\r\n /** @internal */\r\n public _hardwareScalingLevel: number;\r\n\r\n /**\r\n * Defines the hardware scaling level.\r\n * By default the hardware scaling level is computed from the window device ratio.\r\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\r\n * @param level defines the level to use\r\n */\r\n public setHardwareScalingLevel(level: number): void {\r\n this._hardwareScalingLevel = level;\r\n this.resize();\r\n }\r\n\r\n /**\r\n * Gets the current hardware scaling level.\r\n * By default the hardware scaling level is computed from the window device ratio.\r\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\r\n * @returns a number indicating the current hardware scaling level\r\n */\r\n public getHardwareScalingLevel(): number {\r\n return this._hardwareScalingLevel;\r\n }\r\n\r\n /** @internal */\r\n public _doNotHandleContextLost = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if resources should be retained to be able to handle context lost events\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#handling-webgl-context-lost\r\n */\r\n public get doNotHandleContextLost(): boolean {\r\n return this._doNotHandleContextLost;\r\n }\r\n\r\n public set doNotHandleContextLost(value: boolean) {\r\n this._doNotHandleContextLost = value;\r\n }\r\n\r\n /** @internal */\r\n protected _isStencilEnable: boolean;\r\n\r\n /**\r\n * Returns true if the stencil buffer has been enabled through the creation option of the context.\r\n */\r\n public get isStencilEnable(): boolean {\r\n return this._isStencilEnable;\r\n }\r\n\r\n /** @internal */\r\n protected _creationOptions: AbstractEngineOptions;\r\n\r\n /**\r\n * Gets the options used for engine creation\r\n * @returns EngineOptions object\r\n */\r\n public getCreationOptions() {\r\n return this._creationOptions;\r\n }\r\n\r\n /**\r\n * Creates a new engine\r\n * @param antialias defines whether anti-aliasing should be enabled. If undefined, it means that the underlying engine is free to enable it or not\r\n * @param options defines further options to be sent to the creation context\r\n * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n constructor(antialias: boolean | undefined, options: AbstractEngineOptions, adaptToDeviceRatio?: boolean) {\r\n EngineStore.Instances.push(this);\r\n this.startTime = PrecisionDate.Now;\r\n\r\n this._stencilStateComposer.stencilGlobal = this._stencilState;\r\n\r\n PerformanceConfigurator.SetMatrixPrecision(!!options.useHighPrecisionMatrix);\r\n\r\n if (IsNavigatorAvailable() && navigator.userAgent) {\r\n // Detect if we are running on a faulty buggy OS.\r\n this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent);\r\n\r\n // Detect if we are running on a faulty buggy desktop OS.\r\n this._badDesktopOS = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n }\r\n\r\n // Save this off for use in resize().\r\n this.adaptToDeviceRatio = adaptToDeviceRatio ?? false;\r\n\r\n options.antialias = antialias ?? options.antialias;\r\n options.deterministicLockstep = options.deterministicLockstep ?? false;\r\n options.lockstepMaxSteps = options.lockstepMaxSteps ?? 4;\r\n options.timeStep = options.timeStep ?? 1 / 60;\r\n options.stencil = options.stencil ?? true;\r\n\r\n this._audioContext = options.audioEngineOptions?.audioContext ?? null;\r\n this._audioDestination = options.audioEngineOptions?.audioDestination ?? null;\r\n this.premultipliedAlpha = options.premultipliedAlpha ?? true;\r\n this._doNotHandleContextLost = !!options.doNotHandleContextLost;\r\n this._isStencilEnable = options.stencil ? true : false;\r\n this.useExactSrgbConversions = options.useExactSrgbConversions ?? false;\r\n\r\n const devicePixelRatio = IsWindowObjectExist() ? window.devicePixelRatio || 1.0 : 1.0;\r\n\r\n const limitDeviceRatio = options.limitDeviceRatio || devicePixelRatio;\r\n // Viewport\r\n adaptToDeviceRatio = adaptToDeviceRatio || options.adaptToDeviceRatio || false;\r\n this._hardwareScalingLevel = adaptToDeviceRatio ? 1.0 / Math.min(limitDeviceRatio, devicePixelRatio) : 1.0;\r\n this._lastDevicePixelRatio = devicePixelRatio;\r\n\r\n this._creationOptions = options;\r\n }\r\n\r\n /**\r\n * Resize the view according to the canvas' size\r\n * @param forceSetSize true to force setting the sizes of the underlying canvas\r\n */\r\n public resize(forceSetSize = false): void {\r\n let width: number;\r\n let height: number;\r\n\r\n // Re-query hardware scaling level to handle zoomed-in resizing.\r\n if (this.adaptToDeviceRatio) {\r\n const devicePixelRatio = IsWindowObjectExist() ? window.devicePixelRatio || 1.0 : 1.0;\r\n const changeRatio = this._lastDevicePixelRatio / devicePixelRatio;\r\n this._lastDevicePixelRatio = devicePixelRatio;\r\n this._hardwareScalingLevel *= changeRatio;\r\n }\r\n\r\n if (IsWindowObjectExist() && IsDocumentAvailable()) {\r\n // make sure it is a Node object, and is a part of the document.\r\n if (this._renderingCanvas) {\r\n const boundingRect = this._renderingCanvas.getBoundingClientRect?.();\r\n width = this._renderingCanvas.clientWidth || boundingRect?.width || this._renderingCanvas.width * this._hardwareScalingLevel || 100;\r\n height = this._renderingCanvas.clientHeight || boundingRect?.height || this._renderingCanvas.height * this._hardwareScalingLevel || 100;\r\n } else {\r\n width = window.innerWidth;\r\n height = window.innerHeight;\r\n }\r\n } else {\r\n width = this._renderingCanvas ? this._renderingCanvas.width : 100;\r\n height = this._renderingCanvas ? this._renderingCanvas.height : 100;\r\n }\r\n\r\n this.setSize(width / this._hardwareScalingLevel, height / this._hardwareScalingLevel, forceSetSize);\r\n }\r\n\r\n /**\r\n * Force a specific size of the canvas\r\n * @param width defines the new canvas' width\r\n * @param height defines the new canvas' height\r\n * @param forceSetSize true to force setting the sizes of the underlying canvas\r\n * @returns true if the size was changed\r\n */\r\n public setSize(width: number, height: number, forceSetSize = false): boolean {\r\n if (!this._renderingCanvas) {\r\n return false;\r\n }\r\n\r\n width = width | 0;\r\n height = height | 0;\r\n\r\n if (!forceSetSize && this._renderingCanvas.width === width && this._renderingCanvas.height === height) {\r\n return false;\r\n }\r\n\r\n this._renderingCanvas.width = width;\r\n this._renderingCanvas.height = height;\r\n\r\n if (this.scenes) {\r\n for (let index = 0; index < this.scenes.length; index++) {\r\n const scene = this.scenes[index];\r\n\r\n for (let camIndex = 0; camIndex < scene.cameras.length; camIndex++) {\r\n const cam = scene.cameras[camIndex];\r\n\r\n cam._currentRenderId = 0;\r\n }\r\n }\r\n\r\n if (this.onResizeObservable.hasObservers()) {\r\n this.onResizeObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _releaseBuffer(buffer: DataBuffer): boolean;\r\n\r\n /**\r\n * Create a dynamic uniform buffer\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n * @param elements defines the content of the uniform buffer\r\n * @param label defines a name for the buffer (for debugging purpose)\r\n * @returns the webGL uniform buffer\r\n */\r\n public abstract createDynamicUniformBuffer(elements: FloatArray, label?: string): DataBuffer;\r\n\r\n /**\r\n * Create an uniform buffer\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n * @param elements defines the content of the uniform buffer\r\n * @param label defines a name for the buffer (for debugging purpose)\r\n * @returns the webGL uniform buffer\r\n */\r\n public abstract createUniformBuffer(elements: FloatArray, label?: string): DataBuffer;\r\n\r\n /**\r\n * Update an existing uniform buffer\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n * @param uniformBuffer defines the target uniform buffer\r\n * @param elements defines the content to update\r\n * @param offset defines the offset in the uniform buffer where update should start\r\n * @param count defines the size of the data to update\r\n */\r\n public abstract updateUniformBuffer(uniformBuffer: DataBuffer, elements: FloatArray, offset?: number, count?: number): void;\r\n\r\n /**\r\n * Creates a dynamic vertex buffer\r\n * @param data the data for the dynamic vertex buffer\r\n * @param _label defines the label of the buffer (for debug purpose)\r\n * @returns the new WebGL dynamic buffer\r\n */\r\n public abstract createDynamicVertexBuffer(data: DataArray | number, _label?: string): DataBuffer;\r\n\r\n /**\r\n * Creates a vertex buffer\r\n * @param data the data or size for the vertex buffer\r\n * @param _updatable whether the buffer should be created as updatable\r\n * @param _label defines the label of the buffer (for debug purpose)\r\n * @returns the new WebGL static buffer\r\n */\r\n public abstract createVertexBuffer(data: DataArray | number, _updatable?: boolean, _label?: string): DataBuffer;\r\n\r\n /**\r\n * Update the dimensions of a texture\r\n * @param texture texture to update\r\n * @param width new width of the texture\r\n * @param height new height of the texture\r\n * @param depth new depth of the texture\r\n */\r\n public abstract updateTextureDimensions(texture: InternalTexture, width: number, height: number, depth: number): void;\r\n\r\n /**\r\n * Usually called from Texture.ts.\r\n * Passed information to create a WebGLTexture\r\n * @param url defines a value which contains one of the following:\r\n * * A conventional http URL, e.g. 'http://...' or 'file://...'\r\n * * A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...'\r\n * * An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg'\r\n * @param noMipmap defines a boolean indicating that no mipmaps shall be generated. Ignored for compressed textures. They must be in the file\r\n * @param invertY when true, image is flipped when loaded. You probably want true. Certain compressed textures may invert this if their default is inverted (eg. ktx)\r\n * @param scene needed for loading to the correct scene\r\n * @param samplingMode mode with should be used sample / access the texture (Default: Texture.TRILINEAR_SAMPLINGMODE)\r\n * @param onLoad optional callback to be called upon successful completion\r\n * @param onError optional callback to be called upon failure\r\n * @param buffer a source of a file previously fetched as either a base64 string, an ArrayBuffer (compressed or image format), HTMLImageElement (image format), or a Blob\r\n * @param fallback an internal argument in case the function must be called again, due to etc1 not having alpha capabilities\r\n * @param format internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @param mimeType defines an optional mime type\r\n * @param loaderOptions options to be passed to the loader\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\r\n * @returns a InternalTexture for assignment back into BABYLON.Texture\r\n */\r\n public abstract createTexture(\r\n url: Nullable<string>,\r\n noMipmap: boolean,\r\n invertY: boolean,\r\n scene: Nullable<ISceneLike>,\r\n samplingMode?: number,\r\n onLoad?: Nullable<(texture: InternalTexture) => void>,\r\n onError?: Nullable<(message: string, exception: any) => void>,\r\n buffer?: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap>,\r\n fallback?: Nullable<InternalTexture>,\r\n format?: Nullable<number>,\r\n forcedExtension?: Nullable<string>,\r\n mimeType?: string,\r\n loaderOptions?: any,\r\n creationFlags?: number,\r\n useSRGBBuffer?: boolean\r\n ): InternalTexture;\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a raw texture\r\n * @param data defines the data to store in the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param format defines the format of the data\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default)\r\n * @param compression defines the compression used (null by default)\r\n * @param type defines the type fo the data (Engine.TEXTURETYPE_UNSIGNED_BYTE by default)\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\r\n * @returns the raw texture inside an InternalTexture\r\n */\r\n public createRawTexture(\r\n data: Nullable<ArrayBufferView>,\r\n width: number,\r\n height: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression?: Nullable<string>,\r\n type?: number,\r\n creationFlags?: number,\r\n useSRGBBuffer?: boolean\r\n ): InternalTexture {\r\n throw _WarnImport(\"engine.rawTexture\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a new raw cube texture\r\n * @param data defines the array of data to use to create each face\r\n * @param size defines the size of the textures\r\n * @param format defines the format of the data\r\n * @param type defines the type of the data (like Engine.TEXTURETYPE_UNSIGNED_BYTE)\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compression used (null by default)\r\n * @returns the cube texture as an InternalTexture\r\n */\r\n public createRawCubeTexture(\r\n data: Nullable<ArrayBufferView[]>,\r\n size: number,\r\n format: number,\r\n type: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression?: Nullable<string>\r\n ): InternalTexture {\r\n throw _WarnImport(\"engine.rawTexture\");\r\n }\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a new raw 3D texture\r\n * @param data defines the data used to create the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param depth defines the depth of the texture\r\n * @param format defines the format of the texture\r\n * @param generateMipMaps defines if the engine must generate mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compressed used (can be null)\r\n * @param textureType defines the compressed used (can be null)\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @returns a new raw 3D texture (stored in an InternalTexture)\r\n */\r\n public createRawTexture3D(\r\n data: Nullable<ArrayBufferView>,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression?: Nullable<string>,\r\n textureType?: number,\r\n creationFlags?: number\r\n ): InternalTexture {\r\n throw _WarnImport(\"engine.rawTexture\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a new raw 2D array texture\r\n * @param data defines the data used to create the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param depth defines the number of layers of the texture\r\n * @param format defines the format of the texture\r\n * @param generateMipMaps defines if the engine must generate mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compressed used (can be null)\r\n * @param textureType defines the compressed used (can be null)\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @returns a new raw 2D array texture (stored in an InternalTexture)\r\n */\r\n public createRawTexture2DArray(\r\n data: Nullable<ArrayBufferView>,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression?: Nullable<string>,\r\n textureType?: number,\r\n creationFlags?: number\r\n ): InternalTexture {\r\n throw _WarnImport(\"engine.rawTexture\");\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if back faces must be culled. If false, front faces are culled instead (true by default)\r\n * If non null, this takes precedence over the value from the material\r\n */\r\n public cullBackFaces: Nullable<boolean> = null;\r\n\r\n /**\r\n * Gets the current render width\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the current render width\r\n */\r\n public abstract getRenderWidth(useScreen?: boolean): number;\r\n\r\n /**\r\n * Gets the current render height\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the current render height\r\n */\r\n public abstract getRenderHeight(useScreen?: boolean): number;\r\n\r\n /**\r\n * Shared initialization across engines types.\r\n * @param canvas The canvas associated with this instance of the engine.\r\n */\r\n protected _sharedInit(canvas: HTMLCanvasElement) {\r\n this._renderingCanvas = canvas;\r\n }\r\n\r\n private _checkForMobile: () => void;\r\n\r\n protected _setupMobileChecks(): void {\r\n if (!(navigator && navigator.userAgent)) {\r\n return;\r\n }\r\n\r\n // Function to check if running on mobile device\r\n this._checkForMobile = () => {\r\n const currentUa = navigator.userAgent;\r\n this.hostInformation.isMobile =\r\n currentUa.indexOf(\"Mobile\") !== -1 ||\r\n // Needed for iOS 13+ detection on iPad (inspired by solution from https://stackoverflow.com/questions/9038625/detect-if-device-is-ios)\r\n (currentUa.indexOf(\"Mac\") !== -1 && IsDocumentAvailable() && \"ontouchend\" in document);\r\n };\r\n\r\n // Set initial isMobile value\r\n this._checkForMobile();\r\n\r\n // Set up event listener to check when window is resized (used to get emulator activation to work properly)\r\n if (IsWindowObjectExist()) {\r\n window.addEventListener(\"resize\", this._checkForMobile);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n /** @internal */\r\n public static _RenderPassIdCounter = 0;\r\n\r\n /** @internal */\r\n public _renderPassNames: string[] = [\"main\"];\r\n\r\n /** @internal */\r\n public abstract _createHardwareTexture(): IHardwareTextureWrapper;\r\n\r\n /**\r\n * creates and returns a new video element\r\n * @param constraints video constraints\r\n * @returns video element\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public createVideoElement(constraints: MediaTrackConstraints): any {\r\n return document.createElement(\"video\");\r\n }\r\n\r\n // FPS\r\n protected _fps = 60;\r\n protected _deltaTime = 0;\r\n\r\n /** @internal */\r\n public _drawCalls: PerfCounter;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _reportDrawCall(numDrawCalls = 1) {\r\n this._drawCalls?.addCount(numDrawCalls, false);\r\n }\r\n /**\r\n * Gets the current framerate\r\n * @returns a number representing the framerate\r\n */\r\n public getFps(): number {\r\n return this._fps;\r\n }\r\n\r\n /**\r\n * Gets the time spent between current and previous frame\r\n * @returns a number representing the delta time in ms\r\n */\r\n public getDeltaTime(): number {\r\n return this._deltaTime;\r\n }\r\n\r\n // Deterministic lockstepMaxSteps\r\n /** @internal */\r\n public _deterministicLockstep: boolean = false;\r\n /** @internal */\r\n public _lockstepMaxSteps: number = 4;\r\n /** @internal */\r\n public _timeStep: number = 1 / 60;\r\n\r\n /**\r\n * Gets a boolean indicating that the engine is running in deterministic lock step mode\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @returns true if engine is in deterministic lock step mode\r\n */\r\n public isDeterministicLockStep(): boolean {\r\n return this._deterministicLockstep;\r\n }\r\n\r\n /**\r\n * Gets the max steps when engine is running in deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @returns the max steps\r\n */\r\n public getLockstepMaxSteps(): number {\r\n return this._lockstepMaxSteps;\r\n }\r\n\r\n /**\r\n * Returns the time in ms between steps when using deterministic lock step.\r\n * @returns time step in (ms)\r\n */\r\n public getTimeStep(): number {\r\n return this._timeStep * 1000;\r\n }\r\n\r\n /**\r\n * Engine abstraction for loading and creating an image bitmap from a given source string.\r\n * @param imageSource source to load the image from.\r\n * @param options An object that sets options for the image's extraction.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public _createImageBitmapFromSource(imageSource: string, options?: ImageBitmapOptions): Promise<ImageBitmap> {\r\n throw new Error(\"createImageBitmapFromSource is not implemented\");\r\n }\r\n\r\n /**\r\n * Engine abstraction for createImageBitmap\r\n * @param image source for image\r\n * @param options An object that sets options for the image's extraction.\r\n * @returns ImageBitmap\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap> {\r\n return createImageBitmap(image, options);\r\n }\r\n\r\n /**\r\n * Resize an image and returns the image data as an uint8array\r\n * @param image image to resize\r\n * @param bufferWidth destination buffer width\r\n * @param bufferHeight destination buffer height\r\n */\r\n public resizeImageBitmap(image: HTMLImageElement | ImageBitmap, bufferWidth: number, bufferHeight: number): Uint8Array {\r\n throw new Error(\"resizeImageBitmap is not implemented\");\r\n }\r\n\r\n /**\r\n * Get the current error code of the webGL context\r\n * @returns the error code\r\n */\r\n public abstract getError(): number;\r\n\r\n /**\r\n * Get Font size information\r\n * @param font font name\r\n */\r\n public getFontOffset(font: string): { ascent: number; height: number; descent: number } {\r\n throw new Error(\"getFontOffset is not implemented\");\r\n }\r\n\r\n protected static _CreateCanvas(width: number, height: number): ICanvas {\r\n if (typeof document === \"undefined\") {\r\n return <ICanvas>(<any>new OffscreenCanvas(width, height));\r\n }\r\n const canvas = <ICanvas>(<any>document.createElement(\"canvas\"));\r\n canvas.width = width;\r\n canvas.height = height;\r\n return canvas;\r\n }\r\n\r\n /**\r\n * Create a canvas. This method is overridden by other engines\r\n * @param width width\r\n * @param height height\r\n * @returns ICanvas interface\r\n */\r\n public createCanvas(width: number, height: number): ICanvas {\r\n return AbstractEngine._CreateCanvas(width, height);\r\n }\r\n\r\n /**\r\n * Loads an image as an HTMLImageElement.\r\n * @param input url string, ArrayBuffer, or Blob to load\r\n * @param onLoad callback called when the image successfully loads\r\n * @param onError callback called when the image fails to load\r\n * @param offlineProvider offline provider for caching\r\n * @param mimeType optional mime type\r\n * @param imageBitmapOptions optional the options to use when creating an ImageBitmap\r\n * @param engine the engine instance to use\r\n * @returns the HTMLImageElement of the loaded image\r\n * @internal\r\n */\r\n public static _FileToolsLoadImage(\r\n input: string | ArrayBuffer | ArrayBufferView | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string, exception?: any) => void,\r\n offlineProvider: Nullable<IOfflineProvider>,\r\n mimeType?: string,\r\n imageBitmapOptions?: ImageBitmapOptions,\r\n engine?: AbstractEngine\r\n ): Nullable<HTMLImageElement> {\r\n throw _WarnImport(\"FileTools\");\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (data: any) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: IWebRequest, exception?: any) => void\r\n ): IFileRequest {\r\n const request = _LoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);\r\n this._activeRequests.push(request);\r\n request.onCompleteObservable.add(() => {\r\n const index = this._activeRequests.indexOf(request);\r\n if (index !== -1) {\r\n this._activeRequests.splice(index, 1);\r\n }\r\n });\r\n return request;\r\n }\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @returns a file request object\r\n * @internal\r\n */\r\n public static _FileToolsLoadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void\r\n ): IFileRequest {\r\n if (EngineFunctionContext.loadFile) {\r\n return EngineFunctionContext.loadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);\r\n }\r\n throw _WarnImport(\"FileTools\");\r\n }\r\n\r\n /**\r\n * An event triggered when the engine is disposed.\r\n */\r\n public readonly onDisposeObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * An event triggered when a global cleanup of all effects is required\r\n */\r\n public readonly onReleaseEffectsObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Dispose and release all associated resources\r\n */\r\n public dispose(): void {\r\n this.releaseEffects();\r\n\r\n this._isDisposed = true;\r\n this.stopRenderLoop();\r\n\r\n // Empty texture\r\n if (this._emptyTexture) {\r\n this._releaseTexture(this._emptyTexture);\r\n this._emptyTexture = null;\r\n }\r\n if (this._emptyCubeTexture) {\r\n this._releaseTexture(this._emptyCubeTexture);\r\n this._emptyCubeTexture = null;\r\n }\r\n\r\n this._renderingCanvas = null;\r\n\r\n // Clear observables\r\n if (this.onBeforeTextureInitObservable) {\r\n this.onBeforeTextureInitObservable.clear();\r\n }\r\n\r\n // Release postProcesses\r\n while (this.postProcesses.length) {\r\n this.postProcesses[0].dispose();\r\n }\r\n\r\n // Release scenes\r\n while (this.scenes.length) {\r\n this.scenes[0].dispose();\r\n }\r\n\r\n while (this._virtualScenes.length) {\r\n this._virtualScenes[0].dispose();\r\n }\r\n\r\n // Release effects\r\n this.releaseComputeEffects?.();\r\n\r\n Effect.ResetCache();\r\n\r\n // Abort active requests\r\n for (const request of this._activeRequests) {\r\n request.abort();\r\n }\r\n\r\n this._boundRenderFunction = null;\r\n\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n\r\n this.onResizeObservable.clear();\r\n this.onCanvasBlurObservable.clear();\r\n this.onCanvasFocusObservable.clear();\r\n this.onCanvasPointerOutObservable.clear();\r\n this.onNewSceneAddedObservable.clear();\r\n this.onEffectErrorObservable.clear();\r\n\r\n if (IsWindowObjectExist()) {\r\n window.removeEventListener(\"resize\", this._checkForMobile);\r\n }\r\n\r\n // Remove from Instances\r\n const index = EngineStore.Instances.indexOf(this);\r\n\r\n if (index >= 0) {\r\n EngineStore.Instances.splice(index, 1);\r\n }\r\n\r\n // no more engines left in the engine store? Notify!\r\n if (!EngineStore.Instances.length) {\r\n EngineStore.OnEnginesDisposedObservable.notifyObservers(this);\r\n EngineStore.OnEnginesDisposedObservable.clear();\r\n }\r\n\r\n // Observables\r\n this.onBeginFrameObservable.clear();\r\n this.onEndFrameObservable.clear();\r\n }\r\n\r\n /**\r\n * Method called to create the default rescale post process on each engine.\r\n */\r\n public static _RescalePostProcessFactory: Nullable<(engine: AbstractEngine) => PostProcess> = null;\r\n\r\n /**\r\n * Method called to create the default loading screen.\r\n * This can be overridden in your own app.\r\n * @param canvas The rendering canvas element\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static DefaultLoadingScreenFactory(canvas: HTMLCanvasElement): ILoadingScreen {\r\n throw _WarnImport(\"LoadingScreen\");\r\n }\r\n\r\n /**\r\n * Gets the audio engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/audio/playingSoundsMusic\r\n * @deprecated please use AudioEngineV2 instead\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static audioEngine: Nullable<IAudioEngine>;\r\n\r\n /**\r\n * Default AudioEngine factory responsible of creating the Audio Engine.\r\n * By default, this will create a BabylonJS Audio Engine if the workload has been embedded.\r\n * @deprecated please use AudioEngineV2 instead\r\n */\r\n public static AudioEngineFactory: (\r\n hostElement: Nullable<HTMLElement>,\r\n audioContext: Nullable<AudioContext>,\r\n audioDestination: Nullable<AudioDestinationNode | MediaStreamAudioDestinationNode>\r\n ) => IAudioEngine;\r\n\r\n /**\r\n * Default offline support factory responsible of creating a tool used to store data locally.\r\n * By default, this will create a Database object if the workload has been embedded.\r\n */\r\n public static OfflineProviderFactory: (urlToScene: string, callbackManifestChecked: (checked: boolean) => any, disableManifestCheck: boolean) => IOfflineProvider;\r\n\r\n /**\r\n * Will flag all materials in all scenes in all engines as dirty to trigger new shader compilation\r\n * @param flag defines which part of the materials must be marked as dirty\r\n * @param predicate defines a predicate used to filter which materials should be affected\r\n */\r\n public static MarkAllMaterialsAsDirty(flag: number, predicate?: (mat: Material) => boolean): void {\r\n for (let engineIndex = 0; engineIndex < EngineStore.Instances.length; engineIndex++) {\r\n const engine = EngineStore.Instances[engineIndex];\r\n\r\n for (let sceneIndex = 0; sceneIndex < engine.scenes.length; sceneIndex++) {\r\n engine.scenes[sceneIndex].markAllMaterialsAsDirty(flag, predicate);\r\n }\r\n }\r\n }\r\n\r\n // Updatable statics so stick with vars here\r\n\r\n /**\r\n * Gets or sets the epsilon value used by collision engine\r\n */\r\n public static CollisionsEpsilon = 0.001;\r\n\r\n /**\r\n * Queue a new function into the requested animation frame pool (ie. this function will be executed by the browser (or the javascript engine) for the next frame)\r\n * @param func - the function to be called\r\n * @param requester - the object that will request the next frame. Falls back to window.\r\n * @returns frame number\r\n */\r\n public static QueueNewFrame: (func: () => void, requester?: any) => number = QueueNewFrame;\r\n}\r\n"]}
1
+ {"version":3,"file":"abstractEngine.js","sourceRoot":"","sources":["../../../../dev/core/src/Engines/abstractEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport type { DataArray, FloatArray, IndicesArray, Nullable } from \"../types\";\r\nimport type { PerfCounter } from \"../Misc/perfCounter\";\r\nimport type { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { IColor4Like, IViewportLike } from \"../Maths/math.like\";\r\nimport type { ICanvas, IImage, IPath2D } from \"./ICanvas\";\r\nimport type { IHardwareTextureWrapper } from \"../Materials/Textures/hardwareTextureWrapper\";\r\nimport type { EngineCapabilities } from \"./engineCapabilities\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport type { RenderTargetWrapper } from \"./renderTargetWrapper\";\r\nimport type { IShaderProcessor } from \"./Processors/iShaderProcessor\";\r\nimport type { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\nimport type { IAudioEngineOptions } from \"../Audio/Interfaces/IAudioEngineOptions\";\r\nimport type { EngineFeatures } from \"./engineFeatures\";\r\nimport type { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport type { StorageBuffer } from \"../Buffers/storageBuffer\";\r\nimport type { IEffectCreationOptions, IShaderPath } from \"../Materials/effect\";\r\nimport type { IOfflineProvider } from \"../Offline/IOfflineProvider\";\r\nimport type { IWebRequest } from \"../Misc/interfaces/iWebRequest\";\r\nimport type { IFileRequest } from \"../Misc/fileRequest\";\r\nimport type { Texture } from \"../Materials/Textures/texture\";\r\nimport type { LoadFileError } from \"../Misc/fileTools\";\r\nimport type { _IShaderProcessingContext } from \"./Processors/shaderProcessingOptions\";\r\nimport type { IPipelineContext } from \"./IPipelineContext\";\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { InternalTextureCreationOptions, TextureSize } from \"../Materials/Textures/textureCreationOptions\";\r\nimport type { EffectFallbacks } from \"../Materials/effectFallbacks\";\r\nimport type { IMaterialContext } from \"./IMaterialContext\";\r\nimport type { IStencilState } from \"../States/IStencilState\";\r\nimport type { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { IDrawContext } from \"./IDrawContext\";\r\nimport type { VertexBuffer } from \"../Meshes/buffer\";\r\nimport type { IAudioEngine } from \"../Audio/Interfaces/IAudioEngine\";\r\nimport type { WebRequest } from \"core/Misc/webRequest\";\r\nimport type { PerformanceMonitor } from \"core/Misc/performanceMonitor\";\r\nimport type { ILoadingScreen } from \"../Loading/loadingScreen\";\r\nimport { EngineStore } from \"./engineStore\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { PerformanceConfigurator } from \"./performanceConfigurator\";\r\nimport { PrecisionDate } from \"../Misc/precisionDate\";\r\nimport { DepthCullingState } from \"../States/depthCullingState\";\r\nimport { StencilStateComposer } from \"../States/stencilStateComposer\";\r\nimport { StencilState } from \"../States/stencilState\";\r\nimport { AlphaState } from \"../States/alphaCullingState\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { InternalTexture, InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport { IsDocumentAvailable, IsNavigatorAvailable, IsWindowObjectExist } from \"../Misc/domManagement\";\r\nimport { Constants } from \"./constants\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { EngineFunctionContext, _LoadFile } from \"./abstractEngine.functions\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { _GetCompatibleTextureLoader } from \"core/Materials/Textures/Loaders/textureLoaderManager\";\r\n\r\n/**\r\n * Defines the interface used by objects working like Scene\r\n * @internal\r\n */\r\nexport interface ISceneLike {\r\n /** Add pending data (to load) */\r\n addPendingData(data: any): void;\r\n /** Remove pending data */\r\n removePendingData(data: any): void;\r\n /** Offline provider */\r\n offlineProvider: IOfflineProvider;\r\n}\r\n\r\n/**\r\n * Queue a new function into the requested animation frame pool (ie. this function will be executed by the browser (or the javascript engine) for the next frame)\r\n * @param func - the function to be called\r\n * @param requester - the object that will request the next frame. Falls back to window.\r\n * @returns frame number\r\n */\r\nexport function QueueNewFrame(func: () => void, requester?: any): number {\r\n // Note that there is kind of a typing issue here, as `setTimeout` might return something else than a number (NodeJs returns a NodeJS.Timeout object).\r\n // Also if the global `requestAnimationFrame`'s returnType is number, `requester.requestPostAnimationFrame` and `requester.requestAnimationFrame` types\r\n // are `any`.\r\n\r\n if (!IsWindowObjectExist()) {\r\n if (typeof requestAnimationFrame === \"function\") {\r\n return requestAnimationFrame(func);\r\n }\r\n } else {\r\n const { requestAnimationFrame } = (requester || window) as { requestAnimationFrame: (callback: FrameRequestCallback) => number };\r\n if (typeof requestAnimationFrame === \"function\") {\r\n return requestAnimationFrame(func);\r\n }\r\n }\r\n\r\n // fallback to the global `setTimeout`.\r\n // In most cases (aka in the browser), `window` is the global object, so instead of calling `window.setTimeout` we could call the global `setTimeout`.\r\n return setTimeout(func, 16) as unknown as number;\r\n}\r\n\r\n/** Interface defining initialization parameters for AbstractEngine class */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface AbstractEngineOptions {\r\n /**\r\n * Defines if the engine should no exceed a specified device ratio\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio\r\n */\r\n limitDeviceRatio?: number;\r\n /**\r\n * Defines if webaudio should be initialized as well\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/audio/playingSoundsMusic\r\n */\r\n audioEngine?: boolean;\r\n /**\r\n * Specifies options for the audio engine\r\n */\r\n audioEngineOptions?: IAudioEngineOptions;\r\n\r\n /**\r\n * Defines if animations should run using a deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n */\r\n deterministicLockstep?: boolean;\r\n /** Defines the maximum steps to use with deterministic lock step mode */\r\n lockstepMaxSteps?: number;\r\n /** Defines the seconds between each deterministic lock step */\r\n timeStep?: number;\r\n /**\r\n * Defines that engine should ignore context lost events\r\n * If this event happens when this parameter is true, you will have to reload the page to restore rendering\r\n */\r\n doNotHandleContextLost?: boolean;\r\n /**\r\n * Defines that engine should ignore modifying touch action attribute and style\r\n * If not handle, you might need to set it up on your side for expected touch devices behavior.\r\n */\r\n doNotHandleTouchAction?: boolean;\r\n\r\n /**\r\n * Make the matrix computations to be performed in 64 bits instead of 32 bits. False by default\r\n */\r\n useHighPrecisionMatrix?: boolean;\r\n\r\n /**\r\n * Defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n adaptToDeviceRatio?: boolean;\r\n\r\n /**\r\n * Defines whether MSAA is enabled on the canvas.\r\n */\r\n antialias?: boolean;\r\n\r\n /**\r\n * Defines whether the stencil buffer should be enabled.\r\n */\r\n stencil?: boolean;\r\n\r\n /**\r\n * Defines whether the canvas should be created in \"premultiplied\" mode (if false, the canvas is created in the \"opaque\" mode) (true by default)\r\n */\r\n premultipliedAlpha?: boolean;\r\n /**\r\n * True if the more expensive but exact conversions should be used for transforming colors to and from linear space within shaders.\r\n * Otherwise, the default is to use a cheaper approximation.\r\n */\r\n useExactSrgbConversions?: boolean;\r\n}\r\n\r\n/**\r\n * Information about the current host\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface HostInformation {\r\n /**\r\n * Defines if the current host is a mobile\r\n */\r\n isMobile: boolean;\r\n}\r\n\r\nexport type PrepareTextureProcessFunction = (\r\n width: number,\r\n height: number,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n extension: string,\r\n texture: InternalTexture,\r\n continuationCallback: () => void\r\n) => boolean;\r\n\r\nexport type PrepareTextureFunction = (\r\n texture: InternalTexture,\r\n extension: string,\r\n scene: Nullable<ISceneLike>,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n invertY: boolean,\r\n noMipmap: boolean,\r\n isCompressed: boolean,\r\n processFunction: PrepareTextureProcessFunction,\r\n samplingMode: number\r\n) => void;\r\n\r\n/**\r\n * The parent class for specialized engines (WebGL, WebGPU)\r\n */\r\nexport abstract class AbstractEngine {\r\n // States\r\n /** @internal */\r\n protected _colorWrite = true;\r\n /** @internal */\r\n protected _colorWriteChanged = true;\r\n /** @internal */\r\n public _depthCullingState = new DepthCullingState();\r\n /** @internal */\r\n protected _stencilStateComposer = new StencilStateComposer();\r\n /** @internal */\r\n public _stencilState = new StencilState();\r\n /** @internal */\r\n public _alphaState = new AlphaState();\r\n /** @internal */\r\n public _alphaMode = Array(8).fill(-1);\r\n /** @internal */\r\n public _alphaEquation = Array(8).fill(-1);\r\n\r\n protected _activeRequests: IFileRequest[] = [];\r\n\r\n /** @internal */\r\n public _badOS = false;\r\n /** @internal */\r\n public _badDesktopOS = false;\r\n /** @internal */\r\n public _videoTextureSupported: boolean;\r\n\r\n protected _compatibilityMode = true;\r\n /** @internal */\r\n public _pointerLockRequested: boolean;\r\n /** @internal */\r\n public _loadingScreen: ILoadingScreen;\r\n /** @internal */\r\n public _renderingCanvas: Nullable<HTMLCanvasElement>;\r\n /** @internal */\r\n public _internalTexturesCache = new Array<InternalTexture>();\r\n protected _currentEffect: Nullable<Effect>;\r\n /** @internal */\r\n protected _cachedVertexBuffers: any;\r\n /** @internal */\r\n protected _cachedIndexBuffer: Nullable<DataBuffer>;\r\n /** @internal */\r\n protected _cachedEffectForVertexBuffers: Nullable<Effect>;\r\n /** @internal */\r\n public _currentRenderTarget: Nullable<RenderTargetWrapper> = null;\r\n /** @internal */\r\n public _caps: EngineCapabilities;\r\n /** @internal */\r\n protected _cachedViewport: Nullable<IViewportLike>;\r\n /** @internal */\r\n public _currentDrawContext: IDrawContext;\r\n /** @internal */\r\n public _currentMaterialContext: IMaterialContext;\r\n\r\n /** @internal */\r\n protected _boundTexturesCache: { [key: string]: Nullable<InternalTexture> } = {};\r\n /** @internal */\r\n protected _activeChannel = 0;\r\n /** @internal */\r\n protected _currentTextureChannel = -1;\r\n /** @internal */\r\n protected _viewportCached = { x: 0, y: 0, z: 0, w: 0 };\r\n\r\n /** @internal */\r\n protected _isWebGPU: boolean = false;\r\n\r\n // Focus\r\n /** @internal */\r\n public _onFocus: () => void;\r\n /** @internal */\r\n public _onBlur: () => void;\r\n /** @internal */\r\n public _onCanvasPointerOut: (event: PointerEvent) => void;\r\n /** @internal */\r\n public _onCanvasBlur: () => void;\r\n /** @internal */\r\n public _onCanvasFocus: () => void;\r\n /** @internal */\r\n public _onCanvasContextMenu: (evt: Event) => void;\r\n /** @internal */\r\n public _onFullscreenChange: () => void;\r\n\r\n /**\r\n * Observable event triggered each time the canvas loses focus\r\n */\r\n public onCanvasBlurObservable = new Observable<AbstractEngine>();\r\n /**\r\n * Observable event triggered each time the canvas gains focus\r\n */\r\n public onCanvasFocusObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Event raised when a new scene is created\r\n */\r\n public onNewSceneAddedObservable = new Observable<Scene>();\r\n\r\n /**\r\n * Observable event triggered each time the rendering canvas is resized\r\n */\r\n public onResizeObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Observable event triggered each time the canvas receives pointerout event\r\n */\r\n public onCanvasPointerOutObservable = new Observable<PointerEvent>();\r\n\r\n /**\r\n * Observable event triggered each time an effect compilation fails\r\n */\r\n public onEffectErrorObservable = new Observable<{ effect: Effect; errors: string }>();\r\n\r\n /**\r\n * Turn this value on if you want to pause FPS computation when in background\r\n */\r\n public disablePerformanceMonitorInBackground = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that vertex array object must be disabled even if they are supported\r\n */\r\n public disableVertexArrayObjects = false;\r\n\r\n /** @internal */\r\n protected _frameId = 0;\r\n /**\r\n * Gets the current frame id\r\n */\r\n public get frameId(): number {\r\n return this._frameId;\r\n }\r\n /**\r\n * Gets a boolean indicating if the engine runs in WebGPU or not.\r\n */\r\n public get isWebGPU(): boolean {\r\n return this._isWebGPU;\r\n }\r\n\r\n protected _shaderProcessor: Nullable<IShaderProcessor>;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getShaderProcessor(_shaderLanguage: ShaderLanguage): Nullable<IShaderProcessor> {\r\n return this._shaderProcessor;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _resetAlphaMode(): void {\r\n this._alphaMode.fill(-1);\r\n this._alphaEquation.fill(-1);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if all created effects are ready\r\n * @returns true if all effects are ready\r\n */\r\n public abstract areAllEffectsReady(): boolean;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _executeWhenRenderingStateIsCompiled(pipelineContext: IPipelineContext, action: () => void): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _setTexture(channel: number, texture: Nullable<ThinTexture>, isPartOfTextureArray?: boolean, depthStencilTexture?: boolean, name?: string): boolean;\r\n\r\n /**\r\n * Sets a texture to the according uniform.\r\n * @param channel The texture channel\r\n * @param unused unused parameter\r\n * @param texture The texture to apply\r\n * @param name The name of the uniform in the effect\r\n */\r\n public abstract setTexture(channel: number, unused: Nullable<WebGLUniformLocation>, texture: Nullable<ThinTexture>, name: string): void;\r\n\r\n /**\r\n * Binds an effect to the webGL context\r\n * @param effect defines the effect to bind\r\n */\r\n public abstract bindSamplers(effect: Effect): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _bindTexture(channel: number, texture: Nullable<InternalTexture>, name: string): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _deletePipelineContext(pipelineContext: IPipelineContext): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _preparePipelineContextAsync(\r\n pipelineContext: IPipelineContext,\r\n vertexSourceCode: string,\r\n fragmentSourceCode: string,\r\n createAsRaw: boolean,\r\n rawVertexSourceCode: string,\r\n rawFragmentSourceCode: string,\r\n rebuildRebind: any,\r\n defines: Nullable<string>,\r\n transformFeedbackVaryings: Nullable<string[]>,\r\n key: string,\r\n onReady: () => void\r\n ): void;\r\n\r\n /** @internal */\r\n protected _shaderPlatformName: string;\r\n /**\r\n * Gets the shader platform name used by the effects.\r\n */\r\n public get shaderPlatformName(): string {\r\n return this._shaderPlatformName;\r\n }\r\n\r\n /**\r\n * Gets information about the current host\r\n */\r\n public hostInformation: HostInformation = {\r\n isMobile: false,\r\n };\r\n\r\n /**\r\n * Gets a boolean indicating if the engine is currently rendering in fullscreen mode\r\n */\r\n public isFullscreen = false;\r\n\r\n /**\r\n * Gets or sets a boolean to enable/disable IndexedDB support and avoid XHR on .manifest\r\n **/\r\n public enableOfflineSupport = false;\r\n\r\n /**\r\n * Gets or sets a boolean to enable/disable checking manifest if IndexedDB support is enabled (js will always consider the database is up to date)\r\n **/\r\n public disableManifestCheck = false;\r\n\r\n /**\r\n * Gets or sets a boolean to enable/disable the context menu (right-click) from appearing on the main canvas\r\n */\r\n public disableContextMenu: boolean = true;\r\n\r\n /**\r\n * Gets or sets the current render pass id\r\n */\r\n public currentRenderPassId = Constants.RENDERPASS_MAIN;\r\n\r\n /**\r\n * Gets a boolean indicating if the pointer is currently locked\r\n */\r\n public isPointerLock = false;\r\n\r\n /**\r\n * Gets the list of created postprocesses\r\n */\r\n public postProcesses: PostProcess[] = [];\r\n\r\n /** Gets or sets the tab index to set to the rendering canvas. 1 is the minimum value to set to be able to capture keyboard events */\r\n public canvasTabIndex = 1;\r\n\r\n /** @internal */\r\n protected _onContextLost: (evt: Event) => void;\r\n /** @internal */\r\n protected _onContextRestored: (evt: Event) => void;\r\n /** @internal */\r\n protected _contextWasLost = false;\r\n\r\n private _emptyTexture: Nullable<InternalTexture>;\r\n private _emptyCubeTexture: Nullable<InternalTexture>;\r\n private _emptyTexture3D: Nullable<InternalTexture>;\r\n private _emptyTexture2DArray: Nullable<InternalTexture>;\r\n\r\n protected _clearEmptyResources(): void {\r\n this._emptyTexture = null;\r\n this._emptyCubeTexture = null;\r\n this._emptyTexture3D = null;\r\n this._emptyTexture2DArray = null;\r\n }\r\n\r\n public abstract wipeCaches(bruteForce?: boolean): void;\r\n\r\n private _useReverseDepthBuffer = false;\r\n /**\r\n * Gets or sets a boolean indicating if depth buffer should be reverse, going from far to near.\r\n * This can provide greater z depth for distant objects.\r\n */\r\n public get useReverseDepthBuffer(): boolean {\r\n return this._useReverseDepthBuffer;\r\n }\r\n\r\n public set useReverseDepthBuffer(useReverse) {\r\n if (useReverse === this._useReverseDepthBuffer) {\r\n return;\r\n }\r\n\r\n this._useReverseDepthBuffer = useReverse;\r\n\r\n if (useReverse) {\r\n this._depthCullingState.depthFunc = Constants.GEQUAL;\r\n } else {\r\n this._depthCullingState.depthFunc = Constants.LEQUAL;\r\n }\r\n }\r\n\r\n /**\r\n * Enable or disable color writing\r\n * @param enable defines the state to set\r\n */\r\n public setColorWrite(enable: boolean): void {\r\n if (enable !== this._colorWrite) {\r\n this._colorWriteChanged = true;\r\n this._colorWrite = enable;\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if color writing is enabled\r\n * @returns the current color writing state\r\n */\r\n public getColorWrite(): boolean {\r\n return this._colorWrite;\r\n }\r\n\r\n /**\r\n * Gets the depth culling state manager\r\n */\r\n public get depthCullingState(): DepthCullingState {\r\n return this._depthCullingState;\r\n }\r\n\r\n /**\r\n * Gets the alpha state manager\r\n */\r\n public get alphaState(): AlphaState {\r\n return this._alphaState;\r\n }\r\n\r\n /**\r\n * Gets the stencil state manager\r\n */\r\n public get stencilState(): StencilState {\r\n return this._stencilState;\r\n }\r\n\r\n /**\r\n * Gets the stencil state composer\r\n */\r\n public get stencilStateComposer(): StencilStateComposer {\r\n return this._stencilStateComposer;\r\n }\r\n\r\n /**\r\n * Indicates if the z range in NDC space is 0..1 (value: true) or -1..1 (value: false)\r\n */\r\n public readonly isNDCHalfZRange: boolean = false;\r\n\r\n /**\r\n * Indicates that the origin of the texture/framebuffer space is the bottom left corner. If false, the origin is top left\r\n */\r\n public readonly hasOriginBottomLeft: boolean = true;\r\n\r\n /**\r\n * Gets a boolean indicating if the exact sRGB conversions or faster approximations are used for converting to and from linear space.\r\n */\r\n public readonly useExactSrgbConversions: boolean;\r\n\r\n /** @internal */\r\n public _getGlobalDefines(defines?: { [key: string]: string }): string | undefined {\r\n if (defines) {\r\n if (this.isNDCHalfZRange) {\r\n defines[\"IS_NDC_HALF_ZRANGE\"] = \"\";\r\n } else {\r\n delete defines[\"IS_NDC_HALF_ZRANGE\"];\r\n }\r\n if (this.useReverseDepthBuffer) {\r\n defines[\"USE_REVERSE_DEPTHBUFFER\"] = \"\";\r\n } else {\r\n delete defines[\"USE_REVERSE_DEPTHBUFFER\"];\r\n }\r\n if (this.useExactSrgbConversions) {\r\n defines[\"USE_EXACT_SRGB_CONVERSIONS\"] = \"\";\r\n } else {\r\n delete defines[\"USE_EXACT_SRGB_CONVERSIONS\"];\r\n }\r\n return;\r\n } else {\r\n let s = \"\";\r\n if (this.isNDCHalfZRange) {\r\n s += \"#define IS_NDC_HALF_ZRANGE\";\r\n }\r\n if (this.useReverseDepthBuffer) {\r\n if (s) {\r\n s += \"\\n\";\r\n }\r\n s += \"#define USE_REVERSE_DEPTHBUFFER\";\r\n }\r\n if (this.useExactSrgbConversions) {\r\n if (s) {\r\n s += \"\\n\";\r\n }\r\n s += \"#define USE_EXACT_SRGB_CONVERSIONS\";\r\n }\r\n return s;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _renderTargetWrapperCache = new Array<RenderTargetWrapper>();\r\n /** @internal */\r\n protected _compiledEffects: { [key: string]: Effect } = {};\r\n\r\n private _rebuildInternalTextures(): void {\r\n const currentState = this._internalTexturesCache.slice(); // Do a copy because the rebuild will add proxies\r\n\r\n for (const internalTexture of currentState) {\r\n internalTexture._rebuild();\r\n }\r\n }\r\n\r\n private _rebuildRenderTargetWrappers(): void {\r\n const currentState = this._renderTargetWrapperCache.slice(); // Do a copy because the rebuild will add proxies\r\n\r\n for (const renderTargetWrapper of currentState) {\r\n renderTargetWrapper._rebuild();\r\n }\r\n }\r\n\r\n private _rebuildEffects(): void {\r\n for (const key in this._compiledEffects) {\r\n const effect = this._compiledEffects[key];\r\n\r\n effect._pipelineContext = null; // because _prepareEffect will try to dispose this pipeline before recreating it and that would lead to webgl errors\r\n effect._prepareEffect();\r\n }\r\n\r\n Effect.ResetCache();\r\n }\r\n\r\n protected _rebuildGraphicsResources(): void {\r\n // Ensure webgl and engine states are matching\r\n this.wipeCaches(true);\r\n\r\n // Rebuild effects\r\n this._rebuildEffects();\r\n this._rebuildComputeEffects?.();\r\n\r\n // Note:\r\n // The call to _rebuildBuffers must be made before the call to _rebuildInternalTextures because in the process of _rebuildBuffers the buffers used by the post process managers will be rebuilt\r\n // and we may need to use the post process manager of the scene during _rebuildInternalTextures (in WebGL1, non-POT textures are rescaled using a post process + post process manager of the scene)\r\n\r\n // Rebuild buffers\r\n this._rebuildBuffers();\r\n // Rebuild textures\r\n this._rebuildInternalTextures();\r\n // Rebuild textures\r\n this._rebuildTextures();\r\n // Rebuild textures\r\n this._rebuildRenderTargetWrappers();\r\n\r\n // Reset engine states after all the buffer/textures/... have been rebuilt\r\n this.wipeCaches(true);\r\n }\r\n\r\n protected _flagContextRestored(): void {\r\n Logger.Warn(this.name + \" context successfully restored.\");\r\n this.onContextRestoredObservable.notifyObservers(this);\r\n this._contextWasLost = false;\r\n }\r\n\r\n protected _restoreEngineAfterContextLost(initEngine: () => void): void {\r\n // Adding a timeout to avoid race condition at browser level\r\n setTimeout(() => {\r\n this._clearEmptyResources();\r\n\r\n const depthTest = this._depthCullingState.depthTest; // backup those values because the call to initEngine / wipeCaches will reset them\r\n const depthFunc = this._depthCullingState.depthFunc;\r\n const depthMask = this._depthCullingState.depthMask;\r\n const stencilTest = this._stencilState.stencilTest;\r\n\r\n // Rebuild context\r\n initEngine();\r\n this._rebuildGraphicsResources();\r\n\r\n this._depthCullingState.depthTest = depthTest;\r\n this._depthCullingState.depthFunc = depthFunc;\r\n this._depthCullingState.depthMask = depthMask;\r\n this._stencilState.stencilTest = stencilTest;\r\n\r\n this._flagContextRestored();\r\n }, 0);\r\n }\r\n\r\n /** @internal */\r\n protected _isDisposed = false;\r\n\r\n /** Gets a boolean indicating if the engine was disposed */\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * Gets the list of created scenes\r\n */\r\n public scenes: Scene[] = [];\r\n\r\n /** @internal */\r\n public _virtualScenes = new Array<Scene>();\r\n\r\n /** @internal */\r\n public _features: EngineFeatures;\r\n\r\n /**\r\n * Enables or disables the snapshot rendering mode\r\n * Note that the WebGL engine does not support snapshot rendering so setting the value won't have any effect for this engine\r\n */\r\n public get snapshotRendering(): boolean {\r\n return false;\r\n }\r\n\r\n public set snapshotRendering(activate) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Gets or sets the snapshot rendering mode\r\n */\r\n public get snapshotRenderingMode(): number {\r\n return Constants.SNAPSHOTRENDERING_STANDARD;\r\n }\r\n\r\n public set snapshotRenderingMode(mode: number) {}\r\n\r\n /**\r\n * Observable event triggered before each texture is initialized\r\n */\r\n public onBeforeTextureInitObservable = new Observable<Texture>();\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the engine must keep rendering even if the window is not in foreground\r\n */\r\n public renderEvenInBackground = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that cache can be kept between frames\r\n */\r\n public preventCacheWipeBetweenFrames = false;\r\n\r\n /**\r\n * Returns the string \"AbstractEngine\"\r\n * @returns \"AbstractEngine\"\r\n */\r\n public getClassName(): string {\r\n return \"AbstractEngine\";\r\n }\r\n\r\n /**\r\n * Gets the default empty texture\r\n */\r\n public get emptyTexture(): InternalTexture {\r\n if (!this._emptyTexture) {\r\n this._emptyTexture = this.createRawTexture(new Uint8Array(4), 1, 1, Constants.TEXTUREFORMAT_RGBA, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n return this._emptyTexture;\r\n }\r\n\r\n /**\r\n * Gets the default empty 3D texture\r\n */\r\n public get emptyTexture3D(): InternalTexture {\r\n if (!this._emptyTexture3D) {\r\n this._emptyTexture3D = this.createRawTexture3D(new Uint8Array(4), 1, 1, 1, Constants.TEXTUREFORMAT_RGBA, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n return this._emptyTexture3D;\r\n }\r\n\r\n /**\r\n * Gets the default empty 2D array texture\r\n */\r\n public get emptyTexture2DArray(): InternalTexture {\r\n if (!this._emptyTexture2DArray) {\r\n this._emptyTexture2DArray = this.createRawTexture2DArray(\r\n new Uint8Array(4),\r\n 1,\r\n 1,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE\r\n );\r\n }\r\n\r\n return this._emptyTexture2DArray;\r\n }\r\n\r\n /**\r\n * Gets the default empty cube texture\r\n */\r\n public get emptyCubeTexture(): InternalTexture {\r\n if (!this._emptyCubeTexture) {\r\n const faceData = new Uint8Array(4);\r\n const cubeData = [faceData, faceData, faceData, faceData, faceData, faceData];\r\n this._emptyCubeTexture = this.createRawCubeTexture(\r\n cubeData,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE\r\n );\r\n }\r\n\r\n return this._emptyCubeTexture;\r\n }\r\n\r\n /** @internal */\r\n public _frameHandler: number = 0;\r\n\r\n /** @internal */\r\n protected _activeRenderLoops = new Array<() => void>();\r\n\r\n /**\r\n * Gets the list of current active render loop functions\r\n * @returns a read only array with the current render loop functions\r\n */\r\n public get activeRenderLoops(): ReadonlyArray<() => void> {\r\n return this._activeRenderLoops;\r\n }\r\n\r\n /**\r\n * stop executing a render loop function and remove it from the execution array\r\n * @param renderFunction defines the function to be removed. If not provided all functions will be removed.\r\n */\r\n public stopRenderLoop(renderFunction?: () => void): void {\r\n if (!renderFunction) {\r\n this._activeRenderLoops.length = 0;\r\n this._cancelFrame();\r\n return;\r\n }\r\n\r\n const index = this._activeRenderLoops.indexOf(renderFunction);\r\n\r\n if (index >= 0) {\r\n this._activeRenderLoops.splice(index, 1);\r\n if (this._activeRenderLoops.length == 0) {\r\n this._cancelFrame();\r\n }\r\n }\r\n }\r\n\r\n protected _cancelFrame() {\r\n if (this._frameHandler !== 0) {\r\n const handlerToCancel = this._frameHandler;\r\n this._frameHandler = 0;\r\n\r\n if (!IsWindowObjectExist()) {\r\n if (typeof cancelAnimationFrame === \"function\") {\r\n return cancelAnimationFrame(handlerToCancel);\r\n }\r\n } else {\r\n const { cancelAnimationFrame } = this.getHostWindow() || window;\r\n if (typeof cancelAnimationFrame === \"function\") {\r\n return cancelAnimationFrame(handlerToCancel);\r\n }\r\n }\r\n return clearTimeout(handlerToCancel);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _windowIsBackground = false;\r\n\r\n /**\r\n * Begin a new frame\r\n */\r\n public beginFrame(): void {\r\n this.onBeginFrameObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * End the current frame\r\n */\r\n public endFrame(): void {\r\n this._frameId++;\r\n\r\n this.onEndFrameObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Gets the performance monitor attached to this engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation\r\n */\r\n public abstract get performanceMonitor(): PerformanceMonitor;\r\n\r\n /** @internal */\r\n public _boundRenderFunction: any = (timestamp: number) => this._renderLoop(timestamp);\r\n\r\n protected _maxFPS: number | undefined;\r\n protected _minFrameTime: number;\r\n protected _lastFrameTime: number = 0;\r\n protected _renderAccumulator: number = 0;\r\n\r\n /**\r\n * Skip frame rendering but keep the frame heartbeat (begin/end frame).\r\n * This is useful if you need all the plumbing but not the rendering work.\r\n * (for instance when capturing a screenshot where you do not want to mix rendering to the screen and to the screenshot)\r\n */\r\n public skipFrameRender = false;\r\n\r\n /** Gets or sets max frame per second allowed. Will return undefined if not capped */\r\n public get maxFPS(): number | undefined {\r\n return this._maxFPS;\r\n }\r\n\r\n public set maxFPS(value: number | undefined) {\r\n this._maxFPS = value;\r\n\r\n if (value === undefined) {\r\n return;\r\n }\r\n\r\n if (value <= 0) {\r\n this._minFrameTime = Number.MAX_VALUE;\r\n return;\r\n }\r\n\r\n this._minFrameTime = 1000 / value;\r\n }\r\n\r\n protected _isOverFrameTime(timestamp?: number): boolean {\r\n if (!timestamp || this._maxFPS === undefined) {\r\n return false;\r\n }\r\n\r\n const elapsedTime = timestamp - this._lastFrameTime;\r\n this._lastFrameTime = timestamp;\r\n\r\n this._renderAccumulator += elapsedTime;\r\n\r\n if (this._renderAccumulator < this._minFrameTime) {\r\n return true;\r\n }\r\n\r\n this._renderAccumulator -= this._minFrameTime;\r\n\r\n if (this._renderAccumulator > this._minFrameTime) {\r\n this._renderAccumulator = this._minFrameTime;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n protected _processFrame(timestamp?: number) {\r\n this._frameHandler = 0;\r\n\r\n if (!this._contextWasLost && !this._isOverFrameTime(timestamp)) {\r\n let shouldRender = true;\r\n if (this.isDisposed || (!this.renderEvenInBackground && this._windowIsBackground)) {\r\n shouldRender = false;\r\n }\r\n\r\n if (shouldRender) {\r\n // Start new frame\r\n this.beginFrame();\r\n\r\n // Child canvases\r\n if (!this.skipFrameRender && !this._renderViews()) {\r\n // Main frame\r\n this._renderFrame();\r\n }\r\n\r\n // Present\r\n this.endFrame();\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _renderLoop(timestamp: number | undefined): void {\r\n this._processFrame(timestamp);\r\n\r\n // The first condition prevents queuing another frame if we no longer have active render loops (e.g., if\r\n // `stopRenderLoop` is called mid frame). The second condition prevents queuing another frame if one has\r\n // already been queued (e.g., if `stopRenderLoop` and `runRenderLoop` is called mid frame).\r\n if (this._activeRenderLoops.length > 0 && this._frameHandler === 0) {\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _renderFrame() {\r\n for (let index = 0; index < this._activeRenderLoops.length; index++) {\r\n const renderFunction = this._activeRenderLoops[index];\r\n\r\n renderFunction();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _renderViews() {\r\n return false;\r\n }\r\n\r\n /**\r\n * Can be used to override the current requestAnimationFrame requester.\r\n * @internal\r\n */\r\n protected _queueNewFrame(bindedRenderFunction: any, requester?: any): number {\r\n return QueueNewFrame(bindedRenderFunction, requester);\r\n }\r\n\r\n /**\r\n * Register and execute a render loop. The engine can have more than one render function\r\n * @param renderFunction defines the function to continuously execute\r\n */\r\n public runRenderLoop(renderFunction: () => void): void {\r\n if (this._activeRenderLoops.indexOf(renderFunction) !== -1) {\r\n return;\r\n }\r\n\r\n this._activeRenderLoops.push(renderFunction);\r\n\r\n // On the first added function, start the render loop.\r\n if (this._activeRenderLoops.length === 1 && this._frameHandler === 0) {\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if depth testing is enabled\r\n * @returns the current state\r\n */\r\n public getDepthBuffer(): boolean {\r\n return this._depthCullingState.depthTest;\r\n }\r\n\r\n /**\r\n * Enable or disable depth buffering\r\n * @param enable defines the state to set\r\n */\r\n public setDepthBuffer(enable: boolean): void {\r\n this._depthCullingState.depthTest = enable;\r\n }\r\n\r\n /**\r\n * Set the z offset Factor to apply to current rendering\r\n * @param value defines the offset to apply\r\n */\r\n public setZOffset(value: number): void {\r\n this._depthCullingState.zOffset = this.useReverseDepthBuffer ? -value : value;\r\n }\r\n\r\n /**\r\n * Gets the current value of the zOffset Factor\r\n * @returns the current zOffset Factor state\r\n */\r\n public getZOffset(): number {\r\n const zOffset = this._depthCullingState.zOffset;\r\n return this.useReverseDepthBuffer ? -zOffset : zOffset;\r\n }\r\n\r\n /**\r\n * Set the z offset Units to apply to current rendering\r\n * @param value defines the offset to apply\r\n */\r\n public setZOffsetUnits(value: number): void {\r\n this._depthCullingState.zOffsetUnits = this.useReverseDepthBuffer ? -value : value;\r\n }\r\n\r\n /**\r\n * Gets the current value of the zOffset Units\r\n * @returns the current zOffset Units state\r\n */\r\n public getZOffsetUnits(): number {\r\n const zOffsetUnits = this._depthCullingState.zOffsetUnits;\r\n return this.useReverseDepthBuffer ? -zOffsetUnits : zOffsetUnits;\r\n }\r\n\r\n /**\r\n * Gets host window\r\n * @returns the host window object\r\n */\r\n public getHostWindow(): Nullable<Window> {\r\n if (!IsWindowObjectExist()) {\r\n return null;\r\n }\r\n\r\n if (this._renderingCanvas && this._renderingCanvas.ownerDocument && this._renderingCanvas.ownerDocument.defaultView) {\r\n return this._renderingCanvas.ownerDocument.defaultView;\r\n }\r\n\r\n return window;\r\n }\r\n\r\n /**\r\n * (WebGPU only) True (default) to be in compatibility mode, meaning rendering all existing scenes without artifacts (same rendering than WebGL).\r\n * Setting the property to false will improve performances but may not work in some scenes if some precautions are not taken.\r\n * See https://doc.babylonjs.com/setup/support/webGPU/webGPUOptimization/webGPUNonCompatibilityMode for more details\r\n */\r\n public get compatibilityMode() {\r\n return this._compatibilityMode;\r\n }\r\n\r\n public set compatibilityMode(mode: boolean) {\r\n // not supported in WebGL\r\n this._compatibilityMode = true;\r\n }\r\n\r\n /**\r\n * Observable raised when the engine is about to compile a shader\r\n */\r\n public onBeforeShaderCompilationObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Observable raised when the engine has just compiled a shader\r\n */\r\n public onAfterShaderCompilationObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Observable raised when the engine begins a new frame\r\n */\r\n public onBeginFrameObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Observable raised when the engine ends the current frame (requires a render loop, e.g. 'engine.runRenderLoop(...)')\r\n */\r\n public onEndFrameObservable = new Observable<AbstractEngine>();\r\n\r\n protected _rebuildTextures(): void {\r\n for (const scene of this.scenes) {\r\n scene._rebuildTextures();\r\n }\r\n\r\n for (const scene of this._virtualScenes) {\r\n scene._rebuildTextures();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _getRGBABufferInternalSizedFormat(type: number, format?: number, useSRGBBuffer?: boolean): number;\r\n\r\n /** @internal */\r\n public abstract _getUnpackAlignement(): number;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _uploadCompressedDataToTextureDirectly(\r\n texture: InternalTexture,\r\n internalFormat: number,\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n faceIndex: number,\r\n lod?: number\r\n ): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _bindTextureDirectly(target: number, texture: Nullable<InternalTexture>, forTextureDataUpdate?: boolean, force?: boolean): boolean;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _uploadDataToTextureDirectly(\r\n texture: InternalTexture,\r\n imageData: ArrayBufferView,\r\n faceIndex?: number,\r\n lod?: number,\r\n babylonInternalFormat?: number,\r\n useTextureWidthAndHeight?: boolean\r\n ): void;\r\n\r\n /** @internal */\r\n public abstract _unpackFlipY(value: boolean): void;\r\n\r\n /**\r\n * Reads pixels from the current frame buffer. Please note that this function can be slow\r\n * @param x defines the x coordinate of the rectangle where pixels must be read\r\n * @param y defines the y coordinate of the rectangle where pixels must be read\r\n * @param width defines the width of the rectangle where pixels must be read\r\n * @param height defines the height of the rectangle where pixels must be read\r\n * @param hasAlpha defines whether the output should have alpha or not (defaults to true)\r\n * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels\r\n * @returns a ArrayBufferView promise (Uint8Array) containing RGBA colors\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public abstract readPixels(x: number, y: number, width: number, height: number, hasAlpha?: boolean, flushRenderer?: boolean): Promise<ArrayBufferView>;\r\n\r\n /**\r\n * Generates mipmaps for a texture\r\n * @param texture The texture to generate the mipmaps for\r\n */\r\n public abstract generateMipmaps(texture: InternalTexture): void;\r\n\r\n /**\r\n * Force a flush (ie. a flush of all waiting commands)\r\n */\r\n public abstract flushFramebuffer(): void;\r\n\r\n /** @internal */\r\n public abstract _currentFrameBufferIsDefaultFrameBuffer(): boolean;\r\n\r\n /**\r\n * Creates an internal texture without binding it to a framebuffer\r\n * @internal\r\n * @param size defines the size of the texture\r\n * @param options defines the options used to create the texture\r\n * @param delayGPUTextureCreation true to delay the texture creation the first time it is really needed. false to create it right away\r\n * @param source source type of the texture\r\n * @returns a new internal texture\r\n */\r\n public abstract _createInternalTexture(\r\n size: TextureSize,\r\n options: boolean | InternalTextureCreationOptions,\r\n delayGPUTextureCreation?: boolean,\r\n source?: InternalTextureSource\r\n ): InternalTexture;\r\n\r\n /** @internal */\r\n public abstract applyStates(): void;\r\n\r\n /**\r\n * Binds the frame buffer to the specified texture.\r\n * @param texture The render target wrapper to render to\r\n * @param faceIndex The face of the texture to render to in case of cube texture\r\n * @param requiredWidth The width of the target to render to\r\n * @param requiredHeight The height of the target to render to\r\n * @param forceFullscreenViewport Forces the viewport to be the entire texture/screen if true\r\n * @param lodLevel defines the lod level to bind to the frame buffer\r\n * @param layer defines the 2d array index to bind to frame buffer to\r\n */\r\n public abstract bindFramebuffer(\r\n texture: RenderTargetWrapper,\r\n faceIndex?: number,\r\n requiredWidth?: number,\r\n requiredHeight?: number,\r\n forceFullscreenViewport?: boolean,\r\n lodLevel?: number,\r\n layer?: number\r\n ): void;\r\n\r\n /**\r\n * Update the sampling mode of a given texture\r\n * @param texture defines the texture to update\r\n * @param wrapU defines the texture wrap mode of the u coordinates\r\n * @param wrapV defines the texture wrap mode of the v coordinates\r\n * @param wrapR defines the texture wrap mode of the r coordinates\r\n */\r\n public abstract updateTextureWrappingMode(texture: InternalTexture, wrapU: Nullable<number>, wrapV?: Nullable<number>, wrapR?: Nullable<number>): void;\r\n\r\n /**\r\n * Unbind the current render target and bind the default framebuffer\r\n */\r\n public abstract restoreDefaultFramebuffer(): void;\r\n\r\n /**\r\n * Draw a list of indexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param indexStart defines the starting index\r\n * @param indexCount defines the number of index to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public abstract drawElementsType(fillMode: number, indexStart: number, indexCount: number, instancesCount?: number): void;\r\n\r\n /**\r\n * Unbind the current render target texture from the webGL context\r\n * @param texture defines the render target wrapper to unbind\r\n * @param disableGenerateMipMaps defines a boolean indicating that mipmaps must not be generated\r\n * @param onBeforeUnbind defines a function which will be called before the effective unbind\r\n */\r\n public abstract unBindFramebuffer(texture: RenderTargetWrapper, disableGenerateMipMaps?: boolean, onBeforeUnbind?: () => void): void;\r\n\r\n /**\r\n * Generates mipmaps for the texture of the (single) render target\r\n * @param texture The render target containing the texture to generate the mipmaps for\r\n */\r\n public abstract generateMipMapsFramebuffer(texture: RenderTargetWrapper): void;\r\n\r\n /**\r\n * Resolves the MSAA texture of the (single) render target into its non-MSAA version.\r\n * Note that if \"texture\" is not a MSAA render target, no resolve is performed.\r\n * @param texture The render target texture containing the MSAA texture to resolve\r\n */\r\n public abstract resolveFramebuffer(texture: RenderTargetWrapper): void;\r\n\r\n /**Gets driver info if available */\r\n public abstract extractDriverInfo(): string;\r\n\r\n /**\r\n * Bind a list of vertex buffers to the webGL context\r\n * @param vertexBuffers defines the list of vertex buffers to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n * @param effect defines the effect associated with the vertex buffers\r\n * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers\r\n */\r\n public abstract bindBuffers(\r\n vertexBuffers: { [key: string]: Nullable<VertexBuffer> },\r\n indexBuffer: Nullable<DataBuffer>,\r\n effect: Effect,\r\n overrideVertexBuffers?: { [kind: string]: Nullable<VertexBuffer> }\r\n ): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseRenderTargetWrapper(rtWrapper: RenderTargetWrapper): void {\r\n const index = this._renderTargetWrapperCache.indexOf(rtWrapper);\r\n if (index !== -1) {\r\n this._renderTargetWrapperCache.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Activates an effect, making it the current one (i.e. the one used for rendering)\r\n * @param effect defines the effect to activate\r\n */\r\n public abstract enableEffect(effect: Nullable<Effect | DrawWrapper>): void;\r\n\r\n /**\r\n * Sets the type of faces to cull\r\n * @param cullBackFaces true to cull back faces, false to cull front faces (if culling is enabled)\r\n * @param force defines if states must be applied even if cache is up to date\r\n */\r\n public abstract setStateCullFaceType(cullBackFaces?: boolean, force?: boolean): void;\r\n\r\n /**\r\n * Set various states to the webGL context\r\n * @param culling defines culling state: true to enable culling, false to disable it\r\n * @param zOffset defines the value to apply to zOffset (0 by default)\r\n * @param force defines if states must be applied even if cache is up to date\r\n * @param reverseSide defines if culling must be reversed (CCW if false, CW if true)\r\n * @param cullBackFaces true to cull back faces, false to cull front faces (if culling is enabled)\r\n * @param stencil stencil states to set\r\n * @param zOffsetUnits defines the value to apply to zOffsetUnits (0 by default)\r\n */\r\n public abstract setState(\r\n culling: boolean,\r\n zOffset?: number,\r\n force?: boolean,\r\n reverseSide?: boolean,\r\n cullBackFaces?: boolean,\r\n stencil?: IStencilState,\r\n zOffsetUnits?: number\r\n ): void;\r\n\r\n /**\r\n * Creates a new material context\r\n * @returns the new context\r\n */\r\n public abstract createMaterialContext(): IMaterialContext | undefined;\r\n\r\n /**\r\n * Creates a new draw context\r\n * @returns the new context\r\n */\r\n public abstract createDrawContext(): IDrawContext | undefined;\r\n\r\n /**\r\n * Create a new effect (used to store vertex/fragment shaders)\r\n * @param baseName defines the base name of the effect (The name of file without .fragment.fx or .vertex.fx)\r\n * @param attributesNamesOrOptions defines either a list of attribute names or an IEffectCreationOptions object\r\n * @param uniformsNamesOrEngine defines either a list of uniform names or the engine to use\r\n * @param samplers defines an array of string used to represent textures\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails\r\n * @param onCompiled defines a function to call when the effect creation is successful\r\n * @param onError defines a function to call when the effect creation has failed\r\n * @param indexParameters defines an object containing the index values to use to compile shaders (like the maximum number of simultaneous lights)\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 * @returns the new Effect\r\n */\r\n public abstract createEffect(\r\n baseName: string | (IShaderPath & { vertexToken?: string; fragmentToken?: string }),\r\n attributesNamesOrOptions: string[] | IEffectCreationOptions,\r\n uniformsNamesOrEngine: string[] | AbstractEngine,\r\n samplers?: string[],\r\n defines?: string,\r\n fallbacks?: EffectFallbacks,\r\n onCompiled?: Nullable<(effect: Effect) => void>,\r\n onError?: Nullable<(effect: Effect, errors: string) => void>,\r\n indexParameters?: any,\r\n shaderLanguage?: ShaderLanguage,\r\n extraInitializationsAsync?: () => Promise<void>\r\n ): Effect;\r\n\r\n /**\r\n * Clear the current render buffer or the current render target (if any is set up)\r\n * @param color defines the color to use\r\n * @param backBuffer defines if the back buffer must be cleared\r\n * @param depth defines if the depth buffer must be cleared\r\n * @param stencil defines if the stencil buffer must be cleared\r\n * @param stencilClearValue defines the value to use to clear the stencil buffer\r\n */\r\n public abstract clear(color: Nullable<IColor4Like>, backBuffer: boolean, depth: boolean, stencil?: boolean, stencilClearValue?: number): void;\r\n\r\n /**\r\n * Gets a boolean indicating that only power of 2 textures are supported\r\n * Please note that you can still use non power of 2 textures but in this case the engine will forcefully convert them\r\n */\r\n public abstract get needPOTTextures(): boolean;\r\n\r\n /**\r\n * Creates a new index buffer\r\n * @param indices defines the content of the index buffer\r\n * @param _updatable defines if the index buffer must be updatable\r\n * @param label defines the label of the buffer (for debug purpose)\r\n * @returns a new buffer\r\n */\r\n public abstract createIndexBuffer(indices: IndicesArray, _updatable?: boolean, label?: string): DataBuffer;\r\n\r\n /**\r\n * Draw a list of unindexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public abstract drawArraysType(fillMode: number, verticesStart: number, verticesCount: number, instancesCount?: number): void;\r\n\r\n /**\r\n * Force the engine to release all cached effects.\r\n * This means that next effect compilation will have to be done completely even if a similar effect was already compiled\r\n */\r\n public abstract releaseEffects(): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _viewport(x: number, y: number, width: number, height: number): void;\r\n\r\n /**\r\n * Gets the current viewport\r\n */\r\n public get currentViewport(): Nullable<IViewportLike> {\r\n return this._cachedViewport;\r\n }\r\n\r\n /**\r\n * Set the WebGL's viewport\r\n * @param viewport defines the viewport element to be used\r\n * @param requiredWidth defines the width required for rendering. If not provided the rendering canvas' width is used\r\n * @param requiredHeight defines the height required for rendering. If not provided the rendering canvas' height is used\r\n */\r\n public setViewport(viewport: IViewportLike, requiredWidth?: number, requiredHeight?: number): void {\r\n const width = requiredWidth || this.getRenderWidth();\r\n const height = requiredHeight || this.getRenderHeight();\r\n const x = viewport.x || 0;\r\n const y = viewport.y || 0;\r\n\r\n this._cachedViewport = viewport;\r\n\r\n this._viewport(x * width, y * height, width * viewport.width, height * viewport.height);\r\n }\r\n\r\n /**\r\n * Update the sampling mode of a given texture\r\n * @param samplingMode defines the required sampling mode\r\n * @param texture defines the texture to update\r\n * @param generateMipMaps defines whether to generate mipmaps for the texture\r\n */\r\n public abstract updateTextureSamplingMode(samplingMode: number, texture: InternalTexture, generateMipMaps?: boolean): void;\r\n\r\n /**\r\n * Sets an array of texture to the webGL context\r\n * @param channel defines the channel where the texture array must be set\r\n * @param uniform defines the associated uniform location\r\n * @param textures defines the array of textures to bind\r\n * @param name name of the channel\r\n */\r\n public abstract setTextureArray(channel: number, uniform: Nullable<WebGLUniformLocation>, textures: ThinTexture[], name: string): void;\r\n\r\n /** @internal */\r\n public _transformTextureUrl: Nullable<(url: string) => string> = null;\r\n\r\n /**\r\n * Unbind all instance attributes\r\n */\r\n public abstract unbindInstanceAttributes(): void;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _getUseSRGBBuffer(useSRGBBuffer: boolean, noMipmap: boolean): boolean;\r\n\r\n /**\r\n * Create an image to use with canvas\r\n * @returns IImage interface\r\n */\r\n public createCanvasImage(): IImage {\r\n return document.createElement(\"img\");\r\n }\r\n\r\n /**\r\n * Create a 2D path to use with canvas\r\n * @returns IPath2D interface\r\n * @param d SVG path string\r\n */\r\n public createCanvasPath2D(d?: string): IPath2D {\r\n return new Path2D(d);\r\n }\r\n\r\n /**\r\n * Returns a string describing the current engine\r\n */\r\n public get description(): string {\r\n let description = this.name + this.version;\r\n\r\n if (this._caps.parallelShaderCompile) {\r\n description += \" - Parallel shader compilation\";\r\n }\r\n\r\n return description;\r\n }\r\n\r\n protected _createTextureBase(\r\n url: Nullable<string>,\r\n noMipmap: boolean,\r\n invertY: boolean,\r\n scene: Nullable<ISceneLike>,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<(texture: InternalTexture) => void> = null,\r\n onError: Nullable<(message: string, exception: any) => void> = null,\r\n prepareTexture: PrepareTextureFunction,\r\n prepareTextureProcess: PrepareTextureProcessFunction,\r\n buffer: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap> = null,\r\n fallback: Nullable<InternalTexture> = null,\r\n format: Nullable<number> = null,\r\n forcedExtension: Nullable<string> = null,\r\n mimeType?: string,\r\n loaderOptions?: any,\r\n useSRGBBuffer?: boolean\r\n ): InternalTexture {\r\n url = url || \"\";\r\n const fromData = url.substring(0, 5) === \"data:\";\r\n const fromBlob = url.substring(0, 5) === \"blob:\";\r\n const isBase64 = fromData && url.indexOf(\";base64,\") !== -1;\r\n\r\n const texture = fallback ? fallback : new InternalTexture(this, InternalTextureSource.Url);\r\n\r\n if (texture !== fallback) {\r\n texture.label = url.substring(0, 60); // default label, can be overriden by the caller\r\n }\r\n\r\n const originalUrl = url;\r\n if (this._transformTextureUrl && !isBase64 && !fallback && !buffer) {\r\n url = this._transformTextureUrl(url);\r\n }\r\n\r\n if (originalUrl !== url) {\r\n texture._originalUrl = originalUrl;\r\n }\r\n\r\n // establish the file extension, if possible\r\n const lastDot = url.lastIndexOf(\".\");\r\n let extension = forcedExtension ? forcedExtension : lastDot > -1 ? url.substring(lastDot).toLowerCase() : \"\";\r\n\r\n // Remove query string\r\n const queryStringIndex = extension.indexOf(\"?\");\r\n\r\n if (queryStringIndex > -1) {\r\n extension = extension.split(\"?\")[0];\r\n }\r\n\r\n const loaderPromise = _GetCompatibleTextureLoader(extension, mimeType);\r\n\r\n if (scene) {\r\n scene.addPendingData(texture);\r\n }\r\n texture.url = url;\r\n texture.generateMipMaps = !noMipmap;\r\n texture.samplingMode = samplingMode;\r\n texture.invertY = invertY;\r\n texture._useSRGBBuffer = this._getUseSRGBBuffer(!!useSRGBBuffer, noMipmap);\r\n\r\n if (!this._doNotHandleContextLost) {\r\n // Keep a link to the buffer only if we plan to handle context lost\r\n texture._buffer = buffer;\r\n }\r\n\r\n let onLoadObserver: Nullable<Observer<InternalTexture>> = null;\r\n if (onLoad && !fallback) {\r\n onLoadObserver = texture.onLoadedObservable.add(onLoad);\r\n }\r\n\r\n if (!fallback) {\r\n this._internalTexturesCache.push(texture);\r\n }\r\n\r\n const onInternalError = (message?: string, exception?: any) => {\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n if (url === originalUrl) {\r\n if (onLoadObserver) {\r\n texture.onLoadedObservable.remove(onLoadObserver);\r\n }\r\n\r\n if (EngineStore.UseFallbackTexture && url !== EngineStore.FallbackTexture) {\r\n this._createTextureBase(\r\n EngineStore.FallbackTexture,\r\n noMipmap,\r\n texture.invertY,\r\n scene,\r\n samplingMode,\r\n null,\r\n onError,\r\n prepareTexture,\r\n prepareTextureProcess,\r\n buffer,\r\n texture\r\n );\r\n }\r\n\r\n message = (message || \"Unknown error\") + (EngineStore.UseFallbackTexture ? \" - Fallback texture was used\" : \"\");\r\n texture.onErrorObservable.notifyObservers({ message, exception });\r\n if (onError) {\r\n onError(message, exception);\r\n }\r\n } else {\r\n // fall back to the original url if the transformed url fails to load\r\n Logger.Warn(`Failed to load ${url}, falling back to ${originalUrl}`);\r\n this._createTextureBase(\r\n originalUrl,\r\n noMipmap,\r\n texture.invertY,\r\n scene,\r\n samplingMode,\r\n onLoad,\r\n onError,\r\n prepareTexture,\r\n prepareTextureProcess,\r\n buffer,\r\n texture,\r\n format,\r\n forcedExtension,\r\n mimeType,\r\n loaderOptions,\r\n useSRGBBuffer\r\n );\r\n }\r\n };\r\n\r\n // processing for non-image formats\r\n if (loaderPromise) {\r\n const callbackAsync = async (data: ArrayBufferView) => {\r\n const loader = await loaderPromise;\r\n loader.loadData(\r\n data,\r\n texture,\r\n (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void, loadFailed) => {\r\n if (loadFailed) {\r\n onInternalError(\"TextureLoader failed to load data\");\r\n } else {\r\n prepareTexture(\r\n texture,\r\n extension,\r\n scene,\r\n { width, height },\r\n texture.invertY,\r\n !loadMipmap,\r\n isCompressed,\r\n () => {\r\n done();\r\n return false;\r\n },\r\n samplingMode\r\n );\r\n }\r\n },\r\n loaderOptions\r\n );\r\n };\r\n\r\n if (!buffer) {\r\n this._loadFile(\r\n url,\r\n (data) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n callbackAsync(new Uint8Array(data as ArrayBuffer));\r\n },\r\n undefined,\r\n scene ? scene.offlineProvider : undefined,\r\n true,\r\n (request?: IWebRequest, exception?: any) => {\r\n onInternalError(\"Unable to load \" + (request ? request.responseURL : url, exception));\r\n }\r\n );\r\n } else {\r\n if (buffer instanceof ArrayBuffer) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n callbackAsync(new Uint8Array(buffer));\r\n } else if (ArrayBuffer.isView(buffer)) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n callbackAsync(buffer);\r\n } else {\r\n if (onError) {\r\n onError(\"Unable to load: only ArrayBuffer or ArrayBufferView is supported\", null);\r\n }\r\n }\r\n }\r\n } else {\r\n const onload = (img: HTMLImageElement | ImageBitmap) => {\r\n if (fromBlob && !this._doNotHandleContextLost) {\r\n // We need to store the image if we need to rebuild the texture\r\n // in case of a webgl context lost\r\n texture._buffer = img;\r\n }\r\n\r\n prepareTexture(texture, extension, scene, img, texture.invertY, noMipmap, false, prepareTextureProcess, samplingMode);\r\n };\r\n // According to the WebGL spec section 6.10, ImageBitmaps must be inverted on creation.\r\n // So, we pass imageOrientation to _FileToolsLoadImage() as it may create an ImageBitmap.\r\n\r\n if (!fromData || isBase64) {\r\n if (buffer && (typeof (<HTMLImageElement>buffer).decoding === \"string\" || (<ImageBitmap>buffer).close)) {\r\n onload(<HTMLImageElement>buffer);\r\n } else {\r\n AbstractEngine._FileToolsLoadImage(\r\n url || \"\",\r\n onload,\r\n onInternalError,\r\n scene ? scene.offlineProvider : null,\r\n mimeType,\r\n texture.invertY && this._features.needsInvertingBitmap ? { imageOrientation: \"flipY\" } : undefined,\r\n this\r\n );\r\n }\r\n } else if (typeof buffer === \"string\" || buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer) || buffer instanceof Blob) {\r\n AbstractEngine._FileToolsLoadImage(\r\n buffer,\r\n onload,\r\n onInternalError,\r\n scene ? scene.offlineProvider : null,\r\n mimeType,\r\n texture.invertY && this._features.needsInvertingBitmap ? { imageOrientation: \"flipY\" } : undefined,\r\n this\r\n );\r\n } else if (buffer) {\r\n onload(buffer);\r\n }\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * Creates a new pipeline context\r\n * @param shaderProcessingContext defines the shader processing context used during the processing if available\r\n * @returns the new pipeline\r\n */\r\n public abstract createPipelineContext(shaderProcessingContext: Nullable<_IShaderProcessingContext>): IPipelineContext;\r\n\r\n /**\r\n * Inline functions in shader code that are marked to be inlined\r\n * @param code code to inline\r\n * @returns inlined code\r\n */\r\n public abstract inlineShaderCode(code: string): string;\r\n\r\n /**\r\n * Gets a boolean indicating that the engine supports uniform buffers\r\n */\r\n public abstract get supportsUniformBuffers(): boolean;\r\n\r\n /**\r\n * Returns the version of the engine\r\n */\r\n public abstract get version(): number;\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _releaseEffect(effect: Effect): void;\r\n\r\n /**\r\n * Bind a buffer to the current draw context\r\n * @param buffer defines the buffer to bind\r\n * @param _location not used in WebGPU\r\n * @param name Name of the uniform variable to bind\r\n */\r\n public abstract bindUniformBufferBase(buffer: DataBuffer, _location: number, name: string): void;\r\n\r\n /**\r\n * Bind a specific block at a given index in a specific shader program\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param blockName defines the block name\r\n * @param index defines the index where to bind the block\r\n */\r\n public abstract bindUniformBlock(pipelineContext: IPipelineContext, blockName: string, index: number): void;\r\n\r\n /** @internal */\r\n public _uniformBuffers = new Array<UniformBuffer>();\r\n /** @internal */\r\n public _storageBuffers = new Array<StorageBuffer>();\r\n protected _rebuildBuffers(): void {\r\n // Uniforms\r\n for (const uniformBuffer of this._uniformBuffers) {\r\n uniformBuffer._rebuildAfterContextLost();\r\n }\r\n }\r\n\r\n protected _highPrecisionShadersAllowed = true;\r\n /** @internal */\r\n public get _shouldUseHighPrecisionShader(): boolean {\r\n return !!(this._caps.highPrecisionShaderSupported && this._highPrecisionShadersAllowed);\r\n }\r\n /**\r\n * @internal\r\n */\r\n public abstract _getShaderProcessingContext(shaderLanguage: ShaderLanguage, pureMode: boolean): Nullable<_IShaderProcessingContext>;\r\n\r\n /**\r\n * Gets host document\r\n * @returns the host document object\r\n */\r\n public getHostDocument(): Nullable<Document> {\r\n if (this._renderingCanvas && this._renderingCanvas.ownerDocument) {\r\n return this._renderingCanvas.ownerDocument;\r\n }\r\n\r\n return IsDocumentAvailable() ? document : null;\r\n }\r\n\r\n // Lost context\r\n /**\r\n * Observable signaled when a context lost event is raised\r\n */\r\n public onContextLostObservable = new Observable<AbstractEngine>();\r\n /**\r\n * Observable signaled when a context restored event is raised\r\n */\r\n public onContextRestoredObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Gets the list of loaded textures\r\n * @returns an array containing all loaded textures\r\n */\r\n public getLoadedTexturesCache(): InternalTexture[] {\r\n return this._internalTexturesCache;\r\n }\r\n\r\n /**\r\n * Clears the list of texture accessible through engine.\r\n * This can help preventing texture load conflict due to name collision.\r\n */\r\n public clearInternalTexturesCache() {\r\n this._internalTexturesCache.length = 0;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _releaseTexture(texture: InternalTexture): void;\r\n\r\n /**\r\n * Gets the object containing all engine capabilities\r\n * @returns the EngineCapabilities object\r\n */\r\n public getCaps(): EngineCapabilities {\r\n return this._caps;\r\n }\r\n\r\n /**\r\n * Reset the texture cache to empty state\r\n */\r\n public resetTextureCache() {\r\n for (const key in this._boundTexturesCache) {\r\n if (!Object.prototype.hasOwnProperty.call(this._boundTexturesCache, key)) {\r\n continue;\r\n }\r\n this._boundTexturesCache[key] = null;\r\n }\r\n\r\n this._currentTextureChannel = -1;\r\n }\r\n\r\n /** @internal */\r\n protected _name = \"\";\r\n\r\n /**\r\n * Gets or sets the name of the engine\r\n */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n public set name(value: string) {\r\n this._name = value;\r\n }\r\n\r\n /**\r\n * Returns the current npm package of the sdk\r\n */\r\n // Not mixed with Version for tooling purpose.\r\n public static get NpmPackage(): string {\r\n return \"babylonjs@8.22.2\";\r\n }\r\n\r\n /**\r\n * Returns the current version of the framework\r\n */\r\n public static get Version(): string {\r\n return \"8.22.2\";\r\n }\r\n\r\n /**\r\n * The time (in milliseconds elapsed since the current page has been loaded) when the engine was initialized\r\n */\r\n public readonly startTime: number;\r\n\r\n /** @internal */\r\n protected _audioContext: Nullable<AudioContext>;\r\n /** @internal */\r\n protected _audioDestination: Nullable<AudioDestinationNode | MediaStreamAudioDestinationNode>;\r\n /**\r\n * Gets the HTML canvas attached with the current webGL context\r\n * @returns a HTML canvas\r\n */\r\n public getRenderingCanvas(): Nullable<HTMLCanvasElement> {\r\n return this._renderingCanvas;\r\n }\r\n\r\n /**\r\n * Gets the audio context specified in engine initialization options\r\n * @deprecated please use AudioEngineV2 instead\r\n * @returns an Audio Context\r\n */\r\n public getAudioContext(): Nullable<AudioContext> {\r\n return this._audioContext;\r\n }\r\n\r\n /**\r\n * Gets the audio destination specified in engine initialization options\r\n * @deprecated please use AudioEngineV2 instead\r\n * @returns an audio destination node\r\n */\r\n public getAudioDestination(): Nullable<AudioDestinationNode | MediaStreamAudioDestinationNode> {\r\n return this._audioDestination;\r\n }\r\n\r\n /**\r\n * Defines whether the engine has been created with the premultipliedAlpha option on or not.\r\n */\r\n public premultipliedAlpha: boolean = true;\r\n\r\n /**\r\n * If set to true zooming in and out in the browser will rescale the hardware-scaling correctly.\r\n */\r\n public adaptToDeviceRatio: boolean = false;\r\n\r\n /** @internal */\r\n protected _lastDevicePixelRatio: number = 1.0;\r\n\r\n /** @internal */\r\n public _hardwareScalingLevel: number;\r\n\r\n /**\r\n * Defines the hardware scaling level.\r\n * By default the hardware scaling level is computed from the window device ratio.\r\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\r\n * @param level defines the level to use\r\n */\r\n public setHardwareScalingLevel(level: number): void {\r\n this._hardwareScalingLevel = level;\r\n this.resize();\r\n }\r\n\r\n /**\r\n * Gets the current hardware scaling level.\r\n * By default the hardware scaling level is computed from the window device ratio.\r\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\r\n * @returns a number indicating the current hardware scaling level\r\n */\r\n public getHardwareScalingLevel(): number {\r\n return this._hardwareScalingLevel;\r\n }\r\n\r\n /** @internal */\r\n public _doNotHandleContextLost = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if resources should be retained to be able to handle context lost events\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#handling-webgl-context-lost\r\n */\r\n public get doNotHandleContextLost(): boolean {\r\n return this._doNotHandleContextLost;\r\n }\r\n\r\n public set doNotHandleContextLost(value: boolean) {\r\n this._doNotHandleContextLost = value;\r\n }\r\n\r\n /** @internal */\r\n protected _isStencilEnable: boolean;\r\n\r\n /**\r\n * Returns true if the stencil buffer has been enabled through the creation option of the context.\r\n */\r\n public get isStencilEnable(): boolean {\r\n return this._isStencilEnable;\r\n }\r\n\r\n /** @internal */\r\n protected _creationOptions: AbstractEngineOptions;\r\n\r\n /**\r\n * Gets the options used for engine creation\r\n * @returns EngineOptions object\r\n */\r\n public getCreationOptions() {\r\n return this._creationOptions;\r\n }\r\n\r\n /**\r\n * Creates a new engine\r\n * @param antialias defines whether anti-aliasing should be enabled. If undefined, it means that the underlying engine is free to enable it or not\r\n * @param options defines further options to be sent to the creation context\r\n * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n constructor(antialias: boolean | undefined, options: AbstractEngineOptions, adaptToDeviceRatio?: boolean) {\r\n EngineStore.Instances.push(this);\r\n this.startTime = PrecisionDate.Now;\r\n\r\n this._stencilStateComposer.stencilGlobal = this._stencilState;\r\n\r\n PerformanceConfigurator.SetMatrixPrecision(!!options.useHighPrecisionMatrix);\r\n\r\n if (IsNavigatorAvailable() && navigator.userAgent) {\r\n // Detect if we are running on a faulty buggy OS.\r\n this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent);\r\n\r\n // Detect if we are running on a faulty buggy desktop OS.\r\n this._badDesktopOS = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n }\r\n\r\n // Save this off for use in resize().\r\n this.adaptToDeviceRatio = adaptToDeviceRatio ?? false;\r\n\r\n options.antialias = antialias ?? options.antialias;\r\n options.deterministicLockstep = options.deterministicLockstep ?? false;\r\n options.lockstepMaxSteps = options.lockstepMaxSteps ?? 4;\r\n options.timeStep = options.timeStep ?? 1 / 60;\r\n options.stencil = options.stencil ?? true;\r\n\r\n this._audioContext = options.audioEngineOptions?.audioContext ?? null;\r\n this._audioDestination = options.audioEngineOptions?.audioDestination ?? null;\r\n this.premultipliedAlpha = options.premultipliedAlpha ?? true;\r\n this._doNotHandleContextLost = !!options.doNotHandleContextLost;\r\n this._isStencilEnable = options.stencil ? true : false;\r\n this.useExactSrgbConversions = options.useExactSrgbConversions ?? false;\r\n\r\n const devicePixelRatio = IsWindowObjectExist() ? window.devicePixelRatio || 1.0 : 1.0;\r\n\r\n const limitDeviceRatio = options.limitDeviceRatio || devicePixelRatio;\r\n // Viewport\r\n adaptToDeviceRatio = adaptToDeviceRatio || options.adaptToDeviceRatio || false;\r\n this._hardwareScalingLevel = adaptToDeviceRatio ? 1.0 / Math.min(limitDeviceRatio, devicePixelRatio) : 1.0;\r\n this._lastDevicePixelRatio = devicePixelRatio;\r\n\r\n this._creationOptions = options;\r\n }\r\n\r\n /**\r\n * Resize the view according to the canvas' size\r\n * @param forceSetSize true to force setting the sizes of the underlying canvas\r\n */\r\n public resize(forceSetSize = false): void {\r\n let width: number;\r\n let height: number;\r\n\r\n // Re-query hardware scaling level to handle zoomed-in resizing.\r\n if (this.adaptToDeviceRatio) {\r\n const devicePixelRatio = IsWindowObjectExist() ? window.devicePixelRatio || 1.0 : 1.0;\r\n const changeRatio = this._lastDevicePixelRatio / devicePixelRatio;\r\n this._lastDevicePixelRatio = devicePixelRatio;\r\n this._hardwareScalingLevel *= changeRatio;\r\n }\r\n\r\n if (IsWindowObjectExist() && IsDocumentAvailable()) {\r\n // make sure it is a Node object, and is a part of the document.\r\n if (this._renderingCanvas) {\r\n const boundingRect = this._renderingCanvas.getBoundingClientRect?.();\r\n width = this._renderingCanvas.clientWidth || boundingRect?.width || this._renderingCanvas.width * this._hardwareScalingLevel || 100;\r\n height = this._renderingCanvas.clientHeight || boundingRect?.height || this._renderingCanvas.height * this._hardwareScalingLevel || 100;\r\n } else {\r\n width = window.innerWidth;\r\n height = window.innerHeight;\r\n }\r\n } else {\r\n width = this._renderingCanvas ? this._renderingCanvas.width : 100;\r\n height = this._renderingCanvas ? this._renderingCanvas.height : 100;\r\n }\r\n\r\n this.setSize(width / this._hardwareScalingLevel, height / this._hardwareScalingLevel, forceSetSize);\r\n }\r\n\r\n /**\r\n * Force a specific size of the canvas\r\n * @param width defines the new canvas' width\r\n * @param height defines the new canvas' height\r\n * @param forceSetSize true to force setting the sizes of the underlying canvas\r\n * @returns true if the size was changed\r\n */\r\n public setSize(width: number, height: number, forceSetSize = false): boolean {\r\n if (!this._renderingCanvas) {\r\n return false;\r\n }\r\n\r\n width = width | 0;\r\n height = height | 0;\r\n\r\n if (!forceSetSize && this._renderingCanvas.width === width && this._renderingCanvas.height === height) {\r\n return false;\r\n }\r\n\r\n this._renderingCanvas.width = width;\r\n this._renderingCanvas.height = height;\r\n\r\n if (this.scenes) {\r\n for (let index = 0; index < this.scenes.length; index++) {\r\n const scene = this.scenes[index];\r\n\r\n for (let camIndex = 0; camIndex < scene.cameras.length; camIndex++) {\r\n const cam = scene.cameras[camIndex];\r\n\r\n cam._currentRenderId = 0;\r\n }\r\n }\r\n\r\n if (this.onResizeObservable.hasObservers()) {\r\n this.onResizeObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public abstract _releaseBuffer(buffer: DataBuffer): boolean;\r\n\r\n /**\r\n * Create a dynamic uniform buffer\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n * @param elements defines the content of the uniform buffer\r\n * @param label defines a name for the buffer (for debugging purpose)\r\n * @returns the webGL uniform buffer\r\n */\r\n public abstract createDynamicUniformBuffer(elements: FloatArray, label?: string): DataBuffer;\r\n\r\n /**\r\n * Create an uniform buffer\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n * @param elements defines the content of the uniform buffer\r\n * @param label defines a name for the buffer (for debugging purpose)\r\n * @returns the webGL uniform buffer\r\n */\r\n public abstract createUniformBuffer(elements: FloatArray, label?: string): DataBuffer;\r\n\r\n /**\r\n * Update an existing uniform buffer\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n * @param uniformBuffer defines the target uniform buffer\r\n * @param elements defines the content to update\r\n * @param offset defines the offset in the uniform buffer where update should start\r\n * @param count defines the size of the data to update\r\n */\r\n public abstract updateUniformBuffer(uniformBuffer: DataBuffer, elements: FloatArray, offset?: number, count?: number): void;\r\n\r\n /**\r\n * Creates a dynamic vertex buffer\r\n * @param data the data for the dynamic vertex buffer\r\n * @param _label defines the label of the buffer (for debug purpose)\r\n * @returns the new WebGL dynamic buffer\r\n */\r\n public abstract createDynamicVertexBuffer(data: DataArray | number, _label?: string): DataBuffer;\r\n\r\n /**\r\n * Creates a vertex buffer\r\n * @param data the data or size for the vertex buffer\r\n * @param _updatable whether the buffer should be created as updatable\r\n * @param _label defines the label of the buffer (for debug purpose)\r\n * @returns the new WebGL static buffer\r\n */\r\n public abstract createVertexBuffer(data: DataArray | number, _updatable?: boolean, _label?: string): DataBuffer;\r\n\r\n /**\r\n * Update the dimensions of a texture\r\n * @param texture texture to update\r\n * @param width new width of the texture\r\n * @param height new height of the texture\r\n * @param depth new depth of the texture\r\n */\r\n public abstract updateTextureDimensions(texture: InternalTexture, width: number, height: number, depth: number): void;\r\n\r\n /**\r\n * Usually called from Texture.ts.\r\n * Passed information to create a WebGLTexture\r\n * @param url defines a value which contains one of the following:\r\n * * A conventional http URL, e.g. 'http://...' or 'file://...'\r\n * * A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...'\r\n * * An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg'\r\n * @param noMipmap defines a boolean indicating that no mipmaps shall be generated. Ignored for compressed textures. They must be in the file\r\n * @param invertY when true, image is flipped when loaded. You probably want true. Certain compressed textures may invert this if their default is inverted (eg. ktx)\r\n * @param scene needed for loading to the correct scene\r\n * @param samplingMode mode with should be used sample / access the texture (Default: Texture.TRILINEAR_SAMPLINGMODE)\r\n * @param onLoad optional callback to be called upon successful completion\r\n * @param onError optional callback to be called upon failure\r\n * @param buffer a source of a file previously fetched as either a base64 string, an ArrayBuffer (compressed or image format), HTMLImageElement (image format), or a Blob\r\n * @param fallback an internal argument in case the function must be called again, due to etc1 not having alpha capabilities\r\n * @param format internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @param mimeType defines an optional mime type\r\n * @param loaderOptions options to be passed to the loader\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\r\n * @returns a InternalTexture for assignment back into BABYLON.Texture\r\n */\r\n public abstract createTexture(\r\n url: Nullable<string>,\r\n noMipmap: boolean,\r\n invertY: boolean,\r\n scene: Nullable<ISceneLike>,\r\n samplingMode?: number,\r\n onLoad?: Nullable<(texture: InternalTexture) => void>,\r\n onError?: Nullable<(message: string, exception: any) => void>,\r\n buffer?: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap>,\r\n fallback?: Nullable<InternalTexture>,\r\n format?: Nullable<number>,\r\n forcedExtension?: Nullable<string>,\r\n mimeType?: string,\r\n loaderOptions?: any,\r\n creationFlags?: number,\r\n useSRGBBuffer?: boolean\r\n ): InternalTexture;\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a raw texture\r\n * @param data defines the data to store in the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param format defines the format of the data\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default)\r\n * @param compression defines the compression used (null by default)\r\n * @param type defines the type fo the data (Engine.TEXTURETYPE_UNSIGNED_BYTE by default)\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\r\n * @returns the raw texture inside an InternalTexture\r\n */\r\n public createRawTexture(\r\n data: Nullable<ArrayBufferView>,\r\n width: number,\r\n height: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression?: Nullable<string>,\r\n type?: number,\r\n creationFlags?: number,\r\n useSRGBBuffer?: boolean\r\n ): InternalTexture {\r\n throw _WarnImport(\"engine.rawTexture\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a new raw cube texture\r\n * @param data defines the array of data to use to create each face\r\n * @param size defines the size of the textures\r\n * @param format defines the format of the data\r\n * @param type defines the type of the data (like Engine.TEXTURETYPE_UNSIGNED_BYTE)\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compression used (null by default)\r\n * @returns the cube texture as an InternalTexture\r\n */\r\n public createRawCubeTexture(\r\n data: Nullable<ArrayBufferView[]>,\r\n size: number,\r\n format: number,\r\n type: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression?: Nullable<string>\r\n ): InternalTexture {\r\n throw _WarnImport(\"engine.rawTexture\");\r\n }\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a new raw 3D texture\r\n * @param data defines the data used to create the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param depth defines the depth of the texture\r\n * @param format defines the format of the texture\r\n * @param generateMipMaps defines if the engine must generate mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compressed used (can be null)\r\n * @param textureType defines the compressed used (can be null)\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @returns a new raw 3D texture (stored in an InternalTexture)\r\n */\r\n public createRawTexture3D(\r\n data: Nullable<ArrayBufferView>,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression?: Nullable<string>,\r\n textureType?: number,\r\n creationFlags?: number\r\n ): InternalTexture {\r\n throw _WarnImport(\"engine.rawTexture\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a new raw 2D array texture\r\n * @param data defines the data used to create the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param depth defines the number of layers of the texture\r\n * @param format defines the format of the texture\r\n * @param generateMipMaps defines if the engine must generate mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compressed used (can be null)\r\n * @param textureType defines the compressed used (can be null)\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @returns a new raw 2D array texture (stored in an InternalTexture)\r\n */\r\n public createRawTexture2DArray(\r\n data: Nullable<ArrayBufferView>,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression?: Nullable<string>,\r\n textureType?: number,\r\n creationFlags?: number\r\n ): InternalTexture {\r\n throw _WarnImport(\"engine.rawTexture\");\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if back faces must be culled. If false, front faces are culled instead (true by default)\r\n * If non null, this takes precedence over the value from the material\r\n */\r\n public cullBackFaces: Nullable<boolean> = null;\r\n\r\n /**\r\n * Gets the current render width\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the current render width\r\n */\r\n public abstract getRenderWidth(useScreen?: boolean): number;\r\n\r\n /**\r\n * Gets the current render height\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the current render height\r\n */\r\n public abstract getRenderHeight(useScreen?: boolean): number;\r\n\r\n /**\r\n * Shared initialization across engines types.\r\n * @param canvas The canvas associated with this instance of the engine.\r\n */\r\n protected _sharedInit(canvas: HTMLCanvasElement) {\r\n this._renderingCanvas = canvas;\r\n }\r\n\r\n private _checkForMobile: () => void;\r\n\r\n protected _setupMobileChecks(): void {\r\n if (!(navigator && navigator.userAgent)) {\r\n return;\r\n }\r\n\r\n // Function to check if running on mobile device\r\n this._checkForMobile = () => {\r\n const currentUa = navigator.userAgent;\r\n this.hostInformation.isMobile =\r\n currentUa.indexOf(\"Mobile\") !== -1 ||\r\n // Needed for iOS 13+ detection on iPad (inspired by solution from https://stackoverflow.com/questions/9038625/detect-if-device-is-ios)\r\n (currentUa.indexOf(\"Mac\") !== -1 && IsDocumentAvailable() && \"ontouchend\" in document);\r\n };\r\n\r\n // Set initial isMobile value\r\n this._checkForMobile();\r\n\r\n // Set up event listener to check when window is resized (used to get emulator activation to work properly)\r\n if (IsWindowObjectExist()) {\r\n window.addEventListener(\"resize\", this._checkForMobile);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n /** @internal */\r\n public static _RenderPassIdCounter = 0;\r\n\r\n /** @internal */\r\n public _renderPassNames: string[] = [\"main\"];\r\n\r\n /** @internal */\r\n public abstract _createHardwareTexture(): IHardwareTextureWrapper;\r\n\r\n /**\r\n * creates and returns a new video element\r\n * @param constraints video constraints\r\n * @returns video element\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public createVideoElement(constraints: MediaTrackConstraints): any {\r\n return document.createElement(\"video\");\r\n }\r\n\r\n // FPS\r\n protected _fps = 60;\r\n protected _deltaTime = 0;\r\n\r\n /** @internal */\r\n public _drawCalls: PerfCounter;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _reportDrawCall(numDrawCalls = 1) {\r\n this._drawCalls?.addCount(numDrawCalls, false);\r\n }\r\n /**\r\n * Gets the current framerate\r\n * @returns a number representing the framerate\r\n */\r\n public getFps(): number {\r\n return this._fps;\r\n }\r\n\r\n /**\r\n * Gets the time spent between current and previous frame\r\n * @returns a number representing the delta time in ms\r\n */\r\n public getDeltaTime(): number {\r\n return this._deltaTime;\r\n }\r\n\r\n // Deterministic lockstepMaxSteps\r\n /** @internal */\r\n public _deterministicLockstep: boolean = false;\r\n /** @internal */\r\n public _lockstepMaxSteps: number = 4;\r\n /** @internal */\r\n public _timeStep: number = 1 / 60;\r\n\r\n /**\r\n * Gets a boolean indicating that the engine is running in deterministic lock step mode\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @returns true if engine is in deterministic lock step mode\r\n */\r\n public isDeterministicLockStep(): boolean {\r\n return this._deterministicLockstep;\r\n }\r\n\r\n /**\r\n * Gets the max steps when engine is running in deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @returns the max steps\r\n */\r\n public getLockstepMaxSteps(): number {\r\n return this._lockstepMaxSteps;\r\n }\r\n\r\n /**\r\n * Returns the time in ms between steps when using deterministic lock step.\r\n * @returns time step in (ms)\r\n */\r\n public getTimeStep(): number {\r\n return this._timeStep * 1000;\r\n }\r\n\r\n /**\r\n * Engine abstraction for loading and creating an image bitmap from a given source string.\r\n * @param imageSource source to load the image from.\r\n * @param options An object that sets options for the image's extraction.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public _createImageBitmapFromSource(imageSource: string, options?: ImageBitmapOptions): Promise<ImageBitmap> {\r\n throw new Error(\"createImageBitmapFromSource is not implemented\");\r\n }\r\n\r\n /**\r\n * Engine abstraction for createImageBitmap\r\n * @param image source for image\r\n * @param options An object that sets options for the image's extraction.\r\n * @returns ImageBitmap\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap> {\r\n return createImageBitmap(image, options);\r\n }\r\n\r\n /**\r\n * Resize an image and returns the image data as an uint8array\r\n * @param image image to resize\r\n * @param bufferWidth destination buffer width\r\n * @param bufferHeight destination buffer height\r\n */\r\n public resizeImageBitmap(image: HTMLImageElement | ImageBitmap, bufferWidth: number, bufferHeight: number): Uint8Array {\r\n throw new Error(\"resizeImageBitmap is not implemented\");\r\n }\r\n\r\n /**\r\n * Get the current error code of the webGL context\r\n * @returns the error code\r\n */\r\n public abstract getError(): number;\r\n\r\n /**\r\n * Get Font size information\r\n * @param font font name\r\n */\r\n public getFontOffset(font: string): { ascent: number; height: number; descent: number } {\r\n throw new Error(\"getFontOffset is not implemented\");\r\n }\r\n\r\n protected static _CreateCanvas(width: number, height: number): ICanvas {\r\n if (typeof document === \"undefined\") {\r\n return <ICanvas>(<any>new OffscreenCanvas(width, height));\r\n }\r\n const canvas = <ICanvas>(<any>document.createElement(\"canvas\"));\r\n canvas.width = width;\r\n canvas.height = height;\r\n return canvas;\r\n }\r\n\r\n /**\r\n * Create a canvas. This method is overridden by other engines\r\n * @param width width\r\n * @param height height\r\n * @returns ICanvas interface\r\n */\r\n public createCanvas(width: number, height: number): ICanvas {\r\n return AbstractEngine._CreateCanvas(width, height);\r\n }\r\n\r\n /**\r\n * Loads an image as an HTMLImageElement.\r\n * @param input url string, ArrayBuffer, or Blob to load\r\n * @param onLoad callback called when the image successfully loads\r\n * @param onError callback called when the image fails to load\r\n * @param offlineProvider offline provider for caching\r\n * @param mimeType optional mime type\r\n * @param imageBitmapOptions optional the options to use when creating an ImageBitmap\r\n * @param engine the engine instance to use\r\n * @returns the HTMLImageElement of the loaded image\r\n * @internal\r\n */\r\n public static _FileToolsLoadImage(\r\n input: string | ArrayBuffer | ArrayBufferView | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string, exception?: any) => void,\r\n offlineProvider: Nullable<IOfflineProvider>,\r\n mimeType?: string,\r\n imageBitmapOptions?: ImageBitmapOptions,\r\n engine?: AbstractEngine\r\n ): Nullable<HTMLImageElement> {\r\n throw _WarnImport(\"FileTools\");\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (data: any) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: IWebRequest, exception?: any) => void\r\n ): IFileRequest {\r\n const request = _LoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);\r\n this._activeRequests.push(request);\r\n request.onCompleteObservable.add(() => {\r\n const index = this._activeRequests.indexOf(request);\r\n if (index !== -1) {\r\n this._activeRequests.splice(index, 1);\r\n }\r\n });\r\n return request;\r\n }\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @returns a file request object\r\n * @internal\r\n */\r\n public static _FileToolsLoadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void\r\n ): IFileRequest {\r\n if (EngineFunctionContext.loadFile) {\r\n return EngineFunctionContext.loadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);\r\n }\r\n throw _WarnImport(\"FileTools\");\r\n }\r\n\r\n /**\r\n * An event triggered when the engine is disposed.\r\n */\r\n public readonly onDisposeObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * An event triggered when a global cleanup of all effects is required\r\n */\r\n public readonly onReleaseEffectsObservable = new Observable<AbstractEngine>();\r\n\r\n /**\r\n * Dispose and release all associated resources\r\n */\r\n public dispose(): void {\r\n this.releaseEffects();\r\n\r\n this._isDisposed = true;\r\n this.stopRenderLoop();\r\n\r\n // Empty texture\r\n if (this._emptyTexture) {\r\n this._releaseTexture(this._emptyTexture);\r\n this._emptyTexture = null;\r\n }\r\n if (this._emptyCubeTexture) {\r\n this._releaseTexture(this._emptyCubeTexture);\r\n this._emptyCubeTexture = null;\r\n }\r\n\r\n this._renderingCanvas = null;\r\n\r\n // Clear observables\r\n if (this.onBeforeTextureInitObservable) {\r\n this.onBeforeTextureInitObservable.clear();\r\n }\r\n\r\n // Release postProcesses\r\n while (this.postProcesses.length) {\r\n this.postProcesses[0].dispose();\r\n }\r\n\r\n // Release scenes\r\n while (this.scenes.length) {\r\n this.scenes[0].dispose();\r\n }\r\n\r\n while (this._virtualScenes.length) {\r\n this._virtualScenes[0].dispose();\r\n }\r\n\r\n // Release effects\r\n this.releaseComputeEffects?.();\r\n\r\n Effect.ResetCache();\r\n\r\n // Abort active requests\r\n for (const request of this._activeRequests) {\r\n request.abort();\r\n }\r\n\r\n this._boundRenderFunction = null;\r\n\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n\r\n this.onResizeObservable.clear();\r\n this.onCanvasBlurObservable.clear();\r\n this.onCanvasFocusObservable.clear();\r\n this.onCanvasPointerOutObservable.clear();\r\n this.onNewSceneAddedObservable.clear();\r\n this.onEffectErrorObservable.clear();\r\n\r\n if (IsWindowObjectExist()) {\r\n window.removeEventListener(\"resize\", this._checkForMobile);\r\n }\r\n\r\n // Remove from Instances\r\n const index = EngineStore.Instances.indexOf(this);\r\n\r\n if (index >= 0) {\r\n EngineStore.Instances.splice(index, 1);\r\n }\r\n\r\n // no more engines left in the engine store? Notify!\r\n if (!EngineStore.Instances.length) {\r\n EngineStore.OnEnginesDisposedObservable.notifyObservers(this);\r\n EngineStore.OnEnginesDisposedObservable.clear();\r\n }\r\n\r\n // Observables\r\n this.onBeginFrameObservable.clear();\r\n this.onEndFrameObservable.clear();\r\n }\r\n\r\n /**\r\n * Method called to create the default rescale post process on each engine.\r\n */\r\n public static _RescalePostProcessFactory: Nullable<(engine: AbstractEngine) => PostProcess> = null;\r\n\r\n /**\r\n * Method called to create the default loading screen.\r\n * This can be overridden in your own app.\r\n * @param canvas The rendering canvas element\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static DefaultLoadingScreenFactory(canvas: HTMLCanvasElement): ILoadingScreen {\r\n throw _WarnImport(\"LoadingScreen\");\r\n }\r\n\r\n /**\r\n * Gets the audio engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/audio/playingSoundsMusic\r\n * @deprecated please use AudioEngineV2 instead\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static audioEngine: Nullable<IAudioEngine>;\r\n\r\n /**\r\n * Default AudioEngine factory responsible of creating the Audio Engine.\r\n * By default, this will create a BabylonJS Audio Engine if the workload has been embedded.\r\n * @deprecated please use AudioEngineV2 instead\r\n */\r\n public static AudioEngineFactory: (\r\n hostElement: Nullable<HTMLElement>,\r\n audioContext: Nullable<AudioContext>,\r\n audioDestination: Nullable<AudioDestinationNode | MediaStreamAudioDestinationNode>\r\n ) => IAudioEngine;\r\n\r\n /**\r\n * Default offline support factory responsible of creating a tool used to store data locally.\r\n * By default, this will create a Database object if the workload has been embedded.\r\n */\r\n public static OfflineProviderFactory: (urlToScene: string, callbackManifestChecked: (checked: boolean) => any, disableManifestCheck: boolean) => IOfflineProvider;\r\n\r\n /**\r\n * Will flag all materials in all scenes in all engines as dirty to trigger new shader compilation\r\n * @param flag defines which part of the materials must be marked as dirty\r\n * @param predicate defines a predicate used to filter which materials should be affected\r\n */\r\n public static MarkAllMaterialsAsDirty(flag: number, predicate?: (mat: Material) => boolean): void {\r\n for (let engineIndex = 0; engineIndex < EngineStore.Instances.length; engineIndex++) {\r\n const engine = EngineStore.Instances[engineIndex];\r\n\r\n for (let sceneIndex = 0; sceneIndex < engine.scenes.length; sceneIndex++) {\r\n engine.scenes[sceneIndex].markAllMaterialsAsDirty(flag, predicate);\r\n }\r\n }\r\n }\r\n\r\n // Updatable statics so stick with vars here\r\n\r\n /**\r\n * Gets or sets the epsilon value used by collision engine\r\n */\r\n public static CollisionsEpsilon = 0.001;\r\n\r\n /**\r\n * Queue a new function into the requested animation frame pool (ie. this function will be executed by the browser (or the javascript engine) for the next frame)\r\n * @param func - the function to be called\r\n * @param requester - the object that will request the next frame. Falls back to window.\r\n * @returns frame number\r\n */\r\n public static QueueNewFrame: (func: () => void, requester?: any) => number = QueueNewFrame;\r\n}\r\n"]}
@@ -493,8 +493,6 @@ export class InstancedMesh extends AbstractMesh {
493
493
  "hasBoundingInfo",
494
494
  "geometry",
495
495
  ], []);
496
- // Bounding info
497
- this.refreshBoundingInfo();
498
496
  // Parent
499
497
  if (newParent) {
500
498
  result.parent = newParent;
@@ -1 +1 @@
1
- {"version":3,"file":"instancedMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/instancedMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, FloatArray, IndicesArray } from \"../types\";\r\nimport type { Vector3 } from \"../Maths/math.vector\";\r\nimport { Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Node } from \"../node\";\r\nimport type { IMeshDataOptions } from \"../Meshes/abstractMesh\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { Skeleton } from \"../Bones/skeleton\";\r\nimport { DeepCopier } from \"../Misc/deepCopier\";\r\nimport { TransformNode } from \"./transformNode\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport type { Geometry } from \"./geometry\";\r\n\r\nMesh._instancedMeshFactory = (name: string, mesh: Mesh): InstancedMesh => {\r\n const instance = new InstancedMesh(name, mesh);\r\n\r\n if (mesh.instancedBuffers) {\r\n instance.instancedBuffers = {};\r\n\r\n for (const key in mesh.instancedBuffers) {\r\n instance.instancedBuffers[key] = mesh.instancedBuffers[key];\r\n }\r\n }\r\n\r\n return instance;\r\n};\r\n\r\n/**\r\n * Creates an instance based on a source mesh.\r\n */\r\nexport class InstancedMesh extends AbstractMesh {\r\n private _sourceMesh: Mesh;\r\n private _currentLOD: Mesh;\r\n private _billboardWorldMatrix: Matrix;\r\n\r\n /** @internal */\r\n public _indexInSourceMeshInstanceArray = -1;\r\n /** @internal */\r\n public _distanceToCamera: number = 0;\r\n /** @internal */\r\n public _previousWorldMatrix: Nullable<Matrix>;\r\n\r\n /**\r\n * Creates a new InstancedMesh object from the mesh source.\r\n * @param name defines the name of the instance\r\n * @param source the mesh to create the instance from\r\n */\r\n constructor(name: string, source: Mesh) {\r\n super(name, source.getScene());\r\n\r\n source.addInstance(this);\r\n\r\n this._sourceMesh = source;\r\n\r\n this._unIndexed = source._unIndexed;\r\n\r\n this.position.copyFrom(source.position);\r\n this.rotation.copyFrom(source.rotation);\r\n this.scaling.copyFrom(source.scaling);\r\n\r\n if (source.rotationQuaternion) {\r\n this.rotationQuaternion = source.rotationQuaternion.clone();\r\n }\r\n\r\n this.animations = source.animations.slice();\r\n for (const range of source.getAnimationRanges()) {\r\n if (range != null) {\r\n this.createAnimationRange(range.name, range.from, range.to);\r\n }\r\n }\r\n\r\n this.infiniteDistance = source.infiniteDistance;\r\n\r\n this.setPivotMatrix(source.getPivotMatrix());\r\n\r\n if (!source.skeleton && !source.morphTargetManager && source.hasBoundingInfo) {\r\n // without skeleton or morphTargetManager, use bounding info of source mesh directly\r\n const boundingInfo = source.getBoundingInfo();\r\n this.buildBoundingInfo(boundingInfo.minimum, boundingInfo.maximum);\r\n } else {\r\n this.refreshBoundingInfo(true, true);\r\n }\r\n this._syncSubMeshes();\r\n }\r\n\r\n /**\r\n * @returns the string \"InstancedMesh\".\r\n */\r\n public override getClassName(): string {\r\n return \"InstancedMesh\";\r\n }\r\n\r\n /** Gets the list of lights affecting that mesh */\r\n public override get lightSources(): Light[] {\r\n return this._sourceMesh._lightSources;\r\n }\r\n\r\n public override _resyncLightSources(): void {\r\n // Do nothing as all the work will be done by source mesh\r\n }\r\n\r\n public override _resyncLightSource(): void {\r\n // Do nothing as all the work will be done by source mesh\r\n }\r\n\r\n public override _removeLightSource(): void {\r\n // Do nothing as all the work will be done by source mesh\r\n }\r\n\r\n // Methods\r\n /**\r\n * If the source mesh receives shadows\r\n */\r\n public override get receiveShadows(): boolean {\r\n return this._sourceMesh.receiveShadows;\r\n }\r\n\r\n public override set receiveShadows(_value: boolean) {\r\n if (this._sourceMesh?.receiveShadows !== _value) {\r\n Tools.Warn(\"Setting receiveShadows on an instanced mesh has no effect\");\r\n }\r\n }\r\n\r\n /**\r\n * The material of the source mesh\r\n */\r\n public override get material(): Nullable<Material> {\r\n return this._sourceMesh.material;\r\n }\r\n\r\n public override set material(_value: Nullable<Material>) {\r\n if (this._sourceMesh?.material !== _value) {\r\n Tools.Warn(\"Setting material on an instanced mesh has no effect\");\r\n }\r\n }\r\n\r\n /**\r\n * Visibility of the source mesh\r\n */\r\n public override get visibility(): number {\r\n return this._sourceMesh.visibility;\r\n }\r\n\r\n public override set visibility(_value: number) {\r\n if (this._sourceMesh?.visibility !== _value) {\r\n Tools.Warn(\"Setting visibility on an instanced mesh has no effect\");\r\n }\r\n }\r\n\r\n /**\r\n * Skeleton of the source mesh\r\n */\r\n public override get skeleton(): Nullable<Skeleton> {\r\n return this._sourceMesh.skeleton;\r\n }\r\n\r\n public override set skeleton(_value: Nullable<Skeleton>) {\r\n if (this._sourceMesh?.skeleton !== _value) {\r\n Tools.Warn(\"Setting skeleton on an instanced mesh has no effect\");\r\n }\r\n }\r\n\r\n /**\r\n * Rendering ground id of the source mesh\r\n */\r\n public override get renderingGroupId(): number {\r\n return this._sourceMesh.renderingGroupId;\r\n }\r\n\r\n public override set renderingGroupId(value: number) {\r\n if (!this._sourceMesh || value === this._sourceMesh.renderingGroupId) {\r\n return;\r\n }\r\n\r\n //no-op with warning\r\n Logger.Warn(\"Note - setting renderingGroupId of an instanced mesh has no effect on the scene\");\r\n }\r\n\r\n /**\r\n * @returns the total number of vertices (integer).\r\n */\r\n public override getTotalVertices(): number {\r\n return this._sourceMesh ? this._sourceMesh.getTotalVertices() : 0;\r\n }\r\n\r\n /**\r\n * Returns a positive integer : the total number of indices in this mesh geometry.\r\n * @returns the number of indices or zero if the mesh has no geometry.\r\n */\r\n public override getTotalIndices(): number {\r\n return this._sourceMesh.getTotalIndices();\r\n }\r\n\r\n /**\r\n * The source mesh of the instance\r\n */\r\n public get sourceMesh(): Mesh {\r\n return this._sourceMesh;\r\n }\r\n\r\n /**\r\n * Gets the mesh internal Geometry object\r\n */\r\n public override get geometry(): Nullable<Geometry> {\r\n return this._sourceMesh._geometry;\r\n }\r\n\r\n /**\r\n * Creates a new InstancedMesh object from the mesh model.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\r\n * @param name defines the name of the new instance\r\n * @returns a new InstancedMesh\r\n */\r\n public createInstance(name: string): InstancedMesh {\r\n return this._sourceMesh.createInstance(name);\r\n }\r\n\r\n /**\r\n * Is this node ready to be used/rendered\r\n * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\r\n * @returns {boolean} is it ready\r\n */\r\n public override isReady(completeCheck = false): boolean {\r\n return this._sourceMesh.isReady(completeCheck, true);\r\n }\r\n\r\n /**\r\n * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.\r\n * @param kind kind of verticies to retrieve (eg. positions, normals, uvs, etc.)\r\n * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.\r\n * @param forceCopy defines a boolean forcing the copy of the buffer no matter what the value of copyWhenShared is\r\n * @returns a float array or a Float32Array of the requested kind of data : positions, normals, uvs, etc.\r\n */\r\n public override getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean): Nullable<FloatArray> {\r\n return this._sourceMesh.getVerticesData(kind, copyWhenShared, forceCopy);\r\n }\r\n\r\n public override copyVerticesData(kind: string, vertexData: { [kind: string]: Float32Array }): void {\r\n this._sourceMesh.copyVerticesData(kind, vertexData);\r\n }\r\n\r\n /**\r\n * Sets the vertex data of the mesh geometry for the requested `kind`.\r\n * If the mesh has no geometry, a new Geometry object is set to the mesh and then passed this vertex data.\r\n * The `data` are either a numeric array either a Float32Array.\r\n * The parameter `updatable` is passed as is to the underlying Geometry object constructor (if initially none) or updater.\r\n * The parameter `stride` is an optional positive integer, it is usually automatically deducted from the `kind` (3 for positions or normals, 2 for UV, etc).\r\n * Note that a new underlying VertexBuffer object is created each call.\r\n * If the `kind` is the `PositionKind`, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\r\n *\r\n * Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n *\r\n * Returns the Mesh.\r\n * @param kind defines vertex data kind\r\n * @param data defines the data source\r\n * @param updatable defines if the data must be flagged as updatable (false as default)\r\n * @param stride defines the vertex stride (optional)\r\n * @returns the current mesh\r\n */\r\n public override setVerticesData(kind: string, data: FloatArray, updatable?: boolean, stride?: number): AbstractMesh {\r\n if (this.sourceMesh) {\r\n this.sourceMesh.setVerticesData(kind, data, updatable, stride);\r\n }\r\n return this.sourceMesh;\r\n }\r\n\r\n /**\r\n * Updates the existing vertex data of the mesh geometry for the requested `kind`.\r\n * If the mesh has no geometry, it is simply returned as it is.\r\n * The `data` are either a numeric array either a Float32Array.\r\n * No new underlying VertexBuffer object is created.\r\n * If the `kind` is the `PositionKind` and if `updateExtends` is true, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\r\n * If the parameter `makeItUnique` is true, a new global geometry is created from this positions and is set to the mesh.\r\n *\r\n * Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n *\r\n * Returns the Mesh.\r\n * @param kind defines vertex data kind\r\n * @param data defines the data source\r\n * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for \"position\" kind\r\n * @param makeItUnique defines it the updated vertex buffer must be flagged as unique (false by default)\r\n * @returns the source mesh\r\n */\r\n public override updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): Mesh {\r\n if (this.sourceMesh) {\r\n this.sourceMesh.updateVerticesData(kind, data, updateExtends, makeItUnique);\r\n }\r\n return this.sourceMesh;\r\n }\r\n\r\n /**\r\n * Sets the mesh indices.\r\n * Expects an array populated with integers or a typed array (Int32Array, Uint32Array, Uint16Array).\r\n * If the mesh has no geometry, a new Geometry object is created and set to the mesh.\r\n * This method creates a new index buffer each call.\r\n * Returns the Mesh.\r\n * @param indices the source data\r\n * @param totalVertices defines the total number of vertices referenced by indices (could be null)\r\n * @returns source mesh\r\n */\r\n public override setIndices(indices: IndicesArray, totalVertices: Nullable<number> = null): Mesh {\r\n if (this.sourceMesh) {\r\n this.sourceMesh.setIndices(indices, totalVertices);\r\n }\r\n return this.sourceMesh;\r\n }\r\n\r\n /**\r\n * Boolean : True if the mesh owns the requested kind of data.\r\n * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @returns true if data kind is present\r\n */\r\n public override isVerticesDataPresent(kind: string): boolean {\r\n return this._sourceMesh.isVerticesDataPresent(kind);\r\n }\r\n\r\n /**\r\n * @returns an array of indices (IndicesArray).\r\n */\r\n public override getIndices(): Nullable<IndicesArray> {\r\n return this._sourceMesh.getIndices();\r\n }\r\n\r\n public override get _positions(): Nullable<Vector3[]> {\r\n return this._sourceMesh._positions;\r\n }\r\n\r\n public override refreshBoundingInfo(applySkeletonOrOptions: boolean | IMeshDataOptions = false, applyMorph: boolean = false): InstancedMesh {\r\n if (this.hasBoundingInfo && this.getBoundingInfo().isLocked) {\r\n return this;\r\n }\r\n\r\n let options: IMeshDataOptions;\r\n if (typeof applySkeletonOrOptions === \"object\") {\r\n options = applySkeletonOrOptions;\r\n } else {\r\n options = {\r\n applySkeleton: applySkeletonOrOptions,\r\n applyMorph: applyMorph,\r\n };\r\n }\r\n\r\n const bias = this._sourceMesh.geometry ? this._sourceMesh.geometry.boundingBias : null;\r\n this._refreshBoundingInfo(this._sourceMesh._getData(options, null, VertexBuffer.PositionKind), bias);\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public override _preActivate(): InstancedMesh {\r\n if (this._currentLOD) {\r\n this._currentLOD._preActivate();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _activate(renderId: number, intermediateRendering: boolean): boolean {\r\n super._activate(renderId, intermediateRendering);\r\n\r\n if (!this._sourceMesh.subMeshes) {\r\n Logger.Warn(\"Instances should only be created for meshes with geometry.\");\r\n }\r\n\r\n if (this._currentLOD) {\r\n const differentSign = this._currentLOD._getWorldMatrixDeterminant() >= 0 !== this._getWorldMatrixDeterminant() >= 0;\r\n if (differentSign) {\r\n this._internalAbstractMeshDataInfo._actAsRegularMesh = true;\r\n return true;\r\n }\r\n this._internalAbstractMeshDataInfo._actAsRegularMesh = false;\r\n\r\n this._currentLOD._registerInstanceForRenderId(this, renderId);\r\n\r\n if (intermediateRendering) {\r\n if (!this._currentLOD._internalAbstractMeshDataInfo._isActiveIntermediate) {\r\n this._currentLOD._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = true;\r\n return true;\r\n }\r\n } else {\r\n if (!this._currentLOD._internalAbstractMeshDataInfo._isActive) {\r\n this._currentLOD._internalAbstractMeshDataInfo._onlyForInstances = true;\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public override _postActivate(): void {\r\n if (this._sourceMesh.edgesShareWithInstances && this._sourceMesh._edgesRenderer && this._sourceMesh._edgesRenderer.isEnabled && this._sourceMesh._renderingGroup) {\r\n // we are using the edge renderer of the source mesh\r\n this._sourceMesh._renderingGroup._edgesRenderers.pushNoDuplicate(this._sourceMesh._edgesRenderer);\r\n this._sourceMesh._edgesRenderer.customInstances.push(this.getWorldMatrix());\r\n } else if (this._edgesRenderer && this._edgesRenderer.isEnabled && this._sourceMesh._renderingGroup) {\r\n // we are using the edge renderer defined for this instance\r\n this._sourceMesh._renderingGroup._edgesRenderers.push(this._edgesRenderer);\r\n }\r\n }\r\n\r\n public override getWorldMatrix(): Matrix {\r\n if (\r\n this._currentLOD &&\r\n this._currentLOD !== this._sourceMesh &&\r\n this._currentLOD.billboardMode !== TransformNode.BILLBOARDMODE_NONE &&\r\n this._currentLOD._masterMesh !== this\r\n ) {\r\n if (!this._billboardWorldMatrix) {\r\n this._billboardWorldMatrix = new Matrix();\r\n }\r\n const tempMaster = this._currentLOD._masterMesh;\r\n this._currentLOD._masterMesh = this;\r\n TmpVectors.Vector3[7].copyFrom(this._currentLOD.position);\r\n this._currentLOD.position.set(0, 0, 0);\r\n this._billboardWorldMatrix.copyFrom(this._currentLOD.computeWorldMatrix(true));\r\n this._currentLOD.position.copyFrom(TmpVectors.Vector3[7]);\r\n this._currentLOD._masterMesh = tempMaster;\r\n return this._billboardWorldMatrix;\r\n }\r\n\r\n return super.getWorldMatrix();\r\n }\r\n\r\n public override get isAnInstance(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Returns the current associated LOD AbstractMesh.\r\n * @param camera defines the camera to use to pick the LOD level\r\n * @returns a Mesh or `null` if no LOD is associated with the AbstractMesh\r\n */\r\n public override getLOD(camera: Camera): AbstractMesh {\r\n if (!camera) {\r\n return this;\r\n }\r\n\r\n const sourceMeshLODLevels = this.sourceMesh.getLODLevels();\r\n if (!sourceMeshLODLevels || sourceMeshLODLevels.length === 0) {\r\n this._currentLOD = this.sourceMesh;\r\n } else {\r\n const boundingInfo = this.getBoundingInfo();\r\n this._currentLOD = <Mesh>this.sourceMesh.getLOD(camera, boundingInfo.boundingSphere);\r\n }\r\n\r\n return this._currentLOD;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _preActivateForIntermediateRendering(renderId: number): Mesh {\r\n return this.sourceMesh._preActivateForIntermediateRendering(renderId);\r\n }\r\n\r\n /** @internal */\r\n public _syncSubMeshes(): InstancedMesh {\r\n this.releaseSubMeshes();\r\n if (this._sourceMesh.subMeshes) {\r\n for (let index = 0; index < this._sourceMesh.subMeshes.length; index++) {\r\n this._sourceMesh.subMeshes[index].clone(this, this._sourceMesh);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public override _generatePointsArray(): boolean {\r\n return this._sourceMesh._generatePointsArray();\r\n }\r\n\r\n /** @internal */\r\n public override _updateBoundingInfo(): AbstractMesh {\r\n if (this.hasBoundingInfo) {\r\n this.getBoundingInfo().update(this.worldMatrixFromCache);\r\n } else {\r\n this.buildBoundingInfo(this.absolutePosition, this.absolutePosition, this.worldMatrixFromCache);\r\n }\r\n this._updateSubMeshesBoundingInfo(this.worldMatrixFromCache);\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates a new InstancedMesh from the current mesh.\r\n *\r\n * Returns the clone.\r\n * @param name the cloned mesh name\r\n * @param newParent the optional Node to parent the clone to.\r\n * @param doNotCloneChildren if `true` the model children aren't cloned.\r\n * @param newSourceMesh if set this mesh will be used as the source mesh instead of ths instance's one\r\n * @returns the clone\r\n */\r\n public override clone(name: string, newParent: Nullable<Node> = null, doNotCloneChildren?: boolean, newSourceMesh?: Mesh): InstancedMesh {\r\n const result = (newSourceMesh || this._sourceMesh).createInstance(name);\r\n\r\n // Deep copy\r\n DeepCopier.DeepCopy(\r\n this,\r\n result,\r\n [\r\n \"name\",\r\n \"subMeshes\",\r\n \"uniqueId\",\r\n \"parent\",\r\n \"lightSources\",\r\n \"receiveShadows\",\r\n \"material\",\r\n \"visibility\",\r\n \"skeleton\",\r\n \"sourceMesh\",\r\n \"isAnInstance\",\r\n \"facetNb\",\r\n \"isFacetDataEnabled\",\r\n \"isBlocked\",\r\n \"useBones\",\r\n \"hasInstances\",\r\n \"collider\",\r\n \"edgesRenderer\",\r\n \"forward\",\r\n \"up\",\r\n \"right\",\r\n \"absolutePosition\",\r\n \"absoluteScaling\",\r\n \"absoluteRotationQuaternion\",\r\n \"isWorldMatrixFrozen\",\r\n \"nonUniformScaling\",\r\n \"behaviors\",\r\n \"worldMatrixFromCache\",\r\n \"hasThinInstances\",\r\n \"hasBoundingInfo\",\r\n \"geometry\",\r\n ],\r\n []\r\n );\r\n\r\n // Bounding info\r\n this.refreshBoundingInfo();\r\n\r\n // Parent\r\n if (newParent) {\r\n result.parent = newParent;\r\n }\r\n\r\n if (!doNotCloneChildren) {\r\n // Children\r\n for (let index = 0; index < this.getScene().meshes.length; index++) {\r\n const mesh = this.getScene().meshes[index];\r\n\r\n if (mesh.parent === this) {\r\n mesh.clone(mesh.name, result);\r\n }\r\n }\r\n }\r\n\r\n result.computeWorldMatrix(true);\r\n\r\n this.onClonedObservable.notifyObservers(result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Disposes the InstancedMesh.\r\n * Returns nothing.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public override dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n // Remove from mesh\r\n this._sourceMesh.removeInstance(this);\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _serializeAsParent(serializationObject: any) {\r\n super._serializeAsParent(serializationObject);\r\n\r\n serializationObject.parentId = this._sourceMesh.uniqueId;\r\n serializationObject.parentInstanceIndex = this._indexInSourceMeshInstanceArray;\r\n }\r\n\r\n /**\r\n * Instantiate (when possible) or clone that node with its hierarchy\r\n * @param newParent defines the new parent to use for the instance (or clone)\r\n * @param options defines options to configure how copy is done\r\n * @param options.doNotInstantiate defines if the model must be instantiated or just cloned\r\n * @param options.newSourcedMesh newSourcedMesh the new source mesh for the instance (or clone)\r\n * @param onNewNodeCreated defines an option callback to call when a clone or an instance is created\r\n * @returns an instance (or a clone) of the current node with its hierarchy\r\n */\r\n public override instantiateHierarchy(\r\n newParent: Nullable<TransformNode> = null,\r\n options?: { doNotInstantiate: boolean | ((node: TransformNode) => boolean); newSourcedMesh?: Mesh },\r\n onNewNodeCreated?: (source: TransformNode, clone: TransformNode) => void\r\n ): Nullable<TransformNode> {\r\n const clone = this.clone(\"Clone of \" + (this.name || this.id), newParent || this.parent, true, options && options.newSourcedMesh);\r\n\r\n if (clone) {\r\n if (onNewNodeCreated) {\r\n onNewNodeCreated(this, clone);\r\n }\r\n }\r\n\r\n for (const child of this.getChildTransformNodes(true)) {\r\n child.instantiateHierarchy(clone, options, onNewNodeCreated);\r\n }\r\n\r\n return clone;\r\n }\r\n}\r\n\r\ndeclare module \"./mesh\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Mesh {\r\n /**\r\n * Register a custom buffer that will be instanced\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances#custom-buffers\r\n * @param kind defines the buffer kind\r\n * @param stride defines the stride in floats\r\n */\r\n registerInstancedBuffer(kind: string, stride: number): void;\r\n\r\n /**\r\n * Invalidate VertexArrayObjects belonging to the mesh (but not to the Geometry of the mesh).\r\n */\r\n _invalidateInstanceVertexArrayObject(): void;\r\n\r\n /**\r\n * true to use the edge renderer for all instances of this mesh\r\n */\r\n edgesShareWithInstances: boolean;\r\n\r\n /** @internal */\r\n _userInstancedBuffersStorage: {\r\n data: { [key: string]: Float32Array };\r\n sizes: { [key: string]: number };\r\n vertexBuffers: { [key: string]: Nullable<VertexBuffer> };\r\n strides: { [key: string]: number };\r\n vertexArrayObjects?: { [key: string]: WebGLVertexArrayObject };\r\n renderPasses?: {\r\n [renderPassId: number]: { [kind: string]: Nullable<VertexBuffer> };\r\n };\r\n };\r\n }\r\n}\r\n\r\ndeclare module \"./abstractMesh\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface AbstractMesh {\r\n /**\r\n * Object used to store instanced buffers defined by user\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances#custom-buffers\r\n */\r\n instancedBuffers: { [key: string]: any };\r\n }\r\n}\r\n\r\nMesh.prototype.registerInstancedBuffer = function (kind: string, stride: number): void {\r\n // Remove existing one\r\n this._userInstancedBuffersStorage?.vertexBuffers[kind]?.dispose();\r\n\r\n // Creates the instancedBuffer field if not present\r\n if (!this.instancedBuffers) {\r\n this.instancedBuffers = {};\r\n\r\n for (const instance of this.instances) {\r\n instance.instancedBuffers = {};\r\n }\r\n }\r\n\r\n if (!this._userInstancedBuffersStorage) {\r\n this._userInstancedBuffersStorage = {\r\n data: {},\r\n vertexBuffers: {},\r\n strides: {},\r\n sizes: {},\r\n vertexArrayObjects: this.getEngine().getCaps().vertexArrayObject ? {} : undefined,\r\n };\r\n }\r\n\r\n // Creates an empty property for this kind\r\n this.instancedBuffers[kind] = null;\r\n\r\n this._userInstancedBuffersStorage.strides[kind] = stride;\r\n this._userInstancedBuffersStorage.sizes[kind] = stride * 32; // Initial size\r\n this._userInstancedBuffersStorage.data[kind] = new Float32Array(this._userInstancedBuffersStorage.sizes[kind]);\r\n this._userInstancedBuffersStorage.vertexBuffers[kind] = new VertexBuffer(this.getEngine(), this._userInstancedBuffersStorage.data[kind], kind, true, false, stride, true);\r\n\r\n for (const instance of this.instances) {\r\n instance.instancedBuffers[kind] = null;\r\n }\r\n\r\n this._invalidateInstanceVertexArrayObject();\r\n\r\n this._markSubMeshesAsAttributesDirty();\r\n};\r\n\r\nMesh.prototype._processInstancedBuffers = function (visibleInstances: Nullable<InstancedMesh[]>, renderSelf: boolean) {\r\n const instanceCount = visibleInstances ? visibleInstances.length : 0;\r\n\r\n for (const kind in this.instancedBuffers) {\r\n let size = this._userInstancedBuffersStorage.sizes[kind];\r\n const stride = this._userInstancedBuffersStorage.strides[kind];\r\n\r\n // Resize if required\r\n const expectedSize = (instanceCount + 1) * stride;\r\n\r\n while (size < expectedSize) {\r\n size *= 2;\r\n }\r\n\r\n if (this._userInstancedBuffersStorage.data[kind].length != size) {\r\n this._userInstancedBuffersStorage.data[kind] = new Float32Array(size);\r\n this._userInstancedBuffersStorage.sizes[kind] = size;\r\n if (this._userInstancedBuffersStorage.vertexBuffers[kind]) {\r\n this._userInstancedBuffersStorage.vertexBuffers[kind].dispose();\r\n this._userInstancedBuffersStorage.vertexBuffers[kind] = null;\r\n }\r\n }\r\n\r\n const data = this._userInstancedBuffersStorage.data[kind];\r\n\r\n // Update data buffer\r\n let offset = 0;\r\n if (renderSelf) {\r\n const value = this.instancedBuffers[kind];\r\n\r\n if (value.toArray) {\r\n value.toArray(data, offset);\r\n } else if (value.copyToArray) {\r\n value.copyToArray(data, offset);\r\n } else {\r\n data[offset] = value;\r\n }\r\n\r\n offset += stride;\r\n }\r\n\r\n for (let instanceIndex = 0; instanceIndex < instanceCount; instanceIndex++) {\r\n const instance = visibleInstances![instanceIndex];\r\n\r\n const value = instance.instancedBuffers[kind];\r\n\r\n if (value.toArray) {\r\n value.toArray(data, offset);\r\n } else if (value.copyToArray) {\r\n value.copyToArray(data, offset);\r\n } else {\r\n data[offset] = value;\r\n }\r\n\r\n offset += stride;\r\n }\r\n\r\n // Update vertex buffer\r\n if (!this._userInstancedBuffersStorage.vertexBuffers[kind]) {\r\n this._userInstancedBuffersStorage.vertexBuffers[kind] = new VertexBuffer(\r\n this.getEngine(),\r\n this._userInstancedBuffersStorage.data[kind],\r\n kind,\r\n true,\r\n false,\r\n stride,\r\n true\r\n );\r\n this._invalidateInstanceVertexArrayObject();\r\n } else {\r\n this._userInstancedBuffersStorage.vertexBuffers[kind].updateDirectly(data, 0);\r\n }\r\n }\r\n};\r\n\r\nMesh.prototype._invalidateInstanceVertexArrayObject = function () {\r\n if (!this._userInstancedBuffersStorage || this._userInstancedBuffersStorage.vertexArrayObjects === undefined) {\r\n return;\r\n }\r\n\r\n for (const kind in this._userInstancedBuffersStorage.vertexArrayObjects) {\r\n (this.getEngine() as ThinEngine).releaseVertexArrayObject(this._userInstancedBuffersStorage.vertexArrayObjects[kind]);\r\n }\r\n\r\n this._userInstancedBuffersStorage.vertexArrayObjects = {};\r\n};\r\n\r\nMesh.prototype._disposeInstanceSpecificData = function () {\r\n for (const renderPassId in this._instanceDataStorage.renderPasses) {\r\n this._instanceDataStorage.renderPasses[renderPassId].instancesBuffer?.dispose();\r\n }\r\n this._instanceDataStorage.renderPasses = {};\r\n\r\n while (this.instances.length) {\r\n this.instances[0].dispose();\r\n }\r\n\r\n for (const kind in this.instancedBuffers) {\r\n if (this._userInstancedBuffersStorage.vertexBuffers[kind]) {\r\n this._userInstancedBuffersStorage.vertexBuffers[kind].dispose();\r\n }\r\n }\r\n\r\n this._invalidateInstanceVertexArrayObject();\r\n\r\n this.instancedBuffers = {};\r\n};\r\n\r\n// Register Class Name\r\nRegisterClass(\"BABYLON.InstancedMesh\", InstancedMesh);\r\n"]}
1
+ {"version":3,"file":"instancedMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/instancedMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, FloatArray, IndicesArray } from \"../types\";\r\nimport type { Vector3 } from \"../Maths/math.vector\";\r\nimport { Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Node } from \"../node\";\r\nimport type { IMeshDataOptions } from \"../Meshes/abstractMesh\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { Skeleton } from \"../Bones/skeleton\";\r\nimport { DeepCopier } from \"../Misc/deepCopier\";\r\nimport { TransformNode } from \"./transformNode\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport type { Geometry } from \"./geometry\";\r\n\r\nMesh._instancedMeshFactory = (name: string, mesh: Mesh): InstancedMesh => {\r\n const instance = new InstancedMesh(name, mesh);\r\n\r\n if (mesh.instancedBuffers) {\r\n instance.instancedBuffers = {};\r\n\r\n for (const key in mesh.instancedBuffers) {\r\n instance.instancedBuffers[key] = mesh.instancedBuffers[key];\r\n }\r\n }\r\n\r\n return instance;\r\n};\r\n\r\n/**\r\n * Creates an instance based on a source mesh.\r\n */\r\nexport class InstancedMesh extends AbstractMesh {\r\n private _sourceMesh: Mesh;\r\n private _currentLOD: Mesh;\r\n private _billboardWorldMatrix: Matrix;\r\n\r\n /** @internal */\r\n public _indexInSourceMeshInstanceArray = -1;\r\n /** @internal */\r\n public _distanceToCamera: number = 0;\r\n /** @internal */\r\n public _previousWorldMatrix: Nullable<Matrix>;\r\n\r\n /**\r\n * Creates a new InstancedMesh object from the mesh source.\r\n * @param name defines the name of the instance\r\n * @param source the mesh to create the instance from\r\n */\r\n constructor(name: string, source: Mesh) {\r\n super(name, source.getScene());\r\n\r\n source.addInstance(this);\r\n\r\n this._sourceMesh = source;\r\n\r\n this._unIndexed = source._unIndexed;\r\n\r\n this.position.copyFrom(source.position);\r\n this.rotation.copyFrom(source.rotation);\r\n this.scaling.copyFrom(source.scaling);\r\n\r\n if (source.rotationQuaternion) {\r\n this.rotationQuaternion = source.rotationQuaternion.clone();\r\n }\r\n\r\n this.animations = source.animations.slice();\r\n for (const range of source.getAnimationRanges()) {\r\n if (range != null) {\r\n this.createAnimationRange(range.name, range.from, range.to);\r\n }\r\n }\r\n\r\n this.infiniteDistance = source.infiniteDistance;\r\n\r\n this.setPivotMatrix(source.getPivotMatrix());\r\n\r\n if (!source.skeleton && !source.morphTargetManager && source.hasBoundingInfo) {\r\n // without skeleton or morphTargetManager, use bounding info of source mesh directly\r\n const boundingInfo = source.getBoundingInfo();\r\n this.buildBoundingInfo(boundingInfo.minimum, boundingInfo.maximum);\r\n } else {\r\n this.refreshBoundingInfo(true, true);\r\n }\r\n this._syncSubMeshes();\r\n }\r\n\r\n /**\r\n * @returns the string \"InstancedMesh\".\r\n */\r\n public override getClassName(): string {\r\n return \"InstancedMesh\";\r\n }\r\n\r\n /** Gets the list of lights affecting that mesh */\r\n public override get lightSources(): Light[] {\r\n return this._sourceMesh._lightSources;\r\n }\r\n\r\n public override _resyncLightSources(): void {\r\n // Do nothing as all the work will be done by source mesh\r\n }\r\n\r\n public override _resyncLightSource(): void {\r\n // Do nothing as all the work will be done by source mesh\r\n }\r\n\r\n public override _removeLightSource(): void {\r\n // Do nothing as all the work will be done by source mesh\r\n }\r\n\r\n // Methods\r\n /**\r\n * If the source mesh receives shadows\r\n */\r\n public override get receiveShadows(): boolean {\r\n return this._sourceMesh.receiveShadows;\r\n }\r\n\r\n public override set receiveShadows(_value: boolean) {\r\n if (this._sourceMesh?.receiveShadows !== _value) {\r\n Tools.Warn(\"Setting receiveShadows on an instanced mesh has no effect\");\r\n }\r\n }\r\n\r\n /**\r\n * The material of the source mesh\r\n */\r\n public override get material(): Nullable<Material> {\r\n return this._sourceMesh.material;\r\n }\r\n\r\n public override set material(_value: Nullable<Material>) {\r\n if (this._sourceMesh?.material !== _value) {\r\n Tools.Warn(\"Setting material on an instanced mesh has no effect\");\r\n }\r\n }\r\n\r\n /**\r\n * Visibility of the source mesh\r\n */\r\n public override get visibility(): number {\r\n return this._sourceMesh.visibility;\r\n }\r\n\r\n public override set visibility(_value: number) {\r\n if (this._sourceMesh?.visibility !== _value) {\r\n Tools.Warn(\"Setting visibility on an instanced mesh has no effect\");\r\n }\r\n }\r\n\r\n /**\r\n * Skeleton of the source mesh\r\n */\r\n public override get skeleton(): Nullable<Skeleton> {\r\n return this._sourceMesh.skeleton;\r\n }\r\n\r\n public override set skeleton(_value: Nullable<Skeleton>) {\r\n if (this._sourceMesh?.skeleton !== _value) {\r\n Tools.Warn(\"Setting skeleton on an instanced mesh has no effect\");\r\n }\r\n }\r\n\r\n /**\r\n * Rendering ground id of the source mesh\r\n */\r\n public override get renderingGroupId(): number {\r\n return this._sourceMesh.renderingGroupId;\r\n }\r\n\r\n public override set renderingGroupId(value: number) {\r\n if (!this._sourceMesh || value === this._sourceMesh.renderingGroupId) {\r\n return;\r\n }\r\n\r\n //no-op with warning\r\n Logger.Warn(\"Note - setting renderingGroupId of an instanced mesh has no effect on the scene\");\r\n }\r\n\r\n /**\r\n * @returns the total number of vertices (integer).\r\n */\r\n public override getTotalVertices(): number {\r\n return this._sourceMesh ? this._sourceMesh.getTotalVertices() : 0;\r\n }\r\n\r\n /**\r\n * Returns a positive integer : the total number of indices in this mesh geometry.\r\n * @returns the number of indices or zero if the mesh has no geometry.\r\n */\r\n public override getTotalIndices(): number {\r\n return this._sourceMesh.getTotalIndices();\r\n }\r\n\r\n /**\r\n * The source mesh of the instance\r\n */\r\n public get sourceMesh(): Mesh {\r\n return this._sourceMesh;\r\n }\r\n\r\n /**\r\n * Gets the mesh internal Geometry object\r\n */\r\n public override get geometry(): Nullable<Geometry> {\r\n return this._sourceMesh._geometry;\r\n }\r\n\r\n /**\r\n * Creates a new InstancedMesh object from the mesh model.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\r\n * @param name defines the name of the new instance\r\n * @returns a new InstancedMesh\r\n */\r\n public createInstance(name: string): InstancedMesh {\r\n return this._sourceMesh.createInstance(name);\r\n }\r\n\r\n /**\r\n * Is this node ready to be used/rendered\r\n * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\r\n * @returns {boolean} is it ready\r\n */\r\n public override isReady(completeCheck = false): boolean {\r\n return this._sourceMesh.isReady(completeCheck, true);\r\n }\r\n\r\n /**\r\n * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.\r\n * @param kind kind of verticies to retrieve (eg. positions, normals, uvs, etc.)\r\n * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.\r\n * @param forceCopy defines a boolean forcing the copy of the buffer no matter what the value of copyWhenShared is\r\n * @returns a float array or a Float32Array of the requested kind of data : positions, normals, uvs, etc.\r\n */\r\n public override getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean): Nullable<FloatArray> {\r\n return this._sourceMesh.getVerticesData(kind, copyWhenShared, forceCopy);\r\n }\r\n\r\n public override copyVerticesData(kind: string, vertexData: { [kind: string]: Float32Array }): void {\r\n this._sourceMesh.copyVerticesData(kind, vertexData);\r\n }\r\n\r\n /**\r\n * Sets the vertex data of the mesh geometry for the requested `kind`.\r\n * If the mesh has no geometry, a new Geometry object is set to the mesh and then passed this vertex data.\r\n * The `data` are either a numeric array either a Float32Array.\r\n * The parameter `updatable` is passed as is to the underlying Geometry object constructor (if initially none) or updater.\r\n * The parameter `stride` is an optional positive integer, it is usually automatically deducted from the `kind` (3 for positions or normals, 2 for UV, etc).\r\n * Note that a new underlying VertexBuffer object is created each call.\r\n * If the `kind` is the `PositionKind`, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\r\n *\r\n * Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n *\r\n * Returns the Mesh.\r\n * @param kind defines vertex data kind\r\n * @param data defines the data source\r\n * @param updatable defines if the data must be flagged as updatable (false as default)\r\n * @param stride defines the vertex stride (optional)\r\n * @returns the current mesh\r\n */\r\n public override setVerticesData(kind: string, data: FloatArray, updatable?: boolean, stride?: number): AbstractMesh {\r\n if (this.sourceMesh) {\r\n this.sourceMesh.setVerticesData(kind, data, updatable, stride);\r\n }\r\n return this.sourceMesh;\r\n }\r\n\r\n /**\r\n * Updates the existing vertex data of the mesh geometry for the requested `kind`.\r\n * If the mesh has no geometry, it is simply returned as it is.\r\n * The `data` are either a numeric array either a Float32Array.\r\n * No new underlying VertexBuffer object is created.\r\n * If the `kind` is the `PositionKind` and if `updateExtends` is true, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\r\n * If the parameter `makeItUnique` is true, a new global geometry is created from this positions and is set to the mesh.\r\n *\r\n * Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n *\r\n * Returns the Mesh.\r\n * @param kind defines vertex data kind\r\n * @param data defines the data source\r\n * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for \"position\" kind\r\n * @param makeItUnique defines it the updated vertex buffer must be flagged as unique (false by default)\r\n * @returns the source mesh\r\n */\r\n public override updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): Mesh {\r\n if (this.sourceMesh) {\r\n this.sourceMesh.updateVerticesData(kind, data, updateExtends, makeItUnique);\r\n }\r\n return this.sourceMesh;\r\n }\r\n\r\n /**\r\n * Sets the mesh indices.\r\n * Expects an array populated with integers or a typed array (Int32Array, Uint32Array, Uint16Array).\r\n * If the mesh has no geometry, a new Geometry object is created and set to the mesh.\r\n * This method creates a new index buffer each call.\r\n * Returns the Mesh.\r\n * @param indices the source data\r\n * @param totalVertices defines the total number of vertices referenced by indices (could be null)\r\n * @returns source mesh\r\n */\r\n public override setIndices(indices: IndicesArray, totalVertices: Nullable<number> = null): Mesh {\r\n if (this.sourceMesh) {\r\n this.sourceMesh.setIndices(indices, totalVertices);\r\n }\r\n return this.sourceMesh;\r\n }\r\n\r\n /**\r\n * Boolean : True if the mesh owns the requested kind of data.\r\n * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @returns true if data kind is present\r\n */\r\n public override isVerticesDataPresent(kind: string): boolean {\r\n return this._sourceMesh.isVerticesDataPresent(kind);\r\n }\r\n\r\n /**\r\n * @returns an array of indices (IndicesArray).\r\n */\r\n public override getIndices(): Nullable<IndicesArray> {\r\n return this._sourceMesh.getIndices();\r\n }\r\n\r\n public override get _positions(): Nullable<Vector3[]> {\r\n return this._sourceMesh._positions;\r\n }\r\n\r\n public override refreshBoundingInfo(applySkeletonOrOptions: boolean | IMeshDataOptions = false, applyMorph: boolean = false): InstancedMesh {\r\n if (this.hasBoundingInfo && this.getBoundingInfo().isLocked) {\r\n return this;\r\n }\r\n\r\n let options: IMeshDataOptions;\r\n if (typeof applySkeletonOrOptions === \"object\") {\r\n options = applySkeletonOrOptions;\r\n } else {\r\n options = {\r\n applySkeleton: applySkeletonOrOptions,\r\n applyMorph: applyMorph,\r\n };\r\n }\r\n\r\n const bias = this._sourceMesh.geometry ? this._sourceMesh.geometry.boundingBias : null;\r\n this._refreshBoundingInfo(this._sourceMesh._getData(options, null, VertexBuffer.PositionKind), bias);\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public override _preActivate(): InstancedMesh {\r\n if (this._currentLOD) {\r\n this._currentLOD._preActivate();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _activate(renderId: number, intermediateRendering: boolean): boolean {\r\n super._activate(renderId, intermediateRendering);\r\n\r\n if (!this._sourceMesh.subMeshes) {\r\n Logger.Warn(\"Instances should only be created for meshes with geometry.\");\r\n }\r\n\r\n if (this._currentLOD) {\r\n const differentSign = this._currentLOD._getWorldMatrixDeterminant() >= 0 !== this._getWorldMatrixDeterminant() >= 0;\r\n if (differentSign) {\r\n this._internalAbstractMeshDataInfo._actAsRegularMesh = true;\r\n return true;\r\n }\r\n this._internalAbstractMeshDataInfo._actAsRegularMesh = false;\r\n\r\n this._currentLOD._registerInstanceForRenderId(this, renderId);\r\n\r\n if (intermediateRendering) {\r\n if (!this._currentLOD._internalAbstractMeshDataInfo._isActiveIntermediate) {\r\n this._currentLOD._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = true;\r\n return true;\r\n }\r\n } else {\r\n if (!this._currentLOD._internalAbstractMeshDataInfo._isActive) {\r\n this._currentLOD._internalAbstractMeshDataInfo._onlyForInstances = true;\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public override _postActivate(): void {\r\n if (this._sourceMesh.edgesShareWithInstances && this._sourceMesh._edgesRenderer && this._sourceMesh._edgesRenderer.isEnabled && this._sourceMesh._renderingGroup) {\r\n // we are using the edge renderer of the source mesh\r\n this._sourceMesh._renderingGroup._edgesRenderers.pushNoDuplicate(this._sourceMesh._edgesRenderer);\r\n this._sourceMesh._edgesRenderer.customInstances.push(this.getWorldMatrix());\r\n } else if (this._edgesRenderer && this._edgesRenderer.isEnabled && this._sourceMesh._renderingGroup) {\r\n // we are using the edge renderer defined for this instance\r\n this._sourceMesh._renderingGroup._edgesRenderers.push(this._edgesRenderer);\r\n }\r\n }\r\n\r\n public override getWorldMatrix(): Matrix {\r\n if (\r\n this._currentLOD &&\r\n this._currentLOD !== this._sourceMesh &&\r\n this._currentLOD.billboardMode !== TransformNode.BILLBOARDMODE_NONE &&\r\n this._currentLOD._masterMesh !== this\r\n ) {\r\n if (!this._billboardWorldMatrix) {\r\n this._billboardWorldMatrix = new Matrix();\r\n }\r\n const tempMaster = this._currentLOD._masterMesh;\r\n this._currentLOD._masterMesh = this;\r\n TmpVectors.Vector3[7].copyFrom(this._currentLOD.position);\r\n this._currentLOD.position.set(0, 0, 0);\r\n this._billboardWorldMatrix.copyFrom(this._currentLOD.computeWorldMatrix(true));\r\n this._currentLOD.position.copyFrom(TmpVectors.Vector3[7]);\r\n this._currentLOD._masterMesh = tempMaster;\r\n return this._billboardWorldMatrix;\r\n }\r\n\r\n return super.getWorldMatrix();\r\n }\r\n\r\n public override get isAnInstance(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Returns the current associated LOD AbstractMesh.\r\n * @param camera defines the camera to use to pick the LOD level\r\n * @returns a Mesh or `null` if no LOD is associated with the AbstractMesh\r\n */\r\n public override getLOD(camera: Camera): AbstractMesh {\r\n if (!camera) {\r\n return this;\r\n }\r\n\r\n const sourceMeshLODLevels = this.sourceMesh.getLODLevels();\r\n if (!sourceMeshLODLevels || sourceMeshLODLevels.length === 0) {\r\n this._currentLOD = this.sourceMesh;\r\n } else {\r\n const boundingInfo = this.getBoundingInfo();\r\n this._currentLOD = <Mesh>this.sourceMesh.getLOD(camera, boundingInfo.boundingSphere);\r\n }\r\n\r\n return this._currentLOD;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _preActivateForIntermediateRendering(renderId: number): Mesh {\r\n return this.sourceMesh._preActivateForIntermediateRendering(renderId);\r\n }\r\n\r\n /** @internal */\r\n public _syncSubMeshes(): InstancedMesh {\r\n this.releaseSubMeshes();\r\n if (this._sourceMesh.subMeshes) {\r\n for (let index = 0; index < this._sourceMesh.subMeshes.length; index++) {\r\n this._sourceMesh.subMeshes[index].clone(this, this._sourceMesh);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public override _generatePointsArray(): boolean {\r\n return this._sourceMesh._generatePointsArray();\r\n }\r\n\r\n /** @internal */\r\n public override _updateBoundingInfo(): AbstractMesh {\r\n if (this.hasBoundingInfo) {\r\n this.getBoundingInfo().update(this.worldMatrixFromCache);\r\n } else {\r\n this.buildBoundingInfo(this.absolutePosition, this.absolutePosition, this.worldMatrixFromCache);\r\n }\r\n this._updateSubMeshesBoundingInfo(this.worldMatrixFromCache);\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates a new InstancedMesh from the current mesh.\r\n *\r\n * Returns the clone.\r\n * @param name the cloned mesh name\r\n * @param newParent the optional Node to parent the clone to.\r\n * @param doNotCloneChildren if `true` the model children aren't cloned.\r\n * @param newSourceMesh if set this mesh will be used as the source mesh instead of ths instance's one\r\n * @returns the clone\r\n */\r\n public override clone(name: string, newParent: Nullable<Node> = null, doNotCloneChildren?: boolean, newSourceMesh?: Mesh): InstancedMesh {\r\n const result = (newSourceMesh || this._sourceMesh).createInstance(name);\r\n\r\n // Deep copy\r\n DeepCopier.DeepCopy(\r\n this,\r\n result,\r\n [\r\n \"name\",\r\n \"subMeshes\",\r\n \"uniqueId\",\r\n \"parent\",\r\n \"lightSources\",\r\n \"receiveShadows\",\r\n \"material\",\r\n \"visibility\",\r\n \"skeleton\",\r\n \"sourceMesh\",\r\n \"isAnInstance\",\r\n \"facetNb\",\r\n \"isFacetDataEnabled\",\r\n \"isBlocked\",\r\n \"useBones\",\r\n \"hasInstances\",\r\n \"collider\",\r\n \"edgesRenderer\",\r\n \"forward\",\r\n \"up\",\r\n \"right\",\r\n \"absolutePosition\",\r\n \"absoluteScaling\",\r\n \"absoluteRotationQuaternion\",\r\n \"isWorldMatrixFrozen\",\r\n \"nonUniformScaling\",\r\n \"behaviors\",\r\n \"worldMatrixFromCache\",\r\n \"hasThinInstances\",\r\n \"hasBoundingInfo\",\r\n \"geometry\",\r\n ],\r\n []\r\n );\r\n\r\n // Parent\r\n if (newParent) {\r\n result.parent = newParent;\r\n }\r\n\r\n if (!doNotCloneChildren) {\r\n // Children\r\n for (let index = 0; index < this.getScene().meshes.length; index++) {\r\n const mesh = this.getScene().meshes[index];\r\n\r\n if (mesh.parent === this) {\r\n mesh.clone(mesh.name, result);\r\n }\r\n }\r\n }\r\n\r\n result.computeWorldMatrix(true);\r\n\r\n this.onClonedObservable.notifyObservers(result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Disposes the InstancedMesh.\r\n * Returns nothing.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public override dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n // Remove from mesh\r\n this._sourceMesh.removeInstance(this);\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _serializeAsParent(serializationObject: any) {\r\n super._serializeAsParent(serializationObject);\r\n\r\n serializationObject.parentId = this._sourceMesh.uniqueId;\r\n serializationObject.parentInstanceIndex = this._indexInSourceMeshInstanceArray;\r\n }\r\n\r\n /**\r\n * Instantiate (when possible) or clone that node with its hierarchy\r\n * @param newParent defines the new parent to use for the instance (or clone)\r\n * @param options defines options to configure how copy is done\r\n * @param options.doNotInstantiate defines if the model must be instantiated or just cloned\r\n * @param options.newSourcedMesh newSourcedMesh the new source mesh for the instance (or clone)\r\n * @param onNewNodeCreated defines an option callback to call when a clone or an instance is created\r\n * @returns an instance (or a clone) of the current node with its hierarchy\r\n */\r\n public override instantiateHierarchy(\r\n newParent: Nullable<TransformNode> = null,\r\n options?: { doNotInstantiate: boolean | ((node: TransformNode) => boolean); newSourcedMesh?: Mesh },\r\n onNewNodeCreated?: (source: TransformNode, clone: TransformNode) => void\r\n ): Nullable<TransformNode> {\r\n const clone = this.clone(\"Clone of \" + (this.name || this.id), newParent || this.parent, true, options && options.newSourcedMesh);\r\n\r\n if (clone) {\r\n if (onNewNodeCreated) {\r\n onNewNodeCreated(this, clone);\r\n }\r\n }\r\n\r\n for (const child of this.getChildTransformNodes(true)) {\r\n child.instantiateHierarchy(clone, options, onNewNodeCreated);\r\n }\r\n\r\n return clone;\r\n }\r\n}\r\n\r\ndeclare module \"./mesh\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Mesh {\r\n /**\r\n * Register a custom buffer that will be instanced\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances#custom-buffers\r\n * @param kind defines the buffer kind\r\n * @param stride defines the stride in floats\r\n */\r\n registerInstancedBuffer(kind: string, stride: number): void;\r\n\r\n /**\r\n * Invalidate VertexArrayObjects belonging to the mesh (but not to the Geometry of the mesh).\r\n */\r\n _invalidateInstanceVertexArrayObject(): void;\r\n\r\n /**\r\n * true to use the edge renderer for all instances of this mesh\r\n */\r\n edgesShareWithInstances: boolean;\r\n\r\n /** @internal */\r\n _userInstancedBuffersStorage: {\r\n data: { [key: string]: Float32Array };\r\n sizes: { [key: string]: number };\r\n vertexBuffers: { [key: string]: Nullable<VertexBuffer> };\r\n strides: { [key: string]: number };\r\n vertexArrayObjects?: { [key: string]: WebGLVertexArrayObject };\r\n renderPasses?: {\r\n [renderPassId: number]: { [kind: string]: Nullable<VertexBuffer> };\r\n };\r\n };\r\n }\r\n}\r\n\r\ndeclare module \"./abstractMesh\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface AbstractMesh {\r\n /**\r\n * Object used to store instanced buffers defined by user\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances#custom-buffers\r\n */\r\n instancedBuffers: { [key: string]: any };\r\n }\r\n}\r\n\r\nMesh.prototype.registerInstancedBuffer = function (kind: string, stride: number): void {\r\n // Remove existing one\r\n this._userInstancedBuffersStorage?.vertexBuffers[kind]?.dispose();\r\n\r\n // Creates the instancedBuffer field if not present\r\n if (!this.instancedBuffers) {\r\n this.instancedBuffers = {};\r\n\r\n for (const instance of this.instances) {\r\n instance.instancedBuffers = {};\r\n }\r\n }\r\n\r\n if (!this._userInstancedBuffersStorage) {\r\n this._userInstancedBuffersStorage = {\r\n data: {},\r\n vertexBuffers: {},\r\n strides: {},\r\n sizes: {},\r\n vertexArrayObjects: this.getEngine().getCaps().vertexArrayObject ? {} : undefined,\r\n };\r\n }\r\n\r\n // Creates an empty property for this kind\r\n this.instancedBuffers[kind] = null;\r\n\r\n this._userInstancedBuffersStorage.strides[kind] = stride;\r\n this._userInstancedBuffersStorage.sizes[kind] = stride * 32; // Initial size\r\n this._userInstancedBuffersStorage.data[kind] = new Float32Array(this._userInstancedBuffersStorage.sizes[kind]);\r\n this._userInstancedBuffersStorage.vertexBuffers[kind] = new VertexBuffer(this.getEngine(), this._userInstancedBuffersStorage.data[kind], kind, true, false, stride, true);\r\n\r\n for (const instance of this.instances) {\r\n instance.instancedBuffers[kind] = null;\r\n }\r\n\r\n this._invalidateInstanceVertexArrayObject();\r\n\r\n this._markSubMeshesAsAttributesDirty();\r\n};\r\n\r\nMesh.prototype._processInstancedBuffers = function (visibleInstances: Nullable<InstancedMesh[]>, renderSelf: boolean) {\r\n const instanceCount = visibleInstances ? visibleInstances.length : 0;\r\n\r\n for (const kind in this.instancedBuffers) {\r\n let size = this._userInstancedBuffersStorage.sizes[kind];\r\n const stride = this._userInstancedBuffersStorage.strides[kind];\r\n\r\n // Resize if required\r\n const expectedSize = (instanceCount + 1) * stride;\r\n\r\n while (size < expectedSize) {\r\n size *= 2;\r\n }\r\n\r\n if (this._userInstancedBuffersStorage.data[kind].length != size) {\r\n this._userInstancedBuffersStorage.data[kind] = new Float32Array(size);\r\n this._userInstancedBuffersStorage.sizes[kind] = size;\r\n if (this._userInstancedBuffersStorage.vertexBuffers[kind]) {\r\n this._userInstancedBuffersStorage.vertexBuffers[kind].dispose();\r\n this._userInstancedBuffersStorage.vertexBuffers[kind] = null;\r\n }\r\n }\r\n\r\n const data = this._userInstancedBuffersStorage.data[kind];\r\n\r\n // Update data buffer\r\n let offset = 0;\r\n if (renderSelf) {\r\n const value = this.instancedBuffers[kind];\r\n\r\n if (value.toArray) {\r\n value.toArray(data, offset);\r\n } else if (value.copyToArray) {\r\n value.copyToArray(data, offset);\r\n } else {\r\n data[offset] = value;\r\n }\r\n\r\n offset += stride;\r\n }\r\n\r\n for (let instanceIndex = 0; instanceIndex < instanceCount; instanceIndex++) {\r\n const instance = visibleInstances![instanceIndex];\r\n\r\n const value = instance.instancedBuffers[kind];\r\n\r\n if (value.toArray) {\r\n value.toArray(data, offset);\r\n } else if (value.copyToArray) {\r\n value.copyToArray(data, offset);\r\n } else {\r\n data[offset] = value;\r\n }\r\n\r\n offset += stride;\r\n }\r\n\r\n // Update vertex buffer\r\n if (!this._userInstancedBuffersStorage.vertexBuffers[kind]) {\r\n this._userInstancedBuffersStorage.vertexBuffers[kind] = new VertexBuffer(\r\n this.getEngine(),\r\n this._userInstancedBuffersStorage.data[kind],\r\n kind,\r\n true,\r\n false,\r\n stride,\r\n true\r\n );\r\n this._invalidateInstanceVertexArrayObject();\r\n } else {\r\n this._userInstancedBuffersStorage.vertexBuffers[kind].updateDirectly(data, 0);\r\n }\r\n }\r\n};\r\n\r\nMesh.prototype._invalidateInstanceVertexArrayObject = function () {\r\n if (!this._userInstancedBuffersStorage || this._userInstancedBuffersStorage.vertexArrayObjects === undefined) {\r\n return;\r\n }\r\n\r\n for (const kind in this._userInstancedBuffersStorage.vertexArrayObjects) {\r\n (this.getEngine() as ThinEngine).releaseVertexArrayObject(this._userInstancedBuffersStorage.vertexArrayObjects[kind]);\r\n }\r\n\r\n this._userInstancedBuffersStorage.vertexArrayObjects = {};\r\n};\r\n\r\nMesh.prototype._disposeInstanceSpecificData = function () {\r\n for (const renderPassId in this._instanceDataStorage.renderPasses) {\r\n this._instanceDataStorage.renderPasses[renderPassId].instancesBuffer?.dispose();\r\n }\r\n this._instanceDataStorage.renderPasses = {};\r\n\r\n while (this.instances.length) {\r\n this.instances[0].dispose();\r\n }\r\n\r\n for (const kind in this.instancedBuffers) {\r\n if (this._userInstancedBuffersStorage.vertexBuffers[kind]) {\r\n this._userInstancedBuffersStorage.vertexBuffers[kind].dispose();\r\n }\r\n }\r\n\r\n this._invalidateInstanceVertexArrayObject();\r\n\r\n this.instancedBuffers = {};\r\n};\r\n\r\n// Register Class Name\r\nRegisterClass(\"BABYLON.InstancedMesh\", InstancedMesh);\r\n"]}
@@ -0,0 +1,35 @@
1
+ import { NodeParticleBlock } from "../../nodeParticleBlock.js";
2
+ import type { NodeParticleConnectionPoint } from "../../nodeParticleBlockConnectionPoint.js";
3
+ import type { NodeParticleBuildState } from "../../nodeParticleBuildState.js";
4
+ /**
5
+ * Block used to update the age of a particle
6
+ */
7
+ export declare class UpdateAgeBlock extends NodeParticleBlock {
8
+ /**
9
+ * Create a new UpdateAgeBlock
10
+ * @param name defines the block name
11
+ */
12
+ constructor(name: string);
13
+ /**
14
+ * Gets the particle component
15
+ */
16
+ get particle(): NodeParticleConnectionPoint;
17
+ /**
18
+ * Gets the age input component
19
+ */
20
+ get age(): NodeParticleConnectionPoint;
21
+ /**
22
+ * Gets the output component
23
+ */
24
+ get output(): NodeParticleConnectionPoint;
25
+ /**
26
+ * Gets the current class name
27
+ * @returns the class name
28
+ */
29
+ getClassName(): string;
30
+ /**
31
+ * Builds the block
32
+ * @param state defines the current build state
33
+ */
34
+ _build(state: NodeParticleBuildState): void;
35
+ }
@@ -0,0 +1,73 @@
1
+ import { RegisterClass } from "../../../../Misc/typeStore.js";
2
+ import { NodeParticleBlockConnectionPointTypes } from "../../Enums/nodeParticleBlockConnectionPointTypes.js";
3
+ import { NodeParticleBlock } from "../../nodeParticleBlock.js";
4
+ import { _ConnectAtTheEnd } from "../../../Queue/executionQueue.js";
5
+ /**
6
+ * Block used to update the age of a particle
7
+ */
8
+ export class UpdateAgeBlock extends NodeParticleBlock {
9
+ /**
10
+ * Create a new UpdateAgeBlock
11
+ * @param name defines the block name
12
+ */
13
+ constructor(name) {
14
+ super(name);
15
+ this.registerInput("particle", NodeParticleBlockConnectionPointTypes.Particle);
16
+ this.registerInput("age", NodeParticleBlockConnectionPointTypes.Float);
17
+ this.registerOutput("output", NodeParticleBlockConnectionPointTypes.Particle);
18
+ }
19
+ /**
20
+ * Gets the particle component
21
+ */
22
+ get particle() {
23
+ return this._inputs[0];
24
+ }
25
+ /**
26
+ * Gets the age input component
27
+ */
28
+ get age() {
29
+ return this._inputs[1];
30
+ }
31
+ /**
32
+ * Gets the output component
33
+ */
34
+ get output() {
35
+ return this._outputs[0];
36
+ }
37
+ /**
38
+ * Gets the current class name
39
+ * @returns the class name
40
+ */
41
+ getClassName() {
42
+ return "UpdateAgeBlock";
43
+ }
44
+ /**
45
+ * Builds the block
46
+ * @param state defines the current build state
47
+ */
48
+ _build(state) {
49
+ const system = this.particle.getConnectedValue(state);
50
+ this.output._storedValue = system;
51
+ if (!this.age.isConnected) {
52
+ return;
53
+ }
54
+ const processAge = (particle) => {
55
+ state.particleContext = particle;
56
+ state.systemContext = system;
57
+ particle.age = this.age.getConnectedValue(state);
58
+ };
59
+ const ageProcessing = {
60
+ process: processAge,
61
+ previousItem: null,
62
+ nextItem: null,
63
+ };
64
+ if (system._updateQueueStart) {
65
+ _ConnectAtTheEnd(ageProcessing, system._updateQueueStart);
66
+ }
67
+ else {
68
+ system._updateQueueStart = ageProcessing;
69
+ }
70
+ }
71
+ }
72
+ RegisterClass("BABYLON.UpdateAgeBlock", UpdateAgeBlock);
73
+ //# sourceMappingURL=updateAgeBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateAgeBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Particles/Node/Blocks/Update/updateAgeBlock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,qCAAqC,EAAE,MAAM,mDAAmD,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAK5D,OAAO,EAAE,gBAAgB,EAAE,yCAA4C;AAEvE;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,iBAAiB;IACjD;;;OAGG;IACH,YAAmB,IAAY;QAC3B,KAAK,CAAC,IAAI,CAAC,CAAC;QAEZ,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,qCAAqC,CAAC,QAAQ,CAAC,CAAC;QAC/E,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,qCAAqC,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,qCAAqC,CAAC,QAAQ,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,GAAG;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACa,YAAY;QACxB,OAAO,gBAAgB,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACa,MAAM,CAAC,KAA6B;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAuB,CAAC;QAE5E,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC;QAElC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO;QACX,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,QAAkB,EAAE,EAAE;YACtC,KAAK,CAAC,eAAe,GAAG,QAAQ,CAAC;YACjC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;YAC7B,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG;YAClB,OAAO,EAAE,UAAU;YACnB,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,IAAI;SACjB,CAAC;QAEF,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC3B,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,iBAAiB,GAAG,aAAa,CAAC;QAC7C,CAAC;IACL,CAAC;CACJ;AAED,aAAa,CAAC,wBAAwB,EAAE,cAAc,CAAC,CAAC","sourcesContent":["import { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { NodeParticleBlockConnectionPointTypes } from \"../../Enums/nodeParticleBlockConnectionPointTypes\";\r\nimport { NodeParticleBlock } from \"../../nodeParticleBlock\";\r\nimport type { NodeParticleConnectionPoint } from \"../../nodeParticleBlockConnectionPoint\";\r\nimport type { NodeParticleBuildState } from \"../../nodeParticleBuildState\";\r\nimport type { ThinParticleSystem } from \"core/Particles/thinParticleSystem\";\r\nimport type { Particle } from \"core/Particles/particle\";\r\nimport { _ConnectAtTheEnd } from \"core/Particles/Queue/executionQueue\";\r\n\r\n/**\r\n * Block used to update the age of a particle\r\n */\r\nexport class UpdateAgeBlock extends NodeParticleBlock {\r\n /**\r\n * Create a new UpdateAgeBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name);\r\n\r\n this.registerInput(\"particle\", NodeParticleBlockConnectionPointTypes.Particle);\r\n this.registerInput(\"age\", NodeParticleBlockConnectionPointTypes.Float);\r\n this.registerOutput(\"output\", NodeParticleBlockConnectionPointTypes.Particle);\r\n }\r\n\r\n /**\r\n * Gets the particle component\r\n */\r\n public get particle(): NodeParticleConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the age input component\r\n */\r\n public get age(): NodeParticleConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeParticleConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"UpdateAgeBlock\";\r\n }\r\n\r\n /**\r\n * Builds the block\r\n * @param state defines the current build state\r\n */\r\n public override _build(state: NodeParticleBuildState) {\r\n const system = this.particle.getConnectedValue(state) as ThinParticleSystem;\r\n\r\n this.output._storedValue = system;\r\n\r\n if (!this.age.isConnected) {\r\n return;\r\n }\r\n\r\n const processAge = (particle: Particle) => {\r\n state.particleContext = particle;\r\n state.systemContext = system;\r\n particle.age = this.age.getConnectedValue(state);\r\n };\r\n\r\n const ageProcessing = {\r\n process: processAge,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n if (system._updateQueueStart) {\r\n _ConnectAtTheEnd(ageProcessing, system._updateQueueStart);\r\n } else {\r\n system._updateQueueStart = ageProcessing;\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.UpdateAgeBlock\", UpdateAgeBlock);\r\n"]}
@@ -8,6 +8,7 @@ export * from "./Update/updatePositionBlock.js";
8
8
  export * from "./Update/updateColorBlock.js";
9
9
  export * from "./Update/updateScaleBlock.js";
10
10
  export * from "./Update/updateAngleBlock.js";
11
+ export * from "./Update/updateAgeBlock.js";
11
12
  export * from "./Update/basicPositionUpdateBlock.js";
12
13
  export * from "./Update/basicSpriteUpdateBlock.js";
13
14
  export * from "./Update/updateSpriteCellIndexBlock.js";
@@ -9,6 +9,7 @@ export * from "./Update/updatePositionBlock.js";
9
9
  export * from "./Update/updateColorBlock.js";
10
10
  export * from "./Update/updateScaleBlock.js";
11
11
  export * from "./Update/updateAngleBlock.js";
12
+ export * from "./Update/updateAgeBlock.js";
12
13
  export * from "./Update/basicPositionUpdateBlock.js";
13
14
  export * from "./Update/basicSpriteUpdateBlock.js";
14
15
  export * from "./Update/updateSpriteCellIndexBlock.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Particles/Node/Blocks/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./systemBlock\";\r\nexport * from \"./particleInputBlock\";\r\nexport * from \"./particleSourceTextureBlock\";\r\nexport * from \"./particleMathBlock\";\r\nexport * from \"./particleLerpBlock\";\r\nexport * from \"./Update/updateDirectionBlock\";\r\nexport * from \"./Update/updatePositionBlock\";\r\nexport * from \"./Update/updateColorBlock\";\r\nexport * from \"./Update/updateScaleBlock\";\r\nexport * from \"./Update/updateAngleBlock\";\r\nexport * from \"./Update/basicPositionUpdateBlock\";\r\nexport * from \"./Update/basicSpriteUpdateBlock\";\r\nexport * from \"./Update/updateSpriteCellIndexBlock\";\r\nexport * from \"./Update/updateFlowMapBlock\";\r\nexport * from \"./Update/updateAttractorBlock\";\r\nexport * from \"./Emitters/index\";\r\nexport * from \"./particleGradientValueBlock\";\r\nexport * from \"./particleGradientBlock\";\r\nexport * from \"./particleConverterBlock\";\r\nexport * from \"./particleTrigonometryBlock\";\r\nexport * from \"./particleRandomBlock\";\r\nexport * from \"./particleDebugBlock\";\r\nexport * from \"./particleElbowBlock\";\r\nexport * from \"./Teleport/particleTeleportInBlock\";\r\nexport * from \"./Teleport/particleTeleportOutBlock\";\r\nexport * from \"./Conditions/particleConditionBlock\";\r\nexport * from \"./Triggers/particleTriggerBlock\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Particles/Node/Blocks/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./systemBlock\";\r\nexport * from \"./particleInputBlock\";\r\nexport * from \"./particleSourceTextureBlock\";\r\nexport * from \"./particleMathBlock\";\r\nexport * from \"./particleLerpBlock\";\r\nexport * from \"./Update/updateDirectionBlock\";\r\nexport * from \"./Update/updatePositionBlock\";\r\nexport * from \"./Update/updateColorBlock\";\r\nexport * from \"./Update/updateScaleBlock\";\r\nexport * from \"./Update/updateAngleBlock\";\r\nexport * from \"./Update/updateAgeBlock\";\r\nexport * from \"./Update/basicPositionUpdateBlock\";\r\nexport * from \"./Update/basicSpriteUpdateBlock\";\r\nexport * from \"./Update/updateSpriteCellIndexBlock\";\r\nexport * from \"./Update/updateFlowMapBlock\";\r\nexport * from \"./Update/updateAttractorBlock\";\r\nexport * from \"./Emitters/index\";\r\nexport * from \"./particleGradientValueBlock\";\r\nexport * from \"./particleGradientBlock\";\r\nexport * from \"./particleConverterBlock\";\r\nexport * from \"./particleTrigonometryBlock\";\r\nexport * from \"./particleRandomBlock\";\r\nexport * from \"./particleDebugBlock\";\r\nexport * from \"./particleElbowBlock\";\r\nexport * from \"./Teleport/particleTeleportInBlock\";\r\nexport * from \"./Teleport/particleTeleportOutBlock\";\r\nexport * from \"./Conditions/particleConditionBlock\";\r\nexport * from \"./Triggers/particleTriggerBlock\";\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/core",
3
- "version": "8.22.1",
3
+ "version": "8.22.2",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",