metaforce/Runtime/AutoMapper/CMappableObject.hpp

100 lines
3.4 KiB
C++
Raw Normal View History

2016-07-29 10:00:23 -07:00
#ifndef __URDE_CMAPPABLEOBJECT_HPP__
#define __URDE_CMAPPABLEOBJECT_HPP__
#include "RetroTypes.hpp"
#include "zeus/CAABox.hpp"
#include "zeus/CTransform.hpp"
2017-01-26 02:06:18 -08:00
#include "GameGlobalObjects.hpp"
2017-04-21 23:42:32 -07:00
#include "Graphics/Shaders/CMapSurfaceShader.hpp"
#include "Graphics/Shaders/CTexturedQuadFilter.hpp"
#include "Graphics/CLineRenderer.hpp"
2016-07-29 10:00:23 -07:00
namespace urde
{
class CStateManager;
2017-04-21 23:42:32 -07:00
class CMapWorldInfo;
2016-07-29 10:00:23 -07:00
class CMappableObject
{
2017-04-21 23:42:32 -07:00
friend class CMapArea;
static boo::GraphicsDataToken g_gfxToken;
static boo::IGraphicsBufferS* g_doorVbo;
static boo::IGraphicsBufferS* g_doorIbo;
2016-07-29 10:00:23 -07:00
public:
enum class EMappableObjectType
{
BlueDoor = 0,
ShieldDoor = 1,
IceDoor = 2,
WaveDoor = 3,
PlasmaDoor = 4,
BigDoor1 = 5,
BigDoor2 = 6,
IceDoorCeiling = 7,
IceDoorFloor = 8,
WaveDoorCeiling = 9,
WaveDoorFloor = 10,
2016-08-01 23:19:52 -07:00
PlasmaDoorCeiling= 11,
PlasmaDoorFloor = 12,
2016-07-29 10:00:23 -07:00
IceDoorFloor2 = 13,
WaveDoorFloor2 = 14,
2017-04-21 23:42:32 -07:00
PlasmaDoorFloor2 = 15,
2016-07-29 10:00:23 -07:00
DownArrowYellow = 27, /* Maintenance Tunnel */
UpArrowYellow = 28, /* Phazon Processing Center */
DownArrowGreen = 29, /* Elevator A */
UpArrowGreen = 30, /* Elite Control Access */
DownArrowRed = 31, /* Elevator B */
UpArrowRed = 32, /* Fungal Hall Access */
TransportLift = 33,
SaveStation = 34,
MissileStation = 37
};
private:
static const zeus::CVector3f skDoorVerts[8];
2016-08-01 23:19:52 -07:00
EMappableObjectType x0_type;
u32 x4_;
2017-04-21 23:42:32 -07:00
TEditorId x8_objId;
u32 xc_;
2016-08-01 23:19:52 -07:00
zeus::CTransform x10_transform;
2017-04-21 23:42:32 -07:00
struct DoorSurface
{
CMapSurfaceShader m_surface;
CLineRenderer m_outline;
DoorSurface(boo::IGraphicsDataFactory::Context& ctx)
: m_surface(ctx, g_doorVbo, g_doorIbo),
m_outline(ctx, CLineRenderer::EPrimitiveMode::LineStrip, 5, nullptr, false)
{}
};
std::experimental::optional<DoorSurface> m_doorSurface;
std::experimental::optional<CTexturedQuadFilter> m_texQuadFilter;
zeus::CTransform AdjustTransformForType();
2017-04-21 23:42:32 -07:00
std::pair<zeus::CColor, zeus::CColor> GetDoorColors(int idx, const CMapWorldInfo& mwInfo, float alpha) const;
2016-07-29 10:00:23 -07:00
public:
2017-04-21 23:42:32 -07:00
CMappableObject(const void* buf);
CMappableObject(CMappableObject&&) = default;
2016-07-29 10:00:23 -07:00
void PostConstruct(const void*);
2017-04-21 23:42:32 -07:00
const zeus::CTransform& GetTransform() const { return x10_transform; }
EMappableObjectType GetType() const { return x0_type; }
void Draw(int, const CMapWorldInfo&, float, bool) const;
void DrawDoorSurface(int curArea, const CMapWorldInfo& mwInfo, float alpha,
int surfIdx, bool needsVtxLoad) const;
zeus::CVector3f BuildSurfaceCenterPoint(int surfIdx) const;
bool IsDoorConnectedToArea(int idx, const CStateManager&) const;
2016-07-29 10:00:23 -07:00
bool IsDoorConnectedToVisitedArea(const CStateManager&) const;
bool GetIsVisibleToAutoMapper(bool) const;
bool GetIsSeen() const;
2017-04-21 23:42:32 -07:00
static void ReadAutoMapperTweaks(const ITweakAutoMapper&);
2016-07-29 10:00:23 -07:00
static bool GetTweakIsMapVisibilityCheat();
2017-04-21 23:42:32 -07:00
static bool IsDoorType(EMappableObjectType type) { return type >= EMappableObjectType::BlueDoor &&
type <= EMappableObjectType::PlasmaDoorFloor2; }
static void Shutdown();
2016-07-29 10:00:23 -07:00
};
}
#endif // __URDE_CMAPPABLEOBJECT_HPP__