prime/include/MetroidPrime/CMapWorld.hpp

172 lines
7.0 KiB
C++
Raw Normal View History

2024-10-17 05:02:14 +00:00
#ifndef _CMAPWORLD
#define _CMAPWORLD
#include "Kyoto/Graphics/CColor.hpp"
#include "MetroidPrime/CMapArea.hpp"
class CStateManager;
class CMapWorld {
public:
/* skDrawProfileItemNames; */
enum EMapAreaList { kMAL_Loaded, kMAL_Loading, kMAL_Unloaded };
class CMapAreaBFSInfo {
int x0_areaIdx;
int x4_depth;
float x8_surfDrawDepth;
float xc_outlineDrawDepth;
public:
CMapAreaBFSInfo(int areaIdx, int depth, float a, float b)
: x0_areaIdx(areaIdx), x4_depth(depth), x8_surfDrawDepth(a), xc_outlineDrawDepth(b) {}
int GetAreaIndex() const { return x0_areaIdx; }
int GetDepth() const { return x4_depth; }
float GetOutlineDrawDepth() const { return x8_surfDrawDepth; }
float GetSurfaceDrawDepth() const { return xc_outlineDrawDepth; }
};
class CMapObjectSortInfo {
float x0_zDist;
int x4_areaIdx;
int x8_typeAndIdx;
CColor xc_surfColor;
CColor x10_outlineColor;
public:
enum EObjectCode {
kOC_Invalid = -1,
kOC_Object = 1 << 16,
kOC_DoorSurface = 2 << 16,
kOC_Door = 3 << 16,
kOC_Surface = 4 << 16
};
CMapObjectSortInfo(float zDist, int areaIdx, EObjectCode type, int idx, const CColor& surfColor,
const CColor& outlineColor)
: x0_zDist(zDist)
, x4_areaIdx(areaIdx)
, x8_typeAndIdx(int(type) | idx)
, xc_surfColor(surfColor)
, x10_outlineColor(outlineColor) {}
const CColor& GetOutlineColor() const { return x10_outlineColor; }
const CColor& GetSurfaceColor() const { return xc_surfColor; }
uint GetLocalObjectIndex() const { return x8_typeAndIdx & 0xffff; }
EObjectCode GetObjectCode() const { return EObjectCode(x8_typeAndIdx & 0xffff0000); }
uint GetAreaIndex() const { return x4_areaIdx; }
float GetZDistance() const { return x0_zDist; }
};
class CMapAreaData {
int x0_areaIdx;
TCachedToken< CMapArea > x4_area;
EMapAreaList x10_list;
CMapAreaData* x14_next;
public:
CMapAreaData(CAssetId areaRes, EMapAreaList list, CMapAreaData* next);
void Lock() { x4_area.Lock(); }
void Unlock() { x4_area.Unlock(); }
bool IsLoaded() const { return x4_area.IsLoaded(); }
CMapArea* MapArea() { return x4_area.GetT(); }
const CMapArea* GetMapArea() const { return x4_area.GetObject(); }
CMapAreaData* GetNextMapAreaData() { return x14_next; }
const CMapAreaData* GetNextMapAreaData() const { return x14_next; }
EMapAreaList GetContainingList() const { return x10_list; }
void SetContainingList(EMapAreaList list) { x10_list = list; }
void SetNextMapArea(CMapAreaData* next) { x14_next = next; }
};
class CMapWorldDrawParms {
float x0_alphaSurfVisited;
float x4_alphaOlVisited;
float x8_alphaSurfUnvisited;
float xc_alphaOlUnvisited;
float x10_alpha;
float x14_outlineWidthScale;
const CStateManager& x18_mgr;
const CTransform4f& x1c_modelXf;
const CTransform4f& x20_viewXf;
const IWorld& x24_wld;
const CMapWorldInfo& x28_mwInfo;
float x2c_playerFlashIntensity;
float x30_hintFlashIntensity;
float x34_objectScale;
bool x38_sortDoorSurfs;
public:
CMapWorldDrawParms(float alphaSurfVisited, float alphaOlVisited, float alphaSurfUnvisited,
float alphaOlUnvisited, float alpha, float outlineWidthScale,
const CStateManager& mgr, const CTransform4f& modelXf,
const CTransform4f& viewXf, const IWorld& wld, const CMapWorldInfo& mwInfo,
float playerFlash, float hintFlash, float objectScale, bool sortDoorSurfs)
: x0_alphaSurfVisited(alphaSurfVisited)
, x4_alphaOlVisited(alphaOlVisited)
, x8_alphaSurfUnvisited(alphaSurfUnvisited)
, xc_alphaOlUnvisited(alphaOlUnvisited)
, x10_alpha(alpha)
, x14_outlineWidthScale(outlineWidthScale)
, x18_mgr(mgr)
, x1c_modelXf(modelXf)
, x20_viewXf(viewXf)
, x24_wld(wld)
, x28_mwInfo(mwInfo)
, x2c_playerFlashIntensity(playerFlash)
, x30_hintFlashIntensity(hintFlash)
, x34_objectScale(objectScale)
, x38_sortDoorSurfs(sortDoorSurfs) {}
const IWorld& GetWorld() const { return x24_wld; }
float GetOutlineWidthScale() const { return x14_outlineWidthScale; }
const CTransform4f& GetPlaneProjectionTransform() const { return x1c_modelXf; }
float GetHintAreaFlashIntensity() const { return x30_hintFlashIntensity; }
float GetPlayerAreaFlashIntensity() const { return x2c_playerFlashIntensity; }
const CTransform4f& GetCameraTransform() const { return x20_viewXf; }
float GetAlphaOutlineUnvisited() const { return xc_alphaOlUnvisited; }
float GetAlphaSurfaceUnvisited() const { return x8_alphaSurfUnvisited; }
float GetAlphaOutlineVisited() const { return x4_alphaOlVisited; }
float GetAlphaSurfaceVisited() const { return x0_alphaSurfVisited; }
float GetAlpha() const { return x10_alpha; }
const CMapWorldInfo& GetMapWorldInfo() const { return x28_mwInfo; }
const CStateManager& GetStateManager() const { return x18_mgr; }
bool GetIsSortDoorSurfaces() const { return x38_sortDoorSurfs; }
float GetObjectScale() const { return x34_objectScale; }
};
private:
rstl::vector< CMapAreaData > x0_areas;
rstl::reserved_vector< CMapAreaData*, 3 > x10_listHeads;
rstl::vector< bool > x20_traversed;
CVector3f x30_worldSpherePoint;
float x3c_worldSphereRadius;
float x40_worldSphereHalfDepth;
public:
explicit CMapWorld(CInputStream& in);
uint GetNumAreas() const { return x0_areas.size(); }
CMapArea* GetMapArea(int aid) { return x0_areas[aid].MapArea(); }
const CMapArea* GetMapArea(int aid) const { return x0_areas[aid].GetMapArea(); }
bool IsMapAreaInBFSInfoVector(const CMapAreaData* area,
const rstl::vector< CMapAreaBFSInfo >& vec) const;
void SetWhichMapAreasLoaded(const IWorld& wld, int start, int count);
bool IsMapAreasStreaming();
void MoveMapAreaToList(CMapAreaData* data, EMapAreaList list);
int GetCurrentMapAreaDepth(const IWorld& wld, TAreaId aid);
rstl::vector< int > GetVisibleAreas(const IWorld& wld, const CMapWorldInfo& mwInfo) const;
void Draw(const CMapWorldDrawParms& parms, int curArea, int otherArea, float depth1, float depth2,
bool inMapScreen);
void DoBFS(const IWorld& wld, int startArea, int areaCount, float surfDepth, float outlineDepth,
bool checkLoad, rstl::vector< CMapAreaBFSInfo >& bfsInfos);
bool IsMapAreaValid(const IWorld& wld, int areaIdx, bool checkLoad) const;
void DrawAreas(const CMapWorldDrawParms& parms, int selArea,
const rstl::vector< CMapAreaBFSInfo >& bfsInfos, bool inMapScreen);
void RecalculateWorldSphere(const CMapWorldInfo& mwInfo, const IWorld& wld);
CVector3f ConstrainToWorldVolume(const CVector3f& point, const CVector3f& lookVec) const;
void ClearTraversedFlags();
void SetWhichMapAreasLoaded(const IWorld& wld, int start, int count, bool load);
bool IsMapAreasStreaming() const;
};
NESTED_CHECK_SIZEOF(CMapWorld, CMapAreaData, 0x18)
CHECK_SIZEOF(CMapWorld, 0x44)
#endif // _CMAPWORLD