@babylonjs/core 7.30.0 → 7.31.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.
Files changed (116) hide show
  1. package/Engines/WebGPU/webgpuCacheBindGroups.js +13 -2
  2. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  3. package/Engines/WebGPU/webgpuCacheSampler.js +2 -3
  4. package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
  5. package/Engines/abstractEngine.js +2 -2
  6. package/Engines/abstractEngine.js.map +1 -1
  7. package/Materials/Background/backgroundMaterial.js +1 -11
  8. package/Materials/Background/backgroundMaterial.js.map +1 -1
  9. package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +8 -0
  10. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +43 -34
  11. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  12. package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.d.ts +32 -0
  13. package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.js +64 -0
  14. package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.js.map +1 -0
  15. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.d.ts +48 -0
  16. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js +102 -0
  17. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js.map +1 -0
  18. package/Materials/Node/Blocks/GaussianSplatting/index.d.ts +3 -0
  19. package/Materials/Node/Blocks/GaussianSplatting/index.js +4 -0
  20. package/Materials/Node/Blocks/GaussianSplatting/index.js.map +1 -0
  21. package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.d.ts +40 -0
  22. package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js +96 -0
  23. package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js.map +1 -0
  24. package/Materials/Node/Blocks/Input/inputBlock.js +6 -0
  25. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  26. package/Materials/Node/Blocks/index.d.ts +1 -0
  27. package/Materials/Node/Blocks/index.js +1 -0
  28. package/Materials/Node/Blocks/index.js.map +1 -1
  29. package/Materials/Node/Enums/nodeMaterialModes.d.ts +3 -1
  30. package/Materials/Node/Enums/nodeMaterialModes.js +2 -0
  31. package/Materials/Node/Enums/nodeMaterialModes.js.map +1 -1
  32. package/Materials/Node/index.d.ts +1 -0
  33. package/Materials/Node/index.js +1 -0
  34. package/Materials/Node/index.js.map +1 -1
  35. package/Materials/Node/nodeMaterialDefault.d.ts +6 -0
  36. package/Materials/Node/nodeMaterialDefault.js +53 -0
  37. package/Materials/Node/nodeMaterialDefault.js.map +1 -0
  38. package/Materials/PBR/pbrBaseMaterial.js +1 -11
  39. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  40. package/Materials/Textures/texture.js +7 -3
  41. package/Materials/Textures/texture.js.map +1 -1
  42. package/Materials/Textures/textureSampler.d.ts +1 -1
  43. package/Materials/Textures/textureSampler.js.map +1 -1
  44. package/Materials/material.d.ts +5 -1
  45. package/Materials/material.js +19 -1
  46. package/Materials/material.js.map +1 -1
  47. package/Materials/materialPluginManager.js +2 -2
  48. package/Materials/materialPluginManager.js.map +1 -1
  49. package/Materials/pushMaterial.d.ts +1 -1
  50. package/Materials/pushMaterial.js +2 -2
  51. package/Materials/pushMaterial.js.map +1 -1
  52. package/Materials/standardMaterial.js +1 -11
  53. package/Materials/standardMaterial.js.map +1 -1
  54. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +11 -0
  55. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +264 -61
  56. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  57. package/Meshes/Node/Blocks/Set/aggregatorBlock.d.ts +76 -0
  58. package/Meshes/Node/Blocks/Set/aggregatorBlock.js +210 -0
  59. package/Meshes/Node/Blocks/Set/aggregatorBlock.js.map +1 -0
  60. package/Meshes/Node/Blocks/booleanGeometryBlock.d.ts +6 -0
  61. package/Meshes/Node/Blocks/booleanGeometryBlock.js +16 -4
  62. package/Meshes/Node/Blocks/booleanGeometryBlock.js.map +1 -1
  63. package/Meshes/Node/Blocks/geometryTransformBlock.d.ts +6 -0
  64. package/Meshes/Node/Blocks/geometryTransformBlock.js +14 -2
  65. package/Meshes/Node/Blocks/geometryTransformBlock.js.map +1 -1
  66. package/Meshes/Node/index.d.ts +1 -0
  67. package/Meshes/Node/index.js +1 -0
  68. package/Meshes/Node/index.js.map +1 -1
  69. package/Meshes/Node/nodeGeometry.d.ts +1 -1
  70. package/Meshes/Node/nodeGeometry.js +14 -1
  71. package/Meshes/Node/nodeGeometry.js.map +1 -1
  72. package/Meshes/Node/nodeGeometryBlock.d.ts +4 -0
  73. package/Meshes/Node/nodeGeometryBlock.js +6 -0
  74. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  75. package/Meshes/csg.d.ts +1 -0
  76. package/Meshes/csg.js +1 -0
  77. package/Meshes/csg.js.map +1 -1
  78. package/Meshes/csg2.d.ts +131 -0
  79. package/Meshes/csg2.js +355 -0
  80. package/Meshes/csg2.js.map +1 -0
  81. package/Meshes/index.d.ts +1 -0
  82. package/Meshes/index.js +1 -0
  83. package/Meshes/index.js.map +1 -1
  84. package/Meshes/mesh.js +3 -1
  85. package/Meshes/mesh.js.map +1 -1
  86. package/Meshes/mesh.vertexData.d.ts +66 -1
  87. package/Meshes/mesh.vertexData.js.map +1 -1
  88. package/Misc/dumpTools.js +1 -0
  89. package/Misc/dumpTools.js.map +1 -1
  90. package/Misc/tools.d.ts +2 -1
  91. package/Misc/tools.internals.d.ts +13 -0
  92. package/Misc/tools.internals.js +48 -0
  93. package/Misc/tools.internals.js.map +1 -0
  94. package/Misc/tools.js +13 -4
  95. package/Misc/tools.js.map +1 -1
  96. package/Morph/morphTarget.js +1 -0
  97. package/Morph/morphTarget.js.map +1 -1
  98. package/Shaders/ShadersInclude/gaussianSplatting.d.ts +5 -0
  99. package/Shaders/ShadersInclude/gaussianSplatting.js +33 -0
  100. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -0
  101. package/Shaders/ShadersInclude/gaussianSplattingFragmentDeclaration.d.ts +7 -0
  102. package/Shaders/ShadersInclude/gaussianSplattingFragmentDeclaration.js +19 -0
  103. package/Shaders/ShadersInclude/gaussianSplattingFragmentDeclaration.js.map +1 -0
  104. package/Shaders/ShadersInclude/gaussianSplattingUboDeclaration.js +1 -1
  105. package/Shaders/ShadersInclude/gaussianSplattingUboDeclaration.js.map +1 -1
  106. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js +1 -2
  107. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js.map +1 -1
  108. package/Shaders/gaussianSplatting.fragment.d.ts +1 -2
  109. package/Shaders/gaussianSplatting.fragment.js +5 -10
  110. package/Shaders/gaussianSplatting.fragment.js.map +1 -1
  111. package/Shaders/gaussianSplatting.vertex.d.ts +1 -0
  112. package/Shaders/gaussianSplatting.vertex.js +4 -21
  113. package/Shaders/gaussianSplatting.vertex.js.map +1 -1
  114. package/Shaders/lod.fragment.js +1 -1
  115. package/Shaders/lod.fragment.js.map +1 -1
  116. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"nodeGeometryBlock.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/Node/nodeGeometryBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { GetClass } from \"../../Misc/typeStore\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport { UniqueIdGenerator } from \"../../Misc/uniqueIdGenerator\";\r\nimport type { NodeGeometryBlockConnectionPointTypes } from \"./Enums/nodeGeometryConnectionPointTypes\";\r\nimport { NodeGeometryConnectionPoint, NodeGeometryConnectionPointDirection } from \"./nodeGeometryBlockConnectionPoint\";\r\nimport type { NodeGeometryBuildState } from \"./nodeGeometryBuildState\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { PrecisionDate } from \"../../Misc/precisionDate\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { GeometryInputBlock } from \"./Blocks/geometryInputBlock\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Defines a block that can be used inside a node based geometry\r\n */\r\nexport class NodeGeometryBlock {\r\n private _name = \"\";\r\n private _buildId: number;\r\n protected _isInput = false;\r\n protected _isTeleportOut = false;\r\n protected _isTeleportIn = false;\r\n protected _isDebug = false;\r\n protected _isUnique = false;\r\n private _buildExecutionTime: number = 0;\r\n\r\n /**\r\n * Gets an observable raised when the block is built\r\n */\r\n public onBuildObservable = new Observable<NodeGeometryBlock>();\r\n\r\n /** @internal */\r\n public _inputs = new Array<NodeGeometryConnectionPoint>();\r\n /** @internal */\r\n public _outputs = new Array<NodeGeometryConnectionPoint>();\r\n /** @internal */\r\n public _preparationId: number;\r\n /** @internal */\r\n public _codeVariableName = \"\";\r\n\r\n /**\r\n * Gets the time spent to build this block (in ms)\r\n */\r\n public get buildExecutionTime() {\r\n return this._buildExecutionTime;\r\n }\r\n\r\n /**\r\n * Gets the list of input points\r\n */\r\n public get inputs(): NodeGeometryConnectionPoint[] {\r\n return this._inputs;\r\n }\r\n\r\n /** Gets the list of output points */\r\n public get outputs(): NodeGeometryConnectionPoint[] {\r\n return this._outputs;\r\n }\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or set the name of the block\r\n */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n public set name(value: string) {\r\n this._name = value;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is an input\r\n */\r\n public get isInput(): boolean {\r\n return this._isInput;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a teleport out\r\n */\r\n public get isTeleportOut(): boolean {\r\n return this._isTeleportOut;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a teleport in\r\n */\r\n public get isTeleportIn(): boolean {\r\n return this._isTeleportIn;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a debug block\r\n */\r\n public get isDebug(): boolean {\r\n return this._isDebug;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this block can only be used once per NodeGeometry\r\n */\r\n public get isUnique() {\r\n return this._isUnique;\r\n }\r\n\r\n /**\r\n * A free comment about the block\r\n */\r\n @serialize(\"comment\")\r\n public comments: string;\r\n\r\n /** Gets or sets a boolean indicating that this input can be edited from a collapsed frame */\r\n public visibleOnFrame = false;\r\n\r\n /**\r\n * Gets the current class name e.g. \"NodeGeometryBlock\"\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"NodeGeometryBlock\";\r\n }\r\n\r\n protected _inputRename(name: string) {\r\n return name;\r\n }\r\n\r\n protected _outputRename(name: string) {\r\n return name;\r\n }\r\n\r\n /**\r\n * Checks if the current block is an ancestor of a given block\r\n * @param block defines the potential descendant block to check\r\n * @returns true if block is a descendant\r\n */\r\n public isAnAncestorOf(block: NodeGeometryBlock): boolean {\r\n for (const output of this._outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n if (endpoint.ownerBlock === block) {\r\n return true;\r\n }\r\n if (endpoint.ownerBlock.isAnAncestorOf(block)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if the current block is an ancestor of a given type\r\n * @param type defines the potential type to check\r\n * @returns true if block is a descendant\r\n */\r\n public isAnAncestorOfType(type: string): boolean {\r\n if (this.getClassName() === type) {\r\n return true;\r\n }\r\n\r\n for (const output of this._outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n if (endpoint.ownerBlock.isAnAncestorOfType(type)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Get the first descendant using a predicate\r\n * @param predicate defines the predicate to check\r\n * @returns descendant or null if none found\r\n */\r\n public getDescendantOfPredicate(predicate: (block: NodeGeometryBlock) => boolean): Nullable<NodeGeometryBlock> {\r\n if (predicate(this)) {\r\n return this;\r\n }\r\n\r\n for (const output of this._outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n const descendant = endpoint.ownerBlock.getDescendantOfPredicate(predicate);\r\n\r\n if (descendant) {\r\n return descendant;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Creates a new NodeGeometryBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n this._name = name;\r\n this.uniqueId = UniqueIdGenerator.UniqueId;\r\n }\r\n\r\n /**\r\n * Register a new input. Must be called inside a block constructor\r\n * @param name defines the connection point name\r\n * @param type defines the connection point type\r\n * @param isOptional defines a boolean indicating that this input can be omitted\r\n * @param value value to return if there is no connection\r\n * @param valueMin min value accepted for value\r\n * @param valueMax max value accepted for value\r\n * @returns the current block\r\n */\r\n public registerInput(name: string, type: NodeGeometryBlockConnectionPointTypes, isOptional: boolean = false, value?: any, valueMin?: any, valueMax?: any) {\r\n const point = new NodeGeometryConnectionPoint(name, this, NodeGeometryConnectionPointDirection.Input);\r\n point.type = type;\r\n point.isOptional = isOptional;\r\n point.defaultValue = value;\r\n point.value = value;\r\n point.valueMin = valueMin;\r\n point.valueMax = valueMax;\r\n\r\n this._inputs.push(point);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a new output. Must be called inside a block constructor\r\n * @param name defines the connection point name\r\n * @param type defines the connection point type\r\n * @param point an already created connection point. If not provided, create a new one\r\n * @returns the current block\r\n */\r\n public registerOutput(name: string, type: NodeGeometryBlockConnectionPointTypes, point?: NodeGeometryConnectionPoint) {\r\n point = point ?? new NodeGeometryConnectionPoint(name, this, NodeGeometryConnectionPointDirection.Output);\r\n point.type = type;\r\n\r\n this._outputs.push(point);\r\n\r\n return this;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _buildBlock(state: NodeGeometryBuildState) {\r\n // Empty. Must be defined by child nodes\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _customBuildStep(state: NodeGeometryBuildState): void {\r\n // Must be implemented by children\r\n }\r\n\r\n /**\r\n * Build the current node and generate the vertex data\r\n * @param state defines the current generation state\r\n * @returns true if already built\r\n */\r\n public build(state: NodeGeometryBuildState): boolean {\r\n if (this._buildId === state.buildId) {\r\n return true;\r\n }\r\n\r\n if (this._outputs.length > 0) {\r\n if (!this._outputs.some((o) => o.hasEndpoints) && !this.isDebug) {\r\n return false;\r\n }\r\n\r\n this.outputs.forEach((o) => o._resetCounters());\r\n }\r\n\r\n this._buildId = state.buildId;\r\n\r\n // Check if \"parent\" blocks are compiled\r\n for (const input of this._inputs) {\r\n if (!input.connectedPoint) {\r\n if (!input.isOptional) {\r\n // Emit a warning\r\n state.notConnectedNonOptionalInputs.push(input);\r\n }\r\n continue;\r\n }\r\n\r\n const block = input.connectedPoint.ownerBlock;\r\n if (block && block !== this) {\r\n block.build(state);\r\n }\r\n }\r\n\r\n this._customBuildStep(state);\r\n\r\n // Logs\r\n if (state.verbose) {\r\n Logger.Log(`Building ${this.name} [${this.getClassName()}]`);\r\n }\r\n\r\n const now = PrecisionDate.Now;\r\n this._buildBlock(state);\r\n this._buildExecutionTime = PrecisionDate.Now - now;\r\n\r\n // Compile connected blocks\r\n for (const output of this._outputs) {\r\n for (const endpoint of output.endpoints) {\r\n const block = endpoint.ownerBlock;\r\n\r\n if (block) {\r\n block.build(state);\r\n }\r\n }\r\n }\r\n\r\n this.onBuildObservable.notifyObservers(this);\r\n\r\n return false;\r\n }\r\n\r\n protected _linkConnectionTypes(inputIndex0: number, inputIndex1: number, looseCoupling = false) {\r\n if (looseCoupling) {\r\n this._inputs[inputIndex1]._acceptedConnectionPointType = this._inputs[inputIndex0];\r\n } else {\r\n this._inputs[inputIndex0]._linkedConnectionSource = this._inputs[inputIndex1];\r\n }\r\n this._inputs[inputIndex1]._linkedConnectionSource = this._inputs[inputIndex0];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n */\r\n public initialize() {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Lets the block try to connect some inputs automatically\r\n */\r\n public autoConfigure() {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Find an input by its name\r\n * @param name defines the name of the input to look for\r\n * @returns the input or null if not found\r\n */\r\n public getInputByName(name: string) {\r\n const filter = this._inputs.filter((e) => e.name === name);\r\n\r\n if (filter.length) {\r\n return filter[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Find an output by its name\r\n * @param name defines the name of the output to look for\r\n * @returns the output or null if not found\r\n */\r\n public getOutputByName(name: string) {\r\n const filter = this._outputs.filter((e) => e.name === name);\r\n\r\n if (filter.length) {\r\n return filter[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Serializes this block in a JSON representation\r\n * @returns the serialized block object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n serializationObject.customType = \"BABYLON.\" + this.getClassName();\r\n serializationObject.id = this.uniqueId;\r\n serializationObject.name = this.name;\r\n serializationObject.visibleOnFrame = this.visibleOnFrame;\r\n\r\n serializationObject.inputs = [];\r\n serializationObject.outputs = [];\r\n\r\n for (const input of this.inputs) {\r\n serializationObject.inputs.push(input.serialize());\r\n }\r\n\r\n for (const output of this.outputs) {\r\n serializationObject.outputs.push(output.serialize(false));\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _deserialize(serializationObject: any) {\r\n this._name = serializationObject.name;\r\n this.comments = serializationObject.comments;\r\n this.visibleOnFrame = !!serializationObject.visibleOnFrame;\r\n this._deserializePortDisplayNamesAndExposedOnFrame(serializationObject);\r\n }\r\n\r\n private _deserializePortDisplayNamesAndExposedOnFrame(serializationObject: any) {\r\n const serializedInputs = serializationObject.inputs;\r\n const serializedOutputs = serializationObject.outputs;\r\n if (serializedInputs) {\r\n serializedInputs.forEach((port: any) => {\r\n const input = this.inputs.find((i) => i.name === port.name);\r\n\r\n if (!input) {\r\n return;\r\n }\r\n\r\n if (port.displayName) {\r\n input.displayName = port.displayName;\r\n }\r\n if (port.isExposedOnFrame) {\r\n input.isExposedOnFrame = port.isExposedOnFrame;\r\n input.exposedPortPosition = port.exposedPortPosition;\r\n }\r\n if (port.value !== undefined && port.value !== null) {\r\n if (port.valueType === \"number\") {\r\n input.value = port.value;\r\n } else {\r\n const valueType = GetClass(port.valueType);\r\n\r\n if (valueType) {\r\n input.value = valueType.FromArray(port.value);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (serializedOutputs) {\r\n serializedOutputs.forEach((port: any, i: number) => {\r\n if (port.displayName) {\r\n this.outputs[i].displayName = port.displayName;\r\n }\r\n if (port.isExposedOnFrame) {\r\n this.outputs[i].isExposedOnFrame = port.isExposedOnFrame;\r\n this.outputs[i].exposedPortPosition = port.exposedPortPosition;\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n const variableName = this._codeVariableName;\r\n return `${variableName}.visibleOnFrame = ${this.visibleOnFrame};\\n`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _dumpCodeForOutputConnections(alreadyDumped: NodeGeometryBlock[]) {\r\n let codeString = \"\";\r\n\r\n if (alreadyDumped.indexOf(this) !== -1) {\r\n return codeString;\r\n }\r\n\r\n alreadyDumped.push(this);\r\n\r\n for (const input of this.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n\r\n const connectedOutput = input.connectedPoint!;\r\n const connectedBlock = connectedOutput.ownerBlock;\r\n\r\n codeString += connectedBlock._dumpCodeForOutputConnections(alreadyDumped);\r\n codeString += `${connectedBlock._codeVariableName}.${connectedBlock._outputRename(connectedOutput.name)}.connectTo(${this._codeVariableName}.${this._inputRename(\r\n input.name\r\n )});\\n`;\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _dumpCode(uniqueNames: string[], alreadyDumped: NodeGeometryBlock[]) {\r\n alreadyDumped.push(this);\r\n\r\n // Get unique name\r\n const nameAsVariableName = this.name.replace(/[^A-Za-z_]+/g, \"\");\r\n this._codeVariableName = nameAsVariableName || `${this.getClassName()}_${this.uniqueId}`;\r\n\r\n if (uniqueNames.indexOf(this._codeVariableName) !== -1) {\r\n let index = 0;\r\n do {\r\n index++;\r\n this._codeVariableName = nameAsVariableName + index;\r\n } while (uniqueNames.indexOf(this._codeVariableName) !== -1);\r\n }\r\n\r\n uniqueNames.push(this._codeVariableName);\r\n\r\n // Declaration\r\n let codeString = `\\n// ${this.getClassName()}\\n`;\r\n if (this.comments) {\r\n codeString += `// ${this.comments}\\n`;\r\n }\r\n const className = this.getClassName();\r\n if (className === \"GeometryInputBlock\") {\r\n const block = this as unknown as GeometryInputBlock;\r\n const blockType = block.type;\r\n codeString += `var ${this._codeVariableName} = new BABYLON.GeometryInputBlock(\"${this.name}\", ${blockType});\\n`;\r\n } else {\r\n codeString += `var ${this._codeVariableName} = new BABYLON.${className}(\"${this.name}\");\\n`;\r\n }\r\n\r\n // Properties\r\n codeString += this._dumpPropertiesCode();\r\n\r\n // Inputs\r\n for (const input of this.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n\r\n const connectedOutput = input.connectedPoint!;\r\n const connectedBlock = connectedOutput.ownerBlock;\r\n\r\n if (alreadyDumped.indexOf(connectedBlock) === -1) {\r\n codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n\r\n // Outputs\r\n for (const output of this.outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n const connectedBlock = endpoint.ownerBlock;\r\n if (connectedBlock && alreadyDumped.indexOf(connectedBlock) === -1) {\r\n codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * Clone the current block to a new identical block\r\n * @returns a copy of the current block\r\n */\r\n public clone() {\r\n const serializationObject = this.serialize();\r\n\r\n const blockType = GetClass(serializationObject.customType);\r\n if (blockType) {\r\n const block: NodeGeometryBlock = new blockType();\r\n block._deserialize(serializationObject);\r\n\r\n return block;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Release resources\r\n */\r\n public dispose() {\r\n for (const input of this.inputs) {\r\n input.dispose();\r\n }\r\n\r\n for (const output of this.outputs) {\r\n output.dispose();\r\n }\r\n\r\n this.onBuildObservable.clear();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"nodeGeometryBlock.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/Node/nodeGeometryBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { GetClass } from \"../../Misc/typeStore\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport { UniqueIdGenerator } from \"../../Misc/uniqueIdGenerator\";\r\nimport type { NodeGeometryBlockConnectionPointTypes } from \"./Enums/nodeGeometryConnectionPointTypes\";\r\nimport { NodeGeometryConnectionPoint, NodeGeometryConnectionPointDirection } from \"./nodeGeometryBlockConnectionPoint\";\r\nimport type { NodeGeometryBuildState } from \"./nodeGeometryBuildState\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { PrecisionDate } from \"../../Misc/precisionDate\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { GeometryInputBlock } from \"./Blocks/geometryInputBlock\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Defines a block that can be used inside a node based geometry\r\n */\r\nexport class NodeGeometryBlock {\r\n private _name = \"\";\r\n private _buildId: number;\r\n protected _isInput = false;\r\n protected _isTeleportOut = false;\r\n protected _isTeleportIn = false;\r\n protected _isDebug = false;\r\n protected _isUnique = false;\r\n private _buildExecutionTime: number = 0;\r\n\r\n /**\r\n * Gets an observable raised when the block is built\r\n */\r\n public onBuildObservable = new Observable<NodeGeometryBlock>();\r\n\r\n /** @internal */\r\n public _inputs = new Array<NodeGeometryConnectionPoint>();\r\n /** @internal */\r\n public _outputs = new Array<NodeGeometryConnectionPoint>();\r\n /** @internal */\r\n public _preparationId: number;\r\n /** @internal */\r\n public _codeVariableName = \"\";\r\n\r\n /**\r\n * Gets the time spent to build this block (in ms)\r\n */\r\n public get buildExecutionTime() {\r\n return this._buildExecutionTime;\r\n }\r\n\r\n /**\r\n * Gets the list of input points\r\n */\r\n public get inputs(): NodeGeometryConnectionPoint[] {\r\n return this._inputs;\r\n }\r\n\r\n /** Gets the list of output points */\r\n public get outputs(): NodeGeometryConnectionPoint[] {\r\n return this._outputs;\r\n }\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or set the name of the block\r\n */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n public set name(value: string) {\r\n this._name = value;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is an input\r\n */\r\n public get isInput(): boolean {\r\n return this._isInput;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a teleport out\r\n */\r\n public get isTeleportOut(): boolean {\r\n return this._isTeleportOut;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a teleport in\r\n */\r\n public get isTeleportIn(): boolean {\r\n return this._isTeleportIn;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a debug block\r\n */\r\n public get isDebug(): boolean {\r\n return this._isDebug;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this block can only be used once per NodeGeometry\r\n */\r\n public get isUnique() {\r\n return this._isUnique;\r\n }\r\n\r\n /**\r\n * A free comment about the block\r\n */\r\n @serialize(\"comment\")\r\n public comments: string;\r\n\r\n /** Gets or sets a boolean indicating that this input can be edited from a collapsed frame */\r\n public visibleOnFrame = false;\r\n\r\n /**\r\n * Gets the current class name e.g. \"NodeGeometryBlock\"\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"NodeGeometryBlock\";\r\n }\r\n\r\n protected _inputRename(name: string) {\r\n return name;\r\n }\r\n\r\n protected _outputRename(name: string) {\r\n return name;\r\n }\r\n\r\n /**\r\n * Checks if the current block is an ancestor of a given block\r\n * @param block defines the potential descendant block to check\r\n * @returns true if block is a descendant\r\n */\r\n public isAnAncestorOf(block: NodeGeometryBlock): boolean {\r\n for (const output of this._outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n if (endpoint.ownerBlock === block) {\r\n return true;\r\n }\r\n if (endpoint.ownerBlock.isAnAncestorOf(block)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if the current block is an ancestor of a given type\r\n * @param type defines the potential type to check\r\n * @returns true if block is a descendant\r\n */\r\n public isAnAncestorOfType(type: string): boolean {\r\n if (this.getClassName() === type) {\r\n return true;\r\n }\r\n\r\n for (const output of this._outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n if (endpoint.ownerBlock.isAnAncestorOfType(type)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Get the first descendant using a predicate\r\n * @param predicate defines the predicate to check\r\n * @returns descendant or null if none found\r\n */\r\n public getDescendantOfPredicate(predicate: (block: NodeGeometryBlock) => boolean): Nullable<NodeGeometryBlock> {\r\n if (predicate(this)) {\r\n return this;\r\n }\r\n\r\n for (const output of this._outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n const descendant = endpoint.ownerBlock.getDescendantOfPredicate(predicate);\r\n\r\n if (descendant) {\r\n return descendant;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public get _isReadyState(): Nullable<Promise<void>> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Creates a new NodeGeometryBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n this._name = name;\r\n this.uniqueId = UniqueIdGenerator.UniqueId;\r\n }\r\n\r\n /**\r\n * Register a new input. Must be called inside a block constructor\r\n * @param name defines the connection point name\r\n * @param type defines the connection point type\r\n * @param isOptional defines a boolean indicating that this input can be omitted\r\n * @param value value to return if there is no connection\r\n * @param valueMin min value accepted for value\r\n * @param valueMax max value accepted for value\r\n * @returns the current block\r\n */\r\n public registerInput(name: string, type: NodeGeometryBlockConnectionPointTypes, isOptional: boolean = false, value?: any, valueMin?: any, valueMax?: any) {\r\n const point = new NodeGeometryConnectionPoint(name, this, NodeGeometryConnectionPointDirection.Input);\r\n point.type = type;\r\n point.isOptional = isOptional;\r\n point.defaultValue = value;\r\n point.value = value;\r\n point.valueMin = valueMin;\r\n point.valueMax = valueMax;\r\n\r\n this._inputs.push(point);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a new output. Must be called inside a block constructor\r\n * @param name defines the connection point name\r\n * @param type defines the connection point type\r\n * @param point an already created connection point. If not provided, create a new one\r\n * @returns the current block\r\n */\r\n public registerOutput(name: string, type: NodeGeometryBlockConnectionPointTypes, point?: NodeGeometryConnectionPoint) {\r\n point = point ?? new NodeGeometryConnectionPoint(name, this, NodeGeometryConnectionPointDirection.Output);\r\n point.type = type;\r\n\r\n this._outputs.push(point);\r\n\r\n return this;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _buildBlock(state: NodeGeometryBuildState) {\r\n // Empty. Must be defined by child nodes\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _customBuildStep(state: NodeGeometryBuildState): void {\r\n // Must be implemented by children\r\n }\r\n\r\n /**\r\n * Build the current node and generate the vertex data\r\n * @param state defines the current generation state\r\n * @returns true if already built\r\n */\r\n public build(state: NodeGeometryBuildState): boolean {\r\n if (this._buildId === state.buildId) {\r\n return true;\r\n }\r\n\r\n if (this._outputs.length > 0) {\r\n if (!this._outputs.some((o) => o.hasEndpoints) && !this.isDebug) {\r\n return false;\r\n }\r\n\r\n this.outputs.forEach((o) => o._resetCounters());\r\n }\r\n\r\n this._buildId = state.buildId;\r\n\r\n // Check if \"parent\" blocks are compiled\r\n for (const input of this._inputs) {\r\n if (!input.connectedPoint) {\r\n if (!input.isOptional) {\r\n // Emit a warning\r\n state.notConnectedNonOptionalInputs.push(input);\r\n }\r\n continue;\r\n }\r\n\r\n const block = input.connectedPoint.ownerBlock;\r\n if (block && block !== this) {\r\n block.build(state);\r\n }\r\n }\r\n\r\n this._customBuildStep(state);\r\n\r\n // Logs\r\n if (state.verbose) {\r\n Logger.Log(`Building ${this.name} [${this.getClassName()}]`);\r\n }\r\n\r\n const now = PrecisionDate.Now;\r\n this._buildBlock(state);\r\n this._buildExecutionTime = PrecisionDate.Now - now;\r\n\r\n // Compile connected blocks\r\n for (const output of this._outputs) {\r\n for (const endpoint of output.endpoints) {\r\n const block = endpoint.ownerBlock;\r\n\r\n if (block) {\r\n block.build(state);\r\n }\r\n }\r\n }\r\n\r\n this.onBuildObservable.notifyObservers(this);\r\n\r\n return false;\r\n }\r\n\r\n protected _linkConnectionTypes(inputIndex0: number, inputIndex1: number, looseCoupling = false) {\r\n if (looseCoupling) {\r\n this._inputs[inputIndex1]._acceptedConnectionPointType = this._inputs[inputIndex0];\r\n } else {\r\n this._inputs[inputIndex0]._linkedConnectionSource = this._inputs[inputIndex1];\r\n }\r\n this._inputs[inputIndex1]._linkedConnectionSource = this._inputs[inputIndex0];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n */\r\n public initialize() {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Lets the block try to connect some inputs automatically\r\n */\r\n public autoConfigure() {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Find an input by its name\r\n * @param name defines the name of the input to look for\r\n * @returns the input or null if not found\r\n */\r\n public getInputByName(name: string) {\r\n const filter = this._inputs.filter((e) => e.name === name);\r\n\r\n if (filter.length) {\r\n return filter[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Find an output by its name\r\n * @param name defines the name of the output to look for\r\n * @returns the output or null if not found\r\n */\r\n public getOutputByName(name: string) {\r\n const filter = this._outputs.filter((e) => e.name === name);\r\n\r\n if (filter.length) {\r\n return filter[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Serializes this block in a JSON representation\r\n * @returns the serialized block object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n serializationObject.customType = \"BABYLON.\" + this.getClassName();\r\n serializationObject.id = this.uniqueId;\r\n serializationObject.name = this.name;\r\n serializationObject.visibleOnFrame = this.visibleOnFrame;\r\n\r\n serializationObject.inputs = [];\r\n serializationObject.outputs = [];\r\n\r\n for (const input of this.inputs) {\r\n serializationObject.inputs.push(input.serialize());\r\n }\r\n\r\n for (const output of this.outputs) {\r\n serializationObject.outputs.push(output.serialize(false));\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _deserialize(serializationObject: any) {\r\n this._name = serializationObject.name;\r\n this.comments = serializationObject.comments;\r\n this.visibleOnFrame = !!serializationObject.visibleOnFrame;\r\n this._deserializePortDisplayNamesAndExposedOnFrame(serializationObject);\r\n }\r\n\r\n private _deserializePortDisplayNamesAndExposedOnFrame(serializationObject: any) {\r\n const serializedInputs = serializationObject.inputs;\r\n const serializedOutputs = serializationObject.outputs;\r\n if (serializedInputs) {\r\n serializedInputs.forEach((port: any) => {\r\n const input = this.inputs.find((i) => i.name === port.name);\r\n\r\n if (!input) {\r\n return;\r\n }\r\n\r\n if (port.displayName) {\r\n input.displayName = port.displayName;\r\n }\r\n if (port.isExposedOnFrame) {\r\n input.isExposedOnFrame = port.isExposedOnFrame;\r\n input.exposedPortPosition = port.exposedPortPosition;\r\n }\r\n if (port.value !== undefined && port.value !== null) {\r\n if (port.valueType === \"number\") {\r\n input.value = port.value;\r\n } else {\r\n const valueType = GetClass(port.valueType);\r\n\r\n if (valueType) {\r\n input.value = valueType.FromArray(port.value);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (serializedOutputs) {\r\n serializedOutputs.forEach((port: any, i: number) => {\r\n if (port.displayName) {\r\n this.outputs[i].displayName = port.displayName;\r\n }\r\n if (port.isExposedOnFrame) {\r\n this.outputs[i].isExposedOnFrame = port.isExposedOnFrame;\r\n this.outputs[i].exposedPortPosition = port.exposedPortPosition;\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n const variableName = this._codeVariableName;\r\n return `${variableName}.visibleOnFrame = ${this.visibleOnFrame};\\n`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _dumpCodeForOutputConnections(alreadyDumped: NodeGeometryBlock[]) {\r\n let codeString = \"\";\r\n\r\n if (alreadyDumped.indexOf(this) !== -1) {\r\n return codeString;\r\n }\r\n\r\n alreadyDumped.push(this);\r\n\r\n for (const input of this.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n\r\n const connectedOutput = input.connectedPoint!;\r\n const connectedBlock = connectedOutput.ownerBlock;\r\n\r\n codeString += connectedBlock._dumpCodeForOutputConnections(alreadyDumped);\r\n codeString += `${connectedBlock._codeVariableName}.${connectedBlock._outputRename(connectedOutput.name)}.connectTo(${this._codeVariableName}.${this._inputRename(\r\n input.name\r\n )});\\n`;\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _dumpCode(uniqueNames: string[], alreadyDumped: NodeGeometryBlock[]) {\r\n alreadyDumped.push(this);\r\n\r\n // Get unique name\r\n const nameAsVariableName = this.name.replace(/[^A-Za-z_]+/g, \"\");\r\n this._codeVariableName = nameAsVariableName || `${this.getClassName()}_${this.uniqueId}`;\r\n\r\n if (uniqueNames.indexOf(this._codeVariableName) !== -1) {\r\n let index = 0;\r\n do {\r\n index++;\r\n this._codeVariableName = nameAsVariableName + index;\r\n } while (uniqueNames.indexOf(this._codeVariableName) !== -1);\r\n }\r\n\r\n uniqueNames.push(this._codeVariableName);\r\n\r\n // Declaration\r\n let codeString = `\\n// ${this.getClassName()}\\n`;\r\n if (this.comments) {\r\n codeString += `// ${this.comments}\\n`;\r\n }\r\n const className = this.getClassName();\r\n if (className === \"GeometryInputBlock\") {\r\n const block = this as unknown as GeometryInputBlock;\r\n const blockType = block.type;\r\n codeString += `var ${this._codeVariableName} = new BABYLON.GeometryInputBlock(\"${this.name}\", ${blockType});\\n`;\r\n } else {\r\n codeString += `var ${this._codeVariableName} = new BABYLON.${className}(\"${this.name}\");\\n`;\r\n }\r\n\r\n // Properties\r\n codeString += this._dumpPropertiesCode();\r\n\r\n // Inputs\r\n for (const input of this.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n\r\n const connectedOutput = input.connectedPoint!;\r\n const connectedBlock = connectedOutput.ownerBlock;\r\n\r\n if (alreadyDumped.indexOf(connectedBlock) === -1) {\r\n codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n\r\n // Outputs\r\n for (const output of this.outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n const connectedBlock = endpoint.ownerBlock;\r\n if (connectedBlock && alreadyDumped.indexOf(connectedBlock) === -1) {\r\n codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * Clone the current block to a new identical block\r\n * @returns a copy of the current block\r\n */\r\n public clone() {\r\n const serializationObject = this.serialize();\r\n\r\n const blockType = GetClass(serializationObject.customType);\r\n if (blockType) {\r\n const block: NodeGeometryBlock = new blockType();\r\n block._deserialize(serializationObject);\r\n\r\n return block;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Release resources\r\n */\r\n public dispose() {\r\n for (const input of this.inputs) {\r\n input.dispose();\r\n }\r\n\r\n for (const output of this.outputs) {\r\n output.dispose();\r\n }\r\n\r\n this.onBuildObservable.clear();\r\n }\r\n}\r\n"]}
