ModelHandle/test/utils/testutils.js
2023-05-13 08:29:31 +02:00

476 lines
14 KiB
JavaScript

import * as OV from '../../source/engine/main.js';
import * as fs from 'fs';
import * as path from 'path';
export function GetTextFileContent (fileName)
{
var testFilePath = path.join (path.resolve (), 'test', 'testfiles', fileName);
if (!fs.existsSync (testFilePath)) {
return null;
}
return fs.readFileSync (testFilePath).toString ();
}
export function GetArrayBufferFileContent (fileName)
{
var testFilePath = path.join (path.resolve (), 'test', 'testfiles', fileName);
var buffer = fs.readFileSync (testFilePath);
var arrayBuffer = new ArrayBuffer (buffer.length);
var uint8Array = new Uint8Array (arrayBuffer);
var i;
for (i = 0; i < buffer.length; ++i) {
uint8Array[i] = buffer[i];
}
return arrayBuffer
}
export function ModelNodesToTree (model)
{
function AddNodeToModelTree (model, node, modelTree)
{
modelTree.name = node.HasParent () ? node.GetName () : '<Root>';
modelTree.childNodes = [];
for (const childNode of node.GetChildNodes ()) {
let childTree = {};
AddNodeToModelTree (model, childNode, childTree);
modelTree.childNodes.push (childTree);
}
modelTree.meshNames = [];
for (const meshIndex of node.GetMeshIndices ()) {
modelTree.meshNames.push (model.GetMesh (meshIndex).GetName ());
}
}
let modelTree = {};
let root = model.GetRootNode ();
AddNodeToModelTree (model, root, modelTree);
return modelTree;
}
export function ModelToObject (model)
{
var obj = {
name : model.GetName (),
materials : [],
meshes : []
};
var i, j;
var material;
for (i = 0; i < model.MaterialCount (); i++) {
material = model.GetMaterial (i);
obj.materials.push ({
name : material.name
});
}
var mesh, triangle, meshObj, triangleObj;
for (i = 0; i < model.MeshCount (); i++) {
mesh = model.GetMesh (i);
meshObj = {
name : mesh.GetName (),
triangles : []
};
for (j = 0; j < mesh.TriangleCount (); j++) {
triangle = mesh.GetTriangle (j);
triangleObj = {
mat : triangle.mat,
vertices : [],
normals : [],
uvs : []
};
triangleObj.vertices.push (
mesh.GetVertex (triangle.v0).x,
mesh.GetVertex (triangle.v0).y,
mesh.GetVertex (triangle.v0).z,
mesh.GetVertex (triangle.v1).x,
mesh.GetVertex (triangle.v1).y,
mesh.GetVertex (triangle.v1).z,
mesh.GetVertex (triangle.v2).x,
mesh.GetVertex (triangle.v2).y,
mesh.GetVertex (triangle.v2).z
);
triangleObj.normals.push (
mesh.GetNormal (triangle.n0).x,
mesh.GetNormal (triangle.n0).y,
mesh.GetNormal (triangle.n0).z,
mesh.GetNormal (triangle.n1).x,
mesh.GetNormal (triangle.n1).y,
mesh.GetNormal (triangle.n1).z,
mesh.GetNormal (triangle.n2).x,
mesh.GetNormal (triangle.n2).y,
mesh.GetNormal (triangle.n2).z
);
if (triangle.HasTextureUVs ()) {
triangleObj.uvs.push (
mesh.GetTextureUV (triangle.u0).x,
mesh.GetTextureUV (triangle.u0).y,
mesh.GetTextureUV (triangle.u1).x,
mesh.GetTextureUV (triangle.u1).y,
mesh.GetTextureUV (triangle.u2).x,
mesh.GetTextureUV (triangle.u2).y
);
}
meshObj.triangles.push (triangleObj);
}
obj.meshes.push (meshObj);
}
return obj;
}
export function ModelToObjectSimple (model)
{
var obj = {
name : model.GetName (),
materials : [],
meshes : []
};
var i;
var material;
for (i = 0; i < model.MaterialCount (); i++) {
material = model.GetMaterial (i);
obj.materials.push ({
name : material.name
});
}
model.EnumerateTransformedMeshInstances ((mesh) => {
let boundingBox = OV.GetBoundingBox (mesh);
let meshObj = {
name : mesh.GetName (),
vertexCount : mesh.VertexCount (),
vertexColorCount : mesh.VertexColorCount (),
normalCount : mesh.NormalCount (),
uvCount : mesh.TextureUVCount (),
triangleCount : mesh.TriangleCount (),
boundingBox : {
min : [boundingBox.min.x, boundingBox.min.y, boundingBox.min.z],
max : [boundingBox.max.x, boundingBox.max.y, boundingBox.max.z]
}
};
obj.meshes.push (meshObj);
});
return obj;
}
export function GetTwoCubesConnectingInOneVertexModel ()
{
let model = new OV.Model ();
let cube1 = OV.GenerateCuboid (null, 1.0, 1.0, 1.0);
model.AddMeshToRootNode (cube1);
let cube2 = OV.GenerateCuboid (null, 1.0, 1.0, 1.0);
let matrix = new OV.Matrix ().CreateTranslation (1.0, 1.0, 1.0);
OV.TransformMesh (cube2, new OV.Transformation (matrix));
model.AddMeshToRootNode (cube2);
OV.FinalizeModel (model);
return model;
}
export function GetTwoCubesConnectingInOneEdgeModel ()
{
let model = new OV.Model ();
let cube1 = OV.GenerateCuboid (null, 1.0, 1.0, 1.0);
model.AddMeshToRootNode (cube1);
let cube2 = OV.GenerateCuboid (null, 1.0, 1.0, 1.0);
let matrix = new OV.Matrix ().CreateTranslation (1.0, 0.0, 1.0);
OV.TransformMesh (cube2, new OV.Transformation (matrix))
model.AddMeshToRootNode (cube2);
OV.FinalizeModel (model);
return model;
}
export function GetTwoCubesConnectingInOneFaceModel ()
{
let model = new OV.Model ();
let cube1 = OV.GenerateCuboid (null, 1.0, 1.0, 1.0);
model.AddMeshToRootNode (cube1);
let cube2 = OV.GenerateCuboid (null, 1.0, 1.0, 1.0);
let matrix = new OV.Matrix ().CreateTranslation (1.0, 0.0, 0.0);
OV.TransformMesh (cube2, new OV.Transformation (matrix));
model.AddMeshToRootNode (cube2);
OV.FinalizeModel (model);
return model;
}
export function GetCubeWithOneMissingFaceMesh ()
{
var cube = new OV.Mesh ();
cube.AddVertex (new OV.Coord3D (0.0, 0.0, 0.0));
cube.AddVertex (new OV.Coord3D (1.0, 0.0, 0.0));
cube.AddVertex (new OV.Coord3D (1.0, 1.0, 0.0));
cube.AddVertex (new OV.Coord3D (0.0, 1.0, 0.0));
cube.AddVertex (new OV.Coord3D (0.0, 0.0, 1.0));
cube.AddVertex (new OV.Coord3D (1.0, 0.0, 1.0));
cube.AddVertex (new OV.Coord3D (1.0, 1.0, 1.0));
cube.AddVertex (new OV.Coord3D (0.0, 1.0, 1.0));
cube.AddTriangle (new OV.Triangle (0, 1, 5));
cube.AddTriangle (new OV.Triangle (0, 5, 4));
cube.AddTriangle (new OV.Triangle (1, 2, 6));
cube.AddTriangle (new OV.Triangle (1, 6, 5));
cube.AddTriangle (new OV.Triangle (2, 3, 7));
cube.AddTriangle (new OV.Triangle (2, 7, 6));
cube.AddTriangle (new OV.Triangle (3, 0, 4));
cube.AddTriangle (new OV.Triangle (3, 4, 7));
cube.AddTriangle (new OV.Triangle (0, 3, 2));
cube.AddTriangle (new OV.Triangle (0, 2, 1));
return cube;
}
export function GetTetrahedronMesh ()
{
var tetrahedron = new OV.Mesh ();
let a = 1.0;
tetrahedron.AddVertex (new OV.Coord3D (+a, +a, +a));
tetrahedron.AddVertex (new OV.Coord3D (-a, -a, +a));
tetrahedron.AddVertex (new OV.Coord3D (-a, +a, -a));
tetrahedron.AddVertex (new OV.Coord3D (+a, -a, -a));
tetrahedron.AddTriangle (new OV.Triangle (0, 1, 3));
tetrahedron.AddTriangle (new OV.Triangle (0, 2, 1));
tetrahedron.AddTriangle (new OV.Triangle (0, 3, 2));
tetrahedron.AddTriangle (new OV.Triangle (1, 2, 3));
return tetrahedron;
}
export function GetModelWithOneMesh (mesh)
{
var model = new OV.Model ();
model.AddMeshToRootNode (mesh);
OV.FinalizeModel (model);
return model;
}
export function GetHierarchicalModelNoFinalization ()
{
/*
+ <Root>
+ Node 1
+ Node 3
Mesh 5
Mesh 6
Mesh 7
+ Node 4
Mesh 7
Mesh 3
Mesh 4
+ Node 2
Mesh 1
Mesh 2
*/
let model = new OV.Model ();
let root = model.GetRootNode ();
let node1 = new OV.Node ();
node1.SetName ('Node 1');
let node2 = new OV.Node ();
node2.SetName ('Node 2');
let node3 = new OV.Node ();
node3.SetName ('Node 3');
let node4 = new OV.Node ();
node4.SetName ('Node 4');
root.AddChildNode (node1);
root.AddChildNode (node2);
node1.AddChildNode (node3);
node1.AddChildNode (node4);
let mesh1 = new OV.Mesh ();
mesh1.SetName ('Mesh 1');
let mesh2 = new OV.Mesh ();
mesh2.SetName ('Mesh 2');
let mesh3 = new OV.Mesh ();
mesh3.SetName ('Mesh 3');
let mesh4 = new OV.Mesh ();
mesh4.SetName ('Mesh 4');
let mesh5 = new OV.Mesh ();
mesh5.SetName ('Mesh 5');
let mesh6 = new OV.Mesh ();
mesh6.SetName ('Mesh 6');
let mesh7 = new OV.Mesh ();
mesh7.SetName ('Mesh 7');
let mesh1Ind = model.AddMesh (mesh1);
let mesh2Ind = model.AddMesh (mesh2);
let mesh3Ind = model.AddMesh (mesh3);
let mesh4Ind = model.AddMesh (mesh4);
let mesh5Ind = model.AddMesh (mesh5);
let mesh6Ind = model.AddMesh (mesh6);
let mesh7Ind = model.AddMesh (mesh7);
root.AddMeshIndex (mesh1Ind);
root.AddMeshIndex (mesh2Ind);
node1.AddMeshIndex (mesh3Ind);
node1.AddMeshIndex (mesh4Ind);
node3.AddMeshIndex (mesh5Ind);
node3.AddMeshIndex (mesh6Ind);
node3.AddMeshIndex (mesh7Ind);
node4.AddMeshIndex (mesh7Ind);
return model;
}
export function GetTranslatedRotatedCubesModel ()
{
/*
+ <Root>
+ Translated
Cube
+ Rotated
+ Translated and Rotated
Cube
Cube
*/
let model = new OV.Model ();
let mesh = OV.GenerateCuboid (null, 1.0, 1.0, 1.0);
mesh.SetName ('Cube');
let meshIndex = model.AddMesh (mesh);
let root = model.GetRootNode ();
root.AddMeshIndex (0);
let translatedNode = new OV.Node ();
translatedNode.SetName ('Translated');
translatedNode.SetTransformation (new OV.Transformation (new OV.Matrix ().CreateTranslation (2.0, 0.0, 0.0)));
translatedNode.AddMeshIndex (0);
let rotatedNode = new OV.Node ();
rotatedNode.SetName ('Rotated');
let rotation = OV.QuaternionFromAxisAngle (new OV.Coord3D (0.0, 0.0, 1.0), Math.PI / 2.0);
rotatedNode.SetTransformation (new OV.Transformation (new OV.Matrix ().CreateRotation (rotation.x, rotation.y, rotation.z, rotation.w)));
let translatedRotatedNode = new OV.Node ();
translatedRotatedNode.SetName ('Translated and Rotated');
translatedRotatedNode.SetTransformation (new OV.Transformation (new OV.Matrix ().CreateTranslation (2.0, 0.0, 0.0)));
translatedRotatedNode.AddMeshIndex (0);
root.AddChildNode (translatedNode);
root.AddChildNode (rotatedNode);
rotatedNode.AddChildNode (translatedRotatedNode);
OV.FinalizeModel (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';
material2.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;
}