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 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 ();

View File

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

View File

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

View File

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

View File

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

View File

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