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/),
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
### Added
- Created libpacket2 in PS2SDK
@@ -96,6 +109,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Makefile
- 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.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
+3 -4
View File
@@ -16,7 +16,6 @@
#include "./texture.hpp"
#include "./mesh_frame.hpp"
#include <tamtypes.h>
#include <draw_types.h>
#include <draw_buffers.h>
#include <draw_sampling.h>
#include "./anim_state.hpp"
@@ -43,7 +42,6 @@ public:
* When true, mesh materials are not drawn when they are outside of view frustum.
*/
u8 shouldBeFrustumCulled;
color_t color;
clutbuffer_t clut;
lod_t lod;
@@ -176,6 +174,8 @@ public:
void setAnimSpeed(const float &t_value) { animState.speed = t_value; }
const u8 &areFramesAllocated() const { return _areFramesAllocated; };
/**
* Check if this class loaded mesh data first.
* Meshes which use loadFrom() method have false there.
@@ -207,9 +207,8 @@ private:
AnimState animState;
MeshFrame *frames;
u32 id, framesCount;
u8 _isMother;
u8 _isMother, _areFramesAllocated;
Vector3 calc3Vectors[3];
void setDefaultColor();
void setDefaultLODAndClut();
};
+24 -2
View File
@@ -35,6 +35,12 @@ public:
// 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 &getSTsCount() const { return stsCount; };
const u32 &getNormalsCount() const { return normalsCount; };
@@ -119,12 +125,27 @@ public:
// 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 &areVerticesAllocated() const { return _areVerticesAllocated; };
const u8 &areNormalsAllocated() const { return _areNormalsAllocated; };
const u8 &areMaterialsAllocated() const { return _areMaterialsAllocated; };
const u8 &isBoundingBoxCalculated() const { return _isBoundingBoxCalculated; };
/** Create reference copy (non-mother) */
void copyFrom(MeshFrame *t_refCopy);
/** Set STs count and allocate memory. */
void allocateSTs(const u32 &t_val);
@@ -146,12 +167,13 @@ public:
private:
BoundingBox *boundingBoxObj;
u8 _areSTsAllocated,
u8 _isMother,
_areSTsAllocated,
_areVerticesAllocated,
_areNormalsAllocated,
_areMaterialsAllocated,
_isBoundingBoxCalculated;
u32 vertexCount, stsCount, normalsCount, materialsCount;
u32 vertexCount, stsCount, normalsCount, materialsCount, id;
MeshMaterial *materials;
Point __attribute__((aligned(16))) * sts;
Vector3 __attribute__((aligned(16))) * vertices, *normals;
+42 -1
View File
@@ -12,6 +12,7 @@
#define _TYRA_MESH_MATERIAL_
#include <tamtypes.h>
#include <draw_types.h>
#include "bounding_box.hpp"
#include "./math/vector3.hpp"
#include "./math/plane.hpp"
@@ -29,6 +30,8 @@ public:
MeshMaterial();
~MeshMaterial();
color_t color;
// ----
// Getters
// ----
@@ -104,11 +107,43 @@ public:
/** Set material name. */
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
// ----
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; };
/**
* 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; };
/** Set faces count and allocate memory. */
@@ -125,10 +160,16 @@ public:
u8 isInFrustum(Plane *t_frustumPlanes, const Vector3 &position);
private:
void setDefaultColor();
BoundingBox *boundingBoxObj;
u32 facesCount, id;
u32 *vertexFaces, *stFaces, *normalFaces;
u8 _isNameSet, _areFacesAllocated, _isBoundingBoxCalculated;
u8 _isMother,
_isNameSet,
_areFacesAllocated,
_isBoundingBoxCalculated,
_areSTsPresent,
_areNormalsPresent;
char *name;
};
+21 -30
View File
@@ -83,21 +83,18 @@ public:
/**
* Returns index of link.
* -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++)
if (texLinks[i].materialId == t_materialId && texLinks[i].meshOrSpriteId == t_meshId)
if (texLinks[i].id == t_id)
return i;
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
// ----
@@ -144,18 +141,15 @@ public:
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);
if (index != -1)
return true;
else
return false;
};
const u8 isLinkedWith(const u32 &t_spriteId) const
{
s32 index = getIndexOfLink(t_spriteId);
s32 index = getIndexOfLink(t_id);
if (index != -1)
return true;
else
@@ -164,18 +158,15 @@ public:
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);
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);
s32 index = getIndexOfLink(t_id);
if (index != -1)
removeLinkByIndex(index);
else
+5 -4
View File
@@ -15,10 +15,11 @@
struct TextureLink
{
/** Mesh id or sprite id */
u32 meshOrSpriteId;
/** Mesh material id or 0 if is sprite */
u32 materialId;
/**
* For 3D: Mesh material id.
* For 2D: Sprite id.
*/
u32 id;
};
#endif
+2 -2
View File
@@ -34,7 +34,7 @@ public:
~GifSender();
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 sendPacket();
void sendClear(zbuffer_t *t_zBuffer, color_t *t_rgb);
@@ -54,7 +54,7 @@ private:
float halfScreenW, halfScreenH;
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 addCurrentCalcs(u32 &t_vertexCount);
};
+29 -29
View File
@@ -64,39 +64,39 @@ public:
/** 2D draw. */
void draw(Sprite &t_sprite);
/// --- Draw: PATH3
/// --- OBSOLETE
/**
* WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS!
* Draw many meshes with lighting information.
* Slowest way of rendering (PATH 3, using EE and GIF).
* NOTICE: Animation supported, lighting supported
*/
void drawByPath3(Mesh *t_meshes, u16 t_amount, LightBulb *t_bulbs, u16 t_bulbsCount);
// /**
// * WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS!
// * Draw many meshes with lighting information.
// * Slowest way of rendering (PATH 3, using EE and GIF).
// * NOTICE: Animation supported, lighting supported
// */
// void drawByPath3(Mesh *t_meshes, u16 t_amount, LightBulb *t_bulbs, u16 t_bulbsCount);
/**
* WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS!
* Draw mesh with lighting information.
* Slowest way of rendering (PATH 3, using EE and GIF).
* NOTICE: Animation supported, lighting supported
*/
void drawByPath3(Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount);
// /**
// * WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS!
// * Draw mesh with lighting information.
// * Slowest way of rendering (PATH 3, using EE and GIF).
// * NOTICE: Animation supported, lighting supported
// */
// void drawByPath3(Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount);
/**
* WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS!
* Draw many meshes without lighting information.
* Slowest way of rendering (PATH 3, using EE and GIF).
* NOTICE: Animation supported, lighting supported
*/
void drawByPath3(Mesh *t_meshes, u16 t_amount);
// /**
// * WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS!
// * Draw many meshes without lighting information.
// * Slowest way of rendering (PATH 3, using EE and GIF).
// * NOTICE: Animation supported, lighting supported
// */
// void drawByPath3(Mesh *t_meshes, u16 t_amount);
/**
* WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS!
* Draw mesh without lighting information.
* Slowest way of rendering (PATH 3, using EE and GIF).
* NOTICE: Animation supported, lighting supported
*/
void drawByPath3(Mesh &t_mesh);
// /**
// * WARNING: THIS FUNC CAUSE VISUAL ARTIFACTS!
// * Draw mesh without lighting information.
// * Slowest way of rendering (PATH 3, using EE and GIF).
// * NOTICE: Animation supported, lighting supported
// */
// void drawByPath3(Mesh &t_mesh);
/// --- Draw: PATH1
@@ -45,23 +45,14 @@ public:
/**
* Returns single texture.
* 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++)
if (textures[i]->isLinkedWith(t_spriteId))
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))
if (textures[i]->isLinkedWith(t_id))
return textures[i];
return NULL;
}
+3 -2
View File
@@ -29,7 +29,7 @@ public:
~VifSender();
// 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 drawTheSameWithOtherMatrices(const RenderData &t_renderData, Mesh **t_meshes, const u32 &t_skip, const u32 &t_count);
void enableWait() { isDrawWaitEnabled = true; }
@@ -37,11 +37,12 @@ public:
private:
u32 lastVertCount; // needed for drawTheSameWithOtherMatrices()
u8 isLastRGBAOnly; // needed for drawTheSameWithOtherMatrices()
u8 isDrawWaitEnabled;
Light *light;
void uploadMicroProgram();
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 *currPacket;
/**
+91 -7
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);
u32 verticesI = 0, cordsI = 0, normalsI = 0, faceI = 0, vertexIndex[3], coordIndex[3], normalIndex[3];
s16 materialsI = -1;
Vector3 vector = Vector3();
Point point = Point();
while (1)
{
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)
{
Vector3 vector = Vector3();
fscanf(file, "%f %f %f\n", &vector.x, &vector.y, &vector.z);
o_result->setVertex(verticesI++, vector * t_scale);
}
else if (strcmp(lineHeader, "vt") == 0)
{
Point point = Point();
fscanf(file, "%f %f\n", &point.x, &point.y);
if (t_invertT)
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)
{
Vector3 vector = Vector3();
fscanf(file, "%f %f %f\n", &vector.x, &vector.y, &vector.z);
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)
{
int matches = fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n",
int *x = &res; // random assignment, to disable compilation warning
fpos_t start;
fgetpos(file, &start);
int matches = fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n", x, x, x, x, x, x, x, x, x);
fsetpos(file, &start);
int newerMatches = 0;
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]);
if (matches != 9)
PRINT_ERR(".obj can't be read by this simple parser. Try exporting with other options");
}
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 + 1, vertexIndex[1] - 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 + 1, coordIndex[1] - 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 + 1, normalIndex[1] - 1);
o_result->getMaterial(materialsI).setNormalFace(faceI + 2, normalIndex[2] - 1);
o_result->getMaterial(materialsI).setNormalsPresent(true);
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
break;
}
o_result->calculateBoundingBoxes();
fclose(file);
delete[] path;
+10 -15
View File
@@ -28,6 +28,7 @@ Mesh::Mesh()
shouldBeFrustumCulled = true;
shouldBeBackfaceCulled = false;
shouldBeLighted = false;
_areFramesAllocated = false;
_isMother = false;
scale = 1.0F;
framesCount = 0;
@@ -40,13 +41,12 @@ Mesh::Mesh()
animState.isStayFrameSet = false;
animState.nextFrame = 0;
animState.speed = 0.1F;
setDefaultColor();
setDefaultLODAndClut();
}
Mesh::~Mesh()
{
if (_isMother)
if (_areFramesAllocated)
delete[] frames;
}
@@ -59,6 +59,7 @@ void Mesh::loadObj(char *t_subfolder, char *t_objFile, const float &t_scale, con
ObjLoader loader = ObjLoader();
framesCount = 1;
frames = new MeshFrame[framesCount];
_areFramesAllocated = true;
char *part1 = String::createConcatenated(t_subfolder, t_objFile); // "folder/object"
char *finalPath = String::createConcatenated(part1, ".obj"); // "folder/object.obj"
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();
framesCount = t_framesCount;
frames = new MeshFrame[framesCount];
_areFramesAllocated = true;
char *part1 = String::createConcatenated(t_subfolder, t_objFile); // "folder/object"
char *part2 = String::createConcatenated(part1, "_"); // "folder/object_"
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");
framesCount = 1;
frames = new MeshFrame[1];
_areFramesAllocated = true;
loader.load(frames, dffPath, t_scale, t_invertT);
delete[] part1;
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)
{
frames = t_mesh.frames;
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)
@@ -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 + 1]].xyz),
"r"(nextVerts[vertFaces[faceI + 2]].xyz),
"f"(animState.interpolation)
: "$10");
"f"(animState.interpolation));
}
else
{
@@ -375,16 +380,6 @@ u8 Mesh::isInFrustum(Plane *t_frustumPlanes)
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()
{
+35 -7
View File
@@ -8,6 +8,7 @@
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include <cstdlib>
#include "../include/models/mesh_frame.hpp"
#include "../include/utils/debug.hpp"
@@ -17,6 +18,7 @@
MeshFrame::MeshFrame()
{
id = rand() % 1000000;
vertexCount = 0;
stsCount = 0;
normalsCount = 0;
@@ -25,19 +27,23 @@ MeshFrame::MeshFrame()
_areVerticesAllocated = false;
_areNormalsAllocated = false;
_areMaterialsAllocated = false;
_isMother = true;
}
MeshFrame::~MeshFrame()
{
if (_isMother)
{
if (_areSTsAllocated)
delete[] sts;
if (_areVerticesAllocated)
delete[] vertices;
if (_areNormalsAllocated)
delete[] normals;
delete boundingBoxObj;
}
if (_areMaterialsAllocated)
delete[] materials;
delete boundingBoxObj;
}
// ----
@@ -94,14 +100,12 @@ void MeshFrame::allocateMaterials(const u32 &t_val)
void MeshFrame::calculateBoundingBoxes()
{
Vector3 boundingBox[8];
if (!_areVerticesAllocated)
{
PRINT_ERR("Can't calculate bounding box, because vertices were not allocated!");
return;
}
for (u32 i = 0; i < materialsCount; i++)
materials->calculateBoundingBox(vertices, vertexCount);
float lowX, lowY, lowZ, hiX, hiY, hiZ;
lowX = hiX = vertices[0].x;
lowY = hiY = vertices[0].y;
@@ -124,6 +128,7 @@ void MeshFrame::calculateBoundingBoxes()
hiZ = vertices[i].z;
}
Vector3 boundingBox[8];
boundingBox[0].set(lowX, lowY, lowZ);
boundingBox[1].set(lowX, lowY, hiZ);
boundingBox[2].set(lowX, hiY, lowZ);
@@ -135,7 +140,30 @@ void MeshFrame::calculateBoundingBoxes()
boundingBox[7].set(hiX, hiY, hiZ);
_isBoundingBoxCalculated = true;
//BoundingBox is declared on the heap to prevent any ill-formed default
//constructor instantiated BoundingBox objects.
// BoundingBox is declared on the heap to prevent any ill-formed default
// constructor instantiated BoundingBox objects.
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;
}
+38 -1
View File
@@ -25,10 +25,16 @@ MeshMaterial::MeshMaterial()
_isNameSet = false;
_areFacesAllocated = false;
_isBoundingBoxCalculated = false;
_areSTsPresent = false;
_areNormalsPresent = false;
_isMother = true;
setDefaultColor();
}
MeshMaterial::~MeshMaterial()
{
if (_isMother)
{
if (_areFacesAllocated)
{
delete[] vertexFaces;
@@ -37,6 +43,7 @@ MeshMaterial::~MeshMaterial()
}
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)
{
Vector3 boundingBox[8];
float lowX, lowY, lowZ, hiX, hiY, hiZ;
lowX = hiX = t_vertices[vertexFaces[0]].x;
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)
hiZ = t_vertices[vertexFaces[i]].z;
}
Vector3 boundingBox[8];
boundingBox[0].set(lowX, lowY, lowZ);
boundingBox[1].set(lowX, lowY, hiZ);
boundingBox[2].set(lowX, hiY, lowZ);
@@ -139,3 +147,32 @@ void MeshMaterial::calculateBoundingBox(Vector3 *t_vertices, u32 t_vertCount)
//constructor instantiated BoundingBox objects.
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;
}
void Texture::addLink(const u32 &t_meshId, const u32 &t_materialId)
void Texture::addLink(const u32 &t_id)
{
TextureLink link;
link.materialId = t_materialId;
link.meshOrSpriteId = t_meshId;
texLinks.push_back(link);
}
void Texture::addLink(const u32 &t_spriteId)
{
TextureLink link;
link.materialId = 0;
link.meshOrSpriteId = t_spriteId;
link.id = t_id;
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 */
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_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_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];
rgbaq = new color_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);
delete[] xyz;
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
* 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 position, rotation;
@@ -187,9 +187,9 @@ void GifSender::calc3DObject(Matrix t_perspective, Mesh &t_mesh, u32 vertexCount
for (u32 i = 0; i < vertexCount; i++)
{
// Apply the light value to the colour.
colors[i][0] = (t_mesh.color.r * lights[i][0]);
colors[i][1] = (t_mesh.color.g * lights[i][1]);
colors[i][2] = (t_mesh.color.b * lights[i][2]);
colors[i][0] = (t_color->r * lights[i][0]);
colors[i][1] = (t_color->g * lights[i][1]);
colors[i][2] = (t_color->b * lights[i][2]);
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
for (u32 i = 0; i < vertexCount; i++)
{
colors[i][0] = t_mesh.color.r / 128.0F;
colors[i][1] = t_mesh.color.g / 128.0F;
colors[i][2] = t_mesh.color.b / 128.0F;
colors[i][0] = t_color->r / 128.0F;
colors[i][1] = t_color->g / 128.0F;
colors[i][2] = t_color->b / 128.0F;
}
calculate_vertices(vertices, vertexCount, vertices, localScreen);
convertCalcs(vertexCount, vertices, colors, coordinates, t_mesh.color);
convertCalcs(vertexCount, vertices, colors, coordinates, *t_color);
delete[] colors;
}
+44 -38
View File
@@ -105,7 +105,7 @@ void Renderer::changeTexture(Texture *t_tex)
void Renderer::draw(Sprite &t_sprite)
{
Texture *texture = textureRepo.getBySprite(t_sprite.getId());
Texture *texture = textureRepo.getBySpriteOrMesh(t_sprite.getId());
texrect_t rect;
float sizeX, sizeY;
if (t_sprite.getMode() == MODE_REPEAT)
@@ -227,42 +227,47 @@ void Renderer::allocateBuffers(int t_screenW, int t_screenH)
/// --- Draw: PATH3
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);
}
// 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);
// }
void Renderer::drawByPath3(Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount)
{
beginFrameIfNeeded();
if (!t_mesh.isDataLoaded())
PRINT_ERR("Can't draw, because no mesh data was loaded!");
if (t_mesh.getCurrentAnimationFrame() != t_mesh.getNextAnimationFrame())
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;
Texture *tex = textureRepo.getByMesh(t_mesh.getId(), t_mesh.getMaterial(i).getId());
changeTexture(tex);
gifSender->initPacket(context);
u32 vertCount = t_mesh.getMaterial(i).getFacesCount();
VECTOR *vertices = new VECTOR[vertCount];
VECTOR *normals = new VECTOR[vertCount];
VECTOR *coordinates = new VECTOR[vertCount];
vertCount = t_mesh.getDrawData(i, vertices, normals, coordinates, *renderData.cameraPosition);
gifSender->addObject(&renderData, t_mesh, vertCount, vertices, normals, coordinates, t_bulbs, t_bulbsCount, &textureBuffer);
gifSender->sendPacket();
delete[] vertices;
delete[] normals;
delete[] coordinates;
}
}
// Obsolete
// void Renderer::drawByPath3(Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount)
// {
// beginFrameIfNeeded();
// if (!t_mesh.isDataLoaded())
// PRINT_ERR("Can't draw, because no mesh data was loaded!");
// if (t_mesh.getCurrentAnimationFrame() != t_mesh.getNextAnimationFrame())
// t_mesh.animate();
// for (u32 i = 0; i < t_mesh.getMaterialsCount(); i++)
// {
// MeshMaterial *material = &t_mesh.getMaterial(i);
// if (t_mesh.shouldBeFrustumCulled && !material->isInFrustum(renderData.frustumPlanes, t_mesh.position))
// return;
// Texture *tex = textureRepo.getBySpriteOrMesh(material->getId());
// changeTexture(tex);
// gifSender->initPacket(context);
// u32 vertCount = material->getFacesCount();
// VECTOR *vertices = new VECTOR[vertCount];
// VECTOR *normals = new VECTOR[vertCount];
// VECTOR *coordinates = new VECTOR[vertCount];
// vertCount = t_mesh.getDrawData(i, vertices, normals, coordinates, *renderData.cameraPosition);
// gifSender->addObject(&renderData, t_mesh, vertCount, vertices, normals, coordinates, t_bulbs, t_bulbsCount, &textureBuffer, &material->color);
// gifSender->sendPacket();
// 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
@@ -315,16 +320,17 @@ void Renderer::draw(Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount)
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))
MeshMaterial *material = &t_mesh.getMaterial(i);
if (t_mesh.shouldBeFrustumCulled && !material->isInFrustum(renderData.frustumPlanes, t_mesh.position))
return;
u32 vertCount = t_mesh.getMaterial(i).getFacesCount();
u32 vertCount = material->getFacesCount();
VECTOR vertices[vertCount] __attribute__((aligned(16)));
VECTOR normals[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);
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
pngLoader.load(*texture, t_path, mesh.getMaterial(i).getName(), ".png");
texture->setName(mesh.getMaterial(i).getName());
texture->addLink(mesh.getId(), mesh.getMaterial(i).getId());
texture->addLink(mesh.getMaterial(i).getId());
textures.push_back(texture);
}
}
+21 -15
View File
@@ -83,7 +83,7 @@ void VifSender::calcMatrix(const RenderData &t_renderData, const Vector3 &t_posi
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
@@ -97,7 +97,7 @@ void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 ver
i -= 3;
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
{
i = vertCount2;
@@ -130,28 +130,34 @@ void VifSender::setDoubleBufferAddStaticData()
}
/** 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;
lastVertCount = vertCount;
isLastRGBAOnly = t_rgbaOnly;
packet2_utils_vu_open_unpack(currPacket, 0, true);
packet2_add_data(currPacket, modelViewProj.data, 4);
packet2_add_u32(currPacket, t_addDrawWait); // Draw finish?
packet2_add_u32(currPacket, vertCount); // Vertex 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_texbuff_clut(currPacket, t_texBuff, &t_mesh.clut);
if (t_rgbaOnly)
packet2_utils_gs_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_RGBAQ_REGLIST, 2, 0);
else
packet2_utils_gs_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_STQ2_REGLIST, 3, 0);
packet2_add_u32(currPacket, t_mesh.color.r);
packet2_add_u32(currPacket, t_mesh.color.g);
packet2_add_u32(currPacket, t_mesh.color.b);
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);
packet2_utils_vu_add_unpack_data(currPacket, vif_added_bytes, t_vertices + t_start, vertCount, true);
if (!t_rgbaOnly)
{
vif_added_bytes += vertCount;
packet2_utils_vu_add_unpack_data(currPacket, vif_added_bytes, t_coordinates + t_start, vertCount, true);
vif_added_bytes += vertCount;
}
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_open_unpack(currMPacket, VU1_RGBA_ADDRESS, true);
{
packet2_add_u32(currMPacket, t_meshes[i]->color.r);
packet2_add_u32(currMPacket, t_meshes[i]->color.g);
packet2_add_u32(currMPacket, t_meshes[i]->color.b);
packet2_add_u32(currMPacket, t_meshes[i]->color.a);
packet2_add_u32(currMPacket, t_meshes[i]->getMaterial(0).color.r);
packet2_add_u32(currMPacket, t_meshes[i]->getMaterial(0).color.g);
packet2_add_u32(currMPacket, t_meshes[i]->getMaterial(0).color.b);
packet2_add_u32(currMPacket, t_meshes[i]->getMaterial(0).color.a);
}
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, lastVertCount); // Vertex 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_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, lastVertCount); // Vertex 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_add_start_program(currMPacket, 0);
+46 -9
View File
@@ -23,6 +23,7 @@
; TODO
; - Add dynamic lighting (feature)
; - 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/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.y vertex_count, 4(double_buffer) ; Vertex 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_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
@@ -70,10 +72,10 @@ sqi gif_set_tag, (dest_address++) ;
sqi tex_gif_tag_1, (dest_address++) ; texture LOD tag
sqi gif_set_tag, (dest_address++) ;
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_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
;////////////////////////////////////////////
@@ -87,52 +89,87 @@ iaddiu triangle_counter, vi00, 0 ; Reset counter
triangle_loop: --LoopCS 1,3
;//////////////// VERTEX 1 //////////////////
vec1:
VectorLoad{ vertex, vertex_data, 0 }
VectorLoad{ stq1, stq_data, 0 }
MatrixXForm{ xformed_vertex, matrix, vertex }
VectorClip{ gs_vertex, xformed_vertex }
VectorPerspectiveDivide{ xformed_vertex }
VectorAddGSScales{ gs_vertex, xformed_vertex, gs_scale }
ibgtz rgba_only, vec_1_rgba
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 //////////////////
vec2:
VectorLoad{ vertex, vertex_data, 1 }
VectorLoad{ stq2, stq_data, 1 }
MatrixXForm{ xformed_vertex, matrix, vertex }
VectorClip{ gs_vertex, xformed_vertex }
VectorPerspectiveDivide{ xformed_vertex }
VectorAddGSScales{ gs_vertex, xformed_vertex, gs_scale }
ibgtz rgba_only, vec_2_rgba
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 //////////////////
vec3:
VectorLoad{ vertex, vertex_data, 2 }
VectorLoad{ stq3, stq_data, 2 }
MatrixXForm{ xformed_vertex, matrix, vertex }
VectorClip{ gs_vertex, xformed_vertex }
VectorPerspectiveDivide{ xformed_vertex }
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
iaddiu new_adc_bit, vi01, 0x7FFF
mfir.w gs_vertex, new_adc_bit
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_ctrl:
iaddiu vertex_data, vertex_data, 3
iaddiu stq_data, stq_data, 3
iaddiu dest_address, dest_address, 9
iaddiu triangle_counter, triangle_counter, 1 // Incrementing this
// by other value than 1 is causing HUGE problems, but.. why?
+116 -154
View File
@@ -3,10 +3,6 @@
;-----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:
.vu
@@ -15,171 +11,137 @@
.global VU1Draw3D_CodeEnd
VU1Draw3D_CodeStart:
__v_draw3D_vcl_4:
; _LNOPT_w=[ normal2 ] 26 [26 0] 26 [__v_draw3D_vcl_4]
NOP xtop VI05
; _LNOPT_w=[ normal2 ] 27 [27 0] 27 [__v_draw3D_vcl_4]
NOP xtop VI06
NOP lq VF02,1(VI00)
NOP lq VF01,0(VI00)
NOP ilw.x VI01,4(VI05)
NOP ilw.y VI07,4(VI05)
NOP lq VF03,0(VI05)
NOP lq VF08,5(VI05)
NOP lq VF10,6(VI05)
NOP lq VF04,1(VI05)
NOP lq VF05,2(VI05)
NOP iaddiu VI03,VI05,0x00000009
NOP iadd VI04,VI03,VI07
NOP lq VF06,3(VI05)
NOP iadd VI06,VI04,VI07
NOP ilw.x VI01,4(VI06)
NOP ilw.y VI08,4(VI06)
NOP lq VF03,0(VI06)
NOP lq VF04,1(VI06)
NOP lq VF08,5(VI06)
NOP lq VF10,6(VI06)
NOP lq VF05,2(VI06)
NOP lq VF06,3(VI06)
NOP iaddiu VI04,VI06,0x00000009
NOP iadd VI05,VI04,VI08
NOP ilw.z VI02,4(VI06)
NOP iadd VI07,VI05,VI08
NOP loi 0x44fff000
NOP ilw.z VI02,4(VI05)
NOP lq VF07,7(VI05)
NOP sqi VF02,(VI06++)
NOP sqi VF08,(VI06++)
NOP sqi VF02,(VI06++)
NOP lq VF08,8(VI05)
NOP iadd VI05,VI04,VI07
NOP ilw.w VI03,4(VI06)
NOP lq VF07,7(VI06)
NOP sqi VF02,(VI07++)
NOP sqi VF08,(VI07++)
NOP sqi VF02,(VI07++)
NOP lq VF08,8(VI06)
NOP iadd VI06,VI05,VI08
addi.xy VF09,VF00,I loi 0x492aaaaa
NOP fcset 0
NOP iblez VI01,kick
addi.z VF09,VF00,I sqi VF10,(VI06++)
NOP iblez VI01,prim_tag_l
addi.z VF09,VF00,I sqi VF10,(VI07++)
; _LNOPT_w=[ normal2 ] 2 [2 0] 2 [__v_draw3D_vcl_5]
NOP sqi VF02,(VI06++)
NOP sqi VF01,(VI06++)
kick:
; _LNOPT_w=[ normal2 ] 27 [27 0] 32 [kick]
NOP sqi VF07,(VI06++)
NOP lq VF07,0(VI03)
mulax ACC,VF03,VF07x lq VF14,1(VI03) ; STALL_LATENCY ?3
madday ACC,VF04,VF07y sq VF08,1(VI06)
maddaz ACC,VF05,VF07z sq VF08,7(VI06)
maddw VF11,VF06,VF07w NOP
mulax ACC,VF03,VF14x lq VF07,2(VI03)
madday ACC,VF04,VF14y NOP
maddaz ACC,VF05,VF14z NOP
maddw VF14,VF06,VF14w div Q,VF00w,VF11w
mulax ACC,VF03,VF07x NOP
madday ACC,VF04,VF07y iaddiu VI07,VI00,0x00007fff
maddaz ACC,VF05,VF07z iaddiu VI07,VI07,0x00000001
maddw VF07,VF06,VF07w iaddiu VI08,VI00,0
clipw.xyz VF11xyz,VF11w iaddiu VI04,VI04,0
clipw.xyz VF14xyz,VF14w div Q,VF00w,VF14w ; STALL_THRUPUT ?1
clipw.xyz VF07xyz,VF07w lq VF15,0(VI04)
mulq.xyz VF02,VF11,Q sq VF08,4(VI06)
mulaw.xyz ACC,VF09,VF00w iaddiu VI03,VI03,0
mulq VF11,VF15,Q iaddiu VI06,VI06,0 ; STALL_LATENCY ?1
madd.xyz VF01,VF02,VF09 lq VF02,1(VI04)
NOP div Q,VF00w,VF07w
mulq.xyz VF15,VF14,Q iaddiu VI08,VI08,0x00000001
mulaw.xyz ACC,VF09,VF00w sq VF11,0(VI06)
mulq VF14,VF02,Q mfir.w VF11,VI07
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 sqi VF02,(VI07++)
NOP sqi VF01,(VI07++)
prim_tag_l:
; _LNOPT_w=[ normal2 ] 4 [4 0] 4 [prim_tag_l]
NOP iaddiu VI08,VI00,0x00007fff
NOP sqi VF07,(VI07++)
NOP iaddiu VI08,VI08,0x00000001
NOP iaddiu VI09,VI00,0
triangle_loop:
; _LNOPT_w=[ normal2 ] 11 [27 0] 27 [triangle_loop]
NOP lq VF02,0(VI04)
mulax ACC,VF03,VF02x mfir.w VF01,VI08 ; STALL_LATENCY ?3
madday ACC,VF04,VF02y NOP
maddaz ACC,VF05,VF02z NOP
maddw VF02,VF06,VF02w NOP
clipw.xyz VF02xyz,VF02w div Q,VF00w,VF02w ; STALL_LATENCY ?3
mulq.xyz VF02,VF02,Q waitq ; STALL_LATENCY ?6
mulaw.xyz ACC,VF09,VF00w NOP
madd.xyz VF02,VF02,VF09 NOP ; STALL_LATENCY ?2
NOP ibgtz VI03,vec_1_rgba
ftoi4.xyz VF01,VF02 NOP ; STALL_LATENCY ?2
; _LNOPT_w=[ normal2 ] 5 [9 0] 9 [vec_1_stq_rgba]
NOP lq VF02,0(VI05)
mulq VF01,VF02,Q sq VF01,2(VI07) ; STALL_LATENCY ?3
NOP sq VF08,1(VI07)
NOP b vec2
NOP sq VF01,0(VI07) ; STALL_LATENCY ?1
vec_1_rgba:
; _LNOPT_w=[ normal2 ] 4 [2 0] 4 [vec_1_rgba]
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
ftoi4.xyz VF10,VF01 fcand VI01,262143
mulq.xyz VF01,VF07,Q sq VF14,-6(VI06)
mulq VF11,VF15,Q sq VF11,-7(VI06)
mulaw.xyz ACC,VF09,VF00w iaddiu VI01,VI01,0x00007fff
madd.xyz VF01,VF01,VF09 sq VF10,-10(VI06) ; STALL_LATENCY ?1
ftoi4.xyz VF11,VF02 sq VF11,-3(VI06)
NOP mfir.w VF11,VI07
NOP mfir.w VF10,VI01
ftoi4.xyz VF10,VF01 NOP
NOP sq VF11,-4(VI06) ; STALL_LATENCY ?1
NOP b EXPL_draw3D_vcl_triangle_loop__EXIT_POINT
NOP sq VF10,-1(VI06)
EXPL_draw3D_vcl_triangle_loop__EPI1:
; _LNOPT_w=[ ] 12 [13 0] 14 [EXPL_draw3D_vcl_triangle_loop__EPI1]
NOP sq VF08,0(VI07)
NOP sq VF01,1(VI07)
vec2:
; _LNOPT_w=[ normal2 ] 11 [27 0] 27 [vec2]
NOP lq VF02,1(VI04)
mulax ACC,VF03,VF02x mfir.w VF01,VI08 ; STALL_LATENCY ?3
madday ACC,VF04,VF02y NOP
maddaz ACC,VF05,VF02z NOP
maddw VF02,VF06,VF02w NOP
clipw.xyz VF02xyz,VF02w div Q,VF00w,VF02w ; STALL_LATENCY ?3
mulq.xyz VF02,VF02,Q waitq ; STALL_LATENCY ?6
mulaw.xyz ACC,VF09,VF00w NOP
madd.xyz VF02,VF02,VF09 NOP ; STALL_LATENCY ?2
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
mulq.xyz VF14,VF07,Q sq VF14,3(VI06)
NOP NOP
mulq VF11,VF15,Q sq VF11,2(VI06)
mulaw.xyz ACC,VF09,VF00w fcand VI01,262143
madd.xyz VF14,VF14,VF09 iaddiu VI01,VI01,0x00007fff
NOP mfir.w VF14,VI01
ftoi4.xyz VF11,VF02 sq VF11,6(VI06)
NOP mfir.w VF11,VI07
ftoi4.xyz VF14,VF14 NOP
NOP sq VF11,5(VI06) ; STALL_LATENCY ?2
NOP sq VF14,8(VI06)
EXPL_draw3D_vcl_triangle_loop__EXIT_POINT:
; _LNOPT_w=[ ] 0 [0 0] 0 [EXPL_draw3D_vcl_triangle_loop__EXIT_POINT]
; _LNOPT_w=[ normal2 ] 3 [1 0] 3 [__v_draw3D_vcl_9]
NOP xgkick VI05
NOP sq VF08,2(VI07)
NOP sq VF01,3(VI07)
vec3:
; _LNOPT_w=[ normal2 ] 13 [27 0] 27 [vec3]
NOP lq VF01,2(VI04)
mulax ACC,VF03,VF01x NOP ; STALL_LATENCY ?3
madday ACC,VF04,VF01y NOP
maddaz ACC,VF05,VF01z NOP
maddw VF01,VF06,VF01w NOP
clipw.xyz VF01xyz,VF01w div Q,VF00w,VF01w ; STALL_LATENCY ?3
mulq.xyz VF01,VF01,Q waitq ; STALL_LATENCY ?6
mulaw.xyz ACC,VF09,VF00w NOP
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 NOP
.align 4
VU1Draw3D_CodeEnd:
; iCount=145
; iCount=103
; register stats:
; 9 VU User integer
; 16 VU User floating point
; 10 VU User integer
; 11 VU User floating point
;-------------------------
;-------------------------
;-------------------------
+3 -6
View File
@@ -88,8 +88,7 @@ void Dolphin::onInit()
water[i].shouldBeFrustumCulled = true;
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);
texRepo->getByMesh(water[0].getId(), water[0].getMaterial(0).getId())
->addLink(water[i].getId(), water[i].getMaterial(0).getId());
texRepo->getBySpriteOrMesh(water[0].getMaterial(0).getId())->addLink(water[i].getMaterial(0).getId());
waterDrawList[i] = &water[i];
}
@@ -123,8 +122,7 @@ void Dolphin::onInit()
oysters[i].mesh.loadFrom(oysters[0].mesh);
oysters[i].mesh.shouldBeBackfaceCulled = false;
oysters[i].mesh.shouldBeFrustumCulled = false;
texRepo->getByMesh(oysters[0].mesh.getId(), oysters[0].mesh.getMaterial(0).getId())
->addLink(oysters[i].mesh.getId(), oysters[i].mesh.getMaterial(0).getId());
texRepo->getBySpriteOrMesh(oysters[0].mesh.getMaterial(0).getId())->addLink(oysters[i].mesh.getMaterial(0).getId());
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.shouldBeBackfaceCulled = false;
mines[i].mesh.shouldBeFrustumCulled = false;
texRepo->getByMesh(mines[0].mesh.getId(), mines[0].mesh.getMaterial(0).getId())
->addLink(mines[i].mesh.getId(), mines[i].mesh.getMaterial(0).getId());
texRepo->getBySpriteOrMesh(mines[0].mesh.getMaterial(0).getId())->addLink(mines[i].mesh.getMaterial(0).getId());
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].init(floors[0].mesh, spirals[i], i);
texRepo->getByMesh(floors[0].mesh.getId(), floors[0].mesh.getMaterial(0).getId())
->addLink(floors[i].mesh.getId(), floors[i].mesh.getMaterial(0).getId());
texRepo->getBySpriteOrMesh(floors[0].mesh.getMaterial(0).getId())->addLink(floors[i].mesh.getMaterial(0).getId());
meshes[i] = &floors[i].mesh;
}
PRINT_LOG("Floors initialized!");
@@ -123,18 +122,18 @@ void FloorManager::update(Player &t_player)
for (u16 i = 0; i < floorAmount; i++)
{
floors[i].animate(t_player);
MeshMaterial *material = &floors[i].mesh.getMaterial(0);
if (floors[i].isByAudioTriggered)
{
floors[i].mesh.color.r = trigColor.r;
floors[i].mesh.color.g = trigColor.g;
floors[i].mesh.color.b = trigColor.b;
material->color.r = trigColor.r;
material->color.g = trigColor.g;
material->color.b = trigColor.b;
}
else
{
floors[i].mesh.color.r = defaultColor.r;
floors[i].mesh.color.g = defaultColor.g;
floors[i].mesh.color.b = defaultColor.b;
material->color.r = defaultColor.r;
material->color.g = defaultColor.g;
material->color.b = defaultColor.b;
}
}
}
+2 -2
View File
@@ -66,13 +66,13 @@ void Ui::update(const Player &player)
if (!isTask1Done && player.getJumpCount() >= 10)
{
isTask1Done = true;
grayCheckboxTex->removeLinkBySprite(task1Checkbox.getId());
grayCheckboxTex->removeLinkById(task1Checkbox.getId());
blueCheckboxTex->addLink(task1Checkbox.getId());
}
if (!isTask2Done && player.getKilledEnemiesCount() >= 10)
{
isTask2Done = true;
grayCheckboxTex->removeLinkBySprite(task2Checkbox.getId());
grayCheckboxTex->removeLinkById(task2Checkbox.getId());
blueCheckboxTex->addLink(task2Checkbox.getId());
}
}