diff --git a/source/model/meshinstance.js b/source/model/meshinstance.js index a0c8546..15a7f8b 100644 --- a/source/model/meshinstance.js +++ b/source/model/meshinstance.js @@ -19,13 +19,19 @@ OV.MeshInstanceId = class OV.MeshInstance = class extends OV.ModelObject3D { - constructor (node, mesh) + constructor (id, node, mesh) { super (); + this.id = id; this.node = node; this.mesh = mesh; } + GetId () + { + return this.id; + } + VertexCount () { return this.mesh.VertexCount (); diff --git a/source/model/model.js b/source/model/model.js index b2964f2..31bad71 100644 --- a/source/model/model.js +++ b/source/model/model.js @@ -128,7 +128,8 @@ OV.Model = class extends OV.ModelObject3D return null; } let foundMesh = this.GetMesh (instanceId.meshIndex); - return new OV.MeshInstance (foundNode, foundMesh); + let id = new OV.MeshInstanceId (foundNode.GetId (), instanceId.meshIndex); + return new OV.MeshInstance (id, foundNode, foundMesh); } EnumerateMeshes (onMesh) @@ -142,8 +143,9 @@ OV.Model = class extends OV.ModelObject3D { this.root.Enumerate ((node) => { for (let meshIndex of node.GetMeshIndices ()) { + let id = new OV.MeshInstanceId (node.GetId (), meshIndex); let mesh = this.GetMesh (meshIndex); - let meshInstance = new OV.MeshInstance (node, mesh); + let meshInstance = new OV.MeshInstance (id, node, mesh); onMeshInstance (meshInstance); } }); diff --git a/test/tests/model_test.js b/test/tests/model_test.js index eea9892..124b8ca 100644 --- a/test/tests/model_test.js +++ b/test/tests/model_test.js @@ -403,4 +403,15 @@ describe ('Node Hierarchy', function () { assert.strictEqual (model.TextureUVCount (), 0); assert.strictEqual (model.TriangleCount (), 12 * 3); }); + + it ('Instance enumeration', function () { + let model = testUtils.GetTranslatedRotatedCubesModel (); + let meshInstances = []; + model.EnumerateMeshInstances ((meshInstance) => { + meshInstances.push (meshInstance); + }); + assert (meshInstances[0].GetId ().IsEqual (new OV.MeshInstanceId (0, 0))); + assert (meshInstances[1].GetId ().IsEqual (new OV.MeshInstanceId (1, 0))); + assert (meshInstances[2].GetId ().IsEqual (new OV.MeshInstanceId (3, 0))); + }); }); diff --git a/test/tests/modelutils_test.js b/test/tests/modelutils_test.js index ae5c417..0e80b67 100644 --- a/test/tests/modelutils_test.js +++ b/test/tests/modelutils_test.js @@ -14,7 +14,7 @@ describe ('Model Utils', function () { let transformation = new OV.Transformation (new OV.Matrix ().CreateTranslation (2.0, 0.0, 0.0)); let node = new OV.Node (); node.SetTransformation (transformation); - let cubeInstance = new OV.MeshInstance (node, cube); + let cubeInstance = new OV.MeshInstance (null, node, cube); let cubeInstanceBounds = OV.GetBoundingBox (cubeInstance); assert (OV.CoordIsEqual3D (cubeInstanceBounds.min, new OV.Coord3D (2.0, 0.0, 0.0))); assert (OV.CoordIsEqual3D (cubeInstanceBounds.max, new OV.Coord3D (3.0, 1.0, 1.0))); diff --git a/test/tests/quantities_test.js b/test/tests/quantities_test.js index f30cc34..c997051 100644 --- a/test/tests/quantities_test.js +++ b/test/tests/quantities_test.js @@ -105,7 +105,7 @@ describe ('Quantities', function () { const transformation = new OV.Transformation (new OV.Matrix ().CreateScale (2.0, 2.0, 2.0)); let node = new OV.Node (); node.SetTransformation (transformation); - const meshInstance = new OV.MeshInstance (node, mesh); + const meshInstance = new OV.MeshInstance (null, node, mesh); assert (OV.IsSolid (meshInstance)); assert (OV.IsEqual (OV.CalculateVolume (meshInstance), 8.0)); assert (OV.IsEqual (OV.CalculateSurfaceArea (meshInstance), 24.0));