optimized rendering, fixed dff

This commit is contained in:
Sandro Sobczyński
2020-11-02 23:09:55 +01:00
parent 06a440243a
commit 5aa2a9bdb5
12 changed files with 466 additions and 469 deletions
+9 -13
View File
@@ -23,30 +23,26 @@ public:
~DffLoader(); ~DffLoader();
void load(MeshFrame *o_result, char *t_fileName, float t_scale, u8 t_invertT); void load(MeshFrame *o_result, char *t_fileName, float t_scale, u8 t_invertT);
void serialize(RwClump &t_clump, u8 *t_data, float t_scale); void serialize(MeshFrame *o_result, u8 t_invertT, u8 *t_data, float t_scale);
static u8 readByteFromArrayLE(u8 *t_buffer, u32 &t_ptrPos);
static u16 readWordFromArrayLE(u8 *t_buffer, u32 &t_ptrPos);
static u32 readDwordFromArrayLE(u8 *t_buffer, u32 &t_ptrPos);
static float readFloatFromArrayLE(u8 *t_buffer, u32 &t_ptrPos);
static u8 *readData(u8 *t_buffer, u32 &t_ptrPos, u32 t_dataSize);
static char *readString(u8 *t_buffer, u32 &t_ptrPos, u32 t_dataSize = 0);
void readSectionHeader(RwSectionHeader &t_sh, u8 *t_buffer, u32 &t_ptrPos);
private: private:
void convert(MeshFrame *frames, RwClump &t_clump, u8 t_invertT);
// --- // ---
void readFrameListData(RwFrameListData &t_frd, u8 *t_buffer, u32 &t_ptrPos); void readFrameListData(RwFrameListData &t_frd, u8 *t_buffer, u32 &t_ptrPos);
void readClumpData(RwClumpData &t_cd, u8 *t_buffer, u32 &t_ptrPos); void readClumpData(RwClumpData &t_cd, u8 *t_buffer, u32 &t_ptrPos);
void readGeometryListData(RwGeometryListData &t_gld, u8 *t_buffer, u32 &t_ptrPos); void readGeometryListData(RwGeometryListData &t_gld, u8 *t_buffer, u32 &t_ptrPos);
void readGeometryExtension(RwGeometryExtension &t_ge, u8 *t_buffer, u32 &t_ptrPos); void readGeometryExtension(MeshFrame *o_frame, char **materialNames, u8 *t_buffer, u32 &t_ptrPos);
void readGeometryData(RwGeometryData &t_gd, u8 *t_buffer, u32 &t_ptrPos, float t_scale); void readGeometryData(MeshFrame *o_frame, u8 t_invertT, u8 *t_buffer, u32 &t_ptrPos, float t_scale);
void readMaterialListData(RwMaterialListData &t_mld, u8 *t_buffer, u32 &t_ptrPos); void readMaterialListData(RwMaterialListData &t_mld, u8 *t_buffer, u32 &t_ptrPos);
void readMaterialData(RwMaterialData &t_md, u8 *t_buffer, u32 &t_ptrPos); void readMaterialData(RwMaterialData &t_md, u8 *t_buffer, u32 &t_ptrPos);
void readTextureData(RwTextureData &t_td, u8 *t_buffer, u32 &t_ptrPos); void readTextureData(RwTextureData &t_td, u8 *t_buffer, u32 &t_ptrPos);
void readStringData(RwString &t_s, u8 *bt_uffer, u32 &t_ptrPos); void readStringData(RwString &t_s, u8 *bt_uffer, u32 &t_ptrPos);
void readSectionHeader(RwSectionHeader &t_sh, u8 *t_buffer, u32 &t_ptrPos);
// --- // ---
u8 readByteFromArrayLE(u8 *t_buffer, u32 &t_ptrPos);
u16 readWordFromArrayLE(u8 *t_buffer, u32 &t_ptrPos);
u32 readDwordFromArrayLE(u8 *t_buffer, u32 &t_ptrPos);
float readFloatFromArrayLE(u8 *t_buffer, u32 &t_ptrPos);
char *readString(u8 *t_buffer, u32 &t_ptrPos, u32 t_dataSize = 0);
}; };
#endif #endif
+46 -38
View File
@@ -37,7 +37,7 @@ public:
class RwFrameListChunk class RwFrameListChunk
{ {
public: public:
~RwFrameListChunk() { delete[] rotationalMatrix; } ~RwFrameListChunk() {}
float *rotationalMatrix; // [ROT_MAT_DIM] float *rotationalMatrix; // [ROT_MAT_DIM]
float coordinatesOffsetX; float coordinatesOffsetX;
float coordinatesOffsetY; float coordinatesOffsetY;
@@ -50,7 +50,7 @@ public:
class RwFrameListData : public RwSectionHeader class RwFrameListData : public RwSectionHeader
{ {
public: public:
~RwFrameListData() { delete frameInformation; } ~RwFrameListData() {}
static const u32 ROT_MAT_DIM = 9; static const u32 ROT_MAT_DIM = 9;
u32 frameCount; u32 frameCount;
@@ -60,7 +60,7 @@ public:
class RwFrame : public RwSectionHeader class RwFrame : public RwSectionHeader
{ {
public: public:
~RwFrame() { delete[] frameName; } ~RwFrame() {}
u8 *frameName; // [sectionSize] - should be interpreted as string u8 *frameName; // [sectionSize] - should be interpreted as string
}; };
@@ -74,7 +74,7 @@ class RwFrameList : public RwSectionHeader
{ {
public: public:
RwFrameListData data; RwFrameListData data;
~RwFrameList() { delete[] extensions; } ~RwFrameList() {}
RwFrameListExtension *extensions; RwFrameListExtension *extensions;
}; };
// --- // ---
@@ -89,50 +89,65 @@ public:
u32 morphTargetCount; u32 morphTargetCount;
}; };
class RwGeometryDataLightingHeader struct RwGeometryDataLightingHeader
{ // IF versionNumber = 4099 - according to not complete documentation { // IF versionNumber = 4099 - according to not complete documentation
public:
float ambient; float ambient;
float diffuse; float diffuse;
float specular; float specular;
}; };
class RwGeometryDataColorInformationChunk struct RwGeometryDataColorInformationChunk
{ // if rwOBJECT_VERTEX_PREILIT in flags { // if rwOBJECT_VERTEX_PREILIT in flags
public:
u8 red; u8 red;
u8 green; u8 green;
u8 blue; u8 blue;
u8 alpha; u8 alpha;
}; };
class RwGeometryDataTextureMappingInformationChunk struct RwGeometryDataTextureMappingInformationChunk
{ // if rwOBJECT_VERTEX_TEXTURED in flags { // if rwOBJECT_VERTEX_TEXTURED in flags
public:
float u; float u;
float v; float v;
}; };
class RwGeometryDataFaceInformation struct RwGeometryDataFaceInformation
{ {
public:
u16 vertex2; // this u16 vertex2; // this
u16 vertex1; // is u16 vertex1; // is
u16 flags; // weird u16 flags; // weird
u16 vertex3; // order u16 vertex3; // order
}; };
class RwGeometryDataNonameInfo
{
public:
float boundingSphereX;
float boundingSphereY;
float boundingSphereZ;
float boundingSphereR;
u32 hasPosition;
u32 hasNormals;
};
#include <stdio.h>
#include <stdlib.h>
// Section: Geometry // Section: Geometry
class RwGeometryData : public RwSectionHeader class RwGeometryData : public RwSectionHeader
{ {
public: public:
~RwGeometryData() ~RwGeometryData()
{ {
delete colorInformation; // if (dataHeader.flags & rwOBJECT_VERTEX_NORMALS)
delete textureMappingInformation; // delete[] normalInformation;
delete faceInformation; // delete[] vertexInformation;
delete vertexInformation; // free(vertexInformation);
delete normalInformation; // delete[] faceInformation;
// if (dataHeader.flags & rwOBJECT_VERTEX_PRELIT)
// delete[] colorInformation;
// if (dataHeader.flags & rwOBJECT_VERTEX_TEXTURED)
// delete[] textureMappingInformation;
} }
RwGeometryDataHeader dataHeader; RwGeometryDataHeader dataHeader;
@@ -144,16 +159,7 @@ public:
RwGeometryDataFaceInformation *faceInformation; // [triangleCount] RwGeometryDataFaceInformation *faceInformation; // [triangleCount]
class RwGeometryDataNonameInfo RwGeometryDataNonameInfo nonameInfo;
{
public:
float boundingSphereX;
float boundingSphereY;
float boundingSphereZ;
float boundingSphereR;
u32 hasPosition;
u32 hasNormals;
} nonameInfo;
Vector3 *vertexInformation; // [vertexCount] Vector3 *vertexInformation; // [vertexCount]
@@ -211,7 +217,7 @@ class RwMaterialExtension : public RwSectionHeader
class RwMaterial : public RwSectionHeader class RwMaterial : public RwSectionHeader
{ {
public: public:
~RwMaterial() { delete[] textures; } ~RwMaterial() {}
RwMaterialData data; RwMaterialData data;
RwTexture *textures; RwTexture *textures;
RwMaterialExtension extension; RwMaterialExtension extension;
@@ -220,7 +226,7 @@ public:
class RwMaterialListData : public RwSectionHeader class RwMaterialListData : public RwSectionHeader
{ {
public: public:
~RwMaterialListData() { delete[] arrayOfUnks; } ~RwMaterialListData() {}
u32 materialCount; u32 materialCount;
u32 *arrayOfUnks; // Filled with '-1's, [materialCount] - it wasn't mentioned in docs. u32 *arrayOfUnks; // Filled with '-1's, [materialCount] - it wasn't mentioned in docs.
}; };
@@ -228,7 +234,7 @@ public:
class RwMaterialList : public RwSectionHeader class RwMaterialList : public RwSectionHeader
{ {
public: public:
~RwMaterialList() { delete[] materials; } ~RwMaterialList() {}
RwMaterialListData data; RwMaterialListData data;
RwMaterial *materials; RwMaterial *materials;
}; };
@@ -242,24 +248,26 @@ public:
class RwGeometryListInfoChunk class RwGeometryListInfoChunk
{ {
public: public:
~RwGeometryListInfoChunk() { delete vertexInformation; } ~RwGeometryListInfoChunk() {}
u32 faceIndex; u32 faceIndex;
u32 materialIndex; u32 materialIndex;
RwGeometryListVertexInfoChunk *vertexInformation; // [faceIndex] RwGeometryListVertexInfoChunk *vertexInformation; // [faceIndex]
}; };
class RwMaterialSplit class RwMaterialSplitHeader
{
public:
~RwMaterialSplit() { delete splitInformation; }
class Header
{ {
public: public:
u32 triangleStrip; u32 triangleStrip;
u32 splitCount; u32 splitCount;
u32 faceCount; u32 faceCount;
} header; };
class RwMaterialSplit
{
public:
~RwMaterialSplit() {}
RwMaterialSplitHeader header;
RwGeometryListInfoChunk *splitInformation; // [splitCount] RwGeometryListInfoChunk *splitInformation; // [splitCount]
}; };
@@ -289,7 +297,7 @@ public:
class RwGeometryList : public RwSectionHeader class RwGeometryList : public RwSectionHeader
{ {
public: public:
~RwGeometryList() { delete[] geometries; } ~RwGeometryList() {}
RwGeometryListData data; RwGeometryListData data;
RwGeometry *geometries; RwGeometry *geometries;
}; };
+48 -16
View File
@@ -33,11 +33,16 @@ public:
float scale; float scale;
u8 shouldBeLighted, shouldBeBackfaceCulled, shouldBeFrustumCulled; u8 shouldBeLighted, shouldBeBackfaceCulled, shouldBeFrustumCulled;
color_t color; color_t color;
clutbuffer_t clut;
lod_t lod;
// ---- // ----
// Getters // Getters
// ---- // ----
/** Auto generated unique Id. */
const u32 &getId() const { return id; };
/** Array of materials. Size of getMaterialsCount() */ /** Array of materials. Size of getMaterialsCount() */
MeshMaterial *getMaterials() const { return frames[0].getMaterials(); }; MeshMaterial *getMaterials() const { return frames[0].getMaterials(); };
@@ -46,6 +51,28 @@ public:
/** Returns material, which is a mesh "subgroup". */ /** Returns material, which is a mesh "subgroup". */
MeshMaterial &getMaterial(const u32 &i) const { return frames[0].getMaterial(i); }; MeshMaterial &getMaterial(const u32 &i) const { return frames[0].getMaterial(i); };
/** Auto count of frames. Static object (not animated) will have only 1 frame. */
const u32 &getFramesCount() const { return framesCount; };
/** Count of vertices. */
u32 getVertexCount() { return frames[0].getVertexCount(); };
/** Returns single frame. */
MeshFrame &getFrame(const u32 &i) const { return frames[i]; };
/** Array of frames. Size of getFramesCount() */
MeshFrame *getFrames() const { return frames; };
const u32 &getCurrentAnimationFrame() const { return animState.currentFrame; };
const u32 &getNextAnimationFrame() const { return animState.nextFrame; };
const u32 &getStartAnimationFrame() const { return animState.startFrame; };
const u32 &getEndAnimationFrame() const { return animState.endFrame; };
const u32 &getStayAnimationFrame() const { return animState.stayFrame; };
/** /**
* Returns material, which is a mesh "subgroup". * Returns material, which is a mesh "subgroup".
* NULL if not found. * NULL if not found.
@@ -130,38 +157,43 @@ public:
/** Play animation from startFrame to endFrame and after loop in stayFrame */ /** Play animation from startFrame to endFrame and after loop in stayFrame */
void playAnimation(const u32 &t_startFrame, const u32 &t_endFrame, const u32 &t_stayFrame); void playAnimation(const u32 &t_startFrame, const u32 &t_endFrame, const u32 &t_stayFrame);
void setAnimSpeed(const float &t_value) { animState.speed = t_value; }
/** /**
* Check if this class loaded mesh data first. * Check if this class loaded mesh data first.
* Meshes which use loadFrom() method have false there. * Meshes which use loadFrom() method have false there.
*/ */
const u8 &isMother() const { return _isMother; }; const u8 &isMother() const { return _isMother; };
// TODO /**
* Check if this class loaded mesh data first.
* Meshes which use loadFrom() method have false there.
*/
const u8 &isStayAnimationSet() const { return animState.isStayFrameSet; };
// void getMinMax(Vector3 *t_min, Vector3 *t_max); /** Check if mesh is visible in view frustum */
u32 getVertexCount();
void setAnimSpeed(float t_value);
u8 isInFrustum(Plane *t_frustumPlanes); u8 isInFrustum(Plane *t_frustumPlanes);
clutbuffer_t clut; /**
lod_t lod; * Do not call this method unless you know what you do.
u32 id; * Should be called by renderer.
*/
// NOWE TODO
u32 framesCount;
MeshFrame *frames;
AnimState animState;
void animate(); void animate();
/**
* Do not call this method unless you know what you do.
* Should be called by renderer.
*/
u32 getDrawData(u32 t_materialIndex, VECTOR *o_vertices, VECTOR *o_normals, VECTOR *o_coordinates, Vector3 &t_cameraPos); u32 getDrawData(u32 t_materialIndex, VECTOR *o_vertices, VECTOR *o_normals, VECTOR *o_coordinates, Vector3 &t_cameraPos);
u32 getFacesCount();
u8 isMemoryAllocated;
private: private:
AnimState animState;
MeshFrame *frames;
u32 id, framesCount;
u8 _isMother; u8 _isMother;
Vector3 calc3Vectors[3]; Vector3 calc3Vectors[3];
void setupLodAndClut();
void setDefaultColor(); void setDefaultColor();
void setDefaultLODAndClut();
}; };
#endif #endif
+1 -2
View File
@@ -32,7 +32,6 @@ BmpLoader::~BmpLoader() {}
*/ */
void BmpLoader::load(MeshTexture &o_texture, char *t_subfolder, char *t_name, char *t_extension) void BmpLoader::load(MeshTexture &o_texture, char *t_subfolder, char *t_name, char *t_extension)
{ {
char *t_path_part = String::createConcatenated(t_subfolder, t_name); char *t_path_part = String::createConcatenated(t_subfolder, t_name);
char *t_path = String::createConcatenated(t_path_part, t_extension); char *t_path = String::createConcatenated(t_path_part, t_extension);
delete[] t_path_part; delete[] t_path_part;
@@ -78,5 +77,5 @@ void BmpLoader::load(MeshTexture &o_texture, char *t_subfolder, char *t_name, ch
} }
delete[] t_path; delete[] t_path;
delete[] data; delete[] data;
// fclose(file); // wtf? fclose(file);
} }
+202 -214
View File
@@ -42,143 +42,128 @@ void DffLoader::load(MeshFrame *o_result, char *t_filename, float t_scale, u8 t_
PRINT_ERR("Failed to load .obj file!"); PRINT_ERR("Failed to load .obj file!");
fseek(file, 0L, SEEK_END); fseek(file, 0L, SEEK_END);
long fileSize = ftell(file); long fileSize = ftell(file);
u8 *data = new u8[fileSize]; u8 data[fileSize];
rewind(file); rewind(file);
fread(data, sizeof(u8), fileSize, file); fread(&data, sizeof(u8), fileSize, file);
fclose(file); fclose(file);
RwClump *clump = new RwClump(); serialize(o_result, t_invertT, data, t_scale);
serialize(*clump, data, t_scale); o_result->calculateBoundingBox();
delete[] data;
// delete[] clump; // TODO
convert(o_result, *clump, t_invertT);
PRINT_LOG("Dff file loaded!"); PRINT_LOG("Dff file loaded!");
} }
void DffLoader::convert(MeshFrame *o_result, RwClump &t_clump, u8 t_invertT) void DffLoader::serialize(MeshFrame *o_result, u8 t_invertT, u8 *t_data, float t_scale)
{
#define GEOMETRY t_clump.geometryList.geometries[0]
MeshFrame *frame = &o_result[0];
u32 vertNormalStCount = GEOMETRY.data.dataHeader.vertexCount;
frame->allocateVertices(vertNormalStCount);
frame->allocateNormals(vertNormalStCount); // can be optimized
frame->allocateSTs(vertNormalStCount); // can be optimized
Vector3 tempVec = Vector3();
Point tempPoint = Point();
for (u32 i = 0; i < vertNormalStCount; i++)
{
tempVec.set(
GEOMETRY.data.vertexInformation[i].x,
GEOMETRY.data.vertexInformation[i].y,
GEOMETRY.data.vertexInformation[i].z);
frame->setVertex(i, tempVec);
tempVec.set(
GEOMETRY.data.normalInformation[i].x,
GEOMETRY.data.normalInformation[i].y,
GEOMETRY.data.normalInformation[i].z);
frame->setNormal(i, tempVec);
tempPoint.set(
GEOMETRY.data.textureMappingInformation[i].u,
GEOMETRY.data.textureMappingInformation[i].v);
if (t_invertT)
tempPoint.y = 1.0F - tempPoint.y;
frame->setST(i, tempPoint);
}
#define CURR_SPLIT GEOMETRY.extension.materialSplit.splitInformation[i]
u32 materialsCount = GEOMETRY.extension.materialSplit.header.splitCount;
frame->allocateMaterials(materialsCount);
for (u32 i = 0; i < materialsCount; i++)
{
u32 facesCount = CURR_SPLIT.faceIndex;
u32 materialIndex = CURR_SPLIT.materialIndex;
frame->getMaterial(i).allocateFaces(facesCount);
char **materialName = &GEOMETRY.materialList.materials[materialIndex].textures[0].textureName.text;
frame->getMaterial(i).setName(*materialName);
for (u32 j = 0; j < facesCount; j++)
{
frame->getMaterial(i).setVertexFace(j, CURR_SPLIT.vertexInformation[j].vertex1);
frame->getMaterial(i).setNormalFace(j, CURR_SPLIT.vertexInformation[j].vertex1);
frame->getMaterial(i).setSTFace(j, CURR_SPLIT.vertexInformation[j].vertex1);
}
}
frame->calculateBoundingBox();
}
void DffLoader::serialize(RwClump &t_clump, u8 *t_data, float t_scale)
{ {
u32 ptrPos = 0; u32 ptrPos = 0;
readSectionHeader(t_clump, t_data, ptrPos);
readSectionHeader(t_clump.data, t_data, ptrPos);
readClumpData(t_clump.data, t_data, ptrPos);
readSectionHeader(t_clump.frameList, t_data, ptrPos);
readSectionHeader(t_clump.frameList.data, t_data, ptrPos);
readFrameListData(t_clump.frameList.data, t_data, ptrPos);
t_clump.frameList.extensions = new RwFrameListExtension[t_clump.frameList.data.frameCount]; // readSectionHeader(t_clump, t_data, ptrPos);
for (u32 i = 0; i < t_clump.frameList.data.frameCount; i++) // readSectionHeader(t_clump.data, t_data, ptrPos);
{ // readClumpData(t_clump.data, t_data, ptrPos);
readSectionHeader(t_clump.frameList.extensions[i], t_data, ptrPos); for (u8 i = 0; i < 3 * 3; i++)
ptrPos += t_clump.frameList.extensions[i].sectionSize; ptrPos += sizeof(u32);
}
readSectionHeader(t_clump.geometryList, t_data, ptrPos); // readSectionHeader(t_clump.frameList, t_data, ptrPos);
readSectionHeader(t_clump.geometryList.data, t_data, ptrPos); // readSectionHeader(t_clump.frameList.data, t_data, ptrPos);
readGeometryListData(t_clump.geometryList.data, t_data, ptrPos); // readFrameListData(t_clump.frameList.data, t_data, ptrPos);
// t_clump.frameList.extensions = new RwFrameListExtension[t_clump.frameList.data.frameCount];
// for (u32 i = 0; i < t_clump.frameList.data.frameCount; i++)
// {
// readSectionHeader(t_clump.frameList.extensions[i], t_data, ptrPos);
// ptrPos += t_clump.frameList.extensions[i].sectionSize;
// }
RwSectionHeader header1 = RwSectionHeader();
readSectionHeader(header1, t_data, ptrPos);
ptrPos += header1.sectionSize;
t_clump.geometryList.geometries = new RwGeometry[t_clump.geometryList.data.geometryCount]; // readSectionHeader(t_clump.geometryList, t_data, ptrPos);
printf("Geometries:%d\n", t_clump.geometryList.data.geometryCount); // readSectionHeader(t_clump.geometryList.data, t_data, ptrPos);
for (u32 i = 0; i < t_clump.geometryList.data.geometryCount; i++) for (u8 i = 0; i < 2 * 3; i++)
{ ptrPos += sizeof(u32);
readSectionHeader(t_clump.geometryList.geometries[i], t_data, ptrPos);
readSectionHeader(t_clump.geometryList.geometries[i].data, t_data, ptrPos);
readGeometryData(t_clump.geometryList.geometries[i].data, t_data, ptrPos, t_scale);
readSectionHeader(t_clump.geometryList.geometries[i].materialList, t_data, ptrPos); // readGeometryListData(t_clump.geometryList.data, t_data, ptrPos);
readSectionHeader(t_clump.geometryList.geometries[i].materialList.data, t_data, ptrPos); ptrPos += sizeof(u32);
readMaterialListData(t_clump.geometryList.geometries[i].materialList.data, t_data, ptrPos);
u32 materialCount = t_clump.geometryList.geometries[i].materialList.data.materialCount; // readSectionHeader(geometry, t_data, ptrPos);
printf("Materials:%d\n", materialCount); // readSectionHeader(geometry.data, t_data, ptrPos);
for (size_t i = 0; i < 2 * 3; i++)
ptrPos += sizeof(u32);
t_clump.geometryList.geometries[i].materialList.materials = new RwMaterial[materialCount]; readGeometryData(o_result, t_invertT, t_data, ptrPos, t_scale);
// readSectionHeader(geometry.materialList, t_data, ptrPos);
// readSectionHeader(geometry.materialList.data, t_data, ptrPos);
for (size_t i = 0; i < 2 * 3; i++)
ptrPos += sizeof(u32);
RwMaterialListData materialListData = RwMaterialListData();
readMaterialListData(materialListData, t_data, ptrPos);
u32 materialCount = materialListData.materialCount;
char **materialNames = new char *[materialCount];
for (u32 j = 0; j < materialCount; j++) for (u32 j = 0; j < materialCount; j++)
{ {
readSectionHeader(t_clump.geometryList.geometries[i].materialList.materials[j], t_data, ptrPos); // readSectionHeader(geometry.materialList.materials[j], t_data, ptrPos);
readSectionHeader(t_clump.geometryList.geometries[i].materialList.materials[j].data, t_data, ptrPos); for (size_t i = 0; i < 3; i++)
readMaterialData(t_clump.geometryList.geometries[i].materialList.materials[j].data, t_data, ptrPos); ptrPos += sizeof(u32);
u32 textureCount = t_clump.geometryList.geometries[i].materialList.materials[j].data.textureCount; // RwMaterialData materialData = RwMaterialData();
t_clump.geometryList.geometries[i].materialList.materials[j].textures = new RwTexture[textureCount]; // readSectionHeader(materialData, t_data, ptrPos);
for (u32 k = 0; k < textureCount; k++) // readMaterialData(materialData, t_data, ptrPos);
{ RwSectionHeader header1 = RwSectionHeader();
readSectionHeader(t_clump.geometryList.geometries[i].materialList.materials[j].textures[k], t_data, ptrPos); readSectionHeader(header1, t_data, ptrPos);
readSectionHeader(t_clump.geometryList.geometries[i].materialList.materials[j].textures[k].data, t_data, ptrPos); ptrPos += header1.sectionSize;
readTextureData(t_clump.geometryList.geometries[i].materialList.materials[j].textures[k].data, t_data, ptrPos);
readSectionHeader(t_clump.geometryList.geometries[i].materialList.materials[j].textures[k].textureName, t_data, ptrPos); // for (u32 k = 0; k < textureCount; k++)
readStringData(t_clump.geometryList.geometries[i].materialList.materials[j].textures[k].textureName, t_data, ptrPos); // {
readSectionHeader(t_clump.geometryList.geometries[i].materialList.materials[j].textures[k].textureAlphaName, t_data, ptrPos);
readStringData(t_clump.geometryList.geometries[i].materialList.materials[j].textures[k].textureAlphaName, t_data, ptrPos); // readSectionHeader(geometry.materialList.materials[j].textures[k], t_data, ptrPos);
// readSectionHeader(geometry.materialList.materials[j].textures[k].data, t_data, ptrPos);
for (size_t i = 0; i < 2 * 3; i++)
ptrPos += sizeof(u32);
// readTextureData(geometry.materialList.materials[j].textures[k].data, t_data, ptrPos);
ptrPos += sizeof(u32);
RwSectionHeader header1b = RwSectionHeader();
readSectionHeader(header1b, t_data, ptrPos);
materialNames[j] = readString(t_data, ptrPos, header1b.sectionSize);
// readSectionHeader(geometry.materialList.materials[j].textures[k].textureAlphaName, t_data, ptrPos);
// readStringData(geometry.materialList.materials[j].textures[k].textureAlphaName, t_data, ptrPos);
RwSectionHeader header2 = RwSectionHeader();
readSectionHeader(header2, t_data, ptrPos);
ptrPos += header2.sectionSize;
// The content of extension is Sky Mipmap Val // The content of extension is Sky Mipmap Val
readSectionHeader(t_clump.geometryList.geometries[i].materialList.materials[j].textures[k].extension, t_data, ptrPos); // readSectionHeader(geometry.materialList.materials[j].textures[k].extension, t_data, ptrPos);
ptrPos += t_clump.geometryList.geometries[i].materialList.materials[j].textures[k].extension.sectionSize; RwSectionHeader header3 = RwSectionHeader();
} readSectionHeader(header3, t_data, ptrPos);
// Probably always void extension ptrPos += header3.sectionSize;
readSectionHeader(t_clump.geometryList.geometries[i].materialList.materials[j].extension, t_data, ptrPos); // }
ptrPos += t_clump.geometryList.geometries[i].materialList.materials[j].extension.sectionSize;
}
// For Bin Mesh aka Material split
readSectionHeader(t_clump.geometryList.geometries[i].extension, t_data, ptrPos);
readGeometryExtension(t_clump.geometryList.geometries[i].extension, t_data, ptrPos);
ptrPos += t_clump.geometryList.geometries[i].extension.sectionSize;
}
readSectionHeader(t_clump.atomic, t_data, ptrPos); // Probably always void extension
readSectionHeader(t_clump.atomic.data, t_data, ptrPos); // readSectionHeader(geometry.materialList.materials[j].extension, t_data, ptrPos);
ptrPos += t_clump.atomic.data.sectionSize; RwSectionHeader header4 = RwSectionHeader();
readSectionHeader(header4, t_data, ptrPos);
ptrPos += header4.sectionSize;
}
// delete[] materialNames; // TODO
// For Bin Mesh aka Material split
// readSectionHeader(geometry.extension, t_data, ptrPos);
for (size_t i = 0; i < 3; i++)
ptrPos += sizeof(u32);
readGeometryExtension(o_result, materialNames, t_data, ptrPos);
for (size_t i = 0; i < materialCount; i++)
delete[] materialNames[i];
delete materialNames;
// ptrPos += geometry.extension.sectionSize;
// readSectionHeader(t_clump.atomic, t_data, ptrPos);
// readSectionHeader(t_clump.atomic.data, t_data, ptrPos);
// ptrPos += t_clump.atomic.data.sectionSize;
} }
void DffLoader::readSectionHeader(RwSectionHeader &t_sh, u8 *t_buffer, u32 &t_ptrPos) void DffLoader::readSectionHeader(RwSectionHeader &t_sh, u8 *t_buffer, u32 &t_ptrPos)
@@ -192,139 +177,151 @@ void DffLoader::readSectionHeader(RwSectionHeader &t_sh, u8 *t_buffer, u32 &t_pt
void DffLoader::readFrameListData(RwFrameListData &t_frd, u8 *t_buffer, u32 &t_ptrPos) void DffLoader::readFrameListData(RwFrameListData &t_frd, u8 *t_buffer, u32 &t_ptrPos)
{ {
t_frd.frameCount = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); // t_frd.frameCount = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
printf("Frame count:%d\n", t_frd.frameCount); // printf("Frame count:%d\n", t_frd.frameCount);
t_frd.frameInformation = new RwFrameListChunk[t_frd.frameCount]; // t_frd.frameInformation = new RwFrameListChunk[t_frd.frameCount];
for (u32 i = 0; i < t_frd.frameCount; i++) // for (u32 i = 0; i < t_frd.frameCount; i++)
{ // {
t_frd.frameInformation[i].rotationalMatrix = new float[t_frd.ROT_MAT_DIM]; // t_frd.frameInformation[i].rotationalMatrix = new float[t_frd.ROT_MAT_DIM];
for (u32 j = 0; j < t_frd.ROT_MAT_DIM; j++) // for (u32 j = 0; j < t_frd.ROT_MAT_DIM; j++)
t_frd.frameInformation[i].rotationalMatrix[j] = readFloatFromArrayLE(t_buffer, t_ptrPos); // t_frd.frameInformation[i].rotationalMatrix[j] = readFloatFromArrayLE(t_buffer, t_ptrPos);
t_frd.frameInformation[i].coordinatesOffsetX = readFloatFromArrayLE(t_buffer, t_ptrPos); // t_frd.frameInformation[i].coordinatesOffsetX = readFloatFromArrayLE(t_buffer, t_ptrPos);
t_frd.frameInformation[i].coordinatesOffsetY = readFloatFromArrayLE(t_buffer, t_ptrPos); // t_frd.frameInformation[i].coordinatesOffsetY = readFloatFromArrayLE(t_buffer, t_ptrPos);
t_frd.frameInformation[i].coordinatesOffsetZ = readFloatFromArrayLE(t_buffer, t_ptrPos); // t_frd.frameInformation[i].coordinatesOffsetZ = readFloatFromArrayLE(t_buffer, t_ptrPos);
t_frd.frameInformation[i] // t_frd.frameInformation[i]
.parentFrame = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); // .parentFrame = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
t_frd.frameInformation[i].unk1 = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); // t_frd.frameInformation[i].unk1 = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
} // }
} }
void DffLoader::readClumpData(RwClumpData &t_cd, u8 *t_buffer, u32 &t_ptrPos) void DffLoader::readClumpData(RwClumpData &t_cd, u8 *t_buffer, u32 &t_ptrPos)
{ {
t_cd.objectCount = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); // t_cd.objectCount = readDwordFromArrayLE(t_buffer, t_ptrPos);
t_cd.unk1 = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); // t_cd.unk1 = readDwordFromArrayLE(t_buffer, t_ptrPos);
t_cd.unk2 = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); // t_cd.unk2 = readDwordFromArrayLE(t_buffer, t_ptrPos);
} }
void DffLoader::readGeometryListData(RwGeometryListData &t_gld, u8 *t_buffer, u32 &t_ptrPos) void DffLoader::readGeometryListData(RwGeometryListData &t_gld, u8 *t_buffer, u32 &t_ptrPos)
{ {
t_gld.geometryCount = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); // t_gld.geometryCount = readDwordFromArrayLE(t_buffer, t_ptrPos);
} }
void DffLoader::readGeometryExtension(RwGeometryExtension &t_ge, u8 *t_buffer, u32 &t_ptrPos) void DffLoader::readGeometryExtension(MeshFrame *o_frame, char **materialNames, u8 *t_buffer, u32 &t_ptrPos)
{ {
for (u8 i = 0; i < 3; i++) for (u8 i = 0; i < 3; i++)
t_ptrPos += sizeof(u32); t_ptrPos += sizeof(u32);
t_ge.materialSplit.header.triangleStrip = readDwordFromArrayLE(t_buffer, t_ptrPos); RwMaterialSplitHeader header = RwMaterialSplitHeader();
t_ge.materialSplit.header.splitCount = readDwordFromArrayLE(t_buffer, t_ptrPos); header.triangleStrip = readDwordFromArrayLE(t_buffer, t_ptrPos);
t_ge.materialSplit.header.faceCount = readDwordFromArrayLE(t_buffer, t_ptrPos); header.splitCount = readDwordFromArrayLE(t_buffer, t_ptrPos);
header.faceCount = readDwordFromArrayLE(t_buffer, t_ptrPos);
t_ge.materialSplit.splitInformation = new RwGeometryListInfoChunk[t_ge.materialSplit.header.splitCount]; o_frame->allocateMaterials(header.splitCount);
for (u32 i = 0; i < t_ge.materialSplit.header.splitCount; i++) for (u32 i = 0; i < header.splitCount; i++)
{ {
t_ge.materialSplit.splitInformation[i].faceIndex = readDwordFromArrayLE(t_buffer, t_ptrPos); u32 facesCount = readDwordFromArrayLE(t_buffer, t_ptrPos);
t_ge.materialSplit.splitInformation[i].materialIndex = readDwordFromArrayLE(t_buffer, t_ptrPos); u32 materialIndex = readDwordFromArrayLE(t_buffer, t_ptrPos);
o_frame->getMaterial(i).allocateFaces(facesCount);
t_ge.materialSplit.splitInformation[i].vertexInformation = new RwGeometryListVertexInfoChunk[t_ge.materialSplit.splitInformation[i].faceIndex]; o_frame->getMaterial(i).setName(materialNames[materialIndex]);
for (u32 j = 0; j < t_ge.materialSplit.splitInformation[i].faceIndex; j++) for (u32 j = 0; j < facesCount; j++)
t_ge.materialSplit.splitInformation[i].vertexInformation[j].vertex1 = readDwordFromArrayLE(t_buffer, t_ptrPos); {
u32 vertex1 = readDwordFromArrayLE(t_buffer, t_ptrPos);
o_frame->getMaterial(i).setVertexFace(j, vertex1);
o_frame->getMaterial(i).setNormalFace(j, vertex1);
o_frame->getMaterial(i).setSTFace(j, vertex1);
}
} }
} }
void DffLoader::readGeometryData(RwGeometryData &t_gd, u8 *t_buffer, u32 &t_ptrPos, float t_scale) void DffLoader::readGeometryData(MeshFrame *o_frame, u8 t_invertT, u8 *t_buffer, u32 &t_ptrPos, float t_scale)
{ {
t_gd.dataHeader.flags = readWordFromArrayLE(t_buffer, t_ptrPos); Vector3 tempVec = Vector3();
t_gd.dataHeader.unk1 = readWordFromArrayLE(t_buffer, t_ptrPos); Point tempPoint = Point();
t_gd.dataHeader.triangleCount = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
t_gd.dataHeader.vertexCount = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); RwGeometryDataHeader header;
t_gd.dataHeader.morphTargetCount = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); header.flags = readWordFromArrayLE(t_buffer, t_ptrPos);
header.unk1 = readWordFromArrayLE(t_buffer, t_ptrPos);
header.triangleCount = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
header.vertexCount = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
header.morphTargetCount = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
if (false) if (false)
{ // version equals 4099 according to old documentation, disabled as for now { // version equals 4099 according to old documentation, disabled as for now
t_gd.lightingHeader.ambient = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); readDwordFromArrayLE(t_buffer, t_ptrPos); // ambient
t_gd.lightingHeader.diffuse = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); readDwordFromArrayLE(t_buffer, t_ptrPos); // diffuse
t_gd.lightingHeader.specular = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); readDwordFromArrayLE(t_buffer, t_ptrPos); // specular
} }
if (t_gd.dataHeader.flags & rwOBJECT_VERTEX_PRELIT) if (header.flags & rwOBJECT_VERTEX_PRELIT)
for (u32 i = 0; i < header.vertexCount; i++)
{ {
t_gd.colorInformation = new RwGeometryDataColorInformationChunk[t_gd.dataHeader.vertexCount]; readByteFromArrayLE(t_buffer, t_ptrPos); // r
for (u32 i = 0; i < t_gd.dataHeader.vertexCount; i++) readByteFromArrayLE(t_buffer, t_ptrPos); // g
readByteFromArrayLE(t_buffer, t_ptrPos); // b
readByteFromArrayLE(t_buffer, t_ptrPos); // a
}
if (header.flags & rwOBJECT_VERTEX_TEXTURED)
{ {
t_gd.colorInformation[i].red = readByteFromArrayLE(t_buffer, t_ptrPos); o_frame->allocateSTs(header.vertexCount);
t_gd.colorInformation[i].green = readByteFromArrayLE(t_buffer, t_ptrPos); for (u32 i = 0; i < header.vertexCount; i++)
t_gd.colorInformation[i].blue = readByteFromArrayLE(t_buffer, t_ptrPos); {
t_gd.colorInformation[i].alpha = readByteFromArrayLE(t_buffer, t_ptrPos); float u = readFloatFromArrayLE(t_buffer, t_ptrPos);
float v = readFloatFromArrayLE(t_buffer, t_ptrPos);
tempPoint.set(u, v);
if (t_invertT)
tempPoint.y = 1.0F - tempPoint.y;
o_frame->setST(i, tempPoint);
} }
} }
if (t_gd.dataHeader.flags & rwOBJECT_VERTEX_TEXTURED) for (u32 i = 0; i < header.triangleCount; i++)
{ {
t_gd.textureMappingInformation = new RwGeometryDataTextureMappingInformationChunk[t_gd.dataHeader.vertexCount]; readWordFromArrayLE(t_buffer, t_ptrPos); // vert2
for (u32 i = 0; i < t_gd.dataHeader.vertexCount; i++) readWordFromArrayLE(t_buffer, t_ptrPos); // vert1
{ readWordFromArrayLE(t_buffer, t_ptrPos); // flags
t_gd.textureMappingInformation[i].u = readFloatFromArrayLE(t_buffer, t_ptrPos); readWordFromArrayLE(t_buffer, t_ptrPos); // vert3
t_gd.textureMappingInformation[i].v = readFloatFromArrayLE(t_buffer, t_ptrPos);
}
} }
t_gd.faceInformation = new RwGeometryDataFaceInformation[t_gd.dataHeader.triangleCount]; for (size_t i = 0; i < 6; i++)
for (u32 i = 0; i < t_gd.dataHeader.triangleCount; i++) t_ptrPos += sizeof(u32);
// t_gd.nonameInfo.boundingSphereX = readFloatFromArrayLE(t_buffer, t_ptrPos);
// t_gd.nonameInfo.boundingSphereY = readFloatFromArrayLE(t_buffer, t_ptrPos);
// t_gd.nonameInfo.boundingSphereZ = readFloatFromArrayLE(t_buffer, t_ptrPos);
// t_gd.nonameInfo.boundingSphereR = readFloatFromArrayLE(t_buffer, t_ptrPos);
// t_gd.nonameInfo.hasPosition = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
// t_gd.nonameInfo.hasNormals = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
o_frame->allocateVertices(header.vertexCount);
for (u32 i = 0; i < header.vertexCount; i++)
{ {
t_gd.faceInformation[i].vertex2 = readWordFromArrayLE(t_buffer, t_ptrPos); float x = readFloatFromArrayLE(t_buffer, t_ptrPos) * t_scale;
t_gd.faceInformation[i].vertex1 = readWordFromArrayLE(t_buffer, t_ptrPos); float y = readFloatFromArrayLE(t_buffer, t_ptrPos) * t_scale;
t_gd.faceInformation[i].flags = readWordFromArrayLE(t_buffer, t_ptrPos); float z = readFloatFromArrayLE(t_buffer, t_ptrPos) * t_scale;
t_gd.faceInformation[i].vertex3 = readWordFromArrayLE(t_buffer, t_ptrPos); tempVec.set(x, y, z);
o_frame->setVertex(i, tempVec);
} }
t_gd.nonameInfo.boundingSphereX = readFloatFromArrayLE(t_buffer, t_ptrPos); o_frame->allocateNormals(header.vertexCount);
t_gd.nonameInfo.boundingSphereY = readFloatFromArrayLE(t_buffer, t_ptrPos); for (u32 i = 0; i < header.vertexCount; i++)
t_gd.nonameInfo.boundingSphereZ = readFloatFromArrayLE(t_buffer, t_ptrPos);
t_gd.nonameInfo.boundingSphereR = readFloatFromArrayLE(t_buffer, t_ptrPos);
t_gd.nonameInfo.hasPosition = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
t_gd.nonameInfo.hasNormals = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
t_gd.vertexInformation = new Vector3[t_gd.dataHeader.vertexCount];
for (u32 i = 0; i < t_gd.dataHeader.vertexCount; i++)
{ {
t_gd.vertexInformation[i].x = readFloatFromArrayLE(t_buffer, t_ptrPos) * t_scale; float x = readFloatFromArrayLE(t_buffer, t_ptrPos);
t_gd.vertexInformation[i].y = readFloatFromArrayLE(t_buffer, t_ptrPos) * t_scale; float y = readFloatFromArrayLE(t_buffer, t_ptrPos);
t_gd.vertexInformation[i].z = readFloatFromArrayLE(t_buffer, t_ptrPos) * t_scale; float z = readFloatFromArrayLE(t_buffer, t_ptrPos);
} tempVec.set(x, y, z);
o_frame->setNormal(i, tempVec);
if (t_gd.dataHeader.flags & rwOBJECT_VERTEX_NORMALS)
{
t_gd.normalInformation = new Vector3[t_gd.dataHeader.vertexCount];
for (u32 i = 0; i < t_gd.dataHeader.vertexCount; i++)
{
t_gd.normalInformation[i].x = readFloatFromArrayLE(t_buffer, t_ptrPos);
t_gd.normalInformation[i].y = readFloatFromArrayLE(t_buffer, t_ptrPos);
t_gd.normalInformation[i].z = readFloatFromArrayLE(t_buffer, t_ptrPos);
}
} }
} }
void DffLoader::readMaterialListData(RwMaterialListData &t_mld, u8 *t_buffer, u32 &t_ptrPos) void DffLoader::readMaterialListData(RwMaterialListData &t_mld, u8 *t_buffer, u32 &t_ptrPos)
{ {
t_mld.materialCount = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); t_mld.materialCount = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
t_mld.arrayOfUnks = new u32[t_mld.materialCount]; // t_mld.arrayOfUnks = new u32[t_mld.materialCount];
for (u32 i = 0; i < t_mld.materialCount; i++) for (u32 i = 0; i < t_mld.materialCount; i++)
{ readDwordFromArrayLE(t_buffer, t_ptrPos);
t_mld.arrayOfUnks[i] = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos); // t_mld.arrayOfUnks[i] = DffLoader::readDwordFromArrayLE(t_buffer, t_ptrPos);
}
} }
void DffLoader::readMaterialData(RwMaterialData &t_md, u8 *t_buffer, u32 &t_ptrPos) void DffLoader::readMaterialData(RwMaterialData &t_md, u8 *t_buffer, u32 &t_ptrPos)
@@ -381,15 +378,6 @@ float DffLoader::readFloatFromArrayLE(u8 *t_buffer, u32 &t_ptrPos)
return res; return res;
} }
u8 *DffLoader::readData(u8 *t_buffer, u32 &t_ptrPos, u32 t_dataSize)
{
u8 *arr = new u8[t_dataSize];
for (u32 i = 0; i < t_dataSize; ++i)
arr[i] = t_buffer[i + t_ptrPos];
t_ptrPos += t_dataSize;
return arr;
}
char *DffLoader::readString(u8 *t_buffer, u32 &t_ptrPos, u32 t_dataSize) char *DffLoader::readString(u8 *t_buffer, u32 &t_ptrPos, u32 t_dataSize)
{ {
u32 strLength = String::getLength((char *)&t_buffer[t_ptrPos]); u32 strLength = String::getLength((char *)&t_buffer[t_ptrPos]);
+56 -102
View File
@@ -24,10 +24,11 @@
Mesh::Mesh() Mesh::Mesh()
{ {
id = rand() % 1000000;
shouldBeFrustumCulled = true; shouldBeFrustumCulled = true;
shouldBeBackfaceCulled = false; shouldBeBackfaceCulled = false;
shouldBeLighted = false; shouldBeLighted = false;
id = rand() % 1000000; _isMother = false;
scale = 1.0F; scale = 1.0F;
framesCount = 0; framesCount = 0;
animState.startFrame = 0; animState.startFrame = 0;
@@ -39,8 +40,8 @@ Mesh::Mesh()
animState.isStayFrameSet = false; animState.isStayFrameSet = false;
animState.nextFrame = 0; animState.nextFrame = 0;
animState.speed = 0.1F; animState.speed = 0.1F;
_isMother = false;
setDefaultColor(); setDefaultColor();
setDefaultLODAndClut();
} }
Mesh::~Mesh() Mesh::~Mesh()
@@ -131,6 +132,9 @@ void Mesh::playAnimation(const u32 &t_startFrame, const u32 &t_endFrame)
PRINT_ERR("End frame value is too high. Valid range: (0, getFramesCount()-1)"); PRINT_ERR("End frame value is too high. Valid range: (0, getFramesCount()-1)");
animState.startFrame = t_startFrame; animState.startFrame = t_startFrame;
animState.endFrame = t_endFrame; animState.endFrame = t_endFrame;
if (animState.currentFrame == t_startFrame)
animState.nextFrame = t_endFrame;
else
animState.nextFrame = t_startFrame; animState.nextFrame = t_startFrame;
} }
else if (framesCount == 0) else if (framesCount == 0)
@@ -157,14 +161,6 @@ void Mesh::playAnimation(const u32 &t_startFrame, const u32 &t_endFrame, const u
PRINT_ERR("Cant play animation, because this mesh have only one frame."); PRINT_ERR("Cant play animation, because this mesh have only one frame.");
} }
u32 Mesh::getFacesCount()
{
u32 result = 0; // TODO
for (u16 i = 0; i < frames[0].getMaterialsCount(); i++)
result += frames[0].getMaterial(i).getFacesCount();
return result;
}
void Mesh::animate() void Mesh::animate()
{ {
animState.interpolation += animState.speed; animState.interpolation += animState.speed;
@@ -189,29 +185,36 @@ void Mesh::animate()
u32 Mesh::getDrawData(u32 t_materialIndex, VECTOR *o_vertices, VECTOR *o_normals, VECTOR *o_coordinates, Vector3 &t_cameraPos) u32 Mesh::getDrawData(u32 t_materialIndex, VECTOR *o_vertices, VECTOR *o_normals, VECTOR *o_coordinates, Vector3 &t_cameraPos)
{ {
u32 addedFaces = 0;
#define CURR_FRAME frames[animState.currentFrame] #define CURR_FRAME frames[animState.currentFrame]
#define NEXT_FRAME frames[animState.nextFrame] #define NEXT_FRAME frames[animState.nextFrame]
#define MATERIAL CURR_FRAME.getMaterial(t_materialIndex) MeshMaterial *material = &CURR_FRAME.getMaterial(t_materialIndex); // cache
#define CURR_VERT CURR_FRAME.getVertex(MATERIAL.getVertexFace(matI + vertI)) Vector3 *verts = CURR_FRAME.getVertices(); // cache
#define NEXT_VERT NEXT_FRAME.getVertex(MATERIAL.getVertexFace(matI + vertI)) Vector3 *nextVerts = NEXT_FRAME.getVertices(); // cache
u32 addedFaces = 0; Point *sts = CURR_FRAME.getSTs(); // cache
for (u32 matI = 0; matI < MATERIAL.getFacesCount(); matI += 3) Vector3 *normals = CURR_FRAME.getNormals(); // cache
#define CURR_VERT verts[material->getVertexFace(matI + vertI)]
#define CURR_ST sts[material->getSTFace(matI + vertI)]
#define CURR_NORMAL normals[material->getNormalFace(matI + vertI)]
#define NEXT_VERT nextVerts[material->getVertexFace(matI + vertI)]
for (u32 matI = 0; matI < material->getFacesCount(); matI += 3)
{ {
for (u32 vertI = 0; vertI < 3; vertI++) for (u32 vertI = 0; vertI < 3; vertI++)
if (animState.currentFrame != animState.nextFrame) if (animState.currentFrame != animState.nextFrame)
calc3Vectors[vertI].setByLerp(CURR_VERT, NEXT_VERT, animState.interpolation, scale); calc3Vectors[vertI].setByLerp(CURR_VERT, NEXT_VERT, animState.interpolation, scale);
if (!shouldBeBackfaceCulled || if (!shouldBeBackfaceCulled ||
Vector3::shouldBeBackfaceCulled(&t_cameraPos, &calc3Vectors[2], &calc3Vectors[1], &calc3Vectors[0])) Vector3::shouldBeBackfaceCulled(&t_cameraPos, &calc3Vectors[0], &calc3Vectors[1], &calc3Vectors[2]))
for (u32 vertI = 0; vertI < 3; vertI++) for (u32 vertI = 0; vertI < 3; vertI++)
{ {
if (animState.currentFrame == animState.nextFrame) if (animState.currentFrame == animState.nextFrame)
{ {
o_vertices[addedFaces][0] = CURR_FRAME.getVertex(MATERIAL.getVertexFace(matI + vertI)).x; o_vertices[addedFaces][0] = CURR_VERT.x;
o_vertices[addedFaces][1] = CURR_FRAME.getVertex(MATERIAL.getVertexFace(matI + vertI)).y; o_vertices[addedFaces][1] = CURR_VERT.y;
o_vertices[addedFaces][2] = CURR_FRAME.getVertex(MATERIAL.getVertexFace(matI + vertI)).z; o_vertices[addedFaces][2] = CURR_VERT.z;
} }
else else
{ {
@@ -221,13 +224,13 @@ u32 Mesh::getDrawData(u32 t_materialIndex, VECTOR *o_vertices, VECTOR *o_normals
} }
o_vertices[addedFaces][3] = 1.0F; o_vertices[addedFaces][3] = 1.0F;
o_normals[addedFaces][0] = CURR_FRAME.getNormal(MATERIAL.getNormalFace(matI + vertI)).x; o_normals[addedFaces][0] = CURR_NORMAL.x;
o_normals[addedFaces][1] = CURR_FRAME.getNormal(MATERIAL.getNormalFace(matI + vertI)).y; o_normals[addedFaces][1] = CURR_NORMAL.y;
o_normals[addedFaces][2] = CURR_FRAME.getNormal(MATERIAL.getNormalFace(matI + vertI)).z; o_normals[addedFaces][2] = CURR_NORMAL.z;
o_normals[addedFaces][3] = 1.0F; o_normals[addedFaces][3] = 1.0F;
o_coordinates[addedFaces][0] = CURR_FRAME.getST(MATERIAL.getSTFace(matI + vertI)).x; o_coordinates[addedFaces][0] = CURR_ST.x;
o_coordinates[addedFaces][1] = CURR_FRAME.getST(MATERIAL.getSTFace(matI + vertI)).y; o_coordinates[addedFaces][1] = CURR_ST.y;
o_coordinates[addedFaces][2] = 1.0F; o_coordinates[addedFaces][2] = 1.0F;
o_coordinates[addedFaces++][3] = 1.0F; o_coordinates[addedFaces++][3] = 1.0F;
} }
@@ -235,64 +238,6 @@ u32 Mesh::getDrawData(u32 t_materialIndex, VECTOR *o_vertices, VECTOR *o_normals
return addedFaces; return addedFaces;
} }
void Mesh::setAnimSpeed(float t_value)
{
animState.speed = t_value;
}
u32 Mesh::getVertexCount()
{
if (framesCount > 0)
return getFacesCount();
else
{
PRINT_ERR("Can't get vertex count, because mesh data was loaded!");
return 0;
}
}
/** Set's default object color + no transparency */
void Mesh::setDefaultColor()
{
color.r = 0x80;
color.g = 0x80;
color.b = 0x80;
color.a = 0x80;
color.q = 1.0F;
}
/** Calculates minimum and maximum X, Y, Z of this 3D objects vertices + current position */
// void Mesh::getMinMax(Vector3 *t_min, Vector3 *t_max)
// {
// Vector3 calc = Vector3();
// u8 isInitialized = 0;
// for (u32 i = 0; i < 8; i++)
// {
// getFarthestVertex(&calc, i);
// if (isInitialized == 0)
// {
// isInitialized = 1;
// t_min->set(calc);
// t_max->set(calc);
// }
// if (t_min->x > calc.x)
// t_min->x = calc.x;
// if (calc.x > t_max->x)
// t_max->x = calc.x;
// if (t_min->y > calc.y)
// t_min->y = calc.y;
// if (calc.y > t_max->y)
// t_max->y = calc.y;
// if (t_min->z > calc.z)
// t_min->z = calc.z;
// if (calc.z > t_max->z)
// t_max->z = calc.z;
// }
// }
void Mesh::getCurrentBoundingBoxVertex(Vector3 &o_result, const u32 &t_index) void Mesh::getCurrentBoundingBoxVertex(Vector3 &o_result, const u32 &t_index)
{ {
o_result.set( o_result.set(
@@ -301,26 +246,6 @@ void Mesh::getCurrentBoundingBoxVertex(Vector3 &o_result, const u32 &t_index)
frames[animState.currentFrame].getBoundingBox(t_index).z + position.z); frames[animState.currentFrame].getBoundingBox(t_index).z + position.z);
} }
/** Sets texture level of details settings and CLUT settings */
void Mesh::setupLodAndClut()
{
PRINT_LOG("Setting LOD, CLUT");
lod.calculation = LOD_USE_K;
lod.max_level = 0;
lod.mag_filter = LOD_MAG_NEAREST;
lod.min_filter = LOD_MIN_NEAREST;
lod.l = 0;
lod.k = 0.0F;
clut.storage_mode = CLUT_STORAGE_MODE1;
clut.start = 0;
clut.psm = 0;
clut.load_method = CLUT_NO_LOAD;
clut.address = 0;
PRINT_LOG("LOD, CLUT set!");
}
/** Check if box is visible in view frustum */
u8 Mesh::isInFrustum(Plane *t_frustumPlanes) u8 Mesh::isInFrustum(Plane *t_frustumPlanes)
{ {
Vector3 boxCalcTemp; Vector3 boxCalcTemp;
@@ -349,3 +274,32 @@ u8 Mesh::isInFrustum(Plane *t_frustumPlanes)
} }
return boxResult; return boxResult;
} }
/** Set's default object color + no transparency */
void Mesh::setDefaultColor()
{
color.r = 0x80;
color.g = 0x80;
color.b = 0x80;
color.a = 0x80;
color.q = 1.0F;
}
/** Sets texture level of details settings and CLUT settings */
void Mesh::setDefaultLODAndClut()
{
PRINT_LOG("Setting LOD, CLUT");
lod.calculation = LOD_USE_K;
lod.max_level = 0;
lod.mag_filter = LOD_MAG_NEAREST;
lod.min_filter = LOD_MIN_NEAREST;
lod.l = 0;
lod.k = 0.0F;
clut.storage_mode = CLUT_STORAGE_MODE1;
clut.start = 0;
clut.psm = 0;
clut.load_method = CLUT_NO_LOAD;
clut.address = 0;
PRINT_LOG("LOD, CLUT set!");
}
+1 -1
View File
@@ -171,7 +171,7 @@ void GifSender::addObjects(RenderData *t_renderData, Mesh **t_objects3D, u32 t_a
*/ */
u32 GifSender::calc3DObject(Matrix t_perspective, Mesh &t_mesh, RenderData *t_renderData, LightBulb *t_bulbs, u16 t_bulbsCount) u32 GifSender::calc3DObject(Matrix t_perspective, Mesh &t_mesh, RenderData *t_renderData, LightBulb *t_bulbs, u16 t_bulbsCount)
{ {
u32 vertexCount = t_mesh.getVertexCount(); u32 vertexCount = t_mesh.getVertexCount(); // TODO err
VECTOR *vertices = new VECTOR[vertexCount]; VECTOR *vertices = new VECTOR[vertexCount];
VECTOR *normals = new VECTOR[vertexCount]; VECTOR *normals = new VECTOR[vertexCount];
+7 -8
View File
@@ -84,7 +84,7 @@ void Renderer::deallocateTextureBuffer()
void Renderer::changeTexture(Mesh *t_mesh, u32 t_materialId) void Renderer::changeTexture(Mesh *t_mesh, u32 t_materialId)
{ {
MeshTexture *tex = textureRepo.getByMesh(t_mesh->id, t_materialId); MeshTexture *tex = textureRepo.getByMesh(t_mesh->getId(), t_materialId);
if (tex != NULL) if (tex != NULL)
{ {
if (tex->getId() != lastTextureId) if (tex->getId() != lastTextureId)
@@ -209,23 +209,22 @@ void Renderer::draw(Mesh *t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount)
if (!t_mesh->isDataLoaded()) if (!t_mesh->isDataLoaded())
PRINT_ERR("Can't draw, because no mesh data was loaded!"); PRINT_ERR("Can't draw, because no mesh data was loaded!");
u32 vertCount = t_mesh->getVertexCount(); if (t_mesh->getCurrentAnimationFrame() != t_mesh->getNextAnimationFrame())
VECTOR *vertices = new VECTOR[vertCount];
VECTOR *normals = new VECTOR[vertCount];
VECTOR *coordinates = new VECTOR[vertCount];
if (t_mesh->animState.currentFrame != t_mesh->animState.nextFrame)
t_mesh->animate(); t_mesh->animate();
for (u32 i = 0; i < t_mesh->getMaterialsCount(); i++) for (u32 i = 0; i < t_mesh->getMaterialsCount(); i++)
{ {
u32 vertCount = t_mesh->getMaterial(i).getFacesCount();
VECTOR *vertices = new VECTOR[vertCount];
VECTOR *normals = new VECTOR[vertCount];
VECTOR *coordinates = new VECTOR[vertCount];
changeTexture(t_mesh, t_mesh->getMaterial(i).getId()); changeTexture(t_mesh, t_mesh->getMaterial(i).getId());
vertCount = t_mesh->getDrawData(i, vertices, normals, coordinates, *renderData.cameraPosition); vertCount = t_mesh->getDrawData(i, vertices, normals, coordinates, *renderData.cameraPosition);
vifSender->drawMesh(&renderData, perspective, vertCount, vertices, normals, coordinates, t_mesh, t_bulbs, t_bulbsCount, &textureBuffer); vifSender->drawMesh(&renderData, perspective, vertCount, vertices, normals, coordinates, t_mesh, t_bulbs, t_bulbsCount, &textureBuffer);
}
delete[] vertices; delete[] vertices;
delete[] normals; delete[] normals;
delete[] coordinates; delete[] coordinates;
} }
}
/** PATH1 Many */ /** PATH1 Many */
void Renderer::draw(Mesh **t_objects3D, u16 t_amount) { draw(t_objects3D, t_amount, NULL, 0); } void Renderer::draw(Mesh **t_objects3D, u16 t_amount) { draw(t_objects3D, t_amount, NULL, 0); }
+1 -1
View File
@@ -51,7 +51,7 @@ void TextureRepository::addByMesh(char *t_path, Mesh &mesh)
MeshTexture *texture = new MeshTexture(); MeshTexture *texture = new MeshTexture();
loader.load(*texture, t_path, mesh.getMaterial(i).getName(), ".bmp"); loader.load(*texture, t_path, mesh.getMaterial(i).getName(), ".bmp");
texture->setName(mesh.getMaterial(i).getName()); texture->setName(mesh.getMaterial(i).getName());
texture->addLink(mesh.id, mesh.getMaterial(i).getId()); texture->addLink(mesh.getId(), mesh.getMaterial(i).getId());
textures.push_back(texture); textures.push_back(texture);
} }
} }
+45 -56
View File
@@ -65,8 +65,8 @@ void calcSpiral(int X, int Y)
} }
// TEST END // TEST END
#include "models/mesh_frame.hpp" // TODO 1 - const & in parameters
#include <vector> // TODO 2 - Destructor mesh
void Ari::onInit() void Ari::onInit()
{ {
@@ -76,62 +76,52 @@ void Ari::onInit()
engine.audio.init(0); engine.audio.init(0);
engine.audio.setVolume(40); engine.audio.setVolume(40);
engine.audio.loadSong("MOV-CIRC.WAV"); engine.audio.loadSong("MOV-CIRC.WAV");
engine.audio.play();
texRepo = engine.renderer->getTextureRepository(); texRepo = engine.renderer->getTextureRepository();
// engine.audio.play();
// islandAddons = new Mesh();
// islandAddons->rotation.x = -1.6F;
// islandAddons->loadDff("sunnyisl/", "sunnyisl3.dff", islandPos, 0.1F);
// islandAddons->shouldBeFrustumCulled = false;
// TODO 1 - Refactor mesh, loaders
// TODO 2 - const & in parameters
// TODO 3 - Destructor mesh
// TODO 4 - Destructor RwClump in dff loader
// TODO 5 - Test mesh copy();
// test->shouldBeFrustumCulled = true;
test = new Mesh();
skybox = new Mesh();
island = new Mesh(); island = new Mesh();
island->loadDff("sunnyisl/", "sunnyisl", 0.1F, false); island->loadDff("sunnyisl/", "sunnyisl", 0.1F, false);
test->loadMD2("warrior/", "warrior", 0.2F, true);
skybox->loadObj("skybox/", "skybox", 80.0F, false); // po zamianie miejscami działa
test->rotation.x = -1.6F;
test->playAnimation(9, 15, 0);
skybox->position.set(0.0F, 10.0F, 0.0F);
island->rotation.x = -1.6F; island->rotation.x = -1.6F;
island->position.set(0.0F, 10.0F, 0.0F); island->position.set(0.0F, 10.0F, 20.0F);
island->shouldBeFrustumCulled = false;
island->shouldBeBackfaceCulled = true;
islandAddons = new Mesh();
islandAddons->loadDff("sunnyisl/", "sunnyisl3", 0.1F, false);
islandAddons->rotation.x = -1.6F;
islandAddons->position.set(0.0F, 10.0F, 20.0F);
islandAddons->shouldBeFrustumCulled = false;
skybox = new Mesh();
skybox->loadObj("skybox/", "skybox", 100.0F, false);
waterFloors = new Mesh *[WATER_TILES_COUNT];
spirals = new Point[WATER_TILES_COUNT];
waterFloors[0] = new Mesh();
waterFloors[0]->loadObj("water/", "water", 5.0F, false);
waterFloors[0]->position.set(0.0F, 8.0F, 0.0F);
texRepo->addByMesh("water/", *waterFloors[0]);
for (u8 i = 0; i < WATER_TILES_COUNT; i++)
{
spirals[i].x = 1.0F;
spirals[i].y = 2.0F;
}
u32 spiralOffset = (u32)Math::sqrt(WATER_TILES_COUNT);
calcSpiral(spiralOffset, spiralOffset);
for (u8 i = 1; i < WATER_TILES_COUNT; i++)
{
waterFloors[i] = new Mesh();
waterFloors[i]->loadFrom(*waterFloors[0]);
waterFloors[i]->position.set(10.0F * spirals[i].x, 8.0F, 10.0F * spirals[i].y);
texRepo->getByMesh(waterFloors[0]->getId(), waterFloors[0]->getMaterial(0).getId())
->addLink(waterFloors[i]->getId(), waterFloors[i]->getMaterial(0).getId());
}
texRepo->addByMesh("warrior/", *test);
texRepo->addByMesh("skybox/", *skybox);
texRepo->addByMesh("sunnyisl/", *island); texRepo->addByMesh("sunnyisl/", *island);
texRepo->addByMesh("sunnyisl/", *islandAddons);
// waterFloors = new Mesh *[WATER_TILES_COUNT]; texRepo->addByMesh("skybox/", *skybox);
// spirals = new Point[WATER_TILES_COUNT]; texRepo->addByMesh("ari/", player->mesh);
// Vector3 initPos = Vector3(0.0F, 8.0F, 0.0F);
// waterFloors[0] = new Mesh();
// // loadObj("water/", "water", initPos, 5.0F,12);
// // loadObj("water/", "water", initPos, 5.0F);
// waterFloors[0]->loadObj("water/", "water", initPos, 5.0F, 2);
// waterFloors[0]->shouldBeFrustumCulled = true;
// for (u8 i = 0; i < WATER_TILES_COUNT; i++)
// {
// spirals[i].x = 1.0F;
// spirals[i].y = 2.0F;
// }
// u32 spiralOffset = (u32)Math::sqrt(WATER_TILES_COUNT);
// calcSpiral(spiralOffset, spiralOffset);
// for (u8 i = 1; i < WATER_TILES_COUNT; i++)
// {
// waterFloors[i] = new Mesh();
// Vector3 nextPos = Vector3(10.0F * spirals[i].x, 8.0F, 10.0F * spirals[i].y);
// waterFloors[i]->setObj(nextPos, waterFloors[0]->obj, waterFloors[0]->spec);
// waterFloors[i]->shouldBeFrustumCulled = true;
// }
} }
void Ari::initBulb() void Ari::initBulb()
@@ -145,11 +135,10 @@ void Ari::onUpdate()
if (engine.pad.isCrossClicked) if (engine.pad.isCrossClicked)
printf("FPS:%f\n", engine.fps); printf("FPS:%f\n", engine.fps);
camera->update(engine.pad, player->mesh); camera->update(engine.pad, player->mesh);
engine.renderer->draw(test);
engine.renderer->draw(skybox); engine.renderer->draw(skybox);
engine.renderer->draw(island); engine.renderer->draw(island);
// engine.renderer->draw(islandAddons); engine.renderer->draw(islandAddons);
// // engine.renderer->draw(&player->mesh); engine.renderer->draw(&player->mesh);
// for (u8 i = 0; i < WATER_TILES_COUNT; i++) for (u8 i = 0; i < WATER_TILES_COUNT; i++)
// engine.renderer->draw(waterFloors[i]); // TODO engine.renderer->draw(waterFloors[i]);
} }
+7 -7
View File
@@ -25,13 +25,13 @@ Player::Player()
PRINT_LOG("Creating player object"); PRINT_LOG("Creating player object");
this->gravity = 0.1F; this->gravity = 0.1F;
this->lift = -1.0F; this->lift = -1.0F;
Vector3 initPos = Vector3(0.0F, 8.0F, 0.0F); this->mesh.loadMD2("ari/", "ari", 0.0001F, true);
// this->mesh.loadMD2("ari/", "ari.md2", initPos, 0.0001F); this->mesh.position.set(0.0F, 10.0F, 0.0F);
// this->mesh.shouldBeBackfaceCulled = true; this->mesh.shouldBeBackfaceCulled = true;
// this->mesh.shouldBeFrustumCulled = false; this->mesh.shouldBeFrustumCulled = false;
// this->mesh.shouldBeLighted = true; this->mesh.shouldBeLighted = true;
// this->mesh.setAnimSpeed(0.05F); this->mesh.setAnimSpeed(0.05F);
// this->mesh.playAnimation(0, 1); this->mesh.playAnimation(0, 1);
PRINT_LOG("Player object created!"); PRINT_LOG("Player object created!");
} }
+32
View File
@@ -106,6 +106,38 @@ void Player::onBeforePlayerFloorMove(Floor *floor, float &newY)
this->mesh.position.y -= -newY * 1.05F; this->mesh.position.y -= -newY * 1.05F;
} }
/** Calculates minimum and maximum X, Y, Z of this 3D objects vertices + current position */
// void Mesh::getMinMax(Vector3 *t_min, Vector3 *t_max)
// {
// Vector3 calc = Vector3();
// u8 isInitialized = 0;
// for (u32 i = 0; i < 8; i++)
// {
// getFarthestVertex(&calc, i);
// if (isInitialized == 0)
// {
// isInitialized = 1;
// t_min->set(calc);
// t_max->set(calc);
// }
// if (t_min->x > calc.x)
// t_min->x = calc.x;
// if (calc.x > t_max->x)
// t_max->x = calc.x;
// if (t_min->y > calc.y)
// t_min->y = calc.y;
// if (calc.y > t_max->y)
// t_max->y = calc.y;
// if (t_min->z > calc.z)
// t_min->z = calc.z;
// if (calc.z > t_max->z)
// t_max->z = calc.z;
// }
// }
/** Update player position by gravity and update index of current floor */ /** Update player position by gravity and update index of current floor */
void Player::updateGravity(Pad &pad, FloorManager &floorManager) void Player::updateGravity(Pad &pad, FloorManager &floorManager)
{ {