// Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Engine - Utility module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_FORMATS_OBJPARSER_HPP #define NAZARA_FORMATS_OBJPARSER_HPP #include #include #include #include #include #include #include namespace Nz { class NAZARA_UTILITY_API OBJParser { public: 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 void SetMtlLib(const String& mtlLib); inline Vector3f* SetNormalCount(std::size_t normalCount); inline Vector4f* SetPositionCount(std::size_t positionCount); inline Vector3f* SetTexCoordCount(std::size_t texCoordCount); struct Face { std::size_t firstVertex; std::size_t vertexCount; }; struct FaceVertex { std::size_t normal; std::size_t position; std::size_t texCoord; }; struct Mesh { std::vector faces; std::vector vertices; String name; std::size_t material; }; private: bool Advance(bool required = true); template void Emit(const T& text) const; inline void EmitLine() const; template void EmitLine(const T& line) const; inline void Error(const String& message); inline void Flush() const; inline void Warning(const String& message); inline void UnrecognizedLine(bool error = false); std::vector m_meshes; std::vector m_materials; std::vector m_normals; std::vector m_positions; std::vector m_texCoords; mutable Stream* m_currentStream; String m_currentLine; String m_mtlLib; mutable StringStream m_outputStream; bool m_keepLastLine; unsigned int m_lineCount; }; } #include #endif // NAZARA_FORMATS_OBJPARSER_HPP