@onerjs/core 8.52.5 → 8.52.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/Cameras/arcRotateCamera.pure.d.ts +3 -1
  2. package/Cameras/arcRotateCamera.pure.js +21 -1
  3. package/Cameras/arcRotateCamera.pure.js.map +1 -1
  4. package/DeviceInput/webDeviceInputSystem.js +7 -1
  5. package/DeviceInput/webDeviceInputSystem.js.map +1 -1
  6. package/Engines/Native/nativeInterfaces.d.ts +10 -1
  7. package/Engines/Native/nativeInterfaces.js.map +1 -1
  8. package/Engines/abstractEngine.pure.d.ts +1 -1
  9. package/Engines/abstractEngine.pure.js +2 -2
  10. package/Engines/abstractEngine.pure.js.map +1 -1
  11. package/Engines/engine.common.js +61 -1
  12. package/Engines/engine.common.js.map +1 -1
  13. package/Engines/thinNativeEngine.pure.js +13 -6
  14. package/Engines/thinNativeEngine.pure.js.map +1 -1
  15. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.d.ts +8 -0
  16. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js +26 -0
  17. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js.map +1 -1
  18. package/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.d.ts +2 -0
  19. package/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.js +17 -0
  20. package/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.js.map +1 -1
  21. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +4 -0
  22. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
  23. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +6 -0
  24. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +8 -0
  25. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  26. package/Meshes/abstractMesh.pure.d.ts +5 -1
  27. package/Meshes/abstractMesh.pure.js +92 -2
  28. package/Meshes/abstractMesh.pure.js.map +1 -1
  29. package/Meshes/thinInstanceMesh.pure.js +143 -2
  30. package/Meshes/thinInstanceMesh.pure.js.map +1 -1
  31. package/Meshes/thinInstanceMesh.types.d.ts +2 -1
  32. package/Meshes/thinInstanceMesh.types.js.map +1 -1
  33. package/Misc/tools.pure.js +1 -1
  34. package/Misc/tools.pure.js.map +1 -1
  35. package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js +1 -1
  36. package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
  37. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js +1 -1
  38. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
  39. package/SmartAssets/index.d.ts +1 -1
  40. package/SmartAssets/index.js +1 -1
  41. package/SmartAssets/index.js.map +1 -1
  42. package/SmartAssets/pure.d.ts +1 -0
  43. package/SmartAssets/pure.js +1 -0
  44. package/SmartAssets/pure.js.map +1 -1
  45. package/SmartAssets/{smartAssetManager.js → smartAssetManager.pure.js} +30 -17
  46. package/SmartAssets/smartAssetManager.pure.js.map +1 -0
  47. package/XR/features/WebXRBodyTracking.pure.d.ts +16 -0
  48. package/XR/features/WebXRBodyTracking.pure.js +167 -30
  49. package/XR/features/WebXRBodyTracking.pure.js.map +1 -1
  50. package/package.json +1 -1
  51. package/SmartAssets/smartAssetManager.js.map +0 -1
  52. /package/SmartAssets/{smartAssetManager.d.ts → smartAssetManager.pure.d.ts} +0 -0
