forked from metin2/client
311 lines
8.7 KiB
C
311 lines
8.7 KiB
C
|
#pragma once
|
|||
|
|
|||
|
#include "../SpeedTreeLib/SpeedTreeWrapper.h"
|
|||
|
#include "../eterGrnLib/ThingInstance.h"
|
|||
|
#include "MapType.h"
|
|||
|
#include "DungeonBlock.h"
|
|||
|
|
|||
|
class CMapOutdoor;
|
|||
|
class CEffectInstance;
|
|||
|
|
|||
|
class CArea
|
|||
|
{
|
|||
|
public:
|
|||
|
enum
|
|||
|
{
|
|||
|
ROTATION_STEP_COUNT = 24,
|
|||
|
ROTATION_STEP_AMOUNT = 360 / ROTATION_STEP_COUNT,
|
|||
|
YAW_STEP_COUNT = 24,
|
|||
|
YAW_STEP_AMOUNT = 360 / YAW_STEP_COUNT,
|
|||
|
PITCH_STEP_COUNT = YAW_STEP_COUNT,
|
|||
|
PITCH_STEP_AMOUNT = YAW_STEP_AMOUNT,
|
|||
|
};
|
|||
|
|
|||
|
typedef D3DXVECTOR3 TObjectPosition;
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////////
|
|||
|
// Object Static Data
|
|||
|
typedef struct SObjectData
|
|||
|
{
|
|||
|
TObjectPosition Position;
|
|||
|
DWORD dwCRC;
|
|||
|
BYTE abyPortalID[PORTAL_ID_MAX_NUM];
|
|||
|
|
|||
|
// For Tree
|
|||
|
// - Nothing
|
|||
|
|
|||
|
// For Granny Thing
|
|||
|
float m_fYaw;
|
|||
|
float m_fPitch;
|
|||
|
float m_fRoll;
|
|||
|
float m_fHeightBias;
|
|||
|
|
|||
|
// For Effect
|
|||
|
// - Nothing
|
|||
|
|
|||
|
// For Ambience
|
|||
|
DWORD dwRange;
|
|||
|
float fMaxVolumeAreaPercentage;
|
|||
|
|
|||
|
void InitializeRotation();
|
|||
|
} TObjectData;
|
|||
|
|
|||
|
struct ObjectDataComp
|
|||
|
{
|
|||
|
bool operator () (TObjectData & lhs, TObjectData & rhs) const
|
|||
|
{
|
|||
|
return lhs.dwCRC < rhs.dwCRC;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
typedef std::vector<TObjectData> TObjectDataVector;
|
|||
|
typedef TObjectDataVector::iterator TObjectDataIterator;
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////////
|
|||
|
// Object Dynamic Data
|
|||
|
typedef struct SAmbienceInstance : public CScreen
|
|||
|
{
|
|||
|
float fx, fy, fz;
|
|||
|
DWORD dwRange;
|
|||
|
float fMaxVolumeAreaPercentage;
|
|||
|
int iPlaySoundIndex;
|
|||
|
float fNextPlayTime;
|
|||
|
prt::TPropertyAmbience AmbienceData;
|
|||
|
|
|||
|
SAmbienceInstance();
|
|||
|
virtual ~SAmbienceInstance() {}
|
|||
|
void __Update(float fxCenter, float fyCenter, float fzCenter);
|
|||
|
void (SAmbienceInstance::*Update)(float fxCenter, float fyCenter, float fzCenter);
|
|||
|
void UpdateOnceSound(float fxCenter, float fyCenter, float fzCenter);
|
|||
|
void UpdateStepSound(float fxCenter, float fyCenter, float fzCenter);
|
|||
|
void UpdateLoopSound(float fxCenter, float fyCenter, float fzCenter);
|
|||
|
void Render();
|
|||
|
bool Picking();
|
|||
|
float __GetVolumeFromDistance(float fDistance);
|
|||
|
} TAmbienceInstance;
|
|||
|
|
|||
|
typedef struct SObjectInstance
|
|||
|
{
|
|||
|
DWORD dwType;
|
|||
|
CAttributeInstance * pAttributeInstance;
|
|||
|
|
|||
|
// Data For Tree
|
|||
|
CSpeedTreeWrapper * pTree;
|
|||
|
|
|||
|
// Data For Normal Object or Building
|
|||
|
BOOL isShadowFlag;
|
|||
|
CGraphicThingInstance * pThingInstance;
|
|||
|
|
|||
|
// Data for Effect
|
|||
|
DWORD dwEffectID;
|
|||
|
DWORD dwEffectInstanceIndex;
|
|||
|
|
|||
|
// Data For Ambience
|
|||
|
TAmbienceInstance * pAmbienceInstance;
|
|||
|
|
|||
|
// Dungeon
|
|||
|
CDungeonBlock * pDungeonBlock;
|
|||
|
|
|||
|
void Clear()
|
|||
|
{
|
|||
|
if (pTree)
|
|||
|
pTree->Clear();
|
|||
|
|
|||
|
if (pThingInstance)
|
|||
|
pThingInstance->Clear();
|
|||
|
|
|||
|
if (pAttributeInstance)
|
|||
|
pAttributeInstance->Clear();
|
|||
|
|
|||
|
if (pAmbienceInstance)
|
|||
|
pAmbienceInstance->Clear();
|
|||
|
|
|||
|
if (pDungeonBlock)
|
|||
|
pDungeonBlock->Clear();
|
|||
|
|
|||
|
__Initialize();
|
|||
|
}
|
|||
|
|
|||
|
void SetTree(float x, float y, float z, DWORD dwTreeCRC, const char* c_szTreeName);
|
|||
|
|
|||
|
void __Initialize()
|
|||
|
{
|
|||
|
dwType = prt::PROPERTY_TYPE_NONE;
|
|||
|
|
|||
|
dwEffectID = 0xffffffff;
|
|||
|
dwEffectInstanceIndex = 0xffffffff;
|
|||
|
isShadowFlag = false;
|
|||
|
|
|||
|
pTree=NULL;
|
|||
|
pThingInstance=NULL;
|
|||
|
pAttributeInstance=NULL;
|
|||
|
pAmbienceInstance=NULL;
|
|||
|
pDungeonBlock=NULL;
|
|||
|
}
|
|||
|
|
|||
|
SObjectInstance()
|
|||
|
{
|
|||
|
__Initialize();
|
|||
|
}
|
|||
|
virtual ~SObjectInstance()
|
|||
|
{
|
|||
|
}
|
|||
|
} TObjectInstance;
|
|||
|
|
|||
|
typedef std::vector<CSpeedTreeWrapper *> TTreeInstanceVector;
|
|||
|
typedef std::vector<CGraphicThingInstance *> TThingInstanceVector;
|
|||
|
typedef std::vector<CDungeonBlock *> TDungeonBlockInstanceVector;
|
|||
|
typedef std::vector<TObjectInstance *> TObjectInstanceVector;
|
|||
|
typedef std::vector<TAmbienceInstance *> TAmbienceInstanceVector;
|
|||
|
typedef std::map<CGraphicThingInstance *, DWORD> TGraphicThingInstanceCRCMap; // <20><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD> by <20><><EFBFBD><EFBFBD>
|
|||
|
typedef std::set<int> TShowingPortalIDSet;
|
|||
|
|
|||
|
typedef struct SCRCWithNumber
|
|||
|
{
|
|||
|
DWORD dwCRC;
|
|||
|
DWORD dwNumber;
|
|||
|
} TCRCWithNumber;
|
|||
|
|
|||
|
typedef std::vector<TCRCWithNumber> TCRCWithNumberVector;
|
|||
|
|
|||
|
struct FFindIfCRC
|
|||
|
{
|
|||
|
|
|||
|
FFindIfCRC(DWORD dwCRC) { m_dwCRC = dwCRC; }
|
|||
|
|
|||
|
bool operator() (TCRCWithNumber & rCRCWithNumber)
|
|||
|
{
|
|||
|
if (rCRCWithNumber.dwCRC == m_dwCRC)
|
|||
|
return true;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
DWORD m_dwCRC;
|
|||
|
};
|
|||
|
|
|||
|
struct CRCNumComp
|
|||
|
{
|
|||
|
bool operator () (TCRCWithNumber & lhs, TCRCWithNumber & rhs) const
|
|||
|
{
|
|||
|
return lhs.dwNumber > rhs.dwNumber;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
public:
|
|||
|
CArea();
|
|||
|
virtual ~CArea();
|
|||
|
|
|||
|
void CollectRenderingObject(std::vector<CGraphicThingInstance*>& rkVct_pkOpaqueThingInst);
|
|||
|
void CollectBlendRenderingObject(std::vector<CGraphicThingInstance*>& rkVct_pkBlendThingInst);
|
|||
|
|
|||
|
void SetMapOutDoor(CMapOutdoor * pOwnerOutdoorMap);
|
|||
|
void Clear();
|
|||
|
|
|||
|
bool Load(const char * c_szPathName);
|
|||
|
|
|||
|
DWORD GetObjectDataCount();
|
|||
|
bool GetObjectDataPointer(DWORD dwIndex, const TObjectData ** ppObjectData) const;
|
|||
|
|
|||
|
const DWORD GetObjectInstanceCount() const;
|
|||
|
const bool GetObjectInstancePointer(const DWORD & dwIndex, const TObjectInstance ** ppObjectInstance) const;
|
|||
|
|
|||
|
void EnablePortal(BOOL bFlag=TRUE);
|
|||
|
void ClearPortal();
|
|||
|
void AddShowingPortalID(int iNum);
|
|||
|
void RefreshPortal();
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
void Update();
|
|||
|
void UpdateAroundAmbience(float fX, float fY, float fZ);
|
|||
|
|
|||
|
void Render();
|
|||
|
void RenderEffect();
|
|||
|
void RenderCollision();
|
|||
|
void RenderAmbience();
|
|||
|
void RenderDungeon();
|
|||
|
void Refresh();
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
void SetCoordinate(const WORD & c_usCoordX, const WORD & c_usCoordY);
|
|||
|
void GetCoordinate(WORD * usCoordX, WORD * usCoordY);
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
DWORD DEBUG_GetRenderedCRCNum();
|
|||
|
TCRCWithNumberVector & DEBUG_GetRenderedCRCWithNumVector();
|
|||
|
DWORD DEBUG_GetRenderedGrapphicThingInstanceNum();
|
|||
|
|
|||
|
CMapOutdoor * GetOwner() { return m_pOwnerOutdoorMap; }
|
|||
|
|
|||
|
protected:
|
|||
|
|
|||
|
bool CheckObjectIndex(DWORD dwIndex) const;
|
|||
|
|
|||
|
bool __Load_LoadObject(const char * c_szFileName);
|
|||
|
bool __Load_LoadAmbience(const char * c_szFileName);
|
|||
|
void __Load_BuildObjectInstances();
|
|||
|
|
|||
|
void __UpdateAniThingList();
|
|||
|
void __UpdateEffectList();
|
|||
|
|
|||
|
void __LoadAttribute(TObjectInstance * pObjectInstance, const char * c_szAttributeFileName);
|
|||
|
|
|||
|
protected:
|
|||
|
void __Clear_DestroyObjectInstance(TObjectInstance * pObjectInstance);
|
|||
|
|
|||
|
void __SetObjectInstance(TObjectInstance * pObjectInstance, const TObjectData * c_pData);
|
|||
|
void __SetObjectInstance_SetTree(TObjectInstance * pObjectInstance, const TObjectData * c_pData, CProperty * pProperty);
|
|||
|
void __SetObjectInstance_SetBuilding(TObjectInstance * pObjectInstance, const TObjectData * c_pData, CProperty * pProperty);
|
|||
|
void __SetObjectInstance_SetEffect(TObjectInstance * pObjectInstance, const TObjectData * c_pData, CProperty * pProperty);
|
|||
|
void __SetObjectInstance_SetAmbience(TObjectInstance * pObjectInstance, const TObjectData * c_pData, CProperty * pProperty);
|
|||
|
void __SetObjectInstance_SetDungeonBlock(TObjectInstance * pObjectInstance, const TObjectData * c_pData, CProperty * pProperty);
|
|||
|
|
|||
|
protected:
|
|||
|
// Static Data
|
|||
|
TObjectDataVector m_ObjectDataVector; // Area <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
|
|||
|
|
|||
|
// Rendering Instances
|
|||
|
TObjectInstanceVector m_ObjectInstanceVector;
|
|||
|
|
|||
|
// Clone Instance Vector
|
|||
|
TTreeInstanceVector m_TreeCloneInstaceVector;
|
|||
|
TThingInstanceVector m_ThingCloneInstaceVector;
|
|||
|
TDungeonBlockInstanceVector m_DungeonBlockCloneInstanceVector;
|
|||
|
TThingInstanceVector m_AniThingCloneInstanceVector;
|
|||
|
TThingInstanceVector m_ShadowThingCloneInstaceVector;
|
|||
|
TAmbienceInstanceVector m_AmbienceCloneInstanceVector;
|
|||
|
TGraphicThingInstanceCRCMap m_GraphicThingInstanceCRCMap;
|
|||
|
TCRCWithNumberVector m_kRenderedThingInstanceCRCWithNumberVector;
|
|||
|
TThingInstanceVector m_kRenderedGrapphicThingInstanceVector;
|
|||
|
|
|||
|
// <20><>ǥ : <20>ɸ<EFBFBD><C9B8><EFBFBD> <20><> <20><>ü <20>߿<EFBFBD><DFBF><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ... <20>Ѵ<EFBFBD> 0~999
|
|||
|
WORD m_wX;
|
|||
|
WORD m_wY;
|
|||
|
|
|||
|
// Owner COutdoorMap poineter
|
|||
|
CMapOutdoor * m_pOwnerOutdoorMap;
|
|||
|
|
|||
|
protected:
|
|||
|
static CDynamicPool<TObjectInstance> ms_ObjectInstancePool;
|
|||
|
static CDynamicPool<CAttributeInstance> ms_AttributeInstancePool;
|
|||
|
static CDynamicPool<TAmbienceInstance> ms_AmbienceInstancePool;
|
|||
|
static CDynamicPool<CDungeonBlock> ms_DungeonBlockInstancePool;
|
|||
|
|
|||
|
typedef std::map<DWORD, CEffectInstance*> TEffectInstanceMap;
|
|||
|
typedef TEffectInstanceMap::iterator TEffectInstanceIterator;
|
|||
|
TEffectInstanceMap m_EffectInstanceMap;
|
|||
|
|
|||
|
BOOL m_bPortalEnable;
|
|||
|
TShowingPortalIDSet m_kSet_ShowingPortalID;
|
|||
|
|
|||
|
public:
|
|||
|
static void DestroySystem();
|
|||
|
|
|||
|
static CArea* New();
|
|||
|
static void Delete(CArea* pkArea);
|
|||
|
|
|||
|
static CDynamicPool<CArea> ms_kPool;
|
|||
|
};
|