@babylonjs/core 7.20.0 → 7.20.1
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/Bones/bone.js +3 -3
- package/Bones/bone.js.map +1 -1
- package/Bones/boneLookController.js +3 -3
- package/Bones/boneLookController.js.map +1 -1
- package/Compat/compatibilityOptions.d.ts +13 -6
- package/Compat/compatibilityOptions.js +20 -4
- package/Compat/compatibilityOptions.js.map +1 -1
- package/Compat/index.d.ts +1 -1
- package/Compat/index.js +1 -1
- package/Compat/index.js.map +1 -1
- package/Culling/boundingBox.js +5 -5
- package/Culling/boundingBox.js.map +1 -1
- package/Culling/boundingInfo.js +2 -2
- package/Culling/boundingInfo.js.map +1 -1
- package/Culling/boundingSphere.js +2 -2
- package/Culling/boundingSphere.js.map +1 -1
- package/Culling/ray.js +2 -2
- package/Culling/ray.js.map +1 -1
- package/Debug/debugLayer.d.ts +3 -0
- package/Debug/debugLayer.js +15 -0
- package/Debug/debugLayer.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/engine.js +11 -2
- package/Engines/engine.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDoNBlock.d.ts +2 -2
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDoNBlock.js +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDoNBlock.js.map +1 -1
- package/Layers/highlightLayer.js +0 -1
- package/Layers/highlightLayer.js.map +1 -1
- package/Materials/Textures/Loaders/hdrTextureLoader.js +3 -3
- package/Materials/Textures/Loaders/hdrTextureLoader.js.map +1 -1
- package/Materials/Textures/hdrCubeTexture.js +2 -2
- package/Materials/Textures/hdrCubeTexture.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.js +2 -2
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Materials/Textures/texture.js +3 -3
- package/Materials/Textures/texture.js.map +1 -1
- package/Maths/math.color.js +3 -3
- package/Maths/math.color.js.map +1 -1
- package/Maths/math.vector.js +13 -14
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/Builders/boxBuilder.js +5 -5
- package/Meshes/Builders/boxBuilder.js.map +1 -1
- package/Meshes/Builders/capsuleBuilder.js +4 -4
- package/Meshes/Builders/capsuleBuilder.js.map +1 -1
- package/Meshes/Builders/cylinderBuilder.js +8 -8
- package/Meshes/Builders/cylinderBuilder.js.map +1 -1
- package/Meshes/Builders/decalBuilder.js +3 -3
- package/Meshes/Builders/decalBuilder.js.map +1 -1
- package/Meshes/Builders/discBuilder.js +3 -3
- package/Meshes/Builders/discBuilder.js.map +1 -1
- package/Meshes/Builders/goldbergBuilder.js +2 -2
- package/Meshes/Builders/goldbergBuilder.js.map +1 -1
- package/Meshes/Builders/groundBuilder.js +2 -2
- package/Meshes/Builders/groundBuilder.js.map +1 -1
- package/Meshes/Builders/icoSphereBuilder.js +2 -2
- package/Meshes/Builders/icoSphereBuilder.js.map +1 -1
- package/Meshes/Builders/planeBuilder.js +5 -5
- package/Meshes/Builders/planeBuilder.js.map +1 -1
- package/Meshes/Builders/polygonBuilder.js +4 -4
- package/Meshes/Builders/polygonBuilder.js.map +1 -1
- package/Meshes/Builders/polyhedronBuilder.js +3 -3
- package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
- package/Meshes/Builders/ribbonBuilder.js +4 -4
- package/Meshes/Builders/ribbonBuilder.js.map +1 -1
- package/Meshes/Builders/sphereBuilder.js +2 -2
- package/Meshes/Builders/sphereBuilder.js.map +1 -1
- package/Meshes/Builders/tiledBoxBuilder.js +2 -2
- package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
- package/Meshes/Builders/torusBuilder.js +2 -2
- package/Meshes/Builders/torusBuilder.js.map +1 -1
- package/Meshes/Builders/torusKnotBuilder.js +2 -2
- package/Meshes/Builders/torusKnotBuilder.js.map +1 -1
- package/Meshes/geometry.js +7 -7
- package/Meshes/geometry.js.map +1 -1
- package/Misc/HighDynamicRange/hdr.d.ts +40 -42
- package/Misc/HighDynamicRange/hdr.js +209 -202
- package/Misc/HighDynamicRange/hdr.js.map +1 -1
- package/Misc/HighDynamicRange/index.d.ts +1 -1
- package/Misc/HighDynamicRange/index.js +1 -1
- package/Misc/HighDynamicRange/index.js.map +1 -1
- package/Misc/arrayTools.d.ts +12 -17
- package/Misc/arrayTools.js +18 -23
- package/Misc/arrayTools.js.map +1 -1
- package/Misc/dumpTools.d.ts +50 -47
- package/Misc/dumpTools.js +153 -143
- package/Misc/dumpTools.js.map +1 -1
- package/Misc/environmentTextureTools.js +2 -2
- package/Misc/environmentTextureTools.js.map +1 -1
- package/Misc/equirectangularCapture.js +2 -2
- package/Misc/equirectangularCapture.js.map +1 -1
- package/Misc/index.d.ts +2 -1
- package/Misc/index.js +2 -1
- package/Misc/index.js.map +1 -1
- package/Misc/rgbdTextureTools.js +1 -0
- package/Misc/rgbdTextureTools.js.map +1 -1
- package/Misc/screenshotTools.js +3 -3
- package/Misc/screenshotTools.js.map +1 -1
- package/Physics/v1/physicsImpostor.js +2 -2
- package/Physics/v1/physicsImpostor.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.js +2 -2
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/PostProcesses/blurPostProcess.js +0 -1
- package/PostProcesses/blurPostProcess.js.map +1 -1
- package/PostProcesses/passPostProcess.js +0 -2
- package/PostProcesses/passPostProcess.js.map +1 -1
- package/PostProcesses/postProcess.d.ts +6 -0
- package/PostProcesses/postProcess.js +22 -1
- package/PostProcesses/postProcess.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDebug.js +1 -1
- package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDebug.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -1
- package/ShadersWGSL/background.fragment.js +1 -1
- package/ShadersWGSL/background.fragment.js.map +1 -1
- package/package.json +1 -1
package/Misc/arrayTools.d.ts
CHANGED
|
@@ -1,23 +1,18 @@
|
|
|
1
1
|
import type { Tuple } from "../types";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Returns an array of the given size filled with elements built from the given constructor and the parameters.
|
|
4
|
+
* @param size the number of element to construct and put in the array.
|
|
5
|
+
* @param itemBuilder a callback responsible for creating new instance of item. Called once per array entry.
|
|
6
|
+
* @returns a new array filled with new objects.
|
|
4
7
|
*/
|
|
5
|
-
export declare
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Returns a tuple of the given size filled with elements built from the given constructor and the parameters.
|
|
15
|
-
* @param size he number of element to construct and put in the tuple.
|
|
16
|
-
* @param itemBuilder a callback responsible for creating new instance of item. Called once per tuple entry.
|
|
17
|
-
* @returns a new tuple filled with new objects.
|
|
18
|
-
*/
|
|
19
|
-
static BuildTuple<T, N extends number>(size: N, itemBuilder: () => T): Tuple<T, N>;
|
|
20
|
-
}
|
|
8
|
+
export declare function BuildArray<T>(size: number, itemBuilder: () => T): Array<T>;
|
|
9
|
+
/**
|
|
10
|
+
* Returns a tuple of the given size filled with elements built from the given constructor and the parameters.
|
|
11
|
+
* @param size he number of element to construct and put in the tuple.
|
|
12
|
+
* @param itemBuilder a callback responsible for creating new instance of item. Called once per tuple entry.
|
|
13
|
+
* @returns a new tuple filled with new objects.
|
|
14
|
+
*/
|
|
15
|
+
export declare function BuildTuple<T, N extends number>(size: N, itemBuilder: () => T): Tuple<T, N>;
|
|
21
16
|
/**
|
|
22
17
|
* Defines the callback type used when an observed array function is triggered.
|
|
23
18
|
* @internal
|
package/Misc/arrayTools.js
CHANGED
|
@@ -1,30 +1,25 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Returns an array of the given size filled with elements built from the given constructor and the parameters.
|
|
4
|
+
* @param size the number of element to construct and put in the array.
|
|
5
|
+
* @param itemBuilder a callback responsible for creating new instance of item. Called once per array entry.
|
|
6
|
+
* @returns a new array filled with new objects.
|
|
4
7
|
*/
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* @param itemBuilder a callback responsible for creating new instance of item. Called once per array entry.
|
|
10
|
-
* @returns a new array filled with new objects.
|
|
11
|
-
*/
|
|
12
|
-
static BuildArray(size, itemBuilder) {
|
|
13
|
-
const a = [];
|
|
14
|
-
for (let i = 0; i < size; ++i) {
|
|
15
|
-
a.push(itemBuilder());
|
|
16
|
-
}
|
|
17
|
-
return a;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Returns a tuple of the given size filled with elements built from the given constructor and the parameters.
|
|
21
|
-
* @param size he number of element to construct and put in the tuple.
|
|
22
|
-
* @param itemBuilder a callback responsible for creating new instance of item. Called once per tuple entry.
|
|
23
|
-
* @returns a new tuple filled with new objects.
|
|
24
|
-
*/
|
|
25
|
-
static BuildTuple(size, itemBuilder) {
|
|
26
|
-
return ArrayTools.BuildArray(size, itemBuilder);
|
|
8
|
+
export function BuildArray(size, itemBuilder) {
|
|
9
|
+
const a = [];
|
|
10
|
+
for (let i = 0; i < size; ++i) {
|
|
11
|
+
a.push(itemBuilder());
|
|
27
12
|
}
|
|
13
|
+
return a;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Returns a tuple of the given size filled with elements built from the given constructor and the parameters.
|
|
17
|
+
* @param size he number of element to construct and put in the tuple.
|
|
18
|
+
* @param itemBuilder a callback responsible for creating new instance of item. Called once per tuple entry.
|
|
19
|
+
* @returns a new tuple filled with new objects.
|
|
20
|
+
*/
|
|
21
|
+
export function BuildTuple(size, itemBuilder) {
|
|
22
|
+
return BuildArray(size, itemBuilder);
|
|
28
23
|
}
|
|
29
24
|
/**
|
|
30
25
|
* Observes a function and calls the given callback when it is called.
|
package/Misc/arrayTools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrayTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/arrayTools.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAIzD
|
|
1
|
+
{"version":3,"file":"arrayTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/arrayTools.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAIzD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAI,IAAY,EAAE,WAAoB;IAC5D,MAAM,CAAC,GAAQ,EAAE,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE;QAC3B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;KACzB;IACD,OAAO,CAAC,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAsB,IAAO,EAAE,WAAoB;IACzE,OAAO,UAAU,CAAC,IAAI,EAAE,WAAW,CAAQ,CAAC;AAChD,CAAC;AAQD;;;;;;GAMG;AACH,SAAS,qBAAqB,CAAC,MAA8B,EAAE,YAAoB,EAAE,QAA0B;IAC3G,gCAAgC;IAChC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACzC,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE;QACnC,OAAO,IAAI,CAAC;KACf;IAED,sEAAsE;IACtE,MAAM,WAAW,GAAG;QAChB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QACrC,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAClE,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QACvC,OAAO,WAAW,CAAC;IACvB,CAAQ,CAAC;IAET,yDAAyD;IACzD,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC;IAC/B,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC;IAEnC,kDAAkD;IAClD,MAAM,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC;IAEnC,yCAAyC;IACzC,OAAO,GAAG,EAAE;QACR,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE;YACX,OAAO;SACV;QAED,kDAAkD;QAClD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;QAE9B,sEAAsE;QACtE,IAAI,IAAI,EAAE;YACN,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;SAC5B;QACD,4EAA4E;QAC5E,oCAAoC;aAC/B;YACD,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC;YAC1B,MAAM,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC;SACnC;QAED,oDAAoD;QACpD,WAAW,CAAC,IAAI,GAAG,SAAS,CAAC;QAC7B,WAAW,CAAC,QAAQ,GAAG,SAAS,CAAC;IACrC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAE7E;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAI,KAAU,EAAE,QAA0B;IACnE,4EAA4E;IAC5E,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3D,OAAO,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,4DAA4D;IAC5D,OAAO,GAAG,EAAE;QACR,kBAAkB,CAAC,OAAO,CAAC,CAAC,iBAAiB,EAAE,EAAE;YAC7C,iBAAiB,EAAE,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n\r\nimport type { Nullable, Tuple } from \"../types\";\r\n\r\n/**\r\n * Returns an array of the given size filled with elements built from the given constructor and the parameters.\r\n * @param size the number of element to construct and put in the array.\r\n * @param itemBuilder a callback responsible for creating new instance of item. Called once per array entry.\r\n * @returns a new array filled with new objects.\r\n */\r\nexport function BuildArray<T>(size: number, itemBuilder: () => T): Array<T> {\r\n const a: T[] = [];\r\n for (let i = 0; i < size; ++i) {\r\n a.push(itemBuilder());\r\n }\r\n return a;\r\n}\r\n\r\n/**\r\n * Returns a tuple of the given size filled with elements built from the given constructor and the parameters.\r\n * @param size he number of element to construct and put in the tuple.\r\n * @param itemBuilder a callback responsible for creating new instance of item. Called once per tuple entry.\r\n * @returns a new tuple filled with new objects.\r\n */\r\nexport function BuildTuple<T, N extends number>(size: N, itemBuilder: () => T): Tuple<T, N> {\r\n return BuildArray(size, itemBuilder) as any;\r\n}\r\n\r\n/**\r\n * Defines the callback type used when an observed array function is triggered.\r\n * @internal\r\n */\r\nexport type _ObserveCallback = (functionName: string, previousLength: number) => void;\r\n\r\n/**\r\n * Observes a function and calls the given callback when it is called.\r\n * @param object Defines the object the function to observe belongs to.\r\n * @param functionName Defines the name of the function to observe.\r\n * @param callback Defines the callback to call when the function is called.\r\n * @returns A function to call to stop observing\r\n */\r\nfunction _observeArrayfunction(object: { [key: string]: any }, functionName: string, callback: _ObserveCallback): Nullable<() => void> {\r\n // Finds the function to observe\r\n const oldFunction = object[functionName];\r\n if (typeof oldFunction !== \"function\") {\r\n return null;\r\n }\r\n\r\n // Creates a new function that calls the callback and the old function\r\n const newFunction = function () {\r\n const previousLength = object.length;\r\n const returnValue = newFunction.previous.apply(object, arguments);\r\n callback(functionName, previousLength);\r\n return returnValue;\r\n } as any;\r\n\r\n // Doublishly links the new function and the old function\r\n oldFunction.next = newFunction;\r\n newFunction.previous = oldFunction;\r\n\r\n // Replaces the old function with the new function\r\n object[functionName] = newFunction;\r\n\r\n // Returns a function to disable the hook\r\n return () => {\r\n // Only unhook if the function is still hooked\r\n const previous = newFunction.previous;\r\n if (!previous) {\r\n return;\r\n }\r\n\r\n // Finds the ref to the next function in the chain\r\n const next = newFunction.next;\r\n\r\n // If in the middle of the chain, link the previous and next functions\r\n if (next) {\r\n previous.next = next;\r\n next.previous = previous;\r\n }\r\n // If at the end of the chain, remove the reference to the previous function\r\n // and restore the previous function\r\n else {\r\n previous.next = undefined;\r\n object[functionName] = previous;\r\n }\r\n\r\n // Lose reference to the previous and next functions\r\n newFunction.next = undefined;\r\n newFunction.previous = undefined;\r\n };\r\n}\r\n\r\n/**\r\n * Defines the list of functions to proxy when observing an array.\r\n * The scope is currently reduced to the common functions used in the render target render list and the scene cameras.\r\n */\r\nconst observedArrayFunctions = [\"push\", \"splice\", \"pop\", \"shift\", \"unshift\"];\r\n\r\n/**\r\n * Observes an array and notifies the given observer when the array is modified.\r\n * @param array Defines the array to observe\r\n * @param callback Defines the function to call when the array is modified (in the limit of the observed array functions)\r\n * @returns A function to call to stop observing the array\r\n * @internal\r\n */\r\nexport function _ObserveArray<T>(array: T[], callback: _ObserveCallback) {\r\n // Observes all the required array functions and stores the unhook functions\r\n const unObserveFunctions = observedArrayFunctions.map((name) => {\r\n return _observeArrayfunction(array, name, callback);\r\n });\r\n\r\n // Returns a function that unhook all the observed functions\r\n return () => {\r\n unObserveFunctions.forEach((unObserveFunction) => {\r\n unObserveFunction?.();\r\n });\r\n };\r\n}\r\n"]}
|
package/Misc/dumpTools.d.ts
CHANGED
|
@@ -1,50 +1,53 @@
|
|
|
1
1
|
import type { AbstractEngine } from "../Engines/abstractEngine";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Dumps the current bound framebuffer
|
|
4
|
+
* @param width defines the rendering width
|
|
5
|
+
* @param height defines the rendering height
|
|
6
|
+
* @param engine defines the hosting engine
|
|
7
|
+
* @param successCallback defines the callback triggered once the data are available
|
|
8
|
+
* @param mimeType defines the mime type of the result
|
|
9
|
+
* @param fileName defines the filename to download. If present, the result will automatically be downloaded
|
|
10
|
+
* @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
|
|
11
|
+
* @returns a void promise
|
|
4
12
|
*/
|
|
5
|
-
export declare
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Dispose the dump tools associated resources
|
|
48
|
-
*/
|
|
49
|
-
static Dispose(): void;
|
|
50
|
-
}
|
|
13
|
+
export declare function DumpFramebuffer(width: number, height: number, engine: AbstractEngine, successCallback?: (data: string) => void, mimeType?: string, fileName?: string, quality?: number): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Dumps an array buffer
|
|
16
|
+
* @param width defines the rendering width
|
|
17
|
+
* @param height defines the rendering height
|
|
18
|
+
* @param data the data array
|
|
19
|
+
* @param mimeType defines the mime type of the result
|
|
20
|
+
* @param fileName defines the filename to download. If present, the result will automatically be downloaded
|
|
21
|
+
* @param invertY true to invert the picture in the Y dimension
|
|
22
|
+
* @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string
|
|
23
|
+
* @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
|
|
24
|
+
* @returns a promise that resolve to the final data
|
|
25
|
+
*/
|
|
26
|
+
export declare function DumpDataAsync(width: number, height: number, data: ArrayBufferView, mimeType?: string, fileName?: string, invertY?: boolean, toArrayBuffer?: boolean, quality?: number): Promise<string | ArrayBuffer>;
|
|
27
|
+
/**
|
|
28
|
+
* Dumps an array buffer
|
|
29
|
+
* @param width defines the rendering width
|
|
30
|
+
* @param height defines the rendering height
|
|
31
|
+
* @param data the data array
|
|
32
|
+
* @param successCallback defines the callback triggered once the data are available
|
|
33
|
+
* @param mimeType defines the mime type of the result
|
|
34
|
+
* @param fileName defines the filename to download. If present, the result will automatically be downloaded
|
|
35
|
+
* @param invertY true to invert the picture in the Y dimension
|
|
36
|
+
* @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string
|
|
37
|
+
* @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
|
|
38
|
+
*/
|
|
39
|
+
export declare function DumpData(width: number, height: number, data: ArrayBufferView, successCallback?: (data: string | ArrayBuffer) => void, mimeType?: string, fileName?: string, invertY?: boolean, toArrayBuffer?: boolean, quality?: number): void;
|
|
40
|
+
/**
|
|
41
|
+
* Dispose the dump tools associated resources
|
|
42
|
+
*/
|
|
43
|
+
export declare function Dispose(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Object containing a set of static utilities functions to dump data from a canvas
|
|
46
|
+
* @deprecated use functions
|
|
47
|
+
*/
|
|
48
|
+
export declare const DumpTools: {
|
|
49
|
+
DumpData: typeof DumpData;
|
|
50
|
+
DumpDataAsync: typeof DumpDataAsync;
|
|
51
|
+
DumpFramebuffer: typeof DumpFramebuffer;
|
|
52
|
+
Dispose: typeof Dispose;
|
|
53
|
+
};
|
package/Misc/dumpTools.js
CHANGED
|
@@ -5,154 +5,164 @@ import { Tools } from "./tools.js";
|
|
|
5
5
|
import { passPixelShader } from "../Shaders/pass.fragment.js";
|
|
6
6
|
import { Scalar } from "../Maths/math.scalar.js";
|
|
7
7
|
import { EngineStore } from "../Engines/engineStore.js";
|
|
8
|
+
let _dumpToolsEngine;
|
|
9
|
+
function _CreateDumpRenderer() {
|
|
10
|
+
if (!_dumpToolsEngine) {
|
|
11
|
+
let canvas;
|
|
12
|
+
let engine = null;
|
|
13
|
+
const options = {
|
|
14
|
+
preserveDrawingBuffer: true,
|
|
15
|
+
depth: false,
|
|
16
|
+
stencil: false,
|
|
17
|
+
alpha: true,
|
|
18
|
+
premultipliedAlpha: false,
|
|
19
|
+
antialias: false,
|
|
20
|
+
failIfMajorPerformanceCaveat: false,
|
|
21
|
+
};
|
|
22
|
+
try {
|
|
23
|
+
canvas = new OffscreenCanvas(100, 100); // will be resized later
|
|
24
|
+
engine = new ThinEngine(canvas, false, options);
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
// The browser either does not support OffscreenCanvas or WebGL context in OffscreenCanvas, fallback on a regular canvas
|
|
28
|
+
canvas = document.createElement("canvas");
|
|
29
|
+
engine = new ThinEngine(canvas, false, options);
|
|
30
|
+
}
|
|
31
|
+
// remove this engine from the list of instances to avoid using it for other purposes
|
|
32
|
+
EngineStore.Instances.pop();
|
|
33
|
+
// However, make sure to dispose it when no other engines are left
|
|
34
|
+
EngineStore.OnEnginesDisposedObservable.add((e) => {
|
|
35
|
+
// guaranteed to run when no other instances are left
|
|
36
|
+
// only dispose if it's not the current engine
|
|
37
|
+
if (engine && e !== engine && !engine.isDisposed && EngineStore.Instances.length === 0) {
|
|
38
|
+
// Dump the engine and the associated resources
|
|
39
|
+
Dispose();
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
engine.getCaps().parallelShaderCompile = undefined;
|
|
43
|
+
const renderer = new EffectRenderer(engine);
|
|
44
|
+
const wrapper = new EffectWrapper({
|
|
45
|
+
engine,
|
|
46
|
+
name: passPixelShader.name,
|
|
47
|
+
fragmentShader: passPixelShader.shader,
|
|
48
|
+
samplerNames: ["textureSampler"],
|
|
49
|
+
});
|
|
50
|
+
_dumpToolsEngine = {
|
|
51
|
+
canvas,
|
|
52
|
+
engine,
|
|
53
|
+
renderer,
|
|
54
|
+
wrapper,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return _dumpToolsEngine;
|
|
58
|
+
}
|
|
8
59
|
/**
|
|
9
|
-
*
|
|
60
|
+
* Dumps the current bound framebuffer
|
|
61
|
+
* @param width defines the rendering width
|
|
62
|
+
* @param height defines the rendering height
|
|
63
|
+
* @param engine defines the hosting engine
|
|
64
|
+
* @param successCallback defines the callback triggered once the data are available
|
|
65
|
+
* @param mimeType defines the mime type of the result
|
|
66
|
+
* @param fileName defines the filename to download. If present, the result will automatically be downloaded
|
|
67
|
+
* @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
|
|
68
|
+
* @returns a void promise
|
|
10
69
|
*/
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
renderer,
|
|
57
|
-
wrapper,
|
|
58
|
-
};
|
|
70
|
+
export async function DumpFramebuffer(width, height, engine, successCallback, mimeType = "image/png", fileName, quality) {
|
|
71
|
+
// Read the contents of the framebuffer
|
|
72
|
+
const bufferView = await engine.readPixels(0, 0, width, height);
|
|
73
|
+
const data = new Uint8Array(bufferView.buffer);
|
|
74
|
+
DumpData(width, height, data, successCallback, mimeType, fileName, true, undefined, quality);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Dumps an array buffer
|
|
78
|
+
* @param width defines the rendering width
|
|
79
|
+
* @param height defines the rendering height
|
|
80
|
+
* @param data the data array
|
|
81
|
+
* @param mimeType defines the mime type of the result
|
|
82
|
+
* @param fileName defines the filename to download. If present, the result will automatically be downloaded
|
|
83
|
+
* @param invertY true to invert the picture in the Y dimension
|
|
84
|
+
* @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string
|
|
85
|
+
* @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
|
|
86
|
+
* @returns a promise that resolve to the final data
|
|
87
|
+
*/
|
|
88
|
+
export function DumpDataAsync(width, height, data, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) {
|
|
89
|
+
return new Promise((resolve) => {
|
|
90
|
+
DumpData(width, height, data, (result) => resolve(result), mimeType, fileName, invertY, toArrayBuffer, quality);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Dumps an array buffer
|
|
95
|
+
* @param width defines the rendering width
|
|
96
|
+
* @param height defines the rendering height
|
|
97
|
+
* @param data the data array
|
|
98
|
+
* @param successCallback defines the callback triggered once the data are available
|
|
99
|
+
* @param mimeType defines the mime type of the result
|
|
100
|
+
* @param fileName defines the filename to download. If present, the result will automatically be downloaded
|
|
101
|
+
* @param invertY true to invert the picture in the Y dimension
|
|
102
|
+
* @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string
|
|
103
|
+
* @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
|
|
104
|
+
*/
|
|
105
|
+
export function DumpData(width, height, data, successCallback, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) {
|
|
106
|
+
const renderer = _CreateDumpRenderer();
|
|
107
|
+
renderer.engine.setSize(width, height, true);
|
|
108
|
+
// Convert if data are float32
|
|
109
|
+
if (data instanceof Float32Array) {
|
|
110
|
+
const data2 = new Uint8Array(data.length);
|
|
111
|
+
let n = data.length;
|
|
112
|
+
while (n--) {
|
|
113
|
+
const v = data[n];
|
|
114
|
+
data2[n] = Math.round(Scalar.Clamp(v) * 255);
|
|
59
115
|
}
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Dumps the current bound framebuffer
|
|
64
|
-
* @param width defines the rendering width
|
|
65
|
-
* @param height defines the rendering height
|
|
66
|
-
* @param engine defines the hosting engine
|
|
67
|
-
* @param successCallback defines the callback triggered once the data are available
|
|
68
|
-
* @param mimeType defines the mime type of the result
|
|
69
|
-
* @param fileName defines the filename to download. If present, the result will automatically be downloaded
|
|
70
|
-
* @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
|
|
71
|
-
* @returns a void promise
|
|
72
|
-
*/
|
|
73
|
-
static async DumpFramebuffer(width, height, engine, successCallback, mimeType = "image/png", fileName, quality) {
|
|
74
|
-
// Read the contents of the framebuffer
|
|
75
|
-
const bufferView = await engine.readPixels(0, 0, width, height);
|
|
76
|
-
const data = new Uint8Array(bufferView.buffer);
|
|
77
|
-
DumpTools.DumpData(width, height, data, successCallback, mimeType, fileName, true, undefined, quality);
|
|
116
|
+
data = data2;
|
|
78
117
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
118
|
+
// Create the image
|
|
119
|
+
const texture = renderer.engine.createRawTexture(data, width, height, 5, false, !invertY, 1);
|
|
120
|
+
renderer.renderer.setViewport();
|
|
121
|
+
renderer.renderer.applyEffectWrapper(renderer.wrapper);
|
|
122
|
+
renderer.wrapper.effect._bindTexture("textureSampler", texture);
|
|
123
|
+
renderer.renderer.draw();
|
|
124
|
+
if (toArrayBuffer) {
|
|
125
|
+
Tools.ToBlob(renderer.canvas, (blob) => {
|
|
126
|
+
const fileReader = new FileReader();
|
|
127
|
+
fileReader.onload = (event) => {
|
|
128
|
+
const arrayBuffer = event.target.result;
|
|
129
|
+
if (successCallback) {
|
|
130
|
+
successCallback(arrayBuffer);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
fileReader.readAsArrayBuffer(blob);
|
|
134
|
+
}, mimeType, quality);
|
|
95
135
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
* @param width defines the rendering width
|
|
99
|
-
* @param height defines the rendering height
|
|
100
|
-
* @param data the data array
|
|
101
|
-
* @param successCallback defines the callback triggered once the data are available
|
|
102
|
-
* @param mimeType defines the mime type of the result
|
|
103
|
-
* @param fileName defines the filename to download. If present, the result will automatically be downloaded
|
|
104
|
-
* @param invertY true to invert the picture in the Y dimension
|
|
105
|
-
* @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string
|
|
106
|
-
* @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
|
|
107
|
-
*/
|
|
108
|
-
static DumpData(width, height, data, successCallback, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) {
|
|
109
|
-
const renderer = DumpTools._CreateDumpRenderer();
|
|
110
|
-
renderer.engine.setSize(width, height, true);
|
|
111
|
-
// Convert if data are float32
|
|
112
|
-
if (data instanceof Float32Array) {
|
|
113
|
-
const data2 = new Uint8Array(data.length);
|
|
114
|
-
let n = data.length;
|
|
115
|
-
while (n--) {
|
|
116
|
-
const v = data[n];
|
|
117
|
-
data2[n] = Math.round(Scalar.Clamp(v) * 255);
|
|
118
|
-
}
|
|
119
|
-
data = data2;
|
|
120
|
-
}
|
|
121
|
-
// Create the image
|
|
122
|
-
const texture = renderer.engine.createRawTexture(data, width, height, 5, false, !invertY, 1);
|
|
123
|
-
renderer.renderer.setViewport();
|
|
124
|
-
renderer.renderer.applyEffectWrapper(renderer.wrapper);
|
|
125
|
-
renderer.wrapper.effect._bindTexture("textureSampler", texture);
|
|
126
|
-
renderer.renderer.draw();
|
|
127
|
-
if (toArrayBuffer) {
|
|
128
|
-
Tools.ToBlob(renderer.canvas, (blob) => {
|
|
129
|
-
const fileReader = new FileReader();
|
|
130
|
-
fileReader.onload = (event) => {
|
|
131
|
-
const arrayBuffer = event.target.result;
|
|
132
|
-
if (successCallback) {
|
|
133
|
-
successCallback(arrayBuffer);
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
fileReader.readAsArrayBuffer(blob);
|
|
137
|
-
}, mimeType, quality);
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
Tools.EncodeScreenshotCanvasData(renderer.canvas, successCallback, mimeType, fileName, quality);
|
|
141
|
-
}
|
|
142
|
-
texture.dispose();
|
|
136
|
+
else {
|
|
137
|
+
Tools.EncodeScreenshotCanvasData(renderer.canvas, successCallback, mimeType, fileName, quality);
|
|
143
138
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
139
|
+
texture.dispose();
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Dispose the dump tools associated resources
|
|
143
|
+
*/
|
|
144
|
+
export function Dispose() {
|
|
145
|
+
if (_dumpToolsEngine) {
|
|
146
|
+
_dumpToolsEngine.wrapper.dispose();
|
|
147
|
+
_dumpToolsEngine.renderer.dispose();
|
|
148
|
+
_dumpToolsEngine.engine.dispose();
|
|
154
149
|
}
|
|
150
|
+
_dumpToolsEngine = null;
|
|
155
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Object containing a set of static utilities functions to dump data from a canvas
|
|
154
|
+
* @deprecated use functions
|
|
155
|
+
*/
|
|
156
|
+
export const DumpTools = {
|
|
157
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
158
|
+
DumpData,
|
|
159
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
160
|
+
DumpDataAsync,
|
|
161
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
162
|
+
DumpFramebuffer,
|
|
163
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
164
|
+
Dispose,
|
|
165
|
+
};
|
|
156
166
|
/**
|
|
157
167
|
* This will be executed automatically for UMD and es5.
|
|
158
168
|
* If esm dev wants the side effects to execute they will have to run it manually
|
|
@@ -161,9 +171,9 @@ export class DumpTools {
|
|
|
161
171
|
*/
|
|
162
172
|
const initSideEffects = () => {
|
|
163
173
|
// References the dependencies.
|
|
164
|
-
Tools.DumpData =
|
|
165
|
-
Tools.DumpDataAsync =
|
|
166
|
-
Tools.DumpFramebuffer =
|
|
174
|
+
Tools.DumpData = DumpData;
|
|
175
|
+
Tools.DumpDataAsync = DumpDataAsync;
|
|
176
|
+
Tools.DumpFramebuffer = DumpFramebuffer;
|
|
167
177
|
};
|
|
168
178
|
initSideEffects();
|
|
169
179
|
//# sourceMappingURL=dumpTools.js.map
|
package/Misc/dumpTools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dumpTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/dumpTools.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { _WarnImport } from \"./devTools\";\r\n\r\nimport { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EffectRenderer, EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { Tools } from \"./tools\";\r\nimport type { Nullable } from \"../types\";\r\n\r\nimport { passPixelShader } from \"../Shaders/pass.fragment\";\r\nimport { Scalar } from \"../Maths/math.scalar\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\ntype DumpToolsEngine = {\r\n canvas: HTMLCanvasElement | OffscreenCanvas;\r\n engine: ThinEngine;\r\n renderer: EffectRenderer;\r\n wrapper: EffectWrapper;\r\n};\r\n\r\n/**\r\n * Class containing a set of static utilities functions to dump data from a canvas\r\n */\r\nexport class DumpTools {\r\n private static _DumpToolsEngine: Nullable<DumpToolsEngine>;\r\n\r\n private static _CreateDumpRenderer(): DumpToolsEngine {\r\n if (!DumpTools._DumpToolsEngine) {\r\n let canvas: HTMLCanvasElement | OffscreenCanvas;\r\n let engine: Nullable<ThinEngine> = null;\r\n const options = {\r\n preserveDrawingBuffer: true,\r\n depth: false,\r\n stencil: false,\r\n alpha: true,\r\n premultipliedAlpha: false,\r\n antialias: false,\r\n failIfMajorPerformanceCaveat: false,\r\n };\r\n try {\r\n canvas = new OffscreenCanvas(100, 100); // will be resized later\r\n engine = new ThinEngine(canvas, false, options);\r\n } catch (e) {\r\n // The browser either does not support OffscreenCanvas or WebGL context in OffscreenCanvas, fallback on a regular canvas\r\n canvas = document.createElement(\"canvas\");\r\n engine = new ThinEngine(canvas, false, options);\r\n }\r\n // remove this engine from the list of instances to avoid using it for other purposes\r\n EngineStore.Instances.pop();\r\n // However, make sure to dispose it when no other engines are left\r\n EngineStore.OnEnginesDisposedObservable.add((e) => {\r\n // guaranteed to run when no other instances are left\r\n // only dispose if it's not the current engine\r\n if (engine && e !== engine && !engine.isDisposed && EngineStore.Instances.length === 0) {\r\n // Dump the engine and the associated resources\r\n DumpTools.Dispose();\r\n }\r\n });\r\n engine.getCaps().parallelShaderCompile = undefined;\r\n const renderer = new EffectRenderer(engine);\r\n const wrapper = new EffectWrapper({\r\n engine,\r\n name: passPixelShader.name,\r\n fragmentShader: passPixelShader.shader,\r\n samplerNames: [\"textureSampler\"],\r\n });\r\n DumpTools._DumpToolsEngine = {\r\n canvas,\r\n engine,\r\n renderer,\r\n wrapper,\r\n };\r\n }\r\n return DumpTools._DumpToolsEngine;\r\n }\r\n\r\n /**\r\n * Dumps the current bound framebuffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param engine defines the hosting engine\r\n * @param successCallback defines the callback triggered once the data are available\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns a void promise\r\n */\r\n public static async DumpFramebuffer(\r\n width: number,\r\n height: number,\r\n engine: AbstractEngine,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n quality?: number\r\n ) {\r\n // Read the contents of the framebuffer\r\n const bufferView = await engine.readPixels(0, 0, width, height);\r\n\r\n const data = new Uint8Array(bufferView.buffer);\r\n\r\n DumpTools.DumpData(width, height, data, successCallback as (data: string | ArrayBuffer) => void, mimeType, fileName, true, undefined, quality);\r\n }\r\n\r\n /**\r\n * Dumps an array buffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param data the data array\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param invertY true to invert the picture in the Y dimension\r\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns a promise that resolve to the final data\r\n */\r\n public static DumpDataAsync(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n invertY = false,\r\n toArrayBuffer = false,\r\n quality?: number\r\n ): Promise<string | ArrayBuffer> {\r\n return new Promise((resolve) => {\r\n DumpTools.DumpData(width, height, data, (result) => resolve(result), mimeType, fileName, invertY, toArrayBuffer, quality);\r\n });\r\n }\r\n\r\n /**\r\n * Dumps an array buffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param data the data array\r\n * @param successCallback defines the callback triggered once the data are available\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param invertY true to invert the picture in the Y dimension\r\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n public static DumpData(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n successCallback?: (data: string | ArrayBuffer) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n invertY = false,\r\n toArrayBuffer = false,\r\n quality?: number\r\n ) {\r\n const renderer = DumpTools._CreateDumpRenderer();\r\n renderer.engine.setSize(width, height, true);\r\n\r\n // Convert if data are float32\r\n if (data instanceof Float32Array) {\r\n const data2 = new Uint8Array(data.length);\r\n let n = data.length;\r\n while (n--) {\r\n const v = data[n];\r\n data2[n] = Math.round(Scalar.Clamp(v) * 255);\r\n }\r\n data = data2;\r\n }\r\n\r\n // Create the image\r\n const texture = renderer.engine.createRawTexture(data, width, height, Constants.TEXTUREFORMAT_RGBA, false, !invertY, Constants.TEXTURE_NEAREST_NEAREST);\r\n\r\n renderer.renderer.setViewport();\r\n renderer.renderer.applyEffectWrapper(renderer.wrapper);\r\n renderer.wrapper.effect._bindTexture(\"textureSampler\", texture);\r\n renderer.renderer.draw();\r\n\r\n if (toArrayBuffer) {\r\n Tools.ToBlob(\r\n renderer.canvas,\r\n (blob) => {\r\n const fileReader = new FileReader();\r\n fileReader.onload = (event: any) => {\r\n const arrayBuffer = event.target!.result as ArrayBuffer;\r\n if (successCallback) {\r\n successCallback(arrayBuffer);\r\n }\r\n };\r\n fileReader.readAsArrayBuffer(blob!);\r\n },\r\n mimeType,\r\n quality\r\n );\r\n } else {\r\n Tools.EncodeScreenshotCanvasData(renderer.canvas, successCallback, mimeType, fileName, quality);\r\n }\r\n\r\n texture.dispose();\r\n }\r\n\r\n /**\r\n * Dispose the dump tools associated resources\r\n */\r\n public static Dispose() {\r\n if (DumpTools._DumpToolsEngine) {\r\n DumpTools._DumpToolsEngine.wrapper.dispose();\r\n DumpTools._DumpToolsEngine.renderer.dispose();\r\n DumpTools._DumpToolsEngine.engine.dispose();\r\n }\r\n DumpTools._DumpToolsEngine = null;\r\n }\r\n}\r\n\r\n/**\r\n * This will be executed automatically for UMD and es5.\r\n * If esm dev wants the side effects to execute they will have to run it manually\r\n * Once we build native modules those need to be exported.\r\n * @internal\r\n */\r\nconst initSideEffects = () => {\r\n // References the dependencies.\r\n Tools.DumpData = DumpTools.DumpData;\r\n Tools.DumpDataAsync = DumpTools.DumpDataAsync;\r\n Tools.DumpFramebuffer = DumpTools.DumpFramebuffer;\r\n};\r\n\r\ninitSideEffects();\r\n"]}
|
|
1
|
+
{"version":3,"file":"dumpTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/dumpTools.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { _WarnImport } from \"./devTools\";\r\n\r\nimport { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EffectRenderer, EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { Tools } from \"./tools\";\r\nimport type { Nullable } from \"../types\";\r\n\r\nimport { passPixelShader } from \"../Shaders/pass.fragment\";\r\nimport { Scalar } from \"../Maths/math.scalar\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\ntype DumpToolsEngine = {\r\n canvas: HTMLCanvasElement | OffscreenCanvas;\r\n engine: ThinEngine;\r\n renderer: EffectRenderer;\r\n wrapper: EffectWrapper;\r\n};\r\n\r\nlet _dumpToolsEngine: Nullable<DumpToolsEngine>;\r\n\r\nfunction _CreateDumpRenderer(): DumpToolsEngine {\r\n if (!_dumpToolsEngine) {\r\n let canvas: HTMLCanvasElement | OffscreenCanvas;\r\n let engine: Nullable<ThinEngine> = null;\r\n const options = {\r\n preserveDrawingBuffer: true,\r\n depth: false,\r\n stencil: false,\r\n alpha: true,\r\n premultipliedAlpha: false,\r\n antialias: false,\r\n failIfMajorPerformanceCaveat: false,\r\n };\r\n try {\r\n canvas = new OffscreenCanvas(100, 100); // will be resized later\r\n engine = new ThinEngine(canvas, false, options);\r\n } catch (e) {\r\n // The browser either does not support OffscreenCanvas or WebGL context in OffscreenCanvas, fallback on a regular canvas\r\n canvas = document.createElement(\"canvas\");\r\n engine = new ThinEngine(canvas, false, options);\r\n }\r\n // remove this engine from the list of instances to avoid using it for other purposes\r\n EngineStore.Instances.pop();\r\n // However, make sure to dispose it when no other engines are left\r\n EngineStore.OnEnginesDisposedObservable.add((e) => {\r\n // guaranteed to run when no other instances are left\r\n // only dispose if it's not the current engine\r\n if (engine && e !== engine && !engine.isDisposed && EngineStore.Instances.length === 0) {\r\n // Dump the engine and the associated resources\r\n Dispose();\r\n }\r\n });\r\n engine.getCaps().parallelShaderCompile = undefined;\r\n const renderer = new EffectRenderer(engine);\r\n const wrapper = new EffectWrapper({\r\n engine,\r\n name: passPixelShader.name,\r\n fragmentShader: passPixelShader.shader,\r\n samplerNames: [\"textureSampler\"],\r\n });\r\n _dumpToolsEngine = {\r\n canvas,\r\n engine,\r\n renderer,\r\n wrapper,\r\n };\r\n }\r\n return _dumpToolsEngine;\r\n}\r\n\r\n/**\r\n * Dumps the current bound framebuffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param engine defines the hosting engine\r\n * @param successCallback defines the callback triggered once the data are available\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns a void promise\r\n */\r\nexport async function DumpFramebuffer(\r\n width: number,\r\n height: number,\r\n engine: AbstractEngine,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n quality?: number\r\n) {\r\n // Read the contents of the framebuffer\r\n const bufferView = await engine.readPixels(0, 0, width, height);\r\n\r\n const data = new Uint8Array(bufferView.buffer);\r\n\r\n DumpData(width, height, data, successCallback as (data: string | ArrayBuffer) => void, mimeType, fileName, true, undefined, quality);\r\n}\r\n\r\n/**\r\n * Dumps an array buffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param data the data array\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param invertY true to invert the picture in the Y dimension\r\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns a promise that resolve to the final data\r\n */\r\nexport function DumpDataAsync(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n invertY = false,\r\n toArrayBuffer = false,\r\n quality?: number\r\n): Promise<string | ArrayBuffer> {\r\n return new Promise((resolve) => {\r\n DumpData(width, height, data, (result) => resolve(result), mimeType, fileName, invertY, toArrayBuffer, quality);\r\n });\r\n}\r\n\r\n/**\r\n * Dumps an array buffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param data the data array\r\n * @param successCallback defines the callback triggered once the data are available\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param invertY true to invert the picture in the Y dimension\r\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\nexport function DumpData(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n successCallback?: (data: string | ArrayBuffer) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n invertY = false,\r\n toArrayBuffer = false,\r\n quality?: number\r\n) {\r\n const renderer = _CreateDumpRenderer();\r\n renderer.engine.setSize(width, height, true);\r\n\r\n // Convert if data are float32\r\n if (data instanceof Float32Array) {\r\n const data2 = new Uint8Array(data.length);\r\n let n = data.length;\r\n while (n--) {\r\n const v = data[n];\r\n data2[n] = Math.round(Scalar.Clamp(v) * 255);\r\n }\r\n data = data2;\r\n }\r\n\r\n // Create the image\r\n const texture = renderer.engine.createRawTexture(data, width, height, Constants.TEXTUREFORMAT_RGBA, false, !invertY, Constants.TEXTURE_NEAREST_NEAREST);\r\n\r\n renderer.renderer.setViewport();\r\n renderer.renderer.applyEffectWrapper(renderer.wrapper);\r\n renderer.wrapper.effect._bindTexture(\"textureSampler\", texture);\r\n renderer.renderer.draw();\r\n\r\n if (toArrayBuffer) {\r\n Tools.ToBlob(\r\n renderer.canvas,\r\n (blob) => {\r\n const fileReader = new FileReader();\r\n fileReader.onload = (event: any) => {\r\n const arrayBuffer = event.target!.result as ArrayBuffer;\r\n if (successCallback) {\r\n successCallback(arrayBuffer);\r\n }\r\n };\r\n fileReader.readAsArrayBuffer(blob!);\r\n },\r\n mimeType,\r\n quality\r\n );\r\n } else {\r\n Tools.EncodeScreenshotCanvasData(renderer.canvas, successCallback, mimeType, fileName, quality);\r\n }\r\n\r\n texture.dispose();\r\n}\r\n\r\n/**\r\n * Dispose the dump tools associated resources\r\n */\r\nexport function Dispose() {\r\n if (_dumpToolsEngine) {\r\n _dumpToolsEngine.wrapper.dispose();\r\n _dumpToolsEngine.renderer.dispose();\r\n _dumpToolsEngine.engine.dispose();\r\n }\r\n _dumpToolsEngine = null;\r\n}\r\n\r\n/**\r\n * Object containing a set of static utilities functions to dump data from a canvas\r\n * @deprecated use functions\r\n */\r\nexport const DumpTools = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n DumpData,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n DumpDataAsync,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n DumpFramebuffer,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n Dispose,\r\n};\r\n\r\n/**\r\n * This will be executed automatically for UMD and es5.\r\n * If esm dev wants the side effects to execute they will have to run it manually\r\n * Once we build native modules those need to be exported.\r\n * @internal\r\n */\r\nconst initSideEffects = () => {\r\n // References the dependencies.\r\n Tools.DumpData = DumpData;\r\n Tools.DumpDataAsync = DumpDataAsync;\r\n Tools.DumpFramebuffer = DumpFramebuffer;\r\n};\r\n\r\ninitSideEffects();\r\n"]}
|