Add mesh enumeration function to model.

This commit is contained in:
kovacsv 2021-10-17 11:42:58 +02:00
parent 4ebcddc040
commit bb9724578d
6 changed files with 45 additions and 27 deletions

View File

@ -59,8 +59,7 @@ OV.ExporterObj = class extends OV.ExporterBase
let normalOffset = 0; let normalOffset = 0;
let uvOffset = 0; let uvOffset = 0;
let usedMaterialName = null; let usedMaterialName = null;
for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { model.EnumerateMeshes ((mesh) => {
let mesh = model.GetMesh (meshIndex);
objWriter.WriteArrayLine (['g', this.GetExportedMeshName (mesh.GetName ())]); objWriter.WriteArrayLine (['g', this.GetExportedMeshName (mesh.GetName ())]);
for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) { for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) {
let vertex = mesh.GetVertex (vertexIndex); let vertex = mesh.GetVertex (vertexIndex);
@ -103,7 +102,7 @@ OV.ExporterObj = class extends OV.ExporterBase
vertexOffset += mesh.VertexCount (); vertexOffset += mesh.VertexCount ();
normalOffset += mesh.NormalCount (); normalOffset += mesh.NormalCount ();
uvOffset += mesh.TextureUVCount (); uvOffset += mesh.TextureUVCount ();
} });
objFile.SetTextContent (objWriter.GetText ()); objFile.SetTextContent (objWriter.GetText ());
onFinish (); onFinish ();

View File

@ -60,5 +60,10 @@ OV.Element = class
EnumerateTriangles (onTriangle) EnumerateTriangles (onTriangle)
{ {
} }
EnumerateTriangleVertices (onTriangleVertices)
{
}
}; };

View File

@ -90,20 +90,25 @@ OV.Mesh = class extends OV.Element
EnumerateVertices (onVertex) EnumerateVertices (onVertex)
{ {
for (let vertexIndex = 0; vertexIndex < this.vertices.length; vertexIndex++) { for (const vertex of this.vertices) {
let vertex = this.vertices[vertexIndex];
onVertex (vertex); onVertex (vertex);
} }
} }
EnumerateTriangles (onTriangle) EnumerateTriangles (onTriangle)
{ {
for (let triangleIndex = 0; triangleIndex < this.triangles.length; triangleIndex++) { for (const triangle of this.triangles) {
let triangle = this.triangles[triangleIndex]; onTriangle (triangle);
}
}
EnumerateTriangleVertices (onTriangleVertices)
{
for (const triangle of this.triangles) {
let v0 = this.vertices[triangle.v0]; let v0 = this.vertices[triangle.v0];
let v1 = this.vertices[triangle.v1]; let v1 = this.vertices[triangle.v1];
let v2 = this.vertices[triangle.v2]; let v2 = this.vertices[triangle.v2];
onTriangle (v0, v1, v2); onTriangleVertices (v0, v1, v2);
} }
} }
}; };

View File

@ -85,20 +85,32 @@ OV.Model = class extends OV.Element
{ {
return this.meshes[index]; return this.meshes[index];
} }
EnumerateMeshes (onMesh)
{
for (const mesh of this.meshes) {
onMesh (mesh);
}
}
EnumerateVertices (onVertex) EnumerateVertices (onVertex)
{ {
for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) { for (const mesh of this.meshes) {
let mesh = this.meshes[meshIndex];
mesh.EnumerateVertices (onVertex); mesh.EnumerateVertices (onVertex);
} }
} }
EnumerateTriangles (onTriangle) EnumerateTriangles (onTriangle)
{ {
for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) { for (const mesh of this.meshes) {
let mesh = this.meshes[meshIndex];
mesh.EnumerateTriangles (onTriangle); mesh.EnumerateTriangles (onTriangle);
} }
} }
EnumerateTriangleVertices (onTriangleVertices)
{
for (const mesh of this.meshes) {
mesh.EnumerateTriangleVertices (onTriangleVertices);
}
}
}; };

View File

@ -150,27 +150,24 @@ OV.CreateMergedModel = function (model)
OV.EnumerateModelVerticesAndTriangles = function (model, callbacks) OV.EnumerateModelVerticesAndTriangles = function (model, callbacks)
{ {
for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { model.EnumerateMeshes ((mesh) => {
let mesh = model.GetMesh (meshIndex);
for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) { for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) {
let vertex = mesh.GetVertex (vertexIndex); let vertex = mesh.GetVertex (vertexIndex);
callbacks.onVertex (vertex.x, vertex.y, vertex.z); callbacks.onVertex (vertex.x, vertex.y, vertex.z);
} }
} });
let vertexOffset = 0; let vertexOffset = 0;
for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { model.EnumerateMeshes ((mesh) => {
let mesh = model.GetMesh (meshIndex); mesh.EnumerateTriangles ((triangle) => {
for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) {
let triangle = mesh.GetTriangle (triangleIndex);
callbacks.onTriangle (triangle.v0 + vertexOffset, triangle.v1 + vertexOffset, triangle.v2 + vertexOffset); callbacks.onTriangle (triangle.v0 + vertexOffset, triangle.v1 + vertexOffset, triangle.v2 + vertexOffset);
} });
vertexOffset += mesh.VertexCount (); vertexOffset += mesh.VertexCount ();
} });
}; };
OV.EnumerateTrianglesWithNormals = function (element, onTriangle) OV.EnumerateTrianglesWithNormals = function (element, onTriangle)
{ {
element.EnumerateTriangles ((v0, v1, v2) => { element.EnumerateTriangleVertices ((v0, v1, v2) => {
let normal = OV.CalculateTriangleNormal (v0, v1, v2); let normal = OV.CalculateTriangleNormal (v0, v1, v2);
onTriangle (v0, v1, v2, normal); onTriangle (v0, v1, v2, normal);
}); });
@ -201,7 +198,7 @@ OV.GetTopology = function (element)
let octree = new OV.Octree (boundingBox); let octree = new OV.Octree (boundingBox);
let topology = new OV.Topology (); let topology = new OV.Topology ();
element.EnumerateTriangles ((v0, v1, v2) => { element.EnumerateTriangleVertices ((v0, v1, v2) => {
let v0Index = GetVertexIndex (v0, octree, topology); let v0Index = GetVertexIndex (v0, octree, topology);
let v1Index = GetVertexIndex (v1, octree, topology); let v1Index = GetVertexIndex (v1, octree, topology);
let v2Index = GetVertexIndex (v2, octree, topology); let v2Index = GetVertexIndex (v2, octree, topology);

View File

@ -22,7 +22,7 @@ OV.CalculateVolume = function (element)
return null; return null;
} }
let volume = 0.0; let volume = 0.0;
element.EnumerateTriangles ((v0, v1, v2) => { element.EnumerateTriangleVertices ((v0, v1, v2) => {
volume += OV.GetTetrahedronSignedVolume (v0, v1, v2); volume += OV.GetTetrahedronSignedVolume (v0, v1, v2);
}); });
return volume; return volume;
@ -31,7 +31,7 @@ OV.CalculateVolume = function (element)
OV.CalculateSurfaceArea = function (element) OV.CalculateSurfaceArea = function (element)
{ {
let surface = 0.0; let surface = 0.0;
element.EnumerateTriangles ((v0, v1, v2) => { element.EnumerateTriangleVertices ((v0, v1, v2) => {
surface += OV.GetTriangleArea (v0, v1, v2); surface += OV.GetTriangleArea (v0, v1, v2);
}); });
return surface; return surface;