@@ -1148,9 +1148,9 @@ export class DrawHelper extends DrawHelperCore {
11481148 }
11491149
11501150 async drawManifoldsOrCrossSections ( inputs : Inputs . Manifold . DrawManifoldsOrCrossSectionsDto < Inputs . Manifold . ManifoldPointer | Inputs . Manifold . CrossSectionPointer , BABYLON . PBRMetallicRoughnessMaterial > ) : Promise < BABYLON . Mesh > {
1151- const options = this . deleteFaceMaterialForWorker ( inputs ) ;
1152- const decomposedMesh : Inputs . Manifold . DecomposedManifoldMeshDto [ ] = await this . manifoldWorkerManager . genericCallToWorkerPromise ( "decomposeManifoldsOrCrossSections" , inputs ) ;
1153- const meshes = decomposedMesh . map ( dec => this . handleDecomposedManifold ( dec , options ) ) ;
1151+ const safeWorkerOptions = this . getSafeWorkerOptions ( inputs ) ;
1152+ const decomposedMesh : Inputs . Manifold . DecomposedManifoldMeshDto [ ] = await this . manifoldWorkerManager . genericCallToWorkerPromise ( "decomposeManifoldsOrCrossSections" , safeWorkerOptions ) ;
1153+ const meshes = decomposedMesh . map ( dec => this . handleDecomposedManifold ( dec , inputs ) ) ;
11541154 const manifoldMeshContainer = new BABYLON . Mesh ( this . generateEntityId ( "manifoldMeshContainer" ) , this . context . scene ) ;
11551155 meshes . filter ( s => s !== undefined ) . forEach ( mesh => {
11561156 mesh . parent = manifoldMeshContainer ;
@@ -1159,29 +1159,29 @@ export class DrawHelper extends DrawHelperCore {
11591159 }
11601160
11611161 async drawManifoldOrCrossSection ( inputs : Inputs . Manifold . DrawManifoldOrCrossSectionDto < Inputs . Manifold . ManifoldPointer | Inputs . Manifold . CrossSectionPointer , BABYLON . PBRMetallicRoughnessMaterial > ) : Promise < BABYLON . Mesh > {
1162- const options = this . deleteFaceMaterialForWorker ( inputs ) ;
1163- const decomposedMesh : Inputs . Manifold . DecomposedManifoldMeshDto = await this . manifoldWorkerManager . genericCallToWorkerPromise ( "decomposeManifoldOrCrossSection" , inputs ) ;
1164- return this . handleDecomposedManifold ( decomposedMesh , options ) ;
1162+ const safeWorkerOptions = this . getSafeWorkerOptions ( inputs ) ;
1163+ const decomposedMesh : Inputs . Manifold . DecomposedManifoldMeshDto = await this . manifoldWorkerManager . genericCallToWorkerPromise ( "decomposeManifoldOrCrossSection" , safeWorkerOptions ) ;
1164+ return this . handleDecomposedManifold ( decomposedMesh , inputs ) ;
11651165 }
11661166
11671167 async drawShape ( inputs : Inputs . OCCT . DrawShapeDto < Inputs . OCCT . TopoDSShapePointer > ) : Promise < BABYLON . Mesh > {
1168- const options = this . deleteFaceMaterialForWorker ( inputs ) ;
1169- const decomposedMesh : Inputs . OCCT . DecomposedMeshDto = await this . occWorkerManager . genericCallToWorkerPromise ( "shapeToMesh" , inputs ) ;
1170- return this . handleDecomposedMesh ( inputs , decomposedMesh , options ) ;
1168+ const safeWorkerOptions = this . getSafeWorkerOptions ( inputs ) ;
1169+ const decomposedMesh : Inputs . OCCT . DecomposedMeshDto = await this . occWorkerManager . genericCallToWorkerPromise ( "shapeToMesh" , safeWorkerOptions ) ;
1170+ return this . handleDecomposedMesh ( inputs , decomposedMesh , inputs ) ;
11711171 }
11721172
11731173 async drawShapes ( inputs : Inputs . OCCT . DrawShapesDto < Inputs . OCCT . TopoDSShapePointer > ) : Promise < BABYLON . Mesh > {
1174- const options = this . deleteFaceMaterialForWorker ( inputs ) ;
1175- const meshes : Inputs . OCCT . DecomposedMeshDto [ ] = await this . occWorkerManager . genericCallToWorkerPromise ( "shapesToMeshes" , inputs ) ;
1176- const meshesSolved = await Promise . all ( meshes . map ( async decomposedMesh => this . handleDecomposedMesh ( inputs , decomposedMesh , options ) ) ) ;
1174+ const safeWorkerOptions = this . getSafeWorkerOptions ( inputs ) ;
1175+ const meshes : Inputs . OCCT . DecomposedMeshDto [ ] = await this . occWorkerManager . genericCallToWorkerPromise ( "shapesToMeshes" , safeWorkerOptions ) ;
1176+ const meshesSolved = await Promise . all ( meshes . map ( async decomposedMesh => this . handleDecomposedMesh ( inputs , decomposedMesh , inputs ) ) ) ;
11771177 const shapesMeshContainer = new BABYLON . Mesh ( this . generateEntityId ( "shapesMeshContainer" ) , this . context . scene ) ;
11781178 meshesSolved . forEach ( mesh => {
11791179 mesh . parent = shapesMeshContainer ;
11801180 } ) ;
11811181 return shapesMeshContainer ;
11821182 }
11831183
1184- private async handleDecomposedMesh ( inputs : Inputs . OCCT . DrawShapeDto < Inputs . OCCT . TopoDSShapePointer > , decomposedMesh : Inputs . OCCT . DecomposedMeshDto , options : Inputs . Draw . DrawOcctShapeOptions ) : Promise < BABYLON . Mesh > {
1184+ private async handleDecomposedMesh ( inputs : Inputs . OCCT . DrawShapeDto < Inputs . OCCT . TopoDSShapePointer > , decomposedMesh : Inputs . OCCT . DecomposedMeshDto , options : Partial < Inputs . Draw . DrawOcctShapeOptions > ) : Promise < BABYLON . Mesh > {
11851185 const shapeMesh = new BABYLON . Mesh ( this . generateEntityId ( "brepMesh" ) , this . context . scene ) ;
11861186 shapeMesh . isVisible = false ;
11871187 let dummy ;
@@ -1487,12 +1487,11 @@ export class DrawHelper extends DrawHelperCore {
14871487 return countIndices ;
14881488 }
14891489
1490- // sometimes we must delete face material property for the web worker not to complain about complex (circular) objects and use cloned object later
1491- private deleteFaceMaterialForWorker ( inputs : any ) {
1492- const options = { ...inputs } ;
1493- if ( inputs . faceMaterial ) {
1494- delete inputs . faceMaterial ;
1495- }
1496- return options ;
1490+ // Creates a shallow copy of inputs without the faceMaterial property for safe worker communication
1491+ // Workers cannot handle complex circular objects like Babylon.js materials
1492+ private getSafeWorkerOptions < T extends { faceMaterial ?: BABYLON . Material } > ( inputs : T ) : Omit < T , "faceMaterial" > {
1493+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1494+ const { faceMaterial, ...safeOptions } = inputs ;
1495+ return safeOptions as Omit < T , "faceMaterial" > ;
14971496 }
14981497}
0 commit comments