@babylonjs/core 6.21.0 → 6.21.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Audio/soundTrack.js +1 -1
- package/Audio/soundTrack.js.map +1 -1
- package/Buffers/buffer.d.ts +2 -1
- package/Buffers/buffer.js +13 -5
- package/Buffers/buffer.js.map +1 -1
- package/Debug/rayHelper.d.ts +3 -3
- package/Debug/rayHelper.js +2 -2
- package/Debug/rayHelper.js.map +1 -1
- package/Engines/Native/nativeHelpers.d.ts +9 -0
- package/Engines/Native/nativeHelpers.js +296 -0
- package/Engines/Native/nativeHelpers.js.map +1 -0
- package/Engines/Native/nativeInterfaces.d.ts +92 -0
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/engine.d.ts +6 -4
- package/Engines/engine.js +7 -1
- package/Engines/engine.js.map +1 -1
- package/Engines/nativeEngine.d.ts +3 -12
- package/Engines/nativeEngine.js +43 -226
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/thinEngine.js +4 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +2 -1
- package/Engines/webgpuEngine.js.map +1 -1
- package/FlowGraph/Blocks/Data/Logic/flowGraphLogicBlocks.d.ts +23 -0
- package/FlowGraph/Blocks/Data/Logic/flowGraphLogicBlocks.js +31 -0
- package/FlowGraph/Blocks/Data/Logic/flowGraphLogicBlocks.js.map +1 -0
- package/FlowGraph/Blocks/Data/Math/flowGraphNumberMathBlocks.d.ts +270 -0
- package/FlowGraph/Blocks/Data/Math/flowGraphNumberMathBlocks.js +347 -0
- package/FlowGraph/Blocks/Data/Math/flowGraphNumberMathBlocks.js.map +1 -0
- package/FlowGraph/Blocks/Data/Math/flowGraphVector2MathBlocks.d.ts +52 -0
- package/FlowGraph/Blocks/Data/Math/flowGraphVector2MathBlocks.js +71 -0
- package/FlowGraph/Blocks/Data/Math/flowGraphVector2MathBlocks.js.map +1 -0
- package/FlowGraph/Blocks/Data/Math/flowGraphVector3MathBlocks.d.ts +66 -0
- package/FlowGraph/Blocks/Data/Math/flowGraphVector3MathBlocks.js +86 -0
- package/FlowGraph/Blocks/Data/Math/flowGraphVector3MathBlocks.js.map +1 -0
- package/FlowGraph/Blocks/Data/Math/flowGraphVector4MathBlocks.d.ts +52 -0
- package/FlowGraph/Blocks/Data/Math/flowGraphVector4MathBlocks.js +71 -0
- package/FlowGraph/Blocks/Data/Math/flowGraphVector4MathBlocks.js.map +1 -0
- package/FlowGraph/Blocks/Data/flowGraphBinaryOperationBlock.d.ts +17 -0
- package/FlowGraph/Blocks/Data/flowGraphBinaryOperationBlock.js +19 -0
- package/FlowGraph/Blocks/Data/flowGraphBinaryOperationBlock.js.map +1 -0
- package/FlowGraph/Blocks/Data/flowGraphConstantOperationBlock.d.ts +13 -0
- package/FlowGraph/Blocks/Data/flowGraphConstantOperationBlock.js +16 -0
- package/FlowGraph/Blocks/Data/flowGraphConstantOperationBlock.js.map +1 -0
- package/FlowGraph/Blocks/Data/flowGraphUnaryOperationBlock.d.ts +15 -0
- package/FlowGraph/Blocks/Data/flowGraphUnaryOperationBlock.js +17 -0
- package/FlowGraph/Blocks/Data/flowGraphUnaryOperationBlock.js.map +1 -0
- package/FlowGraph/Blocks/Data/index.d.ts +4 -1
- package/FlowGraph/Blocks/Data/index.js +4 -1
- package/FlowGraph/Blocks/Data/index.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.d.ts +16 -0
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.js +29 -0
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.js.map +1 -0
- package/FlowGraph/Blocks/Event/index.d.ts +1 -0
- package/FlowGraph/Blocks/Event/index.js +1 -0
- package/FlowGraph/Blocks/Event/index.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPauseAnimationBlock.d.ts +16 -0
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPauseAnimationBlock.js +18 -0
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPauseAnimationBlock.js.map +1 -0
- package/FlowGraph/Blocks/Execution/{flowGraphPlayAnimationBlock.d.ts → Animation/flowGraphPlayAnimationBlock.d.ts} +5 -5
- package/FlowGraph/Blocks/Execution/{flowGraphPlayAnimationBlock.js → Animation/flowGraphPlayAnimationBlock.js} +15 -8
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.js.map +1 -0
- package/FlowGraph/Blocks/Execution/{flowGraphStopAnimationBlock.d.ts → Animation/flowGraphStopAnimationBlock.d.ts} +4 -4
- package/FlowGraph/Blocks/Execution/{flowGraphStopAnimationBlock.js → Animation/flowGraphStopAnimationBlock.js} +2 -2
- package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.js.map +1 -0
- package/FlowGraph/Blocks/Execution/Animation/index.d.ts +3 -0
- package/FlowGraph/Blocks/Execution/Animation/index.js +4 -0
- package/FlowGraph/Blocks/Execution/Animation/index.js.map +1 -0
- package/FlowGraph/Blocks/Execution/index.d.ts +1 -2
- package/FlowGraph/Blocks/Execution/index.js +2 -2
- package/FlowGraph/Blocks/Execution/index.js.map +1 -1
- package/FlowGraph/flowGraphDataConnection.d.ts +2 -2
- package/FlowGraph/flowGraphDataConnection.js +3 -3
- package/FlowGraph/flowGraphDataConnection.js.map +1 -1
- package/Gizmos/axisDragGizmo.d.ts +1 -1
- package/Gizmos/axisDragGizmo.js +0 -1
- package/Gizmos/axisDragGizmo.js.map +1 -1
- package/Gizmos/axisScaleGizmo.js +0 -1
- package/Gizmos/axisScaleGizmo.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.d.ts +12 -0
- package/Gizmos/boundingBoxGizmo.js +37 -1
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Gizmos/gizmo.d.ts +0 -4
- package/Gizmos/gizmo.js +19 -16
- package/Gizmos/gizmo.js.map +1 -1
- package/Gizmos/planeDragGizmo.js +0 -1
- package/Gizmos/planeDragGizmo.js.map +1 -1
- package/Gizmos/planeRotationGizmo.js +0 -1
- package/Gizmos/planeRotationGizmo.js.map +1 -1
- package/Gizmos/scaleGizmo.d.ts +2 -2
- package/Gizmos/scaleGizmo.js +5 -2
- package/Gizmos/scaleGizmo.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +1 -0
- package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +1 -0
- package/Materials/PBR/pbrBaseMaterial.js +12 -2
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/Textures/equiRectangularCubeTexture.js +24 -4
- package/Materials/Textures/equiRectangularCubeTexture.js.map +1 -1
- package/Materials/standardMaterial.d.ts +1 -0
- package/Materials/standardMaterial.js +6 -0
- package/Materials/standardMaterial.js.map +1 -1
- package/Maths/math.vector.d.ts +1 -1
- package/Maths/math.vector.js +1 -1
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/Compression/dracoCompression.d.ts +25 -8
- package/Meshes/Compression/dracoCompression.js +187 -119
- package/Meshes/Compression/dracoCompression.js.map +1 -1
- package/Meshes/Node/Blocks/Textures/geometryTextureFetchBlock.d.ts +22 -2
- package/Meshes/Node/Blocks/Textures/geometryTextureFetchBlock.js +62 -4
- package/Meshes/Node/Blocks/Textures/geometryTextureFetchBlock.js.map +1 -1
- package/Meshes/Node/Blocks/debugBlock.d.ts +2 -1
- package/Meshes/Node/Blocks/debugBlock.js +8 -2
- package/Meshes/Node/Blocks/debugBlock.js.map +1 -1
- package/Meshes/Node/Blocks/randomBlock.d.ts +14 -3
- package/Meshes/Node/Blocks/randomBlock.js +40 -13
- package/Meshes/Node/Blocks/randomBlock.js.map +1 -1
- package/Meshes/Node/nodeGeometryBuildState.d.ts +2 -2
- package/Meshes/Node/nodeGeometryBuildState.js +5 -3
- package/Meshes/Node/nodeGeometryBuildState.js.map +1 -1
- package/Meshes/meshSimplification.d.ts +1 -1
- package/Meshes/meshSimplification.js.map +1 -1
- package/Meshes/subMesh.js +1 -1
- package/Meshes/subMesh.js.map +1 -1
- package/Physics/v2/IPhysicsEnginePlugin.d.ts +8 -0
- package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
- package/Shaders/ShadersInclude/bumpFragmentFunctions.js +14 -2
- package/Shaders/ShadersInclude/bumpFragmentFunctions.js.map +1 -1
- package/package.json +1 -1
- package/FlowGraph/Blocks/Data/flowGraphAddBlock.d.ts +0 -23
- package/FlowGraph/Blocks/Data/flowGraphAddBlock.js +0 -18
- package/FlowGraph/Blocks/Data/flowGraphAddBlock.js.map +0 -1
- package/FlowGraph/Blocks/Execution/flowGraphPlayAnimationBlock.js.map +0 -1
- package/FlowGraph/Blocks/Execution/flowGraphStopAnimationBlock.js.map +0 -1
|
@@ -46,7 +46,6 @@ export declare class NodeGeometryBuildState {
|
|
|
46
46
|
/**
|
|
47
47
|
* Push the new active execution context
|
|
48
48
|
* @param executionContext defines the execution context
|
|
49
|
-
* @param instancingContext defines the instancing context
|
|
50
49
|
*/
|
|
51
50
|
pushExecutionContext(executionContext: INodeGeometryExecutionContext): void;
|
|
52
51
|
/**
|
|
@@ -69,9 +68,10 @@ export declare class NodeGeometryBuildState {
|
|
|
69
68
|
/**
|
|
70
69
|
* Gets the value associated with a contextual source
|
|
71
70
|
* @param source Source of the contextual value
|
|
71
|
+
* @param skipWarning Do not store the warning for reporting if true
|
|
72
72
|
* @returns the value associated with the source
|
|
73
73
|
*/
|
|
74
|
-
getContextualValue(source: NodeGeometryContextualSources): any;
|
|
74
|
+
getContextualValue(source: NodeGeometryContextualSources, skipWarning?: boolean): any;
|
|
75
75
|
/**
|
|
76
76
|
* Adapt a value to a target type
|
|
77
77
|
* @param source defines the value to adapt
|
|
@@ -48,7 +48,6 @@ export class NodeGeometryBuildState {
|
|
|
48
48
|
/**
|
|
49
49
|
* Push the new active execution context
|
|
50
50
|
* @param executionContext defines the execution context
|
|
51
|
-
* @param instancingContext defines the instancing context
|
|
52
51
|
*/
|
|
53
52
|
pushExecutionContext(executionContext) {
|
|
54
53
|
this._executionContext = executionContext;
|
|
@@ -86,11 +85,14 @@ export class NodeGeometryBuildState {
|
|
|
86
85
|
/**
|
|
87
86
|
* Gets the value associated with a contextual source
|
|
88
87
|
* @param source Source of the contextual value
|
|
88
|
+
* @param skipWarning Do not store the warning for reporting if true
|
|
89
89
|
* @returns the value associated with the source
|
|
90
90
|
*/
|
|
91
|
-
getContextualValue(source) {
|
|
91
|
+
getContextualValue(source, skipWarning = false) {
|
|
92
92
|
if (!this.executionContext) {
|
|
93
|
-
|
|
93
|
+
if (!skipWarning) {
|
|
94
|
+
this.noContextualData.push(source);
|
|
95
|
+
}
|
|
94
96
|
return null;
|
|
95
97
|
}
|
|
96
98
|
const index = this.executionContext.getExecutionIndex();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeGeometryBuildState.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/Node/nodeGeometryBuildState.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport type { VertexData } from \"../mesh.vertexData\";\r\nimport type { NodeGeometryConnectionPoint } from \"./nodeGeometryBlockConnectionPoint\";\r\nimport { NodeGeometryContextualSources } from \"./Enums/nodeGeometryContextualSources\";\r\nimport { Matrix, Vector2, Vector3, Vector4 } from \"../../Maths/math.vector\";\r\nimport type { INodeGeometryExecutionContext } from \"./Interfaces/nodeGeometryExecutionContext\";\r\nimport { NodeGeometryBlockConnectionPointTypes } from \"./Enums/nodeGeometryConnectionPointTypes\";\r\nimport type { INodeGeometryInstancingContext } from \"./Interfaces/nodeGeometryInstancingContext\";\r\n\r\n/**\r\n * Class used to store node based geometry build state\r\n */\r\nexport class NodeGeometryBuildState {\r\n private _rotationMatrix = new Matrix();\r\n private _scalingMatrix = new Matrix();\r\n private _positionMatrix = new Matrix();\r\n private _scalingRotationMatrix = new Matrix();\r\n private _transformMatrix = new Matrix();\r\n private _tempVector3 = new Vector3();\r\n\r\n /** Gets or sets the list of non connected mandatory inputs */\r\n public notConnectedNonOptionalInputs: NodeGeometryConnectionPoint[] = [];\r\n /** Gets or sets the list of non contextual inputs having no contextudal data */\r\n public noContextualData: NodeGeometryContextualSources[] = [];\r\n /** Gets or sets the build identifier */\r\n public buildId: number;\r\n /** Gets or sets a boolean indicating that verbose mode is on */\r\n public verbose: boolean;\r\n /** Gets or sets the vertex data */\r\n public vertexData: Nullable<VertexData> = null;\r\n\r\n private _geometryContext: Nullable<VertexData> = null;\r\n private _executionContext: Nullable<INodeGeometryExecutionContext> = null;\r\n private _instancingContext: Nullable<INodeGeometryInstancingContext> = null;\r\n\r\n private _geometryContextStack: Array<Nullable<VertexData>> = [];\r\n private _executionContextStack: Array<Nullable<INodeGeometryExecutionContext>> = [];\r\n private _instancingContextStack: Array<Nullable<INodeGeometryInstancingContext>> = [];\r\n\r\n /** Gets or sets the geometry context */\r\n public get geometryContext() {\r\n return this._geometryContext;\r\n }\r\n\r\n /** Gets or sets the execution context */\r\n public get executionContext() {\r\n return this._executionContext;\r\n }\r\n\r\n /** Gets or sets the instancing context */\r\n public get instancingContext() {\r\n return this._instancingContext;\r\n }\r\n\r\n /**\r\n * Push the new active geometry context\r\n * @param geometryContext defines the geometry context\r\n */\r\n public pushGeometryContext(geometryContext: VertexData) {\r\n this._geometryContext = geometryContext;\r\n this._geometryContextStack.push(this._geometryContext);\r\n }\r\n\r\n /**\r\n * Push the new active execution context\r\n * @param executionContext defines the execution context\r\n * @param instancingContext defines the instancing context\r\n */\r\n public pushExecutionContext(executionContext: INodeGeometryExecutionContext) {\r\n this._executionContext = executionContext;\r\n this._executionContextStack.push(this._executionContext);\r\n }\r\n\r\n /**\r\n * Push the new active instancing context\r\n * @param instancingContext defines the instancing context\r\n */\r\n public pushInstancingContext(instancingContext: INodeGeometryInstancingContext) {\r\n this._instancingContext = instancingContext;\r\n this._instancingContextStack.push(this._instancingContext);\r\n }\r\n\r\n /**\r\n * Remove current geometry context and restore the previous one\r\n */\r\n public restoreGeometryContext() {\r\n this._geometryContextStack.pop();\r\n this._geometryContext = this._geometryContextStack.length > 0 ? this._geometryContextStack[this._geometryContextStack.length - 1] : null;\r\n }\r\n\r\n /**\r\n * Remove current execution context and restore the previous one\r\n */\r\n public restoreExecutionContext() {\r\n this._executionContextStack.pop();\r\n this._executionContext = this._executionContextStack.length > 0 ? this._executionContextStack[this._executionContextStack.length - 1] : null;\r\n }\r\n\r\n /**\r\n * Remove current isntancing context and restore the previous one\r\n */\r\n public restoreInstancingContext() {\r\n this._instancingContextStack.pop();\r\n this._instancingContext = this._instancingContextStack.length > 0 ? this._instancingContextStack[this._instancingContextStack.length - 1] : null;\r\n }\r\n\r\n /**\r\n * Gets the value associated with a contextual source\r\n * @param source Source of the contextual value\r\n * @returns the value associated with the source\r\n */\r\n public getContextualValue(source: NodeGeometryContextualSources) {\r\n if (!this.executionContext) {\r\n this.noContextualData.push(source);\r\n return null;\r\n }\r\n\r\n const index = this.executionContext.getExecutionIndex();\r\n\r\n switch (source) {\r\n case NodeGeometryContextualSources.Positions:\r\n if (this.executionContext.getOverridePositionsContextualValue) {\r\n return this.executionContext.getOverridePositionsContextualValue();\r\n }\r\n if (!this.geometryContext || !this.geometryContext.positions) {\r\n return Vector3.Zero();\r\n }\r\n return Vector3.FromArray(this.geometryContext.positions as ArrayLike<number>, index * 3);\r\n case NodeGeometryContextualSources.Normals:\r\n if (this.executionContext.getOverrideNormalsContextualValue) {\r\n return this.executionContext.getOverrideNormalsContextualValue();\r\n }\r\n if (!this.geometryContext || !this.geometryContext.normals) {\r\n return Vector3.Zero();\r\n }\r\n return Vector3.FromArray(this.geometryContext.normals as ArrayLike<number>, index * 3);\r\n case NodeGeometryContextualSources.Colors:\r\n if (!this.geometryContext || !this.geometryContext.colors) {\r\n return Vector4.Zero();\r\n }\r\n return Vector4.FromArray(this.geometryContext.colors as ArrayLike<number>, index * 4);\r\n case NodeGeometryContextualSources.Tangents:\r\n if (!this.geometryContext || !this.geometryContext.tangents) {\r\n return Vector4.Zero();\r\n }\r\n return Vector4.FromArray(this.geometryContext.tangents as ArrayLike<number>, index * 4);\r\n case NodeGeometryContextualSources.UV:\r\n if (!this.geometryContext || !this.geometryContext.uvs) {\r\n return Vector2.Zero();\r\n }\r\n return Vector2.FromArray(this.geometryContext.uvs as ArrayLike<number>, index * 2);\r\n case NodeGeometryContextualSources.UV2:\r\n if (!this.geometryContext || !this.geometryContext.uvs2) {\r\n return Vector2.Zero();\r\n }\r\n return Vector2.FromArray(this.geometryContext.uvs2 as ArrayLike<number>, index * 2);\r\n case NodeGeometryContextualSources.UV3:\r\n if (!this.geometryContext || !this.geometryContext.uvs3) {\r\n return Vector2.Zero();\r\n }\r\n return Vector2.FromArray(this.geometryContext.uvs3 as ArrayLike<number>, index * 2);\r\n case NodeGeometryContextualSources.UV4:\r\n if (!this.geometryContext || !this.geometryContext.uvs4) {\r\n return Vector2.Zero();\r\n }\r\n return Vector2.FromArray(this.geometryContext.uvs4 as ArrayLike<number>, index * 2);\r\n case NodeGeometryContextualSources.UV5:\r\n if (!this.geometryContext || !this.geometryContext.uvs5) {\r\n return Vector2.Zero();\r\n }\r\n return Vector2.FromArray(this.geometryContext.uvs5 as ArrayLike<number>, index * 2);\r\n case NodeGeometryContextualSources.UV6:\r\n if (!this.geometryContext || !this.geometryContext.uvs6) {\r\n return Vector2.Zero();\r\n }\r\n return Vector2.FromArray(this.geometryContext.uvs6 as ArrayLike<number>, index * 2);\r\n case NodeGeometryContextualSources.VertexID:\r\n return index;\r\n case NodeGeometryContextualSources.FaceID:\r\n return this.executionContext.getExecutionFaceIndex();\r\n case NodeGeometryContextualSources.LoopID:\r\n return this.executionContext.getExecutionLoopIndex();\r\n case NodeGeometryContextualSources.InstanceID:\r\n return this.instancingContext ? this.instancingContext.getInstanceIndex() : 0;\r\n case NodeGeometryContextualSources.GeometryID:\r\n return !this.geometryContext ? 0 : this.geometryContext.uniqueId;\r\n case NodeGeometryContextualSources.CollectionID: {\r\n if (!this.geometryContext || !this.geometryContext.metadata) {\r\n return 0;\r\n }\r\n return this.geometryContext.metadata.collectionId || 0;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Adapt a value to a target type\r\n * @param source defines the value to adapt\r\n * @param targetType defines the target type\r\n * @returns the adapted value\r\n */\r\n adapt(source: NodeGeometryConnectionPoint, targetType: NodeGeometryBlockConnectionPointTypes) {\r\n const value = source.getConnectedValue(this) || 0;\r\n\r\n if (source.type === targetType) {\r\n return value;\r\n }\r\n\r\n switch (targetType) {\r\n case NodeGeometryBlockConnectionPointTypes.Vector2:\r\n return new Vector2(value, value);\r\n case NodeGeometryBlockConnectionPointTypes.Vector3:\r\n return new Vector3(value, value, value);\r\n case NodeGeometryBlockConnectionPointTypes.Vector4:\r\n return new Vector4(value, value, value, value);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Adapt an input value to a target type\r\n * @param source defines the value to adapt\r\n * @param targetType defines the target type\r\n * @param defaultValue defines the default value to use if not connected\r\n * @returns the adapted value\r\n */\r\n adaptInput(source: NodeGeometryConnectionPoint, targetType: NodeGeometryBlockConnectionPointTypes, defaultValue: any) {\r\n if (!source.isConnected) {\r\n return source.value || defaultValue;\r\n }\r\n\r\n const value = source.getConnectedValue(this);\r\n\r\n if (source._connectedPoint?.type === targetType) {\r\n return value;\r\n }\r\n\r\n switch (targetType) {\r\n case NodeGeometryBlockConnectionPointTypes.Vector2:\r\n return new Vector2(value, value);\r\n case NodeGeometryBlockConnectionPointTypes.Vector3:\r\n return new Vector3(value, value, value);\r\n case NodeGeometryBlockConnectionPointTypes.Vector4:\r\n return new Vector4(value, value, value, value);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Emits console errors and exceptions if there is a failing check\r\n */\r\n public emitErrors() {\r\n let errorMessage = \"\";\r\n\r\n for (const notConnectedInput of this.notConnectedNonOptionalInputs) {\r\n errorMessage += `input ${notConnectedInput.name} from block ${\r\n notConnectedInput.ownerBlock.name\r\n }[${notConnectedInput.ownerBlock.getClassName()}] is not connected and is not optional.\\n`;\r\n }\r\n\r\n for (const source of this.noContextualData) {\r\n errorMessage += `Contextual input ${NodeGeometryContextualSources[source]} has no context to pull data from (must be connected to a setXXX block or a instantiateXXX block).\\n`;\r\n }\r\n\r\n if (errorMessage) {\r\n throw \"Build of NodeGeometry failed:\\n\" + errorMessage;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _instantiate(clone: VertexData, currentPosition: Vector3, rotation: Vector3, scaling: Vector3, additionalVertexData: VertexData[]) {\r\n // Transform\r\n Matrix.ScalingToRef(scaling.x, scaling.y, scaling.z, this._scalingMatrix);\r\n Matrix.RotationYawPitchRollToRef(rotation.y, rotation.x, rotation.z, this._rotationMatrix);\r\n Matrix.TranslationToRef(currentPosition.x, currentPosition.y, currentPosition.z, this._positionMatrix);\r\n\r\n this._scalingMatrix.multiplyToRef(this._rotationMatrix, this._scalingRotationMatrix);\r\n this._scalingRotationMatrix.multiplyToRef(this._positionMatrix, this._transformMatrix);\r\n for (let clonePositionIndex = 0; clonePositionIndex < clone.positions!.length; clonePositionIndex += 3) {\r\n this._tempVector3.fromArray(clone.positions!, clonePositionIndex);\r\n Vector3.TransformCoordinatesToRef(this._tempVector3, this._transformMatrix, this._tempVector3);\r\n this._tempVector3.toArray(clone.positions!, clonePositionIndex);\r\n\r\n if (clone.normals) {\r\n this._tempVector3.fromArray(clone.normals, clonePositionIndex);\r\n Vector3.TransformNormalToRef(this._tempVector3, this._scalingRotationMatrix, this._tempVector3);\r\n this._tempVector3.toArray(clone.normals, clonePositionIndex);\r\n }\r\n }\r\n\r\n additionalVertexData.push(clone);\r\n }\r\n\r\n /** @internal */\r\n public _instantiateWithMatrix(clone: VertexData, transform: Matrix, additionalVertexData: VertexData[]) {\r\n for (let clonePositionIndex = 0; clonePositionIndex < clone.positions!.length; clonePositionIndex += 3) {\r\n this._tempVector3.fromArray(clone.positions!, clonePositionIndex);\r\n Vector3.TransformCoordinatesToRef(this._tempVector3, transform, this._tempVector3);\r\n this._tempVector3.toArray(clone.positions!, clonePositionIndex);\r\n\r\n if (clone.normals) {\r\n this._tempVector3.fromArray(clone.normals, clonePositionIndex);\r\n Vector3.TransformNormalToRef(this._tempVector3, transform, this._tempVector3);\r\n this._tempVector3.toArray(clone.normals, clonePositionIndex);\r\n }\r\n }\r\n\r\n additionalVertexData.push(clone);\r\n }\r\n\r\n /** @internal */\r\n public _instantiateWithPositionAndMatrix(clone: VertexData, currentPosition: Vector3, transform: Matrix, additionalVertexData: VertexData[]) {\r\n Matrix.TranslationToRef(currentPosition.x, currentPosition.y, currentPosition.z, this._positionMatrix);\r\n transform.multiplyToRef(this._positionMatrix, this._transformMatrix);\r\n\r\n for (let clonePositionIndex = 0; clonePositionIndex < clone.positions!.length; clonePositionIndex += 3) {\r\n this._tempVector3.fromArray(clone.positions!, clonePositionIndex);\r\n Vector3.TransformCoordinatesToRef(this._tempVector3, this._transformMatrix, this._tempVector3);\r\n this._tempVector3.toArray(clone.positions!, clonePositionIndex);\r\n\r\n if (clone.normals) {\r\n this._tempVector3.fromArray(clone.normals, clonePositionIndex);\r\n Vector3.TransformNormalToRef(this._tempVector3, this._transformMatrix, this._tempVector3);\r\n this._tempVector3.toArray(clone.normals, clonePositionIndex);\r\n }\r\n }\r\n\r\n additionalVertexData.push(clone);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"nodeGeometryBuildState.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/Node/nodeGeometryBuildState.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport type { VertexData } from \"../mesh.vertexData\";\r\nimport type { NodeGeometryConnectionPoint } from \"./nodeGeometryBlockConnectionPoint\";\r\nimport { NodeGeometryContextualSources } from \"./Enums/nodeGeometryContextualSources\";\r\nimport { Matrix, Vector2, Vector3, Vector4 } from \"../../Maths/math.vector\";\r\nimport type { INodeGeometryExecutionContext } from \"./Interfaces/nodeGeometryExecutionContext\";\r\nimport { NodeGeometryBlockConnectionPointTypes } from \"./Enums/nodeGeometryConnectionPointTypes\";\r\nimport type { INodeGeometryInstancingContext } from \"./Interfaces/nodeGeometryInstancingContext\";\r\n\r\n/**\r\n * Class used to store node based geometry build state\r\n */\r\nexport class NodeGeometryBuildState {\r\n private _rotationMatrix = new Matrix();\r\n private _scalingMatrix = new Matrix();\r\n private _positionMatrix = new Matrix();\r\n private _scalingRotationMatrix = new Matrix();\r\n private _transformMatrix = new Matrix();\r\n private _tempVector3 = new Vector3();\r\n\r\n /** Gets or sets the list of non connected mandatory inputs */\r\n public notConnectedNonOptionalInputs: NodeGeometryConnectionPoint[] = [];\r\n /** Gets or sets the list of non contextual inputs having no contextudal data */\r\n public noContextualData: NodeGeometryContextualSources[] = [];\r\n /** Gets or sets the build identifier */\r\n public buildId: number;\r\n /** Gets or sets a boolean indicating that verbose mode is on */\r\n public verbose: boolean;\r\n /** Gets or sets the vertex data */\r\n public vertexData: Nullable<VertexData> = null;\r\n\r\n private _geometryContext: Nullable<VertexData> = null;\r\n private _executionContext: Nullable<INodeGeometryExecutionContext> = null;\r\n private _instancingContext: Nullable<INodeGeometryInstancingContext> = null;\r\n\r\n private _geometryContextStack: Array<Nullable<VertexData>> = [];\r\n private _executionContextStack: Array<Nullable<INodeGeometryExecutionContext>> = [];\r\n private _instancingContextStack: Array<Nullable<INodeGeometryInstancingContext>> = [];\r\n\r\n /** Gets or sets the geometry context */\r\n public get geometryContext() {\r\n return this._geometryContext;\r\n }\r\n\r\n /** Gets or sets the execution context */\r\n public get executionContext() {\r\n return this._executionContext;\r\n }\r\n\r\n /** Gets or sets the instancing context */\r\n public get instancingContext() {\r\n return this._instancingContext;\r\n }\r\n\r\n /**\r\n * Push the new active geometry context\r\n * @param geometryContext defines the geometry context\r\n */\r\n public pushGeometryContext(geometryContext: VertexData) {\r\n this._geometryContext = geometryContext;\r\n this._geometryContextStack.push(this._geometryContext);\r\n }\r\n\r\n /**\r\n * Push the new active execution context\r\n * @param executionContext defines the execution context\r\n */\r\n public pushExecutionContext(executionContext: INodeGeometryExecutionContext) {\r\n this._executionContext = executionContext;\r\n this._executionContextStack.push(this._executionContext);\r\n }\r\n\r\n /**\r\n * Push the new active instancing context\r\n * @param instancingContext defines the instancing context\r\n */\r\n public pushInstancingContext(instancingContext: INodeGeometryInstancingContext) {\r\n this._instancingContext = instancingContext;\r\n this._instancingContextStack.push(this._instancingContext);\r\n }\r\n\r\n /**\r\n * Remove current geometry context and restore the previous one\r\n */\r\n public restoreGeometryContext() {\r\n this._geometryContextStack.pop();\r\n this._geometryContext = this._geometryContextStack.length > 0 ? this._geometryContextStack[this._geometryContextStack.length - 1] : null;\r\n }\r\n\r\n /**\r\n * Remove current execution context and restore the previous one\r\n */\r\n public restoreExecutionContext() {\r\n this._executionContextStack.pop();\r\n this._executionContext = this._executionContextStack.length > 0 ? this._executionContextStack[this._executionContextStack.length - 1] : null;\r\n }\r\n\r\n /**\r\n * Remove current isntancing context and restore the previous one\r\n */\r\n public restoreInstancingContext() {\r\n this._instancingContextStack.pop();\r\n this._instancingContext = this._instancingContextStack.length > 0 ? this._instancingContextStack[this._instancingContextStack.length - 1] : null;\r\n }\r\n\r\n /**\r\n * Gets the value associated with a contextual source\r\n * @param source Source of the contextual value\r\n * @param skipWarning Do not store the warning for reporting if true\r\n * @returns the value associated with the source\r\n */\r\n public getContextualValue(source: NodeGeometryContextualSources, skipWarning = false) {\r\n if (!this.executionContext) {\r\n if (!skipWarning) {\r\n this.noContextualData.push(source);\r\n }\r\n return null;\r\n }\r\n\r\n const index = this.executionContext.getExecutionIndex();\r\n\r\n switch (source) {\r\n case NodeGeometryContextualSources.Positions:\r\n if (this.executionContext.getOverridePositionsContextualValue) {\r\n return this.executionContext.getOverridePositionsContextualValue();\r\n }\r\n if (!this.geometryContext || !this.geometryContext.positions) {\r\n return Vector3.Zero();\r\n }\r\n return Vector3.FromArray(this.geometryContext.positions as ArrayLike<number>, index * 3);\r\n case NodeGeometryContextualSources.Normals:\r\n if (this.executionContext.getOverrideNormalsContextualValue) {\r\n return this.executionContext.getOverrideNormalsContextualValue();\r\n }\r\n if (!this.geometryContext || !this.geometryContext.normals) {\r\n return Vector3.Zero();\r\n }\r\n return Vector3.FromArray(this.geometryContext.normals as ArrayLike<number>, index * 3);\r\n case NodeGeometryContextualSources.Colors:\r\n if (!this.geometryContext || !this.geometryContext.colors) {\r\n return Vector4.Zero();\r\n }\r\n return Vector4.FromArray(this.geometryContext.colors as ArrayLike<number>, index * 4);\r\n case NodeGeometryContextualSources.Tangents:\r\n if (!this.geometryContext || !this.geometryContext.tangents) {\r\n return Vector4.Zero();\r\n }\r\n return Vector4.FromArray(this.geometryContext.tangents as ArrayLike<number>, index * 4);\r\n case NodeGeometryContextualSources.UV:\r\n if (!this.geometryContext || !this.geometryContext.uvs) {\r\n return Vector2.Zero();\r\n }\r\n return Vector2.FromArray(this.geometryContext.uvs as ArrayLike<number>, index * 2);\r\n case NodeGeometryContextualSources.UV2:\r\n if (!this.geometryContext || !this.geometryContext.uvs2) {\r\n return Vector2.Zero();\r\n }\r\n return Vector2.FromArray(this.geometryContext.uvs2 as ArrayLike<number>, index * 2);\r\n case NodeGeometryContextualSources.UV3:\r\n if (!this.geometryContext || !this.geometryContext.uvs3) {\r\n return Vector2.Zero();\r\n }\r\n return Vector2.FromArray(this.geometryContext.uvs3 as ArrayLike<number>, index * 2);\r\n case NodeGeometryContextualSources.UV4:\r\n if (!this.geometryContext || !this.geometryContext.uvs4) {\r\n return Vector2.Zero();\r\n }\r\n return Vector2.FromArray(this.geometryContext.uvs4 as ArrayLike<number>, index * 2);\r\n case NodeGeometryContextualSources.UV5:\r\n if (!this.geometryContext || !this.geometryContext.uvs5) {\r\n return Vector2.Zero();\r\n }\r\n return Vector2.FromArray(this.geometryContext.uvs5 as ArrayLike<number>, index * 2);\r\n case NodeGeometryContextualSources.UV6:\r\n if (!this.geometryContext || !this.geometryContext.uvs6) {\r\n return Vector2.Zero();\r\n }\r\n return Vector2.FromArray(this.geometryContext.uvs6 as ArrayLike<number>, index * 2);\r\n case NodeGeometryContextualSources.VertexID:\r\n return index;\r\n case NodeGeometryContextualSources.FaceID:\r\n return this.executionContext.getExecutionFaceIndex();\r\n case NodeGeometryContextualSources.LoopID:\r\n return this.executionContext.getExecutionLoopIndex();\r\n case NodeGeometryContextualSources.InstanceID:\r\n return this.instancingContext ? this.instancingContext.getInstanceIndex() : 0;\r\n case NodeGeometryContextualSources.GeometryID:\r\n return !this.geometryContext ? 0 : this.geometryContext.uniqueId;\r\n case NodeGeometryContextualSources.CollectionID: {\r\n if (!this.geometryContext || !this.geometryContext.metadata) {\r\n return 0;\r\n }\r\n return this.geometryContext.metadata.collectionId || 0;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Adapt a value to a target type\r\n * @param source defines the value to adapt\r\n * @param targetType defines the target type\r\n * @returns the adapted value\r\n */\r\n adapt(source: NodeGeometryConnectionPoint, targetType: NodeGeometryBlockConnectionPointTypes) {\r\n const value = source.getConnectedValue(this) || 0;\r\n\r\n if (source.type === targetType) {\r\n return value;\r\n }\r\n\r\n switch (targetType) {\r\n case NodeGeometryBlockConnectionPointTypes.Vector2:\r\n return new Vector2(value, value);\r\n case NodeGeometryBlockConnectionPointTypes.Vector3:\r\n return new Vector3(value, value, value);\r\n case NodeGeometryBlockConnectionPointTypes.Vector4:\r\n return new Vector4(value, value, value, value);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Adapt an input value to a target type\r\n * @param source defines the value to adapt\r\n * @param targetType defines the target type\r\n * @param defaultValue defines the default value to use if not connected\r\n * @returns the adapted value\r\n */\r\n adaptInput(source: NodeGeometryConnectionPoint, targetType: NodeGeometryBlockConnectionPointTypes, defaultValue: any) {\r\n if (!source.isConnected) {\r\n return source.value || defaultValue;\r\n }\r\n\r\n const value = source.getConnectedValue(this);\r\n\r\n if (source._connectedPoint?.type === targetType) {\r\n return value;\r\n }\r\n\r\n switch (targetType) {\r\n case NodeGeometryBlockConnectionPointTypes.Vector2:\r\n return new Vector2(value, value);\r\n case NodeGeometryBlockConnectionPointTypes.Vector3:\r\n return new Vector3(value, value, value);\r\n case NodeGeometryBlockConnectionPointTypes.Vector4:\r\n return new Vector4(value, value, value, value);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Emits console errors and exceptions if there is a failing check\r\n */\r\n public emitErrors() {\r\n let errorMessage = \"\";\r\n\r\n for (const notConnectedInput of this.notConnectedNonOptionalInputs) {\r\n errorMessage += `input ${notConnectedInput.name} from block ${\r\n notConnectedInput.ownerBlock.name\r\n }[${notConnectedInput.ownerBlock.getClassName()}] is not connected and is not optional.\\n`;\r\n }\r\n\r\n for (const source of this.noContextualData) {\r\n errorMessage += `Contextual input ${NodeGeometryContextualSources[source]} has no context to pull data from (must be connected to a setXXX block or a instantiateXXX block).\\n`;\r\n }\r\n\r\n if (errorMessage) {\r\n throw \"Build of NodeGeometry failed:\\n\" + errorMessage;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _instantiate(clone: VertexData, currentPosition: Vector3, rotation: Vector3, scaling: Vector3, additionalVertexData: VertexData[]) {\r\n // Transform\r\n Matrix.ScalingToRef(scaling.x, scaling.y, scaling.z, this._scalingMatrix);\r\n Matrix.RotationYawPitchRollToRef(rotation.y, rotation.x, rotation.z, this._rotationMatrix);\r\n Matrix.TranslationToRef(currentPosition.x, currentPosition.y, currentPosition.z, this._positionMatrix);\r\n\r\n this._scalingMatrix.multiplyToRef(this._rotationMatrix, this._scalingRotationMatrix);\r\n this._scalingRotationMatrix.multiplyToRef(this._positionMatrix, this._transformMatrix);\r\n for (let clonePositionIndex = 0; clonePositionIndex < clone.positions!.length; clonePositionIndex += 3) {\r\n this._tempVector3.fromArray(clone.positions!, clonePositionIndex);\r\n Vector3.TransformCoordinatesToRef(this._tempVector3, this._transformMatrix, this._tempVector3);\r\n this._tempVector3.toArray(clone.positions!, clonePositionIndex);\r\n\r\n if (clone.normals) {\r\n this._tempVector3.fromArray(clone.normals, clonePositionIndex);\r\n Vector3.TransformNormalToRef(this._tempVector3, this._scalingRotationMatrix, this._tempVector3);\r\n this._tempVector3.toArray(clone.normals, clonePositionIndex);\r\n }\r\n }\r\n\r\n additionalVertexData.push(clone);\r\n }\r\n\r\n /** @internal */\r\n public _instantiateWithMatrix(clone: VertexData, transform: Matrix, additionalVertexData: VertexData[]) {\r\n for (let clonePositionIndex = 0; clonePositionIndex < clone.positions!.length; clonePositionIndex += 3) {\r\n this._tempVector3.fromArray(clone.positions!, clonePositionIndex);\r\n Vector3.TransformCoordinatesToRef(this._tempVector3, transform, this._tempVector3);\r\n this._tempVector3.toArray(clone.positions!, clonePositionIndex);\r\n\r\n if (clone.normals) {\r\n this._tempVector3.fromArray(clone.normals, clonePositionIndex);\r\n Vector3.TransformNormalToRef(this._tempVector3, transform, this._tempVector3);\r\n this._tempVector3.toArray(clone.normals, clonePositionIndex);\r\n }\r\n }\r\n\r\n additionalVertexData.push(clone);\r\n }\r\n\r\n /** @internal */\r\n public _instantiateWithPositionAndMatrix(clone: VertexData, currentPosition: Vector3, transform: Matrix, additionalVertexData: VertexData[]) {\r\n Matrix.TranslationToRef(currentPosition.x, currentPosition.y, currentPosition.z, this._positionMatrix);\r\n transform.multiplyToRef(this._positionMatrix, this._transformMatrix);\r\n\r\n for (let clonePositionIndex = 0; clonePositionIndex < clone.positions!.length; clonePositionIndex += 3) {\r\n this._tempVector3.fromArray(clone.positions!, clonePositionIndex);\r\n Vector3.TransformCoordinatesToRef(this._tempVector3, this._transformMatrix, this._tempVector3);\r\n this._tempVector3.toArray(clone.positions!, clonePositionIndex);\r\n\r\n if (clone.normals) {\r\n this._tempVector3.fromArray(clone.normals, clonePositionIndex);\r\n Vector3.TransformNormalToRef(this._tempVector3, this._transformMatrix, this._tempVector3);\r\n this._tempVector3.toArray(clone.normals, clonePositionIndex);\r\n }\r\n }\r\n\r\n additionalVertexData.push(clone);\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meshSimplification.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/meshSimplification.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IndicesArray } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { AsyncLoop } from \"../Misc/tools\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\n/**\r\n * A simplifier interface for future simplification implementations\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport interface ISimplifier {\r\n /**\r\n * Simplification of a given mesh according to the given settings.\r\n * Since this requires computation, it is assumed that the function runs async.\r\n * @param settings The settings of the simplification, including quality and distance\r\n * @param successCallback A callback that will be called after the mesh was simplified.\r\n * @param errorCallback in case of an error, this callback will be called. optional.\r\n */\r\n simplify(settings: ISimplificationSettings, successCallback: (simplifiedMeshes: Mesh) => void, errorCallback?: () => void): void;\r\n}\r\n\r\n/**\r\n * Expected simplification settings.\r\n * Quality should be between 0 and 1 (1 being 100%, 0 being 0%)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport interface ISimplificationSettings {\r\n /**\r\n * Gets or sets the expected quality\r\n */\r\n quality: number;\r\n /**\r\n * Gets or sets the distance when this optimized version should be used\r\n */\r\n distance: number;\r\n /**\r\n * Gets an already optimized mesh\r\n */\r\n optimizeMesh?: boolean;\r\n}\r\n\r\n/**\r\n * Class used to specify simplification options\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class SimplificationSettings implements ISimplificationSettings {\r\n /**\r\n * Creates a SimplificationSettings\r\n * @param quality expected quality\r\n * @param distance distance when this optimized version should be used\r\n * @param optimizeMesh already optimized mesh\r\n */\r\n constructor(\r\n /** expected quality */\r\n public quality: number,\r\n /** distance when this optimized version should be used */\r\n public distance: number,\r\n /** already optimized mesh */\r\n public optimizeMesh?: boolean\r\n ) {}\r\n}\r\n\r\n/**\r\n * Interface used to define a simplification task\r\n */\r\nexport interface ISimplificationTask {\r\n /**\r\n * Array of settings\r\n */\r\n settings: Array<ISimplificationSettings>;\r\n /**\r\n * Simplification type\r\n */\r\n simplificationType: SimplificationType;\r\n /**\r\n * Mesh to simplify\r\n */\r\n mesh: Mesh;\r\n /**\r\n * Callback called on success\r\n */\r\n successCallback?: () => void;\r\n /**\r\n * Defines if parallel processing can be used\r\n */\r\n parallelProcessing: boolean;\r\n}\r\n\r\n/**\r\n * Queue used to order the simplification tasks\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class SimplificationQueue {\r\n private _simplificationArray: Array<ISimplificationTask>;\r\n\r\n /**\r\n * Gets a boolean indicating that the process is still running\r\n */\r\n public running: boolean;\r\n\r\n /**\r\n * Creates a new queue\r\n */\r\n constructor() {\r\n this.running = false;\r\n this._simplificationArray = [];\r\n }\r\n\r\n /**\r\n * Adds a new simplification task\r\n * @param task defines a task to add\r\n */\r\n public addTask(task: ISimplificationTask) {\r\n this._simplificationArray.push(task);\r\n }\r\n\r\n /**\r\n * Execute next task\r\n */\r\n public executeNext() {\r\n const task = this._simplificationArray.pop();\r\n if (task) {\r\n this.running = true;\r\n this.runSimplification(task);\r\n } else {\r\n this.running = false;\r\n }\r\n }\r\n\r\n /**\r\n * Execute a simplification task\r\n * @param task defines the task to run\r\n */\r\n public runSimplification(task: ISimplificationTask) {\r\n if (task.parallelProcessing) {\r\n //parallel simplifier\r\n task.settings.forEach((setting) => {\r\n const simplifier = this._getSimplifier(task);\r\n simplifier.simplify(setting, (newMesh) => {\r\n if (setting.distance !== undefined) {\r\n task.mesh.addLODLevel(setting.distance, newMesh);\r\n }\r\n newMesh.isVisible = true;\r\n //check if it is the last\r\n if (setting.quality === task.settings[task.settings.length - 1].quality && task.successCallback) {\r\n //all done, run the success callback.\r\n task.successCallback();\r\n }\r\n this.executeNext();\r\n });\r\n });\r\n } else {\r\n //single simplifier.\r\n const simplifier = this._getSimplifier(task);\r\n\r\n const runDecimation = (setting: ISimplificationSettings, callback: () => void) => {\r\n simplifier.simplify(setting, (newMesh) => {\r\n if (setting.distance !== undefined) {\r\n task.mesh.addLODLevel(setting.distance, newMesh);\r\n }\r\n newMesh.isVisible = true;\r\n //run the next quality level\r\n callback();\r\n });\r\n };\r\n\r\n AsyncLoop.Run(\r\n task.settings.length,\r\n (loop: AsyncLoop) => {\r\n runDecimation(task.settings[loop.index], () => {\r\n loop.executeNext();\r\n });\r\n },\r\n () => {\r\n //execution ended, run the success callback.\r\n if (task.successCallback) {\r\n task.successCallback();\r\n }\r\n this.executeNext();\r\n }\r\n );\r\n }\r\n }\r\n\r\n private _getSimplifier(task: ISimplificationTask): ISimplifier {\r\n switch (task.simplificationType) {\r\n case SimplificationType.QUADRATIC:\r\n default:\r\n return new QuadraticErrorSimplification(task.mesh);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The implemented types of simplification\r\n * At the moment only Quadratic Error Decimation is implemented\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport enum SimplificationType {\r\n /** Quadratic error decimation */\r\n QUADRATIC,\r\n}\r\n\r\nclass DecimationTriangle {\r\n public normal: Vector3;\r\n public error: Array<number>;\r\n public deleted: boolean;\r\n public isDirty: boolean;\r\n public borderFactor: number;\r\n public deletePending: boolean;\r\n\r\n public originalOffset: number;\r\n\r\n constructor(public _vertices: Array<DecimationVertex>) {\r\n this.error = new Array<number>(4);\r\n this.deleted = false;\r\n this.isDirty = false;\r\n this.deletePending = false;\r\n this.borderFactor = 0;\r\n }\r\n}\r\n\r\nclass DecimationVertex {\r\n public q: QuadraticMatrix;\r\n public isBorder: boolean;\r\n\r\n public triangleStart: number;\r\n public triangleCount: number;\r\n\r\n public originalOffsets: Array<number>;\r\n\r\n constructor(public position: Vector3, public id: number) {\r\n this.isBorder = true;\r\n this.q = new QuadraticMatrix();\r\n this.triangleCount = 0;\r\n this.triangleStart = 0;\r\n this.originalOffsets = [];\r\n }\r\n\r\n public updatePosition(newPosition: Vector3) {\r\n this.position.copyFrom(newPosition);\r\n }\r\n}\r\n\r\nclass QuadraticMatrix {\r\n public data: Array<number>;\r\n\r\n constructor(data?: Array<number>) {\r\n this.data = new Array(10);\r\n for (let i = 0; i < 10; ++i) {\r\n if (data && data[i]) {\r\n this.data[i] = data[i];\r\n } else {\r\n this.data[i] = 0;\r\n }\r\n }\r\n }\r\n\r\n public det(a11: number, a12: number, a13: number, a21: number, a22: number, a23: number, a31: number, a32: number, a33: number): number {\r\n const det =\r\n this.data[a11] * this.data[a22] * this.data[a33] +\r\n this.data[a13] * this.data[a21] * this.data[a32] +\r\n this.data[a12] * this.data[a23] * this.data[a31] -\r\n this.data[a13] * this.data[a22] * this.data[a31] -\r\n this.data[a11] * this.data[a23] * this.data[a32] -\r\n this.data[a12] * this.data[a21] * this.data[a33];\r\n return det;\r\n }\r\n\r\n public addInPlace(matrix: QuadraticMatrix) {\r\n for (let i = 0; i < 10; ++i) {\r\n this.data[i] += matrix.data[i];\r\n }\r\n }\r\n\r\n public addArrayInPlace(data: Array<number>) {\r\n for (let i = 0; i < 10; ++i) {\r\n this.data[i] += data[i];\r\n }\r\n }\r\n\r\n public add(matrix: QuadraticMatrix): QuadraticMatrix {\r\n const m = new QuadraticMatrix();\r\n for (let i = 0; i < 10; ++i) {\r\n m.data[i] = this.data[i] + matrix.data[i];\r\n }\r\n return m;\r\n }\r\n\r\n public static FromData(a: number, b: number, c: number, d: number): QuadraticMatrix {\r\n return new QuadraticMatrix(QuadraticMatrix.DataFromNumbers(a, b, c, d));\r\n }\r\n\r\n //returning an array to avoid garbage collection\r\n public static DataFromNumbers(a: number, b: number, c: number, d: number) {\r\n return [a * a, a * b, a * c, a * d, b * b, b * c, b * d, c * c, c * d, d * d];\r\n }\r\n}\r\n\r\nclass Reference {\r\n constructor(public vertexId: number, public triangleId: number) {}\r\n}\r\n\r\n/**\r\n * An implementation of the Quadratic Error simplification algorithm.\r\n * Original paper : http://www1.cs.columbia.edu/~cs4162/html05s/garland97.pdf\r\n * Ported mostly from QSlim and http://voxels.blogspot.de/2014/05/quadric-mesh-simplification-with-source.html to babylon JS\r\n * @author RaananW\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class QuadraticErrorSimplification implements ISimplifier {\r\n private _triangles: Array<DecimationTriangle>;\r\n private _vertices: Array<DecimationVertex>;\r\n private _references: Array<Reference>;\r\n\r\n private _reconstructedMesh: Mesh;\r\n\r\n /** Gets or sets the number pf sync iterations */\r\n public syncIterations = 5000;\r\n\r\n /** Gets or sets the aggressiveness of the simplifier */\r\n public aggressiveness: number;\r\n\r\n /** Gets or sets the number of allowed iterations for decimation */\r\n public decimationIterations: number;\r\n\r\n /** Gets or sets the espilon to use for bounding box computation */\r\n public boundingBoxEpsilon: number;\r\n\r\n /**\r\n * Creates a new QuadraticErrorSimplification\r\n * @param _mesh defines the target mesh\r\n */\r\n constructor(private _mesh: Mesh) {\r\n this.aggressiveness = 7;\r\n this.decimationIterations = 100;\r\n this.boundingBoxEpsilon = Epsilon;\r\n }\r\n\r\n /**\r\n * Simplification of a given mesh according to the given settings.\r\n * Since this requires computation, it is assumed that the function runs async.\r\n * @param settings The settings of the simplification, including quality and distance\r\n * @param successCallback A callback that will be called after the mesh was simplified.\r\n */\r\n public simplify(settings: ISimplificationSettings, successCallback: (simplifiedMesh: Mesh) => void) {\r\n this._initDecimatedMesh();\r\n //iterating through the submeshes array, one after the other.\r\n AsyncLoop.Run(\r\n this._mesh.subMeshes.length,\r\n (loop: AsyncLoop) => {\r\n this._initWithMesh(\r\n loop.index,\r\n () => {\r\n this._runDecimation(settings, loop.index, () => {\r\n loop.executeNext();\r\n });\r\n },\r\n settings.optimizeMesh\r\n );\r\n },\r\n () => {\r\n setTimeout(() => {\r\n successCallback(this._reconstructedMesh);\r\n }, 0);\r\n }\r\n );\r\n }\r\n\r\n private _runDecimation(settings: ISimplificationSettings, submeshIndex: number, successCallback: () => void) {\r\n const targetCount = ~~(this._triangles.length * settings.quality);\r\n let deletedTriangles = 0;\r\n\r\n const triangleCount = this._triangles.length;\r\n\r\n const iterationFunction = (iteration: number, callback: () => void) => {\r\n setTimeout(() => {\r\n if (iteration % 5 === 0) {\r\n this._updateMesh(iteration === 0);\r\n }\r\n\r\n for (let i = 0; i < this._triangles.length; ++i) {\r\n this._triangles[i].isDirty = false;\r\n }\r\n\r\n const threshold = 0.000000001 * Math.pow(iteration + 3, this.aggressiveness);\r\n\r\n const trianglesIterator = (i: number) => {\r\n const tIdx = ~~((this._triangles.length / 2 + i) % this._triangles.length);\r\n const t = this._triangles[tIdx];\r\n if (!t) {\r\n return;\r\n }\r\n if (t.error[3] > threshold || t.deleted || t.isDirty) {\r\n return;\r\n }\r\n for (let j = 0; j < 3; ++j) {\r\n if (t.error[j] < threshold) {\r\n const deleted0: Array<boolean> = [];\r\n const deleted1: Array<boolean> = [];\r\n\r\n const v0 = t._vertices[j];\r\n const v1 = t._vertices[(j + 1) % 3];\r\n\r\n if (v0.isBorder || v1.isBorder) {\r\n continue;\r\n }\r\n\r\n const p = Vector3.Zero();\r\n // var n = Vector3.Zero();\r\n // var uv = Vector2.Zero();\r\n // var color = new Color4(0, 0, 0, 1);\r\n\r\n this._calculateError(v0, v1, p);\r\n\r\n const delTr = new Array<DecimationTriangle>();\r\n\r\n if (this._isFlipped(v0, v1, p, deleted0, delTr)) {\r\n continue;\r\n }\r\n if (this._isFlipped(v1, v0, p, deleted1, delTr)) {\r\n continue;\r\n }\r\n\r\n if (deleted0.indexOf(true) < 0 || deleted1.indexOf(true) < 0) {\r\n continue;\r\n }\r\n\r\n const uniqueArray = new Array<DecimationTriangle>();\r\n delTr.forEach((deletedT) => {\r\n if (uniqueArray.indexOf(deletedT) === -1) {\r\n deletedT.deletePending = true;\r\n uniqueArray.push(deletedT);\r\n }\r\n });\r\n\r\n if (uniqueArray.length % 2 !== 0) {\r\n continue;\r\n }\r\n\r\n v0.q = v1.q.add(v0.q);\r\n\r\n v0.updatePosition(p);\r\n\r\n const tStart = this._references.length;\r\n\r\n deletedTriangles = this._updateTriangles(v0, v0, deleted0, deletedTriangles);\r\n deletedTriangles = this._updateTriangles(v0, v1, deleted1, deletedTriangles);\r\n\r\n const tCount = this._references.length - tStart;\r\n\r\n if (tCount <= v0.triangleCount) {\r\n if (tCount) {\r\n for (let c = 0; c < tCount; c++) {\r\n this._references[v0.triangleStart + c] = this._references[tStart + c];\r\n }\r\n }\r\n } else {\r\n v0.triangleStart = tStart;\r\n }\r\n\r\n v0.triangleCount = tCount;\r\n break;\r\n }\r\n }\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, trianglesIterator, callback, () => {\r\n return triangleCount - deletedTriangles <= targetCount;\r\n });\r\n }, 0);\r\n };\r\n\r\n AsyncLoop.Run(\r\n this.decimationIterations,\r\n (loop: AsyncLoop) => {\r\n if (triangleCount - deletedTriangles <= targetCount) {\r\n loop.breakLoop();\r\n } else {\r\n iterationFunction(loop.index, () => {\r\n loop.executeNext();\r\n });\r\n }\r\n },\r\n () => {\r\n setTimeout(() => {\r\n //reconstruct this part of the mesh\r\n this._reconstructMesh(submeshIndex);\r\n successCallback();\r\n }, 0);\r\n }\r\n );\r\n }\r\n\r\n private _initWithMesh(submeshIndex: number, callback: Function, optimizeMesh?: boolean) {\r\n this._vertices = [];\r\n this._triangles = [];\r\n\r\n const positionData = this._mesh.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n const indices = this._mesh.getIndices();\r\n const submesh = this._mesh.subMeshes[submeshIndex];\r\n\r\n const findInVertices = (positionToSearch: Vector3) => {\r\n if (optimizeMesh) {\r\n for (let ii = 0; ii < this._vertices.length; ++ii) {\r\n if (this._vertices[ii].position.equalsWithEpsilon(positionToSearch, 0.0001)) {\r\n return this._vertices[ii];\r\n }\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const vertexReferences: Array<number> = [];\r\n\r\n const vertexInit = (i: number) => {\r\n if (!positionData) {\r\n return;\r\n }\r\n\r\n const offset = i + submesh.verticesStart;\r\n const position = Vector3.FromArray(positionData, offset * 3);\r\n\r\n const vertex = findInVertices(position) || new DecimationVertex(position, this._vertices.length);\r\n vertex.originalOffsets.push(offset);\r\n if (vertex.id === this._vertices.length) {\r\n this._vertices.push(vertex);\r\n }\r\n vertexReferences.push(vertex.id);\r\n };\r\n //var totalVertices = mesh.getTotalVertices();\r\n const totalVertices = submesh.verticesCount;\r\n AsyncLoop.SyncAsyncForLoop(totalVertices, (this.syncIterations / 4) >> 0, vertexInit, () => {\r\n const indicesInit = (i: number) => {\r\n if (!indices) {\r\n return;\r\n }\r\n\r\n const offset = submesh.indexStart / 3 + i;\r\n const pos = offset * 3;\r\n const i0 = indices[pos + 0];\r\n const i1 = indices[pos + 1];\r\n const i2 = indices[pos + 2];\r\n const v0: DecimationVertex = this._vertices[vertexReferences[i0 - submesh.verticesStart]];\r\n const v1: DecimationVertex = this._vertices[vertexReferences[i1 - submesh.verticesStart]];\r\n const v2: DecimationVertex = this._vertices[vertexReferences[i2 - submesh.verticesStart]];\r\n const triangle = new DecimationTriangle([v0, v1, v2]);\r\n triangle.originalOffset = pos;\r\n this._triangles.push(triangle);\r\n };\r\n AsyncLoop.SyncAsyncForLoop(submesh.indexCount / 3, this.syncIterations, indicesInit, () => {\r\n this._init(callback);\r\n });\r\n });\r\n }\r\n\r\n private _init(callback: Function) {\r\n const triangleInit1 = (i: number) => {\r\n const t = this._triangles[i];\r\n t.normal = Vector3.Cross(t._vertices[1].position.subtract(t._vertices[0].position), t._vertices[2].position.subtract(t._vertices[0].position)).normalize();\r\n for (let j = 0; j < 3; j++) {\r\n t._vertices[j].q.addArrayInPlace(QuadraticMatrix.DataFromNumbers(t.normal.x, t.normal.y, t.normal.z, -Vector3.Dot(t.normal, t._vertices[0].position)));\r\n }\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit1, () => {\r\n const triangleInit2 = (i: number) => {\r\n const t = this._triangles[i];\r\n for (let j = 0; j < 3; ++j) {\r\n t.error[j] = this._calculateError(t._vertices[j], t._vertices[(j + 1) % 3]);\r\n }\r\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit2, () => {\r\n callback();\r\n });\r\n });\r\n }\r\n\r\n private _reconstructMesh(submeshIndex: number) {\r\n const newTriangles: Array<DecimationTriangle> = [];\r\n let i: number;\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleCount = 0;\r\n }\r\n let t: DecimationTriangle;\r\n let j: number;\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n if (!this._triangles[i].deleted) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n t._vertices[j].triangleCount = 1;\r\n }\r\n newTriangles.push(t);\r\n }\r\n }\r\n\r\n const newPositionData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.PositionKind) || []);\r\n const newNormalData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.NormalKind) || []);\r\n const newUVsData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.UVKind) || []);\r\n const newColorsData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.ColorKind) || []);\r\n\r\n const normalData = this._mesh.getVerticesData(VertexBuffer.NormalKind);\r\n const uvs = this._mesh.getVerticesData(VertexBuffer.UVKind);\r\n const colorsData = this._mesh.getVerticesData(VertexBuffer.ColorKind);\r\n\r\n let vertexCount = 0;\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n const vertex = this._vertices[i];\r\n vertex.id = vertexCount;\r\n if (vertex.triangleCount) {\r\n vertex.originalOffsets.forEach((originalOffset) => {\r\n newPositionData.push(vertex.position.x);\r\n newPositionData.push(vertex.position.y);\r\n newPositionData.push(vertex.position.z);\r\n\r\n if (normalData && normalData.length) {\r\n newNormalData.push(normalData[originalOffset * 3]);\r\n newNormalData.push(normalData[originalOffset * 3 + 1]);\r\n newNormalData.push(normalData[originalOffset * 3 + 2]);\r\n }\r\n if (uvs && uvs.length) {\r\n newUVsData.push(uvs[originalOffset * 2]);\r\n newUVsData.push(uvs[originalOffset * 2 + 1]);\r\n }\r\n if (colorsData && colorsData.length) {\r\n newColorsData.push(colorsData[originalOffset * 4]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 1]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 2]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 3]);\r\n }\r\n ++vertexCount;\r\n });\r\n }\r\n }\r\n\r\n const startingIndex = this._reconstructedMesh.getTotalIndices();\r\n const startingVertex = this._reconstructedMesh.getTotalVertices();\r\n\r\n const submeshesArray = this._reconstructedMesh.subMeshes;\r\n this._reconstructedMesh.subMeshes = [];\r\n\r\n const newIndicesArray: number[] = <number[]>this._reconstructedMesh.getIndices(); //[];\r\n const originalIndices = <IndicesArray>this._mesh.getIndices();\r\n for (i = 0; i < newTriangles.length; ++i) {\r\n t = newTriangles[i]; //now get the new referencing point for each vertex\r\n [0, 1, 2].forEach((idx) => {\r\n const id = originalIndices[t.originalOffset + idx];\r\n let offset = t._vertices[idx].originalOffsets.indexOf(id);\r\n if (offset < 0) {\r\n offset = 0;\r\n }\r\n newIndicesArray.push(t._vertices[idx].id + offset + startingVertex);\r\n });\r\n }\r\n\r\n //overwriting the old vertex buffers and indices.\r\n\r\n this._reconstructedMesh.setIndices(newIndicesArray);\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.PositionKind, newPositionData);\r\n if (newNormalData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.NormalKind, newNormalData);\r\n }\r\n if (newUVsData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.UVKind, newUVsData);\r\n }\r\n if (newColorsData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.ColorKind, newColorsData);\r\n }\r\n\r\n //create submesh\r\n const originalSubmesh = this._mesh.subMeshes[submeshIndex];\r\n if (submeshIndex > 0) {\r\n this._reconstructedMesh.subMeshes = [];\r\n submeshesArray.forEach((submesh) => {\r\n SubMesh.AddToMesh(\r\n submesh.materialIndex,\r\n submesh.verticesStart,\r\n submesh.verticesCount,\r\n /* 0, newPositionData.length/3, */ submesh.indexStart,\r\n submesh.indexCount,\r\n submesh.getMesh()\r\n );\r\n });\r\n SubMesh.AddToMesh(\r\n originalSubmesh.materialIndex,\r\n startingVertex,\r\n vertexCount,\r\n /* 0, newPositionData.length / 3, */ startingIndex,\r\n newTriangles.length * 3,\r\n this._reconstructedMesh\r\n );\r\n }\r\n }\r\n\r\n private _initDecimatedMesh() {\r\n this._reconstructedMesh = new Mesh(this._mesh.name + \"Decimated\", this._mesh.getScene());\r\n this._reconstructedMesh.material = this._mesh.material;\r\n this._reconstructedMesh.parent = this._mesh.parent;\r\n this._reconstructedMesh.isVisible = false;\r\n this._reconstructedMesh.renderingGroupId = this._mesh.renderingGroupId;\r\n }\r\n\r\n private _isFlipped(vertex1: DecimationVertex, vertex2: DecimationVertex, point: Vector3, deletedArray: Array<boolean>, delTr: Array<DecimationTriangle>): boolean {\r\n for (let i = 0; i < vertex1.triangleCount; ++i) {\r\n const t = this._triangles[this._references[vertex1.triangleStart + i].triangleId];\r\n if (t.deleted) {\r\n continue;\r\n }\r\n\r\n const s = this._references[vertex1.triangleStart + i].vertexId;\r\n\r\n const v1 = t._vertices[(s + 1) % 3];\r\n const v2 = t._vertices[(s + 2) % 3];\r\n\r\n if (v1 === vertex2 || v2 === vertex2) {\r\n deletedArray[i] = true;\r\n delTr.push(t);\r\n continue;\r\n }\r\n\r\n let d1 = v1.position.subtract(point);\r\n d1 = d1.normalize();\r\n let d2 = v2.position.subtract(point);\r\n d2 = d2.normalize();\r\n if (Math.abs(Vector3.Dot(d1, d2)) > 0.999) {\r\n return true;\r\n }\r\n const normal = Vector3.Cross(d1, d2).normalize();\r\n deletedArray[i] = false;\r\n if (Vector3.Dot(normal, t.normal) < 0.2) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _updateTriangles(origVertex: DecimationVertex, vertex: DecimationVertex, deletedArray: Array<boolean>, deletedTriangles: number): number {\r\n let newDeleted = deletedTriangles;\r\n for (let i = 0; i < vertex.triangleCount; ++i) {\r\n const ref = this._references[vertex.triangleStart + i];\r\n const t = this._triangles[ref.triangleId];\r\n if (t.deleted) {\r\n continue;\r\n }\r\n if (deletedArray[i] && t.deletePending) {\r\n t.deleted = true;\r\n newDeleted++;\r\n continue;\r\n }\r\n t._vertices[ref.vertexId] = origVertex;\r\n t.isDirty = true;\r\n t.error[0] = this._calculateError(t._vertices[0], t._vertices[1]) + t.borderFactor / 2;\r\n t.error[1] = this._calculateError(t._vertices[1], t._vertices[2]) + t.borderFactor / 2;\r\n t.error[2] = this._calculateError(t._vertices[2], t._vertices[0]) + t.borderFactor / 2;\r\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\r\n this._references.push(ref);\r\n }\r\n return newDeleted;\r\n }\r\n\r\n private _identifyBorder() {\r\n for (let i = 0; i < this._vertices.length; ++i) {\r\n const vCount: Array<number> = [];\r\n const vId: Array<number> = [];\r\n const v = this._vertices[i];\r\n let j: number;\r\n for (j = 0; j < v.triangleCount; ++j) {\r\n const triangle = this._triangles[this._references[v.triangleStart + j].triangleId];\r\n for (let ii = 0; ii < 3; ii++) {\r\n let ofs = 0;\r\n const vv = triangle._vertices[ii];\r\n while (ofs < vCount.length) {\r\n if (vId[ofs] === vv.id) {\r\n break;\r\n }\r\n ++ofs;\r\n }\r\n if (ofs === vCount.length) {\r\n vCount.push(1);\r\n vId.push(vv.id);\r\n } else {\r\n vCount[ofs]++;\r\n }\r\n }\r\n }\r\n\r\n for (j = 0; j < vCount.length; ++j) {\r\n if (vCount[j] === 1) {\r\n this._vertices[vId[j]].isBorder = true;\r\n } else {\r\n this._vertices[vId[j]].isBorder = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _updateMesh(identifyBorders: boolean = false) {\r\n let i: number;\r\n if (!identifyBorders) {\r\n const newTrianglesVector: Array<DecimationTriangle> = [];\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n if (!this._triangles[i].deleted) {\r\n newTrianglesVector.push(this._triangles[i]);\r\n }\r\n }\r\n this._triangles = newTrianglesVector;\r\n }\r\n\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleCount = 0;\r\n this._vertices[i].triangleStart = 0;\r\n }\r\n let t: DecimationTriangle;\r\n let j: number;\r\n let v: DecimationVertex;\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n v = t._vertices[j];\r\n v.triangleCount++;\r\n }\r\n }\r\n\r\n let tStart = 0;\r\n\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleStart = tStart;\r\n tStart += this._vertices[i].triangleCount;\r\n this._vertices[i].triangleCount = 0;\r\n }\r\n\r\n const newReferences: Array<Reference> = new Array(this._triangles.length * 3);\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n v = t._vertices[j];\r\n newReferences[v.triangleStart + v.triangleCount] = new Reference(j, i);\r\n v.triangleCount++;\r\n }\r\n }\r\n this._references = newReferences;\r\n\r\n if (identifyBorders) {\r\n this._identifyBorder();\r\n }\r\n }\r\n\r\n private _vertexError(q: QuadraticMatrix, point: Vector3): number {\r\n const x = point.x;\r\n const y = point.y;\r\n const z = point.z;\r\n return (\r\n q.data[0] * x * x +\r\n 2 * q.data[1] * x * y +\r\n 2 * q.data[2] * x * z +\r\n 2 * q.data[3] * x +\r\n q.data[4] * y * y +\r\n 2 * q.data[5] * y * z +\r\n 2 * q.data[6] * y +\r\n q.data[7] * z * z +\r\n 2 * q.data[8] * z +\r\n q.data[9]\r\n );\r\n }\r\n\r\n private _calculateError(vertex1: DecimationVertex, vertex2: DecimationVertex, pointResult?: Vector3): number {\r\n const q = vertex1.q.add(vertex2.q);\r\n const border = vertex1.isBorder && vertex2.isBorder;\r\n let error: number = 0;\r\n const qDet = q.det(0, 1, 2, 1, 4, 5, 2, 5, 7);\r\n\r\n if (qDet !== 0 && !border) {\r\n if (!pointResult) {\r\n pointResult = Vector3.Zero();\r\n }\r\n pointResult.x = (-1 / qDet) * q.det(1, 2, 3, 4, 5, 6, 5, 7, 8);\r\n pointResult.y = (1 / qDet) * q.det(0, 2, 3, 1, 5, 6, 2, 7, 8);\r\n pointResult.z = (-1 / qDet) * q.det(0, 1, 3, 1, 4, 6, 2, 5, 8);\r\n error = this._vertexError(q, pointResult);\r\n } else {\r\n const p3 = vertex1.position.add(vertex2.position).divide(new Vector3(2, 2, 2));\r\n //var norm3 = (vertex1.normal.add(vertex2.normal)).divide(new Vector3(2, 2, 2)).normalize();\r\n const error1 = this._vertexError(q, vertex1.position);\r\n const error2 = this._vertexError(q, vertex2.position);\r\n const error3 = this._vertexError(q, p3);\r\n error = Math.min(error1, error2, error3);\r\n if (error === error1) {\r\n if (pointResult) {\r\n pointResult.copyFrom(vertex1.position);\r\n }\r\n } else if (error === error2) {\r\n if (pointResult) {\r\n pointResult.copyFrom(vertex2.position);\r\n }\r\n } else {\r\n if (pointResult) {\r\n pointResult.copyFrom(p3);\r\n }\r\n }\r\n }\r\n return error;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"meshSimplification.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/meshSimplification.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IndicesArray } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { AsyncLoop } from \"../Misc/tools\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\n/**\r\n * A simplifier interface for future simplification implementations\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport interface ISimplifier {\r\n /**\r\n * Simplification of a given mesh according to the given settings.\r\n * Since this requires computation, it is assumed that the function runs async.\r\n * @param settings The settings of the simplification, including quality and distance\r\n * @param successCallback A callback that will be called after the mesh was simplified.\r\n * @param errorCallback in case of an error, this callback will be called. optional.\r\n */\r\n simplify(settings: ISimplificationSettings, successCallback: (simplifiedMeshes: Mesh) => void, errorCallback?: () => void): void;\r\n}\r\n\r\n/**\r\n * Expected simplification settings.\r\n * Quality should be between 0 and 1 (1 being 100%, 0 being 0%)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport interface ISimplificationSettings {\r\n /**\r\n * Gets or sets the expected quality\r\n */\r\n quality: number;\r\n /**\r\n * Gets or sets the distance when this optimized version should be used\r\n */\r\n distance: number;\r\n /**\r\n * Gets an already optimized mesh\r\n */\r\n optimizeMesh?: boolean | undefined;\r\n}\r\n\r\n/**\r\n * Class used to specify simplification options\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class SimplificationSettings implements ISimplificationSettings {\r\n /**\r\n * Creates a SimplificationSettings\r\n * @param quality expected quality\r\n * @param distance distance when this optimized version should be used\r\n * @param optimizeMesh already optimized mesh\r\n */\r\n constructor(\r\n /** expected quality */\r\n public quality: number,\r\n /** distance when this optimized version should be used */\r\n public distance: number,\r\n /** already optimized mesh */\r\n public optimizeMesh?: boolean\r\n ) {}\r\n}\r\n\r\n/**\r\n * Interface used to define a simplification task\r\n */\r\nexport interface ISimplificationTask {\r\n /**\r\n * Array of settings\r\n */\r\n settings: Array<ISimplificationSettings>;\r\n /**\r\n * Simplification type\r\n */\r\n simplificationType: SimplificationType;\r\n /**\r\n * Mesh to simplify\r\n */\r\n mesh: Mesh;\r\n /**\r\n * Callback called on success\r\n */\r\n successCallback?: () => void;\r\n /**\r\n * Defines if parallel processing can be used\r\n */\r\n parallelProcessing: boolean;\r\n}\r\n\r\n/**\r\n * Queue used to order the simplification tasks\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class SimplificationQueue {\r\n private _simplificationArray: Array<ISimplificationTask>;\r\n\r\n /**\r\n * Gets a boolean indicating that the process is still running\r\n */\r\n public running: boolean;\r\n\r\n /**\r\n * Creates a new queue\r\n */\r\n constructor() {\r\n this.running = false;\r\n this._simplificationArray = [];\r\n }\r\n\r\n /**\r\n * Adds a new simplification task\r\n * @param task defines a task to add\r\n */\r\n public addTask(task: ISimplificationTask) {\r\n this._simplificationArray.push(task);\r\n }\r\n\r\n /**\r\n * Execute next task\r\n */\r\n public executeNext() {\r\n const task = this._simplificationArray.pop();\r\n if (task) {\r\n this.running = true;\r\n this.runSimplification(task);\r\n } else {\r\n this.running = false;\r\n }\r\n }\r\n\r\n /**\r\n * Execute a simplification task\r\n * @param task defines the task to run\r\n */\r\n public runSimplification(task: ISimplificationTask) {\r\n if (task.parallelProcessing) {\r\n //parallel simplifier\r\n task.settings.forEach((setting) => {\r\n const simplifier = this._getSimplifier(task);\r\n simplifier.simplify(setting, (newMesh) => {\r\n if (setting.distance !== undefined) {\r\n task.mesh.addLODLevel(setting.distance, newMesh);\r\n }\r\n newMesh.isVisible = true;\r\n //check if it is the last\r\n if (setting.quality === task.settings[task.settings.length - 1].quality && task.successCallback) {\r\n //all done, run the success callback.\r\n task.successCallback();\r\n }\r\n this.executeNext();\r\n });\r\n });\r\n } else {\r\n //single simplifier.\r\n const simplifier = this._getSimplifier(task);\r\n\r\n const runDecimation = (setting: ISimplificationSettings, callback: () => void) => {\r\n simplifier.simplify(setting, (newMesh) => {\r\n if (setting.distance !== undefined) {\r\n task.mesh.addLODLevel(setting.distance, newMesh);\r\n }\r\n newMesh.isVisible = true;\r\n //run the next quality level\r\n callback();\r\n });\r\n };\r\n\r\n AsyncLoop.Run(\r\n task.settings.length,\r\n (loop: AsyncLoop) => {\r\n runDecimation(task.settings[loop.index], () => {\r\n loop.executeNext();\r\n });\r\n },\r\n () => {\r\n //execution ended, run the success callback.\r\n if (task.successCallback) {\r\n task.successCallback();\r\n }\r\n this.executeNext();\r\n }\r\n );\r\n }\r\n }\r\n\r\n private _getSimplifier(task: ISimplificationTask): ISimplifier {\r\n switch (task.simplificationType) {\r\n case SimplificationType.QUADRATIC:\r\n default:\r\n return new QuadraticErrorSimplification(task.mesh);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The implemented types of simplification\r\n * At the moment only Quadratic Error Decimation is implemented\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport enum SimplificationType {\r\n /** Quadratic error decimation */\r\n QUADRATIC,\r\n}\r\n\r\nclass DecimationTriangle {\r\n public normal: Vector3;\r\n public error: Array<number>;\r\n public deleted: boolean;\r\n public isDirty: boolean;\r\n public borderFactor: number;\r\n public deletePending: boolean;\r\n\r\n public originalOffset: number;\r\n\r\n constructor(public _vertices: Array<DecimationVertex>) {\r\n this.error = new Array<number>(4);\r\n this.deleted = false;\r\n this.isDirty = false;\r\n this.deletePending = false;\r\n this.borderFactor = 0;\r\n }\r\n}\r\n\r\nclass DecimationVertex {\r\n public q: QuadraticMatrix;\r\n public isBorder: boolean;\r\n\r\n public triangleStart: number;\r\n public triangleCount: number;\r\n\r\n public originalOffsets: Array<number>;\r\n\r\n constructor(public position: Vector3, public id: number) {\r\n this.isBorder = true;\r\n this.q = new QuadraticMatrix();\r\n this.triangleCount = 0;\r\n this.triangleStart = 0;\r\n this.originalOffsets = [];\r\n }\r\n\r\n public updatePosition(newPosition: Vector3) {\r\n this.position.copyFrom(newPosition);\r\n }\r\n}\r\n\r\nclass QuadraticMatrix {\r\n public data: Array<number>;\r\n\r\n constructor(data?: Array<number>) {\r\n this.data = new Array(10);\r\n for (let i = 0; i < 10; ++i) {\r\n if (data && data[i]) {\r\n this.data[i] = data[i];\r\n } else {\r\n this.data[i] = 0;\r\n }\r\n }\r\n }\r\n\r\n public det(a11: number, a12: number, a13: number, a21: number, a22: number, a23: number, a31: number, a32: number, a33: number): number {\r\n const det =\r\n this.data[a11] * this.data[a22] * this.data[a33] +\r\n this.data[a13] * this.data[a21] * this.data[a32] +\r\n this.data[a12] * this.data[a23] * this.data[a31] -\r\n this.data[a13] * this.data[a22] * this.data[a31] -\r\n this.data[a11] * this.data[a23] * this.data[a32] -\r\n this.data[a12] * this.data[a21] * this.data[a33];\r\n return det;\r\n }\r\n\r\n public addInPlace(matrix: QuadraticMatrix) {\r\n for (let i = 0; i < 10; ++i) {\r\n this.data[i] += matrix.data[i];\r\n }\r\n }\r\n\r\n public addArrayInPlace(data: Array<number>) {\r\n for (let i = 0; i < 10; ++i) {\r\n this.data[i] += data[i];\r\n }\r\n }\r\n\r\n public add(matrix: QuadraticMatrix): QuadraticMatrix {\r\n const m = new QuadraticMatrix();\r\n for (let i = 0; i < 10; ++i) {\r\n m.data[i] = this.data[i] + matrix.data[i];\r\n }\r\n return m;\r\n }\r\n\r\n public static FromData(a: number, b: number, c: number, d: number): QuadraticMatrix {\r\n return new QuadraticMatrix(QuadraticMatrix.DataFromNumbers(a, b, c, d));\r\n }\r\n\r\n //returning an array to avoid garbage collection\r\n public static DataFromNumbers(a: number, b: number, c: number, d: number) {\r\n return [a * a, a * b, a * c, a * d, b * b, b * c, b * d, c * c, c * d, d * d];\r\n }\r\n}\r\n\r\nclass Reference {\r\n constructor(public vertexId: number, public triangleId: number) {}\r\n}\r\n\r\n/**\r\n * An implementation of the Quadratic Error simplification algorithm.\r\n * Original paper : http://www1.cs.columbia.edu/~cs4162/html05s/garland97.pdf\r\n * Ported mostly from QSlim and http://voxels.blogspot.de/2014/05/quadric-mesh-simplification-with-source.html to babylon JS\r\n * @author RaananW\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class QuadraticErrorSimplification implements ISimplifier {\r\n private _triangles: Array<DecimationTriangle>;\r\n private _vertices: Array<DecimationVertex>;\r\n private _references: Array<Reference>;\r\n\r\n private _reconstructedMesh: Mesh;\r\n\r\n /** Gets or sets the number pf sync iterations */\r\n public syncIterations = 5000;\r\n\r\n /** Gets or sets the aggressiveness of the simplifier */\r\n public aggressiveness: number;\r\n\r\n /** Gets or sets the number of allowed iterations for decimation */\r\n public decimationIterations: number;\r\n\r\n /** Gets or sets the espilon to use for bounding box computation */\r\n public boundingBoxEpsilon: number;\r\n\r\n /**\r\n * Creates a new QuadraticErrorSimplification\r\n * @param _mesh defines the target mesh\r\n */\r\n constructor(private _mesh: Mesh) {\r\n this.aggressiveness = 7;\r\n this.decimationIterations = 100;\r\n this.boundingBoxEpsilon = Epsilon;\r\n }\r\n\r\n /**\r\n * Simplification of a given mesh according to the given settings.\r\n * Since this requires computation, it is assumed that the function runs async.\r\n * @param settings The settings of the simplification, including quality and distance\r\n * @param successCallback A callback that will be called after the mesh was simplified.\r\n */\r\n public simplify(settings: ISimplificationSettings, successCallback: (simplifiedMesh: Mesh) => void) {\r\n this._initDecimatedMesh();\r\n //iterating through the submeshes array, one after the other.\r\n AsyncLoop.Run(\r\n this._mesh.subMeshes.length,\r\n (loop: AsyncLoop) => {\r\n this._initWithMesh(\r\n loop.index,\r\n () => {\r\n this._runDecimation(settings, loop.index, () => {\r\n loop.executeNext();\r\n });\r\n },\r\n settings.optimizeMesh\r\n );\r\n },\r\n () => {\r\n setTimeout(() => {\r\n successCallback(this._reconstructedMesh);\r\n }, 0);\r\n }\r\n );\r\n }\r\n\r\n private _runDecimation(settings: ISimplificationSettings, submeshIndex: number, successCallback: () => void) {\r\n const targetCount = ~~(this._triangles.length * settings.quality);\r\n let deletedTriangles = 0;\r\n\r\n const triangleCount = this._triangles.length;\r\n\r\n const iterationFunction = (iteration: number, callback: () => void) => {\r\n setTimeout(() => {\r\n if (iteration % 5 === 0) {\r\n this._updateMesh(iteration === 0);\r\n }\r\n\r\n for (let i = 0; i < this._triangles.length; ++i) {\r\n this._triangles[i].isDirty = false;\r\n }\r\n\r\n const threshold = 0.000000001 * Math.pow(iteration + 3, this.aggressiveness);\r\n\r\n const trianglesIterator = (i: number) => {\r\n const tIdx = ~~((this._triangles.length / 2 + i) % this._triangles.length);\r\n const t = this._triangles[tIdx];\r\n if (!t) {\r\n return;\r\n }\r\n if (t.error[3] > threshold || t.deleted || t.isDirty) {\r\n return;\r\n }\r\n for (let j = 0; j < 3; ++j) {\r\n if (t.error[j] < threshold) {\r\n const deleted0: Array<boolean> = [];\r\n const deleted1: Array<boolean> = [];\r\n\r\n const v0 = t._vertices[j];\r\n const v1 = t._vertices[(j + 1) % 3];\r\n\r\n if (v0.isBorder || v1.isBorder) {\r\n continue;\r\n }\r\n\r\n const p = Vector3.Zero();\r\n // var n = Vector3.Zero();\r\n // var uv = Vector2.Zero();\r\n // var color = new Color4(0, 0, 0, 1);\r\n\r\n this._calculateError(v0, v1, p);\r\n\r\n const delTr = new Array<DecimationTriangle>();\r\n\r\n if (this._isFlipped(v0, v1, p, deleted0, delTr)) {\r\n continue;\r\n }\r\n if (this._isFlipped(v1, v0, p, deleted1, delTr)) {\r\n continue;\r\n }\r\n\r\n if (deleted0.indexOf(true) < 0 || deleted1.indexOf(true) < 0) {\r\n continue;\r\n }\r\n\r\n const uniqueArray = new Array<DecimationTriangle>();\r\n delTr.forEach((deletedT) => {\r\n if (uniqueArray.indexOf(deletedT) === -1) {\r\n deletedT.deletePending = true;\r\n uniqueArray.push(deletedT);\r\n }\r\n });\r\n\r\n if (uniqueArray.length % 2 !== 0) {\r\n continue;\r\n }\r\n\r\n v0.q = v1.q.add(v0.q);\r\n\r\n v0.updatePosition(p);\r\n\r\n const tStart = this._references.length;\r\n\r\n deletedTriangles = this._updateTriangles(v0, v0, deleted0, deletedTriangles);\r\n deletedTriangles = this._updateTriangles(v0, v1, deleted1, deletedTriangles);\r\n\r\n const tCount = this._references.length - tStart;\r\n\r\n if (tCount <= v0.triangleCount) {\r\n if (tCount) {\r\n for (let c = 0; c < tCount; c++) {\r\n this._references[v0.triangleStart + c] = this._references[tStart + c];\r\n }\r\n }\r\n } else {\r\n v0.triangleStart = tStart;\r\n }\r\n\r\n v0.triangleCount = tCount;\r\n break;\r\n }\r\n }\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, trianglesIterator, callback, () => {\r\n return triangleCount - deletedTriangles <= targetCount;\r\n });\r\n }, 0);\r\n };\r\n\r\n AsyncLoop.Run(\r\n this.decimationIterations,\r\n (loop: AsyncLoop) => {\r\n if (triangleCount - deletedTriangles <= targetCount) {\r\n loop.breakLoop();\r\n } else {\r\n iterationFunction(loop.index, () => {\r\n loop.executeNext();\r\n });\r\n }\r\n },\r\n () => {\r\n setTimeout(() => {\r\n //reconstruct this part of the mesh\r\n this._reconstructMesh(submeshIndex);\r\n successCallback();\r\n }, 0);\r\n }\r\n );\r\n }\r\n\r\n private _initWithMesh(submeshIndex: number, callback: Function, optimizeMesh?: boolean) {\r\n this._vertices = [];\r\n this._triangles = [];\r\n\r\n const positionData = this._mesh.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n const indices = this._mesh.getIndices();\r\n const submesh = this._mesh.subMeshes[submeshIndex];\r\n\r\n const findInVertices = (positionToSearch: Vector3) => {\r\n if (optimizeMesh) {\r\n for (let ii = 0; ii < this._vertices.length; ++ii) {\r\n if (this._vertices[ii].position.equalsWithEpsilon(positionToSearch, 0.0001)) {\r\n return this._vertices[ii];\r\n }\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const vertexReferences: Array<number> = [];\r\n\r\n const vertexInit = (i: number) => {\r\n if (!positionData) {\r\n return;\r\n }\r\n\r\n const offset = i + submesh.verticesStart;\r\n const position = Vector3.FromArray(positionData, offset * 3);\r\n\r\n const vertex = findInVertices(position) || new DecimationVertex(position, this._vertices.length);\r\n vertex.originalOffsets.push(offset);\r\n if (vertex.id === this._vertices.length) {\r\n this._vertices.push(vertex);\r\n }\r\n vertexReferences.push(vertex.id);\r\n };\r\n //var totalVertices = mesh.getTotalVertices();\r\n const totalVertices = submesh.verticesCount;\r\n AsyncLoop.SyncAsyncForLoop(totalVertices, (this.syncIterations / 4) >> 0, vertexInit, () => {\r\n const indicesInit = (i: number) => {\r\n if (!indices) {\r\n return;\r\n }\r\n\r\n const offset = submesh.indexStart / 3 + i;\r\n const pos = offset * 3;\r\n const i0 = indices[pos + 0];\r\n const i1 = indices[pos + 1];\r\n const i2 = indices[pos + 2];\r\n const v0: DecimationVertex = this._vertices[vertexReferences[i0 - submesh.verticesStart]];\r\n const v1: DecimationVertex = this._vertices[vertexReferences[i1 - submesh.verticesStart]];\r\n const v2: DecimationVertex = this._vertices[vertexReferences[i2 - submesh.verticesStart]];\r\n const triangle = new DecimationTriangle([v0, v1, v2]);\r\n triangle.originalOffset = pos;\r\n this._triangles.push(triangle);\r\n };\r\n AsyncLoop.SyncAsyncForLoop(submesh.indexCount / 3, this.syncIterations, indicesInit, () => {\r\n this._init(callback);\r\n });\r\n });\r\n }\r\n\r\n private _init(callback: Function) {\r\n const triangleInit1 = (i: number) => {\r\n const t = this._triangles[i];\r\n t.normal = Vector3.Cross(t._vertices[1].position.subtract(t._vertices[0].position), t._vertices[2].position.subtract(t._vertices[0].position)).normalize();\r\n for (let j = 0; j < 3; j++) {\r\n t._vertices[j].q.addArrayInPlace(QuadraticMatrix.DataFromNumbers(t.normal.x, t.normal.y, t.normal.z, -Vector3.Dot(t.normal, t._vertices[0].position)));\r\n }\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit1, () => {\r\n const triangleInit2 = (i: number) => {\r\n const t = this._triangles[i];\r\n for (let j = 0; j < 3; ++j) {\r\n t.error[j] = this._calculateError(t._vertices[j], t._vertices[(j + 1) % 3]);\r\n }\r\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit2, () => {\r\n callback();\r\n });\r\n });\r\n }\r\n\r\n private _reconstructMesh(submeshIndex: number) {\r\n const newTriangles: Array<DecimationTriangle> = [];\r\n let i: number;\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleCount = 0;\r\n }\r\n let t: DecimationTriangle;\r\n let j: number;\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n if (!this._triangles[i].deleted) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n t._vertices[j].triangleCount = 1;\r\n }\r\n newTriangles.push(t);\r\n }\r\n }\r\n\r\n const newPositionData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.PositionKind) || []);\r\n const newNormalData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.NormalKind) || []);\r\n const newUVsData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.UVKind) || []);\r\n const newColorsData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.ColorKind) || []);\r\n\r\n const normalData = this._mesh.getVerticesData(VertexBuffer.NormalKind);\r\n const uvs = this._mesh.getVerticesData(VertexBuffer.UVKind);\r\n const colorsData = this._mesh.getVerticesData(VertexBuffer.ColorKind);\r\n\r\n let vertexCount = 0;\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n const vertex = this._vertices[i];\r\n vertex.id = vertexCount;\r\n if (vertex.triangleCount) {\r\n vertex.originalOffsets.forEach((originalOffset) => {\r\n newPositionData.push(vertex.position.x);\r\n newPositionData.push(vertex.position.y);\r\n newPositionData.push(vertex.position.z);\r\n\r\n if (normalData && normalData.length) {\r\n newNormalData.push(normalData[originalOffset * 3]);\r\n newNormalData.push(normalData[originalOffset * 3 + 1]);\r\n newNormalData.push(normalData[originalOffset * 3 + 2]);\r\n }\r\n if (uvs && uvs.length) {\r\n newUVsData.push(uvs[originalOffset * 2]);\r\n newUVsData.push(uvs[originalOffset * 2 + 1]);\r\n }\r\n if (colorsData && colorsData.length) {\r\n newColorsData.push(colorsData[originalOffset * 4]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 1]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 2]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 3]);\r\n }\r\n ++vertexCount;\r\n });\r\n }\r\n }\r\n\r\n const startingIndex = this._reconstructedMesh.getTotalIndices();\r\n const startingVertex = this._reconstructedMesh.getTotalVertices();\r\n\r\n const submeshesArray = this._reconstructedMesh.subMeshes;\r\n this._reconstructedMesh.subMeshes = [];\r\n\r\n const newIndicesArray: number[] = <number[]>this._reconstructedMesh.getIndices(); //[];\r\n const originalIndices = <IndicesArray>this._mesh.getIndices();\r\n for (i = 0; i < newTriangles.length; ++i) {\r\n t = newTriangles[i]; //now get the new referencing point for each vertex\r\n [0, 1, 2].forEach((idx) => {\r\n const id = originalIndices[t.originalOffset + idx];\r\n let offset = t._vertices[idx].originalOffsets.indexOf(id);\r\n if (offset < 0) {\r\n offset = 0;\r\n }\r\n newIndicesArray.push(t._vertices[idx].id + offset + startingVertex);\r\n });\r\n }\r\n\r\n //overwriting the old vertex buffers and indices.\r\n\r\n this._reconstructedMesh.setIndices(newIndicesArray);\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.PositionKind, newPositionData);\r\n if (newNormalData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.NormalKind, newNormalData);\r\n }\r\n if (newUVsData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.UVKind, newUVsData);\r\n }\r\n if (newColorsData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.ColorKind, newColorsData);\r\n }\r\n\r\n //create submesh\r\n const originalSubmesh = this._mesh.subMeshes[submeshIndex];\r\n if (submeshIndex > 0) {\r\n this._reconstructedMesh.subMeshes = [];\r\n submeshesArray.forEach((submesh) => {\r\n SubMesh.AddToMesh(\r\n submesh.materialIndex,\r\n submesh.verticesStart,\r\n submesh.verticesCount,\r\n /* 0, newPositionData.length/3, */ submesh.indexStart,\r\n submesh.indexCount,\r\n submesh.getMesh()\r\n );\r\n });\r\n SubMesh.AddToMesh(\r\n originalSubmesh.materialIndex,\r\n startingVertex,\r\n vertexCount,\r\n /* 0, newPositionData.length / 3, */ startingIndex,\r\n newTriangles.length * 3,\r\n this._reconstructedMesh\r\n );\r\n }\r\n }\r\n\r\n private _initDecimatedMesh() {\r\n this._reconstructedMesh = new Mesh(this._mesh.name + \"Decimated\", this._mesh.getScene());\r\n this._reconstructedMesh.material = this._mesh.material;\r\n this._reconstructedMesh.parent = this._mesh.parent;\r\n this._reconstructedMesh.isVisible = false;\r\n this._reconstructedMesh.renderingGroupId = this._mesh.renderingGroupId;\r\n }\r\n\r\n private _isFlipped(vertex1: DecimationVertex, vertex2: DecimationVertex, point: Vector3, deletedArray: Array<boolean>, delTr: Array<DecimationTriangle>): boolean {\r\n for (let i = 0; i < vertex1.triangleCount; ++i) {\r\n const t = this._triangles[this._references[vertex1.triangleStart + i].triangleId];\r\n if (t.deleted) {\r\n continue;\r\n }\r\n\r\n const s = this._references[vertex1.triangleStart + i].vertexId;\r\n\r\n const v1 = t._vertices[(s + 1) % 3];\r\n const v2 = t._vertices[(s + 2) % 3];\r\n\r\n if (v1 === vertex2 || v2 === vertex2) {\r\n deletedArray[i] = true;\r\n delTr.push(t);\r\n continue;\r\n }\r\n\r\n let d1 = v1.position.subtract(point);\r\n d1 = d1.normalize();\r\n let d2 = v2.position.subtract(point);\r\n d2 = d2.normalize();\r\n if (Math.abs(Vector3.Dot(d1, d2)) > 0.999) {\r\n return true;\r\n }\r\n const normal = Vector3.Cross(d1, d2).normalize();\r\n deletedArray[i] = false;\r\n if (Vector3.Dot(normal, t.normal) < 0.2) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _updateTriangles(origVertex: DecimationVertex, vertex: DecimationVertex, deletedArray: Array<boolean>, deletedTriangles: number): number {\r\n let newDeleted = deletedTriangles;\r\n for (let i = 0; i < vertex.triangleCount; ++i) {\r\n const ref = this._references[vertex.triangleStart + i];\r\n const t = this._triangles[ref.triangleId];\r\n if (t.deleted) {\r\n continue;\r\n }\r\n if (deletedArray[i] && t.deletePending) {\r\n t.deleted = true;\r\n newDeleted++;\r\n continue;\r\n }\r\n t._vertices[ref.vertexId] = origVertex;\r\n t.isDirty = true;\r\n t.error[0] = this._calculateError(t._vertices[0], t._vertices[1]) + t.borderFactor / 2;\r\n t.error[1] = this._calculateError(t._vertices[1], t._vertices[2]) + t.borderFactor / 2;\r\n t.error[2] = this._calculateError(t._vertices[2], t._vertices[0]) + t.borderFactor / 2;\r\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\r\n this._references.push(ref);\r\n }\r\n return newDeleted;\r\n }\r\n\r\n private _identifyBorder() {\r\n for (let i = 0; i < this._vertices.length; ++i) {\r\n const vCount: Array<number> = [];\r\n const vId: Array<number> = [];\r\n const v = this._vertices[i];\r\n let j: number;\r\n for (j = 0; j < v.triangleCount; ++j) {\r\n const triangle = this._triangles[this._references[v.triangleStart + j].triangleId];\r\n for (let ii = 0; ii < 3; ii++) {\r\n let ofs = 0;\r\n const vv = triangle._vertices[ii];\r\n while (ofs < vCount.length) {\r\n if (vId[ofs] === vv.id) {\r\n break;\r\n }\r\n ++ofs;\r\n }\r\n if (ofs === vCount.length) {\r\n vCount.push(1);\r\n vId.push(vv.id);\r\n } else {\r\n vCount[ofs]++;\r\n }\r\n }\r\n }\r\n\r\n for (j = 0; j < vCount.length; ++j) {\r\n if (vCount[j] === 1) {\r\n this._vertices[vId[j]].isBorder = true;\r\n } else {\r\n this._vertices[vId[j]].isBorder = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _updateMesh(identifyBorders: boolean = false) {\r\n let i: number;\r\n if (!identifyBorders) {\r\n const newTrianglesVector: Array<DecimationTriangle> = [];\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n if (!this._triangles[i].deleted) {\r\n newTrianglesVector.push(this._triangles[i]);\r\n }\r\n }\r\n this._triangles = newTrianglesVector;\r\n }\r\n\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleCount = 0;\r\n this._vertices[i].triangleStart = 0;\r\n }\r\n let t: DecimationTriangle;\r\n let j: number;\r\n let v: DecimationVertex;\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n v = t._vertices[j];\r\n v.triangleCount++;\r\n }\r\n }\r\n\r\n let tStart = 0;\r\n\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleStart = tStart;\r\n tStart += this._vertices[i].triangleCount;\r\n this._vertices[i].triangleCount = 0;\r\n }\r\n\r\n const newReferences: Array<Reference> = new Array(this._triangles.length * 3);\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n v = t._vertices[j];\r\n newReferences[v.triangleStart + v.triangleCount] = new Reference(j, i);\r\n v.triangleCount++;\r\n }\r\n }\r\n this._references = newReferences;\r\n\r\n if (identifyBorders) {\r\n this._identifyBorder();\r\n }\r\n }\r\n\r\n private _vertexError(q: QuadraticMatrix, point: Vector3): number {\r\n const x = point.x;\r\n const y = point.y;\r\n const z = point.z;\r\n return (\r\n q.data[0] * x * x +\r\n 2 * q.data[1] * x * y +\r\n 2 * q.data[2] * x * z +\r\n 2 * q.data[3] * x +\r\n q.data[4] * y * y +\r\n 2 * q.data[5] * y * z +\r\n 2 * q.data[6] * y +\r\n q.data[7] * z * z +\r\n 2 * q.data[8] * z +\r\n q.data[9]\r\n );\r\n }\r\n\r\n private _calculateError(vertex1: DecimationVertex, vertex2: DecimationVertex, pointResult?: Vector3): number {\r\n const q = vertex1.q.add(vertex2.q);\r\n const border = vertex1.isBorder && vertex2.isBorder;\r\n let error: number = 0;\r\n const qDet = q.det(0, 1, 2, 1, 4, 5, 2, 5, 7);\r\n\r\n if (qDet !== 0 && !border) {\r\n if (!pointResult) {\r\n pointResult = Vector3.Zero();\r\n }\r\n pointResult.x = (-1 / qDet) * q.det(1, 2, 3, 4, 5, 6, 5, 7, 8);\r\n pointResult.y = (1 / qDet) * q.det(0, 2, 3, 1, 5, 6, 2, 7, 8);\r\n pointResult.z = (-1 / qDet) * q.det(0, 1, 3, 1, 4, 6, 2, 5, 8);\r\n error = this._vertexError(q, pointResult);\r\n } else {\r\n const p3 = vertex1.position.add(vertex2.position).divide(new Vector3(2, 2, 2));\r\n //var norm3 = (vertex1.normal.add(vertex2.normal)).divide(new Vector3(2, 2, 2)).normalize();\r\n const error1 = this._vertexError(q, vertex1.position);\r\n const error2 = this._vertexError(q, vertex2.position);\r\n const error3 = this._vertexError(q, p3);\r\n error = Math.min(error1, error2, error3);\r\n if (error === error1) {\r\n if (pointResult) {\r\n pointResult.copyFrom(vertex1.position);\r\n }\r\n } else if (error === error2) {\r\n if (pointResult) {\r\n pointResult.copyFrom(vertex2.position);\r\n }\r\n } else {\r\n if (pointResult) {\r\n pointResult.copyFrom(p3);\r\n }\r\n }\r\n }\r\n return error;\r\n }\r\n}\r\n"]}
|
package/Meshes/subMesh.js
CHANGED
|
@@ -189,7 +189,7 @@ export class SubMesh {
|
|
|
189
189
|
* @returns current bounding info (or mesh's one if the submesh is global)
|
|
190
190
|
*/
|
|
191
191
|
getBoundingInfo() {
|
|
192
|
-
if (this.IsGlobal) {
|
|
192
|
+
if (this.IsGlobal || this._mesh.hasThinInstances) {
|
|
193
193
|
return this._mesh.getBoundingInfo();
|
|
194
194
|
}
|
|
195
195
|
return this._boundingInfo;
|