@babylonjs/core 8.50.1 → 8.50.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.
|
@@ -793,13 +793,13 @@ export class AbstractEngine {
|
|
|
793
793
|
*/
|
|
794
794
|
// Not mixed with Version for tooling purpose.
|
|
795
795
|
static get NpmPackage() {
|
|
796
|
-
return "babylonjs@8.50.
|
|
796
|
+
return "babylonjs@8.50.2";
|
|
797
797
|
}
|
|
798
798
|
/**
|
|
799
799
|
* Returns the current version of the framework
|
|
800
800
|
*/
|
|
801
801
|
static get Version() {
|
|
802
|
-
return "8.50.
|
|
802
|
+
return "8.50.2";
|
|
803
803
|
}
|
|
804
804
|
/**
|
|
805
805
|
* 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 { IStencilStateProperties, 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 type { IInternalTextureLoader } from \"../Materials/Textures/Loaders/internalTextureLoader\";\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 * Note that setting useLargeWorldRendering will also set high precision matrices\r\n */\r\n useHighPrecisionMatrix?: boolean;\r\n\r\n /**\r\n * @experimental\r\n * LargeWorldRendering helps avoid floating point imprecision of rendering large worlds by\r\n * 1. Forcing highPrecisionMatrices (matrix computations in 64 bits instead of 32)\r\n * 2. Enabling floatingOriginMode in all scenes -- offsetting position-related uniform and attribute values before passing to shader so that active camera is centered at origin and world is offset by active camera position\r\n *\r\n * NOTE that if this mode is set during engineCreation, all scenes will have floatingOrigin offset and you do not need to send floatingOriginMode option to each scene creation.\r\n * If you'd like to have only specific scenes using the offset logic, you can set the flag on those scenes directly -- however, to achieve proper large world rendering, you must also set the useHighPrecisionMatrix option on engine.\r\n */\r\n readonly useLargeWorldRendering?: 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(false);\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 /** @internal */\r\n public _enableGPUDebugMarkers: 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 | IStencilStateProperties,\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 = AbstractEngine.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.50.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.50.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 * NOTE that modifying the object after engine creation will have no effect\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 // LargeWorldRendering set to true will set high precision matrix, regardless of useHighPrecisionMatrix value\r\n // It will also set all scenes to use floatingOriginMode upon their creation\r\n PerformanceConfigurator.SetMatrixPrecision(!!options.useLargeWorldRendering || !!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 * @param mipLevelCount defines the number of mip levels to allocate for the texture\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 mipLevelCount?: 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 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 * @param mipLevelCount defines the number of mip levels to allocate for the texture\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 mipLevelCount?: 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?: Nullable<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 /**\r\n * @internal\r\n * Function used to get the correct texture loader for a specific extension.\r\n * @param extension defines the file extension of the file being loaded\r\n * @param mimeType defines the optional mime type of the file being loaded\r\n * @returns the IInternalTextureLoader or null if it wasn't found\r\n */\r\n public static GetCompatibleTextureLoader(_extension: string, _mimeType?: string): Nullable<Promise<IInternalTextureLoader>> {\r\n return null;\r\n }\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 { IStencilStateProperties, 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 type { IInternalTextureLoader } from \"../Materials/Textures/Loaders/internalTextureLoader\";\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 * Note that setting useLargeWorldRendering will also set high precision matrices\r\n */\r\n useHighPrecisionMatrix?: boolean;\r\n\r\n /**\r\n * @experimental\r\n * LargeWorldRendering helps avoid floating point imprecision of rendering large worlds by\r\n * 1. Forcing highPrecisionMatrices (matrix computations in 64 bits instead of 32)\r\n * 2. Enabling floatingOriginMode in all scenes -- offsetting position-related uniform and attribute values before passing to shader so that active camera is centered at origin and world is offset by active camera position\r\n *\r\n * NOTE that if this mode is set during engineCreation, all scenes will have floatingOrigin offset and you do not need to send floatingOriginMode option to each scene creation.\r\n * If you'd like to have only specific scenes using the offset logic, you can set the flag on those scenes directly -- however, to achieve proper large world rendering, you must also set the useHighPrecisionMatrix option on engine.\r\n */\r\n readonly useLargeWorldRendering?: 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(false);\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 /** @internal */\r\n public _enableGPUDebugMarkers: 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 | IStencilStateProperties,\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 = AbstractEngine.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.50.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.50.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 * NOTE that modifying the object after engine creation will have no effect\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 // LargeWorldRendering set to true will set high precision matrix, regardless of useHighPrecisionMatrix value\r\n // It will also set all scenes to use floatingOriginMode upon their creation\r\n PerformanceConfigurator.SetMatrixPrecision(!!options.useLargeWorldRendering || !!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 * @param mipLevelCount defines the number of mip levels to allocate for the texture\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 mipLevelCount?: 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 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 * @param mipLevelCount defines the number of mip levels to allocate for the texture\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 mipLevelCount?: 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?: Nullable<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 /**\r\n * @internal\r\n * Function used to get the correct texture loader for a specific extension.\r\n * @param extension defines the file extension of the file being loaded\r\n * @param mimeType defines the optional mime type of the file being loaded\r\n * @returns the IInternalTextureLoader or null if it wasn't found\r\n */\r\n public static GetCompatibleTextureLoader(_extension: string, _mimeType?: string): Nullable<Promise<IInternalTextureLoader>> {\r\n return null;\r\n }\r\n}\r\n"]}
|
|
@@ -695,7 +695,8 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
695
695
|
return false;
|
|
696
696
|
}
|
|
697
697
|
if (!this._handResources.jointMeshes) {
|
|
698
|
-
this._originalMesh =
|
|
698
|
+
this._originalMesh =
|
|
699
|
+
this._originalMesh || this.options.jointMeshes?.sourceMesh || CreateIcoSphere("jointParent", WebXRHandTracking._ICOSPHERE_PARAMS, this._xrSessionManager.scene);
|
|
699
700
|
this._originalMesh.isVisible = false;
|
|
700
701
|
this._handResources.jointMeshes = WebXRHandTracking._GenerateTrackedJointMeshes(this.options, this._originalMesh);
|
|
701
702
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRHandTracking.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRHandTracking.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../../Meshes/mesh\";\r\nimport type { WebXRInput } from \"../webXRInput\";\r\nimport type { WebXRInputSource } from \"../webXRInputSource\";\r\nimport { Matrix, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { PhysicsImpostor } from \"../../Physics/v1/physicsImpostor\";\r\nimport { PhysicsAggregate } from \"../../Physics/v2/physicsAggregate\";\r\nimport { PhysicsMotionType, PhysicsShapeType } from \"../../Physics/v2/IPhysicsEnginePlugin\";\r\n\r\nimport type { IDisposable, Scene } from \"../../scene\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { InstancedMesh } from \"../../Meshes/instancedMesh\";\r\nimport type { ISceneLoaderAsyncResult } from \"../../Loading/sceneLoader\";\r\nimport { SceneLoader } from \"../../Loading/sceneLoader\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { NodeMaterial } from \"../../Materials/Node/nodeMaterial\";\r\nimport type { InputBlock } from \"../../Materials/Node/Blocks/Input/inputBlock\";\r\nimport { Material } from \"../../Materials/material\";\r\nimport { CreateIcoSphere } from \"../../Meshes/Builders/icoSphereBuilder\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Axis } from \"../../Maths/math.axis\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { WebXRCompositionLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { WebXRCamera } from \"../webXRCamera\";\r\nimport type { Node } from \"../../node\";\r\n\r\ndeclare const XRHand: XRHand;\r\n\r\n/**\r\n * Configuration interface for the hand tracking feature\r\n */\r\nexport interface IWebXRHandTrackingOptions {\r\n /**\r\n * The xrInput that will be used as source for new hands\r\n */\r\n xrInput: WebXRInput;\r\n\r\n /**\r\n * Configuration object for the joint meshes.\r\n */\r\n jointMeshes?: {\r\n /**\r\n * Should the meshes created be invisible (defaults to false).\r\n */\r\n invisible?: boolean;\r\n /**\r\n * A source mesh to be used to create instances. Defaults to an icosphere with two subdivisions and smooth lighting.\r\n * This mesh will be the source for all other (25) meshes.\r\n * It should have the general size of a single unit, as the instances will be scaled according to the provided radius.\r\n */\r\n sourceMesh?: Mesh;\r\n /**\r\n * This function will be called after a mesh was created for a specific joint.\r\n * Using this function you can either manipulate the instance or return a new mesh.\r\n * When returning a new mesh the instance created before will be disposed.\r\n * @param meshInstance An instance of the original joint mesh being used for the joint.\r\n * @param jointId The joint's index, see https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section for more info.\r\n * @param hand Which hand (\"left\", \"right\") the joint will be on.\r\n */\r\n onHandJointMeshGenerated?: (meshInstance: InstancedMesh, jointId: number, hand: XRHandedness) => AbstractMesh | undefined;\r\n /**\r\n * Should the source mesh stay visible (defaults to false).\r\n */\r\n keepOriginalVisible?: boolean;\r\n /**\r\n * Should each instance have its own physics impostor\r\n */\r\n enablePhysics?: boolean;\r\n /**\r\n * If enabled, override default physics properties\r\n */\r\n physicsProps?: { friction?: number; restitution?: number; impostorType?: number };\r\n /**\r\n * Scale factor for all joint meshes (defaults to 1)\r\n */\r\n scaleFactor?: number;\r\n };\r\n\r\n /**\r\n * Configuration object for the hand meshes.\r\n */\r\n handMeshes?: {\r\n /**\r\n * Should the default hand mesh be disabled. In this case, the spheres will be visible (unless set invisible).\r\n */\r\n disableDefaultMeshes?: boolean;\r\n /**\r\n * Rigged hand meshes that will be tracked to the user's hands. This will override the default hand mesh.\r\n */\r\n customMeshes?: {\r\n right: AbstractMesh;\r\n left: AbstractMesh;\r\n };\r\n /**\r\n * Are the meshes prepared for a left-handed system. Default hand meshes are right-handed.\r\n */\r\n meshesUseLeftHandedCoordinates?: boolean;\r\n /**\r\n * If a hand mesh was provided, this array will define what axis will update which node. This will override the default hand mesh\r\n */\r\n customRigMappings?: {\r\n right: XRHandMeshRigMapping;\r\n left: XRHandMeshRigMapping;\r\n };\r\n\r\n /**\r\n * Override the colors of the hand meshes.\r\n */\r\n customColors?: {\r\n base?: Color3;\r\n fresnel?: Color3;\r\n fingerColor?: Color3;\r\n tipFresnel?: Color3;\r\n };\r\n\r\n /**\r\n * Define whether or not the hand meshes should be disposed on just invisible when the session ends.\r\n * Not setting, or setting to false, will maintain the hand meshes in the scene after the session ends, which will allow q quicker re-entry into XR.\r\n */\r\n disposeOnSessionEnd?: boolean;\r\n\r\n /**\r\n * Setting this will allow the developer to avoid loading the NME material and use the standard material instead.\r\n */\r\n disableHandShader?: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Parts of the hands divided to writs and finger names\r\n */\r\nexport const enum HandPart {\r\n /**\r\n * HandPart - Wrist\r\n */\r\n WRIST = \"wrist\",\r\n /**\r\n * HandPart - The thumb\r\n */\r\n THUMB = \"thumb\",\r\n /**\r\n * HandPart - Index finger\r\n */\r\n INDEX = \"index\",\r\n /**\r\n * HandPart - Middle finger\r\n */\r\n MIDDLE = \"middle\",\r\n /**\r\n * HandPart - Ring finger\r\n */\r\n RING = \"ring\",\r\n /**\r\n * HandPart - Little finger\r\n */\r\n LITTLE = \"little\",\r\n}\r\n\r\n/**\r\n * Joints of the hand as defined by the WebXR specification.\r\n * https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section\r\n */\r\nexport const enum WebXRHandJoint {\r\n /** Wrist */\r\n WRIST = \"wrist\",\r\n\r\n /** Thumb near wrist */\r\n THUMB_METACARPAL = \"thumb-metacarpal\",\r\n /** Thumb first knuckle */\r\n THUMB_PHALANX_PROXIMAL = \"thumb-phalanx-proximal\",\r\n /** Thumb second knuckle */\r\n THUMB_PHALANX_DISTAL = \"thumb-phalanx-distal\",\r\n /** Thumb tip */\r\n THUMB_TIP = \"thumb-tip\",\r\n\r\n /** Index finger near wrist */\r\n INDEX_FINGER_METACARPAL = \"index-finger-metacarpal\",\r\n /** Index finger first knuckle */\r\n INDEX_FINGER_PHALANX_PROXIMAL = \"index-finger-phalanx-proximal\",\r\n /** Index finger second knuckle */\r\n INDEX_FINGER_PHALANX_INTERMEDIATE = \"index-finger-phalanx-intermediate\",\r\n /** Index finger third knuckle */\r\n INDEX_FINGER_PHALANX_DISTAL = \"index-finger-phalanx-distal\",\r\n /** Index finger tip */\r\n INDEX_FINGER_TIP = \"index-finger-tip\",\r\n\r\n /** Middle finger near wrist */\r\n MIDDLE_FINGER_METACARPAL = \"middle-finger-metacarpal\",\r\n /** Middle finger first knuckle */\r\n MIDDLE_FINGER_PHALANX_PROXIMAL = \"middle-finger-phalanx-proximal\",\r\n /** Middle finger second knuckle */\r\n MIDDLE_FINGER_PHALANX_INTERMEDIATE = \"middle-finger-phalanx-intermediate\",\r\n /** Middle finger third knuckle */\r\n MIDDLE_FINGER_PHALANX_DISTAL = \"middle-finger-phalanx-distal\",\r\n /** Middle finger tip */\r\n MIDDLE_FINGER_TIP = \"middle-finger-tip\",\r\n\r\n /** Ring finger near wrist */\r\n RING_FINGER_METACARPAL = \"ring-finger-metacarpal\",\r\n /** Ring finger first knuckle */\r\n RING_FINGER_PHALANX_PROXIMAL = \"ring-finger-phalanx-proximal\",\r\n /** Ring finger second knuckle */\r\n RING_FINGER_PHALANX_INTERMEDIATE = \"ring-finger-phalanx-intermediate\",\r\n /** Ring finger third knuckle */\r\n RING_FINGER_PHALANX_DISTAL = \"ring-finger-phalanx-distal\",\r\n /** Ring finger tip */\r\n RING_FINGER_TIP = \"ring-finger-tip\",\r\n\r\n /** Pinky finger near wrist */\r\n PINKY_FINGER_METACARPAL = \"pinky-finger-metacarpal\",\r\n /** Pinky finger first knuckle */\r\n PINKY_FINGER_PHALANX_PROXIMAL = \"pinky-finger-phalanx-proximal\",\r\n /** Pinky finger second knuckle */\r\n PINKY_FINGER_PHALANX_INTERMEDIATE = \"pinky-finger-phalanx-intermediate\",\r\n /** Pinky finger third knuckle */\r\n PINKY_FINGER_PHALANX_DISTAL = \"pinky-finger-phalanx-distal\",\r\n /** Pinky finger tip */\r\n PINKY_FINGER_TIP = \"pinky-finger-tip\",\r\n}\r\n\r\n/** A type encapsulating a dictionary mapping WebXR joints to bone names in a rigged hand mesh. */\r\nexport type XRHandMeshRigMapping = { [webXRJointName in WebXRHandJoint]: string };\r\n\r\nconst HandJointReferenceArray: WebXRHandJoint[] = [\r\n WebXRHandJoint.WRIST,\r\n WebXRHandJoint.THUMB_METACARPAL,\r\n WebXRHandJoint.THUMB_PHALANX_PROXIMAL,\r\n WebXRHandJoint.THUMB_PHALANX_DISTAL,\r\n WebXRHandJoint.THUMB_TIP,\r\n WebXRHandJoint.INDEX_FINGER_METACARPAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.INDEX_FINGER_TIP,\r\n WebXRHandJoint.MIDDLE_FINGER_METACARPAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.MIDDLE_FINGER_TIP,\r\n WebXRHandJoint.RING_FINGER_METACARPAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.RING_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.RING_FINGER_TIP,\r\n WebXRHandJoint.PINKY_FINGER_METACARPAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.PINKY_FINGER_TIP,\r\n];\r\n\r\nconst HandPartsDefinition: { [key in HandPart]: WebXRHandJoint[] } = {\r\n [HandPart.WRIST]: [WebXRHandJoint.WRIST],\r\n [HandPart.THUMB]: [WebXRHandJoint.THUMB_METACARPAL, WebXRHandJoint.THUMB_PHALANX_PROXIMAL, WebXRHandJoint.THUMB_PHALANX_DISTAL, WebXRHandJoint.THUMB_TIP],\r\n [HandPart.INDEX]: [\r\n WebXRHandJoint.INDEX_FINGER_METACARPAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.INDEX_FINGER_TIP,\r\n ],\r\n [HandPart.MIDDLE]: [\r\n WebXRHandJoint.MIDDLE_FINGER_METACARPAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.MIDDLE_FINGER_TIP,\r\n ],\r\n [HandPart.RING]: [\r\n WebXRHandJoint.RING_FINGER_METACARPAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.RING_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.RING_FINGER_TIP,\r\n ],\r\n [HandPart.LITTLE]: [\r\n WebXRHandJoint.PINKY_FINGER_METACARPAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.PINKY_FINGER_TIP,\r\n ],\r\n};\r\n\r\n/**\r\n * Representing a single hand (with its corresponding native XRHand object)\r\n */\r\nexport class WebXRHand implements IDisposable {\r\n /**\r\n * This observable will notify registered observers when the hand object has been set with a new mesh.\r\n * you can get the hand mesh using `webxrHand.handMesh`\r\n */\r\n public onHandMeshSetObservable = new Observable<WebXRHand>();\r\n\r\n private _scene: Scene;\r\n\r\n /**\r\n * Transform nodes that will directly receive the transforms from the WebXR matrix data.\r\n */\r\n private _jointTransforms = new Array<TransformNode>(HandJointReferenceArray.length);\r\n\r\n /**\r\n * The float array that will directly receive the transform matrix data from WebXR.\r\n */\r\n private _jointTransformMatrices = new Float32Array(HandJointReferenceArray.length * 16);\r\n private _jointSpaces: XRJointSpace[] = new Array(HandJointReferenceArray.length);\r\n\r\n private _tempJointMatrix = new Matrix();\r\n\r\n /**\r\n * The float array that will directly receive the joint radii from WebXR.\r\n */\r\n private _jointRadii = new Float32Array(HandJointReferenceArray.length);\r\n\r\n /**\r\n * The hand mesh's top-most parent, if any.\r\n */\r\n private _handMeshRoot: Nullable<Node> = null;\r\n\r\n /**\r\n * Get the hand mesh.\r\n */\r\n public get handMesh(): Nullable<AbstractMesh> {\r\n return this._handMesh;\r\n }\r\n\r\n /**\r\n * Get meshes of part of the hand.\r\n * @param part The part of hand to get.\r\n * @returns An array of meshes that correlate to the hand part requested.\r\n */\r\n public getHandPartMeshes(part: HandPart): AbstractMesh[] {\r\n return HandPartsDefinition[part].map((name) => this._jointMeshes[HandJointReferenceArray.indexOf(name)]);\r\n }\r\n\r\n /**\r\n * Retrieves a mesh linked to a named joint in the hand.\r\n * @param jointName The name of the joint.\r\n * @returns An AbstractMesh whose position corresponds with the joint position.\r\n */\r\n public getJointMesh(jointName: WebXRHandJoint): AbstractMesh {\r\n return this._jointMeshes[HandJointReferenceArray.indexOf(jointName)];\r\n }\r\n\r\n /**\r\n * Construct a new hand object\r\n * @param xrController The controller to which the hand correlates.\r\n * @param _jointMeshes The meshes to be used to track the hand joints.\r\n * @param _handMesh An optional hand mesh.\r\n * @param rigMapping An optional rig mapping for the hand mesh.\r\n * If not provided (but a hand mesh is provided),\r\n * it will be assumed that the hand mesh's bones are named\r\n * directly after the WebXR bone names.\r\n * @param _leftHandedMeshes Are the hand meshes left-handed-system meshes\r\n * @param _jointsInvisible Are the tracked joint meshes visible\r\n * @param _jointScaleFactor Scale factor for all joint meshes\r\n */\r\n constructor(\r\n /** The controller to which the hand correlates. */\r\n public readonly xrController: WebXRInputSource,\r\n private readonly _jointMeshes: AbstractMesh[],\r\n private _handMesh: Nullable<AbstractMesh>,\r\n /** An optional rig mapping for the hand mesh. If not provided (but a hand mesh is provided),\r\n * it will be assumed that the hand mesh's bones are named directly after the WebXR bone names. */\r\n readonly rigMapping: Nullable<XRHandMeshRigMapping>,\r\n private readonly _leftHandedMeshes: boolean = false,\r\n private readonly _jointsInvisible: boolean = false,\r\n private readonly _jointScaleFactor: number = 1\r\n ) {\r\n this._scene = _jointMeshes[0].getScene();\r\n\r\n // Initialize the joint transform quaternions and link the transforms to the bones.\r\n for (let jointIdx = 0; jointIdx < this._jointTransforms.length; jointIdx++) {\r\n this._jointTransforms[jointIdx] = new TransformNode(HandJointReferenceArray[jointIdx], this._scene);\r\n this._jointTransforms[jointIdx].rotationQuaternion = new Quaternion();\r\n\r\n // Set the rotation quaternion so we can use it later for tracking.\r\n if (_jointMeshes[jointIdx].rotationQuaternion) {\r\n _jointMeshes[jointIdx].rotationQuaternion = new Quaternion();\r\n } else {\r\n _jointMeshes[jointIdx].rotationQuaternion?.set(0, 0, 0, 1);\r\n }\r\n }\r\n\r\n if (_handMesh) {\r\n // Note that this logic needs to happen after we initialize the joint tracking transform nodes.\r\n this.setHandMesh(_handMesh, rigMapping);\r\n }\r\n\r\n // hide the motion controller, if available/loaded\r\n if (this.xrController.motionController) {\r\n if (this.xrController.motionController.rootMesh) {\r\n this.xrController.motionController.rootMesh.dispose(false, true);\r\n }\r\n }\r\n\r\n this.xrController.onMotionControllerInitObservable.add((motionController) => {\r\n motionController._doNotLoadControllerMesh = true;\r\n });\r\n }\r\n\r\n /**\r\n * Sets the current hand mesh to render for the WebXRHand.\r\n * @param handMesh The rigged hand mesh that will be tracked to the user's hand.\r\n * @param rigMapping The mapping from XRHandJoint to bone names to use with the mesh.\r\n * @param _xrSessionManager The XRSessionManager used to initialize the hand mesh.\r\n */\r\n public setHandMesh(handMesh: AbstractMesh, rigMapping: Nullable<XRHandMeshRigMapping>, _xrSessionManager?: WebXRSessionManager) {\r\n this._handMesh = handMesh;\r\n\r\n this._handMeshRoot = this._handMesh;\r\n while (this._handMeshRoot.parent) {\r\n this._handMeshRoot = this._handMeshRoot.parent;\r\n }\r\n\r\n // Avoid any strange frustum culling. We will manually control visibility via attach and detach.\r\n handMesh.alwaysSelectAsActiveMesh = true;\r\n const children = handMesh.getChildMeshes();\r\n for (const mesh of children) {\r\n mesh.alwaysSelectAsActiveMesh = true;\r\n }\r\n\r\n // Link the bones in the hand mesh to the transform nodes that will be bound to the WebXR tracked joints.\r\n if (this._handMesh.skeleton) {\r\n const handMeshSkeleton = this._handMesh.skeleton;\r\n for (let jointIdx = 0; jointIdx < HandJointReferenceArray.length; jointIdx++) {\r\n const jointName = HandJointReferenceArray[jointIdx];\r\n const jointBoneIdx = handMeshSkeleton.getBoneIndexByName(rigMapping ? rigMapping[jointName] : jointName);\r\n if (jointBoneIdx !== -1) {\r\n handMeshSkeleton.bones[jointBoneIdx].linkTransformNode(this._jointTransforms[jointIdx]);\r\n }\r\n }\r\n }\r\n\r\n this.onHandMeshSetObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Update this hand from the latest xr frame.\r\n * @param xrFrame The latest frame received from WebXR.\r\n * @param referenceSpace The current viewer reference space.\r\n * @param xrCamera the xr camera, used for parenting\r\n */\r\n public updateFromXRFrame(xrFrame: XRFrame, referenceSpace: XRReferenceSpace, xrCamera: WebXRCamera) {\r\n const hand = this.xrController.inputSource.hand;\r\n if (!hand) {\r\n return;\r\n }\r\n\r\n // TODO: Modify webxr.d.ts to better match WebXR IDL so we don't need this any cast.\r\n const anyHand: any = hand;\r\n for (let i = 0; i < HandJointReferenceArray.length; ++i) {\r\n this._jointSpaces[i] = anyHand[HandJointReferenceArray[i]] || hand.get(HandJointReferenceArray[i]);\r\n }\r\n let trackingSuccessful = false;\r\n\r\n if (xrFrame.fillPoses && xrFrame.fillJointRadii) {\r\n trackingSuccessful = xrFrame.fillPoses(this._jointSpaces, referenceSpace, this._jointTransformMatrices) && xrFrame.fillJointRadii(this._jointSpaces, this._jointRadii);\r\n } else if (xrFrame.getJointPose) {\r\n trackingSuccessful = true;\r\n // Warning: This codepath is slow by comparison, only here for compat.\r\n for (let jointIdx = 0; jointIdx < this._jointSpaces.length; jointIdx++) {\r\n const jointPose = xrFrame.getJointPose(this._jointSpaces[jointIdx], referenceSpace);\r\n if (jointPose) {\r\n this._jointTransformMatrices.set(jointPose.transform.matrix, jointIdx * 16);\r\n this._jointRadii[jointIdx] = jointPose.radius || 0.008;\r\n } else {\r\n trackingSuccessful = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!trackingSuccessful) {\r\n return;\r\n }\r\n\r\n // L1 Cache Optimization: Invert to LHS in valid Babylon systems IN PLACE\r\n // This linear loop is much faster than doing it per-object and avoids cache thrashing\r\n if (!this._scene.useRightHandedSystem) {\r\n for (let i = 0; i < HandJointReferenceArray.length; ++i) {\r\n const offset = i * 16;\r\n this._jointTransformMatrices[offset + 2] *= -1;\r\n this._jointTransformMatrices[offset + 6] *= -1;\r\n this._jointTransformMatrices[offset + 8] *= -1;\r\n this._jointTransformMatrices[offset + 9] *= -1;\r\n this._jointTransformMatrices[offset + 14] *= -1;\r\n }\r\n }\r\n\r\n for (let jointIdx = 0; jointIdx < HandJointReferenceArray.length; jointIdx++) {\r\n const jointTransform = this._jointTransforms[jointIdx];\r\n Matrix.FromArrayToRef(this._jointTransformMatrices, jointIdx * 16, this._tempJointMatrix);\r\n this._tempJointMatrix.decompose(undefined, jointTransform.rotationQuaternion!, jointTransform.position);\r\n\r\n // The radius we need to make the joint in order for it to roughly cover the joints of the user's real hand.\r\n const scaledJointRadius = this._jointRadii[jointIdx] * this._jointScaleFactor;\r\n\r\n const jointMesh = this._jointMeshes[jointIdx];\r\n jointMesh.isVisible = !this._handMesh && !this._jointsInvisible;\r\n jointMesh.position.copyFrom(jointTransform.position);\r\n jointMesh.rotationQuaternion!.copyFrom(jointTransform.rotationQuaternion!);\r\n jointMesh.scaling.setAll(scaledJointRadius);\r\n jointMesh.parent = xrCamera.parent;\r\n\r\n // Restore correct transform for meshes that are NOT left-handed (e.g. default GLTF)\r\n // The buffer is now LHS, so if the mesh expects RHS, we must un-flip.\r\n if (!this._leftHandedMeshes && !this._scene.useRightHandedSystem && this._handMesh) {\r\n jointTransform.position.z *= -1;\r\n jointTransform.rotationQuaternion!.z *= -1;\r\n jointTransform.rotationQuaternion!.w *= -1;\r\n }\r\n }\r\n\r\n if (this._handMesh) {\r\n this._handMesh.isVisible = true;\r\n\r\n if (this._handMeshRoot) {\r\n this._handMeshRoot.parent = xrCamera.parent;\r\n }\r\n }\r\n\r\n this.xrController.pointer.parent = xrCamera.parent;\r\n }\r\n\r\n /**\r\n * Dispose this Hand object\r\n * @param disposeMeshes Should the meshes be disposed as well\r\n */\r\n public dispose(disposeMeshes = false) {\r\n if (this._handMesh) {\r\n if (disposeMeshes) {\r\n this._handMesh.skeleton?.dispose();\r\n this._handMesh.dispose(false, true);\r\n } else {\r\n this._handMesh.isVisible = false;\r\n }\r\n }\r\n for (const transform of this._jointTransforms) {\r\n transform.dispose();\r\n }\r\n\r\n this._jointTransforms.length = 0;\r\n this.onHandMeshSetObservable.clear();\r\n }\r\n}\r\n\r\n/**\r\n * WebXR Hand Joint tracking feature, available for selected browsers and devices\r\n */\r\nexport class WebXRHandTracking extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.HAND_TRACKING;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /** The base URL for the default hand model. */\r\n public static DEFAULT_HAND_MODEL_BASE_URL = \"https://assets.babylonjs.com/core/HandMeshes/\";\r\n /** The filename to use for the default right hand model. */\r\n public static DEFAULT_HAND_MODEL_RIGHT_FILENAME = \"r_hand_rhs.glb\";\r\n /** The filename to use for the default left hand model. */\r\n public static DEFAULT_HAND_MODEL_LEFT_FILENAME = \"l_hand_rhs.glb\";\r\n /** The URL pointing to the default hand model NodeMaterial shader. */\r\n public static DEFAULT_HAND_MODEL_SHADER_URL = \"https://assets.babylonjs.com/core/HandMeshes/handsShader.json\";\r\n\r\n // We want to use lightweight models, diameter will initially be 1 but scaled to the values returned from WebXR.\r\n private static readonly _ICOSPHERE_PARAMS = { radius: 0.5, flat: false, subdivisions: 2 };\r\n\r\n private static _RightHandGLB: Nullable<ISceneLoaderAsyncResult> = null;\r\n private static _LeftHandGLB: Nullable<ISceneLoaderAsyncResult> = null;\r\n\r\n private static _GenerateTrackedJointMeshes(options: IWebXRHandTrackingOptions, originalMesh: AbstractMesh): { left: AbstractMesh[]; right: AbstractMesh[] } {\r\n const meshes: { left: AbstractMesh[]; right: AbstractMesh[] } = { left: [], right: [] };\r\n\r\n for (const handedness of [\"left\", \"right\"] as const) {\r\n const h = handedness as \"left\" | \"right\";\r\n const trackedMeshes: AbstractMesh[] = [];\r\n for (let i = 0; i < HandJointReferenceArray.length; i++) {\r\n let newInstance: AbstractMesh;\r\n if (originalMesh instanceof Mesh) {\r\n newInstance = originalMesh.createInstance(`${handedness}-handJoint-${i}`);\r\n } else {\r\n newInstance = originalMesh.clone(`${handedness}-handJoint-${i}`, null) as AbstractMesh;\r\n }\r\n if (options.jointMeshes?.onHandJointMeshGenerated) {\r\n const returnedMesh = options.jointMeshes.onHandJointMeshGenerated(newInstance as InstancedMesh, i, h);\r\n if (returnedMesh) {\r\n if (returnedMesh !== newInstance) {\r\n newInstance.dispose();\r\n newInstance = returnedMesh;\r\n }\r\n }\r\n }\r\n newInstance.isPickable = false;\r\n if (options.jointMeshes?.enablePhysics) {\r\n const props = options.jointMeshes?.physicsProps;\r\n // downscale the instances so that physics will be initialized correctly\r\n newInstance.scaling.setAll(0.02);\r\n // Detect physics version\r\n const scene = newInstance.getScene();\r\n const physicsEngine = scene.getPhysicsEngine();\r\n const physicsVersion = physicsEngine?.getPluginVersion() || 1;\r\n\r\n if (physicsVersion === 2) {\r\n // V2 physics\r\n const impostorType = props?.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;\r\n let shapeType = PhysicsShapeType.SPHERE;\r\n\r\n // Map v1 impostor types to v2 shape types\r\n switch (impostorType) {\r\n case PhysicsImpostor.SphereImpostor:\r\n shapeType = PhysicsShapeType.SPHERE;\r\n break;\r\n case PhysicsImpostor.BoxImpostor:\r\n shapeType = PhysicsShapeType.BOX;\r\n break;\r\n case PhysicsImpostor.CapsuleImpostor:\r\n shapeType = PhysicsShapeType.CAPSULE;\r\n break;\r\n default:\r\n shapeType = PhysicsShapeType.SPHERE;\r\n }\r\n\r\n const aggregate = new PhysicsAggregate(\r\n newInstance,\r\n shapeType,\r\n {\r\n mass: 0,\r\n friction: props?.friction ?? 0.2,\r\n restitution: props?.restitution ?? 0.2,\r\n },\r\n scene\r\n );\r\n aggregate.body.setMotionType(PhysicsMotionType.ANIMATED);\r\n aggregate.body.disableSync = true;\r\n } else {\r\n // V1 physics\r\n const type = props?.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;\r\n newInstance.physicsImpostor = new PhysicsImpostor(newInstance, type, props ? { mass: 0, ...props } : { mass: 0 });\r\n }\r\n }\r\n if (options.jointMeshes?.invisible) {\r\n newInstance.isVisible = false;\r\n }\r\n newInstance.rotationQuaternion = new Quaternion();\r\n trackedMeshes.push(newInstance);\r\n }\r\n\r\n meshes[h] = trackedMeshes;\r\n }\r\n return meshes;\r\n }\r\n\r\n private static async _GenerateDefaultHandMeshesAsync(\r\n xrSessionManager: WebXRSessionManager,\r\n options?: IWebXRHandTrackingOptions\r\n ): Promise<{ left: AbstractMesh; right: AbstractMesh }> {\r\n const scene = xrSessionManager.scene;\r\n // eslint-disable-next-line no-async-promise-executor\r\n return await new Promise(async (resolve) => {\r\n const riggedMeshes: { [handedness: string]: AbstractMesh } = {};\r\n // check the cache, defensive\r\n if (WebXRHandTracking._RightHandGLB?.meshes[1]?.isDisposed()) {\r\n WebXRHandTracking._RightHandGLB = null;\r\n }\r\n if (WebXRHandTracking._LeftHandGLB?.meshes[1]?.isDisposed()) {\r\n WebXRHandTracking._LeftHandGLB = null;\r\n }\r\n\r\n const handsDefined = !!(WebXRHandTracking._RightHandGLB && WebXRHandTracking._LeftHandGLB);\r\n // load them in parallel\r\n const defaulrHandGLBUrl = Tools.GetAssetUrl(WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL);\r\n const handGLBs = await Promise.all([\r\n WebXRHandTracking._RightHandGLB || SceneLoader.ImportMeshAsync(\"\", defaulrHandGLBUrl, WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME, scene),\r\n WebXRHandTracking._LeftHandGLB || SceneLoader.ImportMeshAsync(\"\", defaulrHandGLBUrl, WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME, scene),\r\n ]);\r\n // eslint-disable-next-line require-atomic-updates\r\n WebXRHandTracking._RightHandGLB = handGLBs[0];\r\n // eslint-disable-next-line require-atomic-updates\r\n WebXRHandTracking._LeftHandGLB = handGLBs[1];\r\n const shaderUrl = Tools.GetAssetUrl(WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL);\r\n const handShader = await NodeMaterial.ParseFromFileAsync(\"handShader\", shaderUrl, scene, undefined, true);\r\n\r\n // depth prepass and alpha mode\r\n handShader.needDepthPrePass = true;\r\n handShader.transparencyMode = Material.MATERIAL_ALPHABLEND;\r\n handShader.alphaMode = Constants.ALPHA_COMBINE;\r\n\r\n // build node materials\r\n handShader.build(false);\r\n\r\n // shader\r\n const handColors = {\r\n base: Color3.FromInts(116, 63, 203),\r\n fresnel: Color3.FromInts(149, 102, 229),\r\n fingerColor: Color3.FromInts(177, 130, 255),\r\n tipFresnel: Color3.FromInts(220, 200, 255),\r\n ...options?.handMeshes?.customColors,\r\n };\r\n\r\n const handNodes = {\r\n base: handShader.getBlockByName(\"baseColor\") as InputBlock,\r\n fresnel: handShader.getBlockByName(\"fresnelColor\") as InputBlock,\r\n fingerColor: handShader.getBlockByName(\"fingerColor\") as InputBlock,\r\n tipFresnel: handShader.getBlockByName(\"tipFresnelColor\") as InputBlock,\r\n };\r\n\r\n handNodes.base.value = handColors.base;\r\n handNodes.fresnel.value = handColors.fresnel;\r\n handNodes.fingerColor.value = handColors.fingerColor;\r\n handNodes.tipFresnel.value = handColors.tipFresnel;\r\n const isMultiview = (xrSessionManager._getBaseLayerWrapper() as WebXRCompositionLayerWrapper)?.isMultiview;\r\n const hd = [\"left\", \"right\"];\r\n for (const handedness of hd) {\r\n const handGLB = handedness == \"left\" ? WebXRHandTracking._LeftHandGLB : WebXRHandTracking._RightHandGLB;\r\n if (!handGLB) {\r\n // this should never happen!\r\n throw new Error(\"Could not load hand model\");\r\n }\r\n const handMesh = handGLB.meshes[1];\r\n handMesh._internalAbstractMeshDataInfo._computeBonesUsingShaders = true;\r\n if (handMesh.skeleton) {\r\n handMesh.skeleton.useTextureToStoreBoneMatrices = false;\r\n }\r\n // if in multiview do not use the material\r\n if (!isMultiview && !options?.handMeshes?.disableHandShader) {\r\n handMesh.material = handShader.clone(`${handedness}HandShaderClone`, true);\r\n handMesh.material.freeze();\r\n }\r\n handMesh.isVisible = false;\r\n\r\n riggedMeshes[handedness] = handMesh;\r\n\r\n // single change for left handed systems\r\n if (!handsDefined && !scene.useRightHandedSystem) {\r\n handGLB.meshes[1].rotate(Axis.Y, Math.PI);\r\n }\r\n }\r\n\r\n handShader.dispose();\r\n resolve({ left: riggedMeshes.left, right: riggedMeshes.right });\r\n });\r\n }\r\n\r\n /**\r\n * Generates a mapping from XRHandJoint to bone name for the default hand mesh.\r\n * @param handedness The handedness being mapped for.\r\n * @returns A mapping from XRHandJoint to bone name.\r\n */\r\n private static _GenerateDefaultHandMeshRigMapping(handedness: XRHandedness): XRHandMeshRigMapping {\r\n const h = handedness == \"right\" ? \"R\" : \"L\";\r\n return {\r\n [WebXRHandJoint.WRIST]: `wrist_${h}`,\r\n [WebXRHandJoint.THUMB_METACARPAL]: `thumb_metacarpal_${h}`,\r\n [WebXRHandJoint.THUMB_PHALANX_PROXIMAL]: `thumb_proxPhalanx_${h}`,\r\n [WebXRHandJoint.THUMB_PHALANX_DISTAL]: `thumb_distPhalanx_${h}`,\r\n [WebXRHandJoint.THUMB_TIP]: `thumb_tip_${h}`,\r\n [WebXRHandJoint.INDEX_FINGER_METACARPAL]: `index_metacarpal_${h}`,\r\n [WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL]: `index_proxPhalanx_${h}`,\r\n [WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE]: `index_intPhalanx_${h}`,\r\n [WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL]: `index_distPhalanx_${h}`,\r\n [WebXRHandJoint.INDEX_FINGER_TIP]: `index_tip_${h}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_METACARPAL]: `middle_metacarpal_${h}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL]: `middle_proxPhalanx_${h}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE]: `middle_intPhalanx_${h}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL]: `middle_distPhalanx_${h}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_TIP]: `middle_tip_${h}`,\r\n [WebXRHandJoint.RING_FINGER_METACARPAL]: `ring_metacarpal_${h}`,\r\n [WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL]: `ring_proxPhalanx_${h}`,\r\n [WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE]: `ring_intPhalanx_${h}`,\r\n [WebXRHandJoint.RING_FINGER_PHALANX_DISTAL]: `ring_distPhalanx_${h}`,\r\n [WebXRHandJoint.RING_FINGER_TIP]: `ring_tip_${h}`,\r\n [WebXRHandJoint.PINKY_FINGER_METACARPAL]: `little_metacarpal_${h}`,\r\n [WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL]: `little_proxPhalanx_${h}`,\r\n [WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE]: `little_intPhalanx_${h}`,\r\n [WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL]: `little_distPhalanx_${h}`,\r\n [WebXRHandJoint.PINKY_FINGER_TIP]: `little_tip_${h}`,\r\n };\r\n }\r\n\r\n private _attachedHands: {\r\n [uniqueId: string]: WebXRHand;\r\n } = {};\r\n\r\n private _trackingHands: {\r\n left: Nullable<WebXRHand>;\r\n right: Nullable<WebXRHand>;\r\n } = { left: null, right: null };\r\n\r\n private _handResources: {\r\n jointMeshes: Nullable<{ left: AbstractMesh[]; right: AbstractMesh[] }>;\r\n handMeshes: Nullable<{ left: AbstractMesh; right: AbstractMesh }>;\r\n rigMappings: Nullable<{ left: XRHandMeshRigMapping; right: XRHandMeshRigMapping }>;\r\n } = { jointMeshes: null, handMeshes: null, rigMappings: null };\r\n\r\n private _worldScaleObserver?: Nullable<Observer<{ previousScaleFactor: number; newScaleFactor: number }>> = null;\r\n\r\n /**\r\n * This observable will notify registered observers when a new hand object was added and initialized\r\n */\r\n public onHandAddedObservable: Observable<WebXRHand> = new Observable();\r\n /**\r\n * This observable will notify its observers right before the hand object is disposed\r\n */\r\n public onHandRemovedObservable: Observable<WebXRHand> = new Observable();\r\n\r\n private _originalMesh?: Mesh;\r\n\r\n /**\r\n * Check if the needed objects are defined.\r\n * This does not mean that the feature is enabled, but that the objects needed are well defined.\r\n * @returns true if the needed objects for this feature are defined\r\n */\r\n public override isCompatible(): boolean {\r\n return typeof XRHand !== \"undefined\";\r\n }\r\n\r\n /**\r\n * Get the hand object according to the controller id\r\n * @param controllerId the controller id to which we want to get the hand\r\n * @returns null if not found or the WebXRHand object if found\r\n */\r\n public getHandByControllerId(controllerId: string): Nullable<WebXRHand> {\r\n return this._attachedHands[controllerId];\r\n }\r\n\r\n /**\r\n * Get a hand object according to the requested handedness\r\n * @param handedness the handedness to request\r\n * @returns null if not found or the WebXRHand object if found\r\n */\r\n public getHandByHandedness(handedness: XRHandedness): Nullable<WebXRHand> {\r\n if (handedness == \"none\") {\r\n return null;\r\n }\r\n return this._trackingHands[handedness];\r\n }\r\n\r\n /**\r\n * Creates a new instance of the XR hand tracking feature.\r\n * @param _xrSessionManager An instance of WebXRSessionManager.\r\n * @param options Options to use when constructing this feature.\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /** Options to use when constructing this feature. */\r\n public readonly options: IWebXRHandTrackingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"hand-tracking\";\r\n\r\n // Support legacy versions of the options object by copying over joint mesh properties\r\n const anyOptions = options as any;\r\n const anyJointMeshOptions = anyOptions.jointMeshes;\r\n if (anyJointMeshOptions) {\r\n if (typeof anyJointMeshOptions.disableDefaultHandMesh !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.disableDefaultMeshes = anyJointMeshOptions.disableDefaultHandMesh;\r\n }\r\n if (typeof anyJointMeshOptions.handMeshes !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.customMeshes = anyJointMeshOptions.handMeshes;\r\n }\r\n if (typeof anyJointMeshOptions.leftHandedSystemMeshes !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.meshesUseLeftHandedCoordinates = anyJointMeshOptions.leftHandedSystemMeshes;\r\n }\r\n if (typeof anyJointMeshOptions.rigMapping !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n const leftRigMapping = {};\r\n const rightRigMapping = {};\r\n const rigMappingTuples = [\r\n [anyJointMeshOptions.rigMapping.left, leftRigMapping],\r\n [anyJointMeshOptions.rigMapping.right, rightRigMapping],\r\n ];\r\n\r\n for (const rigMappingTuple of rigMappingTuples) {\r\n const legacyRigMapping = rigMappingTuple[0] as string[];\r\n const rigMapping = rigMappingTuple[1] as XRHandMeshRigMapping;\r\n for (let index = 0; index < legacyRigMapping.length; index++) {\r\n const modelJointName = legacyRigMapping[index];\r\n rigMapping[HandJointReferenceArray[index]] = modelJointName;\r\n }\r\n }\r\n options.handMeshes.customRigMappings = {\r\n left: leftRigMapping as XRHandMeshRigMapping,\r\n right: rightRigMapping as XRHandMeshRigMapping,\r\n };\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Attach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public override attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n if (!this._handResources.jointMeshes) {\r\n this._originalMesh = this._originalMesh || this.options.jointMeshes?.sourceMesh || CreateIcoSphere(\"jointParent\", WebXRHandTracking._ICOSPHERE_PARAMS);\r\n this._originalMesh.isVisible = false;\r\n\r\n this._handResources.jointMeshes = WebXRHandTracking._GenerateTrackedJointMeshes(this.options, this._originalMesh);\r\n }\r\n this._handResources.handMeshes = this.options.handMeshes?.customMeshes || null;\r\n this._handResources.rigMappings = this.options.handMeshes?.customRigMappings || null;\r\n // If they didn't supply custom meshes and are not disabling the default meshes...\r\n if (!this.options.handMeshes?.customMeshes && !this.options.handMeshes?.disableDefaultMeshes) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n WebXRHandTracking._GenerateDefaultHandMeshesAsync(this._xrSessionManager, this.options).then((defaultHandMeshes) => {\r\n this._handResources.handMeshes = defaultHandMeshes;\r\n this._handResources.rigMappings = {\r\n left: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"left\"),\r\n right: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"right\"),\r\n };\r\n\r\n // Apply meshes to existing hands if already tracking.\r\n this._trackingHands.left?.setHandMesh(this._handResources.handMeshes.left, this._handResources.rigMappings.left, this._xrSessionManager);\r\n this._trackingHands.right?.setHandMesh(this._handResources.handMeshes.right, this._handResources.rigMappings.right, this._xrSessionManager);\r\n this._handResources.handMeshes.left.scaling.setAll(this._xrSessionManager.worldScalingFactor);\r\n this._handResources.handMeshes.right.scaling.setAll(this._xrSessionManager.worldScalingFactor);\r\n });\r\n this._worldScaleObserver = this._xrSessionManager.onWorldScaleFactorChangedObservable.add((scalingFactors) => {\r\n if (this._handResources.handMeshes) {\r\n this._handResources.handMeshes.left.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor);\r\n this._handResources.handMeshes.right.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor);\r\n }\r\n });\r\n }\r\n\r\n for (const controller of this.options.xrInput.controllers) {\r\n this._attachHand(controller);\r\n }\r\n\r\n this._addNewAttachObserver(this.options.xrInput.onControllerAddedObservable, this._attachHand);\r\n this._addNewAttachObserver(this.options.xrInput.onControllerRemovedObservable, this._detachHand);\r\n\r\n return true;\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n this._trackingHands.left?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace, this.options.xrInput.xrCamera);\r\n this._trackingHands.right?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace, this.options.xrInput.xrCamera);\r\n }\r\n\r\n private _attachHand = (xrController: WebXRInputSource) => {\r\n if (!xrController.inputSource.hand || xrController.inputSource.handedness == \"none\" || !this._handResources.jointMeshes) {\r\n return;\r\n }\r\n\r\n const handedness = xrController.inputSource.handedness;\r\n const webxrHand = new WebXRHand(\r\n xrController,\r\n this._handResources.jointMeshes && this._handResources.jointMeshes[handedness],\r\n this._handResources.handMeshes && this._handResources.handMeshes[handedness],\r\n this._handResources.rigMappings && this._handResources.rigMappings[handedness],\r\n this.options.handMeshes?.meshesUseLeftHandedCoordinates,\r\n this.options.jointMeshes?.invisible,\r\n this.options.jointMeshes?.scaleFactor\r\n );\r\n\r\n this._attachedHands[xrController.uniqueId] = webxrHand;\r\n this._trackingHands[handedness] = webxrHand;\r\n\r\n this.onHandAddedObservable.notifyObservers(webxrHand);\r\n };\r\n\r\n private _detachHandById(controllerId: string, disposeMesh?: boolean) {\r\n const hand = this.getHandByControllerId(controllerId);\r\n if (hand) {\r\n const handedness = hand.xrController.inputSource.handedness == \"left\" ? \"left\" : \"right\";\r\n if (this._trackingHands[handedness]?.xrController.uniqueId === controllerId) {\r\n this._trackingHands[handedness] = null;\r\n }\r\n this.onHandRemovedObservable.notifyObservers(hand);\r\n hand.dispose(disposeMesh);\r\n delete this._attachedHands[controllerId];\r\n }\r\n }\r\n\r\n private _detachHand = (xrController: WebXRInputSource) => {\r\n this._detachHandById(xrController.uniqueId);\r\n };\r\n\r\n /**\r\n * Detach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n const keys = Object.keys(this._attachedHands);\r\n for (const uniqueId of keys) {\r\n this._detachHandById(uniqueId, this.options.handMeshes?.disposeOnSessionEnd);\r\n }\r\n\r\n if (this.options.handMeshes?.disposeOnSessionEnd) {\r\n if (this._handResources.jointMeshes) {\r\n for (const trackedMesh of this._handResources.jointMeshes.left) {\r\n trackedMesh.dispose();\r\n }\r\n for (const trackedMesh of this._handResources.jointMeshes.right) {\r\n trackedMesh.dispose();\r\n }\r\n this._handResources.jointMeshes = null;\r\n }\r\n\r\n if (this._handResources.handMeshes) {\r\n this._handResources.handMeshes.left.dispose();\r\n this._handResources.handMeshes.right.dispose();\r\n this._handResources.handMeshes = null;\r\n }\r\n\r\n if (WebXRHandTracking._RightHandGLB) {\r\n for (const mesh of WebXRHandTracking._RightHandGLB.meshes) {\r\n mesh.dispose();\r\n }\r\n }\r\n if (WebXRHandTracking._LeftHandGLB) {\r\n for (const mesh of WebXRHandTracking._LeftHandGLB.meshes) {\r\n mesh.dispose();\r\n }\r\n }\r\n WebXRHandTracking._RightHandGLB = null;\r\n WebXRHandTracking._LeftHandGLB = null;\r\n this._originalMesh?.dispose();\r\n this._originalMesh = undefined;\r\n }\r\n\r\n // remove world scale observer\r\n if (this._worldScaleObserver) {\r\n this._xrSessionManager.onWorldScaleFactorChangedObservable.remove(this._worldScaleObserver);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached.\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onHandAddedObservable.clear();\r\n this.onHandRemovedObservable.clear();\r\n\r\n if (this._handResources.handMeshes && !this.options.handMeshes?.customMeshes) {\r\n // this will dispose the cached meshes\r\n this._handResources.handMeshes.left.dispose();\r\n this._handResources.handMeshes.right.dispose();\r\n // remove the cached meshes\r\n\r\n if (WebXRHandTracking._RightHandGLB) {\r\n for (const mesh of WebXRHandTracking._RightHandGLB.meshes) {\r\n mesh.dispose();\r\n }\r\n }\r\n if (WebXRHandTracking._LeftHandGLB) {\r\n for (const mesh of WebXRHandTracking._LeftHandGLB.meshes) {\r\n mesh.dispose();\r\n }\r\n }\r\n WebXRHandTracking._RightHandGLB = null;\r\n WebXRHandTracking._LeftHandGLB = null;\r\n }\r\n\r\n if (this._handResources.jointMeshes) {\r\n for (const trackedMesh of this._handResources.jointMeshes.left) {\r\n trackedMesh.dispose();\r\n }\r\n for (const trackedMesh of this._handResources.jointMeshes.right) {\r\n trackedMesh.dispose();\r\n }\r\n }\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRHandTracking.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRHandTracking(xrSessionManager, options);\r\n },\r\n WebXRHandTracking.Version,\r\n false\r\n);\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRHandTracking.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRHandTracking.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../../Meshes/mesh\";\r\nimport type { WebXRInput } from \"../webXRInput\";\r\nimport type { WebXRInputSource } from \"../webXRInputSource\";\r\nimport { Matrix, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { PhysicsImpostor } from \"../../Physics/v1/physicsImpostor\";\r\nimport { PhysicsAggregate } from \"../../Physics/v2/physicsAggregate\";\r\nimport { PhysicsMotionType, PhysicsShapeType } from \"../../Physics/v2/IPhysicsEnginePlugin\";\r\n\r\nimport type { IDisposable, Scene } from \"../../scene\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { InstancedMesh } from \"../../Meshes/instancedMesh\";\r\nimport type { ISceneLoaderAsyncResult } from \"../../Loading/sceneLoader\";\r\nimport { SceneLoader } from \"../../Loading/sceneLoader\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { NodeMaterial } from \"../../Materials/Node/nodeMaterial\";\r\nimport type { InputBlock } from \"../../Materials/Node/Blocks/Input/inputBlock\";\r\nimport { Material } from \"../../Materials/material\";\r\nimport { CreateIcoSphere } from \"../../Meshes/Builders/icoSphereBuilder\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Axis } from \"../../Maths/math.axis\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { WebXRCompositionLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { WebXRCamera } from \"../webXRCamera\";\r\nimport type { Node } from \"../../node\";\r\n\r\ndeclare const XRHand: XRHand;\r\n\r\n/**\r\n * Configuration interface for the hand tracking feature\r\n */\r\nexport interface IWebXRHandTrackingOptions {\r\n /**\r\n * The xrInput that will be used as source for new hands\r\n */\r\n xrInput: WebXRInput;\r\n\r\n /**\r\n * Configuration object for the joint meshes.\r\n */\r\n jointMeshes?: {\r\n /**\r\n * Should the meshes created be invisible (defaults to false).\r\n */\r\n invisible?: boolean;\r\n /**\r\n * A source mesh to be used to create instances. Defaults to an icosphere with two subdivisions and smooth lighting.\r\n * This mesh will be the source for all other (25) meshes.\r\n * It should have the general size of a single unit, as the instances will be scaled according to the provided radius.\r\n */\r\n sourceMesh?: Mesh;\r\n /**\r\n * This function will be called after a mesh was created for a specific joint.\r\n * Using this function you can either manipulate the instance or return a new mesh.\r\n * When returning a new mesh the instance created before will be disposed.\r\n * @param meshInstance An instance of the original joint mesh being used for the joint.\r\n * @param jointId The joint's index, see https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section for more info.\r\n * @param hand Which hand (\"left\", \"right\") the joint will be on.\r\n */\r\n onHandJointMeshGenerated?: (meshInstance: InstancedMesh, jointId: number, hand: XRHandedness) => AbstractMesh | undefined;\r\n /**\r\n * Should the source mesh stay visible (defaults to false).\r\n */\r\n keepOriginalVisible?: boolean;\r\n /**\r\n * Should each instance have its own physics impostor\r\n */\r\n enablePhysics?: boolean;\r\n /**\r\n * If enabled, override default physics properties\r\n */\r\n physicsProps?: { friction?: number; restitution?: number; impostorType?: number };\r\n /**\r\n * Scale factor for all joint meshes (defaults to 1)\r\n */\r\n scaleFactor?: number;\r\n };\r\n\r\n /**\r\n * Configuration object for the hand meshes.\r\n */\r\n handMeshes?: {\r\n /**\r\n * Should the default hand mesh be disabled. In this case, the spheres will be visible (unless set invisible).\r\n */\r\n disableDefaultMeshes?: boolean;\r\n /**\r\n * Rigged hand meshes that will be tracked to the user's hands. This will override the default hand mesh.\r\n */\r\n customMeshes?: {\r\n right: AbstractMesh;\r\n left: AbstractMesh;\r\n };\r\n /**\r\n * Are the meshes prepared for a left-handed system. Default hand meshes are right-handed.\r\n */\r\n meshesUseLeftHandedCoordinates?: boolean;\r\n /**\r\n * If a hand mesh was provided, this array will define what axis will update which node. This will override the default hand mesh\r\n */\r\n customRigMappings?: {\r\n right: XRHandMeshRigMapping;\r\n left: XRHandMeshRigMapping;\r\n };\r\n\r\n /**\r\n * Override the colors of the hand meshes.\r\n */\r\n customColors?: {\r\n base?: Color3;\r\n fresnel?: Color3;\r\n fingerColor?: Color3;\r\n tipFresnel?: Color3;\r\n };\r\n\r\n /**\r\n * Define whether or not the hand meshes should be disposed on just invisible when the session ends.\r\n * Not setting, or setting to false, will maintain the hand meshes in the scene after the session ends, which will allow q quicker re-entry into XR.\r\n */\r\n disposeOnSessionEnd?: boolean;\r\n\r\n /**\r\n * Setting this will allow the developer to avoid loading the NME material and use the standard material instead.\r\n */\r\n disableHandShader?: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Parts of the hands divided to writs and finger names\r\n */\r\nexport const enum HandPart {\r\n /**\r\n * HandPart - Wrist\r\n */\r\n WRIST = \"wrist\",\r\n /**\r\n * HandPart - The thumb\r\n */\r\n THUMB = \"thumb\",\r\n /**\r\n * HandPart - Index finger\r\n */\r\n INDEX = \"index\",\r\n /**\r\n * HandPart - Middle finger\r\n */\r\n MIDDLE = \"middle\",\r\n /**\r\n * HandPart - Ring finger\r\n */\r\n RING = \"ring\",\r\n /**\r\n * HandPart - Little finger\r\n */\r\n LITTLE = \"little\",\r\n}\r\n\r\n/**\r\n * Joints of the hand as defined by the WebXR specification.\r\n * https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section\r\n */\r\nexport const enum WebXRHandJoint {\r\n /** Wrist */\r\n WRIST = \"wrist\",\r\n\r\n /** Thumb near wrist */\r\n THUMB_METACARPAL = \"thumb-metacarpal\",\r\n /** Thumb first knuckle */\r\n THUMB_PHALANX_PROXIMAL = \"thumb-phalanx-proximal\",\r\n /** Thumb second knuckle */\r\n THUMB_PHALANX_DISTAL = \"thumb-phalanx-distal\",\r\n /** Thumb tip */\r\n THUMB_TIP = \"thumb-tip\",\r\n\r\n /** Index finger near wrist */\r\n INDEX_FINGER_METACARPAL = \"index-finger-metacarpal\",\r\n /** Index finger first knuckle */\r\n INDEX_FINGER_PHALANX_PROXIMAL = \"index-finger-phalanx-proximal\",\r\n /** Index finger second knuckle */\r\n INDEX_FINGER_PHALANX_INTERMEDIATE = \"index-finger-phalanx-intermediate\",\r\n /** Index finger third knuckle */\r\n INDEX_FINGER_PHALANX_DISTAL = \"index-finger-phalanx-distal\",\r\n /** Index finger tip */\r\n INDEX_FINGER_TIP = \"index-finger-tip\",\r\n\r\n /** Middle finger near wrist */\r\n MIDDLE_FINGER_METACARPAL = \"middle-finger-metacarpal\",\r\n /** Middle finger first knuckle */\r\n MIDDLE_FINGER_PHALANX_PROXIMAL = \"middle-finger-phalanx-proximal\",\r\n /** Middle finger second knuckle */\r\n MIDDLE_FINGER_PHALANX_INTERMEDIATE = \"middle-finger-phalanx-intermediate\",\r\n /** Middle finger third knuckle */\r\n MIDDLE_FINGER_PHALANX_DISTAL = \"middle-finger-phalanx-distal\",\r\n /** Middle finger tip */\r\n MIDDLE_FINGER_TIP = \"middle-finger-tip\",\r\n\r\n /** Ring finger near wrist */\r\n RING_FINGER_METACARPAL = \"ring-finger-metacarpal\",\r\n /** Ring finger first knuckle */\r\n RING_FINGER_PHALANX_PROXIMAL = \"ring-finger-phalanx-proximal\",\r\n /** Ring finger second knuckle */\r\n RING_FINGER_PHALANX_INTERMEDIATE = \"ring-finger-phalanx-intermediate\",\r\n /** Ring finger third knuckle */\r\n RING_FINGER_PHALANX_DISTAL = \"ring-finger-phalanx-distal\",\r\n /** Ring finger tip */\r\n RING_FINGER_TIP = \"ring-finger-tip\",\r\n\r\n /** Pinky finger near wrist */\r\n PINKY_FINGER_METACARPAL = \"pinky-finger-metacarpal\",\r\n /** Pinky finger first knuckle */\r\n PINKY_FINGER_PHALANX_PROXIMAL = \"pinky-finger-phalanx-proximal\",\r\n /** Pinky finger second knuckle */\r\n PINKY_FINGER_PHALANX_INTERMEDIATE = \"pinky-finger-phalanx-intermediate\",\r\n /** Pinky finger third knuckle */\r\n PINKY_FINGER_PHALANX_DISTAL = \"pinky-finger-phalanx-distal\",\r\n /** Pinky finger tip */\r\n PINKY_FINGER_TIP = \"pinky-finger-tip\",\r\n}\r\n\r\n/** A type encapsulating a dictionary mapping WebXR joints to bone names in a rigged hand mesh. */\r\nexport type XRHandMeshRigMapping = { [webXRJointName in WebXRHandJoint]: string };\r\n\r\nconst HandJointReferenceArray: WebXRHandJoint[] = [\r\n WebXRHandJoint.WRIST,\r\n WebXRHandJoint.THUMB_METACARPAL,\r\n WebXRHandJoint.THUMB_PHALANX_PROXIMAL,\r\n WebXRHandJoint.THUMB_PHALANX_DISTAL,\r\n WebXRHandJoint.THUMB_TIP,\r\n WebXRHandJoint.INDEX_FINGER_METACARPAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.INDEX_FINGER_TIP,\r\n WebXRHandJoint.MIDDLE_FINGER_METACARPAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.MIDDLE_FINGER_TIP,\r\n WebXRHandJoint.RING_FINGER_METACARPAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.RING_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.RING_FINGER_TIP,\r\n WebXRHandJoint.PINKY_FINGER_METACARPAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.PINKY_FINGER_TIP,\r\n];\r\n\r\nconst HandPartsDefinition: { [key in HandPart]: WebXRHandJoint[] } = {\r\n [HandPart.WRIST]: [WebXRHandJoint.WRIST],\r\n [HandPart.THUMB]: [WebXRHandJoint.THUMB_METACARPAL, WebXRHandJoint.THUMB_PHALANX_PROXIMAL, WebXRHandJoint.THUMB_PHALANX_DISTAL, WebXRHandJoint.THUMB_TIP],\r\n [HandPart.INDEX]: [\r\n WebXRHandJoint.INDEX_FINGER_METACARPAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.INDEX_FINGER_TIP,\r\n ],\r\n [HandPart.MIDDLE]: [\r\n WebXRHandJoint.MIDDLE_FINGER_METACARPAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.MIDDLE_FINGER_TIP,\r\n ],\r\n [HandPart.RING]: [\r\n WebXRHandJoint.RING_FINGER_METACARPAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.RING_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.RING_FINGER_TIP,\r\n ],\r\n [HandPart.LITTLE]: [\r\n WebXRHandJoint.PINKY_FINGER_METACARPAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.PINKY_FINGER_TIP,\r\n ],\r\n};\r\n\r\n/**\r\n * Representing a single hand (with its corresponding native XRHand object)\r\n */\r\nexport class WebXRHand implements IDisposable {\r\n /**\r\n * This observable will notify registered observers when the hand object has been set with a new mesh.\r\n * you can get the hand mesh using `webxrHand.handMesh`\r\n */\r\n public onHandMeshSetObservable = new Observable<WebXRHand>();\r\n\r\n private _scene: Scene;\r\n\r\n /**\r\n * Transform nodes that will directly receive the transforms from the WebXR matrix data.\r\n */\r\n private _jointTransforms = new Array<TransformNode>(HandJointReferenceArray.length);\r\n\r\n /**\r\n * The float array that will directly receive the transform matrix data from WebXR.\r\n */\r\n private _jointTransformMatrices = new Float32Array(HandJointReferenceArray.length * 16);\r\n private _jointSpaces: XRJointSpace[] = new Array(HandJointReferenceArray.length);\r\n\r\n private _tempJointMatrix = new Matrix();\r\n\r\n /**\r\n * The float array that will directly receive the joint radii from WebXR.\r\n */\r\n private _jointRadii = new Float32Array(HandJointReferenceArray.length);\r\n\r\n /**\r\n * The hand mesh's top-most parent, if any.\r\n */\r\n private _handMeshRoot: Nullable<Node> = null;\r\n\r\n /**\r\n * Get the hand mesh.\r\n */\r\n public get handMesh(): Nullable<AbstractMesh> {\r\n return this._handMesh;\r\n }\r\n\r\n /**\r\n * Get meshes of part of the hand.\r\n * @param part The part of hand to get.\r\n * @returns An array of meshes that correlate to the hand part requested.\r\n */\r\n public getHandPartMeshes(part: HandPart): AbstractMesh[] {\r\n return HandPartsDefinition[part].map((name) => this._jointMeshes[HandJointReferenceArray.indexOf(name)]);\r\n }\r\n\r\n /**\r\n * Retrieves a mesh linked to a named joint in the hand.\r\n * @param jointName The name of the joint.\r\n * @returns An AbstractMesh whose position corresponds with the joint position.\r\n */\r\n public getJointMesh(jointName: WebXRHandJoint): AbstractMesh {\r\n return this._jointMeshes[HandJointReferenceArray.indexOf(jointName)];\r\n }\r\n\r\n /**\r\n * Construct a new hand object\r\n * @param xrController The controller to which the hand correlates.\r\n * @param _jointMeshes The meshes to be used to track the hand joints.\r\n * @param _handMesh An optional hand mesh.\r\n * @param rigMapping An optional rig mapping for the hand mesh.\r\n * If not provided (but a hand mesh is provided),\r\n * it will be assumed that the hand mesh's bones are named\r\n * directly after the WebXR bone names.\r\n * @param _leftHandedMeshes Are the hand meshes left-handed-system meshes\r\n * @param _jointsInvisible Are the tracked joint meshes visible\r\n * @param _jointScaleFactor Scale factor for all joint meshes\r\n */\r\n constructor(\r\n /** The controller to which the hand correlates. */\r\n public readonly xrController: WebXRInputSource,\r\n private readonly _jointMeshes: AbstractMesh[],\r\n private _handMesh: Nullable<AbstractMesh>,\r\n /** An optional rig mapping for the hand mesh. If not provided (but a hand mesh is provided),\r\n * it will be assumed that the hand mesh's bones are named directly after the WebXR bone names. */\r\n readonly rigMapping: Nullable<XRHandMeshRigMapping>,\r\n private readonly _leftHandedMeshes: boolean = false,\r\n private readonly _jointsInvisible: boolean = false,\r\n private readonly _jointScaleFactor: number = 1\r\n ) {\r\n this._scene = _jointMeshes[0].getScene();\r\n\r\n // Initialize the joint transform quaternions and link the transforms to the bones.\r\n for (let jointIdx = 0; jointIdx < this._jointTransforms.length; jointIdx++) {\r\n this._jointTransforms[jointIdx] = new TransformNode(HandJointReferenceArray[jointIdx], this._scene);\r\n this._jointTransforms[jointIdx].rotationQuaternion = new Quaternion();\r\n\r\n // Set the rotation quaternion so we can use it later for tracking.\r\n if (_jointMeshes[jointIdx].rotationQuaternion) {\r\n _jointMeshes[jointIdx].rotationQuaternion = new Quaternion();\r\n } else {\r\n _jointMeshes[jointIdx].rotationQuaternion?.set(0, 0, 0, 1);\r\n }\r\n }\r\n\r\n if (_handMesh) {\r\n // Note that this logic needs to happen after we initialize the joint tracking transform nodes.\r\n this.setHandMesh(_handMesh, rigMapping);\r\n }\r\n\r\n // hide the motion controller, if available/loaded\r\n if (this.xrController.motionController) {\r\n if (this.xrController.motionController.rootMesh) {\r\n this.xrController.motionController.rootMesh.dispose(false, true);\r\n }\r\n }\r\n\r\n this.xrController.onMotionControllerInitObservable.add((motionController) => {\r\n motionController._doNotLoadControllerMesh = true;\r\n });\r\n }\r\n\r\n /**\r\n * Sets the current hand mesh to render for the WebXRHand.\r\n * @param handMesh The rigged hand mesh that will be tracked to the user's hand.\r\n * @param rigMapping The mapping from XRHandJoint to bone names to use with the mesh.\r\n * @param _xrSessionManager The XRSessionManager used to initialize the hand mesh.\r\n */\r\n public setHandMesh(handMesh: AbstractMesh, rigMapping: Nullable<XRHandMeshRigMapping>, _xrSessionManager?: WebXRSessionManager) {\r\n this._handMesh = handMesh;\r\n\r\n this._handMeshRoot = this._handMesh;\r\n while (this._handMeshRoot.parent) {\r\n this._handMeshRoot = this._handMeshRoot.parent;\r\n }\r\n\r\n // Avoid any strange frustum culling. We will manually control visibility via attach and detach.\r\n handMesh.alwaysSelectAsActiveMesh = true;\r\n const children = handMesh.getChildMeshes();\r\n for (const mesh of children) {\r\n mesh.alwaysSelectAsActiveMesh = true;\r\n }\r\n\r\n // Link the bones in the hand mesh to the transform nodes that will be bound to the WebXR tracked joints.\r\n if (this._handMesh.skeleton) {\r\n const handMeshSkeleton = this._handMesh.skeleton;\r\n for (let jointIdx = 0; jointIdx < HandJointReferenceArray.length; jointIdx++) {\r\n const jointName = HandJointReferenceArray[jointIdx];\r\n const jointBoneIdx = handMeshSkeleton.getBoneIndexByName(rigMapping ? rigMapping[jointName] : jointName);\r\n if (jointBoneIdx !== -1) {\r\n handMeshSkeleton.bones[jointBoneIdx].linkTransformNode(this._jointTransforms[jointIdx]);\r\n }\r\n }\r\n }\r\n\r\n this.onHandMeshSetObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Update this hand from the latest xr frame.\r\n * @param xrFrame The latest frame received from WebXR.\r\n * @param referenceSpace The current viewer reference space.\r\n * @param xrCamera the xr camera, used for parenting\r\n */\r\n public updateFromXRFrame(xrFrame: XRFrame, referenceSpace: XRReferenceSpace, xrCamera: WebXRCamera) {\r\n const hand = this.xrController.inputSource.hand;\r\n if (!hand) {\r\n return;\r\n }\r\n\r\n // TODO: Modify webxr.d.ts to better match WebXR IDL so we don't need this any cast.\r\n const anyHand: any = hand;\r\n for (let i = 0; i < HandJointReferenceArray.length; ++i) {\r\n this._jointSpaces[i] = anyHand[HandJointReferenceArray[i]] || hand.get(HandJointReferenceArray[i]);\r\n }\r\n let trackingSuccessful = false;\r\n\r\n if (xrFrame.fillPoses && xrFrame.fillJointRadii) {\r\n trackingSuccessful = xrFrame.fillPoses(this._jointSpaces, referenceSpace, this._jointTransformMatrices) && xrFrame.fillJointRadii(this._jointSpaces, this._jointRadii);\r\n } else if (xrFrame.getJointPose) {\r\n trackingSuccessful = true;\r\n // Warning: This codepath is slow by comparison, only here for compat.\r\n for (let jointIdx = 0; jointIdx < this._jointSpaces.length; jointIdx++) {\r\n const jointPose = xrFrame.getJointPose(this._jointSpaces[jointIdx], referenceSpace);\r\n if (jointPose) {\r\n this._jointTransformMatrices.set(jointPose.transform.matrix, jointIdx * 16);\r\n this._jointRadii[jointIdx] = jointPose.radius || 0.008;\r\n } else {\r\n trackingSuccessful = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!trackingSuccessful) {\r\n return;\r\n }\r\n\r\n // L1 Cache Optimization: Invert to LHS in valid Babylon systems IN PLACE\r\n // This linear loop is much faster than doing it per-object and avoids cache thrashing\r\n if (!this._scene.useRightHandedSystem) {\r\n for (let i = 0; i < HandJointReferenceArray.length; ++i) {\r\n const offset = i * 16;\r\n this._jointTransformMatrices[offset + 2] *= -1;\r\n this._jointTransformMatrices[offset + 6] *= -1;\r\n this._jointTransformMatrices[offset + 8] *= -1;\r\n this._jointTransformMatrices[offset + 9] *= -1;\r\n this._jointTransformMatrices[offset + 14] *= -1;\r\n }\r\n }\r\n\r\n for (let jointIdx = 0; jointIdx < HandJointReferenceArray.length; jointIdx++) {\r\n const jointTransform = this._jointTransforms[jointIdx];\r\n Matrix.FromArrayToRef(this._jointTransformMatrices, jointIdx * 16, this._tempJointMatrix);\r\n this._tempJointMatrix.decompose(undefined, jointTransform.rotationQuaternion!, jointTransform.position);\r\n\r\n // The radius we need to make the joint in order for it to roughly cover the joints of the user's real hand.\r\n const scaledJointRadius = this._jointRadii[jointIdx] * this._jointScaleFactor;\r\n\r\n const jointMesh = this._jointMeshes[jointIdx];\r\n jointMesh.isVisible = !this._handMesh && !this._jointsInvisible;\r\n jointMesh.position.copyFrom(jointTransform.position);\r\n jointMesh.rotationQuaternion!.copyFrom(jointTransform.rotationQuaternion!);\r\n jointMesh.scaling.setAll(scaledJointRadius);\r\n jointMesh.parent = xrCamera.parent;\r\n\r\n // Restore correct transform for meshes that are NOT left-handed (e.g. default GLTF)\r\n // The buffer is now LHS, so if the mesh expects RHS, we must un-flip.\r\n if (!this._leftHandedMeshes && !this._scene.useRightHandedSystem && this._handMesh) {\r\n jointTransform.position.z *= -1;\r\n jointTransform.rotationQuaternion!.z *= -1;\r\n jointTransform.rotationQuaternion!.w *= -1;\r\n }\r\n }\r\n\r\n if (this._handMesh) {\r\n this._handMesh.isVisible = true;\r\n\r\n if (this._handMeshRoot) {\r\n this._handMeshRoot.parent = xrCamera.parent;\r\n }\r\n }\r\n\r\n this.xrController.pointer.parent = xrCamera.parent;\r\n }\r\n\r\n /**\r\n * Dispose this Hand object\r\n * @param disposeMeshes Should the meshes be disposed as well\r\n */\r\n public dispose(disposeMeshes = false) {\r\n if (this._handMesh) {\r\n if (disposeMeshes) {\r\n this._handMesh.skeleton?.dispose();\r\n this._handMesh.dispose(false, true);\r\n } else {\r\n this._handMesh.isVisible = false;\r\n }\r\n }\r\n for (const transform of this._jointTransforms) {\r\n transform.dispose();\r\n }\r\n\r\n this._jointTransforms.length = 0;\r\n this.onHandMeshSetObservable.clear();\r\n }\r\n}\r\n\r\n/**\r\n * WebXR Hand Joint tracking feature, available for selected browsers and devices\r\n */\r\nexport class WebXRHandTracking extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.HAND_TRACKING;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /** The base URL for the default hand model. */\r\n public static DEFAULT_HAND_MODEL_BASE_URL = \"https://assets.babylonjs.com/core/HandMeshes/\";\r\n /** The filename to use for the default right hand model. */\r\n public static DEFAULT_HAND_MODEL_RIGHT_FILENAME = \"r_hand_rhs.glb\";\r\n /** The filename to use for the default left hand model. */\r\n public static DEFAULT_HAND_MODEL_LEFT_FILENAME = \"l_hand_rhs.glb\";\r\n /** The URL pointing to the default hand model NodeMaterial shader. */\r\n public static DEFAULT_HAND_MODEL_SHADER_URL = \"https://assets.babylonjs.com/core/HandMeshes/handsShader.json\";\r\n\r\n // We want to use lightweight models, diameter will initially be 1 but scaled to the values returned from WebXR.\r\n private static readonly _ICOSPHERE_PARAMS = { radius: 0.5, flat: false, subdivisions: 2 };\r\n\r\n private static _RightHandGLB: Nullable<ISceneLoaderAsyncResult> = null;\r\n private static _LeftHandGLB: Nullable<ISceneLoaderAsyncResult> = null;\r\n\r\n private static _GenerateTrackedJointMeshes(options: IWebXRHandTrackingOptions, originalMesh: AbstractMesh): { left: AbstractMesh[]; right: AbstractMesh[] } {\r\n const meshes: { left: AbstractMesh[]; right: AbstractMesh[] } = { left: [], right: [] };\r\n\r\n for (const handedness of [\"left\", \"right\"] as const) {\r\n const h = handedness as \"left\" | \"right\";\r\n const trackedMeshes: AbstractMesh[] = [];\r\n for (let i = 0; i < HandJointReferenceArray.length; i++) {\r\n let newInstance: AbstractMesh;\r\n if (originalMesh instanceof Mesh) {\r\n newInstance = originalMesh.createInstance(`${handedness}-handJoint-${i}`);\r\n } else {\r\n newInstance = originalMesh.clone(`${handedness}-handJoint-${i}`, null) as AbstractMesh;\r\n }\r\n if (options.jointMeshes?.onHandJointMeshGenerated) {\r\n const returnedMesh = options.jointMeshes.onHandJointMeshGenerated(newInstance as InstancedMesh, i, h);\r\n if (returnedMesh) {\r\n if (returnedMesh !== newInstance) {\r\n newInstance.dispose();\r\n newInstance = returnedMesh;\r\n }\r\n }\r\n }\r\n newInstance.isPickable = false;\r\n if (options.jointMeshes?.enablePhysics) {\r\n const props = options.jointMeshes?.physicsProps;\r\n // downscale the instances so that physics will be initialized correctly\r\n newInstance.scaling.setAll(0.02);\r\n // Detect physics version\r\n const scene = newInstance.getScene();\r\n const physicsEngine = scene.getPhysicsEngine();\r\n const physicsVersion = physicsEngine?.getPluginVersion() || 1;\r\n\r\n if (physicsVersion === 2) {\r\n // V2 physics\r\n const impostorType = props?.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;\r\n let shapeType = PhysicsShapeType.SPHERE;\r\n\r\n // Map v1 impostor types to v2 shape types\r\n switch (impostorType) {\r\n case PhysicsImpostor.SphereImpostor:\r\n shapeType = PhysicsShapeType.SPHERE;\r\n break;\r\n case PhysicsImpostor.BoxImpostor:\r\n shapeType = PhysicsShapeType.BOX;\r\n break;\r\n case PhysicsImpostor.CapsuleImpostor:\r\n shapeType = PhysicsShapeType.CAPSULE;\r\n break;\r\n default:\r\n shapeType = PhysicsShapeType.SPHERE;\r\n }\r\n\r\n const aggregate = new PhysicsAggregate(\r\n newInstance,\r\n shapeType,\r\n {\r\n mass: 0,\r\n friction: props?.friction ?? 0.2,\r\n restitution: props?.restitution ?? 0.2,\r\n },\r\n scene\r\n );\r\n aggregate.body.setMotionType(PhysicsMotionType.ANIMATED);\r\n aggregate.body.disableSync = true;\r\n } else {\r\n // V1 physics\r\n const type = props?.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;\r\n newInstance.physicsImpostor = new PhysicsImpostor(newInstance, type, props ? { mass: 0, ...props } : { mass: 0 });\r\n }\r\n }\r\n if (options.jointMeshes?.invisible) {\r\n newInstance.isVisible = false;\r\n }\r\n newInstance.rotationQuaternion = new Quaternion();\r\n trackedMeshes.push(newInstance);\r\n }\r\n\r\n meshes[h] = trackedMeshes;\r\n }\r\n return meshes;\r\n }\r\n\r\n private static async _GenerateDefaultHandMeshesAsync(\r\n xrSessionManager: WebXRSessionManager,\r\n options?: IWebXRHandTrackingOptions\r\n ): Promise<{ left: AbstractMesh; right: AbstractMesh }> {\r\n const scene = xrSessionManager.scene;\r\n // eslint-disable-next-line no-async-promise-executor\r\n return await new Promise(async (resolve) => {\r\n const riggedMeshes: { [handedness: string]: AbstractMesh } = {};\r\n // check the cache, defensive\r\n if (WebXRHandTracking._RightHandGLB?.meshes[1]?.isDisposed()) {\r\n WebXRHandTracking._RightHandGLB = null;\r\n }\r\n if (WebXRHandTracking._LeftHandGLB?.meshes[1]?.isDisposed()) {\r\n WebXRHandTracking._LeftHandGLB = null;\r\n }\r\n\r\n const handsDefined = !!(WebXRHandTracking._RightHandGLB && WebXRHandTracking._LeftHandGLB);\r\n // load them in parallel\r\n const defaulrHandGLBUrl = Tools.GetAssetUrl(WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL);\r\n const handGLBs = await Promise.all([\r\n WebXRHandTracking._RightHandGLB || SceneLoader.ImportMeshAsync(\"\", defaulrHandGLBUrl, WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME, scene),\r\n WebXRHandTracking._LeftHandGLB || SceneLoader.ImportMeshAsync(\"\", defaulrHandGLBUrl, WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME, scene),\r\n ]);\r\n // eslint-disable-next-line require-atomic-updates\r\n WebXRHandTracking._RightHandGLB = handGLBs[0];\r\n // eslint-disable-next-line require-atomic-updates\r\n WebXRHandTracking._LeftHandGLB = handGLBs[1];\r\n const shaderUrl = Tools.GetAssetUrl(WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL);\r\n const handShader = await NodeMaterial.ParseFromFileAsync(\"handShader\", shaderUrl, scene, undefined, true);\r\n\r\n // depth prepass and alpha mode\r\n handShader.needDepthPrePass = true;\r\n handShader.transparencyMode = Material.MATERIAL_ALPHABLEND;\r\n handShader.alphaMode = Constants.ALPHA_COMBINE;\r\n\r\n // build node materials\r\n handShader.build(false);\r\n\r\n // shader\r\n const handColors = {\r\n base: Color3.FromInts(116, 63, 203),\r\n fresnel: Color3.FromInts(149, 102, 229),\r\n fingerColor: Color3.FromInts(177, 130, 255),\r\n tipFresnel: Color3.FromInts(220, 200, 255),\r\n ...options?.handMeshes?.customColors,\r\n };\r\n\r\n const handNodes = {\r\n base: handShader.getBlockByName(\"baseColor\") as InputBlock,\r\n fresnel: handShader.getBlockByName(\"fresnelColor\") as InputBlock,\r\n fingerColor: handShader.getBlockByName(\"fingerColor\") as InputBlock,\r\n tipFresnel: handShader.getBlockByName(\"tipFresnelColor\") as InputBlock,\r\n };\r\n\r\n handNodes.base.value = handColors.base;\r\n handNodes.fresnel.value = handColors.fresnel;\r\n handNodes.fingerColor.value = handColors.fingerColor;\r\n handNodes.tipFresnel.value = handColors.tipFresnel;\r\n const isMultiview = (xrSessionManager._getBaseLayerWrapper() as WebXRCompositionLayerWrapper)?.isMultiview;\r\n const hd = [\"left\", \"right\"];\r\n for (const handedness of hd) {\r\n const handGLB = handedness == \"left\" ? WebXRHandTracking._LeftHandGLB : WebXRHandTracking._RightHandGLB;\r\n if (!handGLB) {\r\n // this should never happen!\r\n throw new Error(\"Could not load hand model\");\r\n }\r\n const handMesh = handGLB.meshes[1];\r\n handMesh._internalAbstractMeshDataInfo._computeBonesUsingShaders = true;\r\n if (handMesh.skeleton) {\r\n handMesh.skeleton.useTextureToStoreBoneMatrices = false;\r\n }\r\n // if in multiview do not use the material\r\n if (!isMultiview && !options?.handMeshes?.disableHandShader) {\r\n handMesh.material = handShader.clone(`${handedness}HandShaderClone`, true);\r\n handMesh.material.freeze();\r\n }\r\n handMesh.isVisible = false;\r\n\r\n riggedMeshes[handedness] = handMesh;\r\n\r\n // single change for left handed systems\r\n if (!handsDefined && !scene.useRightHandedSystem) {\r\n handGLB.meshes[1].rotate(Axis.Y, Math.PI);\r\n }\r\n }\r\n\r\n handShader.dispose();\r\n resolve({ left: riggedMeshes.left, right: riggedMeshes.right });\r\n });\r\n }\r\n\r\n /**\r\n * Generates a mapping from XRHandJoint to bone name for the default hand mesh.\r\n * @param handedness The handedness being mapped for.\r\n * @returns A mapping from XRHandJoint to bone name.\r\n */\r\n private static _GenerateDefaultHandMeshRigMapping(handedness: XRHandedness): XRHandMeshRigMapping {\r\n const h = handedness == \"right\" ? \"R\" : \"L\";\r\n return {\r\n [WebXRHandJoint.WRIST]: `wrist_${h}`,\r\n [WebXRHandJoint.THUMB_METACARPAL]: `thumb_metacarpal_${h}`,\r\n [WebXRHandJoint.THUMB_PHALANX_PROXIMAL]: `thumb_proxPhalanx_${h}`,\r\n [WebXRHandJoint.THUMB_PHALANX_DISTAL]: `thumb_distPhalanx_${h}`,\r\n [WebXRHandJoint.THUMB_TIP]: `thumb_tip_${h}`,\r\n [WebXRHandJoint.INDEX_FINGER_METACARPAL]: `index_metacarpal_${h}`,\r\n [WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL]: `index_proxPhalanx_${h}`,\r\n [WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE]: `index_intPhalanx_${h}`,\r\n [WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL]: `index_distPhalanx_${h}`,\r\n [WebXRHandJoint.INDEX_FINGER_TIP]: `index_tip_${h}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_METACARPAL]: `middle_metacarpal_${h}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL]: `middle_proxPhalanx_${h}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE]: `middle_intPhalanx_${h}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL]: `middle_distPhalanx_${h}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_TIP]: `middle_tip_${h}`,\r\n [WebXRHandJoint.RING_FINGER_METACARPAL]: `ring_metacarpal_${h}`,\r\n [WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL]: `ring_proxPhalanx_${h}`,\r\n [WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE]: `ring_intPhalanx_${h}`,\r\n [WebXRHandJoint.RING_FINGER_PHALANX_DISTAL]: `ring_distPhalanx_${h}`,\r\n [WebXRHandJoint.RING_FINGER_TIP]: `ring_tip_${h}`,\r\n [WebXRHandJoint.PINKY_FINGER_METACARPAL]: `little_metacarpal_${h}`,\r\n [WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL]: `little_proxPhalanx_${h}`,\r\n [WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE]: `little_intPhalanx_${h}`,\r\n [WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL]: `little_distPhalanx_${h}`,\r\n [WebXRHandJoint.PINKY_FINGER_TIP]: `little_tip_${h}`,\r\n };\r\n }\r\n\r\n private _attachedHands: {\r\n [uniqueId: string]: WebXRHand;\r\n } = {};\r\n\r\n private _trackingHands: {\r\n left: Nullable<WebXRHand>;\r\n right: Nullable<WebXRHand>;\r\n } = { left: null, right: null };\r\n\r\n private _handResources: {\r\n jointMeshes: Nullable<{ left: AbstractMesh[]; right: AbstractMesh[] }>;\r\n handMeshes: Nullable<{ left: AbstractMesh; right: AbstractMesh }>;\r\n rigMappings: Nullable<{ left: XRHandMeshRigMapping; right: XRHandMeshRigMapping }>;\r\n } = { jointMeshes: null, handMeshes: null, rigMappings: null };\r\n\r\n private _worldScaleObserver?: Nullable<Observer<{ previousScaleFactor: number; newScaleFactor: number }>> = null;\r\n\r\n /**\r\n * This observable will notify registered observers when a new hand object was added and initialized\r\n */\r\n public onHandAddedObservable: Observable<WebXRHand> = new Observable();\r\n /**\r\n * This observable will notify its observers right before the hand object is disposed\r\n */\r\n public onHandRemovedObservable: Observable<WebXRHand> = new Observable();\r\n\r\n private _originalMesh?: Mesh;\r\n\r\n /**\r\n * Check if the needed objects are defined.\r\n * This does not mean that the feature is enabled, but that the objects needed are well defined.\r\n * @returns true if the needed objects for this feature are defined\r\n */\r\n public override isCompatible(): boolean {\r\n return typeof XRHand !== \"undefined\";\r\n }\r\n\r\n /**\r\n * Get the hand object according to the controller id\r\n * @param controllerId the controller id to which we want to get the hand\r\n * @returns null if not found or the WebXRHand object if found\r\n */\r\n public getHandByControllerId(controllerId: string): Nullable<WebXRHand> {\r\n return this._attachedHands[controllerId];\r\n }\r\n\r\n /**\r\n * Get a hand object according to the requested handedness\r\n * @param handedness the handedness to request\r\n * @returns null if not found or the WebXRHand object if found\r\n */\r\n public getHandByHandedness(handedness: XRHandedness): Nullable<WebXRHand> {\r\n if (handedness == \"none\") {\r\n return null;\r\n }\r\n return this._trackingHands[handedness];\r\n }\r\n\r\n /**\r\n * Creates a new instance of the XR hand tracking feature.\r\n * @param _xrSessionManager An instance of WebXRSessionManager.\r\n * @param options Options to use when constructing this feature.\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /** Options to use when constructing this feature. */\r\n public readonly options: IWebXRHandTrackingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"hand-tracking\";\r\n\r\n // Support legacy versions of the options object by copying over joint mesh properties\r\n const anyOptions = options as any;\r\n const anyJointMeshOptions = anyOptions.jointMeshes;\r\n if (anyJointMeshOptions) {\r\n if (typeof anyJointMeshOptions.disableDefaultHandMesh !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.disableDefaultMeshes = anyJointMeshOptions.disableDefaultHandMesh;\r\n }\r\n if (typeof anyJointMeshOptions.handMeshes !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.customMeshes = anyJointMeshOptions.handMeshes;\r\n }\r\n if (typeof anyJointMeshOptions.leftHandedSystemMeshes !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.meshesUseLeftHandedCoordinates = anyJointMeshOptions.leftHandedSystemMeshes;\r\n }\r\n if (typeof anyJointMeshOptions.rigMapping !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n const leftRigMapping = {};\r\n const rightRigMapping = {};\r\n const rigMappingTuples = [\r\n [anyJointMeshOptions.rigMapping.left, leftRigMapping],\r\n [anyJointMeshOptions.rigMapping.right, rightRigMapping],\r\n ];\r\n\r\n for (const rigMappingTuple of rigMappingTuples) {\r\n const legacyRigMapping = rigMappingTuple[0] as string[];\r\n const rigMapping = rigMappingTuple[1] as XRHandMeshRigMapping;\r\n for (let index = 0; index < legacyRigMapping.length; index++) {\r\n const modelJointName = legacyRigMapping[index];\r\n rigMapping[HandJointReferenceArray[index]] = modelJointName;\r\n }\r\n }\r\n options.handMeshes.customRigMappings = {\r\n left: leftRigMapping as XRHandMeshRigMapping,\r\n right: rightRigMapping as XRHandMeshRigMapping,\r\n };\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Attach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public override attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n if (!this._handResources.jointMeshes) {\r\n this._originalMesh =\r\n this._originalMesh || this.options.jointMeshes?.sourceMesh || CreateIcoSphere(\"jointParent\", WebXRHandTracking._ICOSPHERE_PARAMS, this._xrSessionManager.scene);\r\n this._originalMesh.isVisible = false;\r\n\r\n this._handResources.jointMeshes = WebXRHandTracking._GenerateTrackedJointMeshes(this.options, this._originalMesh);\r\n }\r\n this._handResources.handMeshes = this.options.handMeshes?.customMeshes || null;\r\n this._handResources.rigMappings = this.options.handMeshes?.customRigMappings || null;\r\n // If they didn't supply custom meshes and are not disabling the default meshes...\r\n if (!this.options.handMeshes?.customMeshes && !this.options.handMeshes?.disableDefaultMeshes) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n WebXRHandTracking._GenerateDefaultHandMeshesAsync(this._xrSessionManager, this.options).then((defaultHandMeshes) => {\r\n this._handResources.handMeshes = defaultHandMeshes;\r\n this._handResources.rigMappings = {\r\n left: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"left\"),\r\n right: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"right\"),\r\n };\r\n\r\n // Apply meshes to existing hands if already tracking.\r\n this._trackingHands.left?.setHandMesh(this._handResources.handMeshes.left, this._handResources.rigMappings.left, this._xrSessionManager);\r\n this._trackingHands.right?.setHandMesh(this._handResources.handMeshes.right, this._handResources.rigMappings.right, this._xrSessionManager);\r\n this._handResources.handMeshes.left.scaling.setAll(this._xrSessionManager.worldScalingFactor);\r\n this._handResources.handMeshes.right.scaling.setAll(this._xrSessionManager.worldScalingFactor);\r\n });\r\n this._worldScaleObserver = this._xrSessionManager.onWorldScaleFactorChangedObservable.add((scalingFactors) => {\r\n if (this._handResources.handMeshes) {\r\n this._handResources.handMeshes.left.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor);\r\n this._handResources.handMeshes.right.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor);\r\n }\r\n });\r\n }\r\n\r\n for (const controller of this.options.xrInput.controllers) {\r\n this._attachHand(controller);\r\n }\r\n\r\n this._addNewAttachObserver(this.options.xrInput.onControllerAddedObservable, this._attachHand);\r\n this._addNewAttachObserver(this.options.xrInput.onControllerRemovedObservable, this._detachHand);\r\n\r\n return true;\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n this._trackingHands.left?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace, this.options.xrInput.xrCamera);\r\n this._trackingHands.right?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace, this.options.xrInput.xrCamera);\r\n }\r\n\r\n private _attachHand = (xrController: WebXRInputSource) => {\r\n if (!xrController.inputSource.hand || xrController.inputSource.handedness == \"none\" || !this._handResources.jointMeshes) {\r\n return;\r\n }\r\n\r\n const handedness = xrController.inputSource.handedness;\r\n const webxrHand = new WebXRHand(\r\n xrController,\r\n this._handResources.jointMeshes && this._handResources.jointMeshes[handedness],\r\n this._handResources.handMeshes && this._handResources.handMeshes[handedness],\r\n this._handResources.rigMappings && this._handResources.rigMappings[handedness],\r\n this.options.handMeshes?.meshesUseLeftHandedCoordinates,\r\n this.options.jointMeshes?.invisible,\r\n this.options.jointMeshes?.scaleFactor\r\n );\r\n\r\n this._attachedHands[xrController.uniqueId] = webxrHand;\r\n this._trackingHands[handedness] = webxrHand;\r\n\r\n this.onHandAddedObservable.notifyObservers(webxrHand);\r\n };\r\n\r\n private _detachHandById(controllerId: string, disposeMesh?: boolean) {\r\n const hand = this.getHandByControllerId(controllerId);\r\n if (hand) {\r\n const handedness = hand.xrController.inputSource.handedness == \"left\" ? \"left\" : \"right\";\r\n if (this._trackingHands[handedness]?.xrController.uniqueId === controllerId) {\r\n this._trackingHands[handedness] = null;\r\n }\r\n this.onHandRemovedObservable.notifyObservers(hand);\r\n hand.dispose(disposeMesh);\r\n delete this._attachedHands[controllerId];\r\n }\r\n }\r\n\r\n private _detachHand = (xrController: WebXRInputSource) => {\r\n this._detachHandById(xrController.uniqueId);\r\n };\r\n\r\n /**\r\n * Detach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n const keys = Object.keys(this._attachedHands);\r\n for (const uniqueId of keys) {\r\n this._detachHandById(uniqueId, this.options.handMeshes?.disposeOnSessionEnd);\r\n }\r\n\r\n if (this.options.handMeshes?.disposeOnSessionEnd) {\r\n if (this._handResources.jointMeshes) {\r\n for (const trackedMesh of this._handResources.jointMeshes.left) {\r\n trackedMesh.dispose();\r\n }\r\n for (const trackedMesh of this._handResources.jointMeshes.right) {\r\n trackedMesh.dispose();\r\n }\r\n this._handResources.jointMeshes = null;\r\n }\r\n\r\n if (this._handResources.handMeshes) {\r\n this._handResources.handMeshes.left.dispose();\r\n this._handResources.handMeshes.right.dispose();\r\n this._handResources.handMeshes = null;\r\n }\r\n\r\n if (WebXRHandTracking._RightHandGLB) {\r\n for (const mesh of WebXRHandTracking._RightHandGLB.meshes) {\r\n mesh.dispose();\r\n }\r\n }\r\n if (WebXRHandTracking._LeftHandGLB) {\r\n for (const mesh of WebXRHandTracking._LeftHandGLB.meshes) {\r\n mesh.dispose();\r\n }\r\n }\r\n WebXRHandTracking._RightHandGLB = null;\r\n WebXRHandTracking._LeftHandGLB = null;\r\n this._originalMesh?.dispose();\r\n this._originalMesh = undefined;\r\n }\r\n\r\n // remove world scale observer\r\n if (this._worldScaleObserver) {\r\n this._xrSessionManager.onWorldScaleFactorChangedObservable.remove(this._worldScaleObserver);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached.\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onHandAddedObservable.clear();\r\n this.onHandRemovedObservable.clear();\r\n\r\n if (this._handResources.handMeshes && !this.options.handMeshes?.customMeshes) {\r\n // this will dispose the cached meshes\r\n this._handResources.handMeshes.left.dispose();\r\n this._handResources.handMeshes.right.dispose();\r\n // remove the cached meshes\r\n\r\n if (WebXRHandTracking._RightHandGLB) {\r\n for (const mesh of WebXRHandTracking._RightHandGLB.meshes) {\r\n mesh.dispose();\r\n }\r\n }\r\n if (WebXRHandTracking._LeftHandGLB) {\r\n for (const mesh of WebXRHandTracking._LeftHandGLB.meshes) {\r\n mesh.dispose();\r\n }\r\n }\r\n WebXRHandTracking._RightHandGLB = null;\r\n WebXRHandTracking._LeftHandGLB = null;\r\n }\r\n\r\n if (this._handResources.jointMeshes) {\r\n for (const trackedMesh of this._handResources.jointMeshes.left) {\r\n trackedMesh.dispose();\r\n }\r\n for (const trackedMesh of this._handResources.jointMeshes.right) {\r\n trackedMesh.dispose();\r\n }\r\n }\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRHandTracking.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRHandTracking(xrSessionManager, options);\r\n },\r\n WebXRHandTracking.Version,\r\n false\r\n);\r\n"]}
|