Browse Source

Merge 4503b01c4b into 38ab30e0b0

pull/205/merge
Jonathan Hale 8 years ago committed by GitHub
parent
commit
bdfe49d7d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 20
      src/MagnumPlugins/ObjImporter/CMakeLists.txt
  2. 1035
      src/MagnumPlugins/ObjImporter/ObjImporter.cpp
  3. 18
      src/MagnumPlugins/ObjImporter/ObjImporter.h
  4. 109
      src/MagnumPlugins/ObjImporter/Test/Test.cpp
  5. 4
      src/MagnumPlugins/ObjImporter/Test/moreMeshes.obj
  6. 9
      src/MagnumPlugins/ObjImporter/Test/multiMaterial.mtl
  7. 59
      src/MagnumPlugins/ObjImporter/Test/multiMaterial.obj
  8. 8
      src/MagnumPlugins/ObjImporter/Test/normals.obj
  9. 9
      src/MagnumPlugins/ObjImporter/Test/textureCoordinatesNormals.obj
  10. 2
      src/MagnumPlugins/ObjImporter/Test/unnamedFirstMesh.obj

20
src/MagnumPlugins/ObjImporter/CMakeLists.txt

@ -60,6 +60,9 @@ if(BUILD_STATIC_PIC)
set_target_properties(ObjImporter PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(ObjImporter PROPERTIES POSITION_INDEPENDENT_CODE ON)
endif() endif()
target_link_libraries(ObjImporter Magnum MagnumMeshTools) target_link_libraries(ObjImporter Magnum MagnumMeshTools)
if(CORRADE_TARGET_WINDOWS)
target_link_libraries(ObjImporter AnyImageImporter)
endif()
install(FILES ${ObjImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/ObjImporter) install(FILES ${ObjImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/ObjImporter)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/ObjImporter) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/ObjImporter)
@ -73,11 +76,26 @@ if(BUILD_PLUGINS_STATIC)
endif() endif()
if(BUILD_TESTS) if(BUILD_TESTS)
# On Win32 we need to avoid dllimporting AnyImageImporter symbols, because
# it would search for the symbols in some DLL even when they were linked
# statically. However it apparently doesn't matter that they were
# dllexported when building the static library. EH. And because the
# -DObjImporterObjects_EXPORTS is no longer set in this case, we need
# to avoid dllimporting ObjImporter symbols as well.
if(CORRADE_TARGET_WINDOWS)
add_library(MagnumObjImporterTestLib STATIC
${ObjImporter_SRCS}
${ObjImporter_HEADERS})
target_compile_definitions(MagnumObjImporterTestLib PRIVATE
"MAGNUM_ANYIMAGEIMPORTER_BUILD_STATIC"
"MAGNUM_OBJIMPORTER_BUILD_STATIC")
else()
add_library(MagnumObjImporterTestLib STATIC add_library(MagnumObjImporterTestLib STATIC
$<TARGET_OBJECTS:ObjImporterObjects> $<TARGET_OBJECTS:ObjImporterObjects>
${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details
endif()
set_target_properties(MagnumObjImporterTestLib PROPERTIES FOLDER "MagnumPlugins/ObjImporter") set_target_properties(MagnumObjImporterTestLib PROPERTIES FOLDER "MagnumPlugins/ObjImporter")
target_link_libraries(MagnumObjImporterTestLib Magnum MagnumMeshTools) target_link_libraries(MagnumObjImporterTestLib Magnum MagnumMeshTools MagnumAnyImageImporterTestLib)
add_subdirectory(Test) add_subdirectory(Test)
endif() endif()

1035
src/MagnumPlugins/ObjImporter/ObjImporter.cpp

File diff suppressed because it is too large Load Diff

18
src/MagnumPlugins/ObjImporter/ObjImporter.h

@ -33,6 +33,8 @@
#include "MagnumPlugins/ObjImporter/configure.h" #include "MagnumPlugins/ObjImporter/configure.h"
#include <Corrade/Containers/Array.h>
#ifndef DOXYGEN_GENERATING_OUTPUT #ifndef DOXYGEN_GENERATING_OUTPUT
#ifndef MAGNUM_OBJIMPORTER_BUILD_STATIC #ifndef MAGNUM_OBJIMPORTER_BUILD_STATIC
#if defined(ObjImporter_EXPORTS) || defined(ObjImporterObjects_EXPORTS) #if defined(ObjImporter_EXPORTS) || defined(ObjImporterObjects_EXPORTS)
@ -93,14 +95,26 @@ 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;
MAGNUM_OBJIMPORTER_LOCAL Containers::Optional<MeshData3D> doMesh3D(UnsignedInt id) override; MAGNUM_OBJIMPORTER_LOCAL Containers::Optional<MeshData3D> doMesh3D(UnsignedInt id) override;
MAGNUM_OBJIMPORTER_LOCAL void parseMeshNames(); MAGNUM_OBJIMPORTER_LOCAL UnsignedInt doMaterialCount() const override;
MAGNUM_OBJIMPORTER_LOCAL std::unique_ptr<AbstractMaterialData> doMaterial(UnsignedInt id) override;
MAGNUM_OBJIMPORTER_LOCAL UnsignedInt doImage2DCount() const;
MAGNUM_OBJIMPORTER_LOCAL std::optional<ImageData2D> doImage2D(UnsignedInt id);
MAGNUM_OBJIMPORTER_LOCAL void parse();
MAGNUM_OBJIMPORTER_LOCAL void parseMaterialLibrary(Containers::ArrayView<const char> libname);
std::unique_ptr<File> _file; std::unique_ptr<struct ImporterState> _state;
}; };
}} }}

