From 7d9e9aadbbceb8be0aaf50c7fcd6990715f32242 Mon Sep 17 00:00:00 2001 From: bzt Date: Fri, 1 Nov 2019 17:21:24 +0100 Subject: [PATCH] Asked modifications and unit test --- code/M3D/M3DExporter.cpp | 17 +++--- code/M3D/M3DMaterials.h | 4 +- code/M3D/m3d.h | 22 ++++--- test/CMakeLists.txt | 1 + test/models/M3D/README.md | 14 ----- test/models/M3D/aliveai_character.m3d | Bin 2532 -> 0 bytes test/models/M3D/mobs_dwarves_character.m3d | Bin 11255 -> 0 bytes test/unit/utM3DImportExport.cpp | 68 +++++++++++++++++++++ 8 files changed, 93 insertions(+), 33 deletions(-) delete mode 100644 test/models/M3D/README.md delete mode 100644 test/models/M3D/aliveai_character.m3d delete mode 100644 test/models/M3D/mobs_dwarves_character.m3d create mode 100644 test/unit/utM3DImportExport.cpp diff --git a/code/M3D/M3DExporter.cpp b/code/M3D/M3DExporter.cpp index 9ba48b125..c22943396 100644 --- a/code/M3D/M3DExporter.cpp +++ b/code/M3D/M3DExporter.cpp @@ -173,12 +173,9 @@ void M3DExporter::doExport ( // recursive node walker void M3DExporter::NodeWalk(const aiNode* pNode, aiMatrix4x4 m) { - unsigned int i, j, k, l, n, idx; aiMatrix4x4 nm = m * pNode->mTransformation; - m3dv_t vertex; - m3dti_t ti; - for(i = 0; i < pNode->mNumMeshes; i++) { + for(unsigned int i = 0; i < pNode->mNumMeshes; i++) { const aiMesh *mesh = mScene->mMeshes[pNode->mMeshes[i]]; unsigned int mi = (M3D_INDEX)-1U; if(mScene->mMaterials) { @@ -186,7 +183,8 @@ void M3DExporter::NodeWalk(const aiNode* pNode, aiMatrix4x4 m) mi = addMaterial(mScene->mMaterials[mesh->mMaterialIndex]); } // iterate through the mesh faces - for(j = 0; j < mesh->mNumFaces; j++) { + for(unsigned int j = 0; j < mesh->mNumFaces; j++) { + unsigned int n; const aiFace* face = &(mesh->mFaces[j]); // only triangle meshes supported for now if(face->mNumIndices != 3) { @@ -204,9 +202,12 @@ void M3DExporter::NodeWalk(const aiNode* pNode, aiMatrix4x4 m) m3d->face[n].normal[0] = m3d->face[n].normal[1] = m3d->face[n].normal[2] = m3d->face[n].texcoord[0] = m3d->face[n].texcoord[1] = m3d->face[n].texcoord[2] = -1U; m3d->face[n].materialid = mi; - for(k = 0; k < face->mNumIndices; k++) { + for(unsigned int k = 0; k < face->mNumIndices; k++) { // get the vertex's index - l = face->mIndices[k]; + unsigned int l = face->mIndices[k]; + unsigned int idx; + m3dv_t vertex; + m3dti_t ti; // multiply the position vector by the transformation matrix aiVector3D v = mesh->mVertices[l]; v *= nm; @@ -245,7 +246,7 @@ void M3DExporter::NodeWalk(const aiNode* pNode, aiMatrix4x4 m) } } // repeat for the children nodes - for (i = 0; i < pNode->mNumChildren; i++) { + for (unsigned int i = 0; i < pNode->mNumChildren; i++) { NodeWalk(pNode->mChildren[i], nm); } } diff --git a/code/M3D/M3DMaterials.h b/code/M3D/M3DMaterials.h index b3c91ab7a..fa02cf42b 100644 --- a/code/M3D/M3DMaterials.h +++ b/code/M3D/M3DMaterials.h @@ -60,7 +60,7 @@ typedef struct { } aiMatProp; /* --- Scalar Properties --- !!!!! must match m3d_propertytypes !!!!! */ -static aiMatProp aiProps[] = { +static const aiMatProp aiProps[] = { { AI_MATKEY_COLOR_DIFFUSE }, /* m3dp_Kd */ { AI_MATKEY_COLOR_AMBIENT }, /* m3dp_Ka */ { AI_MATKEY_COLOR_SPECULAR }, /* m3dp_Ks */ @@ -82,7 +82,7 @@ static aiMatProp aiProps[] = { }; /* --- Texture Map Properties --- !!!!! must match m3d_propertytypes !!!!! */ -static aiMatProp aiTxProps[] = { +static const aiMatProp aiTxProps[] = { { AI_MATKEY_TEXTURE_DIFFUSE(0) }, /* m3dp_map_Kd */ { AI_MATKEY_TEXTURE_AMBIENT(0) }, /* m3dp_map_Ka */ { AI_MATKEY_TEXTURE_SPECULAR(0) }, /* m3dp_map_Ks */ diff --git a/code/M3D/m3d.h b/code/M3D/m3d.h index 7218f83e7..b28dd5d2a 100644 --- a/code/M3D/m3d.h +++ b/code/M3D/m3d.h @@ -2144,6 +2144,10 @@ void _m3d_inv(M3D_FLOAT *m) memcpy(m, &r, sizeof(r)); } /* compose a coloumn major 4 x 4 matrix from vec3 position and vec4 orientation/rotation quaternion */ +#ifndef M3D_EPSILON +/* carefully choosen for IEEE 754 don't change */ +#define M3D_EPSILON ((M3D_FLOAT)1e-7) +#endif void _m3d_mat(M3D_FLOAT *r, m3dv_t *p, m3dv_t *q) { if(q->x == (M3D_FLOAT)0.0 && q->y == (M3D_FLOAT)0.0 && q->z >=(M3D_FLOAT) 0.7071065 && q->z <= (M3D_FLOAT)0.7071075 && @@ -2151,15 +2155,15 @@ void _m3d_mat(M3D_FLOAT *r, m3dv_t *p, m3dv_t *q) r[ 1] = r[ 2] = r[ 4] = r[ 6] = r[ 8] = r[ 9] = (M3D_FLOAT)0.0; r[ 0] = r[ 5] = r[10] = (M3D_FLOAT)-1.0; } else { - r[ 0] = 1 - 2 * (q->y * q->y + q->z * q->z); if(r[ 0]>(M3D_FLOAT)-1e-7 && r[ 0]<(M3D_FLOAT)1e-7) r[ 0]=(M3D_FLOAT)0.0; - r[ 1] = 2 * (q->x * q->y - q->z * q->w); if(r[ 1]>(M3D_FLOAT)-1e-7 && r[ 1]<(M3D_FLOAT)1e-7) r[ 1]=(M3D_FLOAT)0.0; - r[ 2] = 2 * (q->x * q->z + q->y * q->w); if(r[ 2]>(M3D_FLOAT)-1e-7 && r[ 2]<(M3D_FLOAT)1e-7) r[ 2]=(M3D_FLOAT)0.0; - r[ 4] = 2 * (q->x * q->y + q->z * q->w); if(r[ 4]>(M3D_FLOAT)-1e-7 && r[ 4]<(M3D_FLOAT)1e-7) r[ 4]=(M3D_FLOAT)0.0; - r[ 5] = 1 - 2 * (q->x * q->x + q->z * q->z); if(r[ 5]>(M3D_FLOAT)-1e-7 && r[ 5]<(M3D_FLOAT)1e-7) r[ 5]=(M3D_FLOAT)0.0; - r[ 6] = 2 * (q->y * q->z - q->x * q->w); if(r[ 6]>(M3D_FLOAT)-1e-7 && r[ 6]<(M3D_FLOAT)1e-7) r[ 6]=(M3D_FLOAT)0.0; - r[ 8] = 2 * (q->x * q->z - q->y * q->w); if(r[ 8]>(M3D_FLOAT)-1e-7 && r[ 8]<(M3D_FLOAT)1e-7) r[ 8]=(M3D_FLOAT)0.0; - r[ 9] = 2 * (q->y * q->z + q->x * q->w); if(r[ 9]>(M3D_FLOAT)-1e-7 && r[ 9]<(M3D_FLOAT)1e-7) r[ 9]=(M3D_FLOAT)0.0; - r[10] = 1 - 2 * (q->x * q->x + q->y * q->y); if(r[10]>(M3D_FLOAT)-1e-7 && r[10]<(M3D_FLOAT)1e-7) r[10]=(M3D_FLOAT)0.0; + r[ 0] = 1 - 2 * (q->y * q->y + q->z * q->z); if(r[ 0]>-M3D_EPSILON && r[ 0]x * q->y - q->z * q->w); if(r[ 1]>-M3D_EPSILON && r[ 1]x * q->z + q->y * q->w); if(r[ 2]>-M3D_EPSILON && r[ 2]x * q->y + q->z * q->w); if(r[ 4]>-M3D_EPSILON && r[ 4]x * q->x + q->z * q->z); if(r[ 5]>-M3D_EPSILON && r[ 5]y * q->z - q->x * q->w); if(r[ 6]>-M3D_EPSILON && r[ 6]x * q->z - q->y * q->w); if(r[ 8]>-M3D_EPSILON && r[ 8]y * q->z + q->x * q->w); if(r[ 9]>-M3D_EPSILON && r[ 9]x * q->x + q->y * q->y); if(r[10]>-M3D_EPSILON && r[10]x; r[ 7] = p->y; r[11] = p->z; r[12] = 0; r[13] = 0; r[14] = 0; r[15] = 1; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 913813c3b..c0babe9b7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -118,6 +118,7 @@ SET( IMPORTERS unit/utColladaImportExport.cpp unit/utCSMImportExport.cpp unit/utB3DImportExport.cpp + unit/utM3DImportExport.cpp unit/utMDCImportExport.cpp unit/utAssbinImportExport.cpp unit/ImportExport/utAssjsonImportExport.cpp diff --git a/test/models/M3D/README.md b/test/models/M3D/README.md deleted file mode 100644 index 144d1ec64..000000000 --- a/test/models/M3D/README.md +++ /dev/null @@ -1,14 +0,0 @@ -Model 3D Samples -================ - - aliveai_character.m3d - from Minetest aliveai mod (textures, animations, original 47k, m3d 2.5k) - cube.m3d - smallest possible example, 119 bytes only - cube_normals.m3d - cube with normal vectors, 159 bytes - cube_usemtl.m3d - converted from Assimp sample OBJ by the same name, cube with materials - cube_with_vertexcolors.m3d - converted from Assimp sample OBJ by the same name, cube with vertex colors - cube_with_vertexcolors.a3d - same, but saved in ASCII variant with Windows line endings (\r\n) - mobs_dwarves_character.m3d - from Minetest mobs_dwarves mod (with Assimp artifacts converted perfectly too...) - suzanne.m3d - exported from Blender (monkey face, with normals and texture UVs and materials) - WusonBlitz0.m3d - from Assimp sample by the same name (was 87k, triangle mesh) with int8 coordinates, minor quality degradation - WusonBlitz1.m3d - same, but uses int16 coordinates (no noticable difference to the original, but just 35k) - WusonBlitz2.m3d - same, but with 32 bit floating point numbers (same precision as the original, half the file size, 42k) diff --git a/test/models/M3D/aliveai_character.m3d b/test/models/M3D/aliveai_character.m3d deleted file mode 100644 index f4c170300bcb40712693f3e4cb7586f9c462b1c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2532 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 diff --git a/test/unit/utM3DImportExport.cpp b/test/unit/utM3DImportExport.cpp new file mode 100644 index 000000000..c3a0fb08c --- /dev/null +++ b/test/unit/utM3DImportExport.cpp @@ -0,0 +1,68 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +#include "UnitTestPCH.h" +#include "SceneDiffer.h" +#include "AbstractImportExportBase.h" + +#include +#include + +using namespace Assimp; + +class utM3DImportExport : public AbstractImportExportBase { +public: + virtual bool importerTest() { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/M3D/WusonBlitz0.m3d", aiProcess_ValidateDataStructure ); +#ifndef ASSIMP_BUILD_NO_M3D_IMPORTER + return nullptr != scene; +#else + return nullptr == scene; +#endif // ASSIMP_BUILD_NO_M3D_IMPORTER + } +}; + +TEST_F( utM3DImportExport, importM3DFromFileTest ) { + EXPECT_TRUE( importerTest() ); +}