diff --git a/source/model/modelfinalization.js b/source/model/modelfinalization.js index 1f396dd..a59f025 100644 --- a/source/model/modelfinalization.js +++ b/source/model/modelfinalization.js @@ -125,6 +125,18 @@ OV.FinalizeModel = function (model, getDefaultMaterial) } FinalizeMesh (mesh, getDefaultMaterialIndex); } + + let rootNode = model.GetRootNode (); + let emptyNodes = []; + rootNode.EnumerateChildren ((node) => { + if (node.IsEmpty ()) { + emptyNodes.push (node); + } + }); + for (let node of emptyNodes) { + let parentNode = node.GetParent (); + parentNode.RemoveChildNode (node); + } }; OV.CheckModel = function (model) diff --git a/source/model/node.js b/source/model/node.js index 7b4e8d1..3a031bb 100644 --- a/source/model/node.js +++ b/source/model/node.js @@ -90,6 +90,12 @@ OV.Node = class return this.childNodes.length - 1; } + RemoveChildNode (node) + { + let index = this.childNodes.indexOf (node); + this.childNodes.splice (index, 1); + } + GetChildNodes () { return this.childNodes; diff --git a/test/tests/model_test.js b/test/tests/model_test.js index 058e703..dee16c3 100644 --- a/test/tests/model_test.js +++ b/test/tests/model_test.js @@ -182,6 +182,50 @@ describe ('Model Finalization', function () { assert.strictEqual (normal.y, -0.7071067811865475); assert.strictEqual (normal.z, 0.7071067811865475); }); + + it ('Remove Empty Meshes and Nodes', function () { + let mesh = new OV.Mesh (); + let emptyMesh = new OV.Mesh (); + + let v0 = mesh.AddVertex (new OV.Coord3D (0.0, 0.0, 0.0)); + let v1 = mesh.AddVertex (new OV.Coord3D (1.0, 0.0, 0.0)); + let v2 = mesh.AddVertex (new OV.Coord3D (1.0, 1.0, 0.0)); + mesh.AddTriangle (new OV.Triangle (v0, v1, v2)); + + let model = new OV.Model () + let meshIndex = model.AddMesh (mesh); + let emptyMeshIndex = model.AddMesh (emptyMesh); + + let rootNode = model.GetRootNode (); + + let node1 = new OV.Node (); + rootNode.AddChildNode (node1); + node1.AddMeshIndex (meshIndex); + node1.AddMeshIndex (emptyMeshIndex); + + let node2 = new OV.Node (); + rootNode.AddChildNode (node2); + + let node3 = new OV.Node (); + rootNode.AddChildNode (node3); + node3.AddMeshIndex (meshIndex); + node3.AddMeshIndex (emptyMeshIndex); + + OV.FinalizeModel (model, function () { return new OV.Material (OV.MaterialType.Phong) }); + assert.strictEqual (model.MeshCount (), 1); + + let meshInstances = []; + model.EnumerateMeshInstances ((meshInstance) => { + meshInstances.push (meshInstance); + }); + assert.strictEqual (meshInstances.length, 2); + + let nodeCount = 0; + rootNode.Enumerate ((node) => { + nodeCount += 1; + }); + assert.strictEqual (nodeCount, 3); + }); }); describe ('Color Conversion', function () {