Utility/OBJParser: Prepare for saving

Former-commit-id: 89d82ac533c72033927557251278dd1544002a54 [formerly dc3b1ff5e00608ed0dfdee9b57ff6986a1d5ac33]
Former-commit-id: ee2b46fbfb0a0f7cd96ae1b35ec1af30342cd2fb
This commit is contained in:
Lynix 2016-07-08 08:34:45 +02:00
parent 9a6de9f7ac
commit 26289139a3
5 changed files with 117 additions and 32 deletions

View File

@ -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<Face> 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<typename T> void Emit(const T& text) const;

View File

@ -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<typename T>
void OBJParser::Emit(const T& text) const
{

View File

@ -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);
}

View File

@ -13,8 +13,8 @@ namespace Nz
{
namespace Loaders
{
void RegisterOBJ();
void UnregisterOBJ();
void RegisterOBJLoader();
void UnregisterOBJLoader();
}
}

View File

@ -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<std::size_t>(n);
currentMesh->vertices[face.firstVertex + i].position = static_cast<std::size_t>(p);
currentMesh->vertices[face.firstVertex + i].texCoord = static_cast<std::size_t>(t);
pos += offset;
}