Browse Source

WIP

Signed-off-by: Squareys <squareys@googlemail.com>
pull/205/head
Squareys 9 years ago
parent
commit
77de8df2bc
  1. 825
      src/MagnumPlugins/ObjImporter/ObjImporter.cpp
  2. 7
      src/MagnumPlugins/ObjImporter/ObjImporter.h
  3. 80
      src/MagnumPlugins/ObjImporter/Test/Test.cpp
  4. 4
      src/MagnumPlugins/ObjImporter/Test/moreMeshes.obj
  5. 2
      src/MagnumPlugins/ObjImporter/Test/multiMaterial.obj
  6. 8
      src/MagnumPlugins/ObjImporter/Test/normals.obj
  7. 9
      src/MagnumPlugins/ObjImporter/Test/textureCoordinatesNormals.obj
  8. 2
      src/MagnumPlugins/ObjImporter/Test/unnamedFirstMesh.obj

825
src/MagnumPlugins/ObjImporter/ObjImporter.cpp

File diff suppressed because it is too large Load Diff

7
src/MagnumPlugins/ObjImporter/ObjImporter.h

@ -95,6 +95,11 @@ class MAGNUM_OBJIMPORTER_EXPORT ObjImporter: public AbstractImporter {
MAGNUM_OBJIMPORTER_LOCAL void doOpenFile(const std::string& filename) override; MAGNUM_OBJIMPORTER_LOCAL void doOpenFile(const std::string& filename) override;
MAGNUM_OBJIMPORTER_LOCAL void doClose() override; MAGNUM_OBJIMPORTER_LOCAL void doClose() override;
MAGNUM_OBJIMPORTER_LOCAL UnsignedInt doObject3DCount() const override;
MAGNUM_OBJIMPORTER_LOCAL Int doObject3DForName(const std::string& name) override;
MAGNUM_OBJIMPORTER_LOCAL std::string doObject3DName(UnsignedInt id) override;
MAGNUM_OBJIMPORTER_LOCAL std::unique_ptr<ObjectData3D> doObject3D(UnsignedInt id) override;
MAGNUM_OBJIMPORTER_LOCAL UnsignedInt doMesh3DCount() const override; MAGNUM_OBJIMPORTER_LOCAL UnsignedInt doMesh3DCount() const override;
MAGNUM_OBJIMPORTER_LOCAL Int doMesh3DForName(const std::string& name) override; MAGNUM_OBJIMPORTER_LOCAL Int doMesh3DForName(const std::string& name) override;
MAGNUM_OBJIMPORTER_LOCAL std::string doMesh3DName(UnsignedInt id) override; MAGNUM_OBJIMPORTER_LOCAL std::string doMesh3DName(UnsignedInt id) override;
@ -107,7 +112,7 @@ class MAGNUM_OBJIMPORTER_EXPORT ObjImporter: public AbstractImporter {
MAGNUM_OBJIMPORTER_LOCAL std::optional<ImageData2D> doImage2D(UnsignedInt id); MAGNUM_OBJIMPORTER_LOCAL std::optional<ImageData2D> doImage2D(UnsignedInt id);
MAGNUM_OBJIMPORTER_LOCAL void parse(); MAGNUM_OBJIMPORTER_LOCAL void parse();
MAGNUM_OBJIMPORTER_LOCAL void parseMaterialLibrary(std::string libname); MAGNUM_OBJIMPORTER_LOCAL void parseMaterialLibrary(Containers::ArrayView<char> libname);
Containers::Array<char> _in; Containers::Array<char> _in;
std::unique_ptr<struct ImporterState> _state; std::unique_ptr<struct ImporterState> _state;

80
src/MagnumPlugins/ObjImporter/Test/Test.cpp

@ -50,7 +50,6 @@ struct ObjImporterTest: TestSuite::Tester {
void textureCoordinatesNormals(); void textureCoordinatesNormals();
void emptyFile(); void emptyFile();
void unnamedMesh();
void namedMesh(); void namedMesh();
void moreMeshes(); void moreMeshes();
void unnamedFirstMesh(); void unnamedFirstMesh();
@ -104,7 +103,6 @@ ObjImporterTest::ObjImporterTest() {
&ObjImporterTest::textureCoordinatesNormals, &ObjImporterTest::textureCoordinatesNormals,
&ObjImporterTest::emptyFile, &ObjImporterTest::emptyFile,
&ObjImporterTest::unnamedMesh,
&ObjImporterTest::namedMesh, &ObjImporterTest::namedMesh,
&ObjImporterTest::moreMeshes, &ObjImporterTest::moreMeshes,
&ObjImporterTest::unnamedFirstMesh, &ObjImporterTest::unnamedFirstMesh,
@ -156,11 +154,11 @@ void ObjImporterTest::pointMesh() {
CORRADE_COMPARE(data->positionArrayCount(), 1); CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{ CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{
{0.5f, 2.0f, 3.0f}, {0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f}, {2.0f, 3.0f, 5.0f},
{2.0f, 3.0f, 5.0f} {0.0f, 1.5f, 1.0f}
})); }));
CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{ CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{
0, 2, 1, 0 0, 1, 2, 0
})); }));
} }
@ -206,12 +204,32 @@ void ObjImporterTest::triangleMesh() {
void ObjImporterTest::mixedPrimitives() { void ObjImporterTest::mixedPrimitives() {
ObjImporter importer; ObjImporter importer;
CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "mixedPrimitives.obj"))); CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "mixedPrimitives.obj")));
CORRADE_COMPARE(importer.mesh3DCount(), 1); CORRADE_COMPARE(importer.mesh3DCount(), 2);
std::ostringstream out; /* point mesh */
Error redirectError{&out}; auto pointData = importer.mesh3D(0);
CORRADE_VERIFY(!importer.mesh3D(0)); CORRADE_VERIFY(pointData);
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): mixed primitive MeshPrimitive::Points and MeshPrimitive::Lines\n"); CORRADE_COMPARE(pointData->primitive(), MeshPrimitive::Points);
CORRADE_COMPARE(pointData->positions(0), (std::vector<Vector3>{
{0.5f, 2.0f, 3.0f},
{2.0f, 3.0f, 5.0f},
{0.0f, 1.5f, 1.0f}
}));
CORRADE_COMPARE(pointData->indices(), (std::vector<UnsignedInt>{
0, 1, 2
}));
auto lineData = importer.mesh3D(1);
CORRADE_VERIFY(lineData);
CORRADE_COMPARE(lineData->primitive(), MeshPrimitive::Lines);
CORRADE_COMPARE(lineData->positions(0), (std::vector<Vector3>{
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{2.0f, 3.0f, 5.0f}
}));
CORRADE_COMPARE(lineData->indices(), (std::vector<UnsignedInt>{
0, 1, 1, 2
}));
} }
void ObjImporterTest::positionsOnly() { void ObjImporterTest::positionsOnly() {
@ -261,7 +279,7 @@ void ObjImporterTest::normals() {
const Containers::Optional<MeshData3D> data = importer.mesh3D(0); const Containers::Optional<MeshData3D> data = importer.mesh3D(0);
CORRADE_VERIFY(data); CORRADE_VERIFY(data);
CORRADE_COMPARE(data->primitive(), MeshPrimitive::Lines); CORRADE_COMPARE(data->primitive(), MeshPrimitive::Triangles);
CORRADE_COMPARE(data->positionArrayCount(), 1); CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_VERIFY(!data->hasTextureCoords2D()); CORRADE_VERIFY(!data->hasTextureCoords2D());
CORRADE_COMPARE(data->normalArrayCount(), 1); CORRADE_COMPARE(data->normalArrayCount(), 1);
@ -278,7 +296,7 @@ void ObjImporterTest::normals() {
{0.5f, 1.0f, 0.5f} {0.5f, 1.0f, 0.5f}
})); }));
CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{ CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{
0, 1, 2, 3, 1, 0 0, 1, 0, 2, 3, 0, 1, 0, 0
})); }));
} }
@ -289,7 +307,7 @@ void ObjImporterTest::textureCoordinatesNormals() {
const Containers::Optional<MeshData3D> data = importer.mesh3D(0); const Containers::Optional<MeshData3D> data = importer.mesh3D(0);
CORRADE_VERIFY(data); CORRADE_VERIFY(data);
CORRADE_COMPARE(data->primitive(), MeshPrimitive::Lines); CORRADE_COMPARE(data->primitive(), MeshPrimitive::Triangles);
CORRADE_COMPARE(data->positionArrayCount(), 1); CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_COMPARE(data->textureCoords2DArrayCount(), 1); CORRADE_COMPARE(data->textureCoords2DArrayCount(), 1);
CORRADE_COMPARE(data->normalArrayCount(), 1); CORRADE_COMPARE(data->normalArrayCount(), 1);
@ -315,30 +333,26 @@ void ObjImporterTest::textureCoordinatesNormals() {
{0.5f, 1.0f, 0.5f} {0.5f, 1.0f, 0.5f}
})); }));
CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{ CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{
0, 1, 2, 3, 1, 0, 4, 2 0, 1, 2, 3, 1, 0, 4, 2, 2
})); }));
} }
void ObjImporterTest::emptyFile() { void ObjImporterTest::emptyFile() {
ObjImporter importer; ObjImporter importer;
CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "emptyFile.obj"))); CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "emptyFile.obj")));
CORRADE_COMPARE(importer.mesh3DCount(), 1);
}
void ObjImporterTest::unnamedMesh() { CORRADE_COMPARE(importer.mesh3DCount(), 0);
ObjImporter importer; CORRADE_COMPARE(importer.object3DCount(), 0);
CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "emptyFile.obj"))); CORRADE_COMPARE(importer.image3DCount(), 0);
CORRADE_COMPARE(importer.mesh3DCount(), 1);
CORRADE_COMPARE(importer.mesh3DName(0), "");
CORRADE_COMPARE(importer.mesh3DForName(""), -1);
} }
void ObjImporterTest::namedMesh() { void ObjImporterTest::namedMesh() {
ObjImporter importer; ObjImporter importer;
CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "namedMesh.obj"))); CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "namedMesh.obj")));
CORRADE_COMPARE(importer.mesh3DCount(), 1); CORRADE_COMPARE(importer.mesh3DCount(), 0);
CORRADE_COMPARE(importer.mesh3DName(0), "MyMesh"); CORRADE_COMPARE(importer.object3DCount(), 1);
CORRADE_COMPARE(importer.mesh3DForName("MyMesh"), 0); CORRADE_COMPARE(importer.object3DName(0), "MyMesh");
CORRADE_COMPARE(importer.object3DForName("MyMesh"), 0);
} }
void ObjImporterTest::moreMeshes() { void ObjImporterTest::moreMeshes() {
@ -357,7 +371,7 @@ void ObjImporterTest::moreMeshes() {
{0.0f, 1.5f, 1.0f} {0.0f, 1.5f, 1.0f}
})); }));
CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{ CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{
0, 1 0, 1, 0
})); }));
CORRADE_COMPARE(importer.mesh3DName(1), "LineMesh"); CORRADE_COMPARE(importer.mesh3DName(1), "LineMesh");
@ -393,13 +407,17 @@ void ObjImporterTest::moreMeshes() {
void ObjImporterTest::unnamedFirstMesh() { void ObjImporterTest::unnamedFirstMesh() {
ObjImporter importer; ObjImporter importer;
CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "unnamedFirstMesh.obj"))); CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "unnamedFirstMesh.obj")));
CORRADE_COMPARE(importer.mesh3DCount(), 2); CORRADE_COMPARE(importer.mesh3DCount(), 1);
CORRADE_COMPARE(importer.object3DCount(), 2); /* Second mesh is empty, hence 2 objects, but 1 mesh */
CORRADE_COMPARE(importer.object3DName(0), "");
CORRADE_COMPARE(importer.object3DForName(""), 0); // TODO: why is this -1?
CORRADE_COMPARE(importer.mesh3DName(0), ""); CORRADE_COMPARE(importer.mesh3DName(0), "");
CORRADE_COMPARE(importer.mesh3DForName(""), -1); CORRADE_COMPARE(importer.mesh3DForName(""), 0);
CORRADE_COMPARE(importer.mesh3DName(1), "SecondMesh"); CORRADE_COMPARE(importer.object3DName(1), "SecondMesh");
CORRADE_COMPARE(importer.mesh3DForName("SecondMesh"), 1); CORRADE_COMPARE(importer.object3DForName("SecondMesh"), 1);
} }
void ObjImporterTest::wrongFloat() { void ObjImporterTest::wrongFloat() {
@ -410,7 +428,6 @@ void ObjImporterTest::wrongFloat() {
std::ostringstream out; std::ostringstream out;
Error redirectError{&out}; Error redirectError{&out};
CORRADE_VERIFY(!importer.mesh3D(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): error while converting numeric data\n"); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): error while converting numeric data\n");
} }
@ -745,7 +762,6 @@ void ObjImporterTest::unsupportedKeyword() {
CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{ CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{
{0.0f, 1.0f, 2.0f} {0.0f, 1.0f, 2.0f}
})); }));
CORRADE_COMPARE(data->indices(), std::vector<UnsignedInt>{0});
} }
void ObjImporterTest::unknownKeyword() { void ObjImporterTest::unknownKeyword() {

4
src/MagnumPlugins/ObjImporter/Test/moreMeshes.obj

@ -4,8 +4,8 @@ v 0.5 2 3
v 0 1.5 1 v 0 1.5 1
vn 0.5 2 3 vn 0.5 2 3
vn 0 1.5 1 vn 0 1.5 1
p 1//1 p 1 2
p 2//2 p 1
# Lines # Lines
o LineMesh o LineMesh

2
src/MagnumPlugins/ObjImporter/Test/multiMaterial.obj

@ -1,7 +1,5 @@
mtllib multiMaterial.mtl mtllib multiMaterial.mtl
# Billboard # Billboard
# positions # positions

8
src/MagnumPlugins/ObjImporter/Test/normals.obj

@ -6,7 +6,7 @@ v 0 1.5 1
vn 1 0.5 3.5 vn 1 0.5 3.5
vn 0.5 1 0.5 vn 0.5 1 0.5
# Lines # Triangles
l 1//1 2//1 f 1//1 2//1 1//1
l 1//2 2//2 f 1//2 2//2 1//1
l 2//1 1//1 f 2//1 1//1 1//1

9
src/MagnumPlugins/ObjImporter/Test/textureCoordinatesNormals.obj

@ -10,8 +10,7 @@ vt 0.5 1
vn 1 0.5 3.5 vn 1 0.5 3.5
vn 0.5 1 0.5 vn 0.5 1 0.5
# Lines # Faces
l 1/1/1 2/1/2 f 1/1/1 2/1/2 1/2/2
l 1/2/2 2/2/1 f 2/2/1 2/1/2 1/1/1
l 2/1/2 1/1/1 f 2/2/2 1/2/2 1/2/2
l 2/2/2 1/2/2

2
src/MagnumPlugins/ObjImporter/Test/unnamedFirstMesh.obj

@ -1,2 +1,4 @@
v 1 2 3 v 1 2 3
p 1
o SecondMesh o SecondMesh
# empty

Loading…
Cancel
Save