@@ -118,6 +118,20 @@ export function _CommonDispose(commonEngine, canvas) {
118
118
  * @returns an object containing ascent, height and descent
119
119
  */
120
120
  export function GetFontOffset(font) {
121
+ const domFontOffset = GetFontOffsetFromDom(font);
122
+ if (domFontOffset) {
123
+ return domFontOffset;
124
+ }
125
+ const canvasFontOffset = GetFontOffsetFromCanvas(font);
126
+ if (canvasFontOffset) {
127
+ return canvasFontOffset;
128
+ }
129
+ return GetFallbackFontOffset(font);
130
+ }
131
+ function GetFontOffsetFromDom(font) {
132
+ if (!IsDocumentAvailable() || !document.body) {
133
+ return null;
134
+ }
121
135
  const text = document.createElement("span");
122
136
  text.textContent = "Hg";
123
137
  text.style.font = font;
@@ -141,7 +155,53 @@ export function GetFontOffset(font) {
141
155
  finally {
142
156
  document.body.removeChild(div);
143
157
  }
144
- return { ascent: fontAscent, height: fontHeight, descent: fontHeight - fontAscent };
158
+ const offset = { ascent: fontAscent, height: fontHeight, descent: fontHeight - fontAscent };
159
+ return IsValidFontOffset(offset) ? offset : null;
160
+ }
161
+ function GetFontOffsetFromCanvas(font) {
162
+ let canvas = null;
163
+ try {
164
+ if (typeof OffscreenCanvas !== "undefined") {
165
+ canvas = new OffscreenCanvas(64, 64);
166
+ }
167
+ else if (IsDocumentAvailable() && typeof document.createElement === "function") {
168
+ canvas = document.createElement("canvas");
169
+ canvas.width = 64;
170
+ canvas.height = 64;
171
+ }
172
+ const context = canvas?.getContext("2d");
173
+ if (!context) {
174
+ return null;
175
+ }
176
+ context.font = font;
177
+ const metrics = context.measureText("Hg");
178
+ const ascent = Number(metrics.actualBoundingBoxAscent ?? metrics.fontBoundingBoxAscent);
179
+ const descent = Number(metrics.actualBoundingBoxDescent ?? metrics.fontBoundingBoxDescent);
180
+ const offset = { ascent, height: ascent + descent, descent };
181
+ return IsValidFontOffset(offset) ? offset : null;
182
+ }
183
+ catch {
184
+ return null;
185
+ }
186
+ finally {
187
+ const disposableCanvas = canvas;
188
+ if (typeof disposableCanvas?.dispose === "function") {
189
+ disposableCanvas.dispose();
190
+ }
191
+ }
192
+ }
193
+ function GetFallbackFontOffset(font) {
194
+ const size = Math.max(1, GetCssPixelFontSize(font));
195
+ const ascent = size * 0.8;
196
+ const descent = size * 0.2;
197
+ return { ascent, height: ascent + descent, descent };
198
+ }
199
+ function GetCssPixelFontSize(font) {
200
+ const match = /(?:^|\s)([0-9]+(?:\.[0-9]+)?)px(?:\/|\s|$)/.exec(String(font || ""));
201
+ return match ? Number(match[1]) : 16;
202
+ }
203
+ function IsValidFontOffset(offset) {
204
+ return Number.isFinite(offset.ascent) && Number.isFinite(offset.height) && Number.isFinite(offset.descent) && offset.height > 0;
145
205
  }
146
206
  /** @internal */
147
207
  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":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,cAAc,EAA8B,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,gBAAgB;AAChB,SAAS,kBAAkB,CAAC,MAAmC;IAC3D,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAClC,OAAO;IACX,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,KAAa,CAAC,uBAAuB,GAAG,aAAa,CAAC;AAClE,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,WAAW,CAAC,YAA4B,EAAE,MAAyB,EAAE,eAAsC;IACvH,YAAY,CAAC,cAAc,GAAG,GAAG,EAAE;QAC/B,YAAY,CAAC,uBAAuB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IACvE,CAAC,CAAC;IAEF,YAAY,CAAC,aAAa,GAAG,GAAG,EAAE;QAC9B,YAAY,CAAC,sBAAsB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,YAAY,CAAC,oBAAoB,GAAG,CAAC,GAAU,EAAE,EAAE;QAC/C,IAAI,YAAY,CAAC,kBAAkB,EAAE,CAAC;YAClC,GAAG,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;IAC9D,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC;IAE1E,YAAY,CAAC,OAAO,GAAG,GAAG,EAAE;QACxB,IAAI,YAAY,CAAC,qCAAqC,EAAE,CAAC;YACrD,YAAY,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAC9C,CAAC;QACD,YAAY,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAC5C,CAAC,CAAC;IAEF,YAAY,CAAC,QAAQ,GAAG,GAAG,EAAE;QACzB,IAAI,YAAY,CAAC,qCAAqC,EAAE,CAAC;YACrD,YAAY,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;QAC7C,CAAC;QACD,YAAY,CAAC,mBAAmB,GAAG,KAAK,CAAC;IAC7C,CAAC,CAAC;IAEF,YAAY,CAAC,mBAAmB,GAAG,CAAC,EAAE,EAAE,EAAE;QACtC,4GAA4G;QAC5G,mDAAmD;QACnD,IAAI,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;YAC/D,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC,CAAC,iCAAiC;IAClF,IAAI,UAAU,IAAI,OAAO,UAAU,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;QAClE,UAAU,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAC1D,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;IAExE,IAAI,CAAC,eAAe,CAAC,sBAAsB,EAAE,CAAC;QAC1C,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,iCAAiC;IACjC,IAAI,CAAC,cAAc,CAAC,WAAW,IAAI,eAAe,CAAC,WAAW,IAAI,cAAc,CAAC,kBAAkB,EAAE,CAAC;QAClG,cAAc,CAAC,WAAW,GAAG,cAAc,CAAC,kBAAkB,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE,YAAY,CAAC,eAAe,EAAE,EAAE,YAAY,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1K,CAAC;IAED,IAAI,mBAAmB,EAAE,EAAE,CAAC;QACxB,aAAa;QACb,YAAY,CAAC,mBAAmB,GAAG,GAAG,EAAE;YACpC,YAAY,CAAC,YAAY,GAAG,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YACzD,MAAM,YAAY,GAAG,YAAY,CAAC,eAAe,EAAE,CAAC;YAEpD,eAAe;YACf,IAAI,YAAY,CAAC,YAAY,IAAI,YAAY,CAAC,qBAAqB,IAAI,YAAY,EAAE,CAAC;gBAClF,kBAAkB,CAAC,YAAY,CAAC,CAAC;YACrC,CAAC;QACL,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,YAAY,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QACvF,QAAQ,CAAC,gBAAgB,CAAC,wBAAwB,EAAE,YAAY,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAE7F,eAAe;QACf,YAAY,CAAC,oBAAoB,GAAG,GAAG,EAAE;YACrC,YAAY,CAAC,aAAa,GAAG,QAAQ,CAAC,kBAAkB,KAAK,YAAY,CAAC,eAAe,EAAE,CAAC;QAChG,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,YAAY,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QACzF,QAAQ,CAAC,gBAAgB,CAAC,yBAAyB,EAAE,YAAY,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;IACnG,CAAC;IAED,YAAY,CAAC,oBAAoB,GAAG,cAAc,CAAC,sBAAsB,KAAK,SAAS,CAAC;IAExF,YAAY,CAAC,sBAAsB,GAAG,CAAC,CAAC,eAAe,CAAC,qBAAqB,CAAC;IAC9E,YAAY,CAAC,iBAAiB,GAAG,eAAe,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACvE,YAAY,CAAC,SAAS,GAAG,eAAe,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC;AAChE,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,cAAc,CAAC,YAA4B,EAAE,MAAmC;IAC5F,uBAAuB;IACvB,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC;QACnE,cAAc,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACrC,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC;IACtC,CAAC;IAED,SAAS;IACT,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC,CAAC,iCAAiC;IAClF,IAAI,UAAU,IAAI,OAAO,UAAU,CAAC,mBAAmB,KAAK,UAAU,EAAE,CAAC;QACrE,UAAU,CAAC,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAC7D,UAAU,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;QACjE,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QAC/D,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;QAC3E,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,mBAAmB,EAAE,EAAE,CAAC;QACxB,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACnF,QAAQ,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACtF,QAAQ,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACzF,QAAQ,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACrF,QAAQ,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC;QACrF,QAAQ,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC;QACvF,QAAQ,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC;QACxF,QAAQ,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC;IAC/F,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAEvB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5C,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC;IACrC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC1B,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IAC3B,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC;IAErC,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1C,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;IAChC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACtB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAEvB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAE/B,IAAI,UAAkB,CAAC;IACvB,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACD,UAAU,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC;QAClF,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,UAAU,CAAC;QACvC,UAAU,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC;IACtF,CAAC;YAAS,CAAC;QACP,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;AACxF,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,MAAsB,EAAE,WAAmB,EAAE,OAA4B;IACvH,OAAO,MAAM,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtD,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE;YAChB,mFAAmF;YACnF,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBACrB,mFAAmF;gBACnF,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;oBAC1D,OAAO,CAAC,WAAW,CAAC,CAAC;gBACzB,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QACF,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE;YACjB,2EAA2E;YAC3E,MAAM,CAAC,uBAAuB,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC;QAEF,KAAK,CAAC,GAAG,GAAG,WAAW,CAAC;IAC5B,CAAC,CAAC,CAAC;AACP,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,iBAAiB,CAAC,MAAsB,EAAE,KAAqC,EAAE,WAAmB,EAAE,YAAoB;IACtI,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/B,kCAAkC;IAClC,+GAA+G;IAC/G,MAAM,MAAM,GAAqB,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,IAAK,CAAC;IAC7F,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAoB;IAClD,MAAM,eAAe,GAAG,OAAO,CAAC,iBAAiB,IAAU,OAAQ,CAAC,uBAAuB,CAAC;IAC5F,IAAI,CAAC,eAAe,EAAE,CAAC;QACnB,OAAO;IACX,CAAC;IACD,KAAK,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC1B,MAAM,MAAM,GAAG,QAAe,CAAC;IAE/B,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC1B,mEAAmE;QACnE,QAAQ,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;SAAM,IAAI,MAAM,CAAC,sBAAsB,EAAE,CAAC;QACvC,MAAM,CAAC,sBAAsB,EAAE,CAAC;IACpC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAoB;IACnD,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC7B,0DAA0D;QAC1D,wEAAwE;QACxE,MAAM,OAAO,GAAY,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACtD,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;YAC7B,OAAO;gBACH,0CAA0C;iBACzC,IAAI,CAAC,GAAG,EAAE;gBACP,OAAO,CAAC,KAAK,EAAE,CAAC;YACpB,CAAC,CAAC;gBACF,0CAA0C;iBACzC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;IACL,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC3B,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC3B,QAAQ,CAAC,eAAe,EAAE,CAAC;IAC/B,CAAC;AACL,CAAC","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 const inputElement = commonEngine.getInputElement();\r\n\r\n // Pointer lock\r\n if (commonEngine.isFullscreen && commonEngine._pointerLockRequested && inputElement) {\r\n RequestPointerlock(inputElement);\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 === commonEngine.getInputElement();\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 const inputElement = commonEngine.getInputElement();\r\n\r\n // Pointer lock\r\n if (commonEngine.isFullscreen && commonEngine._pointerLockRequested && inputElement) {\r\n RequestPointerlock(inputElement);\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 === commonEngine.getInputElement();\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"]}
