diff --git a/source/model/model.js b/source/model/model.js index 61b6240..fa8f80b 100644 --- a/source/model/model.js +++ b/source/model/model.js @@ -76,6 +76,13 @@ OV.Model = class extends OV.ModelObject3D return this.meshes.length - 1; } + AddMeshToRootNode (mesh) + { + const meshIndex = this.AddMesh (mesh); + this.root.AddMeshIndex (meshIndex); + return meshIndex; + } + AddMeshToIndex (mesh, index) { this.meshes.splice (index, 0, mesh); diff --git a/source/model/modelutils.js b/source/model/modelutils.js index 2559ee3..fe801f5 100644 --- a/source/model/modelutils.js +++ b/source/model/modelutils.js @@ -85,69 +85,6 @@ OV.CloneMesh = function (mesh) return cloned; }; -OV.CreateMergedModel = function (model) -{ - function MergeMesh (mesh, mergedMesh) - { - let vertexOffset = mergedMesh.VertexCount (); - let normalOffset = mergedMesh.NormalCount (); - let uvOffset = mergedMesh.TextureUVCount (); - - for (let i = 0; i < mesh.VertexCount (); i++) { - let vertex = mesh.GetVertex (i); - mergedMesh.AddVertex (vertex.Clone ()); - } - for (let i = 0; i < mesh.NormalCount (); i++) { - let normal = mesh.GetNormal (i); - mergedMesh.AddNormal (normal.Clone ()); - } - for (let i = 0; i < mesh.TextureUVCount (); i++) { - let uv = mesh.GetTextureUV (i); - mergedMesh.AddTextureUV (uv.Clone ()); - } - - for (let i = 0; i < mesh.TriangleCount (); i++) { - let triangle = mesh.GetTriangle (i); - let newTriangle = triangle.Clone (); - newTriangle.SetVertices ( - triangle.v0 + vertexOffset, - triangle.v1 + vertexOffset, - triangle.v2 + vertexOffset - ); - newTriangle.SetNormals ( - triangle.n0 + normalOffset, - triangle.n1 + normalOffset, - triangle.n2 + normalOffset - ); - if (newTriangle.HasTextureUVs ()) { - newTriangle.SetTextureUVs ( - triangle.u0 + uvOffset, - triangle.u1 + uvOffset, - triangle.u2 + uvOffset - ); - } - mergedMesh.AddTriangle (newTriangle); - } - } - - let mergedModel = new OV.Model (); - mergedModel.SetName (model.GetName ()); - - for (let i = 0; i < model.MaterialCount (); i++) { - let material = model.GetMaterial (i); - mergedModel.AddMaterial (material.Clone ()); - } - - let mergedMesh = new OV.Mesh (); - for (let i = 0; i < model.MeshCount (); i++) { - let mesh = model.GetMesh (i); - MergeMesh (mesh, mergedMesh); - } - - mergedModel.AddMesh (mergedMesh); - return mergedModel; -}; - OV.EnumerateModelVerticesAndTriangles = function (model, callbacks) { model.EnumerateMeshes ((mesh) => { diff --git a/source/threejs/threeconverter.js b/source/threejs/threeconverter.js index e135890..d562096 100644 --- a/source/threejs/threeconverter.js +++ b/source/threejs/threeconverter.js @@ -302,7 +302,7 @@ OV.ConvertModelToThreeObject = function (model, params, output, callbacks) OV.RunTasksBatch (node.MeshIndexCount (), 100, { runTask : (firstNodeMeshIndex, lastNodeMeshIndex, ready) => { for (let nodeMeshIndex = firstNodeMeshIndex; nodeMeshIndex <= lastNodeMeshIndex; nodeMeshIndex++) { - let meshInstanceId = new OV.MeshInstanceId (OV.InvalidNodeId, node.GetMeshIndex (nodeMeshIndex)); + let meshInstanceId = new OV.MeshInstanceId (node.GetId (), node.GetMeshIndex (nodeMeshIndex)); ConvertMesh (threeNode, model, meshInstanceId, modelThreeMaterials); } ready (); @@ -323,7 +323,7 @@ OV.ConvertModelToThreeObject = function (model, params, output, callbacks) OV.RunTasksBatch (model.MeshCount (), 100, { runTask : (firstIndex, lastIndex, ready) => { for (let meshIndex = firstIndex; meshIndex <= lastIndex; meshIndex++) { - let meshInstanceId = new OV.MeshInstanceId (OV.InvalidNodeId, meshIndex); + let meshInstanceId = new OV.MeshInstanceId (model.GetRootNode ().GetId (), meshIndex); ConvertMesh (threeObject, model, meshInstanceId, modelThreeMaterials); } ready (); @@ -347,6 +347,7 @@ OV.ConvertModelToThreeObject = function (model, params, output, callbacks) if (!rootNode.IsEmpty ()) { ConvertNodeHierarchy (threeObject, model, modelThreeMaterials, stateHandler); } else { + // TODO: remove ConvertMeshList (threeObject, model, modelThreeMaterials, stateHandler); } }; diff --git a/test/tests/modelutils_test.js b/test/tests/modelutils_test.js index 7330783..7eadb9c 100644 --- a/test/tests/modelutils_test.js +++ b/test/tests/modelutils_test.js @@ -2,83 +2,6 @@ var assert = require ('assert'); var testUtils = require ('../utils/testutils.js'); describe ('Model Utils', function () { - it ('Create Merged Model', function () { - var model = new OV.Model (); - - var mesh1 = new OV.Mesh (); - mesh1.AddVertex (new OV.Coord3D (0.0, 0.0, 0.0)); - mesh1.AddVertex (new OV.Coord3D (1.0, 0.0, 0.0)); - mesh1.AddVertex (new OV.Coord3D (1.0, 1.0, 0.0)); - mesh1.AddTriangle (new OV.Triangle (0, 1, 2)); - model.AddMesh (mesh1); - - var mesh2 = new OV.Mesh (); - mesh2.AddVertex (new OV.Coord3D (0.0, 0.0, 1.0)); - mesh2.AddVertex (new OV.Coord3D (1.0, 0.0, 1.0)); - mesh2.AddVertex (new OV.Coord3D (1.0, 1.0, 1.0)); - mesh2.AddTriangle (new OV.Triangle (0, 1, 2)); - model.AddMesh (mesh2); - - OV.FinalizeModel (model, function () { return new OV.Material (OV.MaterialType.Phong); }); - assert.deepStrictEqual (testUtils.ModelToObject (model), { - name : '', - materials : [ - { name : '' } - ], - meshes : [ - { - name : '', - triangles : [ - { - vertices : [0, 0, 0, 1, 0, 0, 1, 1, 0], - normals : [0, 0, 1, 0, 0, 1, 0, 0, 1], - uvs : [], - mat : 0 - } - ] - }, - { - name : '', - triangles : [ - { - vertices : [0, 0, 1, 1, 0, 1, 1, 1, 1], - normals : [0, 0, 1, 0, 0, 1, 0, 0, 1], - uvs : [], - mat : 0 - } - ] - } - ] - }); - - var mergedModel = OV.CreateMergedModel (model); - assert.deepStrictEqual (testUtils.ModelToObject (mergedModel), { - name : '', - materials : [ - { name : '' } - ], - meshes : [ - { - name : '', - triangles : [ - { - vertices : [0, 0, 0, 1, 0, 0, 1, 1, 0], - normals : [0, 0, 1, 0, 0, 1, 0, 0, 1], - uvs : [], - mat : 0 - }, - { - vertices : [0, 0, 1, 1, 0, 1, 1, 1, 1], - normals : [0, 0, 1, 0, 0, 1, 0, 0, 1], - uvs : [], - mat : 0 - } - ] - } - ] - }); - }); - it ('Mesh Bounding Box', function () { var cube = OV.GenerateCuboid (null, 1.0, 1.0, 1.0); let cubeBounds = OV.GetBoundingBox (cube); diff --git a/website/o3dv/js/navigator.js b/website/o3dv/js/navigator.js index 2fb708c..4cf145f 100644 --- a/website/o3dv/js/navigator.js +++ b/website/o3dv/js/navigator.js @@ -203,32 +203,63 @@ OV.Navigator = class materialsItem.AddChild (materialItem); } - let meshesItem = new OV.TreeViewGroupItem ('Meshes', 'meshes'); - this.treeView.AddItem (meshesItem); - meshesItem.ShowChildren (true, null); - for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { - let mesh = model.GetMesh (meshIndex); - let meshName = OV.GetMeshName (mesh.GetName ()); - let meshInstanceId = new OV.MeshInstanceId (OV.InvalidNodeId, meshIndex); - let meshItem = new OV.MeshItem (meshName, meshInstanceId, { - onShowHide : (selectedMeshId) => { - this.ToggleMeshVisibility (selectedMeshId); - }, - onFitToWindow : (selectedMeshId) => { - this.FitMeshToWindow (selectedMeshId); - }, - onSelected : (selectedMeshId) => { - this.SetSelection (new OV.Selection (OV.SelectionType.Mesh, selectedMeshId)); - } - }); - this.navigatorItems.AddMeshItem (meshInstanceId, meshItem); - meshesItem.AddChild (meshItem); - } + this.FillMeshTree (model); this.UpdateInfoPanel (); this.Resize (); } + FillMeshTree (model) + { + function AddMeshToNodeTree (navigator, model, node, meshIndex, parentItem) + { + let mesh = model.GetMesh (meshIndex); + let meshName = OV.GetMeshName (mesh.GetName ()); + let meshInstanceId = new OV.MeshInstanceId (node.GetId (), meshIndex); + let meshItem = new OV.MeshItem (meshName, meshInstanceId, { + onShowHide : (selectedMeshId) => { + navigator.ToggleMeshVisibility (selectedMeshId); + }, + onFitToWindow : (selectedMeshId) => { + navigator.FitMeshToWindow (selectedMeshId); + }, + onSelected : (selectedMeshId) => { + navigator.SetSelection (new OV.Selection (OV.SelectionType.Mesh, selectedMeshId)); + } + }); + navigator.navigatorItems.AddMeshItem (meshInstanceId, meshItem); + parentItem.AddChild (meshItem); + } + + function AddModelNodeToTree (navigator, model, node, parentItem) + { + for (let childNode of node.GetChildNodes ()) { + let nodeItem = new OV.TreeViewGroupItem (OV.GetNodeName (childNode.GetName ()), 'meshes'); + parentItem.AddChild (nodeItem); + nodeItem.ShowChildren (true, null); + AddModelNodeToTree (navigator, model, childNode, nodeItem); + } + + for (let meshIndex of node.GetMeshIndices ()) { + AddMeshToNodeTree (navigator, model, node, meshIndex, parentItem); + } + } + + let meshesItem = new OV.TreeViewGroupItem ('Meshes', 'meshes'); + this.treeView.AddItem (meshesItem); + meshesItem.ShowChildren (true, null); + + let rootNode = model.GetRootNode (); + if (!rootNode.IsEmpty ()) { + AddModelNodeToTree (this, model, rootNode, meshesItem); + } else { + // TODO: remove + for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { + AddMeshToNodeTree (this, model, rootNode, meshIndex, meshesItem); + } + } + } + MeshItemCount () { return this.navigatorItems.MeshItemCount (); diff --git a/website/o3dv/js/treeview.js b/website/o3dv/js/treeview.js index 43eca05..eb4c309 100644 --- a/website/o3dv/js/treeview.js +++ b/website/o3dv/js/treeview.js @@ -37,6 +37,7 @@ OV.TreeViewItem = class constructor (name) { this.name = name; + this.parent = null; this.mainElement = $('