minor mesh refactor

This commit is contained in:
h4570
2022-08-03 19:23:55 +02:00
parent 82e5e87822
commit 689c8132d1
9 changed files with 32 additions and 32 deletions
@@ -19,13 +19,6 @@ namespace Tyra {
class MeshBuilderData { class MeshBuilderData {
public: public:
MeshBuilderData(); MeshBuilderData();
/**
* Frames array and materials array will be deallocated, but
* data (vert,st, ...) inside it not.
* Data ownership is transferred to
* the Mesh class.
*/
~MeshBuilderData(); ~MeshBuilderData();
MeshBuilderFrameData** frames; MeshBuilderFrameData** frames;
@@ -17,10 +17,6 @@
namespace Tyra { namespace Tyra {
/**
* Data is not deallocated here.
* Ownership is moved to Mesh class.
*/
class MeshBuilderFrameData { class MeshBuilderFrameData {
public: public:
MeshBuilderFrameData(); MeshBuilderFrameData();
@@ -16,10 +16,6 @@
namespace Tyra { namespace Tyra {
/**
* Data is not deallocated here.
* Ownership is moved to Mesh class.
*/
class MeshBuilderMaterialData { class MeshBuilderMaterialData {
public: public:
MeshBuilderMaterialData(); MeshBuilderMaterialData();
@@ -56,13 +56,13 @@ class TyrobjLoader : public Loader {
const u16& frameIndex, const TyraobjData& inputData, const u16& frameIndex, const TyraobjData& inputData,
MeshBuilderData* outputData); MeshBuilderData* outputData);
void readNormals(TyraobjReadInfo* info, FILE* file, const u16& frameIndex, void readNormals(TyraobjReadInfo* info, FILE* file, const u16& frameIndex,
const TyraobjData& inputData, MeshBuilderData* outputData); MeshBuilderData* outputData);
void readColors(TyraobjReadInfo* info, FILE* file, const u16& frameIndex, void readColors(TyraobjReadInfo* info, FILE* file, const u16& frameIndex,
const TyraobjData& inputData, MeshBuilderData* outputData); MeshBuilderData* outputData);
void readMaterials(TyraobjReadInfo* info, FILE* file, const u16& frameIndex, void readMaterials(TyraobjReadInfo* info, FILE* file,
const TyraobjData& inputData, MeshBuilderData* outputData); const TyraobjData& inputData, MeshBuilderData* outputData);
void readFaces(TyraobjReadInfo* info, FILE* file, const u16& frameIndex, void readFaces(TyraobjReadInfo* info, FILE* file,
const TyraobjData& inputData, MeshBuilderData* outputData); MeshBuilderData* outputData);
}; };
} // namespace Tyra } // namespace Tyra
@@ -10,6 +10,7 @@
*/ */
#include "loaders/3d/builder/mesh_builder_data.hpp" #include "loaders/3d/builder/mesh_builder_data.hpp"
#include "debug/debug.hpp"
namespace Tyra { namespace Tyra {
@@ -17,6 +18,8 @@ MeshBuilderData::MeshBuilderData() {
normalsEnabled = false; normalsEnabled = false;
textureCoordsEnabled = false; textureCoordsEnabled = false;
manyColorsEnabled = false; manyColorsEnabled = false;
materials = nullptr;
frames = nullptr;
} }
MeshBuilderData::~MeshBuilderData() { MeshBuilderData::~MeshBuilderData() {
@@ -44,6 +47,7 @@ void MeshBuilderData::allocate(const u32& framesCount,
void MeshBuilderData::allocateFrames(const u32& count) { void MeshBuilderData::allocateFrames(const u32& count) {
this->framesCount = count; this->framesCount = count;
TYRA_ASSERT(frames == nullptr, "Frames are already allocated");
frames = new MeshBuilderFrameData*[count]; frames = new MeshBuilderFrameData*[count];
for (u32 i = 0; i < count; i++) { for (u32 i = 0; i < count; i++) {
@@ -54,6 +58,7 @@ void MeshBuilderData::allocateFrames(const u32& count) {
void MeshBuilderData::allocateMaterials(const u32& count) { void MeshBuilderData::allocateMaterials(const u32& count) {
this->materialsCount = count; this->materialsCount = count;
TYRA_ASSERT(materials == nullptr, "Materials are already allocated");
materials = new MeshBuilderMaterialData*[count]; materials = new MeshBuilderMaterialData*[count];
for (u32 i = 0; i < count; i++) { for (u32 i = 0; i < count; i++) {
@@ -10,6 +10,7 @@
*/ */
#include "loaders/3d/builder/mesh_builder_frame_data.hpp" #include "loaders/3d/builder/mesh_builder_frame_data.hpp"
#include "debug/debug.hpp"
namespace Tyra { namespace Tyra {
@@ -41,24 +42,28 @@ MeshBuilderFrameData::~MeshBuilderFrameData() {
void MeshBuilderFrameData::allocateTextureCoords(const u32& count) { void MeshBuilderFrameData::allocateTextureCoords(const u32& count) {
if (count == 0) return; if (count == 0) return;
TYRA_ASSERT(textureCoords == nullptr, "Texture coords are already allocated");
textureCoordsCount = count; textureCoordsCount = count;
textureCoords = new Vec4[count]; textureCoords = new Vec4[count];
} }
void MeshBuilderFrameData::allocateVertices(const u32& count) { void MeshBuilderFrameData::allocateVertices(const u32& count) {
if (count == 0) return; if (count == 0) return;
TYRA_ASSERT(vertices == nullptr, "Vertices are already allocated");
verticesCount = count; verticesCount = count;
vertices = new Vec4[count]; vertices = new Vec4[count];
} }
void MeshBuilderFrameData::allocateNormals(const u32& count) { void MeshBuilderFrameData::allocateNormals(const u32& count) {
if (count == 0) return; if (count == 0) return;
TYRA_ASSERT(normals == nullptr, "Normals are already allocated");
normalsCount = count; normalsCount = count;
normals = new Vec4[count]; normals = new Vec4[count];
} }
void MeshBuilderFrameData::allocateColors(const u32& count) { void MeshBuilderFrameData::allocateColors(const u32& count) {
if (count == 0) return; if (count == 0) return;
TYRA_ASSERT(colors == nullptr, "Colors are already allocated");
colorsCount = count; colorsCount = count;
colors = new Color[count]; colors = new Color[count];
} }
@@ -10,6 +10,7 @@
*/ */
#include "loaders/3d/builder/mesh_builder_material_data.hpp" #include "loaders/3d/builder/mesh_builder_material_data.hpp"
#include "debug/debug.hpp"
namespace Tyra { namespace Tyra {
@@ -38,6 +39,9 @@ MeshBuilderMaterialData::~MeshBuilderMaterialData() {
} }
void MeshBuilderMaterialData::allocateFaces(const u32& t_count) { void MeshBuilderMaterialData::allocateFaces(const u32& t_count) {
TYRA_ASSERT(vertexFaces == nullptr && textureCoordFaces == nullptr &&
normalFaces == nullptr && colorFaces == nullptr,
"Faces are already allocated");
vertexFaces = new u32[t_count]; vertexFaces = new u32[t_count];
textureCoordFaces = new u32[t_count]; textureCoordFaces = new u32[t_count];
normalFaces = new u32[t_count]; normalFaces = new u32[t_count];
+10 -11
View File
@@ -135,13 +135,19 @@ void TyrobjLoader::loadFile(FILE* file, const std::string& path,
} else if (strcmp(lineHeader, "vt") == 0) { } else if (strcmp(lineHeader, "vt") == 0) {
readTextureCoords(&readInfo, file, frameIndex, inputData, outputData); readTextureCoords(&readInfo, file, frameIndex, inputData, outputData);
} else if (strcmp(lineHeader, "vn") == 0) { } else if (strcmp(lineHeader, "vn") == 0) {
readNormals(&readInfo, file, frameIndex, inputData, outputData); readNormals(&readInfo, file, frameIndex, outputData);
} else if (strcmp(lineHeader, "vc") == 0) { } else if (strcmp(lineHeader, "vc") == 0) {
readColors(&readInfo, file, frameIndex, inputData, outputData); readColors(&readInfo, file, frameIndex, outputData);
} else if (strcmp(lineHeader, "usemtl") == 0) { } else if (strcmp(lineHeader, "usemtl") == 0) {
readMaterials(&readInfo, file, frameIndex, inputData, outputData); readInfo.materialsI++;
readInfo.faceI = 0;
if (frameIndex == 0) {
readMaterials(&readInfo, file, inputData, outputData);
}
} else if (strcmp(lineHeader, "f") == 0) { } else if (strcmp(lineHeader, "f") == 0) {
readFaces(&readInfo, file, frameIndex, inputData, outputData); if (frameIndex == 0) {
readFaces(&readInfo, file, outputData);
}
} }
res = fscanf(file, "%s", lineHeader); res = fscanf(file, "%s", lineHeader);
@@ -182,7 +188,6 @@ void TyrobjLoader::readTextureCoords(TyraobjReadInfo* info, FILE* file,
void TyrobjLoader::readNormals(TyraobjReadInfo* info, FILE* file, void TyrobjLoader::readNormals(TyraobjReadInfo* info, FILE* file,
const u16& frameIndex, const u16& frameIndex,
const TyraobjData& inputData,
MeshBuilderData* outputData) { MeshBuilderData* outputData) {
Vec4 vector(0.0F, 0.0F, 0.0F, 1.0F); Vec4 vector(0.0F, 0.0F, 0.0F, 1.0F);
fscanf(file, "%f %f %f\n", &vector.x, &vector.y, &vector.z); fscanf(file, "%f %f %f\n", &vector.x, &vector.y, &vector.z);
@@ -191,7 +196,6 @@ void TyrobjLoader::readNormals(TyraobjReadInfo* info, FILE* file,
void TyrobjLoader::readColors(TyraobjReadInfo* info, FILE* file, void TyrobjLoader::readColors(TyraobjReadInfo* info, FILE* file,
const u16& frameIndex, const u16& frameIndex,
const TyraobjData& inputData,
MeshBuilderData* outputData) { MeshBuilderData* outputData) {
Color color(128.0F, 128.0F, 128.0F, 128.0F); Color color(128.0F, 128.0F, 128.0F, 128.0F);
fscanf(file, "%f %f %f %f\n", &color.r, &color.g, &color.b, &color.a); fscanf(file, "%f %f %f %f\n", &color.r, &color.g, &color.b, &color.a);
@@ -199,23 +203,18 @@ void TyrobjLoader::readColors(TyraobjReadInfo* info, FILE* file,
} }
void TyrobjLoader::readMaterials(TyraobjReadInfo* info, FILE* file, void TyrobjLoader::readMaterials(TyraobjReadInfo* info, FILE* file,
const u16& frameIndex,
const TyraobjData& inputData, const TyraobjData& inputData,
MeshBuilderData* outputData) { MeshBuilderData* outputData) {
char temp[30]; char temp[30];
fscanf(file, "%s\n", temp); fscanf(file, "%s\n", temp);
info->materialsI++;
outputData->materials[info->materialsI]->allocateFaces( outputData->materials[info->materialsI]->allocateFaces(
inputData.materialsFaces[info->materialsI]); inputData.materialsFaces[info->materialsI]);
outputData->materials[info->materialsI]->name = temp; outputData->materials[info->materialsI]->name = temp;
info->faceI = 0;
} }
int test123 = 0; int test123 = 0;
void TyrobjLoader::readFaces(TyraobjReadInfo* info, FILE* file, void TyrobjLoader::readFaces(TyraobjReadInfo* info, FILE* file,
const u16& frameIndex,
const TyraobjData& inputData,
MeshBuilderData* outputData) { MeshBuilderData* outputData) {
int* x = new int[9]; int* x = new int[9];
fpos_t start; fpos_t start;
@@ -18,7 +18,9 @@ namespace Tyra {
DynamicMesh::DynamicMesh(const MeshBuilderData& data) : Mesh(data) { DynamicMesh::DynamicMesh(const MeshBuilderData& data) : Mesh(data) {
framesCount = data.framesCount; framesCount = data.framesCount;
TYRA_ASSERT(framesCount > 1, "Frames count must be greater than 1"); TYRA_ERROR(framesCount > 1,
"Frames count should be greater than 1 for DynamicMesh! Maybe you "
"should use StaticMesh?");
frames = new MeshFrame*[framesCount]; frames = new MeshFrame*[framesCount];
for (u32 i = 0; i < framesCount; i++) { for (u32 i = 0; i < framesCount; i++) {