Guest User

MapOutdoor.h

a guest
Jan 6th, 2026
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.62 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include "../eterLib/SkyBox.h"
  4. #include "../eterLib/LensFlare.h"
  5. #include "../eterLib/ScreenFilter.h"
  6.  
  7. #include "../PRTerrainLib/TerrainType.h"
  8. #include "../PRTerrainLib/TextureSet.h"
  9.  
  10. #include "../SpeedTreeLib/SpeedTreeForestDirectX8.h"
  11.  
  12. #include "MapBase.h"
  13. #include "Area.h"
  14. #include "AreaTerrain.h"
  15. #include "AreaLoaderThread.h"
  16.  
  17. #include "MonsterAreaInfo.h"
  18.  
  19.  
  20. #define LOAD_SIZE_WIDTH 1
  21.  
  22. #define AROUND_AREA_NUM 1+(LOAD_SIZE_WIDTH*2)*(LOAD_SIZE_WIDTH*2)*2
  23. #define MAX_PREPARE_SIZE 9
  24. #define MAX_MAPSIZE 256 // 0 ~ 255, cellsize 200 = 64km
  25.  
  26. #define TERRAINPATCH_LODMAX 3
  27.  
  28. typedef struct SOutdoorMapCoordinate
  29. {
  30. short m_sTerrainCoordX; // Terrain 좌표
  31. short m_sTerrainCoordY;
  32. } TOutdoorMapCoordinate;
  33.  
  34. typedef std::map<const std::string, TOutdoorMapCoordinate> TOutdoorMapCoordinateMap;
  35.  
  36. class CTerrainPatchProxy;
  37. class CTerrainQuadtreeNode;
  38.  
  39. class CMapOutdoor : public CMapBase
  40. {
  41. public:
  42. enum
  43. {
  44. VIEW_NONE = 0,
  45. VIEW_PART,
  46. VIEW_ALL,
  47. };
  48.  
  49. enum EPart
  50. {
  51. PART_TERRAIN,
  52. PART_OBJECT,
  53. PART_CLOUD,
  54. PART_WATER,
  55. PART_TREE,
  56. PART_SKY,
  57. PART_NUM,
  58. };
  59.  
  60. enum ETerrainRenderSort
  61. {
  62. DISTANCE_SORT,
  63. TEXTURE_SORT,
  64. };
  65.  
  66. public:
  67. CMapOutdoor();
  68. virtual ~CMapOutdoor();
  69.  
  70. virtual void OnBeginEnvironment();
  71.  
  72. protected:
  73. bool Initialize();
  74. void InitializeFog();
  75.  
  76. virtual bool Destroy();
  77. virtual void OnSetEnvironmentDataPtr();
  78. virtual void OnResetEnvironmentDataPtr();
  79.  
  80. virtual void OnRender();
  81.  
  82. virtual void OnPreAssignTerrainPtr() {};
  83.  
  84. public:
  85. void SetInverseViewAndDynamicShaodwMatrices();
  86. virtual bool Load(float x, float y, float z);
  87. virtual float GetHeight(float x, float y);
  88. virtual float GetCacheHeight(float x, float y);
  89.  
  90. virtual bool Update(float fX, float fY, float fZ);
  91. virtual void UpdateAroundAmbience(float fX, float fY, float fZ);
  92.  
  93. public:
  94. void Clear();
  95.  
  96. void SetVisiblePart(int ePart, bool isVisible);
  97. void SetSplatLimit(int iSplatNum);
  98. std::vector<int> & GetRenderedSplatNum(int * piPatch, int * piSplat, float * pfSplatRatio);
  99. CArea::TCRCWithNumberVector & GetRenderedGraphicThingInstanceNum(DWORD * pdwGraphicThingInstanceNum, DWORD * pdwCRCNum);
  100.  
  101. bool LoadSetting(const char * c_szFileName);
  102.  
  103. void ApplyLight(DWORD dwVersion, const D3DLIGHT8& c_rkLight);
  104. void SetEnvironmentScreenFilter();
  105. void SetEnvironmentSkyBox();
  106. void SetEnvironmentLensFlare();
  107.  
  108. void CreateCharacterShadowTexture();
  109. void ReleaseCharacterShadowTexture();
  110. void SetShadowTextureSize(WORD size);
  111.  
  112. bool BeginRenderCharacterShadowToTexture();
  113. void EndRenderCharacterShadowToTexture();
  114. void RenderWater();
  115. void RenderMarkedArea();
  116. void RecurseRenderAttr(CTerrainQuadtreeNode *Node, bool bCullEnable=TRUE);
  117. void DrawPatchAttr(long patchnum);
  118. void ClearGuildArea();
  119. void RegisterGuildArea(int isx, int isy, int iex, int iey);
  120.  
  121. void VisibleMarkedArea();
  122. void DisableMarkedArea();
  123.  
  124. void UpdateSky();
  125. void RenderCollision();
  126. void RenderSky();
  127. void RenderCloud();
  128. void RenderBeforeLensFlare();
  129. void RenderAfterLensFlare();
  130. void RenderScreenFiltering();
  131.  
  132. void SetWireframe(bool bWireFrame);
  133. bool IsWireframe();
  134.  
  135. bool GetPickingPointWithRay(const CRay & rRay, D3DXVECTOR3 * v3IntersectPt);
  136. bool GetPickingPointWithRayOnlyTerrain(const CRay & rRay, D3DXVECTOR3 * v3IntersectPt);
  137. bool GetPickingPoint(D3DXVECTOR3 * v3IntersectPt);
  138. void GetTerrainCount(short * psTerrainCountX, short * psTerrainCountY)
  139. {
  140. *psTerrainCountX = m_sTerrainCountX;
  141. *psTerrainCountY = m_sTerrainCountY;
  142. }
  143.  
  144. bool SetTerrainCount(short sTerrainCountX, short sTerrainCountY);
  145.  
  146. // Shadow
  147. void SetDrawShadow(bool bDrawShadow);
  148. void SetDrawCharacterShadow(bool bDrawChrShadow);
  149.  
  150. DWORD GetShadowMapColor(float fx, float fy);
  151.  
  152. protected:
  153. bool __PickTerrainHeight(float& fPos, const D3DXVECTOR3& v3Start, const D3DXVECTOR3& v3End, float fStep, float fRayRange, float fLimitRange, D3DXVECTOR3* pv3Pick);
  154.  
  155. virtual void __ClearGarvage();
  156. virtual void __UpdateGarvage();
  157.  
  158. virtual bool LoadTerrain(WORD wTerrainCoordX, WORD wTerrainCoordY, WORD wCellCoordX, WORD wCellCoordY);
  159. virtual bool LoadArea(WORD wAreaCoordX, WORD wAreaCoordY, WORD wCellCoordX, WORD wCellCoordY);
  160. virtual void UpdateAreaList(long lCenterX, long lCenterY);
  161. bool isTerrainLoaded(WORD wX, WORD wY);
  162. bool isAreaLoaded(WORD wX, WORD wY);
  163.  
  164. void AssignTerrainPtr(); // 현재 좌표에서 주위(ex. 3x3)에 있는 것들의 포인터를 연결한다. (업데이트 시 불려짐)
  165.  
  166. void SaveAlphaFogOperation();
  167. void RestoreAlphaFogOperation();
  168.  
  169. //////////////////////////////////////////////////////////////////////////
  170. // New
  171. //////////////////////////////////////////////////////////////////////////
  172. // 여러가지 맵들을 얻는다.
  173. void GetHeightMap(const BYTE & c_rucTerrainNum, WORD ** pwHeightMap);
  174. void GetNormalMap(const BYTE & c_rucTerrainNum, char ** pucNormalMap);
  175.  
  176. // Water
  177. void GetWaterMap(const BYTE & c_rucTerrainNum, BYTE ** pucWaterMap);
  178. void GetWaterHeight(BYTE byTerrainNum, BYTE byWaterNum, long * plWaterHeight);
  179.  
  180.  
  181. //////////////////////////////////////////////////////////////////////////
  182. // Terrain
  183. //////////////////////////////////////////////////////////////////////////
  184. protected:
  185. // 데이터
  186. CTerrain * m_pTerrain[AROUND_AREA_NUM]; // Terrain
  187. CTerrainPatchProxy * m_pTerrainPatchProxyList; // CTerrain을 랜더링 할때 실제로 랜더링하는 폴리곤 패치들... Seamless Map 을 위해 CTerrain으로부터 독립...
  188.  
  189. long m_lViewRadius; // 시야 거리.. 셀단위임..
  190. float m_fHeightScale; // 높이 스케일... 1.0일때 0~655.35미터까지 표현 가능.
  191.  
  192. short m_sTerrainCountX, m_sTerrainCountY; // seamless map 안에 들어가는 Terrain개수
  193.  
  194. TOutdoorMapCoordinate m_CurCoordinate; // 현재의 좌표
  195.  
  196. long m_lCurCoordStartX, m_lCurCoordStartY;
  197. TOutdoorMapCoordinate m_PrevCoordinate; // 현재의 좌표
  198. TOutdoorMapCoordinateMap m_EntryPointMap;
  199.  
  200. WORD m_wPatchCount;
  201.  
  202. //////////////////////////////////////////////////////////////////////////
  203. // Index Buffer
  204. #ifdef WORLD_EDITOR
  205. WORD * m_pwIndices; /* temp Index buffer */
  206.  
  207. CGraphicIndexBuffer m_IndexBuffer;
  208. WORD m_wNumIndices;
  209. #else
  210. WORD * m_pwaIndices[TERRAINPATCH_LODMAX];
  211.  
  212. CGraphicIndexBuffer m_IndexBuffer[TERRAINPATCH_LODMAX];
  213. WORD m_wNumIndices[TERRAINPATCH_LODMAX];
  214. #endif
  215. virtual void DestroyTerrain();
  216.  
  217. void CreateTerrainPatchProxyList();
  218. void DestroyTerrainPatchProxyList();
  219.  
  220. void UpdateTerrain(float fX, float fY);
  221.  
  222. void ConvertTerrainToTnL(long lx, long ly);
  223.  
  224. void AssignPatch(long lPatchNum, long lx0, long ly0, long lx1, long ly1);
  225.  
  226. //////////////////////////////////////////////////////////////////////////
  227. // Index Buffer
  228. void ADDLvl1TL(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  229. void ADDLvl1T(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  230. void ADDLvl1TR(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  231. void ADDLvl1L(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  232. void ADDLvl1R(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  233. void ADDLvl1BL(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  234. void ADDLvl1B(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  235. void ADDLvl1BR(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  236. void ADDLvl1M(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  237. void ADDLvl2TL(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  238. void ADDLvl2T(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  239. void ADDLvl2TR(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  240. void ADDLvl2L(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  241. void ADDLvl2R(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  242. void ADDLvl2BL(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  243. void ADDLvl2B(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  244. void ADDLvl2BR(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  245. void ADDLvl2M(WORD * pIndices, WORD & rwCount, const WORD & c_rwCurCount, const BYTE & c_rucNumLineWarp);
  246.  
  247. public:
  248. BOOL GetTerrainPointer(BYTE c_ucTerrainNum, CTerrain ** ppTerrain);
  249. float GetTerrainHeight(float fx, float fy);
  250. bool GetWaterHeight(int iX, int iY, long * plWaterHeight);
  251. bool GetNormal(int ix, int iy, D3DXVECTOR3 * pv3Normal);
  252.  
  253. void RenderTerrain();
  254.  
  255. const long GetViewRadius() { return m_lViewRadius; }
  256. const float GetHeightScale() { return m_fHeightScale; }
  257.  
  258. const TOutdoorMapCoordinate & GetEntryPoint(const std::string & c_rstrEntryPointName) const;
  259. void SetEntryPoint(const std::string & c_rstrEntryPointName, const TOutdoorMapCoordinate & c_rOutdoorMapCoordinate);
  260. const TOutdoorMapCoordinate & GetCurCoordinate() { return m_CurCoordinate; }
  261. const TOutdoorMapCoordinate & GetPrevCoordinate() { return m_PrevCoordinate; }
  262.  
  263. //////////////////////////////////////////////////////////////////////////
  264. // Area
  265. //////////////////////////////////////////////////////////////////////////
  266. protected:
  267. CArea * m_pArea[AROUND_AREA_NUM]; // Data
  268.  
  269. virtual void DestroyArea();
  270.  
  271. void __UpdateArea(D3DXVECTOR3& v3Player);
  272. #ifdef WORLD_EDITOR
  273. void __NEW_WorldEditor_UpdateArea();
  274. #endif
  275. void __Game_UpdateArea(D3DXVECTOR3& v3Player);
  276.  
  277. void __BuildDynamicSphereInstanceVector();
  278.  
  279. void __CollectShadowReceiver(D3DXVECTOR3& v3Target, D3DXVECTOR3& v3Light);
  280. void __CollectCollisionPCBlocker(D3DXVECTOR3& v3Eye, D3DXVECTOR3& v3Target, float fDistance);
  281. void __CollectCollisionShadowReceiver(D3DXVECTOR3& v3Target, D3DXVECTOR3& v3Light);
  282. void __UpdateAroundAreaList();
  283. bool __IsInShadowReceiverList(CGraphicObjectInstance* pkObjInstTest);
  284. bool __IsInPCBlockerList(CGraphicObjectInstance* pkObjInstTest);
  285.  
  286. void ConvertToMapCoords(float fx, float fy, int *iCellX, int *iCellY, BYTE * pucSubCellX, BYTE * pucSubCellY, WORD * pwTerrainNumX, WORD * pwTerrainNumY);
  287.  
  288. public:
  289. BOOL GetAreaPointer(const BYTE c_ucAreaNum, CArea ** ppArea);
  290. void RenderArea(bool bRenderAmbience = true);
  291. void RenderBlendArea();
  292. void RenderDungeon();
  293. void RenderEffect();
  294. void RenderPCBlocker();
  295. void RenderTree();
  296.  
  297. public:
  298. //////////////////////////////////////////////////////////////////////////
  299. // For Grass
  300. //////////////////////////////////////////////////////////////////////////
  301. float GetHeight(float* pPos);
  302. bool GetBrushColor(float fX, float fY, float* pLowColor, float* pHighColor);
  303. bool isAttrOn(float fX, float fY, BYTE byAttr);
  304. bool GetAttr(float fX, float fY, BYTE * pbyAttr);
  305. bool isAttrOn(int iX, int iY, BYTE byAttr);
  306. bool GetAttr(int iX, int iY, BYTE * pbyAttr);
  307.  
  308. void SetMaterialDiffuse(float fr, float fg, float fb);
  309. void SetMaterialAmbient(float fr, float fg, float fb);
  310. void SetTerrainMaterial(const PR_MATERIAL * pMaterial);
  311.  
  312. bool GetTerrainNum(float fx, float fy, BYTE * pbyTerrainNum);
  313. bool GetTerrainNumFromCoord(WORD wCoordX, WORD wCoordY, BYTE * pbyTerrainNum);
  314.  
  315. protected:
  316. //////////////////////////////////////////////////////////////////////////
  317. // New
  318. //////////////////////////////////////////////////////////////////////////
  319. long m_lCenterX, m_lCenterY; // Terrain 좌표 내의 셀 좌표...
  320. long m_lOldReadX, m_lOldReadY; /* Last center */
  321.  
  322. //////////////////////////////////////////////////////////////////////////
  323. // Octree
  324. //////////////////////////////////////////////////////////////////////////
  325. CTerrainQuadtreeNode * m_pRootNode;
  326.  
  327. void BuildQuadTree();
  328. CTerrainQuadtreeNode * AllocQuadTreeNode(long x0, long y0, long x1, long y1);
  329. void SubDivideNode(CTerrainQuadtreeNode * Node);
  330. void UpdateQuadTreeHeights(CTerrainQuadtreeNode *Node);
  331.  
  332.  
  333. void FreeQuadTree();
  334.  
  335. struct TPatchDrawStruct
  336. {
  337. float fDistance;
  338. BYTE byTerrainNum;
  339. long lPatchNum;
  340. CTerrainPatchProxy * pTerrainPatchProxy;
  341.  
  342. bool operator<( const TPatchDrawStruct & rhs) const
  343. {
  344. return fDistance < rhs.fDistance;
  345. }
  346. };
  347.  
  348. public:
  349. typedef std::vector<BYTE> TTerrainNumVector;
  350. struct FSortPatchDrawStructWithTerrainNum
  351. {
  352. static TTerrainNumVector m_TerrainNumVector;
  353. FSortPatchDrawStructWithTerrainNum()
  354. {
  355. m_TerrainNumVector.clear();
  356. }
  357.  
  358. bool operator () (const TPatchDrawStruct & lhs, const TPatchDrawStruct & rhs)
  359. {
  360. DWORD lhsTerrainNumOrder = 0, rhsTerrainNumOrder = 0;
  361. bool blhsOrderFound = false;
  362. bool brhsOrderFound = false;
  363.  
  364. TTerrainNumVector::iterator lhsIterator = std::find(m_TerrainNumVector.begin(), m_TerrainNumVector.end(), lhs.byTerrainNum);
  365. TTerrainNumVector::iterator rhsIterator = std::find(m_TerrainNumVector.begin(), m_TerrainNumVector.end(), rhs.byTerrainNum);
  366.  
  367. if (lhsIterator != m_TerrainNumVector.end())
  368. {
  369. blhsOrderFound = true;
  370. lhsTerrainNumOrder = lhsIterator - m_TerrainNumVector.begin();
  371. }
  372. if (rhsIterator != m_TerrainNumVector.end())
  373. {
  374. brhsOrderFound = true;
  375. rhsTerrainNumOrder = rhsIterator - m_TerrainNumVector.begin();
  376. }
  377. if (!brhsOrderFound)
  378. {
  379. m_TerrainNumVector.push_back(rhs.byTerrainNum);
  380. rhsTerrainNumOrder = m_TerrainNumVector.size() -1;
  381. }
  382. if (!blhsOrderFound)
  383. {
  384. lhsIterator = std::find(m_TerrainNumVector.begin(), m_TerrainNumVector.end(), lhs.byTerrainNum);
  385. if (lhsIterator != m_TerrainNumVector.end())
  386. {
  387. blhsOrderFound = true;
  388. lhsTerrainNumOrder = lhsIterator - m_TerrainNumVector.begin();
  389. }
  390. if (!blhsOrderFound)
  391. {
  392. m_TerrainNumVector.push_back(lhs.byTerrainNum);
  393. lhsTerrainNumOrder = m_TerrainNumVector.size() -1;
  394. }
  395. }
  396.  
  397. return lhsTerrainNumOrder < rhsTerrainNumOrder;
  398. }
  399. };
  400.  
  401. protected:
  402.  
  403. std::vector<std::pair<float, long> > m_PatchVector;
  404. std::vector<TPatchDrawStruct> m_PatchDrawStructVector;
  405.  
  406. void SetPatchDrawVector();
  407.  
  408. void NEW_DrawWireFrame(CTerrainPatchProxy * pTerrainPatchProxy, WORD wPrimitiveCount, D3DPRIMITIVETYPE ePrimitiveType);
  409.  
  410. void DrawWireFrame(long patchnum, WORD wPrimitiveCount, D3DPRIMITIVETYPE ePrimitiveType);
  411. void DrawWater(long patchnum);
  412.  
  413. bool m_bDrawWireFrame;
  414. bool m_bDrawShadow;
  415. bool m_bDrawChrShadow;
  416.  
  417. //////////////////////////////////////////////////////////////////////////
  418. // Water
  419. D3DXMATRIX m_matBump;
  420. void LoadWaterTexture();
  421. void UnloadWaterTexture();
  422. //Water
  423. //////////////////////////////////////////////////////////////////////////
  424.  
  425. //////////////////////////////////////////////////////////////////////////
  426. // Alpha Fog
  427. CGraphicImageInstance m_AlphaFogImageInstance;
  428. D3DXMATRIX m_matAlphaFogTexture;
  429. // Alpha Fog
  430. //////////////////////////////////////////////////////////////////////////
  431.  
  432. //////////////////////////////////////////////////////////////////////////
  433. // Character Shadow
  434. LPDIRECT3DTEXTURE8 m_lpCharacterShadowMapTexture;
  435. LPDIRECT3DSURFACE8 m_lpCharacterShadowMapRenderTargetSurface;
  436. LPDIRECT3DSURFACE8 m_lpCharacterShadowMapDepthSurface;
  437. D3DVIEWPORT8 m_ShadowMapViewport;
  438. WORD m_wShadowMapSize;
  439.  
  440. // Backup Device Context
  441. LPDIRECT3DSURFACE8 m_lpBackupRenderTargetSurface;
  442. LPDIRECT3DSURFACE8 m_lpBackupDepthSurface;
  443. D3DVIEWPORT8 m_BackupViewport;
  444.  
  445. // Character Shadow
  446. //////////////////////////////////////////////////////////////////////////
  447.  
  448. // View Frustum Culling
  449. D3DXPLANE m_plane[6];
  450.  
  451. void BuildViewFrustum(D3DXMATRIX & mat);
  452.  
  453. CTextureSet m_TextureSet;
  454.  
  455. protected:
  456. CSkyBox m_SkyBox;
  457. CLensFlare m_LensFlare;
  458. CScreenFilter m_ScreenFilter;
  459.  
  460. protected:
  461. void SetIndexBuffer();
  462. void SelectIndexBuffer(BYTE byLODLevel, WORD * pwPrimitiveCount, D3DPRIMITIVETYPE * pePrimitiveType);
  463.  
  464. D3DXMATRIX m_matWorldForCommonUse;
  465. D3DXMATRIX m_matViewInverse;
  466.  
  467. D3DXMATRIX m_matSplatAlpha;
  468. D3DXMATRIX m_matStaticShadow;
  469. D3DXMATRIX m_matDynamicShadow;
  470. D3DXMATRIX m_matDynamicShadowScale;
  471. D3DXMATRIX m_matLightView;
  472.  
  473. float m_fTerrainTexCoordBase;
  474. float m_fWaterTexCoordBase;
  475.  
  476. float m_fXforDistanceCaculation, m_fYforDistanceCaculation;
  477.  
  478. protected:
  479. typedef std::vector<CTerrain *> TTerrainPtrVector;
  480. typedef TTerrainPtrVector::iterator TTerrainPtrVectorIterator;
  481. typedef std::vector<CArea *> TAreaPtrVector;
  482. typedef TAreaPtrVector::iterator TAreaPtrVectorIterator;
  483.  
  484. TTerrainPtrVector m_TerrainVector;
  485. TTerrainPtrVector m_TerrainDeleteVector;
  486. TTerrainPtrVector m_TerrainLoadRequestVector;
  487. TTerrainPtrVector m_TerrainLoadWaitVector;
  488. TTerrainPtrVectorIterator m_TerrainPtrVectorIterator;
  489.  
  490. TAreaPtrVector m_AreaVector;
  491. TAreaPtrVector m_AreaDeleteVector;
  492. TAreaPtrVector m_AreaLoadRequestVector;
  493. TAreaPtrVector m_AreaLoadWaitVector;
  494. TAreaPtrVectorIterator m_AreaPtrVectorIterator;
  495.  
  496. struct FPushToDeleteVector
  497. {
  498. enum EDeleteDir
  499. {
  500. DELETE_LEFT,
  501. DELETE_RIGHT,
  502. DELETE_TOP,
  503. DELETE_BOTTOM,
  504. };
  505.  
  506. EDeleteDir m_eLRDeleteDir;
  507. EDeleteDir m_eTBDeleteDir;
  508. TOutdoorMapCoordinate m_CurCoordinate;
  509.  
  510. FPushToDeleteVector(EDeleteDir eLRDeleteDir, EDeleteDir eTBDeleteDir, TOutdoorMapCoordinate CurCoord)
  511. {
  512. m_eLRDeleteDir = eLRDeleteDir;
  513. m_eTBDeleteDir = eTBDeleteDir;
  514. m_CurCoordinate = CurCoord;
  515. }
  516. };
  517.  
  518. struct FPushTerrainToDeleteVector : public FPushToDeleteVector
  519. {
  520. TTerrainPtrVector m_ReturnTerrainVector;
  521.  
  522. FPushTerrainToDeleteVector(EDeleteDir eLRDeleteDir, EDeleteDir eTBDeleteDir, TOutdoorMapCoordinate CurCoord)
  523. : FPushToDeleteVector(eLRDeleteDir, eTBDeleteDir, CurCoord)
  524. {
  525. m_ReturnTerrainVector.clear();
  526. }
  527.  
  528. void operator() (CTerrain * pTerrain);
  529. };
  530.  
  531. struct FPushAreaToDeleteVector : public FPushToDeleteVector
  532. {
  533. TAreaPtrVector m_ReturnAreaVector;
  534.  
  535. FPushAreaToDeleteVector(EDeleteDir eLRDeleteDir, EDeleteDir eTBDeleteDir, TOutdoorMapCoordinate CurCoord)
  536. : FPushToDeleteVector(eLRDeleteDir, eTBDeleteDir, CurCoord)
  537. {
  538. m_ReturnAreaVector.clear();
  539. }
  540.  
  541. void operator() (CArea * pArea);
  542. };
  543.  
  544. protected:
  545. void InitializeVisibleParts();
  546. bool IsVisiblePart(int ePart);
  547.  
  548. float __GetNoFogDistance();
  549. float __GetFogDistance();
  550.  
  551.  
  552. protected:
  553. DWORD m_dwVisiblePartFlags;
  554.  
  555. int m_iRenderedSplatNumSqSum;
  556. int m_iRenderedSplatNum;
  557. int m_iRenderedPatchNum;
  558. std::vector<int> m_RenderedTextureNumVector;
  559. int m_iSplatLimit;
  560.  
  561. protected:
  562. int m_iPatchTerrainVertexCount;
  563. int m_iPatchWaterVertexCount;
  564.  
  565. int m_iPatchTerrainVertexSize;
  566. int m_iPatchWaterVertexSize;
  567.  
  568. DWORD m_dwRenderedCRCNum;
  569. DWORD m_dwRenderedGraphicThingInstanceNum;
  570.  
  571. std::list<RECT> m_rkList_kGuildArea;
  572.  
  573. protected:
  574. void __RenderTerrain_RecurseRenderQuadTree(CTerrainQuadtreeNode *Node, bool bCullCheckNeed = true);
  575. int __RenderTerrain_RecurseRenderQuadTree_CheckBoundingCircle(const D3DXVECTOR3 & c_v3Center, const float & c_fRadius);
  576.  
  577. void __RenderTerrain_AppendPatch(const D3DXVECTOR3& c_rv3Center, float fDistance, long lPatchNum);
  578.  
  579. void __RenderTerrain_RenderSoftwareTransformPatch();
  580. void __RenderTerrain_RenderHardwareTransformPatch();
  581.  
  582. protected:
  583. void __HardwareTransformPatch_RenderPatchSplat(long patchnum, WORD wPrimitiveCount, D3DPRIMITIVETYPE ePrimitiveType);
  584. void __HardwareTransformPatch_RenderPatchNone(long patchnum, WORD wPrimitiveCount, D3DPRIMITIVETYPE ePrimitiveType);
  585.  
  586.  
  587. protected:
  588. struct SoftwareTransformPatch_SData
  589. {
  590. enum
  591. {
  592. SPLAT_VB_NUM = 8,
  593. NONE_VB_NUM = 8,
  594. };
  595.  
  596. IDirect3DVertexBuffer8* m_pkVBSplat[SPLAT_VB_NUM];
  597. IDirect3DVertexBuffer8* m_pkVBNone[NONE_VB_NUM];
  598. DWORD m_dwSplatPos;
  599. DWORD m_dwNonePos;
  600. DWORD m_dwLightVersion;
  601. } m_kSTPD;
  602.  
  603. struct SoftwareTransformPatch_SRenderState {
  604. D3DXMATRIX m_m4Proj;
  605. D3DXMATRIX m_m4Frustum;
  606. D3DXMATRIX m_m4DynamicShadow;
  607. D3DLIGHT8 m_kLight;
  608. D3DMATERIAL8 m_kMtrl;
  609. D3DXVECTOR3 m_v3Player;
  610. DWORD m_dwFogColor;
  611. float m_fScreenHalfWidth;
  612. float m_fScreenHalfHeight;
  613.  
  614. float m_fFogNearDistance;
  615. float m_fFogFarDistance;
  616. float m_fFogNearTransZ;
  617. float m_fFogFarTransZ;
  618. float m_fFogLenInv;
  619. };
  620.  
  621. struct SoftwareTransformPatch_STVertex
  622. {
  623. D3DXVECTOR4 kPosition;
  624. };
  625.  
  626. struct SoftwareTransformPatch_STLVertex
  627. {
  628. D3DXVECTOR4 kPosition;
  629. DWORD dwDiffuse;
  630. DWORD dwFog;
  631. D3DXVECTOR2 kTexTile;
  632. D3DXVECTOR2 kTexAlpha;
  633. D3DXVECTOR2 kTexStaticShadow;
  634. D3DXVECTOR2 kTexDynamicShadow;
  635. };
  636.  
  637.  
  638. void __SoftwareTransformPatch_ApplyRenderState();
  639. void __SoftwareTransformPatch_RestoreRenderState(DWORD dwFogEnable);
  640.  
  641. void __SoftwareTransformPatch_Initialize();
  642. bool __SoftwareTransformPatch_Create();
  643. void __SoftwareTransformPatch_Destroy();
  644. void __SoftwareTransformPatch_BuildPipeline(SoftwareTransformPatch_SRenderState& rkTPRS);
  645. void __SoftwareTransformPatch_BuildPipeline_BuildFogFuncTable(SoftwareTransformPatch_SRenderState& rkTPRS);
  646. bool __SoftwareTransformPatch_SetTransform(SoftwareTransformPatch_SRenderState& rkTPRS, SoftwareTransformPatch_STLVertex* akTransVertex, CTerrainPatchProxy& rkTerrainPatchProxy, UINT uTerrainX, UINT uTerrainY, bool isFogEnable, bool isDynamicShadow);
  647.  
  648. bool __SoftwareTransformPatch_SetSplatStream(SoftwareTransformPatch_STLVertex* akTransVertex);
  649. bool __SoftwareTransformPatch_SetShadowStream(SoftwareTransformPatch_STLVertex* akTransVertex);
  650.  
  651. void __SoftwareTransformPatch_ApplyStaticShadowRenderState();
  652. void __SoftwareTransformPatch_RestoreStaticShadowRenderState();
  653.  
  654. void __SoftwareTransformPatch_ApplyFogShadowRenderState();
  655. void __SoftwareTransformPatch_RestoreFogShadowRenderState();
  656. void __SoftwareTransformPatch_ApplyDynamicShadowRenderState();
  657. void __SoftwareTransformPatch_RestoreDynamicShadowRenderState();
  658. void __SoftwareTransformPatch_RenderPatchSplat(SoftwareTransformPatch_SRenderState& rkTPRS, long patchnum, WORD wPrimitiveCount, D3DPRIMITIVETYPE ePrimitiveType, bool isFogEnable);
  659. void __SoftwareTransformPatch_RenderPatchNone(SoftwareTransformPatch_SRenderState& rkTPRS, long patchnum, WORD wPrimitiveCount, D3DPRIMITIVETYPE ePrimitiveType);
  660.  
  661.  
  662. protected:
  663. std::vector<CGraphicObjectInstance *> m_ShadowReceiverVector;
  664. std::vector<CGraphicObjectInstance *> m_PCBlockerVector;
  665.  
  666. protected:
  667. float m_fOpaqueWaterDepth;
  668. CGraphicImageInstance m_WaterInstances[30];
  669.  
  670. public:
  671. float GetOpaqueWaterDepth() { return m_fOpaqueWaterDepth; }
  672. void SetOpaqueWaterDepth(float fOpaqueWaterDepth) { m_fOpaqueWaterDepth = fOpaqueWaterDepth; }
  673. void SetTerrainRenderSort(ETerrainRenderSort eTerrainRenderSort) { m_eTerrainRenderSort = eTerrainRenderSort;}
  674. ETerrainRenderSort GetTerrainRenderSort() { return m_eTerrainRenderSort; }
  675.  
  676. protected:
  677. ETerrainRenderSort m_eTerrainRenderSort;
  678.  
  679. protected:
  680. CGraphicImageInstance m_attrImageInstance;
  681. CGraphicImageInstance m_BuildingTransparentImageInstance;
  682. D3DXMATRIX m_matBuildingTransparent;
  683.  
  684. protected:
  685. CDynamicPool<CMonsterAreaInfo> m_kPool_kMonsterAreaInfo;
  686. TMonsterAreaInfoPtrVector m_MonsterAreaInfoPtrVector;
  687. TMonsterAreaInfoPtrVectorIterator m_MonsterAreaInfoPtrVectorIterator;
  688.  
  689. public:
  690. bool LoadMonsterAreaInfo();
  691.  
  692. CMonsterAreaInfo * AddMonsterAreaInfo(long lOriginX, long lOriginY, long lSizeX, long lSizeY);
  693. void RemoveAllMonsterAreaInfo();
  694.  
  695. DWORD GetMonsterAreaInfoCount() { return m_MonsterAreaInfoPtrVector.size(); }
  696. bool GetMonsterAreaInfoFromVectorIndex(DWORD dwMonsterAreaInfoVectorIndex, CMonsterAreaInfo ** ppMonsterAreaInfo);
  697.  
  698. CMonsterAreaInfo * AddNewMonsterAreaInfo(long lOriginX, long lOriginY, long lSizeX, long lSizeY,
  699. CMonsterAreaInfo::EMonsterAreaInfoType eMonsterAreaInfoType,
  700. DWORD dwVID, DWORD dwCount, CMonsterAreaInfo::EMonsterDir eMonsterDir);
  701.  
  702. public:
  703. void GetBaseXY(DWORD * pdwBaseX, DWORD * pdwBaseY);
  704. void SetBaseXY(DWORD dwBaseX, DWORD dwBaseY);
  705.  
  706. void SetTransparentTree(bool bTransparentTree) { m_bTransparentTree = bTransparentTree;}
  707. void EnableTerrainOnlyForHeight(bool bFlag) { m_bEnableTerrainOnlyForHeight = bFlag; }
  708. void EnablePortal(bool bFlag);
  709. bool IsEnablePortal() { return m_bEnablePortal; }
  710.  
  711. protected:
  712. DWORD m_dwBaseX;
  713. DWORD m_dwBaseY;
  714.  
  715. D3DXVECTOR3 m_v3Player;
  716.  
  717. bool m_bShowEntirePatchTextureCount;
  718. bool m_bTransparentTree;
  719. bool m_bEnableTerrainOnlyForHeight;
  720. bool m_bEnablePortal;
  721.  
  722. // XMas
  723. private:
  724. struct SXMasTree
  725. {
  726. CSpeedTreeWrapper* m_pkTree;
  727. int m_iEffectID;
  728. } m_kXMas;
  729.  
  730. void __XMasTree_Initialize();
  731. void __XMasTree_Create(float x, float y, float z, const char* c_szTreeName, const char* c_szEffName);
  732.  
  733. public:
  734. void XMasTree_Destroy();
  735. void XMasTree_Set(float x, float y, float z, const char* c_szTreeName, const char* c_szEffName);
  736.  
  737. // Special Effect
  738. private:
  739. typedef std::map<DWORD, int> TSpecialEffectMap;
  740. TSpecialEffectMap m_kMap_dwID_iEffectID;
  741.  
  742. #ifdef ENABLE_PRIVATE_SHOP_SEARCH_SYSTEM
  743. private:
  744. int m_iLastShopPos;
  745.  
  746. public:
  747. void SpecialShopPosEffect_Create(DWORD dwID, float x, float y, float z, const char* c_szEffName);
  748. void SpecialShopPosEffect_Delete();
  749. #endif
  750.  
  751. public:
  752. void SpecialEffect_Create(DWORD dwID, float x, float y, float z, const char* c_szEffName);
  753. void SpecialEffect_Delete(DWORD dwID);
  754. void SpecialEffect_Destroy();
  755.  
  756. private:
  757. struct SHeightCache
  758. {
  759. struct SItem
  760. {
  761. DWORD m_dwKey;
  762. float m_fHeight;
  763. };
  764.  
  765. enum
  766. {
  767. HASH_SIZE = 100,
  768. };
  769.  
  770. std::vector<SItem> m_akVct_kItem[HASH_SIZE];
  771.  
  772. bool m_isUpdated;
  773. } m_kHeightCache;
  774.  
  775. void __HeightCache_Init();
  776. void __HeightCache_Update();
  777.  
  778. public:
  779. void SetEnvironmentDataName(const std::string& strEnvironmentDataName);
  780. std::string& GetEnvironmentDataName();
  781.  
  782. protected:
  783. std::string m_settings_envDataName;
  784. std::string m_envDataName;
  785.  
  786. private:
  787. bool m_bSettingTerrainVisible;
  788. };
  789.  
Advertisement
Add Comment
Please, Sign In to add comment