From 26289139a38b9ad2973d50cc6943e18476aefb8c Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 8 Jul 2016 08:34:45 +0200 Subject: [PATCH] Utility/OBJParser: Prepare for saving Former-commit-id: 89d82ac533c72033927557251278dd1544002a54 [formerly dc3b1ff5e00608ed0dfdee9b57ff6986a1d5ac33] Former-commit-id: ee2b46fbfb0a0f7cd96ae1b35ec1af30342cd2fb --- include/Nazara/Utility/Formats/OBJParser.hpp | 67 ++++++++++++-------- include/Nazara/Utility/Formats/OBJParser.inl | 64 +++++++++++++++++++ src/Nazara/Utility/Formats/OBJLoader.cpp | 4 +- src/Nazara/Utility/Formats/OBJLoader.hpp | 4 +- src/Nazara/Utility/Formats/OBJParser.cpp | 10 ++- 5 files changed, 117 insertions(+), 32 deletions(-) diff --git a/include/Nazara/Utility/Formats/OBJParser.hpp b/include/Nazara/Utility/Formats/OBJParser.hpp index 79aa1824a..b9c5e41c3 100644 --- a/include/Nazara/Utility/Formats/OBJParser.hpp +++ b/include/Nazara/Utility/Formats/OBJParser.hpp @@ -20,12 +20,41 @@ namespace Nz class NAZARA_UTILITY_API OBJParser { public: - struct FaceVertex - { - int normal; - int position; - int texCoord; - }; + struct Face; + struct FaceVertex; + struct Mesh; + + OBJParser() = default; + ~OBJParser() = default; + + inline void Clear(); + + inline String* GetMaterials(); + inline const String* GetMaterials() const; + inline unsigned int GetMaterialCount() const; + inline Mesh* GetMeshes(); + inline const Mesh* GetMeshes() const; + inline unsigned int GetMeshCount() const; + inline const String& GetMtlLib() const; + inline Vector3f* GetNormals(); + inline const Vector3f* GetNormals() const; + inline unsigned int GetNormalCount() const; + inline Vector4f* GetPositions(); + inline const Vector4f* GetPositions() const; + inline unsigned int GetPositionCount() const; + inline Vector3f* GetTexCoords(); + inline const Vector3f* GetTexCoords() const; + inline unsigned int GetTexCoordCount() const; + + bool Parse(Stream& stream, std::size_t reservedVertexCount = 100); + + bool Save(Stream& stream) const; + + inline String* SetMaterialCount(std::size_t materialCount); + inline Mesh* SetMeshCount(std::size_t meshCount); + inline Vector3f* SetNormalCount(std::size_t normalCount); + inline Vector4f* SetPositionCount(std::size_t positionCount); + inline Vector3f* SetTexCoordCount(std::size_t texCoordCount); struct Face { @@ -33,6 +62,13 @@ namespace Nz std::size_t vertexCount; }; + struct FaceVertex + { + std::size_t normal; + std::size_t position; + std::size_t texCoord; + }; + struct Mesh { std::vector faces; @@ -41,25 +77,6 @@ namespace Nz std::size_t material; }; - OBJParser() = default; - ~OBJParser() = default; - - inline const String* GetMaterials() const; - inline unsigned int GetMaterialCount() const; - inline const Mesh* GetMeshes() const; - inline unsigned int GetMeshCount() const; - inline const String& GetMtlLib() const; - inline const Vector3f* GetNormals() const; - inline unsigned int GetNormalCount() const; - inline const Vector4f* GetPositions() const; - inline unsigned int GetPositionCount() const; - inline const Vector3f* GetTexCoords() const; - inline unsigned int GetTexCoordCount() const; - - bool Parse(Stream& stream, std::size_t reservedVertexCount = 100); - - bool Save(Stream& stream) const; - private: bool Advance(bool required = true); template void Emit(const T& text) const; diff --git a/include/Nazara/Utility/Formats/OBJParser.inl b/include/Nazara/Utility/Formats/OBJParser.inl index 7cd0060b4..a4fcffaec 100644 --- a/include/Nazara/Utility/Formats/OBJParser.inl +++ b/include/Nazara/Utility/Formats/OBJParser.inl @@ -8,6 +8,20 @@ namespace Nz { + inline void OBJParser::Clear() + { + m_materials.clear(); + m_meshes.clear(); + m_positions.clear(); + m_normals.clear(); + m_texCoords.clear(); + } + + inline String* OBJParser::GetMaterials() + { + return m_materials.data(); + } + inline const String* OBJParser::GetMaterials() const { return m_materials.data(); @@ -18,6 +32,11 @@ namespace Nz return m_materials.size(); } + inline OBJParser::Mesh* OBJParser::GetMeshes() + { + return m_meshes.data(); + } + inline const OBJParser::Mesh* OBJParser::GetMeshes() const { return m_meshes.data(); @@ -33,6 +52,11 @@ namespace Nz return m_mtlLib; } + inline Vector3f* OBJParser::GetNormals() + { + return m_normals.data(); + } + inline const Vector3f* OBJParser::GetNormals() const { return m_normals.data(); @@ -43,6 +67,11 @@ namespace Nz return m_normals.size(); } + inline Vector4f* OBJParser::GetPositions() + { + return m_positions.data(); + } + inline const Vector4f* OBJParser::GetPositions() const { return m_positions.data(); @@ -53,6 +82,11 @@ namespace Nz return m_positions.size(); } + inline Vector3f* OBJParser::GetTexCoords() + { + return m_texCoords.data(); + } + inline const Vector3f* OBJParser::GetTexCoords() const { return m_texCoords.data(); @@ -63,6 +97,36 @@ namespace Nz return m_texCoords.size(); } + inline String* OBJParser::SetMaterialCount(std::size_t materialCount) + { + m_materials.resize(materialCount); + return m_materials.data(); + } + + inline OBJParser::Mesh* OBJParser::SetMeshCount(std::size_t meshCount) + { + m_meshes.resize(meshCount); + return m_meshes.data(); + } + + inline Vector3f* OBJParser::SetNormalCount(std::size_t normalCount) + { + m_normals.resize(normalCount); + return m_normals.data(); + } + + inline Vector4f* OBJParser::SetPositionCount(std::size_t positionCount) + { + m_positions.resize(positionCount); + return m_positions.data(); + } + + inline Vector3f* OBJParser::SetTexCoordCount(std::size_t texCoordCount) + { + m_texCoords.resize(texCoordCount); + return m_texCoords.data(); + } + template void OBJParser::Emit(const T& text) const { diff --git a/src/Nazara/Utility/Formats/OBJLoader.cpp b/src/Nazara/Utility/Formats/OBJLoader.cpp index 720b5ec5d..a8d5d68ec 100644 --- a/src/Nazara/Utility/Formats/OBJLoader.cpp +++ b/src/Nazara/Utility/Formats/OBJLoader.cpp @@ -298,12 +298,12 @@ namespace Nz namespace Loaders { - void RegisterOBJ() + void RegisterOBJLoader() { MeshLoader::RegisterLoader(IsSupported, Check, Load); } - void UnregisterOBJ() + void UnregisterOBJLoader() { MeshLoader::UnregisterLoader(IsSupported, Check, Load); } diff --git a/src/Nazara/Utility/Formats/OBJLoader.hpp b/src/Nazara/Utility/Formats/OBJLoader.hpp index 05a3efdff..46dd8d976 100644 --- a/src/Nazara/Utility/Formats/OBJLoader.hpp +++ b/src/Nazara/Utility/Formats/OBJLoader.hpp @@ -13,8 +13,8 @@ namespace Nz { namespace Loaders { - void RegisterOBJ(); - void UnregisterOBJ(); + void RegisterOBJLoader(); + void UnregisterOBJLoader(); } } diff --git a/src/Nazara/Utility/Formats/OBJParser.cpp b/src/Nazara/Utility/Formats/OBJParser.cpp index a05ef6960..5c941e938 100644 --- a/src/Nazara/Utility/Formats/OBJParser.cpp +++ b/src/Nazara/Utility/Formats/OBJParser.cpp @@ -125,9 +125,9 @@ namespace Nz for (unsigned int i = 0; i < vertexCount; ++i) { int offset; - int& n = currentMesh->vertices[face.firstVertex + i].normal; - int& p = currentMesh->vertices[face.firstVertex + i].position; - int& t = currentMesh->vertices[face.firstVertex + i].texCoord; + std::size_t n = 0; + std::size_t p = 0; + std::size_t t = 0; if (std::sscanf(&m_currentLine[pos], "%d/%d/%d%n", &p, &t, &n, &offset) != 3) { @@ -199,6 +199,10 @@ namespace Nz break; } + currentMesh->vertices[face.firstVertex + i].normal = static_cast(n); + currentMesh->vertices[face.firstVertex + i].position = static_cast(p); + currentMesh->vertices[face.firstVertex + i].texCoord = static_cast(t); + pos += offset; }