metaforce/Runtime/AutoMapper/CMapArea.hpp

94 lines
3.2 KiB
C++
Raw Normal View History

2018-10-06 20:42:33 -07:00
#pragma once
2016-07-29 10:00:23 -07:00
#include "RetroTypes.hpp"
#include "CResFactory.hpp"
2016-07-29 10:00:23 -07:00
#include "zeus/CAABox.hpp"
#include "zeus/CVector3f.hpp"
2017-04-21 23:42:32 -07:00
#include "boo/graphicsdev/IGraphicsDataFactory.hpp"
#include "Graphics/CLineRenderer.hpp"
#include "Graphics/Shaders/CMapSurfaceShader.hpp"
#include "CMappableObject.hpp"
2016-07-29 10:00:23 -07:00
namespace urde
{
2017-04-15 22:52:43 -07:00
class IWorld;
2016-07-29 10:00:23 -07:00
class CMapArea
{
public:
class CMapAreaSurface
{
2017-04-21 23:42:32 -07:00
friend class CMapArea;
zeus::CVector3f x0_normal;
zeus::CVector3f xc_centroid;
const u8* x18_surfOffset;
const u8* x1c_outlineOffset;
u32 m_primStart;
u32 m_primCount;
struct Instance
{
CMapSurfaceShader m_surfacePrims;
std::vector<CLineRenderer> m_linePrims;
Instance(boo::IGraphicsDataFactory::Context& ctx,
const boo::ObjToken<boo::IGraphicsBufferS>& vbo,
const boo::ObjToken<boo::IGraphicsBufferS>& ibo)
: m_surfacePrims(ctx, vbo, ibo) {}
Instance(Instance&&) = default;
Instance& operator=(Instance&&) = default;
};
std::vector<Instance> m_instances;
2016-07-29 10:00:23 -07:00
public:
2017-04-21 23:42:32 -07:00
CMapAreaSurface(const void* surfBuf);
CMapAreaSurface(CMapAreaSurface&&) = default;
void PostConstruct(const u8* buf, std::vector<u32>& index);
void Draw(const zeus::CVector3f* verts, const zeus::CColor& surfColor,
const zeus::CColor& lineColor, float lineWidth, int instIdx=0) const;
2017-04-21 23:42:32 -07:00
const zeus::CVector3f& GetNormal() const { return x0_normal; }
const zeus::CVector3f& GetCenterPosition() const { return xc_centroid; }
2016-07-29 10:00:23 -07:00
};
enum class EVisMode
{
Always,
MapStationOrVisit,
Visit,
Never
};
2016-07-29 10:00:23 -07:00
private:
u32 x0_magic;
u32 x4_version;
u32 x8_;
EVisMode xc_visibilityMode;
zeus::CAABox x10_box;
u32 x28_mappableObjCount;
u32 x2c_vertexCount;
u32 x30_surfaceCount;
u32 x34_size;
u8* x38_moStart;
2017-04-21 23:42:32 -07:00
std::vector<CMappableObject> m_mappableObjects;
u8* x3c_vertexStart;
std::vector<zeus::CVector3f> m_verts;
2016-12-10 17:54:08 -08:00
u8* x40_surfaceStart;
2017-04-21 23:42:32 -07:00
std::vector<CMapAreaSurface> m_surfaces;
std::unique_ptr<u8[]> x44_buf;
boo::ObjToken<boo::IGraphicsBufferS> m_vbo;
boo::ObjToken<boo::IGraphicsBufferS> m_ibo;
2017-04-21 23:42:32 -07:00
2016-07-29 10:00:23 -07:00
public:
2017-04-21 23:42:32 -07:00
CMapArea(CInputStream& in, u32 size);
2016-07-29 10:00:23 -07:00
void PostConstruct();
2017-04-21 23:42:32 -07:00
bool GetIsVisibleToAutoMapper(bool worldVis, bool areaVis) const;
2017-03-19 22:09:53 -07:00
zeus::CVector3f GetAreaCenterPoint() const { return x10_box.center(); }
2017-04-15 22:52:43 -07:00
const zeus::CAABox& GetBoundingBox() const { return x10_box; }
2017-04-21 23:42:32 -07:00
const CMappableObject& GetMappableObject(int idx) const { return m_mappableObjects[idx]; }
const CMapAreaSurface& GetSurface(int idx) const { return m_surfaces[idx]; }
u32 GetNumMappableObjects() const { return m_mappableObjects.size(); }
u32 GetNumSurfaces() const { return m_surfaces.size(); }
2017-04-15 22:52:43 -07:00
zeus::CTransform GetAreaPostTransform(const IWorld& world, TAreaId aid) const;
static const zeus::CVector3f& GetAreaPostTranslate(const IWorld& world, TAreaId aid);
const zeus::CVector3f* GetVertices() const { return m_verts.data(); }
2016-07-29 10:00:23 -07:00
};
2017-03-23 22:30:16 -07:00
CFactoryFnReturn FMapAreaFactory(const SObjectTag& objTag, CInputStream& in, const CVParamTransfer&,
CObjectReference*);
2016-07-29 10:00:23 -07:00
}