client/GameLib/MapOutdoor.h

780 lines
26 KiB
C
Raw Normal View History

#pragma once
#include "../eterLib/SkyBox.h"
#include "../eterLib/LensFlare.h"
#include "../eterLib/ScreenFilter.h"
#include "../PRTerrainLib/TerrainType.h"
#include "../PRTerrainLib/TextureSet.h"
#include "../SpeedTreeLib/SpeedTreeForestDirectX8.h"
#include "MapBase.h"
#include "Area.h"
#include "AreaTerrain.h"
#include "AreaLoaderThread.h"
#include "MonsterAreaInfo.h"
#define LOAD_SIZE_WIDTH 1
#define AROUND_AREA_NUM 1+(LOAD_SIZE_WIDTH*2)*(LOAD_SIZE_WIDTH*2)*2
#define MAX_PREPARE_SIZE 9
#define MAX_MAPSIZE 256 // 0 ~ 255, cellsize 200 = 64km
#define TERRAINPATCH_LODMAX 3
typedef struct SOutdoorMapCoordinate
{
short m_sTerrainCoordX; // Terrain <20><>ǥ
short m_sTerrainCoordY;
} TOutdoorMapCoordinate;
typedef std::map<const std::string, TOutdoorMapCoordinate> TOutdoorMapCoordinateMap;
class CTerrainPatchProxy;
class CTerrainQuadtreeNode;
class CMapOutdoor : public CMapBase
{
public:
enum
{
VIEW_NONE = 0,
VIEW_PART,
VIEW_ALL,
};
enum EPart
{
PART_TERRAIN,
PART_OBJECT,
PART_CLOUD,
PART_WATER,
PART_TREE,
PART_SKY,
PART_NUM,
};
enum ETerrainRenderSort
{
DISTANCE_SORT,
TEXTURE_SORT,
};
public:
CMapOutdoor();
virtual ~CMapOutdoor();
virtual void OnBeginEnvironment();
protected:
bool Initialize();
void InitializeFog();
virtual bool Destroy();
virtual void OnSetEnvironmentDataPtr();
virtual void OnResetEnvironmentDataPtr();
virtual void OnRender();
virtual void OnPreAssignTerrainPtr() {};
public:
void SetInverseViewAndDynamicShaodwMatrices();
virtual bool Load(float x, float y, float z);
virtual float GetHeight(float x, float y);
virtual float GetCacheHeight(float x, float y);
virtual bool Update(float fX, float fY, float fZ);
virtual void UpdateAroundAmbience(float fX, float fY, float fZ);
public:
void Clear();
void SetVisiblePart(int ePart, bool isVisible);
void SetSplatLimit(int iSplatNum);
std::vector<int> & GetRenderedSplatNum(int * piPatch, int * piSplat, float * pfSplatRatio);
CArea::TCRCWithNumberVector & GetRenderedGraphicThingInstanceNum(DWORD * pdwGraphicThingInstanceNum, DWORD * pdwCRCNum);
bool LoadSetting(const char * c_szFileName);
void ApplyLight(DWORD dwVersion, const D3DLIGHT8& c_rkLight);
void SetEnvironmentScreenFilter();
void SetEnvironmentSkyBox();
void SetEnvironmentLensFlare();
void CreateCharacterShadowTexture();
void ReleaseCharacterShadowTexture();
void SetShadowTextureSize(WORD size);
bool BeginRenderCharacterShadowToTexture();
void EndRenderCharacterShadowToTexture();
void RenderWater();
void RenderMarkedArea();
void RecurseRenderAttr(CTerrainQuadtreeNode *Node, bool bCullEnable=TRUE);
void DrawPatchAttr(long patchnum);
void ClearGuildArea();
void RegisterGuildArea(int isx, int isy, int iex, int iey);
void VisibleMarkedArea();
void DisableMarkedArea();
void UpdateSky();
void RenderCollision();
void RenderSky();
void RenderCloud();
void RenderBeforeLensFlare();
void RenderAfterLensFlare();
void RenderScreenFiltering();
void SetWireframe(bool bWireFrame);
bool IsWireframe();
bool GetPickingPointWithRay(const CRay & rRay, D3DXVECTOR3 * v3IntersectPt);
bool GetPickingPointWithRayOnlyTerrain(const CRay & rRay, D3DXVECTOR3 * v3IntersectPt);
bool GetPickingPoint(D3DXVECTOR3 * v3IntersectPt);
void GetTerrainCount(short * psTerrainCountX, short * psTerrainCountY)
{
*psTerrainCountX = m_sTerrainCountX;
*psTerrainCountY = m_sTerrainCountY;
}
bool SetTerrainCount(short sTerrainCountX, short sTerrainCountY);
// Shadow
void SetDrawShadow(bool bDrawShadow);
void SetDrawCharacterShadow(bool bDrawChrShadow);
DWORD GetShadowMapColor(float fx, float fy);
protected:
bool __PickTerrainHeight(float& fPos, const D3DXVECTOR3& v3Start, const D3DXVECTOR3& v3End, float fStep, float fRayRange, float fLimitRange, D3DXVECTOR3* pv3Pick);
virtual void __ClearGarvage();
virtual void __UpdateGarvage();
virtual bool LoadTerrain(WORD wTerrainCoordX, WORD wTerrainCoordY, WORD wCellCoordX, WORD wCellCoordY);
virtual bool LoadArea(WORD wAreaCoordX, WORD wAreaCoordY, WORD wCellCoordX, WORD wCellCoordY);
virtual void UpdateAreaList(long lCenterX, long lCenterY);
bool isTerrainLoaded(WORD wX, WORD wY);
bool isAreaLoaded(WORD wX, WORD wY);
void AssignTerrainPtr(); // <20><><EFBFBD><EFBFBD> <20><>ǥ<EFBFBD><C7A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(ex. 3x3)<29><> <20>ִ<EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><> <20>ҷ<EFBFBD><D2B7><EFBFBD>)
void SaveAlphaFogOperation();
void RestoreAlphaFogOperation();
//////////////////////////////////////////////////////////////////////////
// New
//////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
void GetHeightMap(const BYTE & c_rucTerrainNum, WORD ** pwHeightMap);
void GetNormalMap(const BYTE & c_rucTerrainNum, char ** pucNormalMap);
// Water
void GetWaterMap(const BYTE & c_rucTerrainNum, BYTE ** pucWaterMap);
void GetWaterHeight(BYTE byTerrainNum, BYTE byWaterNum, long * plWaterHeight);
//////////////////////////////////////////////////////////////////////////
// Terrain
//////////////////////////////////////////////////////////////////////////
protected:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CTerrain * m_pTerrain[AROUND_AREA_NUM]; // Terrain
CTerrainPatchProxy * m_pTerrainPatchProxyList; // CTerrain<69><6E> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1>... Seamless Map <20><> <20><><EFBFBD><EFBFBD> CTerrain<69><6E><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD>...
long m_lViewRadius; // <20>þ<EFBFBD> <20>Ÿ<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
float m_fHeightScale; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>... 1.0<EFBFBD>϶<EFBFBD> 0~655.35<EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD> ǥ<><C7A5> <20><><EFBFBD><EFBFBD>.
short m_sTerrainCountX, m_sTerrainCountY; // seamless map <20>ȿ<EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A1> Terrain<69><6E><EFBFBD><EFBFBD>
TOutdoorMapCoordinate m_CurCoordinate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
long m_lCurCoordStartX, m_lCurCoordStartY;
TOutdoorMapCoordinate m_PrevCoordinate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
TOutdoorMapCoordinateMap m_EntryPointMap;
WORD m_wPatchCount;
//////////////////////////////////////////////////////////////////////////
// Index Buffer
#ifdef WORLD_EDITOR
WORD * m_pwIndices; /* temp Index buffer */
CGraphicIndexBuffer m_IndexBuffer;
WORD m_wNumIndices;
#else
WORD * m_pwaIndices[TERRAINPATCH_LODMAX];
CGraphicIndexBuffer m_IndexBuffer[TERRAINPATCH_LODMAX];
WORD m_wNumIndices[TERRAINPATCH_LODMAX];
#endif
virtual void DestroyTerrain();
void CreateTerrainPatchProxyList();
void DestroyTerrainPatchProxyList();
void UpdateTerrain(float fX, float fY);
void ConvertTerrainToTnL(long lx, long ly);
void AssignPatch(long lPatchNum, long lx0, long ly0, long lx1, long ly1);
//////////////////////////////////////////////////////////////////////////
// Index Buffer
void ADDLvl1TL(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl1T(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl1TR(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl1L(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl1R(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl1BL(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl1B(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl1BR(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl1M(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl2TL(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl2T(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl2TR(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl2L(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl2R(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl2BL(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl2B(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl2BR(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
void ADDLvl2M(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
public:
BOOL GetTerrainPointer(BYTE c_ucTerrainNum, CTerrain ** ppTerrain);
float GetTerrainHeight(float fx, float fy);
bool GetWaterHeight(int iX, int iY, long * plWaterHeight);
bool GetNormal(int ix, int iy, D3DXVECTOR3 * pv3Normal);
void RenderTerrain();
const long GetViewRadius() { return m_lViewRadius; }
const float GetHeightScale() { return m_fHeightScale; }
const TOutdoorMapCoordinate & GetEntryPoint(const std::string & c_rstrEntryPointName) const;
void SetEntryPoint(const std::string & c_rstrEntryPointName, const TOutdoorMapCoordinate & c_rOutdoorMapCoordinate);
const TOutdoorMapCoordinate & GetCurCoordinate() { return m_CurCoordinate; }
const TOutdoorMapCoordinate & GetPrevCoordinate() { return m_PrevCoordinate; }
//////////////////////////////////////////////////////////////////////////
// Area
//////////////////////////////////////////////////////////////////////////
protected:
CArea * m_pArea[AROUND_AREA_NUM]; // Data
virtual void DestroyArea();
void __UpdateArea(D3DXVECTOR3& v3Player);
#ifdef WORLD_EDITOR
void __NEW_WorldEditor_UpdateArea();
#endif
void __Game_UpdateArea(D3DXVECTOR3& v3Player);
void __BuildDynamicSphereInstanceVector();
void __CollectShadowReceiver(D3DXVECTOR3& v3Target, D3DXVECTOR3& v3Light);
void __CollectCollisionPCBlocker(D3DXVECTOR3& v3Eye, D3DXVECTOR3& v3Target, float fDistance);
void __CollectCollisionShadowReceiver(D3DXVECTOR3& v3Target, D3DXVECTOR3& v3Light);
void __UpdateAroundAreaList();
bool __IsInShadowReceiverList(CGraphicObjectInstance* pkObjInstTest);
bool __IsInPCBlockerList(CGraphicObjectInstance* pkObjInstTest);
void ConvertToMapCoords(float fx, float fy, int *iCellX, int *iCellY, BYTE * pucSubCellX, BYTE * pucSubCellY, WORD * pwTerrainNumX, WORD * pwTerrainNumY);
public:
BOOL GetAreaPointer(const BYTE c_ucAreaNum, CArea ** ppArea);
void RenderArea(bool bRenderAmbience = true);
void RenderBlendArea();
void RenderDungeon();
void RenderEffect();
void RenderPCBlocker();
void RenderTree();
public:
//////////////////////////////////////////////////////////////////////////
// For Grass
//////////////////////////////////////////////////////////////////////////
float GetHeight(float* pPos);
bool GetBrushColor(float fX, float fY, float* pLowColor, float* pHighColor);
bool isAttrOn(float fX, float fY, BYTE byAttr);
bool GetAttr(float fX, float fY, BYTE * pbyAttr);
bool isAttrOn(int iX, int iY, BYTE byAttr);
bool GetAttr(int iX, int iY, BYTE * pbyAttr);
void SetMaterialDiffuse(float fr, float fg, float fb);
void SetMaterialAmbient(float fr, float fg, float fb);
void SetTerrainMaterial(const PR_MATERIAL * pMaterial);
bool GetTerrainNum(float fx, float fy, BYTE * pbyTerrainNum);
bool GetTerrainNumFromCoord(WORD wCoordX, WORD wCoordY, BYTE * pbyTerrainNum);
protected:
//////////////////////////////////////////////////////////////////////////
// New
//////////////////////////////////////////////////////////////////////////
long m_lCenterX, m_lCenterY; // Terrain <20><>ǥ <20><><EFBFBD><EFBFBD> <20><> <20><>ǥ...
long m_lOldReadX, m_lOldReadY; /* Last center */
//////////////////////////////////////////////////////////////////////////
// Octree
//////////////////////////////////////////////////////////////////////////
CTerrainQuadtreeNode * m_pRootNode;
void BuildQuadTree();
CTerrainQuadtreeNode * AllocQuadTreeNode(long x0, long y0, long x1, long y1);
void SubDivideNode(CTerrainQuadtreeNode * Node);
void UpdateQuadTreeHeights(CTerrainQuadtreeNode *Node);
void FreeQuadTree();
struct TPatchDrawStruct
{
float fDistance;
BYTE byTerrainNum;
long lPatchNum;
CTerrainPatchProxy * pTerrainPatchProxy;
bool operator<( const TPatchDrawStruct & rhs) const
{
return fDistance < rhs.fDistance;
}
};
public:
typedef std::vector<BYTE> TTerrainNumVector;
struct FSortPatchDrawStructWithTerrainNum
{
static TTerrainNumVector m_TerrainNumVector;
FSortPatchDrawStructWithTerrainNum()
{
m_TerrainNumVector.clear();
}
bool operator () (const TPatchDrawStruct & lhs, const TPatchDrawStruct & rhs)
{
DWORD lhsTerrainNumOrder = 0, rhsTerrainNumOrder = 0;
bool blhsOrderFound = false;
bool brhsOrderFound = false;
TTerrainNumVector::iterator lhsIterator = std::find(m_TerrainNumVector.begin(), m_TerrainNumVector.end(), lhs.byTerrainNum);
TTerrainNumVector::iterator rhsIterator = std::find(m_TerrainNumVector.begin(), m_TerrainNumVector.end(), rhs.byTerrainNum);
if (lhsIterator != m_TerrainNumVector.end())
{
blhsOrderFound = true;
lhsTerrainNumOrder = lhsIterator - m_TerrainNumVector.begin();
}
if (rhsIterator != m_TerrainNumVector.end())
{
brhsOrderFound = true;
rhsTerrainNumOrder = rhsIterator - m_TerrainNumVector.begin();
}
if (!brhsOrderFound)
{
m_TerrainNumVector.push_back(rhs.byTerrainNum);
rhsTerrainNumOrder = m_TerrainNumVector.size() -1;
}
if (!blhsOrderFound)
{
lhsIterator = std::find(m_TerrainNumVector.begin(), m_TerrainNumVector.end(), lhs.byTerrainNum);
if (lhsIterator != m_TerrainNumVector.end())
{
blhsOrderFound = true;
lhsTerrainNumOrder = lhsIterator - m_TerrainNumVector.begin();
}
if (!blhsOrderFound)
{
m_TerrainNumVector.push_back(lhs.byTerrainNum);
lhsTerrainNumOrder = m_TerrainNumVector.size() -1;
}
}
return lhsTerrainNumOrder < rhsTerrainNumOrder;
}
};
protected:
std::vector<std::pair<float, long> > m_PatchVector;
std::vector<TPatchDrawStruct> m_PatchDrawStructVector;
void SetPatchDrawVector();
void NEW_DrawWireFrame(CTerrainPatchProxy * pTerrainPatchProxy, WORD wPrimitiveCount, D3DPRIMITIVETYPE ePrimitiveType);
void DrawWireFrame(long patchnum, WORD wPrimitiveCount, D3DPRIMITIVETYPE ePrimitiveType);
void DrawWater(long patchnum);
bool m_bDrawWireFrame;
bool m_bDrawShadow;
bool m_bDrawChrShadow;
//////////////////////////////////////////////////////////////////////////
// Water
D3DXMATRIX m_matBump;
void LoadWaterTexture();
void UnloadWaterTexture();
//Water
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// Alpha Fog
CGraphicImageInstance m_AlphaFogImageInstance;
D3DXMATRIX m_matAlphaFogTexture;
// Alpha Fog
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// Character Shadow
LPDIRECT3DTEXTURE8 m_lpCharacterShadowMapTexture;
LPDIRECT3DSURFACE8 m_lpCharacterShadowMapRenderTargetSurface;
LPDIRECT3DSURFACE8 m_lpCharacterShadowMapDepthSurface;
D3DVIEWPORT8 m_ShadowMapViewport;
WORD m_wShadowMapSize;
// Backup Device Context
LPDIRECT3DSURFACE8 m_lpBackupRenderTargetSurface;
LPDIRECT3DSURFACE8 m_lpBackupDepthSurface;
D3DVIEWPORT8 m_BackupViewport;
// Character Shadow
//////////////////////////////////////////////////////////////////////////
// View Frustum Culling
D3DXPLANE m_plane[6];
void BuildViewFrustum(D3DXMATRIX & mat);
CTextureSet m_TextureSet;
protected:
CSkyBox m_SkyBox;
CLensFlare m_LensFlare;
CScreenFilter m_ScreenFilter;
protected:
void SetIndexBuffer();
void SelectIndexBuffer(BYTE byLODLevel, WORD * pwPrimitiveCount, D3DPRIMITIVETYPE * pePrimitiveType);
D3DXMATRIX m_matWorldForCommonUse;
D3DXMATRIX m_matViewInverse;
D3DXMATRIX m_matSplatAlpha;
D3DXMATRIX m_matStaticShadow;
D3DXMATRIX m_matDynamicShadow;
D3DXMATRIX m_matDynamicShadowScale;
D3DXMATRIX m_matLightView;
float m_fTerrainTexCoordBase;
float m_fWaterTexCoordBase;
float m_fXforDistanceCaculation, m_fYforDistanceCaculation;
protected:
typedef std::vector<CTerrain *> TTerrainPtrVector;
typedef TTerrainPtrVector::iterator TTerrainPtrVectorIterator;
typedef std::vector<CArea *> TAreaPtrVector;
typedef TAreaPtrVector::iterator TAreaPtrVectorIterator;
TTerrainPtrVector m_TerrainVector;
TTerrainPtrVector m_TerrainDeleteVector;
TTerrainPtrVector m_TerrainLoadRequestVector;
TTerrainPtrVector m_TerrainLoadWaitVector;
TTerrainPtrVectorIterator m_TerrainPtrVectorIterator;
TAreaPtrVector m_AreaVector;
TAreaPtrVector m_AreaDeleteVector;
TAreaPtrVector m_AreaLoadRequestVector;
TAreaPtrVector m_AreaLoadWaitVector;
TAreaPtrVectorIterator m_AreaPtrVectorIterator;
struct FPushToDeleteVector
{
enum EDeleteDir
{
DELETE_LEFT,
DELETE_RIGHT,
DELETE_TOP,
DELETE_BOTTOM,
};
EDeleteDir m_eLRDeleteDir;
EDeleteDir m_eTBDeleteDir;
TOutdoorMapCoordinate m_CurCoordinate;
FPushToDeleteVector(EDeleteDir eLRDeleteDir, EDeleteDir eTBDeleteDir, TOutdoorMapCoordinate CurCoord)
{
m_eLRDeleteDir = eLRDeleteDir;
m_eTBDeleteDir = eTBDeleteDir;
m_CurCoordinate = CurCoord;
}
};
struct FPushTerrainToDeleteVector : public FPushToDeleteVector
{
TTerrainPtrVector m_ReturnTerrainVector;
FPushTerrainToDeleteVector(EDeleteDir eLRDeleteDir, EDeleteDir eTBDeleteDir, TOutdoorMapCoordinate CurCoord)
: FPushToDeleteVector(eLRDeleteDir, eTBDeleteDir, CurCoord)
{
m_ReturnTerrainVector.clear();
}
void operator() (CTerrain * pTerrain);
};
struct FPushAreaToDeleteVector : public FPushToDeleteVector
{
TAreaPtrVector m_ReturnAreaVector;
FPushAreaToDeleteVector(EDeleteDir eLRDeleteDir, EDeleteDir eTBDeleteDir, TOutdoorMapCoordinate CurCoord)
: FPushToDeleteVector(eLRDeleteDir, eTBDeleteDir, CurCoord)
{
m_ReturnAreaVector.clear();
}
void operator() (CArea * pArea);
};
protected:
void InitializeVisibleParts();
bool IsVisiblePart(int ePart);
float __GetNoFogDistance();
float __GetFogDistance();
protected:
DWORD m_dwVisiblePartFlags;
int m_iRenderedSplatNumSqSum;
int m_iRenderedSplatNum;
int m_iRenderedPatchNum;
std::vector<int> m_RenderedTextureNumVector;
int m_iSplatLimit;
protected:
int m_iPatchTerrainVertexCount;
int m_iPatchWaterVertexCount;
int m_iPatchTerrainVertexSize;
int m_iPatchWaterVertexSize;
DWORD m_dwRenderedCRCNum;
DWORD m_dwRenderedGraphicThingInstanceNum;
std::list<RECT> m_rkList_kGuildArea;
protected:
void __RenderTerrain_RecurseRenderQuadTree(CTerrainQuadtreeNode *Node, bool bCullCheckNeed = true);
int __RenderTerrain_RecurseRenderQuadTree_CheckBoundingCircle(const D3DXVECTOR3 & c_v3Center, const float & c_fRadius);
void __RenderTerrain_AppendPatch(const D3DXVECTOR3& c_rv3Center, float fDistance, long lPatchNum);
void __RenderTerrain_RenderSoftwareTransformPatch();
void __RenderTerrain_RenderHardwareTransformPatch();
protected:
void __HardwareTransformPatch_RenderPatchSplat(long patchnum, WORD wPrimitiveCount, D3DPRIMITIVETYPE ePrimitiveType);
void __HardwareTransformPatch_RenderPatchNone(long patchnum, WORD wPrimitiveCount, D3DPRIMITIVETYPE ePrimitiveType);
protected:
struct SoftwareTransformPatch_SData
{
enum
{
SPLAT_VB_NUM = 8,
NONE_VB_NUM = 8,
};
IDirect3DVertexBuffer8* m_pkVBSplat[SPLAT_VB_NUM];
IDirect3DVertexBuffer8* m_pkVBNone[NONE_VB_NUM];
DWORD m_dwSplatPos;
DWORD m_dwNonePos;
DWORD m_dwLightVersion;
} m_kSTPD;
struct SoftwareTransformPatch_SRenderState {
D3DXMATRIX m_m4Proj;
D3DXMATRIX m_m4Frustum;
D3DXMATRIX m_m4DynamicShadow;
D3DLIGHT8 m_kLight;
D3DMATERIAL8 m_kMtrl;
D3DXVECTOR3 m_v3Player;
DWORD m_dwFogColor;
float m_fScreenHalfWidth;
float m_fScreenHalfHeight;
float m_fFogNearDistance;
float m_fFogFarDistance;
float m_fFogNearTransZ;
float m_fFogFarTransZ;
float m_fFogLenInv;
};
struct SoftwareTransformPatch_STVertex
{
D3DXVECTOR4 kPosition;
};
struct SoftwareTransformPatch_STLVertex
{
D3DXVECTOR4 kPosition;
DWORD dwDiffuse;
DWORD dwFog;
D3DXVECTOR2 kTexTile;
D3DXVECTOR2 kTexAlpha;
D3DXVECTOR2 kTexStaticShadow;
D3DXVECTOR2 kTexDynamicShadow;
};
void __SoftwareTransformPatch_ApplyRenderState();
void __SoftwareTransformPatch_RestoreRenderState(DWORD dwFogEnable);
void __SoftwareTransformPatch_Initialize();
bool __SoftwareTransformPatch_Create();
void __SoftwareTransformPatch_Destroy();
void __SoftwareTransformPatch_BuildPipeline(SoftwareTransformPatch_SRenderState& rkTPRS);
void __SoftwareTransformPatch_BuildPipeline_BuildFogFuncTable(SoftwareTransformPatch_SRenderState& rkTPRS);
bool __SoftwareTransformPatch_SetTransform(SoftwareTransformPatch_SRenderState& rkTPRS, SoftwareTransformPatch_STLVertex* akTransVertex, CTerrainPatchProxy& rkTerrainPatchProxy, UINT uTerrainX, UINT uTerrainY, bool isFogEnable, bool isDynamicShadow);
bool __SoftwareTransformPatch_SetSplatStream(SoftwareTransformPatch_STLVertex* akTransVertex);
bool __SoftwareTransformPatch_SetShadowStream(SoftwareTransformPatch_STLVertex* akTransVertex);
void __SoftwareTransformPatch_ApplyStaticShadowRenderState();
void __SoftwareTransformPatch_RestoreStaticShadowRenderState();
void __SoftwareTransformPatch_ApplyFogShadowRenderState();
void __SoftwareTransformPatch_RestoreFogShadowRenderState();
void __SoftwareTransformPatch_ApplyDynamicShadowRenderState();
void __SoftwareTransformPatch_RestoreDynamicShadowRenderState();
void __SoftwareTransformPatch_RenderPatchSplat(SoftwareTransformPatch_SRenderState& rkTPRS, long patchnum, WORD wPrimitiveCount, D3DPRIMITIVETYPE ePrimitiveType, bool isFogEnable);
void __SoftwareTransformPatch_RenderPatchNone(SoftwareTransformPatch_SRenderState& rkTPRS, long patchnum, WORD wPrimitiveCount, D3DPRIMITIVETYPE ePrimitiveType);
protected:
std::vector<CGraphicObjectInstance *> m_ShadowReceiverVector;
std::vector<CGraphicObjectInstance *> m_PCBlockerVector;
protected:
float m_fOpaqueWaterDepth;
CGraphicImageInstance m_WaterInstances[30];
public:
float GetOpaqueWaterDepth() { return m_fOpaqueWaterDepth; }
void SetOpaqueWaterDepth(float fOpaqueWaterDepth) { m_fOpaqueWaterDepth = fOpaqueWaterDepth; }
void SetTerrainRenderSort(ETerrainRenderSort eTerrainRenderSort) { m_eTerrainRenderSort = eTerrainRenderSort;}
ETerrainRenderSort GetTerrainRenderSort() { return m_eTerrainRenderSort; }
protected:
ETerrainRenderSort m_eTerrainRenderSort;
protected:
CGraphicImageInstance m_attrImageInstance;
CGraphicImageInstance m_BuildingTransparentImageInstance;
D3DXMATRIX m_matBuildingTransparent;
protected:
CDynamicPool<CMonsterAreaInfo> m_kPool_kMonsterAreaInfo;
TMonsterAreaInfoPtrVector m_MonsterAreaInfoPtrVector;
TMonsterAreaInfoPtrVectorIterator m_MonsterAreaInfoPtrVectorIterator;
public:
bool LoadMonsterAreaInfo();
CMonsterAreaInfo * AddMonsterAreaInfo(long lOriginX, long lOriginY, long lSizeX, long lSizeY);
void RemoveAllMonsterAreaInfo();
DWORD GetMonsterAreaInfoCount() { return m_MonsterAreaInfoPtrVector.size(); }
bool GetMonsterAreaInfoFromVectorIndex(DWORD dwMonsterAreaInfoVectorIndex, CMonsterAreaInfo ** ppMonsterAreaInfo);
CMonsterAreaInfo * AddNewMonsterAreaInfo(long lOriginX, long lOriginY, long lSizeX, long lSizeY,
CMonsterAreaInfo::EMonsterAreaInfoType eMonsterAreaInfoType,
DWORD dwVID, DWORD dwCount, CMonsterAreaInfo::EMonsterDir eMonsterDir);
public:
void GetBaseXY(DWORD * pdwBaseX, DWORD * pdwBaseY);
void SetBaseXY(DWORD dwBaseX, DWORD dwBaseY);
void SetTransparentTree(bool bTransparentTree) { m_bTransparentTree = bTransparentTree;}
void EnableTerrainOnlyForHeight(bool bFlag) { m_bEnableTerrainOnlyForHeight = bFlag; }
void EnablePortal(bool bFlag);
bool IsEnablePortal() { return m_bEnablePortal; }
protected:
DWORD m_dwBaseX;
DWORD m_dwBaseY;
D3DXVECTOR3 m_v3Player;
bool m_bShowEntirePatchTextureCount;
bool m_bTransparentTree;
bool m_bEnableTerrainOnlyForHeight;
bool m_bEnablePortal;
// XMas
private:
struct SXMasTree
{
CSpeedTreeWrapper* m_pkTree;
int m_iEffectID;
} m_kXMas;
void __XMasTree_Initialize();
void __XMasTree_Create(float x, float y, float z, const char* c_szTreeName, const char* c_szEffName);
public:
void XMasTree_Destroy();
void XMasTree_Set(float x, float y, float z, const char* c_szTreeName, const char* c_szEffName);
// Special Effect
private:
typedef std::map<DWORD, int> TSpecialEffectMap;
TSpecialEffectMap m_kMap_dwID_iEffectID;
public:
void SpecialEffect_Create(DWORD dwID, float x, float y, float z, const char* c_szEffName);
void SpecialEffect_Delete(DWORD dwID);
void SpecialEffect_Destroy();
private:
struct SHeightCache
{
struct SItem
{
DWORD m_dwKey;
float m_fHeight;
};
enum
{
HASH_SIZE = 100,
};
std::vector<SItem> m_akVct_kItem[HASH_SIZE];
bool m_isUpdated;
} m_kHeightCache;
void __HeightCache_Init();
void __HeightCache_Update();
public:
void SetEnvironmentDataName(const std::string& strEnvironmentDataName);
std::string& GetEnvironmentDataName();
protected:
std::string m_settings_envDataName;
std::string m_envDataName;
private:
bool m_bSettingTerrainVisible;
};