From bb9724578de44e9ef4a9d91d3f0656b933dccb3c Mon Sep 17 00:00:00 2001 From: kovacsv Date: Sun, 17 Oct 2021 11:42:58 +0200 Subject: [PATCH] Add mesh enumeration function to model. --- source/export/exporterobj.js | 5 ++--- source/model/element.js | 7 ++++++- source/model/mesh.js | 17 +++++++++++------ source/model/model.js | 20 ++++++++++++++++---- source/model/modelutils.js | 19 ++++++++----------- source/model/quantities.js | 4 ++-- 6 files changed, 45 insertions(+), 27 deletions(-) diff --git a/source/export/exporterobj.js b/source/export/exporterobj.js index e981f71..8561388 100644 --- a/source/export/exporterobj.js +++ b/source/export/exporterobj.js @@ -59,8 +59,7 @@ OV.ExporterObj = class extends OV.ExporterBase let normalOffset = 0; let uvOffset = 0; let usedMaterialName = null; - for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { - let mesh = model.GetMesh (meshIndex); + model.EnumerateMeshes ((mesh) => { objWriter.WriteArrayLine (['g', this.GetExportedMeshName (mesh.GetName ())]); for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) { let vertex = mesh.GetVertex (vertexIndex); @@ -103,7 +102,7 @@ OV.ExporterObj = class extends OV.ExporterBase vertexOffset += mesh.VertexCount (); normalOffset += mesh.NormalCount (); uvOffset += mesh.TextureUVCount (); - } + }); objFile.SetTextContent (objWriter.GetText ()); onFinish (); diff --git a/source/model/element.js b/source/model/element.js index a4ea19b..7762472 100644 --- a/source/model/element.js +++ b/source/model/element.js @@ -60,5 +60,10 @@ OV.Element = class EnumerateTriangles (onTriangle) { - } + } + + EnumerateTriangleVertices (onTriangleVertices) + { + + } }; diff --git a/source/model/mesh.js b/source/model/mesh.js index 525f8c8..067a980 100644 --- a/source/model/mesh.js +++ b/source/model/mesh.js @@ -90,20 +90,25 @@ OV.Mesh = class extends OV.Element EnumerateVertices (onVertex) { - for (let vertexIndex = 0; vertexIndex < this.vertices.length; vertexIndex++) { - let vertex = this.vertices[vertexIndex]; + for (const vertex of this.vertices) { onVertex (vertex); } } EnumerateTriangles (onTriangle) { - for (let triangleIndex = 0; triangleIndex < this.triangles.length; triangleIndex++) { - let triangle = this.triangles[triangleIndex]; + for (const triangle of this.triangles) { + onTriangle (triangle); + } + } + + EnumerateTriangleVertices (onTriangleVertices) + { + for (const triangle of this.triangles) { let v0 = this.vertices[triangle.v0]; let v1 = this.vertices[triangle.v1]; let v2 = this.vertices[triangle.v2]; - onTriangle (v0, v1, v2); + onTriangleVertices (v0, v1, v2); } - } + } }; diff --git a/source/model/model.js b/source/model/model.js index 13f41d9..5a0740e 100644 --- a/source/model/model.js +++ b/source/model/model.js @@ -85,20 +85,32 @@ OV.Model = class extends OV.Element { return this.meshes[index]; } + + EnumerateMeshes (onMesh) + { + for (const mesh of this.meshes) { + onMesh (mesh); + } + } EnumerateVertices (onVertex) { - for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) { - let mesh = this.meshes[meshIndex]; + for (const mesh of this.meshes) { mesh.EnumerateVertices (onVertex); } } EnumerateTriangles (onTriangle) { - for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) { - let mesh = this.meshes[meshIndex]; + for (const mesh of this.meshes) { mesh.EnumerateTriangles (onTriangle); } } + + EnumerateTriangleVertices (onTriangleVertices) + { + for (const mesh of this.meshes) { + mesh.EnumerateTriangleVertices (onTriangleVertices); + } + } }; diff --git a/source/model/modelutils.js b/source/model/modelutils.js index fe7215d..de781ee 100644 --- a/source/model/modelutils.js +++ b/source/model/modelutils.js @@ -150,27 +150,24 @@ OV.CreateMergedModel = function (model) OV.EnumerateModelVerticesAndTriangles = function (model, callbacks) { - for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { - let mesh = model.GetMesh (meshIndex); + model.EnumerateMeshes ((mesh) => { for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) { let vertex = mesh.GetVertex (vertexIndex); callbacks.onVertex (vertex.x, vertex.y, vertex.z); } - } + }); let vertexOffset = 0; - for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { - let mesh = model.GetMesh (meshIndex); - for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) { - let triangle = mesh.GetTriangle (triangleIndex); + model.EnumerateMeshes ((mesh) => { + mesh.EnumerateTriangles ((triangle) => { callbacks.onTriangle (triangle.v0 + vertexOffset, triangle.v1 + vertexOffset, triangle.v2 + vertexOffset); - } + }); vertexOffset += mesh.VertexCount (); - } + }); }; OV.EnumerateTrianglesWithNormals = function (element, onTriangle) { - element.EnumerateTriangles ((v0, v1, v2) => { + element.EnumerateTriangleVertices ((v0, v1, v2) => { let normal = OV.CalculateTriangleNormal (v0, v1, v2); onTriangle (v0, v1, v2, normal); }); @@ -201,7 +198,7 @@ OV.GetTopology = function (element) let octree = new OV.Octree (boundingBox); let topology = new OV.Topology (); - element.EnumerateTriangles ((v0, v1, v2) => { + element.EnumerateTriangleVertices ((v0, v1, v2) => { let v0Index = GetVertexIndex (v0, octree, topology); let v1Index = GetVertexIndex (v1, octree, topology); let v2Index = GetVertexIndex (v2, octree, topology); diff --git a/source/model/quantities.js b/source/model/quantities.js index 814d288..14be1f3 100644 --- a/source/model/quantities.js +++ b/source/model/quantities.js @@ -22,7 +22,7 @@ OV.CalculateVolume = function (element) return null; } let volume = 0.0; - element.EnumerateTriangles ((v0, v1, v2) => { + element.EnumerateTriangleVertices ((v0, v1, v2) => { volume += OV.GetTetrahedronSignedVolume (v0, v1, v2); }); return volume; @@ -31,7 +31,7 @@ OV.CalculateVolume = function (element) OV.CalculateSurfaceArea = function (element) { let surface = 0.0; - element.EnumerateTriangles ((v0, v1, v2) => { + element.EnumerateTriangleVertices ((v0, v1, v2) => { surface += OV.GetTriangleArea (v0, v1, v2); }); return surface;