Prepare exporter model for hierarchical export.

This commit is contained in:
kovacsv 2023-05-07 09:35:58 +02:00
parent abcf5d8722
commit 104983ef6e
10 changed files with 243 additions and 108 deletions

View File

@ -49,7 +49,7 @@ export class Exporter3dm extends ExporterBase
files.push (rhinoFile); files.push (rhinoFile);
let rhinoDoc = new this.rhino.File3dm (); let rhinoDoc = new this.rhino.File3dm ();
exporterModel.EnumerateTransformedMeshes ((mesh) => { exporterModel.EnumerateTransformedMeshInstances ((mesh) => {
let meshBuffer = ConvertMeshToMeshBuffer (mesh); let meshBuffer = ConvertMeshToMeshBuffer (mesh);
for (let primitiveIndex = 0; primitiveIndex < meshBuffer.PrimitiveCount (); primitiveIndex++) { for (let primitiveIndex = 0; primitiveIndex < meshBuffer.PrimitiveCount (); primitiveIndex++) {
let primitive = meshBuffer.GetPrimitive (primitiveIndex); let primitive = meshBuffer.GetPrimitive (primitiveIndex);

View File

@ -38,7 +38,7 @@ export class ExporterBim extends ExporterBase
this.ExportProperties (exporterModel.GetModel (), bimContent.info); this.ExportProperties (exporterModel.GetModel (), bimContent.info);
let meshId = 0; let meshId = 0;
exporterModel.EnumerateTransformedMeshes ((mesh) => { exporterModel.EnumerateTransformedMeshInstances ((mesh) => {
let bimMesh = { let bimMesh = {
mesh_id : meshId, mesh_id : meshId,
coordinates : [], coordinates : [],

View File

@ -184,7 +184,7 @@ export class ExporterGltf extends ExporterBase
{ {
let meshDataArr = []; let meshDataArr = [];
exporterModel.EnumerateTransformedMeshes ((mesh) => { exporterModel.EnumerateTransformedMeshInstances ((mesh) => {
let buffer = ConvertMeshToMeshBuffer (mesh); let buffer = ConvertMeshToMeshBuffer (mesh);
meshDataArr.push ({ meshDataArr.push ({
name : mesh.GetName (), name : mesh.GetName (),

View File

@ -21,6 +21,8 @@ export class ExporterModel
{ {
this.model = model; this.model = model;
this.settings = settings || new ExporterSettings (); this.settings = settings || new ExporterSettings ();
this.visibleMeshes = null;
this.meshToVisibleMeshIndex = null;
} }
GetModel () GetModel ()
@ -56,6 +58,32 @@ export class ExporterModel
return triangleCount; return triangleCount;
} }
MeshCount ()
{
let meshCount = 0;
this.EnumerateMeshes ((mesh) => {
meshCount += 1;
});
return meshCount;
}
EnumerateMeshes (onMesh)
{
this.FillVisibleMeshCache ();
for (let meshIndex = 0; meshIndex < this.model.MeshCount (); meshIndex++) {
if (this.visibleMeshes.has (meshIndex)) {
let mesh = this.model.GetMesh (meshIndex);
onMesh (mesh);
}
}
}
MapMeshIndex (meshIndex)
{
this.FillVisibleMeshCache ();
return this.meshToVisibleMeshIndex.get (meshIndex);
}
MeshInstanceCount () MeshInstanceCount ()
{ {
let meshInstanceCount = 0; let meshInstanceCount = 0;
@ -74,7 +102,7 @@ export class ExporterModel
}); });
} }
EnumerateTransformedMeshes (onMesh) EnumerateTransformedMeshInstances (onMesh)
{ {
this.EnumerateMeshInstances ((meshInstance) => { this.EnumerateMeshInstances ((meshInstance) => {
let transformation = meshInstance.GetTransformation (); let transformation = meshInstance.GetTransformation ();
@ -95,7 +123,7 @@ export class ExporterModel
EnumerateVerticesAndTriangles (callbacks) EnumerateVerticesAndTriangles (callbacks)
{ {
let transformedMeshes = []; let transformedMeshes = [];
this.EnumerateTransformedMeshes ((mesh) => { this.EnumerateTransformedMeshInstances ((mesh) => {
transformedMeshes.push (mesh); transformedMeshes.push (mesh);
}); });
@ -116,11 +144,35 @@ export class ExporterModel
EnumerateTrianglesWithNormals (onTriangle) EnumerateTrianglesWithNormals (onTriangle)
{ {
this.EnumerateTransformedMeshes ((mesh) => { this.EnumerateTransformedMeshInstances ((mesh) => {
mesh.EnumerateTriangleVertices ((v0, v1, v2) => { mesh.EnumerateTriangleVertices ((v0, v1, v2) => {
let normal = CalculateTriangleNormal (v0, v1, v2); let normal = CalculateTriangleNormal (v0, v1, v2);
onTriangle (v0, v1, v2, normal); onTriangle (v0, v1, v2, normal);
}); });
}); });
} }
FillVisibleMeshCache ()
{
if (this.visibleMeshes !== null && this.meshToVisibleMeshIndex !== null) {
return;
}
this.visibleMeshes = new Set ();
this.model.EnumerateMeshInstances ((meshInstance) => {
let meshInstanceId = meshInstance.GetId ();
if (this.settings.isMeshVisible (meshInstanceId)) {
this.visibleMeshes.add (meshInstanceId.meshIndex);
}
});
this.meshToVisibleMeshIndex = new Map ();
let visibleMeshIndex = 0;
for (let meshIndex = 0; meshIndex < this.model.MeshCount (); meshIndex++) {
if (this.visibleMeshes.has (meshIndex)) {
this.meshToVisibleMeshIndex.set (meshIndex, visibleMeshIndex);
visibleMeshIndex += 1;
}
}
}
} }

View File

@ -68,7 +68,7 @@ export class ExporterObj extends ExporterBase
let normalOffset = 0; let normalOffset = 0;
let uvOffset = 0; let uvOffset = 0;
let usedMaterialName = null; let usedMaterialName = null;
exporterModel.EnumerateTransformedMeshes ((mesh) => { exporterModel.EnumerateTransformedMeshInstances ((mesh) => {
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);

View File

@ -164,7 +164,7 @@ export class Model extends ModelObject3D
}); });
} }
EnumerateTransformedMeshes (onMesh) EnumerateTransformedMeshInstances (onMesh)
{ {
this.EnumerateMeshInstances ((meshInstance) => { this.EnumerateMeshInstances ((meshInstance) => {
const transformed = meshInstance.GetTransformedMesh (); const transformed = meshInstance.GetTransformedMesh ();

View File

@ -1,5 +1,6 @@
import * as assert from 'assert'; import * as assert from 'assert';
import * as OV from '../../source/engine/main.js'; import * as OV from '../../source/engine/main.js';
import { CreateHierarchicalTestModelForExport } from '../utils/testutils.js';
export default function suite () export default function suite ()
{ {
@ -63,10 +64,9 @@ function CreateTestModel ()
return model; return model;
} }
function Export (model, format, extension, onReady) function Export (model, settings, format, extension, onReady)
{ {
let exporter = new OV.Exporter (); let exporter = new OV.Exporter ();
let settings = new OV.ExporterSettings ();
exporter.Export (model, settings, format, extension, { exporter.Export (model, settings, format, extension, {
onSuccess : function (files) { onSuccess : function (files) {
onReady (files); onReady (files);
@ -88,7 +88,8 @@ describe ('Exporter', function () {
it ('Obj Export', function (done) { it ('Obj Export', function (done) {
let model = CreateTestModel (); let model = CreateTestModel ();
Export (model, OV.FileFormat.Text, 'obj', function (result) { let settings = new OV.ExporterSettings ();
Export (model, settings, OV.FileFormat.Text, 'obj', function (result) {
assert.strictEqual (result.length, 5); assert.strictEqual (result.length, 5);
let mtlFile = result[0]; let mtlFile = result[0];
@ -160,7 +161,8 @@ describe ('Exporter', function () {
it ('Stl Export', function (done) { it ('Stl Export', function (done) {
let model = CreateTestModel (); let model = CreateTestModel ();
Export (model, OV.FileFormat.Text, 'stl', function (result) { let settings = new OV.ExporterSettings ();
Export (model, settings, OV.FileFormat.Text, 'stl', function (result) {
assert.strictEqual (result.length, 1); assert.strictEqual (result.length, 1);
let stlFile = result[0]; let stlFile = result[0];
@ -206,7 +208,8 @@ describe ('Exporter', function () {
it ('Stl Binary Export', function (done) { it ('Stl Binary Export', function (done) {
let model = CreateTestModel (); let model = CreateTestModel ();
Export (model, OV.FileFormat.Binary, 'stl', function (result) { let settings = new OV.ExporterSettings ();
Export (model, settings, OV.FileFormat.Binary, 'stl', function (result) {
assert.strictEqual (result.length, 1); assert.strictEqual (result.length, 1);
let stlFile = result[0]; let stlFile = result[0];
@ -233,7 +236,8 @@ describe ('Exporter', function () {
it ('Off Export', function (done) { it ('Off Export', function (done) {
let model = CreateTestModel (); let model = CreateTestModel ();
Export (model, OV.FileFormat.Text, 'off', function (result) { let settings = new OV.ExporterSettings ();
Export (model, settings, OV.FileFormat.Text, 'off', function (result) {
assert.strictEqual (result.length, 1); assert.strictEqual (result.length, 1);
let offFile = result[0]; let offFile = result[0];
@ -263,7 +267,8 @@ describe ('Exporter', function () {
it ('Ply Export', function (done) { it ('Ply Export', function (done) {
let model = CreateTestModel (); let model = CreateTestModel ();
Export (model, OV.FileFormat.Text, 'ply', function (result) { let settings = new OV.ExporterSettings ();
Export (model, settings, OV.FileFormat.Text, 'ply', function (result) {
assert.strictEqual (result.length, 1); assert.strictEqual (result.length, 1);
let plyFile = result[0]; let plyFile = result[0];
@ -300,7 +305,8 @@ describe ('Exporter', function () {
it ('Ply Binary Export', function (done) { it ('Ply Binary Export', function (done) {
let model = CreateTestModel (); let model = CreateTestModel ();
Export (model, OV.FileFormat.Binary, 'ply', function (result) { let settings = new OV.ExporterSettings ();
Export (model, settings, OV.FileFormat.Binary, 'ply', function (result) {
assert.strictEqual (result.length, 1); assert.strictEqual (result.length, 1);
let plyFile = result[0]; let plyFile = result[0];
@ -325,7 +331,8 @@ describe ('Exporter', function () {
it ('Gltf Ascii Export', function (done) { it ('Gltf Ascii Export', function (done) {
let model = CreateTestModel (); let model = CreateTestModel ();
Export (model, OV.FileFormat.Text, 'gltf', function (result) { let settings = new OV.ExporterSettings ();
Export (model, settings, OV.FileFormat.Text, 'gltf', function (result) {
assert.strictEqual (result.length, 3); assert.strictEqual (result.length, 3);
let gltfFile = result[0]; let gltfFile = result[0];
@ -366,7 +373,8 @@ describe ('Exporter', function () {
it ('Gltf Binary Export', function (done) { it ('Gltf Binary Export', function (done) {
let model = CreateTestModel (); let model = CreateTestModel ();
Export (model, OV.FileFormat.Binary, 'glb', function (result) { let settings = new OV.ExporterSettings ();
Export (model, settings, OV.FileFormat.Binary, 'glb', function (result) {
assert.strictEqual (result.length, 1); assert.strictEqual (result.length, 1);
let glbFile = result[0]; let glbFile = result[0];
@ -395,6 +403,36 @@ describe ('Exporter', function () {
}); });
}); });
}); });
it ('Gltf Hierarchical Export No Filter', function (done) {
let model = CreateHierarchicalTestModelForExport ();
let settings = new OV.ExporterSettings ();
Export (model, settings, OV.FileFormat.Binary, 'glb', function (result) {
assert.strictEqual (result.length, 1);
let glbFile = result[0];
assert.strictEqual (glbFile.GetName (), 'model.glb');
let contentBuffer = glbFile.GetBufferContent ();
let importer = new OV.ImporterGltf ();
importer.Import (glbFile.GetName (), 'glb', contentBuffer, {
getDefaultMaterialColor () {
return new OV.RGBColor (0, 0, 0);
},
getFileBuffer (filePath) {
return null;
},
onSuccess () {
let importedModel = importer.GetModel ();
assert.ok (OV.CheckModel (importedModel));
assert.strictEqual (importedModel.MaterialCount (), 3);
assert.strictEqual (importedModel.MeshCount (), 4);
assert.strictEqual (importedModel.MeshInstanceCount (), 4);
done ();
}
});
});
});
}); });
} }

View File

@ -1,85 +1,14 @@
import * as assert from 'assert'; import * as assert from 'assert';
import * as OV from '../../source/engine/main.js'; import * as OV from '../../source/engine/main.js';
import { CreateTestModelForExport, CreateHierarchicalTestModelForExport } from '../utils/testutils.js';
export default function suite () export default function suite ()
{ {
function CreateTestModel ()
{
let model = new OV.Model ();
for (let i = 0; i < 3; i++) {
let material = new OV.PhongMaterial ();
material.name = 'Material ' + i.toString ();
model.AddMaterial (material);
}
let root = model.GetRootNode ();
for (let i = 0; i < 3; i++) {
let genParams = new OV.GeneratorParams ().SetMaterial (i);
let cube = OV.GenerateCuboid (genParams, 1.0, 1.0, 1.0);
let meshIndex = model.AddMesh (cube);
let node = new OV.Node ();
node.AddMeshIndex (meshIndex);
node.SetTransformation (new OV.Transformation (new OV.Matrix ().CreateTranslation (i, 0.0, 0.0)));
root.AddChildNode (node);
}
OV.FinalizeModel (model);
return model;
}
function CreateHierarchicalTestModel ()
{
let model = new OV.Model ();
let material1 = new OV.PhongMaterial ();
material1.name = 'Material 1';
model.AddMaterial (material1);
let material2 = new OV.PhongMaterial ();
material2.name = 'Material 1';
model.AddMaterial (material2);
let cubeParams1 = new OV.GeneratorParams ().SetMaterial (0);
let cube1 = OV.GenerateCuboid (cubeParams1, 1.0, 1.0, 1.0);
let cube1Mesh = model.AddMesh (cube1);
let cubeParams2 = new OV.GeneratorParams ().SetMaterial (1);
let cube2 = OV.GenerateCuboid (cubeParams2, 1.0, 1.0, 1.0);
let cube2Mesh = model.AddMesh (cube2);
let root = model.GetRootNode ();
let node1 = new OV.Node ();
node1.SetName ('Node 1');
let node11 = new OV.Node ();
node11.SetName ('Node 1.1');
node11.AddMeshIndex (cube1Mesh);
node1.AddChildNode (node11);
let node12 = new OV.Node ();
node12.SetName ('Node 1.2');
node12.AddMeshIndex (cube2Mesh);
node12.SetTransformation (new OV.Transformation (new OV.Matrix ().CreateTranslation (2.0, 0.0, 0.0)));
node1.AddChildNode (node12);
let node13 = new OV.Node ();
node13.SetName ('Node 1.2');
node13.AddMeshIndex (cube2Mesh);
node13.SetTransformation (new OV.Transformation (new OV.Matrix ().CreateTranslation (4.0, 0.0, 0.0)));
node1.AddChildNode (node13);
root.AddChildNode (node1);
OV.FinalizeModel (model);
return model;
}
function GetExporterModelBoundingBox (exporterModel) function GetExporterModelBoundingBox (exporterModel)
{ {
let calculator = new OV.BoundingBoxCalculator3D (); let calculator = new OV.BoundingBoxCalculator3D ();
exporterModel.EnumerateTransformedMeshes ((mesh) => { exporterModel.EnumerateTransformedMeshInstances ((mesh) => {
mesh.EnumerateVertices ((vertex) => { mesh.EnumerateVertices ((vertex) => {
calculator.AddPoint (vertex); calculator.AddPoint (vertex);
}); });
@ -90,7 +19,7 @@ function GetExporterModelBoundingBox (exporterModel)
describe ('Exporter Model', function () { describe ('Exporter Model', function () {
it ('No filter test', function () { it ('No filter test', function () {
let model = CreateTestModel (); let model = CreateTestModelForExport ();
let exporterModel = new OV.ExporterModel (model); let exporterModel = new OV.ExporterModel (model);
assert.strictEqual (exporterModel.MeshInstanceCount (), 3); assert.strictEqual (exporterModel.MeshInstanceCount (), 3);
let boundingBox = GetExporterModelBoundingBox (exporterModel); let boundingBox = GetExporterModelBoundingBox (exporterModel);
@ -99,7 +28,7 @@ describe ('Exporter Model', function () {
}); });
it ('Model filter test', function () { it ('Model filter test', function () {
let model = CreateTestModel (); let model = CreateTestModelForExport ();
let settings = new OV.ExporterSettings ({ let settings = new OV.ExporterSettings ({
isMeshVisible : (meshInstanceId) => { isMeshVisible : (meshInstanceId) => {
return !meshInstanceId.IsEqual (new OV.MeshInstanceId (3, 2)); return !meshInstanceId.IsEqual (new OV.MeshInstanceId (3, 2));
@ -115,7 +44,7 @@ describe ('Exporter Model', function () {
it ('Model transformation test', function () { it ('Model transformation test', function () {
let rotation = OV.QuaternionFromAxisAngle (new OV.Coord3D (0.0, 1.0, 0.0), -Math.PI / 2.0); let rotation = OV.QuaternionFromAxisAngle (new OV.Coord3D (0.0, 1.0, 0.0), -Math.PI / 2.0);
let model = CreateTestModel (); let model = CreateTestModelForExport ();
let settings = new OV.ExporterSettings ({ let settings = new OV.ExporterSettings ({
transformation : new OV.Transformation (new OV.Matrix ().CreateRotation (rotation.x, rotation.y, rotation.z, rotation.w)) transformation : new OV.Transformation (new OV.Matrix ().CreateRotation (rotation.x, rotation.y, rotation.z, rotation.w))
}); });
@ -129,7 +58,7 @@ describe ('Exporter Model', function () {
it ('Model filter and transformation test', function () { it ('Model filter and transformation test', function () {
let rotation = OV.QuaternionFromAxisAngle (new OV.Coord3D (0.0, 1.0, 0.0), -Math.PI / 2.0); let rotation = OV.QuaternionFromAxisAngle (new OV.Coord3D (0.0, 1.0, 0.0), -Math.PI / 2.0);
let model = CreateTestModel (); let model = CreateTestModelForExport ();
let settings = new OV.ExporterSettings ({ let settings = new OV.ExporterSettings ({
transformation : new OV.Transformation (new OV.Matrix ().CreateRotation (rotation.x, rotation.y, rotation.z, rotation.w)), transformation : new OV.Transformation (new OV.Matrix ().CreateRotation (rotation.x, rotation.y, rotation.z, rotation.w)),
isMeshVisible : (meshInstanceId) => { isMeshVisible : (meshInstanceId) => {
@ -144,45 +73,66 @@ describe ('Exporter Model', function () {
}); });
it ('Hierarchical model test no filter', function () { it ('Hierarchical model test no filter', function () {
let model = CreateHierarchicalTestModel (); let model = CreateHierarchicalTestModelForExport ();
let settings = new OV.ExporterSettings ({ let settings = new OV.ExporterSettings ({
isMeshVisible : (meshInstanceId) => { isMeshVisible : (meshInstanceId) => {
return true; return true;
} }
}); });
let exporterModel = new OV.ExporterModel (model, settings); let exporterModel = new OV.ExporterModel (model, settings);
assert.strictEqual (exporterModel.MeshInstanceCount (), 3); assert.strictEqual (exporterModel.MeshCount (), 3);
assert.strictEqual (exporterModel.MeshInstanceCount (), 4);
let boundingBox = GetExporterModelBoundingBox (exporterModel); let boundingBox = GetExporterModelBoundingBox (exporterModel);
assert.ok (OV.CoordIsEqual3D (boundingBox.min, new OV.Coord3D (0.0, 0.0, 0.0))); assert.ok (OV.CoordIsEqual3D (boundingBox.min, new OV.Coord3D (0.0, 0.0, 0.0)));
assert.ok (OV.CoordIsEqual3D (boundingBox.max, new OV.Coord3D (5.0, 1.0, 1.0))); assert.ok (OV.CoordIsEqual3D (boundingBox.max, new OV.Coord3D (7.0, 1.0, 1.0)));
}); });
it ('Hierarchical model test filter', function () { it ('Hierarchical model test filter 1', function () {
let model = CreateHierarchicalTestModel (); let model = CreateHierarchicalTestModelForExport ();
let settings = new OV.ExporterSettings ({ let settings = new OV.ExporterSettings ({
isMeshVisible : (meshInstanceId) => { isMeshVisible : (meshInstanceId) => {
return !meshInstanceId.IsEqual (new OV.MeshInstanceId (3, 1)); return !meshInstanceId.IsEqual (new OV.MeshInstanceId (3, 1));
} }
}); });
let exporterModel = new OV.ExporterModel (model, settings); let exporterModel = new OV.ExporterModel (model, settings);
assert.strictEqual (exporterModel.MeshInstanceCount (), 2); assert.strictEqual (exporterModel.MeshCount (), 3);
assert.strictEqual (exporterModel.MeshInstanceCount (), 3);
let boundingBox = GetExporterModelBoundingBox (exporterModel); let boundingBox = GetExporterModelBoundingBox (exporterModel);
assert.ok (OV.CoordIsEqual3D (boundingBox.min, new OV.Coord3D (0.0, 0.0, 0.0))); assert.ok (OV.CoordIsEqual3D (boundingBox.min, new OV.Coord3D (0.0, 0.0, 0.0)));
assert.ok (OV.CoordIsEqual3D (boundingBox.max, new OV.Coord3D (3.0, 1.0, 1.0))); assert.ok (OV.CoordIsEqual3D (boundingBox.max, new OV.Coord3D (7.0, 1.0, 1.0)));
}); });
it ('Hierarchical model test filter 2', function () { it ('Hierarchical model test filter 2', function () {
let model = CreateHierarchicalTestModel (); let model = CreateHierarchicalTestModelForExport ();
let settings = new OV.ExporterSettings ({ let settings = new OV.ExporterSettings ({
isMeshVisible : (meshInstanceId) => { isMeshVisible : (meshInstanceId) => {
return !meshInstanceId.IsEqual (new OV.MeshInstanceId (3, 1)) && !meshInstanceId.IsEqual (new OV.MeshInstanceId (2, 1)); return !meshInstanceId.IsEqual (new OV.MeshInstanceId (2, 1));
} }
}); });
let exporterModel = new OV.ExporterModel (model, settings); let exporterModel = new OV.ExporterModel (model, settings);
assert.strictEqual (exporterModel.MeshInstanceCount (), 1); assert.strictEqual (exporterModel.MeshCount (), 3);
assert.strictEqual (exporterModel.MeshInstanceCount (), 3);
let boundingBox = GetExporterModelBoundingBox (exporterModel); let boundingBox = GetExporterModelBoundingBox (exporterModel);
assert.ok (OV.CoordIsEqual3D (boundingBox.min, new OV.Coord3D (0.0, 0.0, 0.0))); assert.ok (OV.CoordIsEqual3D (boundingBox.min, new OV.Coord3D (0.0, 0.0, 0.0)));
assert.ok (OV.CoordIsEqual3D (boundingBox.max, new OV.Coord3D (1.0, 1.0, 1.0))); assert.ok (OV.CoordIsEqual3D (boundingBox.max, new OV.Coord3D (7.0, 1.0, 1.0)));
});
it ('Hierarchical model test filter 3', function () {
let model = CreateHierarchicalTestModelForExport ();
let settings = new OV.ExporterSettings ({
isMeshVisible : (meshInstanceId) => {
return !meshInstanceId.IsEqual (new OV.MeshInstanceId (2, 1)) && !meshInstanceId.IsEqual (new OV.MeshInstanceId (3, 1));
}
});
let exporterModel = new OV.ExporterModel (model, settings);
assert.strictEqual (exporterModel.MeshCount (), 2);
assert.strictEqual (exporterModel.MeshInstanceCount (), 2);
assert.strictEqual (exporterModel.MapMeshIndex (0), 0);
assert.strictEqual (exporterModel.MapMeshIndex (1), undefined);
assert.strictEqual (exporterModel.MapMeshIndex (2), 1);
let boundingBox = GetExporterModelBoundingBox (exporterModel);
assert.ok (OV.CoordIsEqual3D (boundingBox.min, new OV.Coord3D (0.0, 0.0, 0.0)));
assert.ok (OV.CoordIsEqual3D (boundingBox.max, new OV.Coord3D (7.0, 1.0, 1.0)));
}); });
}); });

View File

@ -390,7 +390,7 @@ describe ('Node Hierarchy', function () {
}); });
let meshes = []; let meshes = [];
model.EnumerateTransformedMeshes ((mesh) => { model.EnumerateTransformedMeshInstances ((mesh) => {
meshes.push (mesh); meshes.push (mesh);
}); });

View File

@ -138,7 +138,7 @@ export function ModelToObjectSimple (model)
}); });
} }
model.EnumerateTransformedMeshes ((mesh) => { model.EnumerateTransformedMeshInstances ((mesh) => {
let boundingBox = OV.GetBoundingBox (mesh); let boundingBox = OV.GetBoundingBox (mesh);
let meshObj = { let meshObj = {
name : mesh.GetName (), name : mesh.GetName (),
@ -378,3 +378,98 @@ export function GetTranslatedRotatedCubesModel ()
OV.FinalizeModel (model); OV.FinalizeModel (model);
return model; return model;
} }
export function CreateTestModelForExport ()
{
let model = new OV.Model ();
for (let i = 0; i < 3; i++) {
let material = new OV.PhongMaterial ();
material.name = 'Material ' + i.toString ();
model.AddMaterial (material);
}
let root = model.GetRootNode ();
for (let i = 0; i < 3; i++) {
let genParams = new OV.GeneratorParams ().SetMaterial (i);
let cube = OV.GenerateCuboid (genParams, 1.0, 1.0, 1.0);
let meshIndex = model.AddMesh (cube);
let node = new OV.Node ();
node.AddMeshIndex (meshIndex);
node.SetTransformation (new OV.Transformation (new OV.Matrix ().CreateTranslation (i, 0.0, 0.0)));
root.AddChildNode (node);
}
OV.FinalizeModel (model);
return model;
}
export function CreateHierarchicalTestModelForExport ()
{
// Node 1 (0)
// - Node 1.1 (1) -> Mesh 1 (0)
// - Node 1.2 (2) -> Mesh 2 (1)
// - Node 1.3 (3) -> Mesh 2 (1)
// - Node 1.4 (4) -> Mesh 3 (2)
let model = new OV.Model ();
let material1 = new OV.PhongMaterial ();
material1.name = 'Material 1';
material1.color = new OV.RGBColor (255, 0, 0);
model.AddMaterial (material1);
let material2 = new OV.PhongMaterial ();
material2.name = 'Material 2';
material1.color = new OV.RGBColor (0, 255, 0);
model.AddMaterial (material2);
let material3 = new OV.PhongMaterial ();
material3.name = 'Material 3';
material3.color = new OV.RGBColor (0, 0, 255);
model.AddMaterial (material3);
let cubeParams1 = new OV.GeneratorParams ().SetMaterial (0);
let cube1 = OV.GenerateCuboid (cubeParams1, 1.0, 1.0, 1.0);
let cube1Mesh = model.AddMesh (cube1);
let cubeParams2 = new OV.GeneratorParams ().SetMaterial (1);
let cube2 = OV.GenerateCuboid (cubeParams2, 1.0, 1.0, 1.0);
let cube2Mesh = model.AddMesh (cube2);
let cubeParams3 = new OV.GeneratorParams ().SetMaterial (2);
let cube3 = OV.GenerateCuboid (cubeParams3, 1.0, 1.0, 1.0);
let cube3Mesh = model.AddMesh (cube3);
let root = model.GetRootNode ();
let node1 = new OV.Node ();
node1.SetName ('Node 1');
let node11 = new OV.Node ();
node11.SetName ('Node 1.1');
node11.AddMeshIndex (cube1Mesh);
node1.AddChildNode (node11);
let node12 = new OV.Node ();
node12.SetName ('Node 1.2');
node12.AddMeshIndex (cube2Mesh);
node12.SetTransformation (new OV.Transformation (new OV.Matrix ().CreateTranslation (2.0, 0.0, 0.0)));
node1.AddChildNode (node12);
let node13 = new OV.Node ();
node13.SetName ('Node 1.3');
node13.AddMeshIndex (cube2Mesh);
node13.SetTransformation (new OV.Transformation (new OV.Matrix ().CreateTranslation (4.0, 0.0, 0.0)));
node1.AddChildNode (node13);
let node14 = new OV.Node ();
node14.SetName ('Node 1.4');
node14.AddMeshIndex (cube3Mesh);
node14.SetTransformation (new OV.Transformation (new OV.Matrix ().CreateTranslation (6.0, 0.0, 0.0)));
node1.AddChildNode (node14);
root.AddChildNode (node1);
OV.FinalizeModel (model);
return model;
}