Merge pull request #84 from h4570/feature/non-textured-rendering
Renderer: Non textured rendering (RGBA only)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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
|
||||||
|
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[0], &coordIndex[0], &normalIndex[0],
|
||||||
&vertexIndex[1], &coordIndex[1], &normalIndex[1],
|
&vertexIndex[1], &coordIndex[1], &normalIndex[1],
|
||||||
&vertexIndex[2], &coordIndex[2], &normalIndex[2]);
|
&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
|
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
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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 (_isMother)
|
||||||
|
{
|
||||||
if (_areSTsAllocated)
|
if (_areSTsAllocated)
|
||||||
delete[] sts;
|
delete[] sts;
|
||||||
if (_areVerticesAllocated)
|
if (_areVerticesAllocated)
|
||||||
delete[] vertices;
|
delete[] vertices;
|
||||||
if (_areNormalsAllocated)
|
if (_areNormalsAllocated)
|
||||||
delete[] normals;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -25,10 +25,16 @@ 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 (_isMother)
|
||||||
|
{
|
||||||
if (_areFacesAllocated)
|
if (_areFacesAllocated)
|
||||||
{
|
{
|
||||||
delete[] vertexFaces;
|
delete[] vertexFaces;
|
||||||
@@ -37,6 +43,7 @@ MeshMaterial::~MeshMaterial()
|
|||||||
}
|
}
|
||||||
if (_isNameSet)
|
if (_isNameSet)
|
||||||
delete[] name;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
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_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_color->r);
|
||||||
packet2_add_u32(currPacket, t_mesh.color.g);
|
packet2_add_u32(currPacket, t_color->g);
|
||||||
packet2_add_u32(currPacket, t_mesh.color.b);
|
packet2_add_u32(currPacket, t_color->b);
|
||||||
packet2_add_u32(currPacket, t_mesh.color.a);
|
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);
|
||||||
|
if (!t_rgbaOnly)
|
||||||
|
{
|
||||||
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_unpack_data(currPacket, vif_added_bytes, t_coordinates + t_start, vertCount, true);
|
||||||
vif_added_bytes += vertCount;
|
}
|
||||||
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);
|
||||||
|
|||||||
@@ -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 }
|
||||||
|
|
||||||
|
ibgtz rgba_only, vec_1_rgba
|
||||||
|
|
||||||
|
vec_1_stq_rgba:
|
||||||
|
VectorLoad{ stq1, stq_data, 0 }
|
||||||
VectorTexturePerspectiveCorrection{ pers_stq, stq1 }
|
VectorTexturePerspectiveCorrection{ pers_stq, stq1 }
|
||||||
VectorStore{ pers_stq, dest_address, 0 }
|
VectorStore{ pers_stq, dest_address, 0 }
|
||||||
VectorStore{ rgba, dest_address, 1 }
|
VectorStore{ rgba, dest_address, 1 }
|
||||||
VectorStore{ gs_vertex, dest_address, 2 }
|
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 }
|
||||||
|
|
||||||
|
ibgtz rgba_only, vec_2_rgba
|
||||||
|
|
||||||
|
vec_2_stq_rgba:
|
||||||
|
VectorLoad{ stq2, stq_data, 1 }
|
||||||
VectorTexturePerspectiveCorrection{ pers_stq, stq2 }
|
VectorTexturePerspectiveCorrection{ pers_stq, stq2 }
|
||||||
VectorStore{ pers_stq, dest_address, 3 }
|
VectorStore{ pers_stq, dest_address, 3 }
|
||||||
VectorStore{ rgba, dest_address, 4 }
|
VectorStore{ rgba, dest_address, 4 }
|
||||||
VectorStore{ gs_vertex, dest_address, 5 }
|
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
|
||||||
|
|
||||||
|
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 }
|
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
@@ -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
|
||||||
;-------------------------
|
;-------------------------
|
||||||
;-------------------------
|
;-------------------------
|
||||||
;-------------------------
|
;-------------------------
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user