@babylonjs/core 9.10.0 → 9.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.d.ts +2 -0
- package/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.js.map +1 -1
- package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.d.ts +13 -3
- package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.js +16 -0
- package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.js.map +1 -1
- package/AudioV2/abstractAudio/subProperties/audioAnalyzer.d.ts +4 -0
- package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js +22 -0
- package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js.map +1 -1
- package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.d.ts +6 -0
- package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.js +22 -5
- package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.js.map +1 -1
- package/Compute/computeEffect.d.ts +6 -0
- package/Compute/computeEffect.js +3 -0
- package/Compute/computeEffect.js.map +1 -1
- package/Compute/computeShader.pure.d.ts +4 -0
- package/Compute/computeShader.pure.js +1 -0
- package/Compute/computeShader.pure.js.map +1 -1
- package/DeviceInput/webDeviceInputSystem.js +7 -1
- package/DeviceInput/webDeviceInputSystem.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +10 -1
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.computeShader.pure.js +154 -2
- package/Engines/WebGPU/Extensions/engine.computeShader.pure.js.map +1 -1
- package/Engines/abstractEngine.pure.d.ts +7 -1
- package/Engines/abstractEngine.pure.js +34 -4
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/engine.common.js +61 -1
- package/Engines/engine.common.js.map +1 -1
- package/Engines/engine.pure.d.ts +0 -7
- package/Engines/engine.pure.js +0 -34
- package/Engines/engine.pure.js.map +1 -1
- package/Engines/thinNativeEngine.pure.js +15 -8
- package/Engines/thinNativeEngine.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.d.ts +8 -0
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js +26 -0
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js.map +1 -1
- package/Materials/PBR/pbrMaterial.pure.d.ts +6 -0
- package/Materials/PBR/pbrMaterial.pure.js +8 -0
- package/Materials/PBR/pbrMaterial.pure.js.map +1 -1
- package/Materials/Textures/Procedurals/noiseProceduralTexture.pure.js +17 -5
- package/Materials/Textures/Procedurals/noiseProceduralTexture.pure.js.map +1 -1
- package/Materials/effect.pure.d.ts +2 -2
- package/Materials/effect.pure.js +12 -6
- package/Materials/effect.pure.js.map +1 -1
- package/Materials/meshDebugPluginMaterial.pure.js +15 -13
- package/Materials/meshDebugPluginMaterial.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.d.ts +2 -0
- package/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.js +17 -0
- package/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +4 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +6 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +8 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Misc/tools.pure.js +11 -4
- package/Misc/tools.pure.js.map +1 -1
- package/Particles/computeShaderParticleSystem.pure.js +5 -1
- package/Particles/computeShaderParticleSystem.pure.js.map +1 -1
- package/Particles/gpuParticleSystem.pure.d.ts +1 -0
- package/Particles/gpuParticleSystem.pure.js +17 -1
- package/Particles/gpuParticleSystem.pure.js.map +1 -1
- package/ShadersWGSL/gpuRenderParticles.fragment.d.ts +5 -0
- package/ShadersWGSL/gpuRenderParticles.fragment.js +50 -0
- package/ShadersWGSL/gpuRenderParticles.fragment.js.map +1 -0
- package/ShadersWGSL/gpuRenderParticles.vertex.d.ts +5 -0
- package/ShadersWGSL/gpuRenderParticles.vertex.js +120 -0
- package/ShadersWGSL/gpuRenderParticles.vertex.js.map +1 -0
- package/ShadersWGSL/noise.fragment.d.ts +5 -0
- package/ShadersWGSL/noise.fragment.js +18 -0
- package/ShadersWGSL/noise.fragment.js.map +1 -0
- package/SmartAssets/index.d.ts +1 -1
- package/SmartAssets/index.js +1 -1
- package/SmartAssets/index.js.map +1 -1
- package/SmartAssets/pure.d.ts +1 -0
- package/SmartAssets/pure.js +1 -0
- package/SmartAssets/pure.js.map +1 -1
- package/SmartAssets/{smartAssetManager.js → smartAssetManager.pure.js} +30 -17
- package/SmartAssets/smartAssetManager.pure.js.map +1 -0
- package/package.json +1 -1
- package/SmartAssets/smartAssetManager.js.map +0 -1
- /package/SmartAssets/{smartAssetManager.d.ts → smartAssetManager.pure.d.ts} +0 -0
package/Engines/engine.common.js
CHANGED
|
@@ -117,6 +117,20 @@ export function _CommonDispose(commonEngine, canvas) {
|
|
|
117
117
|
* @returns an object containing ascent, height and descent
|
|
118
118
|
*/
|
|
119
119
|
export function GetFontOffset(font) {
|
|
120
|
+
const domFontOffset = GetFontOffsetFromDom(font);
|
|
121
|
+
if (domFontOffset) {
|
|
122
|
+
return domFontOffset;
|
|
123
|
+
}
|
|
124
|
+
const canvasFontOffset = GetFontOffsetFromCanvas(font);
|
|
125
|
+
if (canvasFontOffset) {
|
|
126
|
+
return canvasFontOffset;
|
|
127
|
+
}
|
|
128
|
+
return GetFallbackFontOffset(font);
|
|
129
|
+
}
|
|
130
|
+
function GetFontOffsetFromDom(font) {
|
|
131
|
+
if (!IsDocumentAvailable() || !document.body) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
120
134
|
const text = document.createElement("span");
|
|
121
135
|
text.textContent = "Hg";
|
|
122
136
|
text.style.font = font;
|
|
@@ -140,7 +154,53 @@ export function GetFontOffset(font) {
|
|
|
140
154
|
finally {
|
|
141
155
|
document.body.removeChild(div);
|
|
142
156
|
}
|
|
143
|
-
|
|
157
|
+
const offset = { ascent: fontAscent, height: fontHeight, descent: fontHeight - fontAscent };
|
|
158
|
+
return IsValidFontOffset(offset) ? offset : null;
|
|
159
|
+
}
|
|
160
|
+
function GetFontOffsetFromCanvas(font) {
|
|
161
|
+
let canvas = null;
|
|
162
|
+
try {
|
|
163
|
+
if (typeof OffscreenCanvas !== "undefined") {
|
|
164
|
+
canvas = new OffscreenCanvas(64, 64);
|
|
165
|
+
}
|
|
166
|
+
else if (IsDocumentAvailable() && typeof document.createElement === "function") {
|
|
167
|
+
canvas = document.createElement("canvas");
|
|
168
|
+
canvas.width = 64;
|
|
169
|
+
canvas.height = 64;
|
|
170
|
+
}
|
|
171
|
+
const context = canvas?.getContext("2d");
|
|
172
|
+
if (!context) {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
context.font = font;
|
|
176
|
+
const metrics = context.measureText("Hg");
|
|
177
|
+
const ascent = Number(metrics.actualBoundingBoxAscent ?? metrics.fontBoundingBoxAscent);
|
|
178
|
+
const descent = Number(metrics.actualBoundingBoxDescent ?? metrics.fontBoundingBoxDescent);
|
|
179
|
+
const offset = { ascent, height: ascent + descent, descent };
|
|
180
|
+
return IsValidFontOffset(offset) ? offset : null;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
const disposableCanvas = canvas;
|
|
187
|
+
if (typeof disposableCanvas?.dispose === "function") {
|
|
188
|
+
disposableCanvas.dispose();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function GetFallbackFontOffset(font) {
|
|
193
|
+
const size = Math.max(1, GetCssPixelFontSize(font));
|
|
194
|
+
const ascent = size * 0.8;
|
|
195
|
+
const descent = size * 0.2;
|
|
196
|
+
return { ascent, height: ascent + descent, descent };
|
|
197
|
+
}
|
|
198
|
+
function GetCssPixelFontSize(font) {
|
|
199
|
+
const match = /(?:^|\s)([0-9]+(?:\.[0-9]+)?)px(?:\/|\s|$)/.exec(String(font || ""));
|
|
200
|
+
return match ? Number(match[1]) : 16;
|
|
201
|
+
}
|
|
202
|
+
function IsValidFontOffset(offset) {
|
|
203
|
+
return Number.isFinite(offset.ascent) && Number.isFinite(offset.height) && Number.isFinite(offset.descent) && offset.height > 0;
|
|
144
204
|
}
|
|
145
205
|
/** @internal */
|
|
146
206
|
export async function CreateImageBitmapFromSource(engine, imageSource, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.common.js","sourceRoot":"","sources":["../../../../dev/core/src/Engines/engine.common.ts"],"names":[],"mappings":"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","sourcesContent":["import { IsDocumentAvailable } from \"../Misc/domManagement\";\r\nimport { type Nullable } from \"../types\";\r\nimport { AbstractEngine, type AbstractEngineOptions } from \"./abstractEngine\";\r\nimport { EngineStore } from \"./engineStore\";\r\n\r\n/** @internal */\r\nfunction DisableTouchAction(canvas: Nullable<HTMLCanvasElement>): void {\r\n if (!canvas || !canvas.setAttribute) {\r\n return;\r\n }\r\n\r\n canvas.setAttribute(\"touch-action\", \"none\");\r\n canvas.style.touchAction = \"none\";\r\n (canvas.style as any).webkitTapHighlightColor = \"transparent\";\r\n}\r\n\r\n/** @internal */\r\nexport function _CommonInit(commonEngine: AbstractEngine, canvas: HTMLCanvasElement, creationOptions: AbstractEngineOptions) {\r\n commonEngine._onCanvasFocus = () => {\r\n commonEngine.onCanvasFocusObservable.notifyObservers(commonEngine);\r\n };\r\n\r\n commonEngine._onCanvasBlur = () => {\r\n commonEngine.onCanvasBlurObservable.notifyObservers(commonEngine);\r\n };\r\n\r\n commonEngine._onCanvasContextMenu = (evt: Event) => {\r\n if (commonEngine.disableContextMenu) {\r\n evt.preventDefault();\r\n }\r\n };\r\n\r\n canvas.addEventListener(\"focus\", commonEngine._onCanvasFocus);\r\n canvas.addEventListener(\"blur\", commonEngine._onCanvasBlur);\r\n canvas.addEventListener(\"contextmenu\", commonEngine._onCanvasContextMenu);\r\n\r\n commonEngine._onBlur = () => {\r\n if (commonEngine.disablePerformanceMonitorInBackground) {\r\n commonEngine.performanceMonitor.disable();\r\n }\r\n commonEngine._windowIsBackground = true;\r\n };\r\n\r\n commonEngine._onFocus = () => {\r\n if (commonEngine.disablePerformanceMonitorInBackground) {\r\n commonEngine.performanceMonitor.enable();\r\n }\r\n commonEngine._windowIsBackground = false;\r\n };\r\n\r\n commonEngine._onCanvasPointerOut = (ev) => {\r\n // Check that the element at the point of the pointer out isn't the canvas and if it isn't, notify observers\r\n // Note: This is a workaround for a bug with Safari\r\n if (document.elementFromPoint(ev.clientX, ev.clientY) !== canvas) {\r\n commonEngine.onCanvasPointerOutObservable.notifyObservers(ev);\r\n }\r\n };\r\n\r\n const hostWindow = commonEngine.getHostWindow(); // it calls IsWindowObjectExist()\r\n if (hostWindow && typeof hostWindow.addEventListener === \"function\") {\r\n hostWindow.addEventListener(\"blur\", commonEngine._onBlur);\r\n hostWindow.addEventListener(\"focus\", commonEngine._onFocus);\r\n }\r\n\r\n canvas.addEventListener(\"pointerout\", commonEngine._onCanvasPointerOut);\r\n\r\n if (!creationOptions.doNotHandleTouchAction) {\r\n DisableTouchAction(canvas);\r\n }\r\n\r\n // Create Audio Engine if needed.\r\n if (!AbstractEngine.audioEngine && creationOptions.audioEngine && AbstractEngine.AudioEngineFactory) {\r\n AbstractEngine.audioEngine = AbstractEngine.AudioEngineFactory(commonEngine.getRenderingCanvas(), commonEngine.getAudioContext(), commonEngine.getAudioDestination());\r\n }\r\n\r\n if (IsDocumentAvailable()) {\r\n // Fullscreen\r\n commonEngine._onFullscreenChange = () => {\r\n commonEngine.isFullscreen = !!document.fullscreenElement;\r\n\r\n // Pointer lock\r\n if (commonEngine.isFullscreen && commonEngine._pointerLockRequested && canvas) {\r\n RequestPointerlock(canvas);\r\n }\r\n };\r\n\r\n document.addEventListener(\"fullscreenchange\", commonEngine._onFullscreenChange, false);\r\n document.addEventListener(\"webkitfullscreenchange\", commonEngine._onFullscreenChange, false);\r\n\r\n // Pointer lock\r\n commonEngine._onPointerLockChange = () => {\r\n commonEngine.isPointerLock = document.pointerLockElement === canvas;\r\n };\r\n\r\n document.addEventListener(\"pointerlockchange\", commonEngine._onPointerLockChange, false);\r\n document.addEventListener(\"webkitpointerlockchange\", commonEngine._onPointerLockChange, false);\r\n }\r\n\r\n commonEngine.enableOfflineSupport = AbstractEngine.OfflineProviderFactory !== undefined;\r\n\r\n commonEngine._deterministicLockstep = !!creationOptions.deterministicLockstep;\r\n commonEngine._lockstepMaxSteps = creationOptions.lockstepMaxSteps || 0;\r\n commonEngine._timeStep = creationOptions.timeStep || 1 / 60;\r\n}\r\n\r\n/** @internal */\r\nexport function _CommonDispose(commonEngine: AbstractEngine, canvas: Nullable<HTMLCanvasElement>) {\r\n // Release audio engine\r\n if (EngineStore.Instances.length === 1 && AbstractEngine.audioEngine) {\r\n AbstractEngine.audioEngine.dispose();\r\n AbstractEngine.audioEngine = null;\r\n }\r\n\r\n // Events\r\n const hostWindow = commonEngine.getHostWindow(); // it calls IsWindowObjectExist()\r\n if (hostWindow && typeof hostWindow.removeEventListener === \"function\") {\r\n hostWindow.removeEventListener(\"blur\", commonEngine._onBlur);\r\n hostWindow.removeEventListener(\"focus\", commonEngine._onFocus);\r\n }\r\n\r\n if (canvas) {\r\n canvas.removeEventListener(\"focus\", commonEngine._onCanvasFocus);\r\n canvas.removeEventListener(\"blur\", commonEngine._onCanvasBlur);\r\n canvas.removeEventListener(\"pointerout\", commonEngine._onCanvasPointerOut);\r\n canvas.removeEventListener(\"contextmenu\", commonEngine._onCanvasContextMenu);\r\n }\r\n\r\n if (IsDocumentAvailable()) {\r\n document.removeEventListener(\"fullscreenchange\", commonEngine._onFullscreenChange);\r\n document.removeEventListener(\"mozfullscreenchange\", commonEngine._onFullscreenChange);\r\n document.removeEventListener(\"webkitfullscreenchange\", commonEngine._onFullscreenChange);\r\n document.removeEventListener(\"msfullscreenchange\", commonEngine._onFullscreenChange);\r\n document.removeEventListener(\"pointerlockchange\", commonEngine._onPointerLockChange);\r\n document.removeEventListener(\"mspointerlockchange\", commonEngine._onPointerLockChange);\r\n document.removeEventListener(\"mozpointerlockchange\", commonEngine._onPointerLockChange);\r\n document.removeEventListener(\"webkitpointerlockchange\", commonEngine._onPointerLockChange);\r\n }\r\n}\r\n\r\n/**\r\n * Get Font size information\r\n * @param font font name\r\n * @returns an object containing ascent, height and descent\r\n */\r\nexport function GetFontOffset(font: string): { ascent: number; height: number; descent: number } {\r\n const text = document.createElement(\"span\");\r\n text.textContent = \"Hg\";\r\n text.style.font = font;\r\n\r\n const block = document.createElement(\"div\");\r\n block.style.display = \"inline-block\";\r\n block.style.width = \"1px\";\r\n block.style.height = \"0px\";\r\n block.style.verticalAlign = \"bottom\";\r\n\r\n const div = document.createElement(\"div\");\r\n div.style.whiteSpace = \"nowrap\";\r\n div.appendChild(text);\r\n div.appendChild(block);\r\n\r\n document.body.appendChild(div);\r\n\r\n let fontAscent: number;\r\n let fontHeight: number;\r\n try {\r\n fontHeight = block.getBoundingClientRect().top - text.getBoundingClientRect().top;\r\n block.style.verticalAlign = \"baseline\";\r\n fontAscent = block.getBoundingClientRect().top - text.getBoundingClientRect().top;\r\n } finally {\r\n document.body.removeChild(div);\r\n }\r\n return { ascent: fontAscent, height: fontHeight, descent: fontHeight - fontAscent };\r\n}\r\n\r\n/** @internal */\r\nexport async function CreateImageBitmapFromSource(engine: AbstractEngine, imageSource: string, options?: ImageBitmapOptions): Promise<ImageBitmap> {\r\n return await new Promise<ImageBitmap>((resolve, reject) => {\r\n const image = new Image();\r\n image.onload = () => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n image.decode().then(() => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n engine.createImageBitmap(image, options).then((imageBitmap) => {\r\n resolve(imageBitmap);\r\n });\r\n });\r\n };\r\n image.onerror = () => {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(`Error loading image ${image.src}`);\r\n };\r\n\r\n image.src = imageSource;\r\n });\r\n}\r\n\r\n/** @internal */\r\nexport function ResizeImageBitmap(engine: AbstractEngine, image: HTMLImageElement | ImageBitmap, bufferWidth: number, bufferHeight: number): Uint8Array {\r\n const canvas = engine.createCanvas(bufferWidth, bufferHeight);\r\n const context = canvas.getContext(\"2d\");\r\n\r\n if (!context) {\r\n throw new Error(\"Unable to get 2d context for resizeImageBitmap\");\r\n }\r\n\r\n context.drawImage(image, 0, 0);\r\n\r\n // Create VertexData from map data\r\n // Cast is due to wrong definition in lib.d.ts from ts 1.3 - https://github.com/Microsoft/TypeScript/issues/949\r\n const buffer = <Uint8Array>(<any>context.getImageData(0, 0, bufferWidth, bufferHeight).data);\r\n return buffer;\r\n}\r\n\r\n/**\r\n * Ask the browser to promote the current element to fullscreen rendering mode\r\n * @param element defines the DOM element to promote\r\n */\r\nexport function RequestFullscreen(element: HTMLElement): void {\r\n const requestFunction = element.requestFullscreen || (<any>element).webkitRequestFullscreen;\r\n if (!requestFunction) {\r\n return;\r\n }\r\n void requestFunction.call(element);\r\n}\r\n\r\n/**\r\n * Asks the browser to exit fullscreen mode\r\n */\r\nexport function ExitFullscreen(): void {\r\n const anyDoc = document as any;\r\n\r\n if (document.exitFullscreen) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n document.exitFullscreen();\r\n } else if (anyDoc.webkitCancelFullScreen) {\r\n anyDoc.webkitCancelFullScreen();\r\n }\r\n}\r\n\r\n/**\r\n * Ask the browser to promote the current element to pointerlock mode\r\n * @param element defines the DOM element to promote\r\n */\r\nexport function RequestPointerlock(element: HTMLElement): void {\r\n if (element.requestPointerLock) {\r\n // In some browsers, requestPointerLock returns a promise.\r\n // Handle possible rejections to avoid an unhandled top-level exception.\r\n const promise: unknown = element.requestPointerLock();\r\n if (promise instanceof Promise) {\r\n promise\r\n // eslint-disable-next-line github/no-then\r\n .then(() => {\r\n element.focus();\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch(() => {});\r\n } else {\r\n element.focus();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Asks the browser to exit pointerlock mode\r\n */\r\nexport function ExitPointerlock(): void {\r\n if (document.exitPointerLock) {\r\n document.exitPointerLock();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"engine.common.js","sourceRoot":"","sources":["../../../../dev/core/src/Engines/engine.common.ts"],"names":[],"mappings":"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","sourcesContent":["import { IsDocumentAvailable } from \"../Misc/domManagement\";\r\nimport { type Nullable } from \"../types\";\r\nimport { AbstractEngine, type AbstractEngineOptions } from \"./abstractEngine\";\r\nimport { EngineStore } from \"./engineStore\";\r\n\r\n/** @internal */\r\nfunction DisableTouchAction(canvas: Nullable<HTMLCanvasElement>): void {\r\n if (!canvas || !canvas.setAttribute) {\r\n return;\r\n }\r\n\r\n canvas.setAttribute(\"touch-action\", \"none\");\r\n canvas.style.touchAction = \"none\";\r\n (canvas.style as any).webkitTapHighlightColor = \"transparent\";\r\n}\r\n\r\n/** @internal */\r\nexport function _CommonInit(commonEngine: AbstractEngine, canvas: HTMLCanvasElement, creationOptions: AbstractEngineOptions) {\r\n commonEngine._onCanvasFocus = () => {\r\n commonEngine.onCanvasFocusObservable.notifyObservers(commonEngine);\r\n };\r\n\r\n commonEngine._onCanvasBlur = () => {\r\n commonEngine.onCanvasBlurObservable.notifyObservers(commonEngine);\r\n };\r\n\r\n commonEngine._onCanvasContextMenu = (evt: Event) => {\r\n if (commonEngine.disableContextMenu) {\r\n evt.preventDefault();\r\n }\r\n };\r\n\r\n canvas.addEventListener(\"focus\", commonEngine._onCanvasFocus);\r\n canvas.addEventListener(\"blur\", commonEngine._onCanvasBlur);\r\n canvas.addEventListener(\"contextmenu\", commonEngine._onCanvasContextMenu);\r\n\r\n commonEngine._onBlur = () => {\r\n if (commonEngine.disablePerformanceMonitorInBackground) {\r\n commonEngine.performanceMonitor.disable();\r\n }\r\n commonEngine._windowIsBackground = true;\r\n };\r\n\r\n commonEngine._onFocus = () => {\r\n if (commonEngine.disablePerformanceMonitorInBackground) {\r\n commonEngine.performanceMonitor.enable();\r\n }\r\n commonEngine._windowIsBackground = false;\r\n };\r\n\r\n commonEngine._onCanvasPointerOut = (ev) => {\r\n // Check that the element at the point of the pointer out isn't the canvas and if it isn't, notify observers\r\n // Note: This is a workaround for a bug with Safari\r\n if (document.elementFromPoint(ev.clientX, ev.clientY) !== canvas) {\r\n commonEngine.onCanvasPointerOutObservable.notifyObservers(ev);\r\n }\r\n };\r\n\r\n const hostWindow = commonEngine.getHostWindow(); // it calls IsWindowObjectExist()\r\n if (hostWindow && typeof hostWindow.addEventListener === \"function\") {\r\n hostWindow.addEventListener(\"blur\", commonEngine._onBlur);\r\n hostWindow.addEventListener(\"focus\", commonEngine._onFocus);\r\n }\r\n\r\n canvas.addEventListener(\"pointerout\", commonEngine._onCanvasPointerOut);\r\n\r\n if (!creationOptions.doNotHandleTouchAction) {\r\n DisableTouchAction(canvas);\r\n }\r\n\r\n // Create Audio Engine if needed.\r\n if (!AbstractEngine.audioEngine && creationOptions.audioEngine && AbstractEngine.AudioEngineFactory) {\r\n AbstractEngine.audioEngine = AbstractEngine.AudioEngineFactory(commonEngine.getRenderingCanvas(), commonEngine.getAudioContext(), commonEngine.getAudioDestination());\r\n }\r\n\r\n if (IsDocumentAvailable()) {\r\n // Fullscreen\r\n commonEngine._onFullscreenChange = () => {\r\n commonEngine.isFullscreen = !!document.fullscreenElement;\r\n\r\n // Pointer lock\r\n if (commonEngine.isFullscreen && commonEngine._pointerLockRequested && canvas) {\r\n RequestPointerlock(canvas);\r\n }\r\n };\r\n\r\n document.addEventListener(\"fullscreenchange\", commonEngine._onFullscreenChange, false);\r\n document.addEventListener(\"webkitfullscreenchange\", commonEngine._onFullscreenChange, false);\r\n\r\n // Pointer lock\r\n commonEngine._onPointerLockChange = () => {\r\n commonEngine.isPointerLock = document.pointerLockElement === canvas;\r\n };\r\n\r\n document.addEventListener(\"pointerlockchange\", commonEngine._onPointerLockChange, false);\r\n document.addEventListener(\"webkitpointerlockchange\", commonEngine._onPointerLockChange, false);\r\n }\r\n\r\n commonEngine.enableOfflineSupport = AbstractEngine.OfflineProviderFactory !== undefined;\r\n\r\n commonEngine._deterministicLockstep = !!creationOptions.deterministicLockstep;\r\n commonEngine._lockstepMaxSteps = creationOptions.lockstepMaxSteps || 0;\r\n commonEngine._timeStep = creationOptions.timeStep || 1 / 60;\r\n}\r\n\r\n/** @internal */\r\nexport function _CommonDispose(commonEngine: AbstractEngine, canvas: Nullable<HTMLCanvasElement>) {\r\n // Release audio engine\r\n if (EngineStore.Instances.length === 1 && AbstractEngine.audioEngine) {\r\n AbstractEngine.audioEngine.dispose();\r\n AbstractEngine.audioEngine = null;\r\n }\r\n\r\n // Events\r\n const hostWindow = commonEngine.getHostWindow(); // it calls IsWindowObjectExist()\r\n if (hostWindow && typeof hostWindow.removeEventListener === \"function\") {\r\n hostWindow.removeEventListener(\"blur\", commonEngine._onBlur);\r\n hostWindow.removeEventListener(\"focus\", commonEngine._onFocus);\r\n }\r\n\r\n if (canvas) {\r\n canvas.removeEventListener(\"focus\", commonEngine._onCanvasFocus);\r\n canvas.removeEventListener(\"blur\", commonEngine._onCanvasBlur);\r\n canvas.removeEventListener(\"pointerout\", commonEngine._onCanvasPointerOut);\r\n canvas.removeEventListener(\"contextmenu\", commonEngine._onCanvasContextMenu);\r\n }\r\n\r\n if (IsDocumentAvailable()) {\r\n document.removeEventListener(\"fullscreenchange\", commonEngine._onFullscreenChange);\r\n document.removeEventListener(\"mozfullscreenchange\", commonEngine._onFullscreenChange);\r\n document.removeEventListener(\"webkitfullscreenchange\", commonEngine._onFullscreenChange);\r\n document.removeEventListener(\"msfullscreenchange\", commonEngine._onFullscreenChange);\r\n document.removeEventListener(\"pointerlockchange\", commonEngine._onPointerLockChange);\r\n document.removeEventListener(\"mspointerlockchange\", commonEngine._onPointerLockChange);\r\n document.removeEventListener(\"mozpointerlockchange\", commonEngine._onPointerLockChange);\r\n document.removeEventListener(\"webkitpointerlockchange\", commonEngine._onPointerLockChange);\r\n }\r\n}\r\n\r\n/**\r\n * Get Font size information\r\n * @param font font name\r\n * @returns an object containing ascent, height and descent\r\n */\r\nexport function GetFontOffset(font: string): { ascent: number; height: number; descent: number } {\r\n const domFontOffset = GetFontOffsetFromDom(font);\r\n if (domFontOffset) {\r\n return domFontOffset;\r\n }\r\n\r\n const canvasFontOffset = GetFontOffsetFromCanvas(font);\r\n if (canvasFontOffset) {\r\n return canvasFontOffset;\r\n }\r\n\r\n return GetFallbackFontOffset(font);\r\n}\r\n\r\nfunction GetFontOffsetFromDom(font: string): Nullable<{ ascent: number; height: number; descent: number }> {\r\n if (!IsDocumentAvailable() || !document.body) {\r\n return null;\r\n }\r\n\r\n const text = document.createElement(\"span\");\r\n text.textContent = \"Hg\";\r\n text.style.font = font;\r\n\r\n const block = document.createElement(\"div\");\r\n block.style.display = \"inline-block\";\r\n block.style.width = \"1px\";\r\n block.style.height = \"0px\";\r\n block.style.verticalAlign = \"bottom\";\r\n\r\n const div = document.createElement(\"div\");\r\n div.style.whiteSpace = \"nowrap\";\r\n div.appendChild(text);\r\n div.appendChild(block);\r\n\r\n document.body.appendChild(div);\r\n\r\n let fontAscent: number;\r\n let fontHeight: number;\r\n try {\r\n fontHeight = block.getBoundingClientRect().top - text.getBoundingClientRect().top;\r\n block.style.verticalAlign = \"baseline\";\r\n fontAscent = block.getBoundingClientRect().top - text.getBoundingClientRect().top;\r\n } finally {\r\n document.body.removeChild(div);\r\n }\r\n\r\n const offset = { ascent: fontAscent, height: fontHeight, descent: fontHeight - fontAscent };\r\n return IsValidFontOffset(offset) ? offset : null;\r\n}\r\n\r\nfunction GetFontOffsetFromCanvas(font: string): Nullable<{ ascent: number; height: number; descent: number }> {\r\n let canvas: Nullable<OffscreenCanvas | HTMLCanvasElement> = null;\r\n try {\r\n if (typeof OffscreenCanvas !== \"undefined\") {\r\n canvas = new OffscreenCanvas(64, 64);\r\n } else if (IsDocumentAvailable() && typeof document.createElement === \"function\") {\r\n canvas = document.createElement(\"canvas\");\r\n canvas.width = 64;\r\n canvas.height = 64;\r\n }\r\n\r\n const context = canvas?.getContext(\"2d\") as Nullable<CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D>;\r\n if (!context) {\r\n return null;\r\n }\r\n\r\n context.font = font;\r\n const metrics = context.measureText(\"Hg\");\r\n const ascent = Number(metrics.actualBoundingBoxAscent ?? metrics.fontBoundingBoxAscent);\r\n const descent = Number(metrics.actualBoundingBoxDescent ?? metrics.fontBoundingBoxDescent);\r\n const offset = { ascent, height: ascent + descent, descent };\r\n return IsValidFontOffset(offset) ? offset : null;\r\n } catch {\r\n return null;\r\n } finally {\r\n const disposableCanvas = canvas as Nullable<{ dispose?: () => void }>;\r\n if (typeof disposableCanvas?.dispose === \"function\") {\r\n disposableCanvas.dispose();\r\n }\r\n }\r\n}\r\n\r\nfunction GetFallbackFontOffset(font: string): { ascent: number; height: number; descent: number } {\r\n const size = Math.max(1, GetCssPixelFontSize(font));\r\n const ascent = size * 0.8;\r\n const descent = size * 0.2;\r\n return { ascent, height: ascent + descent, descent };\r\n}\r\n\r\nfunction GetCssPixelFontSize(font: string): number {\r\n const match = /(?:^|\\s)([0-9]+(?:\\.[0-9]+)?)px(?:\\/|\\s|$)/.exec(String(font || \"\"));\r\n return match ? Number(match[1]) : 16;\r\n}\r\n\r\nfunction IsValidFontOffset(offset: { ascent: number; height: number; descent: number }): boolean {\r\n return Number.isFinite(offset.ascent) && Number.isFinite(offset.height) && Number.isFinite(offset.descent) && offset.height > 0;\r\n}\r\n\r\n/** @internal */\r\nexport async function CreateImageBitmapFromSource(engine: AbstractEngine, imageSource: string, options?: ImageBitmapOptions): Promise<ImageBitmap> {\r\n return await new Promise<ImageBitmap>((resolve, reject) => {\r\n const image = new Image();\r\n image.onload = () => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n image.decode().then(() => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n engine.createImageBitmap(image, options).then((imageBitmap) => {\r\n resolve(imageBitmap);\r\n });\r\n });\r\n };\r\n image.onerror = () => {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(`Error loading image ${image.src}`);\r\n };\r\n\r\n image.src = imageSource;\r\n });\r\n}\r\n\r\n/** @internal */\r\nexport function ResizeImageBitmap(engine: AbstractEngine, image: HTMLImageElement | ImageBitmap, bufferWidth: number, bufferHeight: number): Uint8Array {\r\n const canvas = engine.createCanvas(bufferWidth, bufferHeight);\r\n const context = canvas.getContext(\"2d\");\r\n\r\n if (!context) {\r\n throw new Error(\"Unable to get 2d context for resizeImageBitmap\");\r\n }\r\n\r\n context.drawImage(image, 0, 0);\r\n\r\n // Create VertexData from map data\r\n // Cast is due to wrong definition in lib.d.ts from ts 1.3 - https://github.com/Microsoft/TypeScript/issues/949\r\n const buffer = <Uint8Array>(<any>context.getImageData(0, 0, bufferWidth, bufferHeight).data);\r\n return buffer;\r\n}\r\n\r\n/**\r\n * Ask the browser to promote the current element to fullscreen rendering mode\r\n * @param element defines the DOM element to promote\r\n */\r\nexport function RequestFullscreen(element: HTMLElement): void {\r\n const requestFunction = element.requestFullscreen || (<any>element).webkitRequestFullscreen;\r\n if (!requestFunction) {\r\n return;\r\n }\r\n void requestFunction.call(element);\r\n}\r\n\r\n/**\r\n * Asks the browser to exit fullscreen mode\r\n */\r\nexport function ExitFullscreen(): void {\r\n const anyDoc = document as any;\r\n\r\n if (document.exitFullscreen) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n document.exitFullscreen();\r\n } else if (anyDoc.webkitCancelFullScreen) {\r\n anyDoc.webkitCancelFullScreen();\r\n }\r\n}\r\n\r\n/**\r\n * Ask the browser to promote the current element to pointerlock mode\r\n * @param element defines the DOM element to promote\r\n */\r\nexport function RequestPointerlock(element: HTMLElement): void {\r\n if (element.requestPointerLock) {\r\n // In some browsers, requestPointerLock returns a promise.\r\n // Handle possible rejections to avoid an unhandled top-level exception.\r\n const promise: unknown = element.requestPointerLock();\r\n if (promise instanceof Promise) {\r\n promise\r\n // eslint-disable-next-line github/no-then\r\n .then(() => {\r\n element.focus();\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch(() => {});\r\n } else {\r\n element.focus();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Asks the browser to exit pointerlock mode\r\n */\r\nexport function ExitPointerlock(): void {\r\n if (document.exitPointerLock) {\r\n document.exitPointerLock();\r\n }\r\n}\r\n"]}
|
package/Engines/engine.pure.d.ts
CHANGED
|
@@ -5,7 +5,6 @@ import { InternalTexture } from "../Materials/Textures/internalTexture.js";
|
|
|
5
5
|
import { type ILoadingScreen } from "../Loading/loadingScreen.pure.js";
|
|
6
6
|
import { type WebGLPipelineContext } from "./WebGL/webGLPipelineContext.js";
|
|
7
7
|
import { type IPipelineContext } from "./IPipelineContext.js";
|
|
8
|
-
import { type ICustomAnimationFrameRequester } from "../Misc/customAnimationFrameRequester.js";
|
|
9
8
|
import { type EngineOptions, ThinEngine } from "./thinEngine.pure.js";
|
|
10
9
|
import { type IViewportLike, type IColor4Like } from "../Maths/math.like.js";
|
|
11
10
|
import { PerformanceMonitor } from "../Misc/performanceMonitor.js";
|
|
@@ -246,10 +245,6 @@ export declare class Engine extends ThinEngine {
|
|
|
246
245
|
* @returns The loading screen
|
|
247
246
|
*/
|
|
248
247
|
static DefaultLoadingScreenFactory(canvas: HTMLCanvasElement): ILoadingScreen;
|
|
249
|
-
/**
|
|
250
|
-
* If set, will be used to request the next animation frame for the render loop
|
|
251
|
-
*/
|
|
252
|
-
customAnimationFrameRequester: Nullable<ICustomAnimationFrameRequester>;
|
|
253
248
|
private _rescalePostProcess;
|
|
254
249
|
protected get _supportsHardwareTextureRescaling(): boolean;
|
|
255
250
|
private _measureFps;
|
|
@@ -375,8 +370,6 @@ export declare class Engine extends ThinEngine {
|
|
|
375
370
|
height: number;
|
|
376
371
|
descent: number;
|
|
377
372
|
};
|
|
378
|
-
protected _cancelFrame(): void;
|
|
379
|
-
_renderLoop(timestamp?: number): void;
|
|
380
373
|
/**
|
|
381
374
|
* Enters Pointerlock mode
|
|
382
375
|
*/
|
package/Engines/engine.pure.js
CHANGED
|
@@ -86,11 +86,6 @@ export class Engine extends ThinEngine {
|
|
|
86
86
|
RegisterAbstractEngineDom();
|
|
87
87
|
RegisterAbstractEngineRenderPass();
|
|
88
88
|
super(canvasOrContext, antialias, options, adaptToDeviceRatio);
|
|
89
|
-
// Members
|
|
90
|
-
/**
|
|
91
|
-
* If set, will be used to request the next animation frame for the render loop
|
|
92
|
-
*/
|
|
93
|
-
this.customAnimationFrameRequester = null;
|
|
94
89
|
this._performanceMonitor = new PerformanceMonitor();
|
|
95
90
|
this._drawCalls = new PerfCounter();
|
|
96
91
|
if (!canvasOrContext) {
|
|
@@ -289,35 +284,6 @@ export class Engine extends ThinEngine {
|
|
|
289
284
|
getFontOffset(font) {
|
|
290
285
|
return GetFontOffset(font);
|
|
291
286
|
}
|
|
292
|
-
_cancelFrame() {
|
|
293
|
-
if (this.customAnimationFrameRequester) {
|
|
294
|
-
if (this._frameHandler !== 0) {
|
|
295
|
-
this._frameHandler = 0;
|
|
296
|
-
const { cancelAnimationFrame } = this.customAnimationFrameRequester;
|
|
297
|
-
if (cancelAnimationFrame) {
|
|
298
|
-
cancelAnimationFrame(this.customAnimationFrameRequester.requestID);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
else {
|
|
303
|
-
super._cancelFrame();
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
_renderLoop(timestamp) {
|
|
307
|
-
this._processFrame(timestamp);
|
|
308
|
-
// The first condition prevents queuing another frame if we no longer have active render loops (e.g., if
|
|
309
|
-
// `stopRenderLoop` is called mid frame). The second condition prevents queuing another frame if one has
|
|
310
|
-
// already been queued (e.g., if `stopRenderLoop` and `runRenderLoop` is called mid frame).
|
|
311
|
-
if (this._activeRenderLoops.length > 0 && this._frameHandler === 0) {
|
|
312
|
-
if (this.customAnimationFrameRequester) {
|
|
313
|
-
this.customAnimationFrameRequester.requestID = this._queueNewFrame(this.customAnimationFrameRequester.renderFunction || this._boundRenderFunction, this.customAnimationFrameRequester);
|
|
314
|
-
this._frameHandler = this.customAnimationFrameRequester.requestID;
|
|
315
|
-
}
|
|
316
|
-
else {
|
|
317
|
-
this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
287
|
/**
|
|
322
288
|
* Enters Pointerlock mode
|
|
323
289
|
*/
|