Utility/OBJParser: Prepare for saving
Former-commit-id: 89d82ac533c72033927557251278dd1544002a54 [formerly dc3b1ff5e00608ed0dfdee9b57ff6986a1d5ac33] Former-commit-id: ee2b46fbfb0a0f7cd96ae1b35ec1af30342cd2fb
This commit is contained in:
parent
9a6de9f7ac
commit
26289139a3
|
|
@ -20,12 +20,41 @@ namespace Nz
|
||||||
class NAZARA_UTILITY_API OBJParser
|
class NAZARA_UTILITY_API OBJParser
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
struct FaceVertex
|
struct Face;
|
||||||
{
|
struct FaceVertex;
|
||||||
int normal;
|
struct Mesh;
|
||||||
int position;
|
|
||||||
int texCoord;
|
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
|
struct Face
|
||||||
{
|
{
|
||||||
|
|
@ -33,6 +62,13 @@ namespace Nz
|
||||||
std::size_t vertexCount;
|
std::size_t vertexCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct FaceVertex
|
||||||
|
{
|
||||||
|
std::size_t normal;
|
||||||
|
std::size_t position;
|
||||||
|
std::size_t texCoord;
|
||||||
|
};
|
||||||
|
|
||||||
struct Mesh
|
struct Mesh
|
||||||
{
|
{
|
||||||
std::vector<Face> faces;
|
std::vector<Face> faces;
|
||||||
|
|
@ -41,25 +77,6 @@ namespace Nz
|
||||||
std::size_t material;
|
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:
|
private:
|
||||||
bool Advance(bool required = true);
|
bool Advance(bool required = true);
|
||||||
template<typename T> void Emit(const T& text) const;
|
template<typename T> void Emit(const T& text) const;
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,20 @@
|
||||||
|
|
||||||
namespace Nz
|
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
|
inline const String* OBJParser::GetMaterials() const
|
||||||
{
|
{
|
||||||
return m_materials.data();
|
return m_materials.data();
|
||||||
|
|
@ -18,6 +32,11 @@ namespace Nz
|
||||||
return m_materials.size();
|
return m_materials.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline OBJParser::Mesh* OBJParser::GetMeshes()
|
||||||
|
{
|
||||||
|
return m_meshes.data();
|
||||||
|
}
|
||||||
|
|
||||||
inline const OBJParser::Mesh* OBJParser::GetMeshes() const
|
inline const OBJParser::Mesh* OBJParser::GetMeshes() const
|
||||||
{
|
{
|
||||||
return m_meshes.data();
|
return m_meshes.data();
|
||||||
|
|
@ -33,6 +52,11 @@ namespace Nz
|
||||||
return m_mtlLib;
|
return m_mtlLib;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline Vector3f* OBJParser::GetNormals()
|
||||||
|
{
|
||||||
|
return m_normals.data();
|
||||||
|
}
|
||||||
|
|
||||||
inline const Vector3f* OBJParser::GetNormals() const
|
inline const Vector3f* OBJParser::GetNormals() const
|
||||||
{
|
{
|
||||||
return m_normals.data();
|
return m_normals.data();
|
||||||
|
|
@ -43,6 +67,11 @@ namespace Nz
|
||||||
return m_normals.size();
|
return m_normals.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline Vector4f* OBJParser::GetPositions()
|
||||||
|
{
|
||||||
|
return m_positions.data();
|
||||||
|
}
|
||||||
|
|
||||||
inline const Vector4f* OBJParser::GetPositions() const
|
inline const Vector4f* OBJParser::GetPositions() const
|
||||||
{
|
{
|
||||||
return m_positions.data();
|
return m_positions.data();
|
||||||
|
|
@ -53,6 +82,11 @@ namespace Nz
|
||||||
return m_positions.size();
|
return m_positions.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline Vector3f* OBJParser::GetTexCoords()
|
||||||
|
{
|
||||||
|
return m_texCoords.data();
|
||||||
|
}
|
||||||
|
|
||||||
inline const Vector3f* OBJParser::GetTexCoords() const
|
inline const Vector3f* OBJParser::GetTexCoords() const
|
||||||
{
|
{
|
||||||
return m_texCoords.data();
|
return m_texCoords.data();
|
||||||
|
|
@ -63,6 +97,36 @@ namespace Nz
|
||||||
return m_texCoords.size();
|
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>
|
template<typename T>
|
||||||
void OBJParser::Emit(const T& text) const
|
void OBJParser::Emit(const T& text) const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -298,12 +298,12 @@ namespace Nz
|
||||||
|
|
||||||
namespace Loaders
|
namespace Loaders
|
||||||
{
|
{
|
||||||
void RegisterOBJ()
|
void RegisterOBJLoader()
|
||||||
{
|
{
|
||||||
MeshLoader::RegisterLoader(IsSupported, Check, Load);
|
MeshLoader::RegisterLoader(IsSupported, Check, Load);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UnregisterOBJ()
|
void UnregisterOBJLoader()
|
||||||
{
|
{
|
||||||
MeshLoader::UnregisterLoader(IsSupported, Check, Load);
|
MeshLoader::UnregisterLoader(IsSupported, Check, Load);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,8 @@ namespace Nz
|
||||||
{
|
{
|
||||||
namespace Loaders
|
namespace Loaders
|
||||||
{
|
{
|
||||||
void RegisterOBJ();
|
void RegisterOBJLoader();
|
||||||
void UnregisterOBJ();
|
void UnregisterOBJLoader();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -125,9 +125,9 @@ namespace Nz
|
||||||
for (unsigned int i = 0; i < vertexCount; ++i)
|
for (unsigned int i = 0; i < vertexCount; ++i)
|
||||||
{
|
{
|
||||||
int offset;
|
int offset;
|
||||||
int& n = currentMesh->vertices[face.firstVertex + i].normal;
|
std::size_t n = 0;
|
||||||
int& p = currentMesh->vertices[face.firstVertex + i].position;
|
std::size_t p = 0;
|
||||||
int& t = currentMesh->vertices[face.firstVertex + i].texCoord;
|
std::size_t t = 0;
|
||||||
|
|
||||||
if (std::sscanf(&m_currentLine[pos], "%d/%d/%d%n", &p, &t, &n, &offset) != 3)
|
if (std::sscanf(&m_currentLine[pos], "%d/%d/%d%n", &p, &t, &n, &offset) != 3)
|
||||||
{
|
{
|
||||||
|
|
@ -199,6 +199,10 @@ namespace Nz
|
||||||
break;
|
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;
|
pos += offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue