mirror of https://github.com/AxioDL/metaforce.git
Static geometry list in CBooRenderer
This commit is contained in:
parent
5abda4eee7
commit
728cb25488
|
@ -1623,5 +1623,226 @@ bool WriteHMDLCMDL(const hecl::ProjectPath& outPath, const hecl::ProjectPath& in
|
||||||
template bool WriteHMDLCMDL<DNAMP1::HMDLMaterialSet, DNACMDL::SurfaceHeader_2, 2>
|
template bool WriteHMDLCMDL<DNAMP1::HMDLMaterialSet, DNACMDL::SurfaceHeader_2, 2>
|
||||||
(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, const Mesh& mesh);
|
(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, const Mesh& mesh);
|
||||||
|
|
||||||
|
void SurfaceHeader_1::read(athena::io::IStreamReader& reader)
|
||||||
|
{
|
||||||
|
/* centroid */
|
||||||
|
centroid = reader.readVec3fBig();
|
||||||
|
/* matIdx */
|
||||||
|
matIdx = reader.readUint32Big();
|
||||||
|
/* qDiv */
|
||||||
|
qDiv = reader.readUint16Big();
|
||||||
|
/* dlSize */
|
||||||
|
dlSize = reader.readUint16Big();
|
||||||
|
/* idxStart */
|
||||||
|
idxStart = reader.readUint32Big();
|
||||||
|
/* idxCount */
|
||||||
|
idxCount = reader.readUint32Big();
|
||||||
|
/* aabbSz */
|
||||||
|
aabbSz = reader.readUint32Big();
|
||||||
|
/* reflectionNormal */
|
||||||
|
reflectionNormal = reader.readVec3fBig();
|
||||||
|
/* aabb */
|
||||||
|
size_t remAABB = aabbSz;
|
||||||
|
if (remAABB >= 24)
|
||||||
|
{
|
||||||
|
aabb[0] = reader.readVec3fBig();
|
||||||
|
aabb[1] = reader.readVec3fBig();
|
||||||
|
remAABB -= 24;
|
||||||
|
}
|
||||||
|
reader.seek(remAABB, athena::Current);
|
||||||
|
/* align */
|
||||||
|
reader.seekAlign32();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SurfaceHeader_1::write(athena::io::IStreamWriter& writer) const
|
||||||
|
{
|
||||||
|
/* centroid */
|
||||||
|
writer.writeVec3fBig(centroid);
|
||||||
|
/* matIdx */
|
||||||
|
writer.writeUint32Big(matIdx);
|
||||||
|
/* qDiv */
|
||||||
|
writer.writeUint16Big(qDiv);
|
||||||
|
/* dlSize */
|
||||||
|
writer.writeUint16Big(dlSize);
|
||||||
|
/* idxStart */
|
||||||
|
writer.writeUint32Big(idxStart);
|
||||||
|
/* idxCount */
|
||||||
|
writer.writeUint32Big(idxCount);
|
||||||
|
/* aabbSz */
|
||||||
|
writer.writeUint32Big(aabbSz ? 24 : 0);
|
||||||
|
/* reflectionNormal */
|
||||||
|
writer.writeVec3fBig(reflectionNormal);
|
||||||
|
/* aabb */
|
||||||
|
if (aabbSz)
|
||||||
|
{
|
||||||
|
writer.writeVec3fBig(aabb[0]);
|
||||||
|
writer.writeVec3fBig(aabb[1]);
|
||||||
|
}
|
||||||
|
/* align */
|
||||||
|
writer.seekAlign32();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t SurfaceHeader_1::binarySize(size_t __isz) const
|
||||||
|
{
|
||||||
|
__isz += (aabbSz ? 24 : 0);
|
||||||
|
__isz += 44;
|
||||||
|
__isz = (__isz + 31) & ~31;
|
||||||
|
return __isz;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SurfaceHeader_2::read(athena::io::IStreamReader& reader)
|
||||||
|
{
|
||||||
|
/* centroid */
|
||||||
|
centroid = reader.readVec3fBig();
|
||||||
|
/* matIdx */
|
||||||
|
matIdx = reader.readUint32Big();
|
||||||
|
/* qDiv */
|
||||||
|
qDiv = reader.readUint16Big();
|
||||||
|
/* dlSize */
|
||||||
|
dlSize = reader.readUint16Big();
|
||||||
|
/* idxStart */
|
||||||
|
idxStart = reader.readUint32Big();
|
||||||
|
/* idxCount */
|
||||||
|
idxCount = reader.readUint32Big();
|
||||||
|
/* aabbSz */
|
||||||
|
aabbSz = reader.readUint32Big();
|
||||||
|
/* reflectionNormal */
|
||||||
|
reflectionNormal = reader.readVec3fBig();
|
||||||
|
/* skinMtxBankIdx */
|
||||||
|
skinMtxBankIdx = reader.readInt16Big();
|
||||||
|
/* surfaceGroup */
|
||||||
|
surfaceGroup = reader.readUint16Big();
|
||||||
|
/* aabb */
|
||||||
|
size_t remAABB = aabbSz;
|
||||||
|
if (remAABB >= 24)
|
||||||
|
{
|
||||||
|
aabb[0] = reader.readVec3fBig();
|
||||||
|
aabb[1] = reader.readVec3fBig();
|
||||||
|
remAABB -= 24;
|
||||||
|
}
|
||||||
|
reader.seek(remAABB, athena::Current);
|
||||||
|
/* align */
|
||||||
|
reader.seekAlign32();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SurfaceHeader_2::write(athena::io::IStreamWriter& writer) const
|
||||||
|
{
|
||||||
|
/* centroid */
|
||||||
|
writer.writeVec3fBig(centroid);
|
||||||
|
/* matIdx */
|
||||||
|
writer.writeUint32Big(matIdx);
|
||||||
|
/* qDiv */
|
||||||
|
writer.writeUint16Big(qDiv);
|
||||||
|
/* dlSize */
|
||||||
|
writer.writeUint16Big(dlSize);
|
||||||
|
/* idxStart */
|
||||||
|
writer.writeUint32Big(idxStart);
|
||||||
|
/* idxCount */
|
||||||
|
writer.writeUint32Big(idxCount);
|
||||||
|
/* aabbSz */
|
||||||
|
writer.writeUint32Big(aabbSz ? 24 : 0);
|
||||||
|
/* reflectionNormal */
|
||||||
|
writer.writeVec3fBig(reflectionNormal);
|
||||||
|
/* skinMtxBankIdx */
|
||||||
|
writer.writeInt16Big(skinMtxBankIdx);
|
||||||
|
/* surfaceGroup */
|
||||||
|
writer.writeUint16Big(surfaceGroup);
|
||||||
|
/* aabb */
|
||||||
|
if (aabbSz)
|
||||||
|
{
|
||||||
|
writer.writeVec3fBig(aabb[0]);
|
||||||
|
writer.writeVec3fBig(aabb[1]);
|
||||||
|
}
|
||||||
|
/* align */
|
||||||
|
writer.seekAlign32();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t SurfaceHeader_2::binarySize(size_t __isz) const
|
||||||
|
{
|
||||||
|
__isz += (aabbSz ? 24 : 0);
|
||||||
|
__isz += 48;
|
||||||
|
__isz = (__isz + 31) & ~31;
|
||||||
|
return __isz;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SurfaceHeader_3::read(athena::io::IStreamReader& reader)
|
||||||
|
{
|
||||||
|
/* centroid */
|
||||||
|
centroid = reader.readVec3fBig();
|
||||||
|
/* matIdx */
|
||||||
|
matIdx = reader.readUint32Big();
|
||||||
|
/* qDiv */
|
||||||
|
qDiv = reader.readUint16Big();
|
||||||
|
/* dlSize */
|
||||||
|
dlSize = reader.readUint16Big();
|
||||||
|
/* idxStart */
|
||||||
|
idxStart = reader.readUint32Big();
|
||||||
|
/* idxCount */
|
||||||
|
idxCount = reader.readUint32Big();
|
||||||
|
/* aabbSz */
|
||||||
|
aabbSz = reader.readUint32Big();
|
||||||
|
/* reflectionNormal */
|
||||||
|
reflectionNormal = reader.readVec3fBig();
|
||||||
|
/* skinMtxBankIdx */
|
||||||
|
skinMtxBankIdx = reader.readInt16Big();
|
||||||
|
/* surfaceGroup */
|
||||||
|
surfaceGroup = reader.readUint16Big();
|
||||||
|
/* aabb */
|
||||||
|
size_t remAABB = aabbSz;
|
||||||
|
if (remAABB >= 24)
|
||||||
|
{
|
||||||
|
aabb[0] = reader.readVec3fBig();
|
||||||
|
aabb[1] = reader.readVec3fBig();
|
||||||
|
remAABB -= 24;
|
||||||
|
}
|
||||||
|
reader.seek(remAABB, athena::Current);
|
||||||
|
/* unk3 */
|
||||||
|
unk3 = reader.readUByte();
|
||||||
|
/* align */
|
||||||
|
reader.seekAlign32();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SurfaceHeader_3::write(athena::io::IStreamWriter& writer) const
|
||||||
|
{
|
||||||
|
/* centroid */
|
||||||
|
writer.writeVec3fBig(centroid);
|
||||||
|
/* matIdx */
|
||||||
|
writer.writeUint32Big(matIdx);
|
||||||
|
/* qDiv */
|
||||||
|
writer.writeUint16Big(qDiv);
|
||||||
|
/* dlSize */
|
||||||
|
writer.writeUint16Big(dlSize);
|
||||||
|
/* idxStart */
|
||||||
|
writer.writeUint32Big(idxStart);
|
||||||
|
/* idxCount */
|
||||||
|
writer.writeUint32Big(idxCount);
|
||||||
|
/* aabbSz */
|
||||||
|
writer.writeUint32Big(aabbSz ? 24 : 0);
|
||||||
|
/* reflectionNormal */
|
||||||
|
writer.writeVec3fBig(reflectionNormal);
|
||||||
|
/* skinMtxBankIdx */
|
||||||
|
writer.writeInt16Big(skinMtxBankIdx);
|
||||||
|
/* surfaceGroup */
|
||||||
|
writer.writeUint16Big(surfaceGroup);
|
||||||
|
/* aabb */
|
||||||
|
if (aabbSz)
|
||||||
|
{
|
||||||
|
writer.writeVec3fBig(aabb[0]);
|
||||||
|
writer.writeVec3fBig(aabb[1]);
|
||||||
|
}
|
||||||
|
/* unk3 */
|
||||||
|
writer.writeUByte(unk3);
|
||||||
|
/* align */
|
||||||
|
writer.seekAlign32();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t SurfaceHeader_3::binarySize(size_t __isz) const
|
||||||
|
{
|
||||||
|
__isz += (aabbSz ? 24 : 0);
|
||||||
|
__isz += 49;
|
||||||
|
__isz = (__isz + 31) & ~31;
|
||||||
|
return __isz;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ struct Header : BigDNA
|
||||||
|
|
||||||
struct SurfaceHeader_1 : BigDNA
|
struct SurfaceHeader_1 : BigDNA
|
||||||
{
|
{
|
||||||
DECL_DNA
|
DECL_EXPLICIT_DNA
|
||||||
Value<atVec3f> centroid;
|
Value<atVec3f> centroid;
|
||||||
Value<atUint32> matIdx = 0;
|
Value<atUint32> matIdx = 0;
|
||||||
Value<atUint16> qDiv = 0x8000;
|
Value<atUint16> qDiv = 0x8000;
|
||||||
|
@ -49,7 +49,7 @@ struct SurfaceHeader_1 : BigDNA
|
||||||
Value<atUint32> idxCount = 0; /* Actually used by game to stash next CCubeSurface pointer */
|
Value<atUint32> idxCount = 0; /* Actually used by game to stash next CCubeSurface pointer */
|
||||||
Value<atUint32> aabbSz = 0;
|
Value<atUint32> aabbSz = 0;
|
||||||
Value<atVec3f> reflectionNormal;
|
Value<atVec3f> reflectionNormal;
|
||||||
Seek<DNA_COUNT(aabbSz), athena::Current> seek2;
|
Value<atVec3f> aabb[2];
|
||||||
Align<32> align;
|
Align<32> align;
|
||||||
|
|
||||||
static constexpr bool UseMatrixSkinning() {return false;}
|
static constexpr bool UseMatrixSkinning() {return false;}
|
||||||
|
@ -58,7 +58,7 @@ struct SurfaceHeader_1 : BigDNA
|
||||||
|
|
||||||
struct SurfaceHeader_2 : BigDNA
|
struct SurfaceHeader_2 : BigDNA
|
||||||
{
|
{
|
||||||
DECL_DNA
|
DECL_EXPLICIT_DNA
|
||||||
Value<atVec3f> centroid;
|
Value<atVec3f> centroid;
|
||||||
Value<atUint32> matIdx = 0;
|
Value<atUint32> matIdx = 0;
|
||||||
Value<atUint16> qDiv = 0x8000;
|
Value<atUint16> qDiv = 0x8000;
|
||||||
|
@ -69,7 +69,7 @@ struct SurfaceHeader_2 : BigDNA
|
||||||
Value<atVec3f> reflectionNormal;
|
Value<atVec3f> reflectionNormal;
|
||||||
Value<atInt16> skinMtxBankIdx;
|
Value<atInt16> skinMtxBankIdx;
|
||||||
Value<atUint16> surfaceGroup;
|
Value<atUint16> surfaceGroup;
|
||||||
Seek<DNA_COUNT(aabbSz), athena::Current> seek2;
|
Value<atVec3f> aabb[2];
|
||||||
Align<32> align;
|
Align<32> align;
|
||||||
|
|
||||||
static constexpr bool UseMatrixSkinning() {return false;}
|
static constexpr bool UseMatrixSkinning() {return false;}
|
||||||
|
@ -78,7 +78,7 @@ struct SurfaceHeader_2 : BigDNA
|
||||||
|
|
||||||
struct SurfaceHeader_3 : BigDNA
|
struct SurfaceHeader_3 : BigDNA
|
||||||
{
|
{
|
||||||
DECL_DNA
|
DECL_EXPLICIT_DNA
|
||||||
Value<atVec3f> centroid;
|
Value<atVec3f> centroid;
|
||||||
Value<atUint32> matIdx = 0;
|
Value<atUint32> matIdx = 0;
|
||||||
Value<atUint16> qDiv = 0x8000;
|
Value<atUint16> qDiv = 0x8000;
|
||||||
|
@ -89,7 +89,7 @@ struct SurfaceHeader_3 : BigDNA
|
||||||
Value<atVec3f> reflectionNormal;
|
Value<atVec3f> reflectionNormal;
|
||||||
Value<atInt16> skinMtxBankIdx;
|
Value<atInt16> skinMtxBankIdx;
|
||||||
Value<atUint16> surfaceGroup;
|
Value<atUint16> surfaceGroup;
|
||||||
Seek<DNA_COUNT(aabbSz), athena::Current> seek2;
|
Value<atVec3f> aabb[2];
|
||||||
Value<atUint8> unk3;
|
Value<atUint8> unk3;
|
||||||
Align<32> align;
|
Align<32> align;
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "CTexture.hpp"
|
#include "CTexture.hpp"
|
||||||
#include "CModel.hpp"
|
#include "CModel.hpp"
|
||||||
#include "Particle/CParticleGen.hpp"
|
#include "Particle/CParticleGen.hpp"
|
||||||
|
#include "CMetroidModelInstance.hpp"
|
||||||
|
|
||||||
#define MIRROR_RAMP_RES 32
|
#define MIRROR_RAMP_RES 32
|
||||||
#define FOGVOL_RAMP_RES 256
|
#define FOGVOL_RAMP_RES 256
|
||||||
|
@ -138,6 +139,13 @@ void Buckets::Init()
|
||||||
sMinMaxDistance[1] = skWorstMinMaxDistance[1];
|
sMinMaxDistance[1] = skWorstMinMaxDistance[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CBooRenderer::CAreaListItem::CAreaListItem
|
||||||
|
(const std::vector<CMetroidModelInstance>* geom, const CAreaOctTree* octTree,
|
||||||
|
std::vector<CBooModel*>&& models, int unk)
|
||||||
|
: x0_geometry(geom), x4_octTree(octTree), x10_models(std::move(models)), x18_unk(unk) {}
|
||||||
|
|
||||||
|
CBooRenderer::CAreaListItem::~CAreaListItem() {}
|
||||||
|
|
||||||
void CBooRenderer::RenderBucketItems(const std::vector<CLight>& lights)
|
void CBooRenderer::RenderBucketItems(const std::vector<CLight>& lights)
|
||||||
{
|
{
|
||||||
for (u16 idx : Buckets::sBucketIndex)
|
for (u16 idx : Buckets::sBucketIndex)
|
||||||
|
@ -256,12 +264,49 @@ CBooRenderer::CBooRenderer(IObjectStore& store, IFactory& resFac)
|
||||||
Buckets::Init();
|
Buckets::Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::AddStaticGeometry(const std::vector<CMetroidModelInstance>&, const CAreaOctTree*, int)
|
void CBooRenderer::AddWorldSurfaces(CBooModel& model)
|
||||||
{
|
{
|
||||||
|
CBooSurface* surf = model.x3c_firstSortedSurface;
|
||||||
|
while (surf)
|
||||||
|
{
|
||||||
|
const CBooModel::MaterialSet::Material& mat = model.GetMaterialByIndex(surf->selfIdx);
|
||||||
|
zeus::CAABox aabb = surf->GetBounds();
|
||||||
|
zeus::CVector3f pt = aabb.closestPointAlongVector(xb0_.vec);
|
||||||
|
Buckets::Insert(pt, aabb, EDrawableType::Surface, surf, xb0_,
|
||||||
|
mat.heclIr.m_blendDst != boo::BlendFactor::Zero);
|
||||||
|
surf = surf->m_next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::RemoveStaticGeometry(const std::vector<CMetroidModelInstance>&)
|
std::list<CBooRenderer::CAreaListItem>::iterator
|
||||||
|
CBooRenderer::FindStaticGeometry(const std::vector<CMetroidModelInstance>* geometry)
|
||||||
{
|
{
|
||||||
|
return std::find_if(x1c_areaListItems.begin(), x1c_areaListItems.end(),
|
||||||
|
[&](CAreaListItem& item) -> bool {return item.x0_geometry == geometry;});
|
||||||
|
}
|
||||||
|
|
||||||
|
void CBooRenderer::AddStaticGeometry(const std::vector<CMetroidModelInstance>* geometry,
|
||||||
|
const CAreaOctTree* octTree, int unk)
|
||||||
|
{
|
||||||
|
auto search = FindStaticGeometry(geometry);
|
||||||
|
if (search == x1c_areaListItems.end())
|
||||||
|
{
|
||||||
|
std::vector<CBooModel*> models;
|
||||||
|
if (geometry->size())
|
||||||
|
{
|
||||||
|
models.reserve(geometry->size());
|
||||||
|
for (const CMetroidModelInstance& inst : *geometry)
|
||||||
|
models.push_back(inst.m_instance.get());
|
||||||
|
}
|
||||||
|
x1c_areaListItems.emplace_back(geometry, octTree, std::move(models), unk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CBooRenderer::RemoveStaticGeometry(const std::vector<CMetroidModelInstance>* geometry)
|
||||||
|
{
|
||||||
|
auto search = FindStaticGeometry(geometry);
|
||||||
|
if (search != x1c_areaListItems.end())
|
||||||
|
x1c_areaListItems.erase(search);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::DrawUnsortedGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int)
|
void CBooRenderer::DrawUnsortedGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int)
|
||||||
|
@ -270,6 +315,7 @@ void CBooRenderer::DrawUnsortedGeometry(const std::vector<CLight>&, int, unsigne
|
||||||
|
|
||||||
void CBooRenderer::DrawSortedGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int)
|
void CBooRenderer::DrawSortedGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int)
|
||||||
{
|
{
|
||||||
|
//SetupRendererStates();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::DrawStaticGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int)
|
void CBooRenderer::DrawStaticGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int)
|
||||||
|
@ -280,20 +326,33 @@ void CBooRenderer::PostRenderFogs()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::AddParticleGen(const CElementGen&)
|
void CBooRenderer::AddParticleGen(const CParticleGen& gen)
|
||||||
{
|
{
|
||||||
|
std::pair<zeus::CAABox, bool> bounds = gen.GetBounds();
|
||||||
|
if (bounds.second)
|
||||||
|
{
|
||||||
|
zeus::CVector3f pt = bounds.first.closestPointAlongVector(xb0_.vec);
|
||||||
|
Buckets::Insert(pt, bounds.first, EDrawableType::Particle, &gen, xb0_, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::AddPlaneObject(const void*, const zeus::CAABox&, const zeus::CPlane&, int)
|
void CBooRenderer::AddPlaneObject(const void*, const zeus::CAABox&, const zeus::CPlane&, int)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::AddDrawable(const void*, const zeus::CVector3f&, const zeus::CAABox&, int, EDrawableSorting)
|
void CBooRenderer::AddDrawable(const void* obj, const zeus::CVector3f& pos, const zeus::CAABox& aabb, int mode, EDrawableSorting sorting)
|
||||||
{
|
{
|
||||||
|
if (sorting == EDrawableSorting::UnsortedCallback)
|
||||||
|
xa8_renderCallback(obj, xac_callbackContext, mode);
|
||||||
|
else
|
||||||
|
Buckets::Insert(pos, aabb, EDrawableType(mode + 2), obj, xb0_, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::SetDrawableCallback(TDrawableCallback, const void*)
|
void CBooRenderer::SetDrawableCallback(TDrawableCallback&& cb, const void* ctx)
|
||||||
{
|
{
|
||||||
|
xa8_renderCallback = std::move(cb);
|
||||||
|
xac_callbackContext = ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::SetWorldViewpoint(const zeus::CTransform&)
|
void CBooRenderer::SetWorldViewpoint(const zeus::CTransform&)
|
||||||
|
@ -316,8 +375,9 @@ void CBooRenderer::SetViewportOrtho(bool, float, float)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::SetClippingPlanes(const zeus::CFrustum&)
|
void CBooRenderer::SetClippingPlanes(const zeus::CFrustum& frustum)
|
||||||
{
|
{
|
||||||
|
x44_frustumPlanes = frustum;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::SetViewport(int, int, int, int)
|
void CBooRenderer::SetViewport(int, int, int, int)
|
||||||
|
|
|
@ -14,6 +14,8 @@ class IObjectStore;
|
||||||
class CMemorySys;
|
class CMemorySys;
|
||||||
class IFactory;
|
class IFactory;
|
||||||
class CTexture;
|
class CTexture;
|
||||||
|
class CParticleGen;
|
||||||
|
class CBooModel;
|
||||||
|
|
||||||
class Buckets
|
class Buckets
|
||||||
{
|
{
|
||||||
|
@ -40,19 +42,34 @@ public:
|
||||||
|
|
||||||
class CBooRenderer : public IRenderer
|
class CBooRenderer : public IRenderer
|
||||||
{
|
{
|
||||||
|
struct CAreaListItem
|
||||||
|
{
|
||||||
|
const std::vector<CMetroidModelInstance>* x0_geometry;
|
||||||
|
const CAreaOctTree* x4_octTree;
|
||||||
|
//std::vector<TCachedToken<CTexture>> x8_textures;
|
||||||
|
std::vector<CBooModel*> x10_models;
|
||||||
|
int x18_unk;
|
||||||
|
int x20_unk1 = 0;
|
||||||
|
int x24_unk2 = 0;
|
||||||
|
int x28_unk3 = 0;
|
||||||
|
|
||||||
|
CAreaListItem(const std::vector<CMetroidModelInstance>* geom, const CAreaOctTree* octTree,
|
||||||
|
std::vector<CBooModel*>&& models, int unk);
|
||||||
|
~CAreaListItem();
|
||||||
|
};
|
||||||
|
|
||||||
IFactory& x8_factory;
|
IFactory& x8_factory;
|
||||||
IObjectStore& xc_store;
|
IObjectStore& xc_store;
|
||||||
boo::GraphicsDataToken m_gfxToken;
|
boo::GraphicsDataToken m_gfxToken;
|
||||||
// CFont x10_fnt;
|
// CFont x10_fnt;
|
||||||
u32 x18_ = 0;
|
u32 x18_ = 0;
|
||||||
std::list<u32> x1c_;
|
std::list<CAreaListItem> x1c_areaListItems;
|
||||||
zeus::CFrustum x44_frustumPlanes;
|
zeus::CFrustum x44_frustumPlanes;
|
||||||
|
|
||||||
TDrawableCallback xa8_renderCallback;
|
TDrawableCallback xa8_renderCallback;
|
||||||
const void* xac_callbackContext;
|
const void* xac_callbackContext;
|
||||||
|
|
||||||
zeus::CVector3f xb0_ = {0.f, 1.f, 0.f};
|
zeus::CPlane xb0_ = {0.f, 1.f, 0.f, 0.f};
|
||||||
float xbc_ = 0;
|
|
||||||
|
|
||||||
//boo::ITextureS* xe4_blackTex = nullptr;
|
//boo::ITextureS* xe4_blackTex = nullptr;
|
||||||
bool xee_24_ : 1;
|
bool xee_24_ : 1;
|
||||||
|
@ -100,22 +117,25 @@ class CBooRenderer : public IRenderer
|
||||||
public:
|
public:
|
||||||
CBooRenderer(IObjectStore& store, IFactory& resFac);
|
CBooRenderer(IObjectStore& store, IFactory& resFac);
|
||||||
|
|
||||||
void AddStaticGeometry(const std::vector<CMetroidModelInstance>&, const CAreaOctTree*, int);
|
void AddWorldSurfaces(CBooModel& model);
|
||||||
void RemoveStaticGeometry(const std::vector<CMetroidModelInstance>&);
|
|
||||||
|
std::list<CAreaListItem>::iterator FindStaticGeometry(const std::vector<CMetroidModelInstance>*);
|
||||||
|
void AddStaticGeometry(const std::vector<CMetroidModelInstance>*, const CAreaOctTree*, int);
|
||||||
|
void RemoveStaticGeometry(const std::vector<CMetroidModelInstance>*);
|
||||||
void DrawUnsortedGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int);
|
void DrawUnsortedGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int);
|
||||||
void DrawSortedGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int);
|
void DrawSortedGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int);
|
||||||
void DrawStaticGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int);
|
void DrawStaticGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int);
|
||||||
void PostRenderFogs();
|
void PostRenderFogs();
|
||||||
void AddParticleGen(const CElementGen&);
|
void AddParticleGen(const CParticleGen&);
|
||||||
void AddPlaneObject(const void*, const zeus::CAABox&, const zeus::CPlane&, int);
|
void AddPlaneObject(const void*, const zeus::CAABox&, const zeus::CPlane&, int);
|
||||||
void AddDrawable(void const *, const zeus::CVector3f&, const zeus::CAABox&, int, EDrawableSorting);
|
void AddDrawable(void const *, const zeus::CVector3f&, const zeus::CAABox&, int, EDrawableSorting);
|
||||||
void SetDrawableCallback(TDrawableCallback, const void*);
|
void SetDrawableCallback(TDrawableCallback&&, const void*);
|
||||||
void SetWorldViewpoint(const zeus::CTransform&);
|
void SetWorldViewpoint(const zeus::CTransform&);
|
||||||
void SetPerspectiveFovScalar(float);
|
void SetPerspectiveFovScalar(float);
|
||||||
void SetPerspective(float, float, float, float, float);
|
void SetPerspective(float, float, float, float, float);
|
||||||
void SetPerspective(float, float, float, float);
|
void SetPerspective(float, float, float, float);
|
||||||
void SetViewportOrtho(bool, float, float);
|
void SetViewportOrtho(bool, float, float);
|
||||||
void SetClippingPlanes(const zeus::CFrustum&);
|
void SetClippingPlanes(const zeus::CFrustum& frustum);
|
||||||
void SetViewport(int, int, int, int);
|
void SetViewport(int, int, int, int);
|
||||||
void SetDepthReadWrite(bool, bool);
|
void SetDepthReadWrite(bool, bool);
|
||||||
void SetBlendMode_AdditiveAlpha();
|
void SetBlendMode_AdditiveAlpha();
|
||||||
|
|
|
@ -11,7 +11,7 @@ set(GRAPHICS_SOURCES
|
||||||
CDrawable.hpp CDrawable.cpp
|
CDrawable.hpp CDrawable.cpp
|
||||||
CDrawablePlaneObject.hpp CDrawablePlaneObject.cpp
|
CDrawablePlaneObject.hpp CDrawablePlaneObject.cpp
|
||||||
CLineRenderer.hpp CLineRenderer.cpp
|
CLineRenderer.hpp CLineRenderer.cpp
|
||||||
CMetroidModelInstance.hpp
|
CMetroidModelInstance.hpp CMetroidModelInstance.cpp
|
||||||
CLight.hpp CLight.cpp
|
CLight.hpp CLight.cpp
|
||||||
CTexture.hpp CTextureBoo.cpp
|
CTexture.hpp CTextureBoo.cpp
|
||||||
CModel.hpp CModelBoo.cpp
|
CModel.hpp CModelBoo.cpp
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
#include "CMetroidModelInstance.hpp"
|
||||||
|
#include "CModel.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
CMetroidModelInstance::CMetroidModelInstance
|
||||||
|
(const void* modelHeader, std::unique_ptr<CBooModel>&& inst)
|
||||||
|
: x0_visorFlags(hecl::SBig(*static_cast<const u32*>(modelHeader))), m_instance(std::move(inst))
|
||||||
|
{
|
||||||
|
athena::io::MemoryReader r(static_cast<const u8*>(modelHeader) + 4, INT32_MAX);
|
||||||
|
x4_xf.read34RowMajor(r);
|
||||||
|
x34_aabb.readBoundingBoxBig(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
CMetroidModelInstance::~CMetroidModelInstance() {}
|
||||||
|
|
||||||
|
}
|
|
@ -1,11 +1,26 @@
|
||||||
#ifndef __URDE_CMETROIDMODELINSTANCE_HPP__
|
#ifndef __URDE_CMETROIDMODELINSTANCE_HPP__
|
||||||
#define __URDE_CMETROIDMODELINSTANCE_HPP__
|
#define __URDE_CMETROIDMODELINSTANCE_HPP__
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "RetroTypes.hpp"
|
||||||
|
#include "zeus/CTransform.hpp"
|
||||||
|
#include "zeus/CAABox.hpp"
|
||||||
|
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
class CBooModel;
|
||||||
|
|
||||||
class CMetroidModelInstance
|
class CMetroidModelInstance
|
||||||
{
|
{
|
||||||
|
friend class CBooRenderer;
|
||||||
|
|
||||||
|
int x0_visorFlags;
|
||||||
|
zeus::CTransform x4_xf;
|
||||||
|
zeus::CAABox x34_aabb;
|
||||||
|
std::unique_ptr<CBooModel> m_instance;
|
||||||
|
public:
|
||||||
|
CMetroidModelInstance(const void* modelHeader, std::unique_ptr<CBooModel>&& inst);
|
||||||
|
~CMetroidModelInstance();
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,14 @@ struct CBooSurface
|
||||||
size_t selfIdx;
|
size_t selfIdx;
|
||||||
class CBooModel* m_parent = nullptr;
|
class CBooModel* m_parent = nullptr;
|
||||||
CBooSurface* m_next = nullptr;
|
CBooSurface* m_next = nullptr;
|
||||||
|
|
||||||
|
zeus::CAABox GetBounds() const
|
||||||
|
{
|
||||||
|
if (!m_data.aabbSz)
|
||||||
|
return zeus::CAABox(m_data.centroid, m_data.centroid);
|
||||||
|
else
|
||||||
|
return zeus::CAABox(m_data.aabb[0], m_data.aabb[1]);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class CBooModel
|
class CBooModel
|
||||||
|
|
|
@ -14,7 +14,7 @@ namespace urde
|
||||||
class CMetroidModelInstance;
|
class CMetroidModelInstance;
|
||||||
class CLight;
|
class CLight;
|
||||||
class CAreaOctTree;
|
class CAreaOctTree;
|
||||||
class CElementGen;
|
class CParticleGen;
|
||||||
class CModel;
|
class CModel;
|
||||||
class CSkinnedModel;
|
class CSkinnedModel;
|
||||||
|
|
||||||
|
@ -26,6 +26,8 @@ public:
|
||||||
|
|
||||||
enum class EDrawableSorting
|
enum class EDrawableSorting
|
||||||
{
|
{
|
||||||
|
SortedBuckets,
|
||||||
|
UnsortedCallback
|
||||||
};
|
};
|
||||||
enum class EDebugOption
|
enum class EDebugOption
|
||||||
{
|
{
|
||||||
|
@ -38,16 +40,16 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual ~IRenderer() = default;
|
virtual ~IRenderer() = default;
|
||||||
virtual void AddStaticGeometry(const std::vector<CMetroidModelInstance>&, const CAreaOctTree*, int)=0;
|
virtual void AddStaticGeometry(const std::vector<CMetroidModelInstance>*, const CAreaOctTree*, int)=0;
|
||||||
virtual void RemoveStaticGeometry(const std::vector<CMetroidModelInstance>&)=0;
|
virtual void RemoveStaticGeometry(const std::vector<CMetroidModelInstance>*)=0;
|
||||||
virtual void DrawUnsortedGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int)=0;
|
virtual void DrawUnsortedGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int)=0;
|
||||||
virtual void DrawSortedGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int)=0;
|
virtual void DrawSortedGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int)=0;
|
||||||
virtual void DrawStaticGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int)=0;
|
virtual void DrawStaticGeometry(const std::vector<CLight>&, int, unsigned int, unsigned int)=0;
|
||||||
virtual void PostRenderFogs()=0;
|
virtual void PostRenderFogs()=0;
|
||||||
virtual void AddParticleGen(const CElementGen&)=0;
|
virtual void AddParticleGen(const CParticleGen&)=0;
|
||||||
virtual void AddPlaneObject(const void*, const zeus::CAABox&, const zeus::CPlane&, int)=0;
|
virtual void AddPlaneObject(const void*, const zeus::CAABox&, const zeus::CPlane&, int)=0;
|
||||||
virtual void AddDrawable(void const *, const zeus::CVector3f&, const zeus::CAABox&, int, EDrawableSorting)=0;
|
virtual void AddDrawable(void const *, const zeus::CVector3f&, const zeus::CAABox&, int, EDrawableSorting)=0;
|
||||||
virtual void SetDrawableCallback(TDrawableCallback, const void*)=0;
|
virtual void SetDrawableCallback(TDrawableCallback&&, const void*)=0;
|
||||||
virtual void SetWorldViewpoint(const zeus::CTransform&)=0;
|
virtual void SetWorldViewpoint(const zeus::CTransform&)=0;
|
||||||
virtual void SetPerspectiveFovScalar(float)=0;
|
virtual void SetPerspectiveFovScalar(float)=0;
|
||||||
virtual void SetPerspective(float, float, float, float, float)=0;
|
virtual void SetPerspective(float, float, float, float, float)=0;
|
||||||
|
|
2
hecl
2
hecl
|
@ -1 +1 @@
|
||||||
Subproject commit 3f867ce409fa74e6ec33135bf2d294d4fd1d198f
|
Subproject commit 412af8a3e14d301927bfce72aecebd44cbbb3a0d
|
Loading…
Reference in New Issue