Merge pull request #84 from h4570/feature/non-textured-rendering

Renderer: Non textured rendering (RGBA only)
This commit is contained in:
Michał Mostowik
2020-12-28 16:21:25 +01:00
committed by GitHub
24 changed files with 604 additions and 402 deletions
+14
View File
@@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.?.?] - 2020-?-?
### Added
- Id to MeshFrame
### Changed
- Moved color from mesh to mesh material.
- OBJ Loader refactor
- Logic of loadFrom()
### Removed
- Removed MeshId from TextureLink, TextureRepository
## [1.29.1] - 2020-12-27 ## [1.29.1] - 2020-12-27
### Added ### Added
- Created libpacket2 in PS2SDK - Created libpacket2 in PS2SDK
@@ -96,6 +109,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Makefile - Makefile
- Primitive floors sample - Primitive floors sample
[1.?.?]: https://github.com/h4570/tyra/compare/v1.29.1-alpha...v1.?.?-alpha
[1.29.1]: https://github.com/h4570/tyra/compare/1.1.0...v1.29.1-alpha [1.29.1]: https://github.com/h4570/tyra/compare/1.1.0...v1.29.1-alpha
[1.1.0]: https://github.com/h4570/tyra/compare/1.0.0...1.1.0 [1.1.0]: https://github.com/h4570/tyra/compare/1.0.0...1.1.0
[1.0.0]: https://github.com/h4570/tyra/compare/1.0.0 [1.0.0]: https://github.com/h4570/tyra/compare/1.0.0
+3 -4
View File
@@ -16,7 +16,6 @@
#include "./texture.hpp" #include "./texture.hpp"
#include "./mesh_frame.hpp" #include "./mesh_frame.hpp"
#include <tamtypes.h> #include <tamtypes.h>
#include <draw_types.h>
#include <draw_buffers.h> #include <draw_buffers.h>
#include <draw_sampling.h> #include <draw_sampling.h>
#include "./anim_state.hpp" #include "./anim_state.hpp"
@@ -43,7 +42,6 @@ public:
* When true, mesh materials are not drawn when they are outside of view frustum. * When true, mesh materials are not drawn when they are outside of view frustum.
*/ */
u8 shouldBeFrustumCulled; u8 shouldBeFrustumCulled;
color_t color;
clutbuffer_t clut; clutbuffer_t clut;
lod_t lod; lod_t lod;
@@ -176,6 +174,8 @@ public:
void setAnimSpeed(const float &t_value) { animState.speed = t_value; } void setAnimSpeed(const float &t_value) { animState.speed = t_value; }
const u8 &areFramesAllocated() const { return _areFramesAllocated; };
/** /**
* 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.
@@ -207,9 +207,8 @@ private:
AnimState animState; AnimState animState;
MeshFrame *frames; MeshFrame *frames;
u32 id, framesCount; u32 id, framesCount;
u8 _isMother; u8 _isMother, _areFramesAllocated;
Vector3 calc3Vectors[3]; Vector3 calc3Vectors[3];
void setDefaultColor();
void setDefaultLODAndClut(); void setDefaultLODAndClut();
}; };
+24 -2
View File
@@ -35,6 +35,12 @@ public:
// Getters // Getters
// ---- // ----
/**
* Auto generated unique Id.
* Core role of this variable is to select correct texture to draw
*/
const u32 &getId() const { return id; };
const u32 &getVertexCount() const { return vertexCount; }; const u32 &getVertexCount() const { return vertexCount; };
const u32 &getSTsCount() const { return stsCount; }; const u32 &getSTsCount() const { return stsCount; };
const u32 &getNormalsCount() const { return normalsCount; }; const u32 &getNormalsCount() const { return normalsCount; };
@@ -119,12 +125,27 @@ public:
// Other // Other
// ---- // ----
/**
* Check if this object is mother.
* Mother = object loaded with loadObj(), loadDff()..
* Have all mother data: vertex, st, etc..
* Non-mother = object loaded with loadFrom().
* Have reference copy to mother data: vertex, st, etc..
*
* When you will destruct mother object, all vertex, st data will be deleted.
* When you will destruct non-mother object, all vertex, st data will be NOT deleted.
*/
const u8 &isMother() const { return _isMother; };
const u8 &areSTsAllocated() const { return _areSTsAllocated; }; const u8 &areSTsAllocated() const { return _areSTsAllocated; };
const u8 &areVerticesAllocated() const { return _areVerticesAllocated; }; const u8 &areVerticesAllocated() const { return _areVerticesAllocated; };
const u8 &areNormalsAllocated() const { return _areNormalsAllocated; }; const u8 &areNormalsAllocated() const { return _areNormalsAllocated; };
const u8 &areMaterialsAllocated() const { return _areMaterialsAllocated; }; const u8 &areMaterialsAllocated() const { return _areMaterialsAllocated; };
const u8 &isBoundingBoxCalculated() const { return _isBoundingBoxCalculated; }; const u8 &isBoundingBoxCalculated() const { return _isBoundingBoxCalculated; };
/** Create reference copy (non-mother) */
void copyFrom(MeshFrame *t_refCopy);
/** Set STs count and allocate memory. */ /** Set STs count and allocate memory. */
void allocateSTs(const u32 &t_val); void allocateSTs(const u32 &t_val);
@@ -146,12 +167,13 @@ public:
private: private:
BoundingBox *boundingBoxObj; BoundingBox *boundingBoxObj;
u8 _areSTsAllocated, u8 _isMother,
_areSTsAllocated,
_areVerticesAllocated, _areVerticesAllocated,
_areNormalsAllocated, _areNormalsAllocated,
_areMaterialsAllocated, _areMaterialsAllocated,
_isBoundingBoxCalculated; _isBoundingBoxCalculated;
u32 vertexCount, stsCount, normalsCount, materialsCount; u32 vertexCount, stsCount, normalsCount, materialsCount, id;
MeshMaterial *materials; MeshMaterial *materials;
Point __attribute__((aligned(16))) * sts; Point __attribute__((aligned(16))) * sts;
Vector3 __attribute__((aligned(16))) * vertices, *normals; Vector3 __attribute__((aligned(16))) * vertices, *normals;
+42 -1
View File
@@ -12,6 +12,7 @@
#define _TYRA_MESH_MATERIAL_ #define _TYRA_MESH_MATERIAL_
#include <tamtypes.h> #include <tamtypes.h>
#include <draw_types.h>
#include "bounding_box.hpp" #include "bounding_box.hpp"
#include "./math/vector3.hpp" #include "./math/vector3.hpp"
#include "./math/plane.hpp" #include "./math/plane.hpp"
@@ -29,6 +30,8 @@ public:
MeshMaterial(); MeshMaterial();
~MeshMaterial(); ~MeshMaterial();
color_t color;
// ---- // ----
// Getters // Getters
// ---- // ----
@@ -104,11 +107,43 @@ public:
/** Set material name. */ /** Set material name. */
void setName(char *t_val); void setName(char *t_val);
/**
* Do not call this method unless you know what you do.
* Should be called by data loader.
*/
void setSTsPresent(const u8 &b) { _areSTsPresent = b; };
/**
* Do not call this method unless you know what you do.
* Should be called by data loader.
*/
void setNormalsPresent(const u8 &b) { _areNormalsPresent = b; };
// ---- // ----
// Other // Other
// ---- // ----
const u8 &areSTsPresent() const { return _areSTsPresent; };
const u8 &areNormalsPresent() const { return _areNormalsPresent; };
/** Create reference copy (non-mother) */
void copyFrom(MeshMaterial *t_refCopy);
const u8 &isNameSet() const { return _isNameSet; }; const u8 &isNameSet() const { return _isNameSet; };
/**
* Check if this object is mother.
* Mother = object loaded with loadObj(), loadDff()..
* Have all mother data: vertex faces, st faces, etc..
* Non-mother = object loaded with loadFrom().
* Have reference copy to mother data: vertex faces, st faces, etc..
*
* When you will destruct mother object, all faces data will be deleted.
* When you will destruct non-mother object, all faces data will be NOT deleted.
*/
const u8 &isMother() const { return _isMother; };
const u8 &areFacesAllocated() const { return _areFacesAllocated; }; const u8 &areFacesAllocated() const { return _areFacesAllocated; };
/** Set faces count and allocate memory. */ /** Set faces count and allocate memory. */
@@ -125,10 +160,16 @@ public:
u8 isInFrustum(Plane *t_frustumPlanes, const Vector3 &position); u8 isInFrustum(Plane *t_frustumPlanes, const Vector3 &position);
private: private:
void setDefaultColor();
BoundingBox *boundingBoxObj; BoundingBox *boundingBoxObj;
u32 facesCount, id; u32 facesCount, id;
u32 *vertexFaces, *stFaces, *normalFaces; u32 *vertexFaces, *stFaces, *normalFaces;
u8 _isNameSet, _areFacesAllocated, _isBoundingBoxCalculated; u8 _isMother,
_isNameSet,
_areFacesAllocated,
_isBoundingBoxCalculated,
_areSTsPresent,
_areNormalsPresent;
char *name; char *name;
}; };
+21 -30
View File
@@ -83,21 +83,18 @@ public:
/** /**
* Returns index of link. * Returns index of link.
* -1 if not found. * -1 if not found.
* @param t_id
* For 3D: Mesh material id.
* For 2D: Sprite id.
*/ */
const s32 getIndexOfLink(const u32 &t_meshId, const u32 &t_materialId) const const s32 getIndexOfLink(const u32 &t_id) const
{ {
for (u32 i = 0; i < texLinks.size(); i++) for (u32 i = 0; i < texLinks.size(); i++)
if (texLinks[i].materialId == t_materialId && texLinks[i].meshOrSpriteId == t_meshId) if (texLinks[i].id == t_id)
return i; return i;
return -1; return -1;
}; };
/**
* Returns index of link.
* -1 if not found.
*/
inline const s32 getIndexOfLink(const u32 &t_spriteId) const { return getIndexOfLink(t_spriteId, 0); };
// ---- // ----
// Setters // Setters
// ---- // ----
@@ -144,18 +141,15 @@ public:
const u8 &isSizeSet() const { return _isSizeSet; }; const u8 &isSizeSet() const { return _isSizeSet; };
const u8 isLinkedWith(const u32 &t_meshId, const u32 &t_materialId) const /**
* Check if texture is linked with Mesh/Sprite.
* @param t_id
* For 3D: Mesh material id.
* For 2D: Sprite id.
*/
const u8 isLinkedWith(const u32 &t_id) const
{ {
s32 index = getIndexOfLink(t_meshId, t_materialId); s32 index = getIndexOfLink(t_id);
if (index != -1)
return true;
else
return false;
};
const u8 isLinkedWith(const u32 &t_spriteId) const
{
s32 index = getIndexOfLink(t_spriteId);
if (index != -1) if (index != -1)
return true; return true;
else else
@@ -164,18 +158,15 @@ public:
void removeLinkByIndex(const u32 &t_index) { texLinks.erase(texLinks.begin() + t_index); } void removeLinkByIndex(const u32 &t_index) { texLinks.erase(texLinks.begin() + t_index); }
void removeLinkBySprite(const u32 &t_spriteId) /**
* Remove texture link with given Mesh/Sprite.
* @param t_id
* For 3D: Mesh material id.
* For 2D: Sprite id.
*/
void removeLinkById(const u32 &t_id)
{ {
s32 index = getIndexOfLink(t_spriteId); s32 index = getIndexOfLink(t_id);
if (index != -1)
removeLinkByIndex(index);
else
PRINT_ERR("Cant remove link, because it was not found!");
}
void removeLinkByMesh(const u32 &t_meshId, const u32 &t_materialId)
{
s32 index = getIndexOfLink(t_meshId, t_materialId);
if (index != -1) if (index != -1)
removeLinkByIndex(index); removeLinkByIndex(index);
else else
+5 -4
View File
@@ -15,10 +15,11 @@
struct TextureLink struct TextureLink
{ {
/** Mesh id or sprite id */ /**
u32 meshOrSpriteId; * For 3D: Mesh material id.
/** Mesh material id or 0 if is sprite */ * For 2D: Sprite id.
u32 materialId; */
u32 id;
}; };
#endif #endif
+2 -2
View File
@@ -34,7 +34,7 @@ public:
~GifSender(); ~GifSender();
void initPacket(u8 context); void initPacket(u8 context);
void addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer); void addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer, color_t *t_color);
void addClear(zbuffer_t *t_zBuffer, color_t *t_rgb); void addClear(zbuffer_t *t_zBuffer, color_t *t_rgb);
void sendPacket(); void sendPacket();
void sendClear(zbuffer_t *t_zBuffer, color_t *t_rgb); void sendClear(zbuffer_t *t_zBuffer, color_t *t_rgb);
@@ -54,7 +54,7 @@ private:
float halfScreenW, halfScreenH; float halfScreenW, halfScreenH;
MATRIX localWorld, localScreen, localLight; MATRIX localWorld, localScreen, localLight;
void calc3DObject(Matrix t_perspective, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, RenderData *t_renderData, LightBulb *t_bulbs, u16 t_bulbsCount); void calc3DObject(Matrix t_perspective, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, RenderData *t_renderData, LightBulb *t_bulbs, u16 t_bulbsCount, color_t *t_color);
void convertCalcs(u32 t_vertCount, VECTOR *t_vertices, VECTOR *t_colors, VECTOR *t_sts, color_t &t_color); void convertCalcs(u32 t_vertCount, VECTOR *t_vertices, VECTOR *t_colors, VECTOR *t_sts, color_t &t_color);
void addCurrentCalcs(u32 &t_vertexCount); void addCurrentCalcs(u32 &t_vertexCount);
}; };
+29 -29
View File
@@ -64,39 +64,39 @@ public:
/** 2D draw. */ /** 2D draw. */
void draw(Sprite &t_sprite); void draw(Sprite &t_sprite);
/// --- Draw: PATH3 /// --- OBSOLETE
/** // /**
* WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS! // * WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS!
* Draw many meshes with lighting information. // * Draw many meshes with lighting information.
* Slowest way of rendering (PATH 3, using EE and GIF). // * Slowest way of rendering (PATH 3, using EE and GIF).
* NOTICE: Animation supported, lighting supported // * NOTICE: Animation supported, lighting supported
*/ // */
void drawByPath3(Mesh *t_meshes, u16 t_amount, LightBulb *t_bulbs, u16 t_bulbsCount); // void drawByPath3(Mesh *t_meshes, u16 t_amount, LightBulb *t_bulbs, u16 t_bulbsCount);
/** // /**
* WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS! // * WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS!
* Draw mesh with lighting information. // * Draw mesh with lighting information.
* Slowest way of rendering (PATH 3, using EE and GIF). // * Slowest way of rendering (PATH 3, using EE and GIF).
* NOTICE: Animation supported, lighting supported // * NOTICE: Animation supported, lighting supported
*/ // */
void drawByPath3(Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount); // void drawByPath3(Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount);
/** // /**
* WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS! // * WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS!
* Draw many meshes without lighting information. // * Draw many meshes without lighting information.
* Slowest way of rendering (PATH 3, using EE and GIF). // * Slowest way of rendering (PATH 3, using EE and GIF).
* NOTICE: Animation supported, lighting supported // * NOTICE: Animation supported, lighting supported
*/ // */
void drawByPath3(Mesh *t_meshes, u16 t_amount); // void drawByPath3(Mesh *t_meshes, u16 t_amount);
/** // /**
* WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS! // * WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS!
* Draw mesh without lighting information. // * Draw mesh without lighting information.
* Slowest way of rendering (PATH 3, using EE and GIF). // * Slowest way of rendering (PATH 3, using EE and GIF).
* NOTICE: Animation supported, lighting supported // * NOTICE: Animation supported, lighting supported
*/ // */
void drawByPath3(Mesh &t_mesh); // void drawByPath3(Mesh &t_mesh);
/// --- Draw: PATH1 /// --- Draw: PATH1
@@ -45,23 +45,14 @@ public:
/** /**
* Returns single texture. * Returns single texture.
* NULL if not found. * NULL if not found.
* @param t_id
* For 3D: Mesh material id.
* For 2D: Sprite id.
*/ */
Texture *getBySprite(const u32 &t_spriteId) Texture *getBySpriteOrMesh(const u32 &t_id)
{ {
for (u32 i = 0; i < textures.size(); i++) for (u32 i = 0; i < textures.size(); i++)
if (textures[i]->isLinkedWith(t_spriteId)) if (textures[i]->isLinkedWith(t_id))
return textures[i];
return NULL;
}
/**
* Returns single texture.
* NULL if not found.
*/
Texture *getByMesh(const u32 &t_meshId, const u32 &t_materialId)
{
for (u32 i = 0; i < textures.size(); i++)
if (textures[i]->isLinkedWith(t_meshId, t_materialId))
return textures[i]; return textures[i];
return NULL; return NULL;
} }
+3 -2
View File
@@ -29,7 +29,7 @@ public:
~VifSender(); ~VifSender();
// TODO refactor // TODO refactor
void drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer); void drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer, color_t *t_color, u8 t_rgbaOnly);
void calcMatrix(const RenderData &t_renderData, const Vector3 &t_position, const Vector3 &t_rotation); void calcMatrix(const RenderData &t_renderData, const Vector3 &t_position, const Vector3 &t_rotation);
void drawTheSameWithOtherMatrices(const RenderData &t_renderData, Mesh **t_meshes, const u32 &t_skip, const u32 &t_count); void drawTheSameWithOtherMatrices(const RenderData &t_renderData, Mesh **t_meshes, const u32 &t_skip, const u32 &t_count);
void enableWait() { isDrawWaitEnabled = true; } void enableWait() { isDrawWaitEnabled = true; }
@@ -37,11 +37,12 @@ public:
private: private:
u32 lastVertCount; // needed for drawTheSameWithOtherMatrices() u32 lastVertCount; // needed for drawTheSameWithOtherMatrices()
u8 isLastRGBAOnly; // needed for drawTheSameWithOtherMatrices()
u8 isDrawWaitEnabled; u8 isDrawWaitEnabled;
Light *light; Light *light;
void uploadMicroProgram(); void uploadMicroProgram();
void setDoubleBufferAddStaticData(); void setDoubleBufferAddStaticData();
void drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *t_textureBuffer, u8 t_addDrawWait); void drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *t_textureBuffer, u8 t_addDrawWait, color_t *t_color, u8 t_rgbaOnly);
packet2_t *packets[2] __attribute__((aligned(64))); packet2_t *packets[2] __attribute__((aligned(64)));
packet2_t *currPacket; packet2_t *currPacket;
/** /**
+95 -11
View File
@@ -36,6 +36,8 @@ void ObjLoader::load(MeshFrame *o_result, char *t_filename, float t_scale, u8 t_
fseek(file, 0, SEEK_SET); fseek(file, 0, SEEK_SET);
u32 verticesI = 0, cordsI = 0, normalsI = 0, faceI = 0, vertexIndex[3], coordIndex[3], normalIndex[3]; u32 verticesI = 0, cordsI = 0, normalsI = 0, faceI = 0, vertexIndex[3], coordIndex[3], normalIndex[3];
s16 materialsI = -1; s16 materialsI = -1;
Vector3 vector = Vector3();
Point point = Point();
while (1) while (1)
{ {
char lineHeader[128]; // read the first word of the line char lineHeader[128]; // read the first word of the line
@@ -44,13 +46,11 @@ void ObjLoader::load(MeshFrame *o_result, char *t_filename, float t_scale, u8 t_
{ {
if (strcmp(lineHeader, "v") == 0) if (strcmp(lineHeader, "v") == 0)
{ {
Vector3 vector = Vector3();
fscanf(file, "%f %f %f\n", &vector.x, &vector.y, &vector.z); fscanf(file, "%f %f %f\n", &vector.x, &vector.y, &vector.z);
o_result->setVertex(verticesI++, vector * t_scale); o_result->setVertex(verticesI++, vector * t_scale);
} }
else if (strcmp(lineHeader, "vt") == 0) else if (strcmp(lineHeader, "vt") == 0)
{ {
Point point = Point();
fscanf(file, "%f %f\n", &point.x, &point.y); fscanf(file, "%f %f\n", &point.x, &point.y);
if (t_invertT) if (t_invertT)
point.y = 1.0F - point.y; point.y = 1.0F - point.y;
@@ -58,7 +58,6 @@ void ObjLoader::load(MeshFrame *o_result, char *t_filename, float t_scale, u8 t_
} }
else if (strcmp(lineHeader, "vn") == 0) else if (strcmp(lineHeader, "vn") == 0)
{ {
Vector3 vector = Vector3();
fscanf(file, "%f %f %f\n", &vector.x, &vector.y, &vector.z); fscanf(file, "%f %f %f\n", &vector.x, &vector.y, &vector.z);
o_result->setNormal(normalsI++, vector); o_result->setNormal(normalsI++, vector);
} }
@@ -71,32 +70,117 @@ void ObjLoader::load(MeshFrame *o_result, char *t_filename, float t_scale, u8 t_
} }
else if (strcmp(lineHeader, "f") == 0) else if (strcmp(lineHeader, "f") == 0)
{ {
int matches = fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n", int *x = &res; // random assignment, to disable compilation warning
&vertexIndex[0], &coordIndex[0], &normalIndex[0], fpos_t start;
&vertexIndex[1], &coordIndex[1], &normalIndex[1], fgetpos(file, &start);
&vertexIndex[2], &coordIndex[2], &normalIndex[2]); int matches = fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n", x, x, x, x, x, x, x, x, x);
if (matches != 9) fsetpos(file, &start);
PRINT_ERR(".obj can't be read by this simple parser. Try exporting with other options"); int newerMatches = 0;
else
switch (matches)
{
/** Vs, VTs and VNs all set */
case 9:
{
fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n",
&vertexIndex[0], &coordIndex[0], &normalIndex[0],
&vertexIndex[1], &coordIndex[1], &normalIndex[1],
&vertexIndex[2], &coordIndex[2], &normalIndex[2]);
}
break;
/** Loaded only two digits (V, VT) succesfuly. Not setting VN. */
case 2:
{
fscanf(file, "%d/%d/ %d/%d/ %d/%d/\n",
&vertexIndex[0], &coordIndex[0],
&vertexIndex[1], &coordIndex[1],
&vertexIndex[2], &coordIndex[2]);
}
break;
/** Only V set. Checking for existance of VT or VN. */
case 1:
{
/** Check for existance of V/// configuration.. */
newerMatches = fscanf(file, "%d/// %d/// %d///\n", x, x, x);
fsetpos(file, &start);
if (newerMatches == 3)
{
/** Configuration confirmed. */
fscanf(file, "%d/// %d/// %d///\n", &vertexIndex[0], &vertexIndex[1], &vertexIndex[2]);
}
else
{
/** Failed, checking configuration V//VN */
newerMatches = fscanf(file, "%d//%d %d//%d %d//%d", x, x, x, x, x, x);
fsetpos(file, &start);
if (newerMatches == 6)
{
/** Configuration confirmed. */
newerMatches = fscanf(file, "%d//%d %d//%d %d//%d",
&vertexIndex[0], &normalIndex[0],
&vertexIndex[1], &normalIndex[1],
&vertexIndex[2], &normalIndex[2]);
}
else
{
/**Unknown configuration.*/
PRINT_ERR("Unknown .obj face for .obj file!");
}
}
break;
}
default:
PRINT_ERR("Unknown faces format in .obj file!");
break;
}
if (matches == 9 || matches == 2 || matches == 1)
{ {
o_result->getMaterial(materialsI).setVertexFace(faceI, vertexIndex[0] - 1); o_result->getMaterial(materialsI).setVertexFace(faceI, vertexIndex[0] - 1);
o_result->getMaterial(materialsI).setVertexFace(faceI + 1, vertexIndex[1] - 1); o_result->getMaterial(materialsI).setVertexFace(faceI + 1, vertexIndex[1] - 1);
o_result->getMaterial(materialsI).setVertexFace(faceI + 2, vertexIndex[2] - 1); o_result->getMaterial(materialsI).setVertexFace(faceI + 2, vertexIndex[2] - 1);
}
if (matches == 9 || matches == 2)
{
o_result->getMaterial(materialsI).setSTFace(faceI, coordIndex[0] - 1); o_result->getMaterial(materialsI).setSTFace(faceI, coordIndex[0] - 1);
o_result->getMaterial(materialsI).setSTFace(faceI + 1, coordIndex[1] - 1); o_result->getMaterial(materialsI).setSTFace(faceI + 1, coordIndex[1] - 1);
o_result->getMaterial(materialsI).setSTFace(faceI + 2, coordIndex[2] - 1); o_result->getMaterial(materialsI).setSTFace(faceI + 2, coordIndex[2] - 1);
o_result->getMaterial(materialsI).setSTsPresent(true);
}
if (matches == 9)
{
o_result->getMaterial(materialsI).setNormalFace(faceI, normalIndex[0] - 1); o_result->getMaterial(materialsI).setNormalFace(faceI, normalIndex[0] - 1);
o_result->getMaterial(materialsI).setNormalFace(faceI + 1, normalIndex[1] - 1); o_result->getMaterial(materialsI).setNormalFace(faceI + 1, normalIndex[1] - 1);
o_result->getMaterial(materialsI).setNormalFace(faceI + 2, normalIndex[2] - 1); o_result->getMaterial(materialsI).setNormalFace(faceI + 2, normalIndex[2] - 1);
o_result->getMaterial(materialsI).setNormalsPresent(true);
faceI += 3; faceI += 3;
} }
else if (matches == 2)
{
faceI += 2;
}
else if (matches == 1)
{
if (newerMatches == 3)
{
faceI += 1;
}
else if (newerMatches == 6)
{
o_result->getMaterial(materialsI).setNormalFace(faceI, normalIndex[0] - 1);
o_result->getMaterial(materialsI).setNormalFace(faceI + 1, normalIndex[1] - 1);
o_result->getMaterial(materialsI).setNormalFace(faceI + 2, normalIndex[2] - 1);
o_result->getMaterial(materialsI).setNormalsPresent(true);
faceI += 2;
}
}
} }
} }
else else
break; break;
} }
o_result->calculateBoundingBoxes(); o_result->calculateBoundingBoxes();
fclose(file); fclose(file);
delete[] path; delete[] path;
+10 -15
View File
@@ -28,6 +28,7 @@ Mesh::Mesh()
shouldBeFrustumCulled = true; shouldBeFrustumCulled = true;
shouldBeBackfaceCulled = false; shouldBeBackfaceCulled = false;
shouldBeLighted = false; shouldBeLighted = false;
_areFramesAllocated = false;
_isMother = false; _isMother = false;
scale = 1.0F; scale = 1.0F;
framesCount = 0; framesCount = 0;
@@ -40,13 +41,12 @@ Mesh::Mesh()
animState.isStayFrameSet = false; animState.isStayFrameSet = false;
animState.nextFrame = 0; animState.nextFrame = 0;
animState.speed = 0.1F; animState.speed = 0.1F;
setDefaultColor();
setDefaultLODAndClut(); setDefaultLODAndClut();
} }
Mesh::~Mesh() Mesh::~Mesh()
{ {
if (_isMother) if (_areFramesAllocated)
delete[] frames; delete[] frames;
} }
@@ -59,6 +59,7 @@ void Mesh::loadObj(char *t_subfolder, char *t_objFile, const float &t_scale, con
ObjLoader loader = ObjLoader(); ObjLoader loader = ObjLoader();
framesCount = 1; framesCount = 1;
frames = new MeshFrame[framesCount]; frames = new MeshFrame[framesCount];
_areFramesAllocated = true;
char *part1 = String::createConcatenated(t_subfolder, t_objFile); // "folder/object" char *part1 = String::createConcatenated(t_subfolder, t_objFile); // "folder/object"
char *finalPath = String::createConcatenated(part1, ".obj"); // "folder/object.obj" char *finalPath = String::createConcatenated(part1, ".obj"); // "folder/object.obj"
loader.load(&frames[0], finalPath, t_scale, t_invertT); loader.load(&frames[0], finalPath, t_scale, t_invertT);
@@ -78,6 +79,7 @@ void Mesh::loadObj(char *t_subfolder, char *t_objFile, const float &t_scale, con
ObjLoader loader = ObjLoader(); ObjLoader loader = ObjLoader();
framesCount = t_framesCount; framesCount = t_framesCount;
frames = new MeshFrame[framesCount]; frames = new MeshFrame[framesCount];
_areFramesAllocated = true;
char *part1 = String::createConcatenated(t_subfolder, t_objFile); // "folder/object" char *part1 = String::createConcatenated(t_subfolder, t_objFile); // "folder/object"
char *part2 = String::createConcatenated(part1, "_"); // "folder/object_" char *part2 = String::createConcatenated(part1, "_"); // "folder/object_"
for (u32 i = 0; i < framesCount; i++) for (u32 i = 0; i < framesCount; i++)
@@ -105,6 +107,7 @@ void Mesh::loadDff(char *t_subfolder, char *t_dffFile, const float &t_scale, con
char *dffPath = String::createConcatenated(part1, ".dff"); char *dffPath = String::createConcatenated(part1, ".dff");
framesCount = 1; framesCount = 1;
frames = new MeshFrame[1]; frames = new MeshFrame[1];
_areFramesAllocated = true;
loader.load(frames, dffPath, t_scale, t_invertT); loader.load(frames, dffPath, t_scale, t_invertT);
delete[] part1; delete[] part1;
delete[] dffPath; delete[] dffPath;
@@ -120,8 +123,11 @@ void Mesh::loadMD2(char *t_subfolder, char *t_md2File, const float &t_scale, con
void Mesh::loadFrom(const Mesh &t_mesh) void Mesh::loadFrom(const Mesh &t_mesh)
{ {
frames = t_mesh.frames;
framesCount = t_mesh.framesCount; framesCount = t_mesh.framesCount;
frames = new MeshFrame[framesCount];
_areFramesAllocated = true;
for (u32 i = 0; i < framesCount; i++)
frames[i].copyFrom(&t_mesh.getFrame(i));
} }
void Mesh::playAnimation(const u32 &t_startFrame, const u32 &t_endFrame) void Mesh::playAnimation(const u32 &t_startFrame, const u32 &t_endFrame)
@@ -254,8 +260,7 @@ u32 Mesh::getDrawData(u32 t_materialIndex, VECTOR *o_vertices, VECTOR *o_normals
"r"(nextVerts[vertFaces[faceI]].xyz), "r"(nextVerts[vertFaces[faceI]].xyz),
"r"(nextVerts[vertFaces[faceI + 1]].xyz), "r"(nextVerts[vertFaces[faceI + 1]].xyz),
"r"(nextVerts[vertFaces[faceI + 2]].xyz), "r"(nextVerts[vertFaces[faceI + 2]].xyz),
"f"(animState.interpolation) "f"(animState.interpolation));
: "$10");
} }
else else
{ {
@@ -375,16 +380,6 @@ 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 */ /** Sets texture level of details settings and CLUT settings */
void Mesh::setDefaultLODAndClut() void Mesh::setDefaultLODAndClut()
{ {
+41 -13
View File
@@ -8,6 +8,7 @@
# Sandro Sobczyński <sandro.sobczynski@gmail.com> # Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/ */
#include <cstdlib>
#include "../include/models/mesh_frame.hpp" #include "../include/models/mesh_frame.hpp"
#include "../include/utils/debug.hpp" #include "../include/utils/debug.hpp"
@@ -17,6 +18,7 @@
MeshFrame::MeshFrame() MeshFrame::MeshFrame()
{ {
id = rand() % 1000000;
vertexCount = 0; vertexCount = 0;
stsCount = 0; stsCount = 0;
normalsCount = 0; normalsCount = 0;
@@ -25,19 +27,23 @@ MeshFrame::MeshFrame()
_areVerticesAllocated = false; _areVerticesAllocated = false;
_areNormalsAllocated = false; _areNormalsAllocated = false;
_areMaterialsAllocated = false; _areMaterialsAllocated = false;
_isMother = true;
} }
MeshFrame::~MeshFrame() MeshFrame::~MeshFrame()
{ {
if (_areSTsAllocated) if (_isMother)
delete[] sts; {
if (_areVerticesAllocated) if (_areSTsAllocated)
delete[] vertices; delete[] sts;
if (_areNormalsAllocated) if (_areVerticesAllocated)
delete[] normals; delete[] vertices;
if (_areNormalsAllocated)
delete[] normals;
delete boundingBoxObj;
}
if (_areMaterialsAllocated) if (_areMaterialsAllocated)
delete[] materials; delete[] materials;
delete boundingBoxObj;
} }
// ---- // ----
@@ -94,14 +100,12 @@ void MeshFrame::allocateMaterials(const u32 &t_val)
void MeshFrame::calculateBoundingBoxes() void MeshFrame::calculateBoundingBoxes()
{ {
Vector3 boundingBox[8];
if (!_areVerticesAllocated) if (!_areVerticesAllocated)
{
PRINT_ERR("Can't calculate bounding box, because vertices were not allocated!"); PRINT_ERR("Can't calculate bounding box, because vertices were not allocated!");
return;
}
for (u32 i = 0; i < materialsCount; i++) for (u32 i = 0; i < materialsCount; i++)
materials->calculateBoundingBox(vertices, vertexCount); materials->calculateBoundingBox(vertices, vertexCount);
float lowX, lowY, lowZ, hiX, hiY, hiZ; float lowX, lowY, lowZ, hiX, hiY, hiZ;
lowX = hiX = vertices[0].x; lowX = hiX = vertices[0].x;
lowY = hiY = vertices[0].y; lowY = hiY = vertices[0].y;
@@ -124,6 +128,7 @@ void MeshFrame::calculateBoundingBoxes()
hiZ = vertices[i].z; hiZ = vertices[i].z;
} }
Vector3 boundingBox[8];
boundingBox[0].set(lowX, lowY, lowZ); boundingBox[0].set(lowX, lowY, lowZ);
boundingBox[1].set(lowX, lowY, hiZ); boundingBox[1].set(lowX, lowY, hiZ);
boundingBox[2].set(lowX, hiY, lowZ); boundingBox[2].set(lowX, hiY, lowZ);
@@ -135,7 +140,30 @@ void MeshFrame::calculateBoundingBoxes()
boundingBox[7].set(hiX, hiY, hiZ); boundingBox[7].set(hiX, hiY, hiZ);
_isBoundingBoxCalculated = true; _isBoundingBoxCalculated = true;
//BoundingBox is declared on the heap to prevent any ill-formed default // BoundingBox is declared on the heap to prevent any ill-formed default
//constructor instantiated BoundingBox objects. // constructor instantiated BoundingBox objects.
boundingBoxObj = new BoundingBox(boundingBox); boundingBoxObj = new BoundingBox(boundingBox);
} }
void MeshFrame::copyFrom(MeshFrame *t_refCopy)
{
vertexCount = t_refCopy->vertexCount;
stsCount = t_refCopy->stsCount;
normalsCount = t_refCopy->normalsCount;
materialsCount = t_refCopy->materialsCount;
materials = new MeshMaterial[materialsCount];
for (u32 i = 0; i < materialsCount; i++)
materials[i].copyFrom(&t_refCopy->materials[i]);
_areSTsAllocated = true;
_areVerticesAllocated = true;
_areNormalsAllocated = true;
_areMaterialsAllocated = true;
vertices = t_refCopy->vertices;
sts = t_refCopy->sts;
normals = t_refCopy->normals;
boundingBoxObj = t_refCopy->boundingBoxObj;
_isBoundingBoxCalculated = true;
_isMother = false;
}
+44 -7
View File
@@ -25,18 +25,25 @@ MeshMaterial::MeshMaterial()
_isNameSet = false; _isNameSet = false;
_areFacesAllocated = false; _areFacesAllocated = false;
_isBoundingBoxCalculated = false; _isBoundingBoxCalculated = false;
_areSTsPresent = false;
_areNormalsPresent = false;
_isMother = true;
setDefaultColor();
} }
MeshMaterial::~MeshMaterial() MeshMaterial::~MeshMaterial()
{ {
if (_areFacesAllocated) if (_isMother)
{ {
delete[] vertexFaces; if (_areFacesAllocated)
delete[] stFaces; {
delete[] normalFaces; delete[] vertexFaces;
delete[] stFaces;
delete[] normalFaces;
}
if (_isNameSet)
delete[] name;
} }
if (_isNameSet)
delete[] name;
} }
// ---- // ----
@@ -102,7 +109,6 @@ u8 MeshMaterial::isInFrustum(Plane *t_frustumPlanes, const Vector3 &position)
void MeshMaterial::calculateBoundingBox(Vector3 *t_vertices, u32 t_vertCount) void MeshMaterial::calculateBoundingBox(Vector3 *t_vertices, u32 t_vertCount)
{ {
Vector3 boundingBox[8];
float lowX, lowY, lowZ, hiX, hiY, hiZ; float lowX, lowY, lowZ, hiX, hiY, hiZ;
lowX = hiX = t_vertices[vertexFaces[0]].x; lowX = hiX = t_vertices[vertexFaces[0]].x;
lowY = hiY = t_vertices[vertexFaces[0]].y; lowY = hiY = t_vertices[vertexFaces[0]].y;
@@ -124,6 +130,8 @@ void MeshMaterial::calculateBoundingBox(Vector3 *t_vertices, u32 t_vertCount)
if (hiZ < t_vertices[vertexFaces[i]].z) if (hiZ < t_vertices[vertexFaces[i]].z)
hiZ = t_vertices[vertexFaces[i]].z; hiZ = t_vertices[vertexFaces[i]].z;
} }
Vector3 boundingBox[8];
boundingBox[0].set(lowX, lowY, lowZ); boundingBox[0].set(lowX, lowY, lowZ);
boundingBox[1].set(lowX, lowY, hiZ); boundingBox[1].set(lowX, lowY, hiZ);
boundingBox[2].set(lowX, hiY, lowZ); boundingBox[2].set(lowX, hiY, lowZ);
@@ -139,3 +147,32 @@ void MeshMaterial::calculateBoundingBox(Vector3 *t_vertices, u32 t_vertCount)
//constructor instantiated BoundingBox objects. //constructor instantiated BoundingBox objects.
boundingBoxObj = new BoundingBox(boundingBox); boundingBoxObj = new BoundingBox(boundingBox);
} }
void MeshMaterial::copyFrom(MeshMaterial *t_refCopy)
{
_isNameSet = true;
name = t_refCopy->name;
_isBoundingBoxCalculated = true;
boundingBoxObj = t_refCopy->boundingBoxObj;
vertexFaces = t_refCopy->vertexFaces;
stFaces = t_refCopy->stFaces;
normalFaces = t_refCopy->normalFaces;
facesCount = t_refCopy->facesCount;
_areSTsPresent = t_refCopy->_areSTsPresent;
_areNormalsPresent = t_refCopy->_areNormalsPresent;
_areFacesAllocated = true;
_isMother = false;
}
/** Set's default object color + no transparency */
void MeshMaterial::setDefaultColor()
{
color.r = 0x80;
color.g = 0x80;
color.b = 0x80;
color.a = 0x80;
color.q = 1.0F;
}
+2 -11
View File
@@ -82,18 +82,9 @@ void Texture::setWrapSettings(const WrapSettings t_horizontal, const WrapSetting
wrapSettings.vertical = t_vertical; wrapSettings.vertical = t_vertical;
} }
void Texture::addLink(const u32 &t_meshId, const u32 &t_materialId) void Texture::addLink(const u32 &t_id)
{ {
TextureLink link; TextureLink link;
link.materialId = t_materialId; link.id = t_id;
link.meshOrSpriteId = t_meshId;
texLinks.push_back(link);
}
void Texture::addLink(const u32 &t_spriteId)
{
TextureLink link;
link.materialId = 0;
link.meshOrSpriteId = t_spriteId;
texLinks.push_back(link); texLinks.push_back(link);
} }
+11 -11
View File
@@ -131,16 +131,16 @@ void GifSender::addClear(zbuffer_t *t_zBuffer, color_t *t_rgb)
} }
/** Adds meshes to current packet */ /** Adds meshes to current packet */
void GifSender::addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer) void GifSender::addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer, color_t *t_color)
{ {
packet2_chain_open_cnt(currentPacket, 0, 0, 0); packet2_chain_open_cnt(currentPacket, 0, 0, 0);
packet2_update(currentPacket, draw_texture_sampling(currentPacket->next, 0, &t_mesh.lod)); packet2_update(currentPacket, draw_texture_sampling(currentPacket->next, 0, &t_mesh.lod));
packet2_update(currentPacket, draw_texturebuffer(currentPacket->next, 0, textureBuffer, &t_mesh.clut)); packet2_update(currentPacket, draw_texturebuffer(currentPacket->next, 0, textureBuffer, &t_mesh.clut));
packet2_update(currentPacket, draw_prim_start(currentPacket->next, 0, t_renderData->prim, &t_mesh.color)); packet2_update(currentPacket, draw_prim_start(currentPacket->next, 0, t_renderData->prim, t_color));
xyz = new xyz_t[vertexCount]; xyz = new xyz_t[vertexCount];
rgbaq = new color_t[vertexCount]; rgbaq = new color_t[vertexCount];
st = new texel_t[vertexCount]; st = new texel_t[vertexCount];
calc3DObject(*t_renderData->projection, t_mesh, vertexCount, vertices, normals, coordinates, t_renderData, t_bulbs, t_bulbsCount); calc3DObject(*t_renderData->projection, t_mesh, vertexCount, vertices, normals, coordinates, t_renderData, t_bulbs, t_bulbsCount, t_color);
addCurrentCalcs(vertexCount); addCurrentCalcs(vertexCount);
delete[] xyz; delete[] xyz;
delete[] rgbaq; delete[] rgbaq;
@@ -152,7 +152,7 @@ void GifSender::addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCoun
/** Calculates 3D object data into xyz, rgbq, st /** Calculates 3D object data into xyz, rgbq, st
* After it addCurrentCalcs() can be done * After it addCurrentCalcs() can be done
*/ */
void GifSender::calc3DObject(Matrix t_perspective, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, RenderData *t_renderData, LightBulb *t_bulbs, u16 t_bulbsCount) void GifSender::calc3DObject(Matrix t_perspective, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, RenderData *t_renderData, LightBulb *t_bulbs, u16 t_bulbsCount, color_t *t_color)
{ {
VECTOR *colors = new VECTOR[vertexCount]; VECTOR *colors = new VECTOR[vertexCount];
VECTOR position, rotation; VECTOR position, rotation;
@@ -187,9 +187,9 @@ void GifSender::calc3DObject(Matrix t_perspective, Mesh &t_mesh, u32 vertexCount
for (u32 i = 0; i < vertexCount; i++) for (u32 i = 0; i < vertexCount; i++)
{ {
// Apply the light value to the colour. // Apply the light value to the colour.
colors[i][0] = (t_mesh.color.r * lights[i][0]); colors[i][0] = (t_color->r * lights[i][0]);
colors[i][1] = (t_mesh.color.g * lights[i][1]); colors[i][1] = (t_color->g * lights[i][1]);
colors[i][2] = (t_mesh.color.b * lights[i][2]); colors[i][2] = (t_color->b * lights[i][2]);
vector_clamp(colors[i], colors[i], 0.00F, 1.99F); vector_clamp(colors[i], colors[i], 0.00F, 1.99F);
} }
@@ -201,14 +201,14 @@ void GifSender::calc3DObject(Matrix t_perspective, Mesh &t_mesh, u32 vertexCount
else else
for (u32 i = 0; i < vertexCount; i++) for (u32 i = 0; i < vertexCount; i++)
{ {
colors[i][0] = t_mesh.color.r / 128.0F; colors[i][0] = t_color->r / 128.0F;
colors[i][1] = t_mesh.color.g / 128.0F; colors[i][1] = t_color->g / 128.0F;
colors[i][2] = t_mesh.color.b / 128.0F; colors[i][2] = t_color->b / 128.0F;
} }
calculate_vertices(vertices, vertexCount, vertices, localScreen); calculate_vertices(vertices, vertexCount, vertices, localScreen);
convertCalcs(vertexCount, vertices, colors, coordinates, t_mesh.color); convertCalcs(vertexCount, vertices, colors, coordinates, *t_color);
delete[] colors; delete[] colors;
} }
+44 -38
View File
@@ -105,7 +105,7 @@ void Renderer::changeTexture(Texture *t_tex)
void Renderer::draw(Sprite &t_sprite) void Renderer::draw(Sprite &t_sprite)
{ {
Texture *texture = textureRepo.getBySprite(t_sprite.getId()); Texture *texture = textureRepo.getBySpriteOrMesh(t_sprite.getId());
texrect_t rect; texrect_t rect;
float sizeX, sizeY; float sizeX, sizeY;
if (t_sprite.getMode() == MODE_REPEAT) if (t_sprite.getMode() == MODE_REPEAT)
@@ -227,42 +227,47 @@ void Renderer::allocateBuffers(int t_screenW, int t_screenH)
/// --- Draw: PATH3 /// --- Draw: PATH3
void Renderer::drawByPath3(Mesh *t_meshes, u16 t_amount, LightBulb *t_bulbs, u16 t_bulbsCount) // Obsolete
{ // void Renderer::drawByPath3(Mesh *t_meshes, u16 t_amount, LightBulb *t_bulbs, u16 t_bulbsCount)
for (u16 i = 0; i < t_amount; i++) // {
drawByPath3(t_meshes[i], t_bulbs, t_bulbsCount); // for (u16 i = 0; i < t_amount; i++)
} // drawByPath3(t_meshes[i], t_bulbs, t_bulbsCount);
// }
void Renderer::drawByPath3(Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount) // Obsolete
{ // void Renderer::drawByPath3(Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount)
beginFrameIfNeeded(); // {
if (!t_mesh.isDataLoaded()) // beginFrameIfNeeded();
PRINT_ERR("Can't draw, because no mesh data was loaded!"); // if (!t_mesh.isDataLoaded())
if (t_mesh.getCurrentAnimationFrame() != t_mesh.getNextAnimationFrame()) // PRINT_ERR("Can't draw, because no mesh data was loaded!");
t_mesh.animate(); // if (t_mesh.getCurrentAnimationFrame() != t_mesh.getNextAnimationFrame())
for (u32 i = 0; i < t_mesh.getMaterialsCount(); i++) // t_mesh.animate();
{ // for (u32 i = 0; i < t_mesh.getMaterialsCount(); i++)
if (t_mesh.shouldBeFrustumCulled && !t_mesh.getMaterial(i).isInFrustum(renderData.frustumPlanes, t_mesh.position)) // {
return; // MeshMaterial *material = &t_mesh.getMaterial(i);
Texture *tex = textureRepo.getByMesh(t_mesh.getId(), t_mesh.getMaterial(i).getId()); // if (t_mesh.shouldBeFrustumCulled && !material->isInFrustum(renderData.frustumPlanes, t_mesh.position))
changeTexture(tex); // return;
gifSender->initPacket(context); // Texture *tex = textureRepo.getBySpriteOrMesh(material->getId());
u32 vertCount = t_mesh.getMaterial(i).getFacesCount(); // changeTexture(tex);
VECTOR *vertices = new VECTOR[vertCount]; // gifSender->initPacket(context);
VECTOR *normals = new VECTOR[vertCount]; // u32 vertCount = material->getFacesCount();
VECTOR *coordinates = new VECTOR[vertCount]; // VECTOR *vertices = new VECTOR[vertCount];
vertCount = t_mesh.getDrawData(i, vertices, normals, coordinates, *renderData.cameraPosition); // VECTOR *normals = new VECTOR[vertCount];
gifSender->addObject(&renderData, t_mesh, vertCount, vertices, normals, coordinates, t_bulbs, t_bulbsCount, &textureBuffer); // VECTOR *coordinates = new VECTOR[vertCount];
gifSender->sendPacket(); // vertCount = t_mesh.getDrawData(i, vertices, normals, coordinates, *renderData.cameraPosition);
delete[] vertices; // gifSender->addObject(&renderData, t_mesh, vertCount, vertices, normals, coordinates, t_bulbs, t_bulbsCount, &textureBuffer, &material->color);
delete[] normals; // gifSender->sendPacket();
delete[] coordinates; // delete[] vertices;
} // delete[] normals;
} // delete[] coordinates;
// }
// }
void Renderer::drawByPath3(Mesh *t_meshes, u16 t_amount) { drawByPath3(t_meshes, t_amount, NULL, 0); } // Obsolete
// void Renderer::drawByPath3(Mesh *t_meshes, u16 t_amount) { drawByPath3(t_meshes, t_amount, NULL, 0); }
void Renderer::drawByPath3(Mesh &t_mesh) { drawByPath3(t_mesh, NULL, 0); } // Obsolete
// void Renderer::drawByPath3(Mesh &t_mesh) { drawByPath3(t_mesh, NULL, 0); }
/// --- Draw: PATH1 /// --- Draw: PATH1
@@ -315,16 +320,17 @@ void Renderer::draw(Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount)
t_mesh.animate(); t_mesh.animate();
for (u32 i = 0; i < t_mesh.getMaterialsCount(); i++) for (u32 i = 0; i < t_mesh.getMaterialsCount(); i++)
{ {
if (t_mesh.shouldBeFrustumCulled && !t_mesh.getMaterial(i).isInFrustum(renderData.frustumPlanes, t_mesh.position)) MeshMaterial *material = &t_mesh.getMaterial(i);
if (t_mesh.shouldBeFrustumCulled && !material->isInFrustum(renderData.frustumPlanes, t_mesh.position))
return; return;
u32 vertCount = t_mesh.getMaterial(i).getFacesCount(); u32 vertCount = material->getFacesCount();
VECTOR vertices[vertCount] __attribute__((aligned(16))); VECTOR vertices[vertCount] __attribute__((aligned(16)));
VECTOR normals[vertCount] __attribute__((aligned(16))); VECTOR normals[vertCount] __attribute__((aligned(16)));
VECTOR coordinates[vertCount] __attribute__((aligned(16))); VECTOR coordinates[vertCount] __attribute__((aligned(16)));
Texture *tex = textureRepo.getByMesh(t_mesh.getId(), t_mesh.getMaterial(i).getId()); Texture *tex = textureRepo.getBySpriteOrMesh(material->getId());
changeTexture(tex); changeTexture(tex);
vertCount = t_mesh.getDrawData(i, vertices, normals, coordinates, rotatedCamera); vertCount = t_mesh.getDrawData(i, vertices, normals, coordinates, rotatedCamera);
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, &material->color, !material->areSTsPresent());
} }
} }
+1 -1
View File
@@ -57,7 +57,7 @@ void TextureRepository::addByMesh(char *t_path, Mesh &mesh, TextureFormat t_form
else else
pngLoader.load(*texture, t_path, mesh.getMaterial(i).getName(), ".png"); pngLoader.load(*texture, t_path, mesh.getMaterial(i).getName(), ".png");
texture->setName(mesh.getMaterial(i).getName()); texture->setName(mesh.getMaterial(i).getName());
texture->addLink(mesh.getId(), mesh.getMaterial(i).getId()); texture->addLink(mesh.getMaterial(i).getId());
textures.push_back(texture); textures.push_back(texture);
} }
} }
+24 -18
View File
@@ -83,7 +83,7 @@ void VifSender::calcMatrix(const RenderData &t_renderData, const Vector3 &t_posi
modelViewProj = *t_renderData.projection * modelViewProj; modelViewProj = *t_renderData.projection * modelViewProj;
} }
void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer) void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer, color_t *t_color, u8 t_rgbaOnly)
{ {
// we have to split 3D object into small parts, because of small memory of VU1 // we have to split 3D object into small parts, because of small memory of VU1
@@ -97,7 +97,7 @@ void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 ver
i -= 3; i -= 3;
const u32 endI = i + (VU1_PACKAGE_VERTS_PER_BUFF - 1) > vertCount2 ? vertCount2 : i + (VU1_PACKAGE_VERTS_PER_BUFF - 1); const u32 endI = i + (VU1_PACKAGE_VERTS_PER_BUFF - 1) > vertCount2 ? vertCount2 : i + (VU1_PACKAGE_VERTS_PER_BUFF - 1);
drawVertices(t_mesh, i, endI, vertices, coordinates, t_renderData->prim, textureBuffer, isDrawWaitEnabled ? endI == vertCount2 : false); drawVertices(t_mesh, i, endI, vertices, coordinates, t_renderData->prim, textureBuffer, isDrawWaitEnabled ? endI == vertCount2 : false, t_color, t_rgbaOnly);
if (endI == vertCount2) // if there are no more vertices to draw, break if (endI == vertCount2) // if there are no more vertices to draw, break
{ {
i = vertCount2; i = vertCount2;
@@ -130,28 +130,34 @@ void VifSender::setDoubleBufferAddStaticData()
} }
/** Draw using PATH1 */ /** Draw using PATH1 */
void VifSender::drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *t_texBuff, u8 t_addDrawWait) void VifSender::drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *t_texBuff, u8 t_addDrawWait, color_t *t_color, u8 t_rgbaOnly)
{ {
const u32 vertCount = t_end - t_start; const u32 vertCount = t_end - t_start;
lastVertCount = vertCount; lastVertCount = vertCount;
isLastRGBAOnly = t_rgbaOnly;
packet2_utils_vu_open_unpack(currPacket, 0, true); packet2_utils_vu_open_unpack(currPacket, 0, true);
packet2_add_data(currPacket, modelViewProj.data, 4); packet2_add_data(currPacket, modelViewProj.data, 4);
packet2_add_u32(currPacket, t_addDrawWait); // Draw finish? packet2_add_u32(currPacket, t_addDrawWait); // Draw finish?
packet2_add_u32(currPacket, vertCount); // Vertex count packet2_add_u32(currPacket, vertCount); // Vertex count
packet2_add_u32(currPacket, vertCount / 3); // Triangles count packet2_add_u32(currPacket, vertCount / 3); // Triangles count
packet2_add_u32(currPacket, 0); // Free packet2_add_u32(currPacket, t_rgbaOnly); // 0 = STQ+RGBA, 1 = RGBA
packet2_utils_gs_add_lod(currPacket, &t_mesh.lod); packet2_utils_gs_add_lod(currPacket, &t_mesh.lod);
packet2_utils_gs_add_texbuff_clut(currPacket, t_texBuff, &t_mesh.clut); packet2_utils_gs_add_texbuff_clut(currPacket, t_texBuff, &t_mesh.clut);
packet2_utils_gs_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_STQ2_REGLIST, 3, 0); if (t_rgbaOnly)
packet2_add_u32(currPacket, t_mesh.color.r); packet2_utils_gs_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_RGBAQ_REGLIST, 2, 0);
packet2_add_u32(currPacket, t_mesh.color.g); else
packet2_add_u32(currPacket, t_mesh.color.b); packet2_utils_gs_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_STQ2_REGLIST, 3, 0);
packet2_add_u32(currPacket, t_mesh.color.a); packet2_add_u32(currPacket, t_color->r);
packet2_add_u32(currPacket, t_color->g);
packet2_add_u32(currPacket, t_color->b);
packet2_add_u32(currPacket, t_color->a);
u32 vif_added_bytes = packet2_utils_vu_close_unpack(currPacket); u32 vif_added_bytes = packet2_utils_vu_close_unpack(currPacket);
packet2_utils_vu_add_unpack_data(currPacket, vif_added_bytes, t_vertices + t_start, vertCount, true); packet2_utils_vu_add_unpack_data(currPacket, vif_added_bytes, t_vertices + t_start, vertCount, true);
vif_added_bytes += vertCount; if (!t_rgbaOnly)
packet2_utils_vu_add_unpack_data(currPacket, vif_added_bytes, t_coordinates + t_start, vertCount, true); {
vif_added_bytes += vertCount; vif_added_bytes += vertCount;
packet2_utils_vu_add_unpack_data(currPacket, vif_added_bytes, t_coordinates + t_start, vertCount, true);
}
packet2_utils_vu_add_start_program(currPacket, 0); packet2_utils_vu_add_start_program(currPacket, 0);
} }
@@ -183,10 +189,10 @@ void VifSender::drawTheSameWithOtherMatrices(const RenderData &t_renderData, Mes
packet2_utils_vu_close_unpack(currMPacket); packet2_utils_vu_close_unpack(currMPacket);
packet2_utils_vu_open_unpack(currMPacket, VU1_RGBA_ADDRESS, true); packet2_utils_vu_open_unpack(currMPacket, VU1_RGBA_ADDRESS, true);
{ {
packet2_add_u32(currMPacket, t_meshes[i]->color.r); packet2_add_u32(currMPacket, t_meshes[i]->getMaterial(0).color.r);
packet2_add_u32(currMPacket, t_meshes[i]->color.g); packet2_add_u32(currMPacket, t_meshes[i]->getMaterial(0).color.g);
packet2_add_u32(currMPacket, t_meshes[i]->color.b); packet2_add_u32(currMPacket, t_meshes[i]->getMaterial(0).color.b);
packet2_add_u32(currMPacket, t_meshes[i]->color.a); packet2_add_u32(currMPacket, t_meshes[i]->getMaterial(0).color.a);
} }
packet2_utils_vu_close_unpack(currMPacket); packet2_utils_vu_close_unpack(currMPacket);
@@ -203,7 +209,7 @@ void VifSender::drawTheSameWithOtherMatrices(const RenderData &t_renderData, Mes
packet2_add_u32(currMPacket, true); // Draw wait finish? packet2_add_u32(currMPacket, true); // Draw wait finish?
packet2_add_u32(currMPacket, lastVertCount); // Vertex count packet2_add_u32(currMPacket, lastVertCount); // Vertex count
packet2_add_u32(currMPacket, lastVertCount / 3); // Triangles count packet2_add_u32(currMPacket, lastVertCount / 3); // Triangles count
packet2_add_u32(currMPacket, 0); // Free packet2_add_u32(currMPacket, isLastRGBAOnly); // 0 = STQ+RGBA, 1 = RGBA
} }
packet2_utils_vu_close_unpack(currMPacket); packet2_utils_vu_close_unpack(currMPacket);
packet2_utils_vu_add_start_program(currMPacket, 0); // and start program packet2_utils_vu_add_start_program(currMPacket, 0); // and start program
@@ -231,7 +237,7 @@ void VifSender::drawTheSameWithOtherMatrices(const RenderData &t_renderData, Mes
packet2_add_u32(currMPacket, true); // Draw wait finish? packet2_add_u32(currMPacket, true); // Draw wait finish?
packet2_add_u32(currMPacket, lastVertCount); // Vertex count packet2_add_u32(currMPacket, lastVertCount); // Vertex count
packet2_add_u32(currMPacket, lastVertCount / 3); // Triangles count packet2_add_u32(currMPacket, lastVertCount / 3); // Triangles count
packet2_add_u32(currMPacket, 0); // Free packet2_add_u32(currMPacket, isLastRGBAOnly); // 0 = STQ+RGBA, 1 = RGBA
} }
packet2_utils_vu_close_unpack(currMPacket); packet2_utils_vu_close_unpack(currMPacket);
packet2_utils_vu_add_start_program(currMPacket, 0); packet2_utils_vu_add_start_program(currMPacket, 0);
+55 -18
View File
@@ -23,6 +23,7 @@
; TODO ; TODO
; - Add dynamic lighting (feature) ; - Add dynamic lighting (feature)
; - Add --cont + MSCNT instead of alltime MSCAL ; - Add --cont + MSCNT instead of alltime MSCAL
; - Split this program into two (RBA/STQ), so we can get better performance
#include "/repos/tyra/src/engine/vu1_progs/geometry.inc" #include "/repos/tyra/src/engine/vu1_progs/geometry.inc"
#include "/repos/tyra/src/engine/vu1_progs/matrix.inc" #include "/repos/tyra/src/engine/vu1_progs/matrix.inc"
@@ -51,6 +52,7 @@ MatrixLoad{ matrix, 0, double_buffer }
ilw.x do_draw_finish, 4(double_buffer) ; Add draw finish tag? (sync) ilw.x do_draw_finish, 4(double_buffer) ; Add draw finish tag? (sync)
ilw.y vertex_count, 4(double_buffer) ; Vertex count ilw.y vertex_count, 4(double_buffer) ; Vertex count
ilw.z triangles_count, 4(double_buffer) ; Triangles count ilw.z triangles_count, 4(double_buffer) ; Triangles count
ilw.w rgba_only, 4(double_buffer) ; RGBA (1) or STQ+RGBA (0)
lq tex_gif_tag_1, 5(double_buffer) ; GIF tag - texture LOD lq tex_gif_tag_1, 5(double_buffer) ; GIF tag - texture LOD
lq tex_gif_tag_2, 6(double_buffer) ; GIF tag - texture buffer & CLUT lq tex_gif_tag_2, 6(double_buffer) ; GIF tag - texture buffer & CLUT
lq prim_tag, 7(double_buffer) ; GIF tag - tell GS how many data we will send lq prim_tag, 7(double_buffer) ; GIF tag - tell GS how many data we will send
@@ -70,10 +72,10 @@ sqi gif_set_tag, (dest_address++) ;
sqi tex_gif_tag_1, (dest_address++) ; texture LOD tag sqi tex_gif_tag_1, (dest_address++) ; texture LOD tag
sqi gif_set_tag, (dest_address++) ; sqi gif_set_tag, (dest_address++) ;
sqi tex_gif_tag_2, (dest_address++) ; texture buffer & CLUT tag sqi tex_gif_tag_2, (dest_address++) ; texture buffer & CLUT tag
iblez do_draw_finish, kick iblez do_draw_finish, prim_tag_l
sqi gif_set_tag, (dest_address++) ; sqi gif_set_tag, (dest_address++) ;
sqi gif_draw_finish_tag, (dest_address++) ; do draw_finish is needed sqi gif_draw_finish_tag, (dest_address++) ; do draw_finish is needed
kick: prim_tag_l:
sqi prim_tag, (dest_address++) ; prim + tell gs how many data will be sqi prim_tag, (dest_address++) ; prim + tell gs how many data will be
;//////////////////////////////////////////// ;////////////////////////////////////////////
@@ -87,52 +89,87 @@ iaddiu triangle_counter, vi00, 0 ; Reset counter
triangle_loop: --LoopCS 1,3 triangle_loop: --LoopCS 1,3
;//////////////// VERTEX 1 ////////////////// ;//////////////// VERTEX 1 //////////////////
vec1:
VectorLoad{ vertex, vertex_data, 0 } VectorLoad{ vertex, vertex_data, 0 }
VectorLoad{ stq1, stq_data, 0 }
MatrixXForm{ xformed_vertex, matrix, vertex } MatrixXForm{ xformed_vertex, matrix, vertex }
VectorClip{ gs_vertex, xformed_vertex } VectorClip{ gs_vertex, xformed_vertex }
VectorPerspectiveDivide{ xformed_vertex } VectorPerspectiveDivide{ xformed_vertex }
VectorAddGSScales{ gs_vertex, xformed_vertex, gs_scale } VectorAddGSScales{ gs_vertex, xformed_vertex, gs_scale }
VectorTexturePerspectiveCorrection{ pers_stq, stq1 }
VectorStore{ pers_stq, dest_address, 0 } ibgtz rgba_only, vec_1_rgba
VectorStore{ rgba, dest_address, 1 }
VectorStore{ gs_vertex, dest_address, 2 } vec_1_stq_rgba:
VectorLoad{ stq1, stq_data, 0 }
VectorTexturePerspectiveCorrection{ pers_stq, stq1 }
VectorStore{ pers_stq, dest_address, 0 }
VectorStore{ rgba, dest_address, 1 }
VectorStore{ gs_vertex, dest_address, 2 }
ibeq vi00, vi00, vec2
vec_1_rgba:
VectorStore{ rgba, dest_address, 0 }
VectorStore{ gs_vertex, dest_address, 1 }
;//////////////////////////////////////////// ;////////////////////////////////////////////
;//////////////// VERTEX 2 ////////////////// ;//////////////// VERTEX 2 //////////////////
vec2:
VectorLoad{ vertex, vertex_data, 1 } VectorLoad{ vertex, vertex_data, 1 }
VectorLoad{ stq2, stq_data, 1 }
MatrixXForm{ xformed_vertex, matrix, vertex } MatrixXForm{ xformed_vertex, matrix, vertex }
VectorClip{ gs_vertex, xformed_vertex } VectorClip{ gs_vertex, xformed_vertex }
VectorPerspectiveDivide{ xformed_vertex } VectorPerspectiveDivide{ xformed_vertex }
VectorAddGSScales{ gs_vertex, xformed_vertex, gs_scale } VectorAddGSScales{ gs_vertex, xformed_vertex, gs_scale }
VectorTexturePerspectiveCorrection{ pers_stq, stq2 }
VectorStore{ pers_stq, dest_address, 3 } ibgtz rgba_only, vec_2_rgba
VectorStore{ rgba, dest_address, 4 }
VectorStore{ gs_vertex, dest_address, 5 } vec_2_stq_rgba:
VectorLoad{ stq2, stq_data, 1 }
VectorTexturePerspectiveCorrection{ pers_stq, stq2 }
VectorStore{ pers_stq, dest_address, 3 }
VectorStore{ rgba, dest_address, 4 }
VectorStore{ gs_vertex, dest_address, 5 }
ibeq vi00, vi00, vec3
vec_2_rgba:
VectorStore{ rgba, dest_address, 2 }
VectorStore{ gs_vertex, dest_address, 3 }
;//////////////////////////////////////////// ;////////////////////////////////////////////
;//////////////// VERTEX 3 ////////////////// ;//////////////// VERTEX 3 //////////////////
vec3:
VectorLoad{ vertex, vertex_data, 2 } VectorLoad{ vertex, vertex_data, 2 }
VectorLoad{ stq3, stq_data, 2 }
MatrixXForm{ xformed_vertex, matrix, vertex } MatrixXForm{ xformed_vertex, matrix, vertex }
VectorClip{ gs_vertex, xformed_vertex } VectorClip{ gs_vertex, xformed_vertex }
VectorPerspectiveDivide{ xformed_vertex } VectorPerspectiveDivide{ xformed_vertex }
VectorAddGSScales{ gs_vertex, xformed_vertex, gs_scale } VectorAddGSScales{ gs_vertex, xformed_vertex, gs_scale }
VectorTexturePerspectiveCorrection{ pers_stq, stq3 }
VectorStore{ pers_stq, dest_address, 6 }
VectorStore{ rgba, dest_address, 7 }
fcand vi01, 0x03FFFF fcand vi01, 0x03FFFF
iaddiu new_adc_bit, vi01, 0x7FFF iaddiu new_adc_bit, vi01, 0x7FFF
mfir.w gs_vertex, new_adc_bit mfir.w gs_vertex, new_adc_bit
VectorStore{ gs_vertex, dest_address, 8 }
ibgtz rgba_only, vec_3_rgba
vec_3_stq_rgba:
VectorLoad{ stq3, stq_data, 2 }
VectorTexturePerspectiveCorrection{ pers_stq, stq3 }
VectorStore{ pers_stq, dest_address, 6 }
VectorStore{ rgba, dest_address, 7 }
VectorStore{ gs_vertex, dest_address, 8 }
iaddiu dest_address, dest_address, 9 // Loop control
ibeq vi00, vi00, loop_ctrl
vec_3_rgba:
VectorStore{ rgba, dest_address, 4 }
VectorStore{ gs_vertex, dest_address, 5 }
iaddiu dest_address, dest_address, 6 // Loop control
;//////////////////////////////////////////// ;////////////////////////////////////////////
;////////////// LOOP CONTROL //////////////// ;////////////// LOOP CONTROL ////////////////
loop_ctrl:
iaddiu vertex_data, vertex_data, 3 iaddiu vertex_data, vertex_data, 3
iaddiu stq_data, stq_data, 3 iaddiu stq_data, stq_data, 3
iaddiu dest_address, dest_address, 9
iaddiu triangle_counter, triangle_counter, 1 // Incrementing this iaddiu triangle_counter, triangle_counter, 1 // Incrementing this
// by other value than 1 is causing HUGE problems, but.. why? // by other value than 1 is causing HUGE problems, but.. why?
+116 -154
View File
@@ -3,10 +3,6 @@
;-----VCL CODE------------ ;-----VCL CODE------------
;------------------------- ;-------------------------
;------------------------- ;-------------------------
; === __LP__ EXPL_draw3D_vcl_triangle_loop__MAIN_LOOP:
; === hDown : optimal=30 clid=0 mlid=2 size=(31)
; === dUp : optimal=30 clid=0 mlid=2 size=(31)
; === another : optimal=30 clid=0 mlid=2 size=(31)
; ================================================= ; =================================================
; flowMon::Emit() vcl 1.4beta7 produced this code: ; flowMon::Emit() vcl 1.4beta7 produced this code:
.vu .vu
@@ -15,171 +11,137 @@
.global VU1Draw3D_CodeEnd .global VU1Draw3D_CodeEnd
VU1Draw3D_CodeStart: VU1Draw3D_CodeStart:
__v_draw3D_vcl_4: __v_draw3D_vcl_4:
; _LNOPT_w=[ normal2 ] 26 [26 0] 26 [__v_draw3D_vcl_4] ; _LNOPT_w=[ normal2 ] 27 [27 0] 27 [__v_draw3D_vcl_4]
NOP xtop VI05 NOP xtop VI06
NOP lq VF02,1(VI00) NOP lq VF02,1(VI00)
NOP lq VF01,0(VI00) NOP lq VF01,0(VI00)
NOP ilw.x VI01,4(VI05) NOP ilw.x VI01,4(VI06)
NOP ilw.y VI07,4(VI05) NOP ilw.y VI08,4(VI06)
NOP lq VF03,0(VI05) NOP lq VF03,0(VI06)
NOP lq VF08,5(VI05) NOP lq VF04,1(VI06)
NOP lq VF10,6(VI05) NOP lq VF08,5(VI06)
NOP lq VF04,1(VI05) NOP lq VF10,6(VI06)
NOP lq VF05,2(VI05) NOP lq VF05,2(VI06)
NOP iaddiu VI03,VI05,0x00000009 NOP lq VF06,3(VI06)
NOP iadd VI04,VI03,VI07 NOP iaddiu VI04,VI06,0x00000009
NOP lq VF06,3(VI05) NOP iadd VI05,VI04,VI08
NOP iadd VI06,VI04,VI07 NOP ilw.z VI02,4(VI06)
NOP iadd VI07,VI05,VI08
NOP loi 0x44fff000 NOP loi 0x44fff000
NOP ilw.z VI02,4(VI05) NOP ilw.w VI03,4(VI06)
NOP lq VF07,7(VI05) NOP lq VF07,7(VI06)
NOP sqi VF02,(VI06++) NOP sqi VF02,(VI07++)
NOP sqi VF08,(VI06++) NOP sqi VF08,(VI07++)
NOP sqi VF02,(VI06++) NOP sqi VF02,(VI07++)
NOP lq VF08,8(VI05) NOP lq VF08,8(VI06)
NOP iadd VI05,VI04,VI07 NOP iadd VI06,VI05,VI08
addi.xy VF09,VF00,I loi 0x492aaaaa addi.xy VF09,VF00,I loi 0x492aaaaa
NOP fcset 0 NOP fcset 0
NOP iblez VI01,kick NOP iblez VI01,prim_tag_l
addi.z VF09,VF00,I sqi VF10,(VI06++) addi.z VF09,VF00,I sqi VF10,(VI07++)
; _LNOPT_w=[ normal2 ] 2 [2 0] 2 [__v_draw3D_vcl_5] ; _LNOPT_w=[ normal2 ] 2 [2 0] 2 [__v_draw3D_vcl_5]
NOP sqi VF02,(VI06++) NOP sqi VF02,(VI07++)
NOP sqi VF01,(VI06++) NOP sqi VF01,(VI07++)
kick: prim_tag_l:
; _LNOPT_w=[ normal2 ] 27 [27 0] 32 [kick] ; _LNOPT_w=[ normal2 ] 4 [4 0] 4 [prim_tag_l]
NOP sqi VF07,(VI06++) NOP iaddiu VI08,VI00,0x00007fff
NOP lq VF07,0(VI03) NOP sqi VF07,(VI07++)
mulax ACC,VF03,VF07x lq VF14,1(VI03) ; STALL_LATENCY ?3 NOP iaddiu VI08,VI08,0x00000001
madday ACC,VF04,VF07y sq VF08,1(VI06) NOP iaddiu VI09,VI00,0
maddaz ACC,VF05,VF07z sq VF08,7(VI06) triangle_loop:
maddw VF11,VF06,VF07w NOP ; _LNOPT_w=[ normal2 ] 11 [27 0] 27 [triangle_loop]
mulax ACC,VF03,VF14x lq VF07,2(VI03) NOP lq VF02,0(VI04)
madday ACC,VF04,VF14y NOP mulax ACC,VF03,VF02x mfir.w VF01,VI08 ; STALL_LATENCY ?3
maddaz ACC,VF05,VF14z NOP madday ACC,VF04,VF02y NOP
maddw VF14,VF06,VF14w div Q,VF00w,VF11w maddaz ACC,VF05,VF02z NOP
mulax ACC,VF03,VF07x NOP maddw VF02,VF06,VF02w NOP
madday ACC,VF04,VF07y iaddiu VI07,VI00,0x00007fff clipw.xyz VF02xyz,VF02w div Q,VF00w,VF02w ; STALL_LATENCY ?3
maddaz ACC,VF05,VF07z iaddiu VI07,VI07,0x00000001 mulq.xyz VF02,VF02,Q waitq ; STALL_LATENCY ?6
maddw VF07,VF06,VF07w iaddiu VI08,VI00,0 mulaw.xyz ACC,VF09,VF00w NOP
clipw.xyz VF11xyz,VF11w iaddiu VI04,VI04,0 madd.xyz VF02,VF02,VF09 NOP ; STALL_LATENCY ?2
clipw.xyz VF14xyz,VF14w div Q,VF00w,VF14w ; STALL_THRUPUT ?1 NOP ibgtz VI03,vec_1_rgba
clipw.xyz VF07xyz,VF07w lq VF15,0(VI04) ftoi4.xyz VF01,VF02 NOP ; STALL_LATENCY ?2
mulq.xyz VF02,VF11,Q sq VF08,4(VI06) ; _LNOPT_w=[ normal2 ] 5 [9 0] 9 [vec_1_stq_rgba]
mulaw.xyz ACC,VF09,VF00w iaddiu VI03,VI03,0 NOP lq VF02,0(VI05)
mulq VF11,VF15,Q iaddiu VI06,VI06,0 ; STALL_LATENCY ?1 mulq VF01,VF02,Q sq VF01,2(VI07) ; STALL_LATENCY ?3
madd.xyz VF01,VF02,VF09 lq VF02,1(VI04) NOP sq VF08,1(VI07)
NOP div Q,VF00w,VF07w NOP b vec2
mulq.xyz VF15,VF14,Q iaddiu VI08,VI08,0x00000001 NOP sq VF01,0(VI07) ; STALL_LATENCY ?1
mulaw.xyz ACC,VF09,VF00w sq VF11,0(VI06) vec_1_rgba:
mulq VF14,VF02,Q mfir.w VF11,VI07 ; _LNOPT_w=[ normal2 ] 4 [2 0] 4 [vec_1_rgba]
ftoi4.xyz VF11,VF01 ibeq VI08,VI02,EXPL_draw3D_vcl_triangle_loop__EPI1
madd.xyz VF02,VF15,VF09 lq VF15,2(VI04)
; _LNOPT_w=[ ] 31 [29 0] 31 [EXPL_draw3D_vcl_triangle_loop__PRO1]
NOP lq VF12,3(VI03)
NOP NOP NOP NOP
mulq.xyz VF01,VF07,Q NOP
mulq VF11,VF15,Q sq VF11,2(VI06)
mulax ACC,VF03,VF12x lq VF10,4(VI03)
madday ACC,VF04,VF12y NOP
maddaz ACC,VF05,VF12z NOP
maddw VF11,VF06,VF12w sq VF11,6(VI06)
mulax ACC,VF03,VF10x lq VF07,5(VI03)
madday ACC,VF04,VF10y sq VF14,3(VI06)
maddaz ACC,VF05,VF10z sq VF08,10(VI06)
maddw VF10,VF06,VF10w div Q,VF00w,VF11w
mulax ACC,VF03,VF07x sq VF08,13(VI06)
madday ACC,VF04,VF07y sq VF08,16(VI06)
maddaz ACC,VF05,VF07z iaddiu VI03,VI03,0x00000006
maddw VF07,VF06,VF07w iaddiu VI04,VI04,0x00000006
clipw.xyz VF11xyz,VF11w lq VF12,-3(VI04)
clipw.xyz VF10xyz,VF10w iaddiu VI06,VI06,0x00000012
mulq.xyz VF14,VF11,Q div Q,VF00w,VF10w
clipw.xyz VF07xyz,VF07w fcand VI01,262143
mulq VF12,VF12,Q iaddiu VI08,VI08,0x00000001
ftoi4.xyz VF11,VF02 iaddiu VI01,VI01,0x00007fff
mulaw.xyz ACC,VF09,VF00w mfir.w VF11,VI07
madd.xyz VF14,VF14,VF09 mfir.w VF10,VI01
mulaw.xyz ACC,VF09,VF00w lq VF02,-2(VI04)
madd.xyz VF01,VF01,VF09 div Q,VF00w,VF07w
mulq.xyz VF10,VF10,Q lq VF15,-1(VI04)
ftoi4.xyz VF11,VF14 sq VF11,-13(VI06)
mulq VF14,VF02,Q sq VF12,-9(VI06)
mulaw.xyz ACC,VF09,VF00w ibeq VI08,VI02,EXPL_draw3D_vcl_triangle_loop__EPI0
madd.xyz VF02,VF10,VF09 mfir.w VF11,VI07
EXPL_draw3D_vcl_triangle_loop__MAIN_LOOP:
; _LPOPT_w=[ hDown ] 31 [30 30] 31 [EXPL_draw3D_vcl_triangle_loop__MAIN_LOOP]
ftoi4.xyz VF10,VF01 lq VF13,0(VI03)
NOP lq VF12,1(VI03)
mulq.xyz VF01,VF07,Q sq VF14,-6(VI06)
mulq VF11,VF15,Q sq VF11,-7(VI06)
mulax ACC,VF03,VF13x sq VF10,-10(VI06)
madday ACC,VF04,VF13y sq VF08,1(VI06)
maddaz ACC,VF05,VF13z NOP
maddw VF11,VF06,VF13w sq VF11,-3(VI06)
mulax ACC,VF03,VF12x lq VF07,2(VI03)
madday ACC,VF04,VF12y sq VF08,4(VI06)
maddaz ACC,VF05,VF12z sq VF08,7(VI06)
maddw VF10,VF06,VF12w div Q,VF00w,VF11w
mulax ACC,VF03,VF07x NOP
madday ACC,VF04,VF07y iaddiu VI03,VI03,0x00000003
maddaz ACC,VF05,VF07z NOP
maddw VF07,VF06,VF07w iaddiu VI04,VI04,0x00000003
clipw.xyz VF11xyz,VF11w lq VF12,-3(VI04)
clipw.xyz VF10xyz,VF10w iaddiu VI06,VI06,0x00000009
mulq.xyz VF13,VF11,Q fcand VI01,262143
clipw.xyz VF07xyz,VF07w div Q,VF00w,VF10w
mulq VF12,VF12,Q iaddiu VI08,VI08,0x00000001
ftoi4.xyz VF11,VF02 iaddiu VI01,VI01,0x00007fff
mulaw.xyz ACC,VF09,VF00w mfir.w VF10,VI01
madd.xyz VF13,VF13,VF09 mfir.w VF11,VI07
mulaw.xyz ACC,VF09,VF00w lq VF02,-2(VI04)
madd.xyz VF01,VF01,VF09 sq VF12,-9(VI06)
mulq.xyz VF10,VF10,Q div Q,VF00w,VF07w
ftoi4.xyz VF11,VF13 sq VF11,-13(VI06)
mulq VF14,VF02,Q mfir.w VF11,VI07
mulaw.xyz ACC,VF09,VF00w ibne VI08,VI02,EXPL_draw3D_vcl_triangle_loop__MAIN_LOOP
madd.xyz VF02,VF10,VF09 lq VF15,-1(VI04)
EXPL_draw3D_vcl_triangle_loop__EPI0:
; _LNOPT_w=[ ] 13 [13 0] 15 [EXPL_draw3D_vcl_triangle_loop__EPI0]
NOP NOP NOP NOP
ftoi4.xyz VF10,VF01 fcand VI01,262143 NOP sq VF08,0(VI07)
mulq.xyz VF01,VF07,Q sq VF14,-6(VI06) NOP sq VF01,1(VI07)
mulq VF11,VF15,Q sq VF11,-7(VI06) vec2:
mulaw.xyz ACC,VF09,VF00w iaddiu VI01,VI01,0x00007fff ; _LNOPT_w=[ normal2 ] 11 [27 0] 27 [vec2]
madd.xyz VF01,VF01,VF09 sq VF10,-10(VI06) ; STALL_LATENCY ?1 NOP lq VF02,1(VI04)
ftoi4.xyz VF11,VF02 sq VF11,-3(VI06) mulax ACC,VF03,VF02x mfir.w VF01,VI08 ; STALL_LATENCY ?3
NOP mfir.w VF11,VI07 madday ACC,VF04,VF02y NOP
NOP mfir.w VF10,VI01 maddaz ACC,VF05,VF02z NOP
ftoi4.xyz VF10,VF01 NOP maddw VF02,VF06,VF02w NOP
NOP sq VF11,-4(VI06) ; STALL_LATENCY ?1 clipw.xyz VF02xyz,VF02w div Q,VF00w,VF02w ; STALL_LATENCY ?3
NOP b EXPL_draw3D_vcl_triangle_loop__EXIT_POINT mulq.xyz VF02,VF02,Q waitq ; STALL_LATENCY ?6
NOP sq VF10,-1(VI06) mulaw.xyz ACC,VF09,VF00w NOP
EXPL_draw3D_vcl_triangle_loop__EPI1: madd.xyz VF02,VF02,VF09 NOP ; STALL_LATENCY ?2
; _LNOPT_w=[ ] 12 [13 0] 14 [EXPL_draw3D_vcl_triangle_loop__EPI1] NOP ibgtz VI03,vec_2_rgba
ftoi4.xyz VF01,VF02 NOP ; STALL_LATENCY ?2
; _LNOPT_w=[ normal2 ] 5 [9 0] 9 [vec_2_stq_rgba]
NOP lq VF02,1(VI05)
mulq VF01,VF02,Q sq VF01,5(VI07) ; STALL_LATENCY ?3
NOP sq VF08,4(VI07)
NOP b vec3
NOP sq VF01,3(VI07) ; STALL_LATENCY ?1
vec_2_rgba:
; _LNOPT_w=[ normal2 ] 4 [2 0] 4 [vec_2_rgba]
NOP NOP NOP NOP
mulq.xyz VF14,VF07,Q sq VF14,3(VI06)
NOP NOP NOP NOP
mulq VF11,VF15,Q sq VF11,2(VI06) NOP sq VF08,2(VI07)
mulaw.xyz ACC,VF09,VF00w fcand VI01,262143 NOP sq VF01,3(VI07)
madd.xyz VF14,VF14,VF09 iaddiu VI01,VI01,0x00007fff vec3:
NOP mfir.w VF14,VI01 ; _LNOPT_w=[ normal2 ] 13 [27 0] 27 [vec3]
ftoi4.xyz VF11,VF02 sq VF11,6(VI06) NOP lq VF01,2(VI04)
NOP mfir.w VF11,VI07 mulax ACC,VF03,VF01x NOP ; STALL_LATENCY ?3
ftoi4.xyz VF14,VF14 NOP madday ACC,VF04,VF01y NOP
NOP sq VF11,5(VI06) ; STALL_LATENCY ?2 maddaz ACC,VF05,VF01z NOP
NOP sq VF14,8(VI06) maddw VF01,VF06,VF01w NOP
EXPL_draw3D_vcl_triangle_loop__EXIT_POINT: clipw.xyz VF01xyz,VF01w div Q,VF00w,VF01w ; STALL_LATENCY ?3
; _LNOPT_w=[ ] 0 [0 0] 0 [EXPL_draw3D_vcl_triangle_loop__EXIT_POINT] mulq.xyz VF01,VF01,Q waitq ; STALL_LATENCY ?6
; _LNOPT_w=[ normal2 ] 3 [1 0] 3 [__v_draw3D_vcl_9] mulaw.xyz ACC,VF09,VF00w NOP
NOP xgkick VI05 madd.xyz VF01,VF01,VF09 fcand VI01,262143 ; STALL_LATENCY ?2
NOP iaddiu VI01,VI01,0x00007fff
NOP mfir.w VF01,VI01
NOP ibgtz VI03,vec_3_rgba
ftoi4.xyz VF01,VF01 NOP
; _LNOPT_w=[ normal2 ] 6 [9 0] 9 [vec_3_stq_rgba]
NOP lq VF02,2(VI05)
mulq VF01,VF02,Q sq VF01,8(VI07) ; STALL_LATENCY ?3
NOP sq VF08,7(VI07)
NOP iaddiu VI07,VI07,0x00000009
NOP b loop_ctrl
NOP sq VF01,-3(VI07)
vec_3_rgba:
; _LNOPT_w=[ normal2 ] 4 [3 0] 4 [vec_3_rgba]
NOP NOP
NOP sq VF08,4(VI07)
NOP iaddiu VI07,VI07,0x00000006
NOP sq VF01,-1(VI07)
loop_ctrl:
; _LNOPT_w=[ normal2 ] 4 [4 0] 4 [loop_ctrl]
NOP iaddiu VI09,VI09,0x00000001
NOP iaddiu VI04,VI04,0x00000003
NOP ibne VI09,VI02,triangle_loop
NOP iaddiu VI05,VI05,0x00000003
; _LNOPT_w=[ normal2 ] 3 [1 0] 3 [__v_draw3D_vcl_21]
NOP xgkick VI06
NOP[E] NOP NOP[E] NOP
NOP NOP NOP NOP
.align 4 .align 4
VU1Draw3D_CodeEnd: VU1Draw3D_CodeEnd:
; iCount=145 ; iCount=103
; register stats: ; register stats:
; 9 VU User integer ; 10 VU User integer
; 16 VU User floating point ; 11 VU User floating point
;------------------------- ;-------------------------
;------------------------- ;-------------------------
;------------------------- ;-------------------------
+3 -6
View File
@@ -88,8 +88,7 @@ void Dolphin::onInit()
water[i].shouldBeFrustumCulled = true; water[i].shouldBeFrustumCulled = true;
water[i].shouldBeBackfaceCulled = false; water[i].shouldBeBackfaceCulled = false;
water[i].position.set(WATER_TILE_SCALE * 2.0F * spirals[i].x, WATER_LEVEL, WATER_TILE_SCALE * 2.0F * spirals[i].y); water[i].position.set(WATER_TILE_SCALE * 2.0F * spirals[i].x, WATER_LEVEL, WATER_TILE_SCALE * 2.0F * spirals[i].y);
texRepo->getByMesh(water[0].getId(), water[0].getMaterial(0).getId()) texRepo->getBySpriteOrMesh(water[0].getMaterial(0).getId())->addLink(water[i].getMaterial(0).getId());
->addLink(water[i].getId(), water[i].getMaterial(0).getId());
waterDrawList[i] = &water[i]; waterDrawList[i] = &water[i];
} }
@@ -123,8 +122,7 @@ void Dolphin::onInit()
oysters[i].mesh.loadFrom(oysters[0].mesh); oysters[i].mesh.loadFrom(oysters[0].mesh);
oysters[i].mesh.shouldBeBackfaceCulled = false; oysters[i].mesh.shouldBeBackfaceCulled = false;
oysters[i].mesh.shouldBeFrustumCulled = false; oysters[i].mesh.shouldBeFrustumCulled = false;
texRepo->getByMesh(oysters[0].mesh.getId(), oysters[0].mesh.getMaterial(0).getId()) texRepo->getBySpriteOrMesh(oysters[0].mesh.getMaterial(0).getId())->addLink(oysters[i].mesh.getMaterial(0).getId());
->addLink(oysters[i].mesh.getId(), oysters[i].mesh.getMaterial(0).getId());
oysters[i].mesh.position.set(i * -100, 5.0F, i * -100); oysters[i].mesh.position.set(i * -100, 5.0F, i * -100);
} }
@@ -141,8 +139,7 @@ void Dolphin::onInit()
mines[i].mesh.loadFrom(mines[0].mesh); mines[i].mesh.loadFrom(mines[0].mesh);
mines[i].mesh.shouldBeBackfaceCulled = false; mines[i].mesh.shouldBeBackfaceCulled = false;
mines[i].mesh.shouldBeFrustumCulled = false; mines[i].mesh.shouldBeFrustumCulled = false;
texRepo->getByMesh(mines[0].mesh.getId(), mines[0].mesh.getMaterial(0).getId()) texRepo->getBySpriteOrMesh(mines[0].mesh.getMaterial(0).getId())->addLink(mines[i].mesh.getMaterial(0).getId());
->addLink(mines[i].mesh.getId(), mines[i].mesh.getMaterial(0).getId());
mines[i].mesh.position.set(i * -10, 0.0F, i * -68); mines[i].mesh.position.set(i * -10, 0.0F, i * -68);
} }
@@ -91,8 +91,7 @@ void FloorManager::initFloors()
{ {
floors[i].mesh.shouldBeFrustumCulled = true; floors[i].mesh.shouldBeFrustumCulled = true;
floors[i].init(floors[0].mesh, spirals[i], i); floors[i].init(floors[0].mesh, spirals[i], i);
texRepo->getByMesh(floors[0].mesh.getId(), floors[0].mesh.getMaterial(0).getId()) texRepo->getBySpriteOrMesh(floors[0].mesh.getMaterial(0).getId())->addLink(floors[i].mesh.getMaterial(0).getId());
->addLink(floors[i].mesh.getId(), floors[i].mesh.getMaterial(0).getId());
meshes[i] = &floors[i].mesh; meshes[i] = &floors[i].mesh;
} }
PRINT_LOG("Floors initialized!"); PRINT_LOG("Floors initialized!");
@@ -123,18 +122,18 @@ void FloorManager::update(Player &t_player)
for (u16 i = 0; i < floorAmount; i++) for (u16 i = 0; i < floorAmount; i++)
{ {
floors[i].animate(t_player); floors[i].animate(t_player);
MeshMaterial *material = &floors[i].mesh.getMaterial(0);
if (floors[i].isByAudioTriggered) if (floors[i].isByAudioTriggered)
{ {
floors[i].mesh.color.r = trigColor.r; material->color.r = trigColor.r;
floors[i].mesh.color.g = trigColor.g; material->color.g = trigColor.g;
floors[i].mesh.color.b = trigColor.b; material->color.b = trigColor.b;
} }
else else
{ {
floors[i].mesh.color.r = defaultColor.r; material->color.r = defaultColor.r;
floors[i].mesh.color.g = defaultColor.g; material->color.g = defaultColor.g;
floors[i].mesh.color.b = defaultColor.b; material->color.b = defaultColor.b;
} }
} }
} }
+2 -2
View File
@@ -66,13 +66,13 @@ void Ui::update(const Player &player)
if (!isTask1Done && player.getJumpCount() >= 10) if (!isTask1Done && player.getJumpCount() >= 10)
{ {
isTask1Done = true; isTask1Done = true;
grayCheckboxTex->removeLinkBySprite(task1Checkbox.getId()); grayCheckboxTex->removeLinkById(task1Checkbox.getId());
blueCheckboxTex->addLink(task1Checkbox.getId()); blueCheckboxTex->addLink(task1Checkbox.getId());
} }
if (!isTask2Done && player.getKilledEnemiesCount() >= 10) if (!isTask2Done && player.getKilledEnemiesCount() >= 10)
{ {
isTask2Done = true; isTask2Done = true;
grayCheckboxTex->removeLinkBySprite(task2Checkbox.getId()); grayCheckboxTex->removeLinkById(task2Checkbox.getId());
blueCheckboxTex->addLink(task2Checkbox.getId()); blueCheckboxTex->addLink(task2Checkbox.getId());
} }
} }