package/Meshes/csg.d.ts CHANGED
@@ -163,6 +163,7 @@ declare class CSGPolygon {
163
163
  }
164
164
  /**
165
165
  * Class for building Constructive Solid Geometry
166
+ * @deprecated Please use CSG2 instead
166
167
  */
167
168
  export declare class CSG {
168
169
  private _polygons;
package/Meshes/csg.js CHANGED
@@ -377,6 +377,7 @@ class Node {
377
377
  }
378
378
  /**
379
379
  * Class for building Constructive Solid Geometry
380
+ * @deprecated Please use CSG2 instead
380
381
  */
381
382
  export class CSG {
382
383
  constructor() {
package/Meshes/csg.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"csg.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/csg.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Quaternion, Matrix, Vector3, Vector2 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { VertexData } from \"./mesh.vertexData\";\r\n/**\r\n * Unique ID when we import meshes from Babylon to CSG\r\n */\r\nlet currentCSGMeshId = 0;\r\n\r\n/**\r\n * Represents a vertex of a polygon. Use your own vertex class instead of this\r\n * one to provide additional features like texture coordinates and vertex\r\n * colors. Custom vertex classes need to provide a `pos` property and `clone()`,\r\n * `flip()`, and `interpolate()` methods that behave analogous to the ones\r\n * defined by `BABYLON.CSG.Vertex`. This class provides `normal` so convenience\r\n * functions like `BABYLON.CSG.sphere()` can return a smooth vertex normal, but `normal`\r\n * is not used anywhere else.\r\n * Same goes for uv, it allows to keep the original vertex uv coordinates of the 2 meshes\r\n */\r\nclass Vertex {\r\n /**\r\n * Initializes the vertex\r\n * @param pos The position of the vertex\r\n * @param normal The normal of the vertex\r\n * @param uv The texture coordinate of the vertex\r\n * @param vertColor The RGBA color of the vertex\r\n */\r\n constructor(\r\n /**\r\n * The position of the vertex\r\n */\r\n public pos: Vector3,\r\n /**\r\n * The normal of the vertex\r\n */\r\n public normal: Vector3,\r\n /**\r\n * The texture coordinate of the vertex\r\n */\r\n public uv?: Vector2,\r\n /**\r\n * The texture coordinate of the vertex\r\n */\r\n public vertColor?: Color4\r\n ) {}\r\n\r\n /**\r\n * Make a clone, or deep copy, of the vertex\r\n * @returns A new Vertex\r\n */\r\n public clone(): Vertex {\r\n return new Vertex(this.pos.clone(), this.normal.clone(), this.uv?.clone(), this.vertColor?.clone());\r\n }\r\n\r\n /**\r\n * Invert all orientation-specific data (e.g. vertex normal). Called when the\r\n * orientation of a polygon is flipped.\r\n */\r\n public flip(): void {\r\n this.normal = this.normal.scale(-1);\r\n }\r\n\r\n /**\r\n * Create a new vertex between this vertex and `other` by linearly\r\n * interpolating all properties using a parameter of `t`. Subclasses should\r\n * override this to interpolate additional properties.\r\n * @param other the vertex to interpolate against\r\n * @param t The factor used to linearly interpolate between the vertices\r\n * @returns The new interpolated vertex\r\n */\r\n public interpolate(other: Vertex, t: number): Vertex {\r\n return new Vertex(\r\n Vector3.Lerp(this.pos, other.pos, t),\r\n Vector3.Lerp(this.normal, other.normal, t),\r\n this.uv && other.uv ? Vector2.Lerp(this.uv, other.uv, t) : undefined,\r\n this.vertColor && other.vertColor ? Color4.Lerp(this.vertColor, other.vertColor, t) : undefined\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Represents a plane in 3D space.\r\n */\r\nclass CSGPlane {\r\n /**\r\n * Initializes the plane\r\n * @param normal The normal for the plane\r\n * @param w\r\n */\r\n constructor(\r\n public normal: Vector3,\r\n public w: number\r\n ) {}\r\n\r\n /**\r\n * `CSG.Plane.EPSILON` is the tolerance used by `splitPolygon()` to decide if a\r\n * point is on the plane\r\n */\r\n static EPSILON = 1e-5;\r\n\r\n /**\r\n * Construct a plane from three points\r\n * @param a Point a\r\n * @param b Point b\r\n * @param c Point c\r\n * @returns A new plane\r\n */\r\n public static FromPoints(a: Vector3, b: Vector3, c: Vector3): Nullable<CSGPlane> {\r\n const v0 = c.subtract(a);\r\n const v1 = b.subtract(a);\r\n\r\n if (v0.lengthSquared() === 0 || v1.lengthSquared() === 0) {\r\n return null;\r\n }\r\n\r\n const n = Vector3.Normalize(Vector3.Cross(v0, v1));\r\n return new CSGPlane(n, Vector3.Dot(n, a));\r\n }\r\n\r\n /**\r\n * Clone, or make a deep copy of the plane\r\n * @returns a new Plane\r\n */\r\n public clone(): CSGPlane {\r\n return new CSGPlane(this.normal.clone(), this.w);\r\n }\r\n\r\n /**\r\n * Flip the face of the plane\r\n */\r\n public flip() {\r\n this.normal.scaleInPlace(-1);\r\n this.w = -this.w;\r\n }\r\n\r\n /**\r\n * Split `polygon` by this plane if needed, then put the polygon or polygon\r\n * fragments in the appropriate lists. Coplanar polygons go into either\r\n `* coplanarFront` or `coplanarBack` depending on their orientation with\r\n * respect to this plane. Polygons in front or in back of this plane go into\r\n * either `front` or `back`\r\n * @param polygon The polygon to be split\r\n * @param coplanarFront Will contain polygons coplanar with the plane that are oriented to the front of the plane\r\n * @param coplanarBack Will contain polygons coplanar with the plane that are oriented to the back of the plane\r\n * @param front Will contain the polygons in front of the plane\r\n * @param back Will contain the polygons begind the plane\r\n */\r\n public splitPolygon(polygon: CSGPolygon, coplanarFront: CSGPolygon[], coplanarBack: CSGPolygon[], front: CSGPolygon[], back: CSGPolygon[]): void {\r\n const COPLANAR = 0;\r\n const FRONT = 1;\r\n const BACK = 2;\r\n const SPANNING = 3;\r\n\r\n // Classify each point as well as the entire polygon into one of the above\r\n // four classes.\r\n let polygonType = 0;\r\n const types = [];\r\n let i: number;\r\n let t: number;\r\n for (i = 0; i < polygon.vertices.length; i++) {\r\n t = Vector3.Dot(this.normal, polygon.vertices[i].pos) - this.w;\r\n const type = t < -CSGPlane.EPSILON ? BACK : t > CSGPlane.EPSILON ? FRONT : COPLANAR;\r\n polygonType |= type;\r\n types.push(type);\r\n }\r\n\r\n // Put the polygon in the correct list, splitting it when necessary\r\n switch (polygonType) {\r\n case COPLANAR:\r\n (Vector3.Dot(this.normal, polygon.plane.normal) > 0 ? coplanarFront : coplanarBack).push(polygon);\r\n break;\r\n case FRONT:\r\n front.push(polygon);\r\n break;\r\n case BACK:\r\n back.push(polygon);\r\n break;\r\n case SPANNING: {\r\n const f = [],\r\n b = [];\r\n for (i = 0; i < polygon.vertices.length; i++) {\r\n const j = (i + 1) % polygon.vertices.length;\r\n const ti = types[i],\r\n tj = types[j];\r\n const vi = polygon.vertices[i],\r\n vj = polygon.vertices[j];\r\n if (ti !== BACK) {\r\n f.push(vi);\r\n }\r\n if (ti !== FRONT) {\r\n b.push(ti !== BACK ? vi.clone() : vi);\r\n }\r\n if ((ti | tj) === SPANNING) {\r\n t = (this.w - Vector3.Dot(this.normal, vi.pos)) / Vector3.Dot(this.normal, vj.pos.subtract(vi.pos));\r\n const v = vi.interpolate(vj, t);\r\n f.push(v);\r\n b.push(v.clone());\r\n }\r\n }\r\n let poly: CSGPolygon;\r\n if (f.length >= 3) {\r\n poly = new CSGPolygon(f, polygon.shared);\r\n if (poly.plane) {\r\n front.push(poly);\r\n }\r\n }\r\n\r\n if (b.length >= 3) {\r\n poly = new CSGPolygon(b, polygon.shared);\r\n\r\n if (poly.plane) {\r\n back.push(poly);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Represents a convex polygon. The vertices used to initialize a polygon must\r\n * be coplanar and form a convex loop.\r\n *\r\n * Each convex polygon has a `shared` property, which is shared between all\r\n * polygons that are clones of each other or were split from the same polygon.\r\n * This can be used to define per-polygon properties (such as surface color)\r\n */\r\nclass CSGPolygon {\r\n /**\r\n * Vertices of the polygon\r\n */\r\n public vertices: Vertex[];\r\n /**\r\n * Properties that are shared across all polygons\r\n */\r\n public shared: any;\r\n /**\r\n * A plane formed from the vertices of the polygon\r\n */\r\n public plane: CSGPlane;\r\n\r\n /**\r\n * Initializes the polygon\r\n * @param vertices The vertices of the polygon\r\n * @param shared The properties shared across all polygons\r\n */\r\n constructor(vertices: Vertex[], shared: any) {\r\n this.vertices = vertices;\r\n this.shared = shared;\r\n this.plane = <CSGPlane>CSGPlane.FromPoints(vertices[0].pos, vertices[1].pos, vertices[2].pos);\r\n }\r\n\r\n /**\r\n * Clones, or makes a deep copy, or the polygon\r\n * @returns A new CSGPolygon\r\n */\r\n public clone(): CSGPolygon {\r\n const vertices = this.vertices.map((v) => v.clone());\r\n return new CSGPolygon(vertices, this.shared);\r\n }\r\n\r\n /**\r\n * Flips the faces of the polygon\r\n */\r\n public flip() {\r\n this.vertices.reverse().map((v) => {\r\n v.flip();\r\n });\r\n this.plane.flip();\r\n }\r\n}\r\n\r\n/**\r\n * Holds a node in a BSP tree. A BSP tree is built from a collection of polygons\r\n * by picking a polygon to split along. That polygon (and all other coplanar\r\n * polygons) are added directly to that node and the other polygons are added to\r\n * the front and/or back subtrees. This is not a leafy BSP tree since there is\r\n * no distinction between internal and leaf nodes\r\n */\r\nclass Node {\r\n private _plane: Nullable<CSGPlane> = null;\r\n private _front: Nullable<Node> = null;\r\n private _back: Nullable<Node> = null;\r\n private _polygons = new Array<CSGPolygon>();\r\n\r\n /**\r\n * Initializes the node\r\n * @param polygons A collection of polygons held in the node\r\n */\r\n constructor(polygons?: Array<CSGPolygon>) {\r\n if (polygons) {\r\n this.build(polygons);\r\n }\r\n }\r\n\r\n /**\r\n * Clones, or makes a deep copy, of the node\r\n * @returns The cloned node\r\n */\r\n public clone(): Node {\r\n const node = new Node();\r\n node._plane = this._plane && this._plane.clone();\r\n node._front = this._front && this._front.clone();\r\n node._back = this._back && this._back.clone();\r\n node._polygons = this._polygons.map((p) => p.clone());\r\n return node;\r\n }\r\n\r\n /**\r\n * Convert solid space to empty space and empty space to solid space\r\n */\r\n public invert(): void {\r\n for (let i = 0; i < this._polygons.length; i++) {\r\n this._polygons[i].flip();\r\n }\r\n if (this._plane) {\r\n this._plane.flip();\r\n }\r\n if (this._front) {\r\n this._front.invert();\r\n }\r\n if (this._back) {\r\n this._back.invert();\r\n }\r\n const temp = this._front;\r\n this._front = this._back;\r\n this._back = temp;\r\n }\r\n\r\n /**\r\n * Recursively remove all polygons in `polygons` that are inside this BSP\r\n * tree.\r\n * @param polygons Polygons to remove from the BSP\r\n * @returns Polygons clipped from the BSP\r\n */\r\n clipPolygons(polygons: CSGPolygon[]): CSGPolygon[] {\r\n if (!this._plane) {\r\n return polygons.slice();\r\n }\r\n let front: CSGPolygon[] = [],\r\n back = [] as CSGPolygon[];\r\n for (let i = 0; i < polygons.length; i++) {\r\n this._plane.splitPolygon(polygons[i], front, back, front, back);\r\n }\r\n if (this._front) {\r\n front = this._front.clipPolygons(front);\r\n }\r\n if (this._back) {\r\n back = this._back.clipPolygons(back);\r\n } else {\r\n back = [];\r\n }\r\n return front.concat(back);\r\n }\r\n\r\n /**\r\n * Remove all polygons in this BSP tree that are inside the other BSP tree\r\n * `bsp`.\r\n * @param bsp BSP containing polygons to remove from this BSP\r\n */\r\n clipTo(bsp: Node): void {\r\n this._polygons = bsp.clipPolygons(this._polygons);\r\n if (this._front) {\r\n this._front.clipTo(bsp);\r\n }\r\n if (this._back) {\r\n this._back.clipTo(bsp);\r\n }\r\n }\r\n\r\n /**\r\n * Return a list of all polygons in this BSP tree\r\n * @returns List of all polygons in this BSP tree\r\n */\r\n allPolygons(): CSGPolygon[] {\r\n let polygons = this._polygons.slice();\r\n if (this._front) {\r\n polygons = polygons.concat(this._front.allPolygons());\r\n }\r\n if (this._back) {\r\n polygons = polygons.concat(this._back.allPolygons());\r\n }\r\n return polygons;\r\n }\r\n\r\n /**\r\n * Build a BSP tree out of `polygons`. When called on an existing tree, the\r\n * new polygons are filtered down to the bottom of the tree and become new\r\n * nodes there. Each set of polygons is partitioned using the first polygon\r\n * (no heuristic is used to pick a good split)\r\n * @param polygons Polygons used to construct the BSP tree\r\n */\r\n build(polygons: CSGPolygon[]): void {\r\n if (!polygons.length) {\r\n return;\r\n }\r\n if (!this._plane) {\r\n this._plane = polygons[0].plane.clone();\r\n }\r\n const front: CSGPolygon[] = [],\r\n back = [] as CSGPolygon[];\r\n for (let i = 0; i < polygons.length; i++) {\r\n this._plane.splitPolygon(polygons[i], this._polygons, this._polygons, front, back);\r\n }\r\n if (front.length) {\r\n if (!this._front) {\r\n this._front = new Node();\r\n }\r\n this._front.build(front);\r\n }\r\n if (back.length) {\r\n if (!this._back) {\r\n this._back = new Node();\r\n }\r\n this._back.build(back);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Class for building Constructive Solid Geometry\r\n */\r\nexport class CSG {\r\n private _polygons = new Array<CSGPolygon>();\r\n /**\r\n * The world matrix\r\n */\r\n public matrix: Matrix;\r\n /**\r\n * Stores the position\r\n */\r\n public position: Vector3;\r\n /**\r\n * Stores the rotation\r\n */\r\n public rotation: Vector3;\r\n /**\r\n * Stores the rotation quaternion\r\n */\r\n public rotationQuaternion: Nullable<Quaternion>;\r\n /**\r\n * Stores the scaling vector\r\n */\r\n public scaling: Vector3;\r\n\r\n /**\r\n * Convert a VertexData to CSG\r\n * @param data defines the VertexData to convert to CSG\r\n * @returns the new CSG\r\n */\r\n public static FromVertexData(data: VertexData): CSG {\r\n let vertex: Vertex, polygon: CSGPolygon, vertices: Vertex[];\r\n const polygons: CSGPolygon[] = [];\r\n\r\n const indices = data.indices;\r\n const positions = data.positions;\r\n const normals = data.normals;\r\n const uvs = data.uvs;\r\n const vertColors = data.colors;\r\n\r\n if (!indices || !positions) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"BABYLON.CSG: VertexData must at least contain positions and indices\";\r\n }\r\n\r\n for (let i = 0; i < indices.length; i += 3) {\r\n vertices = [];\r\n for (let j = 0; j < 3; j++) {\r\n const indexIndices = i + j;\r\n const offset = indices[indexIndices];\r\n\r\n const normal = normals ? Vector3.FromArray(normals, offset * 3) : Vector3.Zero();\r\n const uv = uvs ? Vector2.FromArray(uvs, offset * 2) : undefined;\r\n const vertColor = vertColors ? Color4.FromArray(vertColors, offset * 4) : undefined;\r\n\r\n const position = Vector3.FromArray(positions, offset * 3);\r\n\r\n vertex = new Vertex(position, normal, uv, vertColor);\r\n vertices.push(vertex);\r\n }\r\n\r\n polygon = new CSGPolygon(vertices, { subMeshId: 0, meshId: currentCSGMeshId, materialIndex: 0 });\r\n\r\n // To handle the case of degenerated triangle\r\n // polygon.plane == null <=> the polygon does not represent 1 single plane <=> the triangle is degenerated\r\n if (polygon.plane) {\r\n polygons.push(polygon);\r\n }\r\n }\r\n\r\n const csg = CSG._FromPolygons(polygons);\r\n csg.matrix = Matrix.Identity();\r\n csg.position = Vector3.Zero();\r\n csg.rotation = Vector3.Zero();\r\n csg.scaling = Vector3.One();\r\n csg.rotationQuaternion = Quaternion.Identity();\r\n currentCSGMeshId++;\r\n\r\n return csg;\r\n }\r\n\r\n /**\r\n * Convert the Mesh to CSG\r\n * @param mesh The Mesh to convert to CSG\r\n * @param absolute If true, the final (local) matrix transformation is set to the identity and not to that of `mesh`. It can help when dealing with right-handed meshes (default: false)\r\n * @returns A new CSG from the Mesh\r\n */\r\n public static FromMesh(mesh: Mesh, absolute = false): CSG {\r\n let vertex: Vertex,\r\n normal: Vector3,\r\n uv: Vector2 | undefined = undefined,\r\n position: Vector3,\r\n vertColor: Color4 | undefined = undefined,\r\n polygon: CSGPolygon,\r\n vertices: Vertex[];\r\n const polygons: CSGPolygon[] = [];\r\n let matrix: Matrix,\r\n meshPosition: Vector3,\r\n meshRotation: Vector3,\r\n meshRotationQuaternion: Nullable<Quaternion> = null,\r\n meshScaling: Vector3;\r\n\r\n let invertWinding = false;\r\n if (mesh instanceof Mesh) {\r\n mesh.computeWorldMatrix(true);\r\n matrix = mesh.getWorldMatrix();\r\n meshPosition = mesh.position.clone();\r\n meshRotation = mesh.rotation.clone();\r\n if (mesh.rotationQuaternion) {\r\n meshRotationQuaternion = mesh.rotationQuaternion.clone();\r\n }\r\n meshScaling = mesh.scaling.clone();\r\n if (mesh.material && absolute) {\r\n invertWinding = mesh.material.sideOrientation === Constants.MATERIAL_ClockWiseSideOrientation;\r\n }\r\n } else {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"BABYLON.CSG: Wrong Mesh type, must be BABYLON.Mesh\";\r\n }\r\n\r\n const indices = mesh.getIndices(),\r\n positions = mesh.getVerticesData(VertexBuffer.PositionKind),\r\n normals = mesh.getVerticesData(VertexBuffer.NormalKind),\r\n uvs = mesh.getVerticesData(VertexBuffer.UVKind),\r\n vertColors = mesh.getVerticesData(VertexBuffer.ColorKind);\r\n\r\n if (indices === null) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"BABYLON.CSG: Mesh has no indices\";\r\n }\r\n if (positions === null) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"BABYLON.CSG: Mesh has no positions\";\r\n }\r\n if (normals === null) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"BABYLON.CSG: Mesh has no normals\";\r\n }\r\n\r\n const subMeshes = mesh.subMeshes;\r\n\r\n for (let sm = 0, sml = subMeshes.length; sm < sml; sm++) {\r\n for (let i = subMeshes[sm].indexStart, il = subMeshes[sm].indexCount + subMeshes[sm].indexStart; i < il; i += 3) {\r\n vertices = [];\r\n for (let j = 0; j < 3; j++) {\r\n const indexIndices = j === 0 ? i + j : invertWinding ? i + 3 - j : i + j;\r\n const sourceNormal = new Vector3(normals[indices[indexIndices] * 3], normals[indices[indexIndices] * 3 + 1], normals[indices[indexIndices] * 3 + 2]);\r\n if (uvs) {\r\n uv = new Vector2(uvs[indices[indexIndices] * 2], uvs[indices[indexIndices] * 2 + 1]);\r\n }\r\n if (vertColors) {\r\n vertColor = new Color4(\r\n vertColors[indices[indexIndices] * 4],\r\n vertColors[indices[indexIndices] * 4 + 1],\r\n vertColors[indices[indexIndices] * 4 + 2],\r\n vertColors[indices[indexIndices] * 4 + 3]\r\n );\r\n }\r\n const sourcePosition = new Vector3(positions[indices[indexIndices] * 3], positions[indices[indexIndices] * 3 + 1], positions[indices[indexIndices] * 3 + 2]);\r\n position = Vector3.TransformCoordinates(sourcePosition, matrix);\r\n normal = Vector3.TransformNormal(sourceNormal, matrix);\r\n\r\n vertex = new Vertex(position, normal, uv, vertColor);\r\n vertices.push(vertex);\r\n }\r\n\r\n polygon = new CSGPolygon(vertices, { subMeshId: sm, meshId: currentCSGMeshId, materialIndex: subMeshes[sm].materialIndex });\r\n\r\n // To handle the case of degenerated triangle\r\n // polygon.plane == null <=> the polygon does not represent 1 single plane <=> the triangle is degenerated\r\n if (polygon.plane) {\r\n polygons.push(polygon);\r\n }\r\n }\r\n }\r\n\r\n const csg = CSG._FromPolygons(polygons);\r\n csg.matrix = absolute ? Matrix.Identity() : matrix;\r\n csg.position = absolute ? Vector3.Zero() : meshPosition;\r\n csg.rotation = absolute ? Vector3.Zero() : meshRotation;\r\n csg.scaling = absolute ? Vector3.One() : meshScaling;\r\n csg.rotationQuaternion = absolute && meshRotationQuaternion ? Quaternion.Identity() : meshRotationQuaternion;\r\n currentCSGMeshId++;\r\n\r\n return csg;\r\n }\r\n\r\n /**\r\n * Construct a CSG solid from a list of `CSG.Polygon` instances.\r\n * @param polygons Polygons used to construct a CSG solid\r\n * @returns A new CSG solid\r\n */\r\n private static _FromPolygons(polygons: CSGPolygon[]): CSG {\r\n const csg = new CSG();\r\n csg._polygons = polygons;\r\n return csg;\r\n }\r\n\r\n /**\r\n * Clones, or makes a deep copy, of the CSG\r\n * @returns A new CSG\r\n */\r\n public clone(): CSG {\r\n const csg = new CSG();\r\n csg._polygons = this._polygons.map((p) => p.clone());\r\n csg.copyTransformAttributes(this);\r\n return csg;\r\n }\r\n\r\n /**\r\n * Unions this CSG with another CSG\r\n * @param csg The CSG to union against this CSG\r\n * @returns The unioned CSG\r\n */\r\n public union(csg: CSG): CSG {\r\n const a = new Node(this.clone()._polygons);\r\n const b = new Node(csg.clone()._polygons);\r\n a.clipTo(b);\r\n b.clipTo(a);\r\n b.invert();\r\n b.clipTo(a);\r\n b.invert();\r\n a.build(b.allPolygons());\r\n return CSG._FromPolygons(a.allPolygons()).copyTransformAttributes(this);\r\n }\r\n\r\n /**\r\n * Unions this CSG with another CSG in place\r\n * @param csg The CSG to union against this CSG\r\n */\r\n public unionInPlace(csg: CSG): void {\r\n const a = new Node(this._polygons);\r\n const b = new Node(csg._polygons);\r\n\r\n a.clipTo(b);\r\n b.clipTo(a);\r\n b.invert();\r\n b.clipTo(a);\r\n b.invert();\r\n a.build(b.allPolygons());\r\n\r\n this._polygons = a.allPolygons();\r\n }\r\n\r\n /**\r\n * Subtracts this CSG with another CSG\r\n * @param csg The CSG to subtract against this CSG\r\n * @returns A new CSG\r\n */\r\n public subtract(csg: CSG): CSG {\r\n const a = new Node(this.clone()._polygons);\r\n const b = new Node(csg.clone()._polygons);\r\n a.invert();\r\n a.clipTo(b);\r\n b.clipTo(a);\r\n b.invert();\r\n b.clipTo(a);\r\n b.invert();\r\n a.build(b.allPolygons());\r\n a.invert();\r\n return CSG._FromPolygons(a.allPolygons()).copyTransformAttributes(this);\r\n }\r\n\r\n /**\r\n * Subtracts this CSG with another CSG in place\r\n * @param csg The CSG to subtract against this CSG\r\n */\r\n public subtractInPlace(csg: CSG): void {\r\n const a = new Node(this._polygons);\r\n const b = new Node(csg._polygons);\r\n\r\n a.invert();\r\n a.clipTo(b);\r\n b.clipTo(a);\r\n b.invert();\r\n b.clipTo(a);\r\n b.invert();\r\n a.build(b.allPolygons());\r\n a.invert();\r\n\r\n this._polygons = a.allPolygons();\r\n }\r\n\r\n /**\r\n * Intersect this CSG with another CSG\r\n * @param csg The CSG to intersect against this CSG\r\n * @returns A new CSG\r\n */\r\n public intersect(csg: CSG): CSG {\r\n const a = new Node(this.clone()._polygons);\r\n const b = new Node(csg.clone()._polygons);\r\n a.invert();\r\n b.clipTo(a);\r\n b.invert();\r\n a.clipTo(b);\r\n b.clipTo(a);\r\n a.build(b.allPolygons());\r\n a.invert();\r\n return CSG._FromPolygons(a.allPolygons()).copyTransformAttributes(this);\r\n }\r\n\r\n /**\r\n * Intersects this CSG with another CSG in place\r\n * @param csg The CSG to intersect against this CSG\r\n */\r\n public intersectInPlace(csg: CSG): void {\r\n const a = new Node(this._polygons);\r\n const b = new Node(csg._polygons);\r\n\r\n a.invert();\r\n b.clipTo(a);\r\n b.invert();\r\n a.clipTo(b);\r\n b.clipTo(a);\r\n a.build(b.allPolygons());\r\n a.invert();\r\n\r\n this._polygons = a.allPolygons();\r\n }\r\n\r\n /**\r\n * Return a new CSG solid with solid and empty space switched. This solid is\r\n * not modified.\r\n * @returns A new CSG solid with solid and empty space switched\r\n */\r\n public inverse(): CSG {\r\n const csg = this.clone();\r\n csg.inverseInPlace();\r\n return csg;\r\n }\r\n\r\n /**\r\n * Inverses the CSG in place\r\n */\r\n public inverseInPlace(): void {\r\n this._polygons.map((p) => {\r\n p.flip();\r\n });\r\n }\r\n\r\n /**\r\n * This is used to keep meshes transformations so they can be restored\r\n * when we build back a Babylon Mesh\r\n * NB : All CSG operations are performed in world coordinates\r\n * @param csg The CSG to copy the transform attributes from\r\n * @returns This CSG\r\n */\r\n public copyTransformAttributes(csg: CSG): CSG {\r\n this.matrix = csg.matrix;\r\n this.position = csg.position;\r\n this.rotation = csg.rotation;\r\n this.scaling = csg.scaling;\r\n this.rotationQuaternion = csg.rotationQuaternion;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Build vertex data from CSG\r\n * Coordinates here are in world space\r\n * @param onBeforePolygonProcessing called before each polygon is being processed\r\n * @param onAfterPolygonProcessing called after each polygon has been processed\r\n * @returns the final vertex data\r\n */\r\n public toVertexData(onBeforePolygonProcessing: Nullable<(polygon: CSGPolygon) => void> = null, onAfterPolygonProcessing: Nullable<() => void> = null): VertexData {\r\n const matrix = this.matrix.clone();\r\n matrix.invert();\r\n\r\n const polygons = this._polygons;\r\n const vertices = [];\r\n const indices = [];\r\n const normals = [];\r\n let uvs: Nullable<number[]> = null;\r\n let vertColors: Nullable<number[]> = null;\r\n const vertex = Vector3.Zero();\r\n const normal = Vector3.Zero();\r\n const uv = Vector2.Zero();\r\n const vertColor = new Color4(0, 0, 0, 0);\r\n const polygonIndices = [0, 0, 0];\r\n const vertice_dict = {};\r\n let vertex_idx;\r\n\r\n for (let i = 0, il = polygons.length; i < il; i++) {\r\n const polygon = polygons[i];\r\n\r\n if (onBeforePolygonProcessing) {\r\n onBeforePolygonProcessing(polygon);\r\n }\r\n\r\n for (let j = 2, jl = polygon.vertices.length; j < jl; j++) {\r\n polygonIndices[0] = 0;\r\n polygonIndices[1] = j - 1;\r\n polygonIndices[2] = j;\r\n\r\n for (let k = 0; k < 3; k++) {\r\n vertex.copyFrom(polygon.vertices[polygonIndices[k]].pos);\r\n normal.copyFrom(polygon.vertices[polygonIndices[k]].normal);\r\n if (polygon.vertices[polygonIndices[k]].uv) {\r\n if (!uvs) {\r\n uvs = [];\r\n }\r\n uv.copyFrom(polygon.vertices[polygonIndices[k]].uv!);\r\n }\r\n\r\n if (polygon.vertices[polygonIndices[k]].vertColor) {\r\n if (!vertColors) {\r\n vertColors = [];\r\n }\r\n vertColor.copyFrom(polygon.vertices[polygonIndices[k]].vertColor!);\r\n }\r\n const localVertex = Vector3.TransformCoordinates(vertex, matrix);\r\n const localNormal = Vector3.TransformNormal(normal, matrix);\r\n\r\n vertex_idx = (<any>vertice_dict)[localVertex.x + \",\" + localVertex.y + \",\" + localVertex.z];\r\n\r\n let areUvsDifferent = false;\r\n\r\n if (uvs && !(uvs[vertex_idx * 2] === uv.x || uvs[vertex_idx * 2 + 1] === uv.y)) {\r\n areUvsDifferent = true;\r\n }\r\n\r\n let areColorsDifferent = false;\r\n\r\n if (\r\n vertColors &&\r\n !(\r\n vertColors[vertex_idx * 4] === vertColor.r ||\r\n vertColors[vertex_idx * 4 + 1] === vertColor.g ||\r\n vertColors[vertex_idx * 4 + 2] === vertColor.b ||\r\n vertColors[vertex_idx * 4 + 3] === vertColor.a\r\n )\r\n ) {\r\n areColorsDifferent = true;\r\n }\r\n\r\n // Check if 2 points can be merged\r\n if (\r\n !(\r\n typeof vertex_idx !== \"undefined\" &&\r\n normals[vertex_idx * 3] === localNormal.x &&\r\n normals[vertex_idx * 3 + 1] === localNormal.y &&\r\n normals[vertex_idx * 3 + 2] === localNormal.z\r\n ) ||\r\n areUvsDifferent ||\r\n areColorsDifferent\r\n ) {\r\n vertices.push(localVertex.x, localVertex.y, localVertex.z);\r\n if (uvs) {\r\n uvs.push(uv.x, uv.y);\r\n }\r\n normals.push(normal.x, normal.y, normal.z);\r\n if (vertColors) {\r\n vertColors.push(vertColor.r, vertColor.g, vertColor.b, vertColor.a);\r\n }\r\n vertex_idx = (<any>vertice_dict)[localVertex.x + \",\" + localVertex.y + \",\" + localVertex.z] = vertices.length / 3 - 1;\r\n }\r\n\r\n indices.push(vertex_idx);\r\n\r\n if (onAfterPolygonProcessing) {\r\n onAfterPolygonProcessing();\r\n }\r\n }\r\n }\r\n }\r\n\r\n const result = new VertexData();\r\n result.positions = vertices;\r\n result.normals = normals;\r\n if (uvs) {\r\n result.uvs = uvs;\r\n }\r\n if (vertColors) {\r\n result.colors = vertColors;\r\n }\r\n result.indices = indices;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Build Raw mesh from CSG\r\n * Coordinates here are in world space\r\n * @param name The name of the mesh geometry\r\n * @param scene The Scene\r\n * @param keepSubMeshes Specifies if the submeshes should be kept\r\n * @returns A new Mesh\r\n */\r\n public buildMeshGeometry(name: string, scene?: Scene, keepSubMeshes?: boolean): Mesh {\r\n const mesh = new Mesh(name, scene);\r\n const polygons = this._polygons;\r\n let currentIndex = 0;\r\n const subMeshDict = {};\r\n let subMeshObj: {\r\n materialIndex: number;\r\n indexStart: number;\r\n indexEnd: number;\r\n };\r\n\r\n if (keepSubMeshes) {\r\n // Sort Polygons, since subMeshes are indices range\r\n polygons.sort((a, b) => {\r\n if (a.shared.meshId === b.shared.meshId) {\r\n return a.shared.subMeshId - b.shared.subMeshId;\r\n } else {\r\n return a.shared.meshId - b.shared.meshId;\r\n }\r\n });\r\n }\r\n\r\n const vertexData = this.toVertexData(\r\n (polygon) => {\r\n // Building SubMeshes\r\n if (!(<any>subMeshDict)[polygon.shared.meshId]) {\r\n (<any>subMeshDict)[polygon.shared.meshId] = {};\r\n }\r\n if (!(<any>subMeshDict)[polygon.shared.meshId][polygon.shared.subMeshId]) {\r\n (<any>subMeshDict)[polygon.shared.meshId][polygon.shared.subMeshId] = {\r\n indexStart: +Infinity,\r\n indexEnd: -Infinity,\r\n materialIndex: polygon.shared.materialIndex,\r\n };\r\n }\r\n subMeshObj = (<any>subMeshDict)[polygon.shared.meshId][polygon.shared.subMeshId];\r\n },\r\n () => {\r\n subMeshObj.indexStart = Math.min(currentIndex, subMeshObj.indexStart);\r\n subMeshObj.indexEnd = Math.max(currentIndex, subMeshObj.indexEnd);\r\n currentIndex++;\r\n }\r\n );\r\n\r\n vertexData.applyToMesh(mesh);\r\n\r\n if (keepSubMeshes) {\r\n // We offset the materialIndex by the previous number of materials in the CSG mixed meshes\r\n let materialIndexOffset = 0,\r\n materialMaxIndex;\r\n\r\n mesh.subMeshes = [] as SubMesh[];\r\n\r\n for (const m in subMeshDict) {\r\n materialMaxIndex = -1;\r\n for (const sm in (<any>subMeshDict)[m]) {\r\n subMeshObj = (<any>subMeshDict)[m][sm];\r\n SubMesh.CreateFromIndices(\r\n subMeshObj.materialIndex + materialIndexOffset,\r\n subMeshObj.indexStart,\r\n subMeshObj.indexEnd - subMeshObj.indexStart + 1,\r\n <AbstractMesh>mesh\r\n );\r\n materialMaxIndex = Math.max(subMeshObj.materialIndex, materialMaxIndex);\r\n }\r\n materialIndexOffset += ++materialMaxIndex;\r\n }\r\n }\r\n\r\n return mesh;\r\n }\r\n\r\n /**\r\n * Build Mesh from CSG taking material and transforms into account\r\n * @param name The name of the Mesh\r\n * @param material The material of the Mesh\r\n * @param scene The Scene\r\n * @param keepSubMeshes Specifies if submeshes should be kept\r\n * @returns The new Mesh\r\n */\r\n public toMesh(name: string, material: Nullable<Material> = null, scene?: Scene, keepSubMeshes?: boolean): Mesh {\r\n const mesh = this.buildMeshGeometry(name, scene, keepSubMeshes);\r\n\r\n mesh.material = material;\r\n\r\n mesh.position.copyFrom(this.position);\r\n mesh.rotation.copyFrom(this.rotation);\r\n if (this.rotationQuaternion) {\r\n mesh.rotationQuaternion = this.rotationQuaternion.clone();\r\n }\r\n mesh.scaling.copyFrom(this.scaling);\r\n mesh.computeWorldMatrix(true);\r\n\r\n return mesh;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"csg.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/csg.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Quaternion, Matrix, Vector3, Vector2 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { VertexData } from \"./mesh.vertexData\";\r\n/**\r\n * Unique ID when we import meshes from Babylon to CSG\r\n */\r\nlet currentCSGMeshId = 0;\r\n\r\n/**\r\n * Represents a vertex of a polygon. Use your own vertex class instead of this\r\n * one to provide additional features like texture coordinates and vertex\r\n * colors. Custom vertex classes need to provide a `pos` property and `clone()`,\r\n * `flip()`, and `interpolate()` methods that behave analogous to the ones\r\n * defined by `BABYLON.CSG.Vertex`. This class provides `normal` so convenience\r\n * functions like `BABYLON.CSG.sphere()` can return a smooth vertex normal, but `normal`\r\n * is not used anywhere else.\r\n * Same goes for uv, it allows to keep the original vertex uv coordinates of the 2 meshes\r\n */\r\nclass Vertex {\r\n /**\r\n * Initializes the vertex\r\n * @param pos The position of the vertex\r\n * @param normal The normal of the vertex\r\n * @param uv The texture coordinate of the vertex\r\n * @param vertColor The RGBA color of the vertex\r\n */\r\n constructor(\r\n /**\r\n * The position of the vertex\r\n */\r\n public pos: Vector3,\r\n /**\r\n * The normal of the vertex\r\n */\r\n public normal: Vector3,\r\n /**\r\n * The texture coordinate of the vertex\r\n */\r\n public uv?: Vector2,\r\n /**\r\n * The texture coordinate of the vertex\r\n */\r\n public vertColor?: Color4\r\n ) {}\r\n\r\n /**\r\n * Make a clone, or deep copy, of the vertex\r\n * @returns A new Vertex\r\n */\r\n public clone(): Vertex {\r\n return new Vertex(this.pos.clone(), this.normal.clone(), this.uv?.clone(), this.vertColor?.clone());\r\n }\r\n\r\n /**\r\n * Invert all orientation-specific data (e.g. vertex normal). Called when the\r\n * orientation of a polygon is flipped.\r\n */\r\n public flip(): void {\r\n this.normal = this.normal.scale(-1);\r\n }\r\n\r\n /**\r\n * Create a new vertex between this vertex and `other` by linearly\r\n * interpolating all properties using a parameter of `t`. Subclasses should\r\n * override this to interpolate additional properties.\r\n * @param other the vertex to interpolate against\r\n * @param t The factor used to linearly interpolate between the vertices\r\n * @returns The new interpolated vertex\r\n */\r\n public interpolate(other: Vertex, t: number): Vertex {\r\n return new Vertex(\r\n Vector3.Lerp(this.pos, other.pos, t),\r\n Vector3.Lerp(this.normal, other.normal, t),\r\n this.uv && other.uv ? Vector2.Lerp(this.uv, other.uv, t) : undefined,\r\n this.vertColor && other.vertColor ? Color4.Lerp(this.vertColor, other.vertColor, t) : undefined\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Represents a plane in 3D space.\r\n */\r\nclass CSGPlane {\r\n /**\r\n * Initializes the plane\r\n * @param normal The normal for the plane\r\n * @param w\r\n */\r\n constructor(\r\n public normal: Vector3,\r\n public w: number\r\n ) {}\r\n\r\n /**\r\n * `CSG.Plane.EPSILON` is the tolerance used by `splitPolygon()` to decide if a\r\n * point is on the plane\r\n */\r\n static EPSILON = 1e-5;\r\n\r\n /**\r\n * Construct a plane from three points\r\n * @param a Point a\r\n * @param b Point b\r\n * @param c Point c\r\n * @returns A new plane\r\n */\r\n public static FromPoints(a: Vector3, b: Vector3, c: Vector3): Nullable<CSGPlane> {\r\n const v0 = c.subtract(a);\r\n const v1 = b.subtract(a);\r\n\r\n if (v0.lengthSquared() === 0 || v1.lengthSquared() === 0) {\r\n return null;\r\n }\r\n\r\n const n = Vector3.Normalize(Vector3.Cross(v0, v1));\r\n return new CSGPlane(n, Vector3.Dot(n, a));\r\n }\r\n\r\n /**\r\n * Clone, or make a deep copy of the plane\r\n * @returns a new Plane\r\n */\r\n public clone(): CSGPlane {\r\n return new CSGPlane(this.normal.clone(), this.w);\r\n }\r\n\r\n /**\r\n * Flip the face of the plane\r\n */\r\n public flip() {\r\n this.normal.scaleInPlace(-1);\r\n this.w = -this.w;\r\n }\r\n\r\n /**\r\n * Split `polygon` by this plane if needed, then put the polygon or polygon\r\n * fragments in the appropriate lists. Coplanar polygons go into either\r\n `* coplanarFront` or `coplanarBack` depending on their orientation with\r\n * respect to this plane. Polygons in front or in back of this plane go into\r\n * either `front` or `back`\r\n * @param polygon The polygon to be split\r\n * @param coplanarFront Will contain polygons coplanar with the plane that are oriented to the front of the plane\r\n * @param coplanarBack Will contain polygons coplanar with the plane that are oriented to the back of the plane\r\n * @param front Will contain the polygons in front of the plane\r\n * @param back Will contain the polygons begind the plane\r\n */\r\n public splitPolygon(polygon: CSGPolygon, coplanarFront: CSGPolygon[], coplanarBack: CSGPolygon[], front: CSGPolygon[], back: CSGPolygon[]): void {\r\n const COPLANAR = 0;\r\n const FRONT = 1;\r\n const BACK = 2;\r\n const SPANNING = 3;\r\n\r\n // Classify each point as well as the entire polygon into one of the above\r\n // four classes.\r\n let polygonType = 0;\r\n const types = [];\r\n let i: number;\r\n let t: number;\r\n for (i = 0; i < polygon.vertices.length; i++) {\r\n t = Vector3.Dot(this.normal, polygon.vertices[i].pos) - this.w;\r\n const type = t < -CSGPlane.EPSILON ? BACK : t > CSGPlane.EPSILON ? FRONT : COPLANAR;\r\n polygonType |= type;\r\n types.push(type);\r\n }\r\n\r\n // Put the polygon in the correct list, splitting it when necessary\r\n switch (polygonType) {\r\n case COPLANAR:\r\n (Vector3.Dot(this.normal, polygon.plane.normal) > 0 ? coplanarFront : coplanarBack).push(polygon);\r\n break;\r\n case FRONT:\r\n front.push(polygon);\r\n break;\r\n case BACK:\r\n back.push(polygon);\r\n break;\r\n case SPANNING: {\r\n const f = [],\r\n b = [];\r\n for (i = 0; i < polygon.vertices.length; i++) {\r\n const j = (i + 1) % polygon.vertices.length;\r\n const ti = types[i],\r\n tj = types[j];\r\n const vi = polygon.vertices[i],\r\n vj = polygon.vertices[j];\r\n if (ti !== BACK) {\r\n f.push(vi);\r\n }\r\n if (ti !== FRONT) {\r\n b.push(ti !== BACK ? vi.clone() : vi);\r\n }\r\n if ((ti | tj) === SPANNING) {\r\n t = (this.w - Vector3.Dot(this.normal, vi.pos)) / Vector3.Dot(this.normal, vj.pos.subtract(vi.pos));\r\n const v = vi.interpolate(vj, t);\r\n f.push(v);\r\n b.push(v.clone());\r\n }\r\n }\r\n let poly: CSGPolygon;\r\n if (f.length >= 3) {\r\n poly = new CSGPolygon(f, polygon.shared);\r\n if (poly.plane) {\r\n front.push(poly);\r\n }\r\n }\r\n\r\n if (b.length >= 3) {\r\n poly = new CSGPolygon(b, polygon.shared);\r\n\r\n if (poly.plane) {\r\n back.push(poly);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Represents a convex polygon. The vertices used to initialize a polygon must\r\n * be coplanar and form a convex loop.\r\n *\r\n * Each convex polygon has a `shared` property, which is shared between all\r\n * polygons that are clones of each other or were split from the same polygon.\r\n * This can be used to define per-polygon properties (such as surface color)\r\n */\r\nclass CSGPolygon {\r\n /**\r\n * Vertices of the polygon\r\n */\r\n public vertices: Vertex[];\r\n /**\r\n * Properties that are shared across all polygons\r\n */\r\n public shared: any;\r\n /**\r\n * A plane formed from the vertices of the polygon\r\n */\r\n public plane: CSGPlane;\r\n\r\n /**\r\n * Initializes the polygon\r\n * @param vertices The vertices of the polygon\r\n * @param shared The properties shared across all polygons\r\n */\r\n constructor(vertices: Vertex[], shared: any) {\r\n this.vertices = vertices;\r\n this.shared = shared;\r\n this.plane = <CSGPlane>CSGPlane.FromPoints(vertices[0].pos, vertices[1].pos, vertices[2].pos);\r\n }\r\n\r\n /**\r\n * Clones, or makes a deep copy, or the polygon\r\n * @returns A new CSGPolygon\r\n */\r\n public clone(): CSGPolygon {\r\n const vertices = this.vertices.map((v) => v.clone());\r\n return new CSGPolygon(vertices, this.shared);\r\n }\r\n\r\n /**\r\n * Flips the faces of the polygon\r\n */\r\n public flip() {\r\n this.vertices.reverse().map((v) => {\r\n v.flip();\r\n });\r\n this.plane.flip();\r\n }\r\n}\r\n\r\n/**\r\n * Holds a node in a BSP tree. A BSP tree is built from a collection of polygons\r\n * by picking a polygon to split along. That polygon (and all other coplanar\r\n * polygons) are added directly to that node and the other polygons are added to\r\n * the front and/or back subtrees. This is not a leafy BSP tree since there is\r\n * no distinction between internal and leaf nodes\r\n */\r\nclass Node {\r\n private _plane: Nullable<CSGPlane> = null;\r\n private _front: Nullable<Node> = null;\r\n private _back: Nullable<Node> = null;\r\n private _polygons = new Array<CSGPolygon>();\r\n\r\n /**\r\n * Initializes the node\r\n * @param polygons A collection of polygons held in the node\r\n */\r\n constructor(polygons?: Array<CSGPolygon>) {\r\n if (polygons) {\r\n this.build(polygons);\r\n }\r\n }\r\n\r\n /**\r\n * Clones, or makes a deep copy, of the node\r\n * @returns The cloned node\r\n */\r\n public clone(): Node {\r\n const node = new Node();\r\n node._plane = this._plane && this._plane.clone();\r\n node._front = this._front && this._front.clone();\r\n node._back = this._back && this._back.clone();\r\n node._polygons = this._polygons.map((p) => p.clone());\r\n return node;\r\n }\r\n\r\n /**\r\n * Convert solid space to empty space and empty space to solid space\r\n */\r\n public invert(): void {\r\n for (let i = 0; i < this._polygons.length; i++) {\r\n this._polygons[i].flip();\r\n }\r\n if (this._plane) {\r\n this._plane.flip();\r\n }\r\n if (this._front) {\r\n this._front.invert();\r\n }\r\n if (this._back) {\r\n this._back.invert();\r\n }\r\n const temp = this._front;\r\n this._front = this._back;\r\n this._back = temp;\r\n }\r\n\r\n /**\r\n * Recursively remove all polygons in `polygons` that are inside this BSP\r\n * tree.\r\n * @param polygons Polygons to remove from the BSP\r\n * @returns Polygons clipped from the BSP\r\n */\r\n clipPolygons(polygons: CSGPolygon[]): CSGPolygon[] {\r\n if (!this._plane) {\r\n return polygons.slice();\r\n }\r\n let front: CSGPolygon[] = [],\r\n back = [] as CSGPolygon[];\r\n for (let i = 0; i < polygons.length; i++) {\r\n this._plane.splitPolygon(polygons[i], front, back, front, back);\r\n }\r\n if (this._front) {\r\n front = this._front.clipPolygons(front);\r\n }\r\n if (this._back) {\r\n back = this._back.clipPolygons(back);\r\n } else {\r\n back = [];\r\n }\r\n return front.concat(back);\r\n }\r\n\r\n /**\r\n * Remove all polygons in this BSP tree that are inside the other BSP tree\r\n * `bsp`.\r\n * @param bsp BSP containing polygons to remove from this BSP\r\n */\r\n clipTo(bsp: Node): void {\r\n this._polygons = bsp.clipPolygons(this._polygons);\r\n if (this._front) {\r\n this._front.clipTo(bsp);\r\n }\r\n if (this._back) {\r\n this._back.clipTo(bsp);\r\n }\r\n }\r\n\r\n /**\r\n * Return a list of all polygons in this BSP tree\r\n * @returns List of all polygons in this BSP tree\r\n */\r\n allPolygons(): CSGPolygon[] {\r\n let polygons = this._polygons.slice();\r\n if (this._front) {\r\n polygons = polygons.concat(this._front.allPolygons());\r\n }\r\n if (this._back) {\r\n polygons = polygons.concat(this._back.allPolygons());\r\n }\r\n return polygons;\r\n }\r\n\r\n /**\r\n * Build a BSP tree out of `polygons`. When called on an existing tree, the\r\n * new polygons are filtered down to the bottom of the tree and become new\r\n * nodes there. Each set of polygons is partitioned using the first polygon\r\n * (no heuristic is used to pick a good split)\r\n * @param polygons Polygons used to construct the BSP tree\r\n */\r\n build(polygons: CSGPolygon[]): void {\r\n if (!polygons.length) {\r\n return;\r\n }\r\n if (!this._plane) {\r\n this._plane = polygons[0].plane.clone();\r\n }\r\n const front: CSGPolygon[] = [],\r\n back = [] as CSGPolygon[];\r\n for (let i = 0; i < polygons.length; i++) {\r\n this._plane.splitPolygon(polygons[i], this._polygons, this._polygons, front, back);\r\n }\r\n if (front.length) {\r\n if (!this._front) {\r\n this._front = new Node();\r\n }\r\n this._front.build(front);\r\n }\r\n if (back.length) {\r\n if (!this._back) {\r\n this._back = new Node();\r\n }\r\n this._back.build(back);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Class for building Constructive Solid Geometry\r\n * @deprecated Please use CSG2 instead\r\n */\r\nexport class CSG {\r\n private _polygons = new Array<CSGPolygon>();\r\n /**\r\n * The world matrix\r\n */\r\n public matrix: Matrix;\r\n /**\r\n * Stores the position\r\n */\r\n public position: Vector3;\r\n /**\r\n * Stores the rotation\r\n */\r\n public rotation: Vector3;\r\n /**\r\n * Stores the rotation quaternion\r\n */\r\n public rotationQuaternion: Nullable<Quaternion>;\r\n /**\r\n * Stores the scaling vector\r\n */\r\n public scaling: Vector3;\r\n\r\n /**\r\n * Convert a VertexData to CSG\r\n * @param data defines the VertexData to convert to CSG\r\n * @returns the new CSG\r\n */\r\n public static FromVertexData(data: VertexData): CSG {\r\n let vertex: Vertex, polygon: CSGPolygon, vertices: Vertex[];\r\n const polygons: CSGPolygon[] = [];\r\n\r\n const indices = data.indices;\r\n const positions = data.positions;\r\n const normals = data.normals;\r\n const uvs = data.uvs;\r\n const vertColors = data.colors;\r\n\r\n if (!indices || !positions) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"BABYLON.CSG: VertexData must at least contain positions and indices\";\r\n }\r\n\r\n for (let i = 0; i < indices.length; i += 3) {\r\n vertices = [];\r\n for (let j = 0; j < 3; j++) {\r\n const indexIndices = i + j;\r\n const offset = indices[indexIndices];\r\n\r\n const normal = normals ? Vector3.FromArray(normals, offset * 3) : Vector3.Zero();\r\n const uv = uvs ? Vector2.FromArray(uvs, offset * 2) : undefined;\r\n const vertColor = vertColors ? Color4.FromArray(vertColors, offset * 4) : undefined;\r\n\r\n const position = Vector3.FromArray(positions, offset * 3);\r\n\r\n vertex = new Vertex(position, normal, uv, vertColor);\r\n vertices.push(vertex);\r\n }\r\n\r\n polygon = new CSGPolygon(vertices, { subMeshId: 0, meshId: currentCSGMeshId, materialIndex: 0 });\r\n\r\n // To handle the case of degenerated triangle\r\n // polygon.plane == null <=> the polygon does not represent 1 single plane <=> the triangle is degenerated\r\n if (polygon.plane) {\r\n polygons.push(polygon);\r\n }\r\n }\r\n\r\n const csg = CSG._FromPolygons(polygons);\r\n csg.matrix = Matrix.Identity();\r\n csg.position = Vector3.Zero();\r\n csg.rotation = Vector3.Zero();\r\n csg.scaling = Vector3.One();\r\n csg.rotationQuaternion = Quaternion.Identity();\r\n currentCSGMeshId++;\r\n\r\n return csg;\r\n }\r\n\r\n /**\r\n * Convert the Mesh to CSG\r\n * @param mesh The Mesh to convert to CSG\r\n * @param absolute If true, the final (local) matrix transformation is set to the identity and not to that of `mesh`. It can help when dealing with right-handed meshes (default: false)\r\n * @returns A new CSG from the Mesh\r\n */\r\n public static FromMesh(mesh: Mesh, absolute = false): CSG {\r\n let vertex: Vertex,\r\n normal: Vector3,\r\n uv: Vector2 | undefined = undefined,\r\n position: Vector3,\r\n vertColor: Color4 | undefined = undefined,\r\n polygon: CSGPolygon,\r\n vertices: Vertex[];\r\n const polygons: CSGPolygon[] = [];\r\n let matrix: Matrix,\r\n meshPosition: Vector3,\r\n meshRotation: Vector3,\r\n meshRotationQuaternion: Nullable<Quaternion> = null,\r\n meshScaling: Vector3;\r\n\r\n let invertWinding = false;\r\n if (mesh instanceof Mesh) {\r\n mesh.computeWorldMatrix(true);\r\n matrix = mesh.getWorldMatrix();\r\n meshPosition = mesh.position.clone();\r\n meshRotation = mesh.rotation.clone();\r\n if (mesh.rotationQuaternion) {\r\n meshRotationQuaternion = mesh.rotationQuaternion.clone();\r\n }\r\n meshScaling = mesh.scaling.clone();\r\n if (mesh.material && absolute) {\r\n invertWinding = mesh.material.sideOrientation === Constants.MATERIAL_ClockWiseSideOrientation;\r\n }\r\n } else {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"BABYLON.CSG: Wrong Mesh type, must be BABYLON.Mesh\";\r\n }\r\n\r\n const indices = mesh.getIndices(),\r\n positions = mesh.getVerticesData(VertexBuffer.PositionKind),\r\n normals = mesh.getVerticesData(VertexBuffer.NormalKind),\r\n uvs = mesh.getVerticesData(VertexBuffer.UVKind),\r\n vertColors = mesh.getVerticesData(VertexBuffer.ColorKind);\r\n\r\n if (indices === null) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"BABYLON.CSG: Mesh has no indices\";\r\n }\r\n if (positions === null) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"BABYLON.CSG: Mesh has no positions\";\r\n }\r\n if (normals === null) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"BABYLON.CSG: Mesh has no normals\";\r\n }\r\n\r\n const subMeshes = mesh.subMeshes;\r\n\r\n for (let sm = 0, sml = subMeshes.length; sm < sml; sm++) {\r\n for (let i = subMeshes[sm].indexStart, il = subMeshes[sm].indexCount + subMeshes[sm].indexStart; i < il; i += 3) {\r\n vertices = [];\r\n for (let j = 0; j < 3; j++) {\r\n const indexIndices = j === 0 ? i + j : invertWinding ? i + 3 - j : i + j;\r\n const sourceNormal = new Vector3(normals[indices[indexIndices] * 3], normals[indices[indexIndices] * 3 + 1], normals[indices[indexIndices] * 3 + 2]);\r\n if (uvs) {\r\n uv = new Vector2(uvs[indices[indexIndices] * 2], uvs[indices[indexIndices] * 2 + 1]);\r\n }\r\n if (vertColors) {\r\n vertColor = new Color4(\r\n vertColors[indices[indexIndices] * 4],\r\n vertColors[indices[indexIndices] * 4 + 1],\r\n vertColors[indices[indexIndices] * 4 + 2],\r\n vertColors[indices[indexIndices] * 4 + 3]\r\n );\r\n }\r\n const sourcePosition = new Vector3(positions[indices[indexIndices] * 3], positions[indices[indexIndices] * 3 + 1], positions[indices[indexIndices] * 3 + 2]);\r\n position = Vector3.TransformCoordinates(sourcePosition, matrix);\r\n normal = Vector3.TransformNormal(sourceNormal, matrix);\r\n\r\n vertex = new Vertex(position, normal, uv, vertColor);\r\n vertices.push(vertex);\r\n }\r\n\r\n polygon = new CSGPolygon(vertices, { subMeshId: sm, meshId: currentCSGMeshId, materialIndex: subMeshes[sm].materialIndex });\r\n\r\n // To handle the case of degenerated triangle\r\n // polygon.plane == null <=> the polygon does not represent 1 single plane <=> the triangle is degenerated\r\n if (polygon.plane) {\r\n polygons.push(polygon);\r\n }\r\n }\r\n }\r\n\r\n const csg = CSG._FromPolygons(polygons);\r\n csg.matrix = absolute ? Matrix.Identity() : matrix;\r\n csg.position = absolute ? Vector3.Zero() : meshPosition;\r\n csg.rotation = absolute ? Vector3.Zero() : meshRotation;\r\n csg.scaling = absolute ? Vector3.One() : meshScaling;\r\n csg.rotationQuaternion = absolute && meshRotationQuaternion ? Quaternion.Identity() : meshRotationQuaternion;\r\n currentCSGMeshId++;\r\n\r\n return csg;\r\n }\r\n\r\n /**\r\n * Construct a CSG solid from a list of `CSG.Polygon` instances.\r\n * @param polygons Polygons used to construct a CSG solid\r\n * @returns A new CSG solid\r\n */\r\n private static _FromPolygons(polygons: CSGPolygon[]): CSG {\r\n const csg = new CSG();\r\n csg._polygons = polygons;\r\n return csg;\r\n }\r\n\r\n /**\r\n * Clones, or makes a deep copy, of the CSG\r\n * @returns A new CSG\r\n */\r\n public clone(): CSG {\r\n const csg = new CSG();\r\n csg._polygons = this._polygons.map((p) => p.clone());\r\n csg.copyTransformAttributes(this);\r\n return csg;\r\n }\r\n\r\n /**\r\n * Unions this CSG with another CSG\r\n * @param csg The CSG to union against this CSG\r\n * @returns The unioned CSG\r\n */\r\n public union(csg: CSG): CSG {\r\n const a = new Node(this.clone()._polygons);\r\n const b = new Node(csg.clone()._polygons);\r\n a.clipTo(b);\r\n b.clipTo(a);\r\n b.invert();\r\n b.clipTo(a);\r\n b.invert();\r\n a.build(b.allPolygons());\r\n return CSG._FromPolygons(a.allPolygons()).copyTransformAttributes(this);\r\n }\r\n\r\n /**\r\n * Unions this CSG with another CSG in place\r\n * @param csg The CSG to union against this CSG\r\n */\r\n public unionInPlace(csg: CSG): void {\r\n const a = new Node(this._polygons);\r\n const b = new Node(csg._polygons);\r\n\r\n a.clipTo(b);\r\n b.clipTo(a);\r\n b.invert();\r\n b.clipTo(a);\r\n b.invert();\r\n a.build(b.allPolygons());\r\n\r\n this._polygons = a.allPolygons();\r\n }\r\n\r\n /**\r\n * Subtracts this CSG with another CSG\r\n * @param csg The CSG to subtract against this CSG\r\n * @returns A new CSG\r\n */\r\n public subtract(csg: CSG): CSG {\r\n const a = new Node(this.clone()._polygons);\r\n const b = new Node(csg.clone()._polygons);\r\n a.invert();\r\n a.clipTo(b);\r\n b.clipTo(a);\r\n b.invert();\r\n b.clipTo(a);\r\n b.invert();\r\n a.build(b.allPolygons());\r\n a.invert();\r\n return CSG._FromPolygons(a.allPolygons()).copyTransformAttributes(this);\r\n }\r\n\r\n /**\r\n * Subtracts this CSG with another CSG in place\r\n * @param csg The CSG to subtract against this CSG\r\n */\r\n public subtractInPlace(csg: CSG): void {\r\n const a = new Node(this._polygons);\r\n const b = new Node(csg._polygons);\r\n\r\n a.invert();\r\n a.clipTo(b);\r\n b.clipTo(a);\r\n b.invert();\r\n b.clipTo(a);\r\n b.invert();\r\n a.build(b.allPolygons());\r\n a.invert();\r\n\r\n this._polygons = a.allPolygons();\r\n }\r\n\r\n /**\r\n * Intersect this CSG with another CSG\r\n * @param csg The CSG to intersect against this CSG\r\n * @returns A new CSG\r\n */\r\n public intersect(csg: CSG): CSG {\r\n const a = new Node(this.clone()._polygons);\r\n const b = new Node(csg.clone()._polygons);\r\n a.invert();\r\n b.clipTo(a);\r\n b.invert();\r\n a.clipTo(b);\r\n b.clipTo(a);\r\n a.build(b.allPolygons());\r\n a.invert();\r\n return CSG._FromPolygons(a.allPolygons()).copyTransformAttributes(this);\r\n }\r\n\r\n /**\r\n * Intersects this CSG with another CSG in place\r\n * @param csg The CSG to intersect against this CSG\r\n */\r\n public intersectInPlace(csg: CSG): void {\r\n const a = new Node(this._polygons);\r\n const b = new Node(csg._polygons);\r\n\r\n a.invert();\r\n b.clipTo(a);\r\n b.invert();\r\n a.clipTo(b);\r\n b.clipTo(a);\r\n a.build(b.allPolygons());\r\n a.invert();\r\n\r\n this._polygons = a.allPolygons();\r\n }\r\n\r\n /**\r\n * Return a new CSG solid with solid and empty space switched. This solid is\r\n * not modified.\r\n * @returns A new CSG solid with solid and empty space switched\r\n */\r\n public inverse(): CSG {\r\n const csg = this.clone();\r\n csg.inverseInPlace();\r\n return csg;\r\n }\r\n\r\n /**\r\n * Inverses the CSG in place\r\n */\r\n public inverseInPlace(): void {\r\n this._polygons.map((p) => {\r\n p.flip();\r\n });\r\n }\r\n\r\n /**\r\n * This is used to keep meshes transformations so they can be restored\r\n * when we build back a Babylon Mesh\r\n * NB : All CSG operations are performed in world coordinates\r\n * @param csg The CSG to copy the transform attributes from\r\n * @returns This CSG\r\n */\r\n public copyTransformAttributes(csg: CSG): CSG {\r\n this.matrix = csg.matrix;\r\n this.position = csg.position;\r\n this.rotation = csg.rotation;\r\n this.scaling = csg.scaling;\r\n this.rotationQuaternion = csg.rotationQuaternion;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Build vertex data from CSG\r\n * Coordinates here are in world space\r\n * @param onBeforePolygonProcessing called before each polygon is being processed\r\n * @param onAfterPolygonProcessing called after each polygon has been processed\r\n * @returns the final vertex data\r\n */\r\n public toVertexData(onBeforePolygonProcessing: Nullable<(polygon: CSGPolygon) => void> = null, onAfterPolygonProcessing: Nullable<() => void> = null): VertexData {\r\n const matrix = this.matrix.clone();\r\n matrix.invert();\r\n\r\n const polygons = this._polygons;\r\n const vertices = [];\r\n const indices = [];\r\n const normals = [];\r\n let uvs: Nullable<number[]> = null;\r\n let vertColors: Nullable<number[]> = null;\r\n const vertex = Vector3.Zero();\r\n const normal = Vector3.Zero();\r\n const uv = Vector2.Zero();\r\n const vertColor = new Color4(0, 0, 0, 0);\r\n const polygonIndices = [0, 0, 0];\r\n const vertice_dict = {};\r\n let vertex_idx;\r\n\r\n for (let i = 0, il = polygons.length; i < il; i++) {\r\n const polygon = polygons[i];\r\n\r\n if (onBeforePolygonProcessing) {\r\n onBeforePolygonProcessing(polygon);\r\n }\r\n\r\n for (let j = 2, jl = polygon.vertices.length; j < jl; j++) {\r\n polygonIndices[0] = 0;\r\n polygonIndices[1] = j - 1;\r\n polygonIndices[2] = j;\r\n\r\n for (let k = 0; k < 3; k++) {\r\n vertex.copyFrom(polygon.vertices[polygonIndices[k]].pos);\r\n normal.copyFrom(polygon.vertices[polygonIndices[k]].normal);\r\n if (polygon.vertices[polygonIndices[k]].uv) {\r\n if (!uvs) {\r\n uvs = [];\r\n }\r\n uv.copyFrom(polygon.vertices[polygonIndices[k]].uv!);\r\n }\r\n\r\n if (polygon.vertices[polygonIndices[k]].vertColor) {\r\n if (!vertColors) {\r\n vertColors = [];\r\n }\r\n vertColor.copyFrom(polygon.vertices[polygonIndices[k]].vertColor!);\r\n }\r\n const localVertex = Vector3.TransformCoordinates(vertex, matrix);\r\n const localNormal = Vector3.TransformNormal(normal, matrix);\r\n\r\n vertex_idx = (<any>vertice_dict)[localVertex.x + \",\" + localVertex.y + \",\" + localVertex.z];\r\n\r\n let areUvsDifferent = false;\r\n\r\n if (uvs && !(uvs[vertex_idx * 2] === uv.x || uvs[vertex_idx * 2 + 1] === uv.y)) {\r\n areUvsDifferent = true;\r\n }\r\n\r\n let areColorsDifferent = false;\r\n\r\n if (\r\n vertColors &&\r\n !(\r\n vertColors[vertex_idx * 4] === vertColor.r ||\r\n vertColors[vertex_idx * 4 + 1] === vertColor.g ||\r\n vertColors[vertex_idx * 4 + 2] === vertColor.b ||\r\n vertColors[vertex_idx * 4 + 3] === vertColor.a\r\n )\r\n ) {\r\n areColorsDifferent = true;\r\n }\r\n\r\n // Check if 2 points can be merged\r\n if (\r\n !(\r\n typeof vertex_idx !== \"undefined\" &&\r\n normals[vertex_idx * 3] === localNormal.x &&\r\n normals[vertex_idx * 3 + 1] === localNormal.y &&\r\n normals[vertex_idx * 3 + 2] === localNormal.z\r\n ) ||\r\n areUvsDifferent ||\r\n areColorsDifferent\r\n ) {\r\n vertices.push(localVertex.x, localVertex.y, localVertex.z);\r\n if (uvs) {\r\n uvs.push(uv.x, uv.y);\r\n }\r\n normals.push(normal.x, normal.y, normal.z);\r\n if (vertColors) {\r\n vertColors.push(vertColor.r, vertColor.g, vertColor.b, vertColor.a);\r\n }\r\n vertex_idx = (<any>vertice_dict)[localVertex.x + \",\" + localVertex.y + \",\" + localVertex.z] = vertices.length / 3 - 1;\r\n }\r\n\r\n indices.push(vertex_idx);\r\n\r\n if (onAfterPolygonProcessing) {\r\n onAfterPolygonProcessing();\r\n }\r\n }\r\n }\r\n }\r\n\r\n const result = new VertexData();\r\n result.positions = vertices;\r\n result.normals = normals;\r\n if (uvs) {\r\n result.uvs = uvs;\r\n }\r\n if (vertColors) {\r\n result.colors = vertColors;\r\n }\r\n result.indices = indices;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Build Raw mesh from CSG\r\n * Coordinates here are in world space\r\n * @param name The name of the mesh geometry\r\n * @param scene The Scene\r\n * @param keepSubMeshes Specifies if the submeshes should be kept\r\n * @returns A new Mesh\r\n */\r\n public buildMeshGeometry(name: string, scene?: Scene, keepSubMeshes?: boolean): Mesh {\r\n const mesh = new Mesh(name, scene);\r\n const polygons = this._polygons;\r\n let currentIndex = 0;\r\n const subMeshDict = {};\r\n let subMeshObj: {\r\n materialIndex: number;\r\n indexStart: number;\r\n indexEnd: number;\r\n };\r\n\r\n if (keepSubMeshes) {\r\n // Sort Polygons, since subMeshes are indices range\r\n polygons.sort((a, b) => {\r\n if (a.shared.meshId === b.shared.meshId) {\r\n return a.shared.subMeshId - b.shared.subMeshId;\r\n } else {\r\n return a.shared.meshId - b.shared.meshId;\r\n }\r\n });\r\n }\r\n\r\n const vertexData = this.toVertexData(\r\n (polygon) => {\r\n // Building SubMeshes\r\n if (!(<any>subMeshDict)[polygon.shared.meshId]) {\r\n (<any>subMeshDict)[polygon.shared.meshId] = {};\r\n }\r\n if (!(<any>subMeshDict)[polygon.shared.meshId][polygon.shared.subMeshId]) {\r\n (<any>subMeshDict)[polygon.shared.meshId][polygon.shared.subMeshId] = {\r\n indexStart: +Infinity,\r\n indexEnd: -Infinity,\r\n materialIndex: polygon.shared.materialIndex,\r\n };\r\n }\r\n subMeshObj = (<any>subMeshDict)[polygon.shared.meshId][polygon.shared.subMeshId];\r\n },\r\n () => {\r\n subMeshObj.indexStart = Math.min(currentIndex, subMeshObj.indexStart);\r\n subMeshObj.indexEnd = Math.max(currentIndex, subMeshObj.indexEnd);\r\n currentIndex++;\r\n }\r\n );\r\n\r\n vertexData.applyToMesh(mesh);\r\n\r\n if (keepSubMeshes) {\r\n // We offset the materialIndex by the previous number of materials in the CSG mixed meshes\r\n let materialIndexOffset = 0,\r\n materialMaxIndex;\r\n\r\n mesh.subMeshes = [] as SubMesh[];\r\n\r\n for (const m in subMeshDict) {\r\n materialMaxIndex = -1;\r\n for (const sm in (<any>subMeshDict)[m]) {\r\n subMeshObj = (<any>subMeshDict)[m][sm];\r\n SubMesh.CreateFromIndices(\r\n subMeshObj.materialIndex + materialIndexOffset,\r\n subMeshObj.indexStart,\r\n subMeshObj.indexEnd - subMeshObj.indexStart + 1,\r\n <AbstractMesh>mesh\r\n );\r\n materialMaxIndex = Math.max(subMeshObj.materialIndex, materialMaxIndex);\r\n }\r\n materialIndexOffset += ++materialMaxIndex;\r\n }\r\n }\r\n\r\n return mesh;\r\n }\r\n\r\n /**\r\n * Build Mesh from CSG taking material and transforms into account\r\n * @param name The name of the Mesh\r\n * @param material The material of the Mesh\r\n * @param scene The Scene\r\n * @param keepSubMeshes Specifies if submeshes should be kept\r\n * @returns The new Mesh\r\n */\r\n public toMesh(name: string, material: Nullable<Material> = null, scene?: Scene, keepSubMeshes?: boolean): Mesh {\r\n const mesh = this.buildMeshGeometry(name, scene, keepSubMeshes);\r\n\r\n mesh.material = material;\r\n\r\n mesh.position.copyFrom(this.position);\r\n mesh.rotation.copyFrom(this.rotation);\r\n if (this.rotationQuaternion) {\r\n mesh.rotationQuaternion = this.rotationQuaternion.clone();\r\n }\r\n mesh.scaling.copyFrom(this.scaling);\r\n mesh.computeWorldMatrix(true);\r\n\r\n return mesh;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,131 @@
1
+ import { Mesh } from "./mesh";
2
+ import type { IDisposable, Scene } from "../scene.js";
3
+ import { VertexData } from "./mesh.vertexData";
4
+ import type { Material } from "../Materials/material.js";
5
+ /**
6
+ * Interface to customize the Manifold library import
7
+ */
8
+ export interface ICSG2Options {
9
+ /**
10
+ * Custom manifold URL
11
+ */
12
+ manifoldUrl?: string;
13
+ /**
14
+ * Custom manifold instance
15
+ */
16
+ manifoldInstance: any;
17
+ /**
18
+ * Custom manifold mesh instance
19
+ */
20
+ manifoldMeshInstance: any;
21
+ }
22
+ /**
23
+ * Interface to customize the mesh rebuild options
24
+ */
25
+ export interface IMeshRebuildOptions {
26
+ /**
27
+ * Rebuild normals
28
+ */
29
+ rebuildNormals?: boolean;
30
+ /**
31
+ * True to center the mesh on 0,0,0
32
+ */
33
+ centerMesh?: boolean;
34
+ /**
35
+ * 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
36
+ */
37
+ materialToUse?: Material;
38
+ }
39
+ /**
40
+ * Interface to customize the vertex data rebuild options
41
+ */
42
+ export interface IVertexDataRebuildOptions {
43
+ /**
44
+ * Rebuild normals
45
+ */
46
+ rebuildNormals?: boolean;
47
+ }
48
+ /**
49
+ * Wrapper around the Manifold library
50
+ * https://manifoldcad.org/
51
+ * Use this class to perform fast boolean operations on meshes
52
+ * #IW43EB#15 - basic operations
53
+ * #JUKXQD#6104 - skull vs box
54
+ * #JUKXQD#6111 - skull vs vertex data
55
+ */
56
+ export declare class CSG2 implements IDisposable {
57
+ private _manifold;
58
+ private _numProp;
59
+ private _vertexStructure;
60
+ /**
61
+ * Return the size of a vertex (at least 3 for the position)
62
+ */
63
+ get numProp(): number;
64
+ private constructor();
65
+ private _process;
66
+ /**
67
+ * Run a difference operation between two CSG
68
+ * @param csg defines the CSG to use to create the difference
69
+ * @returns a new csg
70
+ */
71
+ subtract(csg: CSG2): CSG2;
72
+ /**
73
+ * Run an intersection operation between two CSG
74
+ * @param csg defines the CSG to use to create the intersection
75
+ * @returns a new csg
76
+ */
77
+ intersect(csg: CSG2): CSG2;
78
+ /**
79
+ * Run an union operation between two CSG
80
+ * @param csg defines the CSG to use to create the union
81
+ * @returns a new csg
82
+ */
83
+ add(csg: CSG2): CSG2;
84
+ /**
85
+ * Print debug information about the CSG
86
+ */
87
+ printDebug(): void;
88
+ /**
89
+ * Generate a vertex data from the CSG
90
+ * @param options defines the options to use to rebuild the vertex data
91
+ * @returns a new vertex data
92
+ */
93
+ toVertexData(options?: Partial<IVertexDataRebuildOptions>): VertexData;
94
+ /**
95
+ * Generate a mesh from the CSG
96
+ * @param name defines the name of the mesh
97
+ * @param scene defines the scene to use to create the mesh
98
+ * @param options defines the options to use to rebuild the mesh
99
+ * @returns a new Mesh
100
+ */
101
+ toMesh(name: string, scene?: Scene, options?: Partial<IMeshRebuildOptions>): Mesh;
102
+ /**
103
+ * Dispose the CSG resources
104
+ */
105
+ dispose(): void;
106
+ private static _ProcessData;
107
+ private static _Construct;
108
+ /**
109
+ * Create a new Constructive Solid Geometry from a vertexData
110
+ * @param vertexData defines the vertexData to use to create the CSG
111
+ * @returns a new CSG2 class
112
+ */
113
+ static FromVertexData(vertexData: VertexData): CSG2;
114
+ /**
115
+ * Create a new Constructive Solid Geometry from a mesh
116
+ * @param mesh defines the mesh to use to create the CSG
117
+ * @param ignoreWorldMatrix defines if the world matrix should be ignored
118
+ * @returns a new CSG2 class
119
+ */
120
+ static FromMesh(mesh: Mesh, ignoreWorldMatrix?: boolean): any;
121
+ }
122
+ /**
123
+ * Checks if the Manifold library is ready
124
+ * @returns true if the Manifold library is ready
125
+ */
126
+ export declare function IsCSG2Ready(): boolean;
127
+ /**
128
+ * Initialize the Manifold library
129
+ * @param options defines the options to use to initialize the library
130
+ */
131
+ export declare function InitializeCSG2Async(options?: Partial<ICSG2Options>): Promise<void>;