109
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();
@ -83,6 +82,8 @@ struct ObjImporterTest: TestSuite::Tester {
void missingNormalIndices(); void missingNormalIndices();
void missingTextureCoordinateIndices(); void missingTextureCoordinateIndices();
void multiMaterialObject();
void wrongTextureCoordinateIndexCount(); void wrongTextureCoordinateIndexCount();
void wrongNormalIndexCount(); void wrongNormalIndexCount();
@ -102,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,
@ -134,6 +134,8 @@ ObjImporterTest::ObjImporterTest() {
&ObjImporterTest::missingNormalIndices, &ObjImporterTest::missingNormalIndices,
&ObjImporterTest::missingTextureCoordinateIndices, &ObjImporterTest::missingTextureCoordinateIndices,
&ObjImporterTest::multiMaterialObject,
&ObjImporterTest::wrongTextureCoordinateIndexCount, &ObjImporterTest::wrongTextureCoordinateIndexCount,
&ObjImporterTest::wrongNormalIndexCount, &ObjImporterTest::wrongNormalIndexCount,
@ -152,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
})); }));
} }
@ -202,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() {
@ -257,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);
@ -274,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
})); }));
} }
@ -285,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);
@ -311,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() {
@ -353,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");
@ -389,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() {
@ -406,8 +428,8 @@ 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");
CORRADE_VERIFY(!importer.mesh3D(id));
} }
void ObjImporterTest::wrongInteger() { void ObjImporterTest::wrongInteger() {
@ -702,6 +724,31 @@ void ObjImporterTest::wrongTextureCoordinateIndexCount() {
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): some texture coordinate indices are missing\n"); CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh3D(): some texture coordinate indices are missing\n");
} }
void ObjImporterTest::multiMaterialObject() {
ObjImporter importer;
CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "multiMaterial.obj")));
CORRADE_VERIFY(importer.mesh3DCount() == 2);
CORRADE_VERIFY(importer.materialCount() == 2);
/* Everything should be parsed properly */
std::optional<MeshData3D> data = importer.mesh3D(0);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->primitive(), MeshPrimitive::Triangles);
CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{
{{1.72414f, 18.9233f, -3.20162f},
{2.74428f, -0.499733f, -3.50576f},
{-1.92235f, -0.846268f, 2.9722f},
{1.72414f, 18.9233f, -3.20162f},
{-1.92235f, -0.846268f, 2.9722f},
{2.43556f, 18.8755f, 2.23745f}}
}));
data = importer.mesh3D(1);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->primitive(), MeshPrimitive::Triangles);
}
void ObjImporterTest::unsupportedKeyword() { void ObjImporterTest::unsupportedKeyword() {
ObjImporter importer; ObjImporter importer;
CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "keywords.obj"))); CORRADE_VERIFY(importer.openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "keywords.obj")));

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

9
src/MagnumPlugins/ObjImporter/Test/multiMaterial.mtl

@ -0,0 +1,9 @@
newmtl mat_0
Ka 1 1 1
map_Ka Textures/mat_0.tga
newmtl mat_1
Ka 1 1 1
map_Ka Textures/mat_1.tga

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

@ -0,0 +1,59 @@
mtllib multiMaterial.mtl
# Billboard
# positions
v -2.94249 18.5768 3.27633
v 1.72414 18.9233 -3.20162
v 2.74428 -0.499733 -3.50576
v -1.92235 -0.846268 2.9722
# normals
vn 0.810085 0.0333816 0.585361
vn 0.810085 0.0333816 0.585361
vn 0.810085 0.0333816 0.585361
vn 0.810085 0.0333816 0.585361
# texture coords
vt 0 1
vt 0 0
vt 1 0
vt 1 1
usemtl mat_0
# faces
f 1/1/1 2/2/2 3/3/3
f 1/1/1 3/3/3 4/4/4
# Billboard
# positions
v 2.43556 18.8755 2.23745
v -3.6539 18.6246 -2.16274
v -2.63377 -0.798466 -2.46688
v 3.4557 -0.547535 1.93331
# normals
vn 0.583961 0.0433639 -0.810622
vn 0.583961 0.0433639 -0.810622
vn 0.583961 0.0433639 -0.810622
vn 0.583961 0.0433639 -0.810622
# texture coords
vt 0 1
vt 0 0
vt 1 0
vt 1 1
usemtl mat_1
# faces
f 5/5/5 6/6/6 7/7/7
f 5/5/5 7/7/7 8/8/8

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