Treat models with no node hierarchy as one flat hierarchy under the root node.
This commit is contained in:
parent
16a122fcf0
commit
7eac7dee43
@ -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);
|
||||
|
||||
@ -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) => {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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 ();
|
||||
|
||||
@ -37,6 +37,7 @@ OV.TreeViewItem = class
|
||||
constructor (name)
|
||||
{
|
||||
this.name = name;
|
||||
this.parent = null;
|
||||
this.mainElement = $('<div>').addClass ('ov_tree_item').attr ('title', this.name);
|
||||
this.nameElement = $('<div>').addClass ('ov_tree_item_name').html (this.name).appendTo (this.mainElement);
|
||||
}
|
||||
@ -45,6 +46,11 @@ OV.TreeViewItem = class
|
||||
{
|
||||
this.mainElement.appendTo (parentDiv);
|
||||
}
|
||||
|
||||
SetParent (parent)
|
||||
{
|
||||
this.parent = parent;
|
||||
}
|
||||
};
|
||||
|
||||
OV.TreeViewSingleItem = class extends OV.TreeViewItem
|
||||
@ -52,7 +58,6 @@ OV.TreeViewSingleItem = class extends OV.TreeViewItem
|
||||
constructor (name)
|
||||
{
|
||||
super (name);
|
||||
this.parent = null;
|
||||
this.selected = false;
|
||||
}
|
||||
|
||||
@ -68,11 +73,6 @@ OV.TreeViewSingleItem = class extends OV.TreeViewItem
|
||||
this.mainElement.removeClass ('selected');
|
||||
}
|
||||
}
|
||||
|
||||
SetParent (parent)
|
||||
{
|
||||
this.parent = parent;
|
||||
}
|
||||
};
|
||||
|
||||
OV.TreeViewButtonItem = class extends OV.TreeViewSingleItem
|
||||
|
||||
@ -6,6 +6,11 @@ OV.GetNameOrDefault = function (originalName, defaultName)
|
||||
return defaultName;
|
||||
};
|
||||
|
||||
OV.GetNodeName = function (originalName)
|
||||
{
|
||||
return OV.GetNameOrDefault (originalName, 'No Name');
|
||||
};
|
||||
|
||||
OV.GetMeshName = function (originalName)
|
||||
{
|
||||
return OV.GetNameOrDefault (originalName, 'No Name');
|
||||
|
||||
Loading…
Reference in New Issue
Block a user