@@ -158,12 +158,19 @@ export class ThinNativeEngine extends ThinEngine {
158
158
  if (_native.Engine.PROTOCOL_VERSION !== ThinNativeEngine.PROTOCOL_VERSION) {
159
159
  throw new Error(`Protocol version mismatch: ${_native.Engine.PROTOCOL_VERSION} (Native) !== ${ThinNativeEngine.PROTOCOL_VERSION} (JS)`);
160
160
  }
161
- if (this._engine.setDeviceLostCallback) {
162
- this._engine.setDeviceLostCallback(() => {
163
- this.onContextLostObservable.notifyObservers(this);
164
- this._contextWasLost = true;
165
- this._restoreEngineAfterContextLost();
166
- });
161
+ // Prefer setRenderResetCallback (accurate name -- fires when bgfx is (re)initialized,
162
+ // i.e. on device restore). Fall back to the legacy setDeviceLostCallback for backward
163
+ // compatibility with older BabylonNative builds. See BabylonNative #1722.
164
+ const renderResetCallback = () => {
165
+ this.onContextLostObservable.notifyObservers(this);
166
+ this._contextWasLost = true;
167
+ this._restoreEngineAfterContextLost();
168
+ };
169
+ if (this._engine.setRenderResetCallback) {
170
+ this._engine.setRenderResetCallback(renderResetCallback);
171
+ }
172
+ else if (this._engine.setDeviceLostCallback) {
173
+ this._engine.setDeviceLostCallback(renderResetCallback);
167
174
  }
168
175
  this._webGLVersion = 2;
169
176
  this.disableUniformBuffers = true;