@babylonjs/core 8.22.3 → 8.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Misc/dumpTools.js +125 -123
- package/Misc/dumpTools.js.map +1 -1
- package/Particles/Node/Blocks/Update/alignAngleBlock.d.ts +2 -0
- package/Particles/Node/Blocks/Update/alignAngleBlock.js +11 -0
- package/Particles/Node/Blocks/Update/alignAngleBlock.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.d.ts +19 -0
- package/Particles/Node/nodeParticleSystemSet.js +46 -0
- package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
- package/package.json +1 -1
package/Misc/dumpTools.js
CHANGED
|
@@ -3,79 +3,63 @@ import { EffectRenderer, EffectWrapper } from "../Materials/effectRenderer.js";
|
|
|
3
3
|
import { Tools } from "./tools.js";
|
|
4
4
|
import { Clamp } from "../Maths/math.scalar.functions.js";
|
|
5
5
|
import { EngineStore } from "../Engines/engineStore.js";
|
|
6
|
-
|
|
7
|
-
let
|
|
8
|
-
async function
|
|
9
|
-
if
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
import("../Engines/thinEngine.js")
|
|
23
|
-
// eslint-disable-next-line github/no-then
|
|
24
|
-
.then(({ ThinEngine: thinEngineClass }) => {
|
|
25
|
-
const engineInstanceCount = EngineStore.Instances.length;
|
|
26
|
-
try {
|
|
27
|
-
canvas = new OffscreenCanvas(100, 100); // will be resized later
|
|
28
|
-
engine = new thinEngineClass(canvas, false, options);
|
|
29
|
-
}
|
|
30
|
-
catch (e) {
|
|
31
|
-
if (engineInstanceCount < EngineStore.Instances.length) {
|
|
32
|
-
// The engine was created by another instance, let's use it
|
|
33
|
-
EngineStore.Instances.pop()?.dispose();
|
|
34
|
-
}
|
|
35
|
-
// The browser either does not support OffscreenCanvas or WebGL context in OffscreenCanvas, fallback on a regular canvas
|
|
36
|
-
canvas = document.createElement("canvas");
|
|
37
|
-
engine = new thinEngineClass(canvas, false, options);
|
|
38
|
-
}
|
|
39
|
-
// remove this engine from the list of instances to avoid using it for other purposes
|
|
40
|
-
EngineStore.Instances.pop();
|
|
41
|
-
// However, make sure to dispose it when no other engines are left
|
|
42
|
-
EngineStore.OnEnginesDisposedObservable.add((e) => {
|
|
43
|
-
// guaranteed to run when no other instances are left
|
|
44
|
-
// only dispose if it's not the current engine
|
|
45
|
-
if (engine && e !== engine && !engine.isDisposed && EngineStore.Instances.length === 0) {
|
|
46
|
-
// Dump the engine and the associated resources
|
|
47
|
-
Dispose();
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
engine.getCaps().parallelShaderCompile = undefined;
|
|
51
|
-
const renderer = new EffectRenderer(engine);
|
|
52
|
-
// eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then
|
|
53
|
-
import("../Shaders/pass.fragment.js").then(({ passPixelShader }) => {
|
|
54
|
-
if (!engine) {
|
|
55
|
-
// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
|
|
56
|
-
reject("Engine is not defined");
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
const wrapper = new EffectWrapper({
|
|
60
|
-
engine,
|
|
61
|
-
name: passPixelShader.name,
|
|
62
|
-
fragmentShader: passPixelShader.shader,
|
|
63
|
-
samplerNames: ["textureSampler"],
|
|
64
|
-
});
|
|
65
|
-
DumpToolsEngine = {
|
|
66
|
-
canvas,
|
|
67
|
-
engine,
|
|
68
|
-
renderer,
|
|
69
|
-
wrapper,
|
|
70
|
-
};
|
|
71
|
-
resolve(DumpToolsEngine);
|
|
72
|
-
});
|
|
73
|
-
})
|
|
74
|
-
// eslint-disable-next-line github/no-then
|
|
75
|
-
.catch(reject);
|
|
76
|
-
});
|
|
6
|
+
import { Logger } from "./logger.js";
|
|
7
|
+
let ResourcesPromise = null;
|
|
8
|
+
async function _CreateDumpResourcesAsync() {
|
|
9
|
+
// Create a compatible canvas. Prefer an HTMLCanvasElement if possible to avoid alpha issues with OffscreenCanvas + WebGL in many browsers.
|
|
10
|
+
const canvas = (EngineStore.LastCreatedEngine?.createCanvas(100, 100) ?? new OffscreenCanvas(100, 100)); // will be resized later
|
|
11
|
+
if (canvas instanceof OffscreenCanvas) {
|
|
12
|
+
Logger.Warn("DumpData: OffscreenCanvas will be used for dumping data. This may result in lossy alpha values.");
|
|
77
13
|
}
|
|
78
|
-
|
|
14
|
+
// If WebGL via ThinEngine is not available (e.g. Native), use the BitmapRenderer.
|
|
15
|
+
// If https://github.com/whatwg/html/issues/10142 is resolved, we can migrate to just BitmapRenderer and avoid an engine dependency altogether.
|
|
16
|
+
const { ThinEngine: thinEngineClass } = await import("../Engines/thinEngine.js");
|
|
17
|
+
if (!thinEngineClass.IsSupported) {
|
|
18
|
+
if (!canvas.getContext("bitmaprenderer")) {
|
|
19
|
+
throw new Error("DumpData: No WebGL or bitmap rendering context available. Cannot dump data.");
|
|
20
|
+
}
|
|
21
|
+
return { canvas };
|
|
22
|
+
}
|
|
23
|
+
const options = {
|
|
24
|
+
preserveDrawingBuffer: true,
|
|
25
|
+
depth: false,
|
|
26
|
+
stencil: false,
|
|
27
|
+
alpha: true,
|
|
28
|
+
premultipliedAlpha: false,
|
|
29
|
+
antialias: false,
|
|
30
|
+
failIfMajorPerformanceCaveat: false,
|
|
31
|
+
};
|
|
32
|
+
const engine = new thinEngineClass(canvas, false, options);
|
|
33
|
+
// remove this engine from the list of instances to avoid using it for other purposes
|
|
34
|
+
EngineStore.Instances.pop();
|
|
35
|
+
// However, make sure to dispose it when no other engines are left
|
|
36
|
+
EngineStore.OnEnginesDisposedObservable.add((e) => {
|
|
37
|
+
// guaranteed to run when no other instances are left
|
|
38
|
+
// only dispose if it's not the current engine
|
|
39
|
+
if (engine && e !== engine && !engine.isDisposed && EngineStore.Instances.length === 0) {
|
|
40
|
+
// Dump the engine and the associated resources
|
|
41
|
+
Dispose();
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
engine.getCaps().parallelShaderCompile = undefined;
|
|
45
|
+
const renderer = new EffectRenderer(engine);
|
|
46
|
+
const { passPixelShader } = await import("../Shaders/pass.fragment.js");
|
|
47
|
+
const wrapper = new EffectWrapper({
|
|
48
|
+
engine,
|
|
49
|
+
name: passPixelShader.name,
|
|
50
|
+
fragmentShader: passPixelShader.shader,
|
|
51
|
+
samplerNames: ["textureSampler"],
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
canvas: canvas,
|
|
55
|
+
dumpEngine: { engine, renderer, wrapper },
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async function _GetDumpResourcesAsync() {
|
|
59
|
+
if (!ResourcesPromise) {
|
|
60
|
+
ResourcesPromise = _CreateDumpResourcesAsync();
|
|
61
|
+
}
|
|
62
|
+
return await ResourcesPromise;
|
|
79
63
|
}
|
|
80
64
|
/**
|
|
81
65
|
* Dumps the current bound framebuffer
|
|
@@ -109,8 +93,54 @@ export async function DumpFramebuffer(width, height, engine, successCallback, mi
|
|
|
109
93
|
* @returns a promise that resolve to the final data
|
|
110
94
|
*/
|
|
111
95
|
export async function DumpDataAsync(width, height, data, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) {
|
|
112
|
-
|
|
113
|
-
|
|
96
|
+
// Convert if data are float32
|
|
97
|
+
if (data instanceof Float32Array) {
|
|
98
|
+
const data2 = new Uint8Array(data.length);
|
|
99
|
+
let n = data.length;
|
|
100
|
+
while (n--) {
|
|
101
|
+
const v = data[n];
|
|
102
|
+
data2[n] = Math.round(Clamp(v) * 255);
|
|
103
|
+
}
|
|
104
|
+
data = data2;
|
|
105
|
+
}
|
|
106
|
+
const resources = await _GetDumpResourcesAsync();
|
|
107
|
+
// Keep the async render + read from the shared canvas atomic
|
|
108
|
+
// eslint-disable-next-line no-async-promise-executor
|
|
109
|
+
return await new Promise(async (resolve) => {
|
|
110
|
+
if (resources.dumpEngine) {
|
|
111
|
+
const dumpEngine = resources.dumpEngine;
|
|
112
|
+
dumpEngine.engine.setSize(width, height, true);
|
|
113
|
+
// Create the image
|
|
114
|
+
const texture = dumpEngine.engine.createRawTexture(data, width, height, 5, false, !invertY, 1);
|
|
115
|
+
dumpEngine.renderer.setViewport();
|
|
116
|
+
dumpEngine.renderer.applyEffectWrapper(dumpEngine.wrapper);
|
|
117
|
+
dumpEngine.wrapper.effect._bindTexture("textureSampler", texture);
|
|
118
|
+
dumpEngine.renderer.draw();
|
|
119
|
+
texture.dispose();
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const ctx = resources.canvas.getContext("bitmaprenderer");
|
|
123
|
+
resources.canvas.width = width;
|
|
124
|
+
resources.canvas.height = height;
|
|
125
|
+
const imageData = new ImageData(width, height); // ImageData(data, sw, sh) ctor not yet widely implemented
|
|
126
|
+
imageData.data.set(data);
|
|
127
|
+
const imageBitmap = await createImageBitmap(imageData, { premultiplyAlpha: "none", imageOrientation: invertY ? "flipY" : "from-image" });
|
|
128
|
+
ctx.transferFromImageBitmap(imageBitmap);
|
|
129
|
+
}
|
|
130
|
+
// Download the result
|
|
131
|
+
if (toArrayBuffer) {
|
|
132
|
+
Tools.ToBlob(resources.canvas, (blob) => {
|
|
133
|
+
const fileReader = new FileReader();
|
|
134
|
+
fileReader.onload = (event) => {
|
|
135
|
+
const arrayBuffer = event.target.result;
|
|
136
|
+
resolve(arrayBuffer);
|
|
137
|
+
};
|
|
138
|
+
fileReader.readAsArrayBuffer(blob);
|
|
139
|
+
}, mimeType, quality);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
Tools.EncodeScreenshotCanvasData(resources.canvas, resolve, mimeType, fileName, quality);
|
|
143
|
+
}
|
|
114
144
|
});
|
|
115
145
|
}
|
|
116
146
|
/**
|
|
@@ -126,63 +156,35 @@ export async function DumpDataAsync(width, height, data, mimeType = "image/png",
|
|
|
126
156
|
* @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.
|
|
127
157
|
*/
|
|
128
158
|
export function DumpData(width, height, data, successCallback, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) {
|
|
129
|
-
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (
|
|
134
|
-
|
|
135
|
-
let n = data.length;
|
|
136
|
-
while (n--) {
|
|
137
|
-
const v = data[n];
|
|
138
|
-
data2[n] = Math.round(Clamp(v) * 255);
|
|
139
|
-
}
|
|
140
|
-
data = data2;
|
|
159
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
160
|
+
DumpDataAsync(width, height, data, mimeType, fileName, invertY, toArrayBuffer, quality)
|
|
161
|
+
// eslint-disable-next-line github/no-then
|
|
162
|
+
.then((result) => {
|
|
163
|
+
if (successCallback) {
|
|
164
|
+
successCallback(result);
|
|
141
165
|
}
|
|
142
|
-
// Create the image
|
|
143
|
-
const texture = renderer.engine.createRawTexture(data, width, height, 5, false, !invertY, 1);
|
|
144
|
-
renderer.renderer.setViewport();
|
|
145
|
-
renderer.renderer.applyEffectWrapper(renderer.wrapper);
|
|
146
|
-
renderer.wrapper.effect._bindTexture("textureSampler", texture);
|
|
147
|
-
renderer.renderer.draw();
|
|
148
|
-
if (toArrayBuffer) {
|
|
149
|
-
Tools.ToBlob(renderer.canvas, (blob) => {
|
|
150
|
-
const fileReader = new FileReader();
|
|
151
|
-
fileReader.onload = (event) => {
|
|
152
|
-
const arrayBuffer = event.target.result;
|
|
153
|
-
if (successCallback) {
|
|
154
|
-
successCallback(arrayBuffer);
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
fileReader.readAsArrayBuffer(blob);
|
|
158
|
-
}, mimeType, quality);
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
Tools.EncodeScreenshotCanvasData(renderer.canvas, successCallback, mimeType, fileName, quality);
|
|
162
|
-
}
|
|
163
|
-
texture.dispose();
|
|
164
166
|
});
|
|
165
167
|
}
|
|
166
168
|
/**
|
|
167
169
|
* Dispose the dump tools associated resources
|
|
168
170
|
*/
|
|
169
171
|
export function Dispose() {
|
|
170
|
-
if (
|
|
171
|
-
|
|
172
|
-
DumpToolsEngine.renderer.dispose();
|
|
173
|
-
DumpToolsEngine.engine.dispose();
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
// in cases where the engine is not yet created, we need to wait for it to dispose it
|
|
177
|
-
// eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then
|
|
178
|
-
EnginePromise?.then((dumpToolsEngine) => {
|
|
179
|
-
dumpToolsEngine.wrapper.dispose();
|
|
180
|
-
dumpToolsEngine.renderer.dispose();
|
|
181
|
-
dumpToolsEngine.engine.dispose();
|
|
182
|
-
});
|
|
172
|
+
if (!ResourcesPromise) {
|
|
173
|
+
return;
|
|
183
174
|
}
|
|
184
|
-
|
|
185
|
-
|
|
175
|
+
// in cases where the engine is not yet created, we need to wait for it to dispose it
|
|
176
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then
|
|
177
|
+
ResourcesPromise?.then((resources) => {
|
|
178
|
+
if (resources.canvas instanceof HTMLCanvasElement) {
|
|
179
|
+
resources.canvas.remove();
|
|
180
|
+
}
|
|
181
|
+
if (resources.dumpEngine) {
|
|
182
|
+
resources.dumpEngine.engine.dispose();
|
|
183
|
+
resources.dumpEngine.renderer.dispose();
|
|
184
|
+
resources.dumpEngine.wrapper.dispose();
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
ResourcesPromise = null;
|
|
186
188
|
}
|
|
187
189
|
/**
|
|
188
190
|
* Object containing a set of static utilities functions to dump data from a canvas
|
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 type { 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\nimport { Clamp } from \"../Maths/math.scalar.functions\";\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\nlet EnginePromise: Promise<DumpToolsEngine> | null = null;\r\n\r\nasync function _CreateDumpRendererAsync(): Promise<DumpToolsEngine> {\r\n if (!EnginePromise) {\r\n EnginePromise = new Promise((resolve, reject) => {\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 import(\"../Engines/thinEngine\")\r\n // eslint-disable-next-line github/no-then\r\n .then(({ ThinEngine: thinEngineClass }) => {\r\n const engineInstanceCount = EngineStore.Instances.length;\r\n try {\r\n canvas = new OffscreenCanvas(100, 100); // will be resized later\r\n engine = new thinEngineClass(canvas, false, options);\r\n } catch (e) {\r\n if (engineInstanceCount < EngineStore.Instances.length) {\r\n // The engine was created by another instance, let's use it\r\n EngineStore.Instances.pop()?.dispose();\r\n }\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 thinEngineClass(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 // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n import(\"../Shaders/pass.fragment\").then(({ passPixelShader }) => {\r\n if (!engine) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(\"Engine is not defined\");\r\n return;\r\n }\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 resolve(DumpToolsEngine);\r\n });\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch(reject);\r\n });\r\n }\r\n return await EnginePromise;\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// Should have \"Async\" in the name but this is a public API and we can't break it now\r\n// eslint-disable-next-line no-restricted-syntax\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\nexport async function DumpDataAsync(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n mimeType: string | undefined,\r\n fileName: string | undefined,\r\n invertY: boolean | undefined,\r\n toArrayBuffer: true,\r\n quality?: number\r\n): Promise<ArrayBuffer>;\r\nexport async function DumpDataAsync(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n mimeType?: string,\r\n fileName?: string,\r\n invertY?: boolean,\r\n toArrayBuffer?: boolean,\r\n quality?: number\r\n): Promise<string>;\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 async 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 await 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): void {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n _CreateDumpRendererAsync().then((renderer) => {\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(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/**\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 } else {\r\n // in cases where the engine is not yet created, we need to wait for it to dispose it\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n EnginePromise?.then((dumpToolsEngine) => {\r\n dumpToolsEngine.wrapper.dispose();\r\n dumpToolsEngine.renderer.dispose();\r\n dumpToolsEngine.engine.dispose();\r\n });\r\n }\r\n EnginePromise = null;\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"]}
|
|
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 type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EffectRenderer, EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { Tools } from \"./tools\";\r\nimport { Clamp } from \"../Maths/math.scalar.functions\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Logger } from \"./logger\";\r\n\r\ntype DumpResources = {\r\n canvas: HTMLCanvasElement | OffscreenCanvas;\r\n dumpEngine?: {\r\n engine: ThinEngine;\r\n renderer: EffectRenderer;\r\n wrapper: EffectWrapper;\r\n };\r\n};\r\n\r\nlet ResourcesPromise: Promise<DumpResources> | null = null;\r\n\r\nasync function _CreateDumpResourcesAsync(): Promise<DumpResources> {\r\n // Create a compatible canvas. Prefer an HTMLCanvasElement if possible to avoid alpha issues with OffscreenCanvas + WebGL in many browsers.\r\n const canvas = (EngineStore.LastCreatedEngine?.createCanvas(100, 100) ?? new OffscreenCanvas(100, 100)) as HTMLCanvasElement | OffscreenCanvas; // will be resized later\r\n if (canvas instanceof OffscreenCanvas) {\r\n Logger.Warn(\"DumpData: OffscreenCanvas will be used for dumping data. This may result in lossy alpha values.\");\r\n }\r\n\r\n // If WebGL via ThinEngine is not available (e.g. Native), use the BitmapRenderer.\r\n // If https://github.com/whatwg/html/issues/10142 is resolved, we can migrate to just BitmapRenderer and avoid an engine dependency altogether.\r\n const { ThinEngine: thinEngineClass } = await import(\"../Engines/thinEngine\");\r\n if (!thinEngineClass.IsSupported) {\r\n if (!canvas.getContext(\"bitmaprenderer\")) {\r\n throw new Error(\"DumpData: No WebGL or bitmap rendering context available. Cannot dump data.\");\r\n }\r\n return { canvas };\r\n }\r\n\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 const engine = new thinEngineClass(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\r\n engine.getCaps().parallelShaderCompile = undefined;\r\n\r\n const renderer = new EffectRenderer(engine);\r\n const { passPixelShader } = await import(\"../Shaders/pass.fragment\");\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\r\n return {\r\n canvas: canvas,\r\n dumpEngine: { engine, renderer, wrapper },\r\n };\r\n}\r\n\r\nasync function _GetDumpResourcesAsync() {\r\n if (!ResourcesPromise) {\r\n ResourcesPromise = _CreateDumpResourcesAsync();\r\n }\r\n return await ResourcesPromise;\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// Should have \"Async\" in the name but this is a public API and we can't break it now\r\n// eslint-disable-next-line no-restricted-syntax\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\nexport async function DumpDataAsync(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n mimeType: string | undefined,\r\n fileName: string | undefined,\r\n invertY: boolean | undefined,\r\n toArrayBuffer: true,\r\n quality?: number\r\n): Promise<ArrayBuffer>;\r\nexport async function DumpDataAsync(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n mimeType?: string,\r\n fileName?: string,\r\n invertY?: boolean,\r\n toArrayBuffer?: boolean,\r\n quality?: number\r\n): Promise<string>;\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 async 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 // 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(Clamp(v) * 255);\r\n }\r\n data = data2;\r\n }\r\n\r\n const resources = await _GetDumpResourcesAsync();\r\n\r\n // Keep the async render + read from the shared canvas atomic\r\n // eslint-disable-next-line no-async-promise-executor\r\n return await new Promise<string | ArrayBuffer>(async (resolve) => {\r\n if (resources.dumpEngine) {\r\n const dumpEngine = resources.dumpEngine;\r\n dumpEngine.engine.setSize(width, height, true);\r\n\r\n // Create the image\r\n const texture = dumpEngine.engine.createRawTexture(data, width, height, Constants.TEXTUREFORMAT_RGBA, false, !invertY, Constants.TEXTURE_NEAREST_NEAREST);\r\n\r\n dumpEngine.renderer.setViewport();\r\n dumpEngine.renderer.applyEffectWrapper(dumpEngine.wrapper);\r\n dumpEngine.wrapper.effect._bindTexture(\"textureSampler\", texture);\r\n dumpEngine.renderer.draw();\r\n\r\n texture.dispose();\r\n } else {\r\n const ctx = resources.canvas.getContext(\"bitmaprenderer\") as ImageBitmapRenderingContext;\r\n resources.canvas.width = width;\r\n resources.canvas.height = height;\r\n\r\n const imageData = new ImageData(width, height); // ImageData(data, sw, sh) ctor not yet widely implemented\r\n imageData.data.set(data as Uint8ClampedArray);\r\n const imageBitmap = await createImageBitmap(imageData, { premultiplyAlpha: \"none\", imageOrientation: invertY ? \"flipY\" : \"from-image\" });\r\n\r\n ctx.transferFromImageBitmap(imageBitmap);\r\n }\r\n\r\n // Download the result\r\n if (toArrayBuffer) {\r\n Tools.ToBlob(\r\n resources.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 resolve(arrayBuffer);\r\n };\r\n fileReader.readAsArrayBuffer(blob!);\r\n },\r\n mimeType,\r\n quality\r\n );\r\n } else {\r\n Tools.EncodeScreenshotCanvasData(resources.canvas, resolve, mimeType, fileName, quality);\r\n }\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): void {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n DumpDataAsync(width, height, data, mimeType, fileName, invertY, toArrayBuffer, quality)\r\n // eslint-disable-next-line github/no-then\r\n .then((result) => {\r\n if (successCallback) {\r\n successCallback(result);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Dispose the dump tools associated resources\r\n */\r\nexport function Dispose() {\r\n if (!ResourcesPromise) {\r\n return;\r\n }\r\n\r\n // in cases where the engine is not yet created, we need to wait for it to dispose it\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n ResourcesPromise?.then((resources) => {\r\n if (resources.canvas instanceof HTMLCanvasElement) {\r\n resources.canvas.remove();\r\n }\r\n if (resources.dumpEngine) {\r\n resources.dumpEngine.engine.dispose();\r\n resources.dumpEngine.renderer.dispose();\r\n resources.dumpEngine.wrapper.dispose();\r\n }\r\n });\r\n\r\n ResourcesPromise = 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"]}
|
|
@@ -76,6 +76,17 @@ export class AlignAngleBlock extends NodeParticleBlock {
|
|
|
76
76
|
system._updateQueueStart = angleProcessing;
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
|
+
serialize() {
|
|
80
|
+
const serializationObject = super.serialize();
|
|
81
|
+
serializationObject.alignment = this.alignment;
|
|
82
|
+
return serializationObject;
|
|
83
|
+
}
|
|
84
|
+
_deserialize(serializationObject) {
|
|
85
|
+
super._deserialize(serializationObject);
|
|
86
|
+
if (serializationObject.alignment !== undefined) {
|
|
87
|
+
this.alignment = serializationObject.alignment;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
79
90
|
}
|
|
80
91
|
__decorate([
|
|
81
92
|
editableInPropertyPage("alignment", 1 /* PropertyTypeForEdition.Float */, "ADVANCED", { embedded: true, notifiers: { rebuild: true }, min: -0, max: 2 * Math.PI })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alignAngleBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Particles/Node/Blocks/Update/alignAngleBlock.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,qCAAqC,EAAE,MAAM,mDAAmD,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAK5D,OAAO,EAAE,gBAAgB,EAAE,yCAA4C;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAA0B,MAAM,sCAAsC,CAAC;AAEtG;;;;;GAKG;AACH,MAAM,OAAO,eAAgB,SAAQ,iBAAiB;IAOlD;;;OAGG;IACH,YAAmB,IAAY;QAC3B,KAAK,CAAC,IAAI,CAAC,CAAC;QAXhB;;WAEG;QAEI,cAAS,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,oDAAoD;QAShF,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,qCAAqC,CAAC,QAAQ,CAAC,CAAC;QAC/E,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,qCAAqC,CAAC,QAAQ,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACa,YAAY;QACxB,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACa,MAAM,CAAC,KAA6B;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAuB,CAAC;QAE5E,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC;QAElC,MAAM,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC;QAElC,MAAM,YAAY,GAAG,CAAC,QAAkB,EAAE,EAAE;YACxC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;YACrC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACP,OAAO;YACX,CAAC;YACD,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC;YAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;YAEjC,MAAM,SAAS,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAEvE,uDAAuD;YACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;YACpE,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,UAAU;QACtC,CAAC,CAAC;QAEF,MAAM,eAAe,GAAG;YACpB,OAAO,EAAE,YAAY;YACrB,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,IAAI;SACjB,CAAC;QAEF,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC3B,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,iBAAiB,GAAG,eAAe,CAAC;QAC/C,CAAC;IACL,CAAC;CACJ;
|
|
1
|
+
{"version":3,"file":"alignAngleBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Particles/Node/Blocks/Update/alignAngleBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { NodeParticleBlockConnectionPointTypes } from \"../../Enums/nodeParticleBlockConnectionPointTypes\";\r\nimport { NodeParticleBlock } from \"../../nodeParticleBlock\";\r\nimport type { NodeParticleConnectionPoint } from \"../../nodeParticleBlockConnectionPoint\";\r\nimport type { NodeParticleBuildState } from \"../../nodeParticleBuildState\";\r\nimport type { ThinParticleSystem } from \"core/Particles/thinParticleSystem\";\r\nimport type { Particle } from \"core/Particles/particle\";\r\nimport { _ConnectAtTheEnd } from \"core/Particles/Queue/executionQueue\";\r\nimport { Vector3 } from \"../../../../Maths/math.vector\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../../Decorators/nodeDecorator\";\r\n\r\n/**\r\n * Block used to align the angle of a particle to its direction\r\n * We assume the sprite is facing +Y\r\n * NPE: #W5054F\r\n * PG: #H5RP91\r\n */\r\nexport class AlignAngleBlock extends NodeParticleBlock {\r\n /**\r\n * Gets or sets the strenght of the flow map effect\r\n */\r\n @editableInPropertyPage(\"alignment\", PropertyTypeForEdition.Float, \"ADVANCED\", { embedded: true, notifiers: { rebuild: true }, min: -0, max: 2 * Math.PI })\r\n public alignment = Math.PI / 2; // Default to 90 degrees, aligning +Y with direction\r\n\r\n /**\r\n * Create a new AlignAngleBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name);\r\n\r\n this.registerInput(\"particle\", NodeParticleBlockConnectionPointTypes.Particle);\r\n this.registerOutput(\"output\", NodeParticleBlockConnectionPointTypes.Particle);\r\n }\r\n\r\n /**\r\n * Gets the particle component\r\n */\r\n public get particle(): NodeParticleConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeParticleConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"AlignAngleBlock\";\r\n }\r\n\r\n /**\r\n * Builds the block\r\n * @param state defines the current build state\r\n */\r\n public override _build(state: NodeParticleBuildState) {\r\n const system = this.particle.getConnectedValue(state) as ThinParticleSystem;\r\n\r\n this.output._storedValue = system;\r\n\r\n const tempVector3 = new Vector3();\r\n\r\n const processAngle = (particle: Particle) => {\r\n const cam = state.scene.activeCamera;\r\n if (!cam) {\r\n return;\r\n }\r\n const dir = particle.direction;\r\n const view = cam.getViewMatrix();\r\n\r\n const dirInView = Vector3.TransformNormalToRef(dir, view, tempVector3);\r\n\r\n // Angle so sprite’s +Y aligns with projected direction\r\n const angle = Math.atan2(dirInView.y, dirInView.x) + this.alignment;\r\n particle.angle = angle; // radians\r\n };\r\n\r\n const angleProcessing = {\r\n process: processAngle,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n if (system._updateQueueStart) {\r\n _ConnectAtTheEnd(angleProcessing, system._updateQueueStart);\r\n } else {\r\n system._updateQueueStart = angleProcessing;\r\n }\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.alignment = this.alignment;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public override _deserialize(serializationObject: any) {\r\n super._deserialize(serializationObject);\r\n\r\n if (serializationObject.alignment !== undefined) {\r\n this.alignment = serializationObject.alignment;\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.AlignAngleBlock\", AlignAngleBlock);\r\n"]}
|
|
@@ -5,6 +5,7 @@ import type { NodeParticleBlock } from "./nodeParticleBlock.js";
|
|
|
5
5
|
import { Observable } from "../../Misc/observable.js";
|
|
6
6
|
import { ParticleInputBlock } from "./Blocks/particleInputBlock.js";
|
|
7
7
|
import type { Color4 } from "../../Maths/math.color.js";
|
|
8
|
+
import type { Nullable } from "../../types.js";
|
|
8
9
|
/**
|
|
9
10
|
* Interface used to configure the node particle editor
|
|
10
11
|
*/
|
|
@@ -62,6 +63,24 @@ export declare class NodeParticleSystemSet {
|
|
|
62
63
|
* @returns an array of InputBlocks
|
|
63
64
|
*/
|
|
64
65
|
get inputBlocks(): ParticleInputBlock[];
|
|
66
|
+
/**
|
|
67
|
+
* Get a block by its name
|
|
68
|
+
* @param name defines the name of the block to retrieve
|
|
69
|
+
* @returns the required block or null if not found
|
|
70
|
+
*/
|
|
71
|
+
getBlockByName(name: string): NodeParticleBlock | null;
|
|
72
|
+
/**
|
|
73
|
+
* Get a block using a predicate
|
|
74
|
+
* @param predicate defines the predicate used to find the good candidate
|
|
75
|
+
* @returns the required block or null if not found
|
|
76
|
+
*/
|
|
77
|
+
getBlockByPredicate(predicate: (block: NodeParticleBlock) => boolean): NodeParticleBlock | null;
|
|
78
|
+
/**
|
|
79
|
+
* Get an input block using a predicate
|
|
80
|
+
* @param predicate defines the predicate used to find the good candidate
|
|
81
|
+
* @returns the required input block or null if not found
|
|
82
|
+
*/
|
|
83
|
+
getInputBlockByPredicate(predicate: (block: ParticleInputBlock) => boolean): Nullable<ParticleInputBlock>;
|
|
65
84
|
/**
|
|
66
85
|
* Creates a new set
|
|
67
86
|
* @param name defines the name of the set
|
|
@@ -42,6 +42,52 @@ export class NodeParticleSystemSet {
|
|
|
42
42
|
}
|
|
43
43
|
return blocks;
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Get a block by its name
|
|
47
|
+
* @param name defines the name of the block to retrieve
|
|
48
|
+
* @returns the required block or null if not found
|
|
49
|
+
*/
|
|
50
|
+
getBlockByName(name) {
|
|
51
|
+
let result = null;
|
|
52
|
+
for (const block of this.attachedBlocks) {
|
|
53
|
+
if (block.name === name) {
|
|
54
|
+
if (!result) {
|
|
55
|
+
result = block;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
Tools.Warn("More than one block was found with the name `" + name + "`");
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get a block using a predicate
|
|
67
|
+
* @param predicate defines the predicate used to find the good candidate
|
|
68
|
+
* @returns the required block or null if not found
|
|
69
|
+
*/
|
|
70
|
+
getBlockByPredicate(predicate) {
|
|
71
|
+
for (const block of this.attachedBlocks) {
|
|
72
|
+
if (predicate(block)) {
|
|
73
|
+
return block;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get an input block using a predicate
|
|
80
|
+
* @param predicate defines the predicate used to find the good candidate
|
|
81
|
+
* @returns the required input block or null if not found
|
|
82
|
+
*/
|
|
83
|
+
getInputBlockByPredicate(predicate) {
|
|
84
|
+
for (const block of this.attachedBlocks) {
|
|
85
|
+
if (block.isInput && predicate(block)) {
|
|
86
|
+
return block;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
45
91
|
/**
|
|
46
92
|
* Creates a new set
|
|
47
93
|
* @param name defines the name of the set
|