metaforce/Runtime/AutoMapper/CMapWorld.hpp

178 lines
7.3 KiB
C++
Raw Normal View History

#ifndef __URDE_CMAPWORLD_HPP__
#define __URDE_CMAPWORLD_HPP__
#include "RetroTypes.hpp"
2016-07-29 17:00:23 +00:00
#include "CToken.hpp"
2016-07-28 07:33:55 +00:00
#include "zeus/CColor.hpp"
#include "zeus/CVector3f.hpp"
#include "zeus/CTransform.hpp"
2017-03-20 06:59:46 +00:00
#include "CMapArea.hpp"
namespace urde
{
class IWorld;
2016-07-28 07:33:55 +00:00
class CMapWorldInfo;
class CStateManager;
class CMapWorld
{
public:
2016-07-28 07:33:55 +00:00
/* skDrawProfileItemNames; */
enum class EMapAreaList
{
2017-04-22 06:42:32 +00:00
Loaded,
Loading,
Unloaded
2016-07-28 07:33:55 +00:00
};
class CMapAreaBFSInfo
{
2017-04-22 06:42:32 +00:00
int x0_areaIdx;
int x4_depth;
float x8_surfDrawDepth;
float xc_outlineDrawDepth;
2016-07-28 07:33:55 +00:00
public:
2017-04-22 06:42:32 +00:00
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; }
2016-07-28 07:33:55 +00:00
};
class CMapObjectSortInfo
{
2017-04-22 06:42:32 +00:00
float x0_zDist;
int x4_areaIdx;
int x8_typeAndIdx;
zeus::CColor xc_surfColor;
zeus::CColor x10_outlineColor;
2016-07-28 07:33:55 +00:00
public:
enum class EObjectCode
{
Invalid = -1,
2017-04-22 21:46:18 +00:00
Object = 1 << 16,
DoorSurface = 2 << 16,
Door = 3 << 16,
Surface = 4 << 16
2016-07-28 07:33:55 +00:00
};
2017-04-22 06:42:32 +00:00
CMapObjectSortInfo(float zDist, int areaIdx, EObjectCode type, int idx,
const zeus::CColor& surfColor, const zeus::CColor& outlineColor)
: x0_zDist(zDist), x4_areaIdx(areaIdx), x8_typeAndIdx(int(type) | idx),
xc_surfColor(surfColor), x10_outlineColor(outlineColor) {}
const zeus::CColor& GetOutlineColor() const { return x10_outlineColor; }
const zeus::CColor& GetSurfaceColor() const { return xc_surfColor; }
u32 GetLocalObjectIndex() const { return x8_typeAndIdx & 0xffff; }
EObjectCode GetObjectCode() const { return EObjectCode(x8_typeAndIdx & 0xffff0000); }
u32 GetAreaIndex() const { return x4_areaIdx; }
float GetZDistance() const { return x0_zDist; }
2016-07-28 07:33:55 +00:00
};
class CMapAreaData
{
2016-07-29 17:00:23 +00:00
TCachedToken<CMapArea> x0_area;
2017-04-22 06:42:32 +00:00
EMapAreaList x10_list;
CMapAreaData* x14_next = nullptr;
2016-07-28 07:33:55 +00:00
public:
2017-08-13 05:26:14 +00:00
CMapAreaData(CAssetId areaRes, EMapAreaList list, CMapAreaData* next);
2017-04-22 06:42:32 +00:00
void Lock() { x0_area.Lock(); }
void Unlock() { x0_area.Unlock(); }
bool IsLoaded() const { return x0_area.IsLoaded(); }
const CMapArea* GetMapArea() const { return x0_area.GetObj(); }
2017-04-22 06:42:32 +00:00
const CMapAreaData* GetNextMapAreaData() const { return x14_next; }
EMapAreaList GetContainingList() const { return x10_list; }
CMapAreaData* NextMapAreaData() { return x14_next; }
void SetContainingList(EMapAreaList list) { x10_list = list; }
void SetNextMapArea(CMapAreaData* next) { x14_next = next; }
2016-07-28 07:33:55 +00:00
};
class CMapWorldDrawParms
{
2017-04-16 20:56:34 +00:00
float x0_alphaSurfVisited;
float x4_alphaOlVisited;
float x8_alphaSurfUnvisited;
float xc_alphaOlUnvisited;
float x10_alpha;
float x14_outlineWidthScale;
const CStateManager& x18_mgr;
const zeus::CTransform& x1c_modelXf;
const zeus::CTransform& x20_viewXf;
const IWorld& x24_wld;
const CMapWorldInfo& x28_mwInfo;
2017-04-22 21:46:18 +00:00
float x2c_playerFlashIntensity;
float x30_hintFlashIntensity;
2017-04-16 20:56:34 +00:00
float x34_objectScale;
bool x38_sortDoorSurfs;
2016-07-28 07:33:55 +00:00
public:
2017-04-16 20:56:34 +00:00
CMapWorldDrawParms(float alphaSurfVisited, float alphaOlVisited,
float alphaSurfUnvisited, float alphaOlUnvisited,
float alpha, float outlineWidthScale, const CStateManager& mgr,
const zeus::CTransform& modelXf, const zeus::CTransform& viewXf,
2017-04-22 21:46:18 +00:00
const IWorld& wld, const CMapWorldInfo& mwInfo, float playerFlash,
float hintFlash, float objectScale, bool sortDoorSurfs)
2017-04-16 20:56:34 +00:00
: 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),
2017-04-22 21:46:18 +00:00
x2c_playerFlashIntensity(playerFlash),
x30_hintFlashIntensity(hintFlash),
2017-04-16 20:56:34 +00:00
x34_objectScale(objectScale),
x38_sortDoorSurfs(sortDoorSurfs)
{}
const IWorld& GetWorld() const { return x24_wld; }
float GetOutlineWidthScale() const { return x14_outlineWidthScale; }
const zeus::CTransform& GetPlaneProjectionTransform() const { return x1c_modelXf; }
2017-04-22 21:46:18 +00:00
float GetHintAreaFlashIntensity() const { return x30_hintFlashIntensity; }
float GetPlayerAreaFlashIntensity() const { return x2c_playerFlashIntensity; }
2017-04-16 20:56:34 +00:00
const zeus::CTransform& 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; }
2017-04-16 20:56:34 +00:00
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; }
2016-07-28 07:33:55 +00:00
};
private:
2016-07-29 17:00:23 +00:00
std::vector<CMapAreaData> x0_areas;
2017-04-22 06:42:32 +00:00
rstl::reserved_vector<CMapAreaData*, 3> x10_listHeads;
std::vector<bool> x20_traversed;
zeus::CVector3f x30_worldSpherePoint;
float x3c_worldSphereRadius = 0.f;
float x40_worldSphereHalfDepth = 0.f;
2016-07-28 07:33:55 +00:00
public:
CMapWorld(CInputStream&);
2017-04-15 05:32:25 +00:00
u32 GetNumAreas() const { return x0_areas.size(); }
2017-04-22 06:42:32 +00:00
const CMapArea* GetMapArea(int aid) const { return x0_areas[aid].GetMapArea(); }
bool IsMapAreaInBFSInfoVector(const CMapAreaData*, const std::vector<CMapAreaBFSInfo>&) const;
void SetWhichMapAreasLoaded(const IWorld&, int start, int count);
bool IsMapAreasStreaming() const;
2016-07-28 07:33:55 +00:00
void MoveMapAreaToList(CMapAreaData*, EMapAreaList);
2017-04-22 06:42:32 +00:00
s32 GetCurrentMapAreaDepth(const IWorld&, int areaIdx) const;
std::vector<int> GetVisibleAreas(const IWorld&, const CMapWorldInfo&) const;
2016-07-28 07:33:55 +00:00
void Draw(const CMapWorldDrawParms&, int, int, float, float, bool) const;
2017-04-22 06:42:32 +00:00
void DoBFS(const IWorld&, int, int, float, float, bool, std::vector<CMapAreaBFSInfo>&) const;
2016-07-28 07:33:55 +00:00
bool IsMapAreaValid(const IWorld&, int, bool) const;
void DrawAreas(const CMapWorldDrawParms&, int, const std::vector<CMapAreaBFSInfo>&, bool) const;
void RecalculateWorldSphere(const CMapWorldInfo&, const IWorld&) const;
2017-04-15 05:32:25 +00:00
zeus::CVector3f ConstrainToWorldVolume(const zeus::CVector3f&, const zeus::CVector3f&) const;
2016-07-28 07:33:55 +00:00
void ClearTraversedFlags() const;
};
CFactoryFnReturn FMapWorldFactory(const SObjectTag& tag, CInputStream& in, const CVParamTransfer& param,
CObjectReference* selfRef);
}
#endif // __URDE_CMAPWORLD_HPP__