@babylonjs/core 7.49.0 → 7.50.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/Behaviors/Cameras/framingBehavior.js +3 -0
- package/Behaviors/Cameras/framingBehavior.js.map +1 -1
- package/Behaviors/Meshes/baseSixDofDragBehavior.js +10 -9
- package/Behaviors/Meshes/baseSixDofDragBehavior.js.map +1 -1
- package/Buffers/bufferUtils.d.ts +9 -10
- package/Buffers/bufferUtils.js +16 -0
- package/Buffers/bufferUtils.js.map +1 -1
- package/Culling/Helper/transformFeedbackBoundingHelper.js +2 -1
- package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js +23 -22
- package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/utilityLayerRendererBlock.d.ts +43 -0
- package/FrameGraph/Node/Blocks/Rendering/utilityLayerRendererBlock.js +83 -0
- package/FrameGraph/Node/Blocks/Rendering/utilityLayerRendererBlock.js.map +1 -0
- package/FrameGraph/Node/Blocks/index.d.ts +1 -0
- package/FrameGraph/Node/Blocks/index.js +1 -0
- package/FrameGraph/Node/Blocks/index.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/utilityLayerRendererTask.d.ts +35 -0
- package/FrameGraph/Tasks/Rendering/utilityLayerRendererTask.js +40 -0
- package/FrameGraph/Tasks/Rendering/utilityLayerRendererTask.js.map +1 -0
- package/FrameGraph/frameGraph.d.ts +4 -0
- package/FrameGraph/frameGraph.js +6 -0
- package/FrameGraph/frameGraph.js.map +1 -1
- package/FrameGraph/frameGraphRenderContext.d.ts +2 -2
- package/FrameGraph/frameGraphRenderContext.js.map +1 -1
- package/FrameGraph/index.d.ts +1 -0
- package/FrameGraph/index.js +1 -0
- package/FrameGraph/index.js.map +1 -1
- package/Layers/thinEffectLayer.js +3 -1
- package/Layers/thinEffectLayer.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +3 -1
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js +9 -20
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js.map +1 -1
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.js +8 -19
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.d.ts +8 -0
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.js +36 -0
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +6 -3
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.d.ts +8 -0
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +48 -0
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +2 -0
- package/Materials/Node/nodeMaterial.js +14 -0
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +2 -0
- package/Materials/PBR/pbrBaseMaterial.js +2 -0
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/materialHelper.functions.d.ts +2 -1
- package/Materials/materialHelper.functions.js +17 -1
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/shaderMaterial.js +3 -1
- package/Materials/shaderMaterial.js.map +1 -1
- package/Materials/standardMaterial.d.ts +2 -0
- package/Materials/standardMaterial.js +2 -0
- package/Materials/standardMaterial.js.map +1 -1
- package/Meshes/Compression/dracoCompressionWorker.js.map +1 -1
- package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.d.ts +4 -0
- package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js +11 -2
- package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js.map +1 -1
- package/Meshes/Node/Blocks/Instances/instantiateOnVerticesBlock.d.ts +4 -0
- package/Meshes/Node/Blocks/Instances/instantiateOnVerticesBlock.js +11 -2
- package/Meshes/Node/Blocks/Instances/instantiateOnVerticesBlock.js.map +1 -1
- package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.d.ts +4 -0
- package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js +11 -2
- package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js.map +1 -1
- package/Meshes/abstractMesh.js +6 -0
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/csg2.js +14 -1
- package/Meshes/csg2.js.map +1 -1
- package/Meshes/mesh.d.ts +47 -1
- package/Meshes/mesh.js +28 -1
- package/Meshes/mesh.js.map +1 -1
- package/Misc/screenshotTools.js +3 -0
- package/Misc/screenshotTools.js.map +1 -1
- package/Morph/morphTarget.d.ts +12 -0
- package/Morph/morphTarget.js +35 -1
- package/Morph/morphTarget.js.map +1 -1
- package/Morph/morphTargetManager.d.ts +13 -0
- package/Morph/morphTargetManager.js +30 -1
- package/Morph/morphTargetManager.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.js +3 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
- package/Rendering/depthRenderer.js +3 -1
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/geometryBufferRenderer.js +3 -1
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/outlineRenderer.js +3 -1
- package/Rendering/outlineRenderer.js.map +1 -1
- package/Rendering/utilityLayerRenderer.d.ts +3 -1
- package/Rendering/utilityLayerRenderer.js +16 -7
- package/Rendering/utilityLayerRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/morphTargetsVertex.js +9 -0
- package/Shaders/ShadersInclude/morphTargetsVertex.js.map +1 -1
- package/Shaders/ShadersInclude/morphTargetsVertexGlobalDeclaration.js +3 -0
- package/Shaders/ShadersInclude/morphTargetsVertexGlobalDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/vertexColorMixing.js +2 -2
- package/Shaders/ShadersInclude/vertexColorMixing.js.map +1 -1
- package/Shaders/background.vertex.js +1 -1
- package/Shaders/background.vertex.js.map +1 -1
- package/Shaders/color.vertex.js +3 -0
- package/Shaders/color.vertex.js.map +1 -1
- package/Shaders/default.vertex.js +3 -0
- package/Shaders/default.vertex.js.map +1 -1
- package/Shaders/greasedLine.vertex.js +1 -2
- package/Shaders/greasedLine.vertex.js.map +1 -1
- package/Shaders/pbr.vertex.js +3 -0
- package/Shaders/pbr.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js +6 -0
- package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/morphTargetsVertexGlobalDeclaration.js +3 -0
- package/ShadersWGSL/ShadersInclude/morphTargetsVertexGlobalDeclaration.js.map +1 -1
- package/ShadersWGSL/boundingInfo.compute.js +3 -0
- package/ShadersWGSL/boundingInfo.compute.js.map +1 -1
- package/ShadersWGSL/color.vertex.js +3 -0
- package/ShadersWGSL/color.vertex.js.map +1 -1
- package/ShadersWGSL/default.vertex.js +3 -0
- package/ShadersWGSL/default.vertex.js.map +1 -1
- package/ShadersWGSL/greasedLine.vertex.js +2 -3
- package/ShadersWGSL/greasedLine.vertex.js.map +1 -1
- package/ShadersWGSL/pbr.vertex.js +3 -0
- package/ShadersWGSL/pbr.vertex.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.js +1 -0
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +2 -0
- package/scene.js +13 -9
- package/scene.js.map +1 -1
- package/types.d.ts +22 -0
- package/types.js.map +1 -1
package/Meshes/csg2.js
CHANGED
|
@@ -11,6 +11,11 @@ import { Vector3 } from "../Maths/math.vector.js";
|
|
|
11
11
|
*/
|
|
12
12
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
13
13
|
let Manifold;
|
|
14
|
+
/**
|
|
15
|
+
* Promise to wait for the manifold library to be ready
|
|
16
|
+
*/
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
18
|
+
let ManifoldPromise;
|
|
14
19
|
/**
|
|
15
20
|
* Manifold mesh
|
|
16
21
|
*/
|
|
@@ -336,18 +341,26 @@ export async function InitializeCSG2Async(options) {
|
|
|
336
341
|
manifoldUrl: "https://unpkg.com/manifold-3d@3.0.1",
|
|
337
342
|
...options,
|
|
338
343
|
};
|
|
344
|
+
if (Manifold) {
|
|
345
|
+
return; // Already initialized
|
|
346
|
+
}
|
|
347
|
+
if (ManifoldPromise) {
|
|
348
|
+
await ManifoldPromise;
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
339
351
|
if (localOptions.manifoldInstance) {
|
|
340
352
|
Manifold = localOptions.manifoldInstance;
|
|
341
353
|
ManifoldMesh = localOptions.manifoldMeshInstance;
|
|
342
354
|
}
|
|
343
355
|
else {
|
|
344
|
-
|
|
356
|
+
ManifoldPromise = _LoadScriptModuleAsync(`
|
|
345
357
|
import Module from '${localOptions.manifoldUrl}/manifold.js';
|
|
346
358
|
const wasm = await Module();
|
|
347
359
|
wasm.setup();
|
|
348
360
|
const {Manifold, Mesh} = wasm;
|
|
349
361
|
const returnedValue = {Manifold, Mesh};
|
|
350
362
|
`);
|
|
363
|
+
const result = await ManifoldPromise;
|
|
351
364
|
Manifold = result.Manifold;
|
|
352
365
|
ManifoldMesh = result.Mesh;
|
|
353
366
|
}
|
package/Meshes/csg2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csg2.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/csg2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,0BAAyB;AAC1C,OAAO,EAAE,aAAa,EAAE,sCAAqC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,sBAAsB,EAAE,mCAAkC;AAGnE,OAAO,EAAE,OAAO,EAAE,gCAA+B;AAEjD;;GAEG;AACH,gEAAgE;AAChE,IAAI,QAAa,CAAC;AAElB;;GAEG;AACH,gEAAgE;AAChE,IAAI,YAAiB,CAAC;AAEtB;;GAEG;AACH,gEAAgE;AAChE,IAAI,OAAe,CAAC;AA+DpB;;;;;;;GAOG;AACH,MAAM,OAAO,IAAI;IAKb;;OAEG;IACH,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,YAAoB,QAAa,EAAE,OAAe,EAAE,eAA2C;QAC3F,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;IAC5C,CAAC;IAEO,QAAQ,CAAC,SAAkD,EAAE,GAAS;QAC1E,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7G,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAC,GAAS;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACI,SAAS,CAAC,GAAS;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,GAAG,CAAC,GAAS;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACI,UAAU;QACb,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,eAAe,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACI,YAAY,CAAC,OAA4C;QAC5D,MAAM,YAAY,GAAG;YACjB,cAAc,EAAE,KAAK;YACrB,GAAG,OAAO;SACb,CAAC;QACF,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QACpC,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC;QAC9F,MAAM,YAAY,GAAkB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEnI,UAAU,CAAC,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE5I,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACvD,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACrD,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzD,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,WAAW,GAAG,YAAY,CAAC,cAAc,CAAC,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC;QAE9E,aAAa;QACb,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,IAAI,cAAc,GAAG,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC;YAC3F,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;YAExD,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;oBACtE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC,GAAG,YAAY,CAAC,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC;gBAC5H,CAAC;YACL,CAAC;YACD,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC;QAC/B,CAAC;QAED,gCAAgC;QAChC,OAAO,UAAU,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,IAAY,EAAE,KAAa,EAAE,OAAsC;QAC7E,MAAM,YAAY,GAAG;YACjB,cAAc,EAAE,KAAK;YACrB,UAAU,EAAE,IAAI;YAChB,GAAG,OAAO;SACb,CAAC;QACF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,cAAc,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;QACtF,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC;QAC9F,MAAM,YAAY,GAAkB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnI,MAAM,WAAW,GAAG,YAAY,CAAC,cAAc,CAAC,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC;QAE9E,gCAAgC;QAChC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE/B,cAAc;QACd,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;YAC/D,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,gCAAgC,EAAE,CAAC;QAC9C,CAAC;QAED,YAAY;QACZ,IAAI,EAAE,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,MAAM,SAAS,GAAe,EAAE,CAAC;QACjC,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC1B,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAC3C,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;gBACvE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;gBACnF,EAAE,GAAG,MAAM,CAAC;gBACZ,KAAK,GAAG,GAAG,CAAC;gBACZ,aAAa,EAAE,CAAC;YACpB,CAAC;QACL,CAAC;QAED,IAAI,YAAY,CAAC,aAAa,EAAE,CAAC;YAC7B,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC;QACjD,CAAC;aAAM,CAAC;YACJ,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACrD,aAAa,CAAC,YAAY,GAAG,SAAS,CAAC;gBACvC,MAAM,CAAC,QAAQ,GAAG,aAAa,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC1B,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,YAAY,CACvB,WAAmB,EACnB,QAAqB,EACrB,SAAqC,EACrC,OAAe,EACf,QAAsB,EACtB,aAA2B;QAE3B,MAAM,cAAc,GAAG,IAAI,YAAY,CAAC,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBAEjC,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;oBACtE,cAAc,CAAC,CAAC,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC,GAAG,SAAS,CAAC,IAAK,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;gBAC7G,CAAC;gBACD,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC;YAC/B,CAAC;QACL,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAC/G,YAAY,CAAC,KAAK,EAAE,CAAC;QAErB,IAAI,WAAiB,CAAC;QACtB,IAAI,CAAC;YACD,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,WAAW,CAAC;IACvB,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,IAAqB,EAAE,WAA6B,EAAE,QAAsB,EAAE,aAA2B;QAC/H,mDAAmD;QACnD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,OAAQ,CAAC,MAAM,CAAC,CAAC;QAEvD,eAAe;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACvC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC;QAClC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,SAAS,GAA+B,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;QAE/F,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,SAAU,CAAC;QACxC,CAAC;aAAM,CAAC;YACJ,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,SAAU,CAAC,MAAM,CAAC,CAAC;YAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,mCAAmC,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;gBAC1I,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACtC,CAAC;YACD,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC;QAClC,CAAC;QAED,UAAU;QACV,MAAM,aAAa,GAAG,IAAI,CAAC,OAAQ,CAAC;QACpC,IAAI,aAAa,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,CAAC;YACb,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACJ,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC/C,OAAO,CAAC,8BAA8B,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;oBAC/H,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACpC,CAAC;gBACD,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC;YAChC,CAAC;QACL,CAAC;QAED,MAAM;QACN,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YACrJ,MAAM,QAAQ,GAAI,IAAY,CAAC,IAAI,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5E,IAAI,QAAQ,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC,CAAC;gBACb,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9D,CAAC;QACL,CAAC;QAED,SAAS;QACT,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,YAAY,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,CAAC;YACb,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAU,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAChH,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,cAAc,CAAC,UAAsB;QAC/C,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC;QAC5C,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC;QAEzC,IAAI,CAAC,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC/E,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,QAAQ,CAAC,IAAU,EAAE,iBAAiB,GAAG,KAAK;QACxD,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACvE,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAElD,IAAI,CAAC,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACzE,CAAC;QAED,oDAAoD;QACpD,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAEjG,2BAA2B;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAC;QACxE,MAAM,eAAe,GAAG,cAAc,CAAC,YAAY,EAAE,KAAK,eAAe,CAAC;QAC1E,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;YACjE,IAAI,eAAe,EAAE,CAAC;gBAClB,OAAO,OAAO,GAAI,cAAgC,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,aAAa,CAAE,CAAC,QAAQ,CAAC;YACjH,CAAC;YAED,OAAO,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,aAAa,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1E,UAAU;QACV,MAAM,IAAI,GAAG;YACT,SAAS,EAAE,cAAc;YACzB,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC;YACtD,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC;YACpD,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC;YAC9C,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC;YAChD,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC;YAChD,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC;YAChD,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC;YAChD,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC;SACnD,CAAC;QACF,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAClG,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACvB,OAAO,QAAQ,KAAK,SAAS,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAA+B;IACrE,MAAM,YAAY,GAAG;QACjB,WAAW,EAAE,qCAAqC;QAClD,GAAG,OAAO;KACb,CAAC;IAEF,IAAI,YAAY,CAAC,gBAAgB,EAAE,CAAC;QAChC,QAAQ,GAAG,YAAY,CAAC,gBAAgB,CAAC;QACzC,YAAY,GAAG,YAAY,CAAC,oBAAoB,CAAC;IACrD,CAAC;SAAM,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,sBAAsB,CACvC;kCACsB,YAAY,CAAC,WAAW;;;;;SAKjD,CACA,CAAC;QAEF,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC3B,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,0FAA0F;IAC1F,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC","sourcesContent":["import { Mesh } from \"./mesh\";\r\nimport type { IDisposable, Scene } from \"core/scene\";\r\nimport type { IVertexDataLike } from \"./mesh.vertexData\";\r\nimport { VertexData } from \"./mesh.vertexData\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { MultiMaterial } from \"core/Materials/multiMaterial\";\r\nimport { SubMesh } from \"./subMesh\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { _LoadScriptModuleAsync } from \"core/Misc/tools.internals\";\r\nimport type { FloatArray, Nullable } from \"core/types\";\r\nimport type { Matrix } from \"core/Maths/math.vector\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\n\r\n/**\r\n * Main manifold library\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nlet Manifold: any;\r\n\r\n/**\r\n * Manifold mesh\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nlet ManifoldMesh: any;\r\n\r\n/**\r\n * First ID to use for materials indexing\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nlet FirstID: number;\r\n\r\n/**\r\n * Interface to customize the Manifold library import\r\n */\r\nexport interface ICSG2Options {\r\n /**\r\n * Custom manifold URL\r\n */\r\n manifoldUrl?: string;\r\n /**\r\n * Custom manifold instance\r\n */\r\n manifoldInstance: any;\r\n /**\r\n * Custom manifold mesh instance\r\n */\r\n manifoldMeshInstance: any;\r\n}\r\n\r\n/**\r\n * Interface to customize the mesh rebuild options\r\n */\r\nexport interface IMeshRebuildOptions {\r\n /**\r\n * Rebuild normals\r\n */\r\n rebuildNormals?: boolean;\r\n /**\r\n * True to center the mesh on 0,0,0\r\n */\r\n centerMesh?: boolean;\r\n /**\r\n * Defines a material to use for that mesh. When not defined the system will either reuse the one from the source or create a multimaterial if several materials were involved\r\n */\r\n materialToUse?: Material;\r\n}\r\n\r\n/**\r\n * Interface to customize the vertex data rebuild options\r\n */\r\nexport interface IVertexDataRebuildOptions {\r\n /**\r\n * Rebuild normals\r\n */\r\n rebuildNormals?: boolean;\r\n}\r\n\r\ninterface IManifoldMesh {\r\n numProp: number;\r\n vertProperties: Float32Array;\r\n triVerts: Uint32Array;\r\n runIndex: Uint32Array;\r\n runOriginalID: Uint32Array;\r\n numRun: number;\r\n}\r\n\r\ninterface IManifoldVertexComponent {\r\n stride: number;\r\n kind: string;\r\n data?: FloatArray;\r\n}\r\n\r\n/**\r\n * Wrapper around the Manifold library\r\n * https://manifoldcad.org/\r\n * Use this class to perform fast boolean operations on meshes\r\n * #IW43EB#15 - basic operations\r\n * #JUKXQD#6104 - skull vs box\r\n * #JUKXQD#6111 - skull vs vertex data\r\n */\r\nexport class CSG2 implements IDisposable {\r\n private _manifold: any;\r\n private _numProp: number;\r\n private _vertexStructure: IManifoldVertexComponent[];\r\n\r\n /**\r\n * Return the size of a vertex (at least 3 for the position)\r\n */\r\n public get numProp() {\r\n return this._numProp;\r\n }\r\n\r\n private constructor(manifold: any, numProp: number, vertexStructure: IManifoldVertexComponent[]) {\r\n this._manifold = manifold;\r\n this._numProp = numProp;\r\n this._vertexStructure = vertexStructure;\r\n }\r\n\r\n private _process(operation: \"difference\" | \"intersection\" | \"union\", csg: CSG2) {\r\n if (this.numProp !== csg.numProp) {\r\n throw new Error(\"CSG must be used with geometries having the same number of properties\");\r\n }\r\n return new CSG2(Manifold[operation](this._manifold, csg._manifold), this.numProp, this._vertexStructure);\r\n }\r\n\r\n /**\r\n * Run a difference operation between two CSG\r\n * @param csg defines the CSG to use to create the difference\r\n * @returns a new csg\r\n */\r\n public subtract(csg: CSG2) {\r\n return this._process(\"difference\", csg);\r\n }\r\n\r\n /**\r\n * Run an intersection operation between two CSG\r\n * @param csg defines the CSG to use to create the intersection\r\n * @returns a new csg\r\n */\r\n public intersect(csg: CSG2) {\r\n return this._process(\"intersection\", csg);\r\n }\r\n\r\n /**\r\n * Run an union operation between two CSG\r\n * @param csg defines the CSG to use to create the union\r\n * @returns a new csg\r\n */\r\n public add(csg: CSG2) {\r\n return this._process(\"union\", csg);\r\n }\r\n\r\n /**\r\n * Print debug information about the CSG\r\n */\r\n public printDebug() {\r\n Logger.Log(\"Genus:\" + this._manifold.genus());\r\n const properties = this._manifold.getProperties();\r\n Logger.Log(\"Volume:\" + properties.volume);\r\n Logger.Log(\"surface area:\" + properties.surfaceArea);\r\n }\r\n\r\n /**\r\n * Generate a vertex data from the CSG\r\n * @param options defines the options to use to rebuild the vertex data\r\n * @returns a new vertex data\r\n */\r\n public toVertexData(options?: Partial<IVertexDataRebuildOptions>): VertexData {\r\n const localOptions = {\r\n rebuildNormals: false,\r\n ...options,\r\n };\r\n const vertexData = new VertexData();\r\n const normalComponent = this._vertexStructure.find((c) => c.kind === VertexBuffer.NormalKind);\r\n const manifoldMesh: IManifoldMesh = this._manifold.getMesh(localOptions.rebuildNormals && normalComponent ? [3, 4, 5] : undefined);\r\n\r\n vertexData.indices = manifoldMesh.triVerts.length > 65535 ? new Uint32Array(manifoldMesh.triVerts) : new Uint16Array(manifoldMesh.triVerts);\r\n\r\n for (let i = 0; i < manifoldMesh.triVerts.length; i += 3) {\r\n vertexData.indices[i] = manifoldMesh.triVerts[i + 2];\r\n vertexData.indices[i + 1] = manifoldMesh.triVerts[i + 1];\r\n vertexData.indices[i + 2] = manifoldMesh.triVerts[i];\r\n }\r\n\r\n const vertexCount = manifoldMesh.vertProperties.length / manifoldMesh.numProp;\r\n\r\n // Attributes\r\n let offset = 0;\r\n for (let componentIndex = 0; componentIndex < this._vertexStructure.length; componentIndex++) {\r\n const component = this._vertexStructure[componentIndex];\r\n\r\n const data = new Float32Array(vertexCount * component.stride);\r\n for (let i = 0; i < vertexCount; i++) {\r\n for (let strideIndex = 0; strideIndex < component.stride; strideIndex++) {\r\n data[i * component.stride + strideIndex] = manifoldMesh.vertProperties[i * manifoldMesh.numProp + offset + strideIndex];\r\n }\r\n }\r\n vertexData.set(data, component.kind);\r\n offset += component.stride;\r\n }\r\n\r\n // Rebuild mesh from vertex data\r\n return vertexData;\r\n }\r\n\r\n /**\r\n * Generate a mesh from the CSG\r\n * @param name defines the name of the mesh\r\n * @param scene defines the scene to use to create the mesh\r\n * @param options defines the options to use to rebuild the mesh\r\n * @returns a new Mesh\r\n */\r\n public toMesh(name: string, scene?: Scene, options?: Partial<IMeshRebuildOptions>): Mesh {\r\n const localOptions = {\r\n rebuildNormals: false,\r\n centerMesh: true,\r\n ...options,\r\n };\r\n const vertexData = this.toVertexData({ rebuildNormals: localOptions.rebuildNormals });\r\n const normalComponent = this._vertexStructure.find((c) => c.kind === VertexBuffer.NormalKind);\r\n const manifoldMesh: IManifoldMesh = this._manifold.getMesh(localOptions.rebuildNormals && normalComponent ? [3, 4, 5] : undefined);\r\n const vertexCount = manifoldMesh.vertProperties.length / manifoldMesh.numProp;\r\n\r\n // Rebuild mesh from vertex data\r\n const output = new Mesh(name, scene);\r\n vertexData.applyToMesh(output);\r\n\r\n // Center mesh\r\n if (localOptions.centerMesh) {\r\n const extents = output.getBoundingInfo().boundingSphere.center;\r\n output.position.set(-extents.x, -extents.y, -extents.z);\r\n output.bakeCurrentTransformIntoVertices();\r\n }\r\n\r\n // Submeshes\r\n let id = manifoldMesh.runOriginalID[0];\r\n let start = manifoldMesh.runIndex[0];\r\n let materialIndex = 0;\r\n const materials: Material[] = [];\r\n scene = output.getScene();\r\n for (let run = 0; run < manifoldMesh.numRun; ++run) {\r\n const nextID = manifoldMesh.runOriginalID[run + 1];\r\n if (nextID !== id) {\r\n const end = manifoldMesh.runIndex[run + 1];\r\n new SubMesh(materialIndex, 0, vertexCount, start, end - start, output);\r\n materials.push(scene.getMaterialByUniqueID(id - FirstID) || scene.defaultMaterial);\r\n id = nextID;\r\n start = end;\r\n materialIndex++;\r\n }\r\n }\r\n\r\n if (localOptions.materialToUse) {\r\n output.material = localOptions.materialToUse;\r\n } else {\r\n if (materials.length > 1) {\r\n const multiMaterial = new MultiMaterial(name, scene);\r\n multiMaterial.subMaterials = materials;\r\n output.material = multiMaterial;\r\n } else {\r\n output.material = materials[0];\r\n }\r\n }\r\n\r\n return output;\r\n }\r\n\r\n /**\r\n * Dispose the CSG resources\r\n */\r\n public dispose() {\r\n if (this._manifold) {\r\n this._manifold.delete();\r\n this._manifold = null;\r\n }\r\n }\r\n\r\n private static _ProcessData(\r\n vertexCount: number,\r\n triVerts: Uint32Array,\r\n structure: IManifoldVertexComponent[],\r\n numProp: number,\r\n runIndex?: Uint32Array,\r\n runOriginalID?: Uint32Array\r\n ) {\r\n const vertProperties = new Float32Array(vertexCount * structure.reduce((acc, cur) => acc + cur.stride, 0));\r\n\r\n for (let i = 0; i < vertexCount; i++) {\r\n let offset = 0;\r\n for (let idx = 0; idx < structure.length; idx++) {\r\n const component = structure[idx];\r\n\r\n for (let strideIndex = 0; strideIndex < component.stride; strideIndex++) {\r\n vertProperties[i * numProp + offset + strideIndex] = component.data![i * component.stride + strideIndex];\r\n }\r\n offset += component.stride;\r\n }\r\n }\r\n\r\n const manifoldMesh = new ManifoldMesh({ numProp: numProp, vertProperties, triVerts, runIndex, runOriginalID });\r\n manifoldMesh.merge();\r\n\r\n let returnValue: CSG2;\r\n try {\r\n returnValue = new CSG2(new Manifold(manifoldMesh), numProp, structure);\r\n } catch (e) {\r\n throw new Error(\"Error while creating the CSG: \" + e.message);\r\n }\r\n\r\n return returnValue;\r\n }\r\n\r\n private static _Construct(data: IVertexDataLike, worldMatrix: Nullable<Matrix>, runIndex?: Uint32Array, runOriginalID?: Uint32Array) {\r\n // Create the MeshGL for I/O with Manifold library.\r\n const triVerts = new Uint32Array(data.indices!.length);\r\n\r\n // Revert order\r\n for (let i = 0; i < data.indices!.length; i += 3) {\r\n triVerts[i] = data.indices![i + 2];\r\n triVerts[i + 1] = data.indices![i + 1];\r\n triVerts[i + 2] = data.indices![i];\r\n }\r\n\r\n const tempVector3 = new Vector3();\r\n let numProp = 3;\r\n const structure: IManifoldVertexComponent[] = [{ stride: 3, kind: VertexBuffer.PositionKind }];\r\n\r\n if (!worldMatrix) {\r\n structure[0].data = data.positions!;\r\n } else {\r\n const positions = new Float32Array(data.positions!.length);\r\n for (let i = 0; i < data.positions!.length; i += 3) {\r\n Vector3.TransformCoordinatesFromFloatsToRef(data.positions![i], data.positions![i + 1], data.positions![i + 2], worldMatrix, tempVector3);\r\n tempVector3.toArray(positions, i);\r\n }\r\n structure[0].data = positions;\r\n }\r\n\r\n // Normals\r\n const sourceNormals = data.normals!;\r\n if (sourceNormals) {\r\n numProp += 3;\r\n structure.push({ stride: 3, kind: VertexBuffer.NormalKind });\r\n if (!worldMatrix) {\r\n structure[1].data = sourceNormals;\r\n } else {\r\n const normals = new Float32Array(sourceNormals.length);\r\n for (let i = 0; i < sourceNormals.length; i += 3) {\r\n Vector3.TransformNormalFromFloatsToRef(sourceNormals[i], sourceNormals[i + 1], sourceNormals[i + 2], worldMatrix, tempVector3);\r\n tempVector3.toArray(normals, i);\r\n }\r\n structure[1].data = normals;\r\n }\r\n }\r\n\r\n // UVs\r\n for (const kind of [VertexBuffer.UVKind, VertexBuffer.UV2Kind, VertexBuffer.UV3Kind, VertexBuffer.UV4Kind, VertexBuffer.UV5Kind, VertexBuffer.UV6Kind]) {\r\n const sourceUV = (data as any)[kind === VertexBuffer.UVKind ? \"uvs\" : kind];\r\n if (sourceUV) {\r\n numProp += 2;\r\n structure.push({ stride: 2, kind: kind, data: sourceUV });\r\n }\r\n }\r\n\r\n // Colors\r\n const sourceColors = data.colors;\r\n if (sourceColors) {\r\n numProp += 4;\r\n structure.push({ stride: 4, kind: VertexBuffer.ColorKind, data: sourceColors });\r\n }\r\n\r\n return this._ProcessData(data.positions!.length / 3, triVerts, structure, numProp, runIndex, runOriginalID);\r\n }\r\n\r\n /**\r\n * Create a new Constructive Solid Geometry from a vertexData\r\n * @param vertexData defines the vertexData to use to create the CSG\r\n * @returns a new CSG2 class\r\n */\r\n public static FromVertexData(vertexData: VertexData): CSG2 {\r\n const sourceVertices = vertexData.positions;\r\n const sourceIndices = vertexData.indices;\r\n\r\n if (!sourceVertices || !sourceIndices) {\r\n throw new Error(\"The vertexData must at least have positions and indices\");\r\n }\r\n\r\n return this._Construct(vertexData, null);\r\n }\r\n\r\n /**\r\n * Create a new Constructive Solid Geometry from a mesh\r\n * @param mesh defines the mesh to use to create the CSG\r\n * @param ignoreWorldMatrix defines if the world matrix should be ignored\r\n * @returns a new CSG2 class\r\n */\r\n public static FromMesh(mesh: Mesh, ignoreWorldMatrix = false): CSG2 {\r\n const sourceVertices = mesh.getVerticesData(VertexBuffer.PositionKind);\r\n const sourceIndices = mesh.getIndices();\r\n const worldMatrix = mesh.computeWorldMatrix(true);\r\n\r\n if (!sourceVertices || !sourceIndices) {\r\n throw new Error(\"The mesh must at least have positions and indices\");\r\n }\r\n\r\n // Create a triangle run for each submesh (material)\r\n const starts = [...Array(mesh.subMeshes.length)].map((_, idx) => mesh.subMeshes[idx].indexStart);\r\n\r\n // Map the materials to ID.\r\n const sourceMaterial = mesh.material || mesh.getScene().defaultMaterial;\r\n const isMultiMaterial = sourceMaterial.getClassName() === \"MultiMaterial\";\r\n const originalIDs = [...Array(mesh.subMeshes.length)].map((_, idx) => {\r\n if (isMultiMaterial) {\r\n return FirstID + (sourceMaterial as MultiMaterial).subMaterials[mesh.subMeshes[idx].materialIndex]!.uniqueId;\r\n }\r\n\r\n return FirstID + sourceMaterial.uniqueId;\r\n });\r\n\r\n // List the runs in sequence.\r\n const indices = Array.from(starts.keys());\r\n indices.sort((a, b) => starts[a] - starts[b]);\r\n const runIndex = new Uint32Array(indices.map((i) => starts[i]));\r\n const runOriginalID = new Uint32Array(indices.map((i) => originalIDs[i]));\r\n\r\n // Process\r\n const data = {\r\n positions: sourceVertices,\r\n indices: sourceIndices,\r\n normals: mesh.getVerticesData(VertexBuffer.NormalKind),\r\n colors: mesh.getVerticesData(VertexBuffer.ColorKind),\r\n uvs: mesh.getVerticesData(VertexBuffer.UVKind),\r\n uvs2: mesh.getVerticesData(VertexBuffer.UV2Kind),\r\n uvs3: mesh.getVerticesData(VertexBuffer.UV3Kind),\r\n uvs4: mesh.getVerticesData(VertexBuffer.UV4Kind),\r\n uvs5: mesh.getVerticesData(VertexBuffer.UV5Kind),\r\n uvs6: mesh.getVerticesData(VertexBuffer.UV6Kind),\r\n };\r\n return this._Construct(data, ignoreWorldMatrix ? null : worldMatrix, runIndex, runOriginalID);\r\n }\r\n}\r\n\r\n/**\r\n * Checks if the Manifold library is ready\r\n * @returns true if the Manifold library is ready\r\n */\r\nexport function IsCSG2Ready() {\r\n return Manifold !== undefined;\r\n}\r\n\r\n/**\r\n * Initialize the Manifold library\r\n * @param options defines the options to use to initialize the library\r\n */\r\nexport async function InitializeCSG2Async(options?: Partial<ICSG2Options>) {\r\n const localOptions = {\r\n manifoldUrl: \"https://unpkg.com/manifold-3d@3.0.1\",\r\n ...options,\r\n };\r\n\r\n if (localOptions.manifoldInstance) {\r\n Manifold = localOptions.manifoldInstance;\r\n ManifoldMesh = localOptions.manifoldMeshInstance;\r\n } else {\r\n const result = await _LoadScriptModuleAsync(\r\n `\r\n import Module from '${localOptions.manifoldUrl}/manifold.js';\r\n const wasm = await Module();\r\n wasm.setup();\r\n const {Manifold, Mesh} = wasm;\r\n const returnedValue = {Manifold, Mesh};\r\n `\r\n );\r\n\r\n Manifold = result.Manifold;\r\n ManifoldMesh = result.Mesh;\r\n }\r\n\r\n // Reserve IDs for materials (we consider that there will be no more than 65536 materials)\r\n FirstID = Manifold.reserveIDs(65536);\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"csg2.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/csg2.ts"],"names":[],"mappings":"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","sourcesContent":["import { Mesh } from \"./mesh\";\r\nimport type { IDisposable, Scene } from \"core/scene\";\r\nimport type { IVertexDataLike } from \"./mesh.vertexData\";\r\nimport { VertexData } from \"./mesh.vertexData\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { MultiMaterial } from \"core/Materials/multiMaterial\";\r\nimport { SubMesh } from \"./subMesh\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { _LoadScriptModuleAsync } from \"core/Misc/tools.internals\";\r\nimport type { FloatArray, Nullable } from \"core/types\";\r\nimport type { Matrix } from \"core/Maths/math.vector\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\n\r\n/**\r\n * Main manifold library\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nlet Manifold: any;\r\n\r\n/**\r\n * Promise to wait for the manifold library to be ready\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nlet ManifoldPromise: Promise<{ Manifold: any; Mesh: any }>;\r\n\r\n/**\r\n * Manifold mesh\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nlet ManifoldMesh: any;\r\n\r\n/**\r\n * First ID to use for materials indexing\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nlet FirstID: number;\r\n\r\n/**\r\n * Interface to customize the Manifold library import\r\n */\r\nexport interface ICSG2Options {\r\n /**\r\n * Custom manifold URL\r\n */\r\n manifoldUrl?: string;\r\n /**\r\n * Custom manifold instance\r\n */\r\n manifoldInstance: any;\r\n /**\r\n * Custom manifold mesh instance\r\n */\r\n manifoldMeshInstance: any;\r\n}\r\n\r\n/**\r\n * Interface to customize the mesh rebuild options\r\n */\r\nexport interface IMeshRebuildOptions {\r\n /**\r\n * Rebuild normals\r\n */\r\n rebuildNormals?: boolean;\r\n /**\r\n * True to center the mesh on 0,0,0\r\n */\r\n centerMesh?: boolean;\r\n /**\r\n * Defines a material to use for that mesh. When not defined the system will either reuse the one from the source or create a multimaterial if several materials were involved\r\n */\r\n materialToUse?: Material;\r\n}\r\n\r\n/**\r\n * Interface to customize the vertex data rebuild options\r\n */\r\nexport interface IVertexDataRebuildOptions {\r\n /**\r\n * Rebuild normals\r\n */\r\n rebuildNormals?: boolean;\r\n}\r\n\r\ninterface IManifoldMesh {\r\n numProp: number;\r\n vertProperties: Float32Array;\r\n triVerts: Uint32Array;\r\n runIndex: Uint32Array;\r\n runOriginalID: Uint32Array;\r\n numRun: number;\r\n}\r\n\r\ninterface IManifoldVertexComponent {\r\n stride: number;\r\n kind: string;\r\n data?: FloatArray;\r\n}\r\n\r\n/**\r\n * Wrapper around the Manifold library\r\n * https://manifoldcad.org/\r\n * Use this class to perform fast boolean operations on meshes\r\n * #IW43EB#15 - basic operations\r\n * #JUKXQD#6104 - skull vs box\r\n * #JUKXQD#6111 - skull vs vertex data\r\n */\r\nexport class CSG2 implements IDisposable {\r\n private _manifold: any;\r\n private _numProp: number;\r\n private _vertexStructure: IManifoldVertexComponent[];\r\n\r\n /**\r\n * Return the size of a vertex (at least 3 for the position)\r\n */\r\n public get numProp() {\r\n return this._numProp;\r\n }\r\n\r\n private constructor(manifold: any, numProp: number, vertexStructure: IManifoldVertexComponent[]) {\r\n this._manifold = manifold;\r\n this._numProp = numProp;\r\n this._vertexStructure = vertexStructure;\r\n }\r\n\r\n private _process(operation: \"difference\" | \"intersection\" | \"union\", csg: CSG2) {\r\n if (this.numProp !== csg.numProp) {\r\n throw new Error(\"CSG must be used with geometries having the same number of properties\");\r\n }\r\n return new CSG2(Manifold[operation](this._manifold, csg._manifold), this.numProp, this._vertexStructure);\r\n }\r\n\r\n /**\r\n * Run a difference operation between two CSG\r\n * @param csg defines the CSG to use to create the difference\r\n * @returns a new csg\r\n */\r\n public subtract(csg: CSG2) {\r\n return this._process(\"difference\", csg);\r\n }\r\n\r\n /**\r\n * Run an intersection operation between two CSG\r\n * @param csg defines the CSG to use to create the intersection\r\n * @returns a new csg\r\n */\r\n public intersect(csg: CSG2) {\r\n return this._process(\"intersection\", csg);\r\n }\r\n\r\n /**\r\n * Run an union operation between two CSG\r\n * @param csg defines the CSG to use to create the union\r\n * @returns a new csg\r\n */\r\n public add(csg: CSG2) {\r\n return this._process(\"union\", csg);\r\n }\r\n\r\n /**\r\n * Print debug information about the CSG\r\n */\r\n public printDebug() {\r\n Logger.Log(\"Genus:\" + this._manifold.genus());\r\n const properties = this._manifold.getProperties();\r\n Logger.Log(\"Volume:\" + properties.volume);\r\n Logger.Log(\"surface area:\" + properties.surfaceArea);\r\n }\r\n\r\n /**\r\n * Generate a vertex data from the CSG\r\n * @param options defines the options to use to rebuild the vertex data\r\n * @returns a new vertex data\r\n */\r\n public toVertexData(options?: Partial<IVertexDataRebuildOptions>): VertexData {\r\n const localOptions = {\r\n rebuildNormals: false,\r\n ...options,\r\n };\r\n const vertexData = new VertexData();\r\n const normalComponent = this._vertexStructure.find((c) => c.kind === VertexBuffer.NormalKind);\r\n const manifoldMesh: IManifoldMesh = this._manifold.getMesh(localOptions.rebuildNormals && normalComponent ? [3, 4, 5] : undefined);\r\n\r\n vertexData.indices = manifoldMesh.triVerts.length > 65535 ? new Uint32Array(manifoldMesh.triVerts) : new Uint16Array(manifoldMesh.triVerts);\r\n\r\n for (let i = 0; i < manifoldMesh.triVerts.length; i += 3) {\r\n vertexData.indices[i] = manifoldMesh.triVerts[i + 2];\r\n vertexData.indices[i + 1] = manifoldMesh.triVerts[i + 1];\r\n vertexData.indices[i + 2] = manifoldMesh.triVerts[i];\r\n }\r\n\r\n const vertexCount = manifoldMesh.vertProperties.length / manifoldMesh.numProp;\r\n\r\n // Attributes\r\n let offset = 0;\r\n for (let componentIndex = 0; componentIndex < this._vertexStructure.length; componentIndex++) {\r\n const component = this._vertexStructure[componentIndex];\r\n\r\n const data = new Float32Array(vertexCount * component.stride);\r\n for (let i = 0; i < vertexCount; i++) {\r\n for (let strideIndex = 0; strideIndex < component.stride; strideIndex++) {\r\n data[i * component.stride + strideIndex] = manifoldMesh.vertProperties[i * manifoldMesh.numProp + offset + strideIndex];\r\n }\r\n }\r\n vertexData.set(data, component.kind);\r\n offset += component.stride;\r\n }\r\n\r\n // Rebuild mesh from vertex data\r\n return vertexData;\r\n }\r\n\r\n /**\r\n * Generate a mesh from the CSG\r\n * @param name defines the name of the mesh\r\n * @param scene defines the scene to use to create the mesh\r\n * @param options defines the options to use to rebuild the mesh\r\n * @returns a new Mesh\r\n */\r\n public toMesh(name: string, scene?: Scene, options?: Partial<IMeshRebuildOptions>): Mesh {\r\n const localOptions = {\r\n rebuildNormals: false,\r\n centerMesh: true,\r\n ...options,\r\n };\r\n const vertexData = this.toVertexData({ rebuildNormals: localOptions.rebuildNormals });\r\n const normalComponent = this._vertexStructure.find((c) => c.kind === VertexBuffer.NormalKind);\r\n const manifoldMesh: IManifoldMesh = this._manifold.getMesh(localOptions.rebuildNormals && normalComponent ? [3, 4, 5] : undefined);\r\n const vertexCount = manifoldMesh.vertProperties.length / manifoldMesh.numProp;\r\n\r\n // Rebuild mesh from vertex data\r\n const output = new Mesh(name, scene);\r\n vertexData.applyToMesh(output);\r\n\r\n // Center mesh\r\n if (localOptions.centerMesh) {\r\n const extents = output.getBoundingInfo().boundingSphere.center;\r\n output.position.set(-extents.x, -extents.y, -extents.z);\r\n output.bakeCurrentTransformIntoVertices();\r\n }\r\n\r\n // Submeshes\r\n let id = manifoldMesh.runOriginalID[0];\r\n let start = manifoldMesh.runIndex[0];\r\n let materialIndex = 0;\r\n const materials: Material[] = [];\r\n scene = output.getScene();\r\n for (let run = 0; run < manifoldMesh.numRun; ++run) {\r\n const nextID = manifoldMesh.runOriginalID[run + 1];\r\n if (nextID !== id) {\r\n const end = manifoldMesh.runIndex[run + 1];\r\n new SubMesh(materialIndex, 0, vertexCount, start, end - start, output);\r\n materials.push(scene.getMaterialByUniqueID(id - FirstID) || scene.defaultMaterial);\r\n id = nextID;\r\n start = end;\r\n materialIndex++;\r\n }\r\n }\r\n\r\n if (localOptions.materialToUse) {\r\n output.material = localOptions.materialToUse;\r\n } else {\r\n if (materials.length > 1) {\r\n const multiMaterial = new MultiMaterial(name, scene);\r\n multiMaterial.subMaterials = materials;\r\n output.material = multiMaterial;\r\n } else {\r\n output.material = materials[0];\r\n }\r\n }\r\n\r\n return output;\r\n }\r\n\r\n /**\r\n * Dispose the CSG resources\r\n */\r\n public dispose() {\r\n if (this._manifold) {\r\n this._manifold.delete();\r\n this._manifold = null;\r\n }\r\n }\r\n\r\n private static _ProcessData(\r\n vertexCount: number,\r\n triVerts: Uint32Array,\r\n structure: IManifoldVertexComponent[],\r\n numProp: number,\r\n runIndex?: Uint32Array,\r\n runOriginalID?: Uint32Array\r\n ) {\r\n const vertProperties = new Float32Array(vertexCount * structure.reduce((acc, cur) => acc + cur.stride, 0));\r\n\r\n for (let i = 0; i < vertexCount; i++) {\r\n let offset = 0;\r\n for (let idx = 0; idx < structure.length; idx++) {\r\n const component = structure[idx];\r\n\r\n for (let strideIndex = 0; strideIndex < component.stride; strideIndex++) {\r\n vertProperties[i * numProp + offset + strideIndex] = component.data![i * component.stride + strideIndex];\r\n }\r\n offset += component.stride;\r\n }\r\n }\r\n\r\n const manifoldMesh = new ManifoldMesh({ numProp: numProp, vertProperties, triVerts, runIndex, runOriginalID });\r\n manifoldMesh.merge();\r\n\r\n let returnValue: CSG2;\r\n try {\r\n returnValue = new CSG2(new Manifold(manifoldMesh), numProp, structure);\r\n } catch (e) {\r\n throw new Error(\"Error while creating the CSG: \" + e.message);\r\n }\r\n\r\n return returnValue;\r\n }\r\n\r\n private static _Construct(data: IVertexDataLike, worldMatrix: Nullable<Matrix>, runIndex?: Uint32Array, runOriginalID?: Uint32Array) {\r\n // Create the MeshGL for I/O with Manifold library.\r\n const triVerts = new Uint32Array(data.indices!.length);\r\n\r\n // Revert order\r\n for (let i = 0; i < data.indices!.length; i += 3) {\r\n triVerts[i] = data.indices![i + 2];\r\n triVerts[i + 1] = data.indices![i + 1];\r\n triVerts[i + 2] = data.indices![i];\r\n }\r\n\r\n const tempVector3 = new Vector3();\r\n let numProp = 3;\r\n const structure: IManifoldVertexComponent[] = [{ stride: 3, kind: VertexBuffer.PositionKind }];\r\n\r\n if (!worldMatrix) {\r\n structure[0].data = data.positions!;\r\n } else {\r\n const positions = new Float32Array(data.positions!.length);\r\n for (let i = 0; i < data.positions!.length; i += 3) {\r\n Vector3.TransformCoordinatesFromFloatsToRef(data.positions![i], data.positions![i + 1], data.positions![i + 2], worldMatrix, tempVector3);\r\n tempVector3.toArray(positions, i);\r\n }\r\n structure[0].data = positions;\r\n }\r\n\r\n // Normals\r\n const sourceNormals = data.normals!;\r\n if (sourceNormals) {\r\n numProp += 3;\r\n structure.push({ stride: 3, kind: VertexBuffer.NormalKind });\r\n if (!worldMatrix) {\r\n structure[1].data = sourceNormals;\r\n } else {\r\n const normals = new Float32Array(sourceNormals.length);\r\n for (let i = 0; i < sourceNormals.length; i += 3) {\r\n Vector3.TransformNormalFromFloatsToRef(sourceNormals[i], sourceNormals[i + 1], sourceNormals[i + 2], worldMatrix, tempVector3);\r\n tempVector3.toArray(normals, i);\r\n }\r\n structure[1].data = normals;\r\n }\r\n }\r\n\r\n // UVs\r\n for (const kind of [VertexBuffer.UVKind, VertexBuffer.UV2Kind, VertexBuffer.UV3Kind, VertexBuffer.UV4Kind, VertexBuffer.UV5Kind, VertexBuffer.UV6Kind]) {\r\n const sourceUV = (data as any)[kind === VertexBuffer.UVKind ? \"uvs\" : kind];\r\n if (sourceUV) {\r\n numProp += 2;\r\n structure.push({ stride: 2, kind: kind, data: sourceUV });\r\n }\r\n }\r\n\r\n // Colors\r\n const sourceColors = data.colors;\r\n if (sourceColors) {\r\n numProp += 4;\r\n structure.push({ stride: 4, kind: VertexBuffer.ColorKind, data: sourceColors });\r\n }\r\n\r\n return this._ProcessData(data.positions!.length / 3, triVerts, structure, numProp, runIndex, runOriginalID);\r\n }\r\n\r\n /**\r\n * Create a new Constructive Solid Geometry from a vertexData\r\n * @param vertexData defines the vertexData to use to create the CSG\r\n * @returns a new CSG2 class\r\n */\r\n public static FromVertexData(vertexData: VertexData): CSG2 {\r\n const sourceVertices = vertexData.positions;\r\n const sourceIndices = vertexData.indices;\r\n\r\n if (!sourceVertices || !sourceIndices) {\r\n throw new Error(\"The vertexData must at least have positions and indices\");\r\n }\r\n\r\n return this._Construct(vertexData, null);\r\n }\r\n\r\n /**\r\n * Create a new Constructive Solid Geometry from a mesh\r\n * @param mesh defines the mesh to use to create the CSG\r\n * @param ignoreWorldMatrix defines if the world matrix should be ignored\r\n * @returns a new CSG2 class\r\n */\r\n public static FromMesh(mesh: Mesh, ignoreWorldMatrix = false): CSG2 {\r\n const sourceVertices = mesh.getVerticesData(VertexBuffer.PositionKind);\r\n const sourceIndices = mesh.getIndices();\r\n const worldMatrix = mesh.computeWorldMatrix(true);\r\n\r\n if (!sourceVertices || !sourceIndices) {\r\n throw new Error(\"The mesh must at least have positions and indices\");\r\n }\r\n\r\n // Create a triangle run for each submesh (material)\r\n const starts = [...Array(mesh.subMeshes.length)].map((_, idx) => mesh.subMeshes[idx].indexStart);\r\n\r\n // Map the materials to ID.\r\n const sourceMaterial = mesh.material || mesh.getScene().defaultMaterial;\r\n const isMultiMaterial = sourceMaterial.getClassName() === \"MultiMaterial\";\r\n const originalIDs = [...Array(mesh.subMeshes.length)].map((_, idx) => {\r\n if (isMultiMaterial) {\r\n return FirstID + (sourceMaterial as MultiMaterial).subMaterials[mesh.subMeshes[idx].materialIndex]!.uniqueId;\r\n }\r\n\r\n return FirstID + sourceMaterial.uniqueId;\r\n });\r\n\r\n // List the runs in sequence.\r\n const indices = Array.from(starts.keys());\r\n indices.sort((a, b) => starts[a] - starts[b]);\r\n const runIndex = new Uint32Array(indices.map((i) => starts[i]));\r\n const runOriginalID = new Uint32Array(indices.map((i) => originalIDs[i]));\r\n\r\n // Process\r\n const data = {\r\n positions: sourceVertices,\r\n indices: sourceIndices,\r\n normals: mesh.getVerticesData(VertexBuffer.NormalKind),\r\n colors: mesh.getVerticesData(VertexBuffer.ColorKind),\r\n uvs: mesh.getVerticesData(VertexBuffer.UVKind),\r\n uvs2: mesh.getVerticesData(VertexBuffer.UV2Kind),\r\n uvs3: mesh.getVerticesData(VertexBuffer.UV3Kind),\r\n uvs4: mesh.getVerticesData(VertexBuffer.UV4Kind),\r\n uvs5: mesh.getVerticesData(VertexBuffer.UV5Kind),\r\n uvs6: mesh.getVerticesData(VertexBuffer.UV6Kind),\r\n };\r\n return this._Construct(data, ignoreWorldMatrix ? null : worldMatrix, runIndex, runOriginalID);\r\n }\r\n}\r\n\r\n/**\r\n * Checks if the Manifold library is ready\r\n * @returns true if the Manifold library is ready\r\n */\r\nexport function IsCSG2Ready() {\r\n return Manifold !== undefined;\r\n}\r\n\r\n/**\r\n * Initialize the Manifold library\r\n * @param options defines the options to use to initialize the library\r\n */\r\nexport async function InitializeCSG2Async(options?: Partial<ICSG2Options>) {\r\n const localOptions = {\r\n manifoldUrl: \"https://unpkg.com/manifold-3d@3.0.1\",\r\n ...options,\r\n };\r\n\r\n if (Manifold) {\r\n return; // Already initialized\r\n }\r\n\r\n if (ManifoldPromise) {\r\n await ManifoldPromise;\r\n return;\r\n }\r\n\r\n if (localOptions.manifoldInstance) {\r\n Manifold = localOptions.manifoldInstance;\r\n ManifoldMesh = localOptions.manifoldMeshInstance;\r\n } else {\r\n ManifoldPromise = _LoadScriptModuleAsync(\r\n `\r\n import Module from '${localOptions.manifoldUrl}/manifold.js';\r\n const wasm = await Module();\r\n wasm.setup();\r\n const {Manifold, Mesh} = wasm;\r\n const returnedValue = {Manifold, Mesh};\r\n `\r\n );\r\n\r\n const result = await ManifoldPromise;\r\n Manifold = result.Manifold;\r\n ManifoldMesh = result.Mesh;\r\n }\r\n\r\n // Reserve IDs for materials (we consider that there will be no more than 65536 materials)\r\n FirstID = Manifold.reserveIDs(65536);\r\n}\r\n"]}
|
package/Meshes/mesh.d.ts
CHANGED
|
@@ -33,16 +33,49 @@ import type { AbstractEngine } from "../Engines/abstractEngine.js";
|
|
|
33
33
|
* @internal
|
|
34
34
|
**/
|
|
35
35
|
export declare class _CreationDataStorage {
|
|
36
|
+
/**
|
|
37
|
+
*
|
|
38
|
+
*/
|
|
36
39
|
closePath?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
*
|
|
42
|
+
*/
|
|
37
43
|
closeArray?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
*
|
|
46
|
+
*/
|
|
38
47
|
idx: number[];
|
|
48
|
+
/**
|
|
49
|
+
*
|
|
50
|
+
*/
|
|
39
51
|
dashSize: number;
|
|
52
|
+
/**
|
|
53
|
+
*
|
|
54
|
+
*/
|
|
40
55
|
gapSize: number;
|
|
56
|
+
/**
|
|
57
|
+
*
|
|
58
|
+
*/
|
|
41
59
|
path3D: Path3D;
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
*/
|
|
42
63
|
pathArray: Vector3[][];
|
|
64
|
+
/**
|
|
65
|
+
*
|
|
66
|
+
*/
|
|
43
67
|
arc: number;
|
|
68
|
+
/**
|
|
69
|
+
*
|
|
70
|
+
*/
|
|
44
71
|
radius: number;
|
|
72
|
+
/**
|
|
73
|
+
*
|
|
74
|
+
*/
|
|
45
75
|
cap: number;
|
|
76
|
+
/**
|
|
77
|
+
*
|
|
78
|
+
*/
|
|
46
79
|
tessellation: number;
|
|
47
80
|
}
|
|
48
81
|
/**
|
|
@@ -72,9 +105,21 @@ declare class _InstanceDataStorage {
|
|
|
72
105
|
* @internal
|
|
73
106
|
**/
|
|
74
107
|
export declare class _InstancesBatch {
|
|
108
|
+
/**
|
|
109
|
+
*
|
|
110
|
+
*/
|
|
75
111
|
mustReturn: boolean;
|
|
112
|
+
/**
|
|
113
|
+
*
|
|
114
|
+
*/
|
|
76
115
|
visibleInstances: Nullable<InstancedMesh[]>[];
|
|
116
|
+
/**
|
|
117
|
+
*
|
|
118
|
+
*/
|
|
77
119
|
renderSelf: boolean[];
|
|
120
|
+
/**
|
|
121
|
+
*
|
|
122
|
+
*/
|
|
78
123
|
hardwareInstancedRendering: boolean[];
|
|
79
124
|
}
|
|
80
125
|
/**
|
|
@@ -876,9 +921,10 @@ export declare class Mesh extends AbstractMesh implements IGetSetVerticesData {
|
|
|
876
921
|
* Note that, under the hood, this method sets a new VertexBuffer each call.
|
|
877
922
|
* @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms
|
|
878
923
|
* @param bakeIndependentlyOfChildren indicates whether to preserve all child nodes' World Matrix during baking
|
|
924
|
+
* @param forceUnique indicates whether to force the mesh geometry to be unique
|
|
879
925
|
* @returns the current mesh
|
|
880
926
|
*/
|
|
881
|
-
bakeCurrentTransformIntoVertices(bakeIndependentlyOfChildren?: boolean): Mesh;
|
|
927
|
+
bakeCurrentTransformIntoVertices(bakeIndependentlyOfChildren?: boolean, forceUnique?: boolean): Mesh;
|
|
882
928
|
/** @internal */
|
|
883
929
|
get _positions(): Nullable<Vector3[]>;
|
|
884
930
|
/** @internal */
|
package/Meshes/mesh.js
CHANGED
|
@@ -43,9 +43,21 @@ class _InstanceDataStorage {
|
|
|
43
43
|
**/
|
|
44
44
|
export class _InstancesBatch {
|
|
45
45
|
constructor() {
|
|
46
|
+
/**
|
|
47
|
+
*
|
|
48
|
+
*/
|
|
46
49
|
this.mustReturn = false;
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
*/
|
|
47
53
|
this.visibleInstances = new Array();
|
|
54
|
+
/**
|
|
55
|
+
*
|
|
56
|
+
*/
|
|
48
57
|
this.renderSelf = [];
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
*/
|
|
49
61
|
this.hardwareInstancedRendering = [];
|
|
50
62
|
}
|
|
51
63
|
}
|
|
@@ -2413,9 +2425,13 @@ export class Mesh extends AbstractMesh {
|
|
|
2413
2425
|
* Note that, under the hood, this method sets a new VertexBuffer each call.
|
|
2414
2426
|
* @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms
|
|
2415
2427
|
* @param bakeIndependentlyOfChildren indicates whether to preserve all child nodes' World Matrix during baking
|
|
2428
|
+
* @param forceUnique indicates whether to force the mesh geometry to be unique
|
|
2416
2429
|
* @returns the current mesh
|
|
2417
2430
|
*/
|
|
2418
|
-
bakeCurrentTransformIntoVertices(bakeIndependentlyOfChildren = true) {
|
|
2431
|
+
bakeCurrentTransformIntoVertices(bakeIndependentlyOfChildren = true, forceUnique = false) {
|
|
2432
|
+
if (forceUnique) {
|
|
2433
|
+
this.makeGeometryUnique();
|
|
2434
|
+
}
|
|
2419
2435
|
this.bakeTransformIntoVertices(this.computeWorldMatrix(true));
|
|
2420
2436
|
this.resetLocalMatrix(bakeIndependentlyOfChildren);
|
|
2421
2437
|
return this;
|
|
@@ -2700,6 +2716,10 @@ export class Mesh extends AbstractMesh {
|
|
|
2700
2716
|
if (uvs) {
|
|
2701
2717
|
target.setUVs(separateVertices(uvs, 2));
|
|
2702
2718
|
}
|
|
2719
|
+
const colors = target.getColors();
|
|
2720
|
+
if (colors) {
|
|
2721
|
+
target.setColors(separateVertices(colors, 4));
|
|
2722
|
+
}
|
|
2703
2723
|
}
|
|
2704
2724
|
this.morphTargetManager.synchronize();
|
|
2705
2725
|
}
|
|
@@ -3355,6 +3375,10 @@ export class Mesh extends AbstractMesh {
|
|
|
3355
3375
|
if (uv2s) {
|
|
3356
3376
|
this.geometry.setVerticesData(VertexBuffer.UV2Kind + "_" + index, uv2s, false, 2);
|
|
3357
3377
|
}
|
|
3378
|
+
const colors = morphTarget.getColors();
|
|
3379
|
+
if (colors) {
|
|
3380
|
+
this.geometry.setVerticesData(VertexBuffer.ColorKind + index, colors, false, 4);
|
|
3381
|
+
}
|
|
3358
3382
|
}
|
|
3359
3383
|
}
|
|
3360
3384
|
else {
|
|
@@ -3374,6 +3398,9 @@ export class Mesh extends AbstractMesh {
|
|
|
3374
3398
|
if (this.geometry.isVerticesDataPresent(VertexBuffer.UV2Kind + index)) {
|
|
3375
3399
|
this.geometry.removeVerticesData(VertexBuffer.UV2Kind + "_" + index);
|
|
3376
3400
|
}
|
|
3401
|
+
if (this.geometry.isVerticesDataPresent(VertexBuffer.ColorKind + index)) {
|
|
3402
|
+
this.geometry.removeVerticesData(VertexBuffer.ColorKind + index);
|
|
3403
|
+
}
|
|
3377
3404
|
index++;
|
|
3378
3405
|
}
|
|
3379
3406
|
}
|