Merge pull request #1825 from aavenel/unitTestPLY
Fix #1415 and improve coverage of PLY testspull/1811/head^2
commit
45cfa6e4dd
|
@ -1043,71 +1043,91 @@ bool PLY::PropertyInstance::ParseValueBinary(IOStreamBuffer<char> &streamBuffer,
|
|||
switch (eType)
|
||||
{
|
||||
case EDT_UInt:
|
||||
out->iUInt = (uint32_t)*((uint32_t*)pCur);
|
||||
pCur += 4;
|
||||
{
|
||||
uint32_t t;
|
||||
memcpy(&t, pCur, sizeof(uint32_t));
|
||||
pCur += sizeof(uint32_t);
|
||||
|
||||
// Swap endianness
|
||||
if (p_bBE)ByteSwap::Swap((int32_t*)&out->iUInt);
|
||||
if (p_bBE)ByteSwap::Swap(&t);
|
||||
out->iUInt = t;
|
||||
break;
|
||||
}
|
||||
|
||||
case EDT_UShort:
|
||||
{
|
||||
uint16_t i = *((uint16_t*)pCur);
|
||||
uint16_t t;
|
||||
memcpy(&t, pCur, sizeof(uint16_t));
|
||||
pCur += sizeof(uint16_t);
|
||||
|
||||
// Swap endianness
|
||||
if (p_bBE)ByteSwap::Swap(&i);
|
||||
out->iUInt = (uint32_t)i;
|
||||
pCur += 2;
|
||||
if (p_bBE)ByteSwap::Swap(&t);
|
||||
out->iUInt = t;
|
||||
break;
|
||||
}
|
||||
|
||||
case EDT_UChar:
|
||||
{
|
||||
out->iUInt = (uint32_t)(*((uint8_t*)pCur));
|
||||
pCur++;
|
||||
uint8_t t;
|
||||
memcpy(&t, pCur, sizeof(uint8_t));
|
||||
pCur += sizeof(uint8_t);
|
||||
out->iUInt = t;
|
||||
break;
|
||||
}
|
||||
|
||||
case EDT_Int:
|
||||
out->iInt = *((int32_t*)pCur);
|
||||
pCur += 4;
|
||||
{
|
||||
int32_t t;
|
||||
memcpy(&t, pCur, sizeof(int32_t));
|
||||
pCur += sizeof(int32_t);
|
||||
|
||||
// Swap endianness
|
||||
if (p_bBE)ByteSwap::Swap(&out->iInt);
|
||||
if (p_bBE)ByteSwap::Swap(&t);
|
||||
out->iInt = t;
|
||||
break;
|
||||
}
|
||||
|
||||
case EDT_Short:
|
||||
{
|
||||
int16_t i = *((int16_t*)pCur);
|
||||
int16_t t;
|
||||
memcpy(&t, pCur, sizeof(int16_t));
|
||||
pCur += sizeof(int16_t);
|
||||
|
||||
// Swap endianness
|
||||
if (p_bBE)ByteSwap::Swap(&i);
|
||||
out->iInt = (int32_t)i;
|
||||
pCur += 2;
|
||||
if (p_bBE)ByteSwap::Swap(&t);
|
||||
out->iInt = t;
|
||||
break;
|
||||
}
|
||||
|
||||
case EDT_Char:
|
||||
out->iInt = (int32_t)*((int8_t*)pCur);
|
||||
pCur++;
|
||||
{
|
||||
int8_t t;
|
||||
memcpy(&t, pCur, sizeof(int8_t));
|
||||
pCur += sizeof(int8_t);
|
||||
out->iInt = t;
|
||||
break;
|
||||
}
|
||||
|
||||
case EDT_Float:
|
||||
{
|
||||
out->fFloat = *((float*)pCur);
|
||||
float t;
|
||||
memcpy(&t, pCur, sizeof(float));
|
||||
pCur += sizeof(float);
|
||||
|
||||
// Swap endianness
|
||||
if (p_bBE)ByteSwap::Swap((int32_t*)&out->fFloat);
|
||||
pCur += 4;
|
||||
if (p_bBE)ByteSwap::Swap(&t);
|
||||
out->fFloat = t;
|
||||
break;
|
||||
}
|
||||
case EDT_Double:
|
||||
{
|
||||
out->fDouble = *((double*)pCur);
|
||||
double t;
|
||||
memcpy(&t, pCur, sizeof(double));
|
||||
pCur += sizeof(double);
|
||||
|
||||
// Swap endianness
|
||||
if (p_bBE)ByteSwap::Swap((int64_t*)&out->fDouble);
|
||||
pCur += 8;
|
||||
if (p_bBE)ByteSwap::Swap(&t);
|
||||
out->fDouble = t;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
Binary file not shown.
|
@ -0,0 +1,45 @@
|
|||
ply
|
||||
format ascii 1.0
|
||||
comment Created by Blender 2.77 (sub 0) - www.blender.org, source file: ''
|
||||
element vertex 24
|
||||
property float x
|
||||
property float y
|
||||
property float z
|
||||
property float nx
|
||||
property float ny
|
||||
property float nz
|
||||
property float s
|
||||
property float t
|
||||
element face 6
|
||||
property list uchar uint vertex_indices
|
||||
end_header
|
||||
1.000000 1.000000 -1.000000 0.000000 0.000000 -1.000000 0.000000 0.000000
|
||||
1.000000 -1.000000 -1.000000 0.000000 0.000000 -1.000000 1.000000 0.000000
|
||||
-1.000000 -1.000000 -1.000000 0.000000 0.000000 -1.000000 1.000000 1.000000
|
||||
-1.000000 1.000000 -1.000000 0.000000 0.000000 -1.000000 0.000000 1.000000
|
||||
1.000000 0.999999 1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000
|
||||
-1.000000 1.000000 1.000000 0.000000 -0.000000 1.000000 1.000000 0.000000
|
||||
-1.000000 -1.000000 1.000000 0.000000 -0.000000 1.000000 1.000000 1.000000
|
||||
0.999999 -1.000001 1.000000 0.000000 -0.000000 1.000000 0.000000 1.000000
|
||||
1.000000 1.000000 -1.000000 1.000000 -0.000000 0.000000 0.000000 0.000000
|
||||
1.000000 0.999999 1.000000 1.000000 -0.000000 0.000000 1.000000 0.000000
|
||||
0.999999 -1.000001 1.000000 1.000000 -0.000000 0.000000 1.000000 1.000000
|
||||
1.000000 -1.000000 -1.000000 1.000000 -0.000000 0.000000 0.000000 1.000000
|
||||
1.000000 -1.000000 -1.000000 -0.000000 -1.000000 -0.000000 0.000000 0.000000
|
||||
0.999999 -1.000001 1.000000 -0.000000 -1.000000 -0.000000 1.000000 0.000000
|
||||
-1.000000 -1.000000 1.000000 -0.000000 -1.000000 -0.000000 1.000000 1.000000
|
||||
-1.000000 -1.000000 -1.000000 -0.000000 -1.000000 -0.000000 0.000000 1.000000
|
||||
-1.000000 -1.000000 -1.000000 -1.000000 0.000000 -0.000000 0.000000 0.000000
|
||||
-1.000000 -1.000000 1.000000 -1.000000 0.000000 -0.000000 1.000000 0.000000
|
||||
-1.000000 1.000000 1.000000 -1.000000 0.000000 -0.000000 1.000000 1.000000
|
||||
-1.000000 1.000000 -1.000000 -1.000000 0.000000 -0.000000 0.000000 1.000000
|
||||
1.000000 0.999999 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000
|
||||
1.000000 1.000000 -1.000000 0.000000 1.000000 0.000000 1.000000 0.000000
|
||||
-1.000000 1.000000 -1.000000 0.000000 1.000000 0.000000 1.000000 1.000000
|
||||
-1.000000 1.000000 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000
|
||||
4 0 1 2 3
|
||||
4 4 5 6 7
|
||||
4 8 9 10 11
|
||||
4 12 13 14 15
|
||||
4 16 17 18 19
|
||||
4 20 21 22 23
|
|
@ -15,4 +15,4 @@ end_header
|
|||
0.0 0.0 0.0 0 0 1 1
|
||||
100.0 0.0 0.0 0 0 1 1
|
||||
200.0 200.0 0.0 0 0 1 1
|
||||
3 0 1 2
|
||||
3 0 1 2
|
||||
|
|
|
@ -45,6 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#include <assimp/Exporter.hpp>
|
||||
#include <assimp/scene.h>
|
||||
#include "AbstractImportExportBase.h"
|
||||
#include <assimp/postprocess.h>
|
||||
|
||||
using namespace ::Assimp;
|
||||
|
||||
|
@ -52,7 +53,7 @@ class utPLYImportExport : public AbstractImportExportBase {
|
|||
public:
|
||||
virtual bool importerTest() {
|
||||
Assimp::Importer importer;
|
||||
const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", 0 );
|
||||
const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", aiProcess_ValidateDataStructure);
|
||||
EXPECT_EQ( 1u, scene->mNumMeshes );
|
||||
EXPECT_NE( nullptr, scene->mMeshes[0] );
|
||||
EXPECT_EQ( 8u, scene->mMeshes[0]->mNumVertices );
|
||||
|
@ -65,7 +66,7 @@ public:
|
|||
virtual bool exporterTest() {
|
||||
Importer importer;
|
||||
Exporter exporter;
|
||||
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", 0);
|
||||
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", aiProcess_ValidateDataStructure);
|
||||
EXPECT_NE(nullptr, scene);
|
||||
EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "ply", ASSIMP_TEST_MODELS_DIR "/PLY/cube_test.ply"));
|
||||
|
||||
|
@ -89,19 +90,50 @@ TEST_F(utPLYImportExport, exportTest_Success ) {
|
|||
//Test issue 1623, crash when loading two PLY files in a row
|
||||
TEST_F(utPLYImportExport, importerMultipleTest) {
|
||||
Assimp::Importer importer;
|
||||
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", 0);
|
||||
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", aiProcess_ValidateDataStructure);
|
||||
|
||||
EXPECT_NE(nullptr, scene);
|
||||
|
||||
scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", 0);
|
||||
scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", aiProcess_ValidateDataStructure);
|
||||
|
||||
EXPECT_NE(nullptr, scene);
|
||||
}
|
||||
|
||||
TEST_F(utPLYImportExport, importPLYwithUV) {
|
||||
Assimp::Importer importer;
|
||||
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube_uv.ply", aiProcess_ValidateDataStructure);
|
||||
|
||||
EXPECT_NE(nullptr, scene);
|
||||
EXPECT_NE(nullptr, scene->mMeshes[0]);
|
||||
//This test model is using n-gons, so 6 faces instead of 12 tris
|
||||
EXPECT_EQ(6u, scene->mMeshes[0]->mNumFaces);
|
||||
EXPECT_EQ(aiPrimitiveType_POLYGON, scene->mMeshes[0]->mPrimitiveTypes);
|
||||
EXPECT_EQ(true, scene->mMeshes[0]->HasTextureCoords(0));
|
||||
}
|
||||
|
||||
TEST_F(utPLYImportExport, importBinaryPLY) {
|
||||
Assimp::Importer importer;
|
||||
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube_binary.ply", 0);
|
||||
|
||||
EXPECT_NE(nullptr, scene);
|
||||
EXPECT_NE(nullptr, scene->mMeshes[0]);
|
||||
//This test model is double sided, so 12 faces instead of 6
|
||||
EXPECT_EQ(12u, scene->mMeshes[0]->mNumFaces);
|
||||
}
|
||||
|
||||
TEST_F( utPLYImportExport, vertexColorTest ) {
|
||||
Assimp::Importer importer;
|
||||
const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/PLY/float-color.ply", 0 );
|
||||
const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/PLY/float-color.ply", aiProcess_ValidateDataStructure);
|
||||
EXPECT_NE( nullptr, scene );
|
||||
EXPECT_EQ(1u, scene->mMeshes[0]->mNumFaces);
|
||||
EXPECT_EQ(aiPrimitiveType_TRIANGLE, scene->mMeshes[0]->mPrimitiveTypes);
|
||||
EXPECT_EQ(true, scene->mMeshes[0]->HasVertexColors(0));
|
||||
|
||||
auto first_face = scene->mMeshes[0]->mFaces[0];
|
||||
EXPECT_EQ(3, first_face.mNumIndices);
|
||||
EXPECT_EQ(0, first_face.mIndices[0]);
|
||||
EXPECT_EQ(1, first_face.mIndices[1]);
|
||||
EXPECT_EQ(2, first_face.mIndices[2]);
|
||||
}
|
||||
|
||||
static const char *test_file =
|
||||
|
@ -125,6 +157,6 @@ static const char *test_file =
|
|||
|
||||
TEST_F( utPLYImportExport, parseErrorTest ) {
|
||||
Assimp::Importer importer;
|
||||
const aiScene *scene = importer.ReadFileFromMemory( test_file, strlen( test_file ), 0 );
|
||||
const aiScene *scene = importer.ReadFileFromMemory( test_file, strlen( test_file ), aiProcess_ValidateDataStructure);
|
||||
EXPECT_NE( nullptr, scene );
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue