Remove empty nodes during model finalization.

This commit is contained in:
kovacsv 2021-10-26 19:45:26 +02:00
parent ad132b2eed
commit e6eff40543
3 changed files with 62 additions and 0 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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 () {