Guest User

MapOutdoor

a guest
Jan 6th, 2026
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 44.81 KB | None | 0 0
  1. #include "StdAfx.h"
  2. #include "../eterlib/StateManager.h"
  3. #include "../eterlib/Camera.h"
  4. #include "../PRTerrainLib/StdAfx.h"
  5. #include "../EffectLib/EffectManager.h"
  6.  
  7. #include "MapOutdoor.h"
  8. #include "TerrainPatch.h"
  9. #include "AreaTerrain.h"
  10.  
  11. //#define USE_LEVEL
  12. // unsigned int uiNumSplat;
  13.  
  14. struct FGetObjectHeight
  15. {
  16. bool m_bHeightFound;
  17. float m_fReturnHeight;
  18. float m_fRequestX, m_fRequestY;
  19. FGetObjectHeight(float fRequestX, float fRequestY)
  20. {
  21. m_fRequestX=fRequestX;
  22. m_fRequestY=fRequestY;
  23. m_bHeightFound=false;
  24. m_fReturnHeight=0.0f;
  25. }
  26. void operator () (CGraphicObjectInstance * pObject)
  27. {
  28. if (pObject->GetObjectHeight(m_fRequestX, m_fRequestY, &m_fReturnHeight))
  29. {
  30. #ifdef SPHERELIB_STRICT
  31. printf("FIND %f\n", m_fReturnHeight);
  32. #endif
  33. m_bHeightFound = true;
  34. }
  35. }
  36. };
  37.  
  38. struct FGetPickingPoint
  39. {
  40. D3DXVECTOR3 m_v3Start;
  41. D3DXVECTOR3 m_v3Dir;
  42. D3DXVECTOR3 m_v3PickingPoint;
  43. bool m_bPicked;
  44.  
  45. FGetPickingPoint(D3DXVECTOR3 & v3Start, D3DXVECTOR3 & v3Dir) : m_v3Start(v3Start), m_v3Dir(v3Dir), m_bPicked(false) {}
  46. void operator() (CGraphicObjectInstance * pInstance)
  47. {
  48. if( pInstance && pInstance->GetType() == CGraphicThingInstance::ID )
  49. {
  50. CGraphicThingInstance * pThing = (CGraphicThingInstance *)pInstance;
  51. if (!pThing->IsObjectHeight())
  52. return;
  53.  
  54. float fX, fY, fZ;
  55. if (pThing->Picking(m_v3Start, m_v3Dir, fX, fY))
  56. {
  57. if (pThing->GetObjectHeight(fX, -fY, &fZ))
  58. {
  59. m_v3PickingPoint.x = fX;
  60. m_v3PickingPoint.y = fY;
  61. m_v3PickingPoint.z = fZ;
  62. m_bPicked = true;
  63. }
  64. }
  65. }
  66. }
  67. };
  68.  
  69. CMapOutdoor::CMapOutdoor()
  70. {
  71. CGraphicImage * pAlphaFogImage = (CGraphicImage *) CResourceManager::Instance().GetResourcePointer("D:/ymir work/special/fog.tga");
  72. CGraphicImage * pAttrImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer("d:/ymir work/special/white.dds");
  73. CGraphicImage * pBuildTransparentImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer("d:/ymir Work/special/PCBlockerAlpha.dds");
  74. m_AlphaFogImageInstance.SetImagePointer(pAlphaFogImage);
  75. m_attrImageInstance.SetImagePointer(pAttrImage);
  76. m_BuildingTransparentImageInstance.SetImagePointer(pBuildTransparentImage);
  77.  
  78. Initialize();
  79.  
  80. __SoftwareTransformPatch_Initialize();
  81. __SoftwareTransformPatch_Create();
  82. }
  83.  
  84. CMapOutdoor::~CMapOutdoor()
  85. {
  86. __SoftwareTransformPatch_Destroy();
  87.  
  88. // 2004.10.14.myevan.TEMP_CAreaLoaderThread
  89. //ms_AreaLoaderThread.Shutdown();
  90. Destroy();
  91. }
  92.  
  93. bool CMapOutdoor::Initialize()
  94. {
  95. BYTE i;
  96. for (i = 0; i < AROUND_AREA_NUM; ++i)
  97. {
  98. m_pArea[i] = NULL;
  99. m_pTerrain[i] = NULL;
  100. }
  101.  
  102. m_pTerrainPatchProxyList = NULL;
  103.  
  104. m_lViewRadius = 0L;
  105. m_fHeightScale = 0.0f;
  106.  
  107. m_sTerrainCountX = m_sTerrainCountY = 0;
  108.  
  109. m_CurCoordinate.m_sTerrainCoordX = -1;
  110. m_CurCoordinate.m_sTerrainCoordY = -1;
  111. m_PrevCoordinate.m_sTerrainCoordX = -1;
  112. m_PrevCoordinate.m_sTerrainCoordY = -1;
  113.  
  114. m_EntryPointMap.clear();
  115.  
  116. m_lCenterX = m_lCenterY = 0;
  117. m_lOldReadX = m_lOldReadY = -1;
  118.  
  119. #ifdef WORLD_EDITOR
  120. m_pwIndices = NULL;
  121. #else
  122. memset(m_pwaIndices, 0, sizeof(m_pwaIndices));
  123. for (i = 0; i < TERRAINPATCH_LODMAX; ++i)
  124. m_IndexBuffer[i].Destroy();
  125. #endif
  126.  
  127. m_bSettingTerrainVisible = false;
  128. m_bDrawWireFrame = false;
  129. m_bDrawShadow = false;
  130. m_bDrawChrShadow = false;
  131.  
  132. m_iSplatLimit = 50000;
  133.  
  134. m_wPatchCount = 0;
  135.  
  136. m_pRootNode = NULL;
  137.  
  138. //////////////////////////////////////////////////////////////////////////
  139. // Character Shadow
  140. m_lpCharacterShadowMapTexture = NULL;
  141. m_lpCharacterShadowMapRenderTargetSurface = NULL;
  142. m_lpCharacterShadowMapDepthSurface = NULL;
  143.  
  144. m_lpBackupRenderTargetSurface = NULL;
  145. m_lpBackupDepthSurface = NULL;
  146. // Character Shadow
  147. //////////////////////////////////////////////////////////////////////////
  148.  
  149. m_iRenderedPatchNum = 0;
  150. m_iRenderedSplatNum = 0;
  151.  
  152. //////////////////////////////////////////////////////////////////////////
  153. m_fOpaqueWaterDepth = 400.0f;
  154.  
  155. //////////////////////////////////////////////////////////////////////////
  156. m_TerrainVector.clear();
  157. m_TerrainDeleteVector.clear();
  158. m_TerrainLoadRequestVector.clear();
  159. m_TerrainLoadWaitVector.clear();
  160.  
  161. m_AreaVector.clear();
  162. m_AreaDeleteVector.clear();
  163. m_AreaLoadRequestVector.clear();
  164. m_AreaLoadWaitVector.clear();
  165. //////////////////////////////////////////////////////////////////////////
  166.  
  167. m_PatchVector.clear();
  168.  
  169. // 2004.10.14.myevan.TEMP_CAreaLoaderThread
  170. //m_bBGLoadingEnable = false;
  171. m_eTerrainRenderSort = DISTANCE_SORT;
  172.  
  173. D3DXMatrixIdentity(&m_matWorldForCommonUse);
  174.  
  175. InitializeFog();
  176. InitializeVisibleParts();
  177.  
  178. m_dwBaseX = 0;
  179. m_dwBaseY = 0;
  180.  
  181. m_settings_envDataName = "";
  182. m_bShowEntirePatchTextureCount = false;
  183. m_bTransparentTree = true;
  184.  
  185. CMapBase::Clear();
  186.  
  187. __XMasTree_Initialize();
  188. SpecialEffect_Destroy();
  189.  
  190. m_bEnableTerrainOnlyForHeight = FALSE;
  191. m_bEnablePortal = FALSE;
  192.  
  193. m_wShadowMapSize = 512;
  194. return true;
  195. }
  196.  
  197.  
  198. bool CMapOutdoor::Destroy()
  199. {
  200. m_bEnableTerrainOnlyForHeight = FALSE;
  201. m_bEnablePortal = FALSE;
  202.  
  203. XMasTree_Destroy();
  204.  
  205. DestroyTerrain();
  206. DestroyArea();
  207. DestroyTerrainPatchProxyList();
  208.  
  209. FreeQuadTree();
  210. ReleaseCharacterShadowTexture();
  211.  
  212. CTerrain::DestroySystem();
  213. CArea::DestroySystem();
  214.  
  215. RemoveAllMonsterAreaInfo();
  216.  
  217. m_rkList_kGuildArea.clear();
  218. m_kPool_kMonsterAreaInfo.Destroy();
  219. m_AlphaFogImageInstance.Destroy();
  220.  
  221. CSpeedTreeForestDirectX8::Instance().Clear();
  222.  
  223. return true;
  224. }
  225.  
  226. void CMapOutdoor::Clear()
  227. {
  228. UnloadWaterTexture();
  229. Destroy(); // 해제
  230. Initialize(); // 초기화
  231. }
  232.  
  233. bool CMapOutdoor::SetTerrainCount(short sTerrainCountX, short sTerrainCountY)
  234. {
  235. if (0 == sTerrainCountX || MAX_MAPSIZE < sTerrainCountX)
  236. return false;
  237.  
  238. if (0 == sTerrainCountY || MAX_MAPSIZE < sTerrainCountY)
  239. return false;
  240.  
  241. m_sTerrainCountX = sTerrainCountX;
  242. m_sTerrainCountY = sTerrainCountY;
  243. return true;
  244. }
  245.  
  246. void CMapOutdoor::OnBeginEnvironment()
  247. {
  248. if (!mc_pEnvironmentData)
  249. return;
  250.  
  251. CSpeedTreeForestDirectX8& rkForest=CSpeedTreeForestDirectX8::Instance();
  252. rkForest.SetFog(
  253. mc_pEnvironmentData->GetFogNearDistance(),
  254. mc_pEnvironmentData->GetFogFarDistance()
  255. );
  256.  
  257. const D3DLIGHT8& c_rkLight = mc_pEnvironmentData->DirLights[ENV_DIRLIGHT_CHARACTER];
  258. rkForest.SetLight(
  259. (const float *)&c_rkLight.Direction,
  260. (const float *)&c_rkLight.Ambient,
  261. (const float *)&c_rkLight.Diffuse);
  262.  
  263. rkForest.SetWindStrength(mc_pEnvironmentData->fWindStrength);
  264. }
  265.  
  266. void CMapOutdoor::OnSetEnvironmentDataPtr()
  267. {
  268. SetEnvironmentScreenFilter();
  269. SetEnvironmentSkyBox();
  270. SetEnvironmentLensFlare();
  271. }
  272.  
  273. void CMapOutdoor::OnResetEnvironmentDataPtr()
  274. {
  275. m_SkyBox.Unload();
  276. SetEnvironmentScreenFilter();
  277. SetEnvironmentSkyBox();
  278. SetEnvironmentLensFlare();
  279. }
  280.  
  281. void CMapOutdoor::SetEnvironmentScreenFilter()
  282. {
  283. if (!mc_pEnvironmentData)
  284. return;
  285.  
  286. m_ScreenFilter.SetEnable(mc_pEnvironmentData->bFilteringEnable);
  287. m_ScreenFilter.SetBlendType(mc_pEnvironmentData->byFilteringAlphaSrc, mc_pEnvironmentData->byFilteringAlphaDest);
  288. m_ScreenFilter.SetColor(mc_pEnvironmentData->FilteringColor);
  289. }
  290.  
  291. void CMapOutdoor::SetEnvironmentSkyBox()
  292. {
  293. if (!mc_pEnvironmentData)
  294. return;
  295.  
  296. m_SkyBox.SetSkyBoxScale(mc_pEnvironmentData->v3SkyBoxScale);
  297. m_SkyBox.SetGradientLevel(mc_pEnvironmentData->bySkyBoxGradientLevelUpper, mc_pEnvironmentData->bySkyBoxGradientLevelLower);
  298. m_SkyBox.SetRenderMode( (mc_pEnvironmentData->bSkyBoxTextureRenderMode == TRUE) ? CSkyObject::SKY_RENDER_MODE_TEXTURE : CSkyObject::SKY_RENDER_MODE_DIFFUSE);
  299.  
  300. for( int i = 0; i < 6; ++i )
  301. {
  302. if (!mc_pEnvironmentData->strSkyBoxFaceFileName[i].empty())
  303. m_SkyBox.SetFaceTexture( mc_pEnvironmentData->strSkyBoxFaceFileName[i].c_str(), i );
  304. }
  305.  
  306. if (!mc_pEnvironmentData->strCloudTextureFileName.empty())
  307. m_SkyBox.SetCloudTexture(mc_pEnvironmentData->strCloudTextureFileName.c_str());
  308.  
  309. m_SkyBox.SetCloudScale(mc_pEnvironmentData->v2CloudScale);
  310. m_SkyBox.SetCloudHeight(mc_pEnvironmentData->fCloudHeight);
  311. m_SkyBox.SetCloudTextureScale(mc_pEnvironmentData->v2CloudTextureScale);
  312. m_SkyBox.SetCloudScrollSpeed(mc_pEnvironmentData->v2CloudSpeed);
  313. m_SkyBox.Refresh();
  314.  
  315. // Temporary
  316. m_SkyBox.SetCloudColor(mc_pEnvironmentData->CloudGradientColor, mc_pEnvironmentData->CloudGradientColor, 1);
  317.  
  318. if (!mc_pEnvironmentData->SkyBoxGradientColorVector.empty())
  319. m_SkyBox.SetSkyColor(mc_pEnvironmentData->SkyBoxGradientColorVector, mc_pEnvironmentData->SkyBoxGradientColorVector, 1);
  320. // Temporary
  321.  
  322. m_SkyBox.StartTransition();
  323. }
  324.  
  325. void CMapOutdoor::SetEnvironmentLensFlare()
  326. {
  327. if (!mc_pEnvironmentData)
  328. return;
  329.  
  330. m_LensFlare.CharacterizeFlare(mc_pEnvironmentData->bLensFlareEnable == 1 ? true : false,
  331. mc_pEnvironmentData->bMainFlareEnable == 1 ? true : false,
  332. mc_pEnvironmentData->fLensFlareMaxBrightness,
  333. mc_pEnvironmentData->LensFlareBrightnessColor);
  334.  
  335. m_LensFlare.Initialize("d:/ymir work/environment");
  336.  
  337. if (!mc_pEnvironmentData->strMainFlareTextureFileName.empty())
  338. m_LensFlare.SetMainFlare(mc_pEnvironmentData->strMainFlareTextureFileName.c_str(),
  339. mc_pEnvironmentData->fMainFlareSize);
  340. }
  341.  
  342. void CMapOutdoor::SetWireframe(bool bWireFrame)
  343. {
  344. m_bDrawWireFrame = bWireFrame;
  345. }
  346.  
  347. bool CMapOutdoor::IsWireframe()
  348. {
  349. return m_bDrawWireFrame;
  350. }
  351.  
  352. //////////////////////////////////////////////////////////////////////////
  353. // TerrainPatchList
  354. //////////////////////////////////////////////////////////////////////////
  355. void CMapOutdoor::CreateTerrainPatchProxyList()
  356. {
  357. m_wPatchCount = ((m_lViewRadius * 2) / TERRAIN_PATCHSIZE) + 2;
  358.  
  359. m_pTerrainPatchProxyList = new CTerrainPatchProxy[m_wPatchCount * m_wPatchCount];
  360.  
  361. m_iPatchTerrainVertexCount = (TERRAIN_PATCHSIZE+1)*(TERRAIN_PATCHSIZE+1);
  362. m_iPatchWaterVertexCount = TERRAIN_PATCHSIZE * TERRAIN_PATCHSIZE * 6;
  363. m_iPatchTerrainVertexSize = 24;
  364. m_iPatchWaterVertexSize = 16;
  365.  
  366. SetIndexBuffer();
  367. }
  368.  
  369. void CMapOutdoor::DestroyTerrainPatchProxyList()
  370. {
  371. if (m_pTerrainPatchProxyList)
  372. {
  373. delete [] m_pTerrainPatchProxyList;
  374. m_pTerrainPatchProxyList = NULL;
  375. }
  376.  
  377. #ifdef WORLD_EDITOR
  378. m_IndexBuffer.Destroy();
  379. #else
  380. for (int i = 0; i < TERRAINPATCH_LODMAX; ++i)
  381. m_IndexBuffer[i].Destroy();
  382. #endif
  383. }
  384.  
  385. //////////////////////////////////////////////////////////////////////////
  386. // Area
  387. //////////////////////////////////////////////////////////////////////////
  388.  
  389. void CMapOutdoor::EnablePortal(bool bFlag)
  390. {
  391. m_bEnablePortal = bFlag;
  392.  
  393. for (int i = 0; i < AROUND_AREA_NUM; ++i)
  394. if (m_pArea[i])
  395. m_pArea[i]->EnablePortal(bFlag);
  396. }
  397.  
  398. void CMapOutdoor::DestroyArea()
  399. {
  400. m_AreaVector.clear();
  401. m_AreaDeleteVector.clear();
  402.  
  403. CArea::ms_kPool.FreeAll();
  404.  
  405. for (int i = 0; i < AROUND_AREA_NUM; ++i)
  406. m_pArea[i] = NULL;
  407. }
  408.  
  409. //////////////////////////////////////////////////////////////////////////
  410. // Terrain
  411. //////////////////////////////////////////////////////////////////////////
  412.  
  413. void CMapOutdoor::DestroyTerrain()
  414. {
  415. m_TerrainVector.clear();
  416. m_TerrainDeleteVector.clear();
  417.  
  418. CTerrain::ms_kPool.FreeAll();
  419. for (int i=0; i < AROUND_AREA_NUM; ++i)
  420. m_pTerrain[i] = NULL;
  421. }
  422.  
  423. //////////////////////////////////////////////////////////////////////////
  424. // New
  425. //////////////////////////////////////////////////////////////////////////
  426.  
  427. bool CMapOutdoor::GetTerrainNum(float fx, float fy, BYTE * pbyTerrainNum)
  428. {
  429. if (fy < 0)
  430. fy = -fy;
  431.  
  432. int ix, iy;
  433.  
  434. PR_FLOAT_TO_INT(fx, ix);
  435. PR_FLOAT_TO_INT(fy, iy);
  436.  
  437. WORD wTerrainNumX = ix / (CTerrainImpl::TERRAIN_XSIZE);
  438. WORD wTerrainNumY = iy / (CTerrainImpl::TERRAIN_YSIZE);
  439.  
  440. return GetTerrainNumFromCoord(wTerrainNumX, wTerrainNumY, pbyTerrainNum);
  441. }
  442.  
  443. bool CMapOutdoor::GetPickingPoint(D3DXVECTOR3 * v3IntersectPt)
  444. {
  445. return GetPickingPointWithRay(ms_Ray, v3IntersectPt);
  446. }
  447.  
  448. bool CMapOutdoor::__PickTerrainHeight(float& fPos, const D3DXVECTOR3& v3Start, const D3DXVECTOR3& v3End, float fStep, float fRayRange, float fLimitRange, D3DXVECTOR3* pv3Pick)
  449. {
  450. CTerrain * pTerrain;
  451.  
  452. D3DXVECTOR3 v3CurPos;
  453.  
  454. float fRayRangeInv=1.0f/fRayRange;
  455. while (fPos < fRayRange && fPos<fLimitRange)
  456. {
  457. D3DXVec3Lerp(&v3CurPos, &v3Start, &v3End, fPos*fRayRangeInv);
  458. BYTE byTerrainNum;
  459. float fMultiplier = 1.0f;
  460. if (GetTerrainNum(v3CurPos.x, v3CurPos.y, &byTerrainNum))
  461. {
  462. if (GetTerrainPointer(byTerrainNum, &pTerrain))
  463. {
  464. int ix, iy;
  465. PR_FLOAT_TO_INT(v3CurPos.x, ix);
  466. PR_FLOAT_TO_INT(fabs(v3CurPos.y), iy);
  467. float fMapHeight = pTerrain->GetHeight(ix, iy);
  468. if ( fMapHeight >= v3CurPos.z)
  469. {
  470. *pv3Pick = v3CurPos;
  471. return true;
  472. }
  473. else
  474. {
  475. fMultiplier = fMAX(1.0f, 0.01f * ( v3CurPos.z - fMapHeight ) );
  476. }
  477. }
  478. }
  479. fPos += fStep * fMultiplier;
  480. }
  481.  
  482. return false;
  483. }
  484. bool CMapOutdoor::GetPickingPointWithRay(const CRay & rRay, D3DXVECTOR3 * v3IntersectPt)
  485. {
  486. bool bObjectPick = false;
  487. bool bTerrainPick = false;
  488. D3DXVECTOR3 v3ObjectPick, v3TerrainPick;
  489.  
  490. D3DXVECTOR3 v3Start, v3End, v3Dir, v3CurPos;
  491. float fRayRange;
  492. rRay.GetStartPoint(&v3Start);
  493. rRay.GetDirection(&v3Dir, &fRayRange);
  494. rRay.GetEndPoint(&v3End);
  495.  
  496. Vector3d v3dStart, v3dEnd;
  497. v3dStart.Set(v3Start.x, v3Start.y, v3Start.z);
  498. v3dEnd.Set(v3End.x - v3Start.x, v3End.y - v3Start.y, v3End.z - v3Start.z);
  499.  
  500. if (!m_bEnableTerrainOnlyForHeight)
  501. {
  502. //DWORD baseTime = timeGetTime();
  503. CCullingManager & rkCullingMgr = CCullingManager::Instance();
  504. FGetPickingPoint kGetPickingPoint(v3Start, v3Dir);
  505. rkCullingMgr.ForInRange2d(v3dStart, &kGetPickingPoint);
  506.  
  507. if (kGetPickingPoint.m_bPicked)
  508. {
  509. bObjectPick = true;
  510. v3ObjectPick = kGetPickingPoint.m_v3PickingPoint;
  511. }
  512. }
  513.  
  514. float fPos = 0.0f;
  515. //float fStep = 1.0f;
  516. //float fRayRangeInv=1.0f/fRayRange;
  517.  
  518. bTerrainPick=true;
  519. if (!__PickTerrainHeight(fPos, v3Start, v3End, 5.0f, fRayRange, 5000.0f, &v3TerrainPick))
  520. if (!__PickTerrainHeight(fPos, v3Start, v3End, 10.0f, fRayRange, 10000.0f, &v3TerrainPick))
  521. if (!__PickTerrainHeight(fPos, v3Start, v3End, 100.0f, fRayRange, 100000.0f, &v3TerrainPick))
  522. bTerrainPick=false;
  523.  
  524.  
  525. if (bObjectPick && bTerrainPick)
  526. {
  527. const auto vv = (v3TerrainPick - v3Start);
  528. const auto vv2 = (v3ObjectPick - v3Start);
  529. if ( D3DXVec3Length( &vv2) >= D3DXVec3Length( & vv) )
  530. *v3IntersectPt = v3TerrainPick;
  531. else
  532. *v3IntersectPt = v3ObjectPick;
  533. return true;
  534. }
  535. else if (bObjectPick)
  536. {
  537. *v3IntersectPt = v3ObjectPick;
  538. return true;
  539. }
  540. else if (bTerrainPick)
  541. {
  542. *v3IntersectPt = v3TerrainPick;
  543. return true;
  544. }
  545.  
  546. return false;
  547. }
  548.  
  549. bool CMapOutdoor::GetPickingPointWithRayOnlyTerrain(const CRay & rRay, D3DXVECTOR3 * v3IntersectPt)
  550. {
  551. bool bTerrainPick = false;
  552. D3DXVECTOR3 v3TerrainPick;
  553.  
  554. D3DXVECTOR3 v3Start, v3End, v3Dir, v3CurPos;
  555. float fRayRange;
  556. rRay.GetStartPoint(&v3Start);
  557. rRay.GetDirection(&v3Dir, &fRayRange);
  558. rRay.GetEndPoint(&v3End);
  559.  
  560. Vector3d v3dStart, v3dEnd;
  561. v3dStart.Set(v3Start.x, v3Start.y, v3Start.z);
  562. v3dEnd.Set(v3End.x - v3Start.x, v3End.y - v3Start.y, v3End.z - v3Start.z);
  563.  
  564.  
  565.  
  566. float fPos = 0.0f;
  567. bTerrainPick=true;
  568. if (!__PickTerrainHeight(fPos, v3Start, v3End, 5.0f, fRayRange, 5000.0f, &v3TerrainPick))
  569. if (!__PickTerrainHeight(fPos, v3Start, v3End, 10.0f, fRayRange, 10000.0f, &v3TerrainPick))
  570. if (!__PickTerrainHeight(fPos, v3Start, v3End, 100.0f, fRayRange, 100000.0f, &v3TerrainPick))
  571. bTerrainPick=false;
  572.  
  573. if (bTerrainPick)
  574. {
  575. *v3IntersectPt = v3TerrainPick;
  576. return true;
  577. }
  578.  
  579. return false;
  580. }
  581. /*
  582. {
  583. bool bTerrainPick = false;
  584. D3DXVECTOR3 v3TerrainPick;
  585.  
  586. CTerrain * pTerrain;
  587.  
  588. D3DXVECTOR3 v3Start, v3End, v3Dir, v3CurPos;
  589. float fRayRange;
  590. rRay.GetStartPoint(&v3Start);
  591. rRay.GetDirection(&v3Dir, &fRayRange);
  592. rRay.GetEndPoint(&v3End);
  593.  
  594. Vector3d v3dStart, v3dEnd;
  595. v3dStart.Set(v3Start.x, v3Start.y, v3Start.z);
  596. v3dEnd.Set(v3End.x - v3Start.x, v3End.y - v3Start.y, v3End.z - v3Start.z);
  597.  
  598. float fAdd = 1.0f / fRayRange;
  599.  
  600. float ft = 0.0f;
  601. while (ft < 1.0f)
  602. {
  603. D3DXVec3Lerp(&v3CurPos, &v3Start, &v3End, ft);
  604. BYTE byTerrainNum;
  605. float fMultiplier = 1.0f;
  606. if (GetTerrainNum(v3CurPos.x, v3CurPos.y, &byTerrainNum))
  607. {
  608. if (GetTerrainPointer(byTerrainNum, &pTerrain))
  609. {
  610. int ix, iy;
  611. PR_FLOAT_TO_INT(v3CurPos.x, ix);
  612. PR_FLOAT_TO_INT(fabs(v3CurPos.y), iy);
  613. float fMapHeight = pTerrain->GetHeight(ix, iy);
  614. if ( fMapHeight >= v3CurPos.z)
  615. {
  616. bTerrainPick = true;
  617. v3TerrainPick = v3CurPos;
  618. break;
  619. }
  620. else
  621. fMultiplier = fMAX(1.0f, 0.01f * ( v3CurPos.z - fMapHeight ) );
  622. }
  623. }
  624. ft += fAdd * fMultiplier;
  625. }
  626.  
  627. if (bTerrainPick)
  628. {
  629. *v3IntersectPt = v3TerrainPick;
  630. return true;
  631. }
  632.  
  633. return false;
  634. }
  635. */
  636.  
  637. void CMapOutdoor::GetHeightMap(const BYTE & c_rucTerrainNum, WORD ** pwHeightMap)
  638. {
  639. if (c_rucTerrainNum < 0 || c_rucTerrainNum > AROUND_AREA_NUM - 1 || !m_pTerrain[c_rucTerrainNum])
  640. {
  641. *pwHeightMap = NULL;
  642. return;
  643. }
  644.  
  645. *pwHeightMap = m_pTerrain[c_rucTerrainNum]->GetHeightMap();
  646. }
  647.  
  648. void CMapOutdoor::GetNormalMap(const BYTE & c_rucTerrainNum, char ** pucNormalMap)
  649. {
  650. if (c_rucTerrainNum < 0 || c_rucTerrainNum > AROUND_AREA_NUM - 1 || !m_pTerrain[c_rucTerrainNum])
  651. {
  652. *pucNormalMap = NULL;
  653. return;
  654. }
  655.  
  656. *pucNormalMap = m_pTerrain[c_rucTerrainNum]->GetNormalMap();
  657. }
  658.  
  659. void CMapOutdoor::GetWaterMap(const BYTE & c_rucTerrainNum, BYTE ** pucWaterMap)
  660. {
  661. if (c_rucTerrainNum < 0 || c_rucTerrainNum > AROUND_AREA_NUM - 1 || !m_pTerrain[c_rucTerrainNum])
  662. {
  663. *pucWaterMap = NULL;
  664. return;
  665. }
  666.  
  667. *pucWaterMap = m_pTerrain[c_rucTerrainNum]->GetWaterMap();
  668. }
  669.  
  670. void CMapOutdoor::GetWaterHeight(BYTE byTerrainNum, BYTE byWaterNum, long * plWaterHeight)
  671. {
  672. if (byTerrainNum < 0 || byTerrainNum > AROUND_AREA_NUM - 1 || !m_pTerrain[byTerrainNum])
  673. {
  674. *plWaterHeight = -1;
  675. return;
  676. }
  677.  
  678. m_pTerrain[byTerrainNum]->GetWaterHeight(byWaterNum, plWaterHeight);
  679. }
  680.  
  681. bool CMapOutdoor::GetWaterHeight(int iX, int iY, long * plWaterHeight)
  682. {
  683. if (iX < 0 || iY < 0 || iX > m_sTerrainCountX * CTerrainImpl::TERRAIN_XSIZE || iY > m_sTerrainCountY * CTerrainImpl::TERRAIN_YSIZE)
  684. return false;
  685.  
  686. WORD wTerrainCoordX, wTerrainCoordY;
  687. wTerrainCoordX = iX / CTerrainImpl::TERRAIN_XSIZE;
  688. wTerrainCoordY = iY / CTerrainImpl::TERRAIN_YSIZE;
  689.  
  690. BYTE byTerrainNum;
  691. if (!GetTerrainNumFromCoord(wTerrainCoordX, wTerrainCoordY, &byTerrainNum))
  692. return false;
  693. CTerrain * pTerrain;
  694. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  695. return false;
  696.  
  697. WORD wLocalX, wLocalY;
  698. wLocalX = (iX - wTerrainCoordX * CTerrainImpl::TERRAIN_XSIZE) / (CTerrainImpl::WATERMAP_XSIZE);
  699. wLocalY = (iY - wTerrainCoordY * CTerrainImpl::TERRAIN_YSIZE) / (CTerrainImpl::WATERMAP_YSIZE);
  700.  
  701. return pTerrain->GetWaterHeight(wLocalX, wLocalY, plWaterHeight);
  702. }
  703.  
  704. //////////////////////////////////////////////////////////////////////////
  705. // Update
  706. //////////////////////////////////////////////////////////////////////////
  707.  
  708. bool CMapOutdoor::GetTerrainNumFromCoord(WORD wCoordX, WORD wCoordY, BYTE * pbyTerrainNum)
  709. {
  710. *pbyTerrainNum = (wCoordY - m_CurCoordinate.m_sTerrainCoordY + LOAD_SIZE_WIDTH) * 3 +
  711. (wCoordX - m_CurCoordinate.m_sTerrainCoordX + LOAD_SIZE_WIDTH);
  712.  
  713. if (*pbyTerrainNum < 0 || *pbyTerrainNum > AROUND_AREA_NUM)
  714. return false;
  715. return true;
  716. }
  717.  
  718. void CMapOutdoor::BuildViewFrustum(D3DXMATRIX & mat)
  719. {
  720. //m_plane[0] = D3DXPLANE(mat._14 + mat._13, mat._24 + mat._23, mat._34 + mat._33, mat._44 + mat._43);
  721. m_plane[0] = D3DXPLANE( mat._13, mat._23, mat._33, mat._43); // Near
  722. m_plane[1] = D3DXPLANE(mat._14 - mat._13, mat._24 - mat._23, mat._34 - mat._33, mat._44 - mat._43); // Far
  723. m_plane[2] = D3DXPLANE(mat._14 + mat._11, mat._24 + mat._21, mat._34 + mat._31, mat._44 + mat._41); // Left
  724. m_plane[3] = D3DXPLANE(mat._14 - mat._11, mat._24 - mat._21, mat._34 - mat._31, mat._44 - mat._41); // Right
  725. m_plane[4] = D3DXPLANE(mat._14 + mat._12, mat._24 + mat._22, mat._34 + mat._32, mat._44 + mat._42); // Bottom
  726. m_plane[5] = D3DXPLANE(mat._14 - mat._12, mat._24 - mat._22, mat._34 - mat._32, mat._44 - mat._42); // Top
  727.  
  728. for (int i = 0; i < 6; ++i)
  729. D3DXPlaneNormalize(&m_plane[i],&m_plane[i]);
  730. }
  731.  
  732. bool MAPOUTDOOR_GET_HEIGHT_USE2D = true;
  733. bool MAPOUTDOOR_GET_HEIGHT_TRACE = false;
  734.  
  735. void CMapOutdoor::__HeightCache_Update()
  736. {
  737. m_kHeightCache.m_isUpdated=true;
  738. }
  739.  
  740. void CMapOutdoor::__HeightCache_Init()
  741. {
  742. m_kHeightCache.m_isUpdated=false;
  743.  
  744. for (UINT uIndex=0; uIndex!=SHeightCache::HASH_SIZE; ++uIndex)
  745. m_kHeightCache.m_akVct_kItem[uIndex].clear();
  746. }
  747.  
  748. float CMapOutdoor::GetHeight(float fx, float fy)
  749. {
  750. float fTerrainHeight = GetTerrainHeight(fx, fy);
  751.  
  752. if (!m_bEnableTerrainOnlyForHeight)
  753. {
  754. CCullingManager & rkCullingMgr = CCullingManager::Instance();
  755.  
  756. float CHECK_HEIGHT = 25000.0f;
  757. float fObjectHeight = -CHECK_HEIGHT;
  758.  
  759. Vector3d aVector3d;
  760. aVector3d.Set(fx, -fy, fTerrainHeight);
  761.  
  762. FGetObjectHeight kGetObjHeight(fx, fy);
  763.  
  764. RangeTester<FGetObjectHeight> kRangeTester_kGetObjHeight(&kGetObjHeight);
  765. rkCullingMgr.PointTest2d(aVector3d, &kRangeTester_kGetObjHeight);
  766.  
  767. if (kGetObjHeight.m_bHeightFound)
  768. fObjectHeight = kGetObjHeight.m_fReturnHeight;
  769.  
  770. return fMAX(fObjectHeight, fTerrainHeight);
  771. }
  772.  
  773. return fTerrainHeight;
  774. }
  775.  
  776. float CMapOutdoor::GetCacheHeight(float fx, float fy)
  777. {
  778. unsigned int nx=int(fx);
  779. unsigned int ny=int(fy);
  780.  
  781. DWORD dwKey=0;
  782.  
  783. #ifdef __HEIGHT_CACHE_TRACE__
  784. static DWORD s_dwTotalCount=0;
  785. static DWORD s_dwHitCount=0;
  786. static DWORD s_dwErrorCount=0;
  787.  
  788. s_dwTotalCount++;
  789. #endif
  790.  
  791. std::vector<SHeightCache::SItem>* pkVct_kItem=NULL;
  792. if (m_kHeightCache.m_isUpdated && nx<16*30000 && ny<16*30000)
  793. {
  794. nx>>=4;
  795. ny>>=4;
  796. //short aPos[2]={nx, ny};
  797.  
  798. dwKey=(ny<<16)|nx;//CalcCRC16Words(2, aPos);
  799. pkVct_kItem=&m_kHeightCache.m_akVct_kItem[dwKey%SHeightCache::HASH_SIZE];
  800. std::vector<SHeightCache::SItem>::iterator i;
  801. for (i=pkVct_kItem->begin(); i!=pkVct_kItem->end(); ++i)
  802. {
  803. SHeightCache::SItem& rkItem=*i;
  804. if (rkItem.m_dwKey==dwKey)
  805. {
  806. #ifdef __HEIGHT_CACHE_TRACE__
  807. s_dwHitCount++;
  808.  
  809. if (s_dwTotalCount>1000)
  810. {
  811. DWORD dwHitRate=s_dwHitCount*1000/s_dwTotalCount;
  812. static DWORD s_dwMaxHitRate=0;
  813. if (s_dwMaxHitRate<dwHitRate)
  814. {
  815. s_dwMaxHitRate=dwHitRate;
  816. printf("HitRate %f\n", s_dwMaxHitRate*0.1f);
  817. }
  818.  
  819.  
  820. }
  821. #endif
  822. return rkItem.m_fHeight;
  823. }
  824. }
  825. }
  826. else
  827. {
  828. #ifdef __HEIGHT_CACHE_TRACE__
  829. s_dwErrorCount++;
  830. //printf("NoCache (%f, %f)\n", fx/100.0f, fy/100.0f);
  831. #endif
  832. }
  833. #ifdef __HEIGHT_CACHE_TRACE__
  834. if (s_dwTotalCount>=1000000)
  835. {
  836. printf("HitRate %f\n", s_dwHitCount*1000/s_dwTotalCount*0.1f);
  837. printf("ErrRate %f\n", s_dwErrorCount*1000/s_dwTotalCount*0.1f);
  838. s_dwHitCount=0;
  839. s_dwTotalCount=0;
  840. s_dwErrorCount=0;
  841. }
  842. #endif
  843.  
  844. float fTerrainHeight = GetTerrainHeight(fx, fy);
  845. #ifdef SPHERELIB_STRICT
  846. if (MAPOUTDOOR_GET_HEIGHT_TRACE)
  847. printf("Terrain %f\n", fTerrainHeight);
  848. #endif
  849. CCullingManager & rkCullingMgr = CCullingManager::Instance();
  850.  
  851. float CHECK_HEIGHT = 25000.0f;
  852. float fObjectHeight = -CHECK_HEIGHT;
  853.  
  854. if (MAPOUTDOOR_GET_HEIGHT_USE2D)
  855. {
  856. Vector3d aVector3d;
  857. aVector3d.Set(fx, -fy, fTerrainHeight);
  858.  
  859. FGetObjectHeight kGetObjHeight(fx, fy);
  860.  
  861. RangeTester<FGetObjectHeight> kRangeTester_kGetObjHeight(&kGetObjHeight);
  862. rkCullingMgr.PointTest2d(aVector3d, &kRangeTester_kGetObjHeight);
  863.  
  864. if (kGetObjHeight.m_bHeightFound)
  865. fObjectHeight = kGetObjHeight.m_fReturnHeight;
  866. }
  867. else
  868. {
  869. Vector3d aVector3d;
  870. aVector3d.Set(fx, -fy, fTerrainHeight);
  871.  
  872. Vector3d toTop;
  873. toTop.Set(0,0,CHECK_HEIGHT);
  874.  
  875. FGetObjectHeight kGetObjHeight(fx, fy);
  876. rkCullingMgr.ForInRay(aVector3d, toTop, &kGetObjHeight);
  877.  
  878. if (kGetObjHeight.m_bHeightFound)
  879. fObjectHeight = kGetObjHeight.m_fReturnHeight;
  880. }
  881.  
  882. float fHeight=fMAX(fObjectHeight, fTerrainHeight);
  883.  
  884. if (pkVct_kItem)
  885. {
  886. if (pkVct_kItem->size()>=200)
  887. {
  888. #ifdef __HEIGHT_CACHE_TRACE__
  889. printf("ClearCacheHeight[%d]\n", dwKey%SHeightCache::HASH_SIZE);
  890. #endif
  891. pkVct_kItem->clear();
  892. }
  893.  
  894. SHeightCache::SItem kItem;
  895. kItem.m_dwKey=dwKey;
  896. kItem.m_fHeight=fHeight;
  897. pkVct_kItem->push_back(kItem);
  898. }
  899.  
  900. return fHeight;
  901. }
  902.  
  903. bool CMapOutdoor::GetNormal(int ix, int iy, D3DXVECTOR3 * pv3Normal)
  904. {
  905. if (ix <= 0)
  906. ix = 0;
  907. else if (ix >= m_sTerrainCountX * CTerrainImpl::TERRAIN_XSIZE)
  908. ix = m_sTerrainCountX * CTerrainImpl::TERRAIN_XSIZE;
  909.  
  910. if (iy <= 0)
  911. iy = 0;
  912. else if (iy >= m_sTerrainCountY * CTerrainImpl::TERRAIN_YSIZE)
  913. iy = m_sTerrainCountY * CTerrainImpl::TERRAIN_YSIZE;
  914.  
  915. WORD usCoordX, usCoordY;
  916.  
  917. usCoordX = (WORD) (ix / (CTerrainImpl::TERRAIN_XSIZE));
  918. usCoordY = (WORD) (iy / (CTerrainImpl::TERRAIN_YSIZE));
  919.  
  920. if (usCoordX >= m_sTerrainCountX - 1)
  921. usCoordX = m_sTerrainCountX - 1;
  922.  
  923. if (usCoordY >= m_sTerrainCountY - 1)
  924. usCoordY = m_sTerrainCountY - 1;
  925.  
  926. BYTE byTerrainNum;
  927. if (!GetTerrainNumFromCoord(usCoordX, usCoordY, &byTerrainNum))
  928. return false;
  929.  
  930. CTerrain * pTerrain;
  931.  
  932. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  933. return false;
  934.  
  935. while (ix >= CTerrainImpl::TERRAIN_XSIZE)
  936. ix -= CTerrainImpl::TERRAIN_XSIZE;
  937.  
  938. while (iy >= CTerrainImpl::TERRAIN_YSIZE)
  939. iy -= CTerrainImpl::TERRAIN_YSIZE;
  940.  
  941. return pTerrain->GetNormal(ix, iy, pv3Normal);
  942. }
  943.  
  944. float CMapOutdoor::GetTerrainHeight(float fx, float fy)
  945. {
  946. if (fy < 0)
  947. fy = -fy;
  948. long lx, ly;
  949. PR_FLOAT_TO_INT(fx, lx);
  950. PR_FLOAT_TO_INT(fy, ly);
  951.  
  952. WORD usCoordX, usCoordY;
  953.  
  954. usCoordX = (WORD) (lx / CTerrainImpl::TERRAIN_XSIZE);
  955. usCoordY = (WORD) (ly / CTerrainImpl::TERRAIN_YSIZE);
  956.  
  957. BYTE byTerrainNum;
  958. if (!GetTerrainNumFromCoord(usCoordX, usCoordY, &byTerrainNum))
  959. return 0.0f;
  960.  
  961. CTerrain * pTerrain;
  962.  
  963. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  964. return 0.0f;
  965.  
  966. return pTerrain->GetHeight(lx, ly);
  967. }
  968.  
  969. //////////////////////////////////////////////////////////////////////////
  970. // For Grass
  971. float CMapOutdoor::GetHeight(float * pPos)
  972. {
  973. pPos[2] = GetHeight(pPos[0], pPos[1]);
  974. return pPos[2];
  975. }
  976.  
  977. bool CMapOutdoor::GetBrushColor(float fX, float fY, float* pLowColor, float* pHighColor)
  978. {
  979. bool bSuccess = false;
  980.  
  981. // float fU, fV;
  982. //
  983. // GetOneToOneMappingCoordinates(fX, fY, fU, fV);
  984. //
  985. // if (fU >= 0.0f && fU <= 1.0f && fV >= 0.0f && fV <= 1.0f)
  986. // {
  987. // int nImageCol = (m_cBrushMap.GetWidth() - 1) * fU;
  988. // int nImageRow = (m_cBrushMap.GetHeight() - 1) * fV;
  989. //
  990. // // low
  991. // BYTE* pPixel = m_cBrushMap.GetPixel(nImageCol, nImageRow);
  992. // pLowColor[0] = (pPixel[0] / 255.0f);
  993. // pLowColor[1] = (pPixel[1] / 255.0f);
  994. // pLowColor[2] = (pPixel[2] / 255.0f);
  995. // pLowColor[3] = (pPixel[3] / 255.0f);
  996. //
  997. // // high
  998. // pPixel = m_cBrushMap2.GetPixel(nImageCol, nImageRow);
  999. // pHighColor[0] = (pPixel[0] / 255.0f);
  1000. // pHighColor[1] = (pPixel[1] / 255.0f);
  1001. // pHighColor[2] = (pPixel[2] / 255.0f);
  1002. // pHighColor[3] = (pPixel[3] / 255.0f);
  1003. //
  1004. // bSuccess = true;
  1005. // }
  1006. pLowColor[0] = (1.0f);
  1007. pLowColor[1] = (1.0f);
  1008. pLowColor[2] = (1.0f);
  1009. pLowColor[3] = (1.0f);
  1010. pHighColor[0] = (1.0f);
  1011. pHighColor[1] = (1.0f);
  1012. pHighColor[2] = (1.0f);
  1013. pHighColor[3] = (1.0f);
  1014.  
  1015. return bSuccess;
  1016. }
  1017.  
  1018. // End of for grass
  1019. //////////////////////////////////////////////////////////////////////////
  1020. BOOL CMapOutdoor::GetAreaPointer(const BYTE c_byAreaNum, CArea ** ppArea)
  1021. {
  1022. if (c_byAreaNum >= AROUND_AREA_NUM)
  1023. {
  1024. *ppArea = NULL;
  1025. return FALSE;
  1026. }
  1027.  
  1028. if (NULL == m_pArea[c_byAreaNum])
  1029. {
  1030. *ppArea = NULL;
  1031. return FALSE;
  1032. }
  1033.  
  1034. *ppArea = m_pArea[c_byAreaNum];
  1035. return TRUE;
  1036. }
  1037.  
  1038. BOOL CMapOutdoor::GetTerrainPointer(const BYTE c_byTerrainNum, CTerrain ** ppTerrain)
  1039. {
  1040. if (c_byTerrainNum >= AROUND_AREA_NUM)
  1041. {
  1042. *ppTerrain = NULL;
  1043. return FALSE;
  1044. }
  1045.  
  1046. if (NULL == m_pTerrain[c_byTerrainNum])
  1047. {
  1048. *ppTerrain = NULL;
  1049. return FALSE;
  1050. }
  1051.  
  1052. *ppTerrain = m_pTerrain[c_byTerrainNum];
  1053. return TRUE;
  1054. }
  1055.  
  1056. void CMapOutdoor::InitializeFog()
  1057. {
  1058. memset(&m_matAlphaFogTexture, 0, sizeof(D3DXMATRIX));
  1059. m_matAlphaFogTexture._31 = -0.001f;
  1060. m_matAlphaFogTexture._41 = -7.0f;
  1061. m_matAlphaFogTexture._42 = 0.5f;
  1062. }
  1063.  
  1064. void CMapOutdoor::SaveAlphaFogOperation()
  1065. {
  1066. STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
  1067. STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
  1068. STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
  1069. STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
  1070. STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
  1071. STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
  1072. STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
  1073. STATEMANAGER.SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
  1074. STATEMANAGER.SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
  1075.  
  1076. STATEMANAGER.SetTransform(D3DTS_TEXTURE1, &m_matAlphaFogTexture);
  1077. STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
  1078. STATEMANAGER.SetTexture(1, m_AlphaFogImageInstance.GetTexturePointer()->GetD3DTexture());
  1079. }
  1080.  
  1081. void CMapOutdoor::RestoreAlphaFogOperation()
  1082. {
  1083. STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
  1084. STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
  1085. STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE);
  1086. }
  1087.  
  1088.  
  1089. void CMapOutdoor::SetDrawShadow(bool bDrawShadow)
  1090. {
  1091. m_bDrawShadow = bDrawShadow;
  1092. }
  1093.  
  1094. void CMapOutdoor::SetDrawCharacterShadow(bool bDrawChrShadow)
  1095. {
  1096. m_bDrawChrShadow = bDrawChrShadow;
  1097. }
  1098.  
  1099. DWORD CMapOutdoor::GetShadowMapColor(float fx, float fy)
  1100. {
  1101. if (fy < 0)
  1102. fy = -fy;
  1103.  
  1104. float fTerrainSize = (float) (CTerrainImpl::TERRAIN_XSIZE);
  1105. float fXRef = fx - (float) (m_lCurCoordStartX);
  1106. float fYRef = fy - (float) (m_lCurCoordStartY);
  1107.  
  1108. CTerrain * pTerrain;
  1109.  
  1110. if (fYRef < -fTerrainSize)
  1111. return 0xFFFFFFFF;
  1112. else if (fYRef >= -fTerrainSize && fYRef < 0.0f)
  1113. {
  1114. if (fXRef < -fTerrainSize)
  1115. return 0xFFFFFFFF;
  1116. else if (fXRef >= -fTerrainSize && fXRef < 0.0f)
  1117. {
  1118. if (GetTerrainPointer(0, &pTerrain))
  1119. return pTerrain->GetShadowMapColor(fXRef + fTerrainSize, fYRef + fTerrainSize);
  1120. else
  1121. return 0xFFFFFFFF;
  1122. }
  1123. else if (fXRef >= 0.0f && fXRef < fTerrainSize)
  1124. {
  1125. if (GetTerrainPointer(1, &pTerrain))
  1126. return pTerrain->GetShadowMapColor(fXRef, fYRef + fTerrainSize);
  1127. else
  1128. return 0xFFFFFFFF;
  1129. }
  1130. else if (fXRef >= fTerrainSize && fXRef < 2.0f * fTerrainSize)
  1131. {
  1132. if (GetTerrainPointer(2, &pTerrain))
  1133. return pTerrain->GetShadowMapColor(fXRef - fTerrainSize, fYRef + fTerrainSize);
  1134. else
  1135. return 0xFFFFFFFF;
  1136. }
  1137. else
  1138. return 0xFFFFFFFF;
  1139. }
  1140. else if (fYRef >= 0.0f && fYRef < fTerrainSize)
  1141. {
  1142. if (fXRef < -fTerrainSize)
  1143. return 0xFFFFFFFF;
  1144. else if (fXRef >= -fTerrainSize && fXRef < 0.0f)
  1145. {
  1146. if (GetTerrainPointer(3, &pTerrain))
  1147. return pTerrain->GetShadowMapColor(fXRef + fTerrainSize, fYRef);
  1148. else
  1149. return 0xFFFFFFFF;
  1150. }
  1151. else if (fXRef >= 0.0f && fXRef < fTerrainSize)
  1152. {
  1153. if (GetTerrainPointer(4, &pTerrain))
  1154. return pTerrain->GetShadowMapColor(fXRef, fYRef);
  1155. else
  1156. return 0xFFFFFFFF;
  1157. }
  1158. else if (fXRef >= fTerrainSize && fXRef < 2.0f * fTerrainSize)
  1159. {
  1160. if (GetTerrainPointer(5, &pTerrain))
  1161. return pTerrain->GetShadowMapColor(fXRef - fTerrainSize, fYRef);
  1162. else
  1163. return 0xFFFFFFFF;
  1164. }
  1165. else
  1166. return 0xFFFFFFFF;
  1167. }
  1168. else if (fYRef >= fTerrainSize && fYRef < 2.0f * fTerrainSize)
  1169. {
  1170. if (fXRef < -fTerrainSize)
  1171. return 0xFFFFFFFF;
  1172. else if (fXRef >= -fTerrainSize && fXRef < 0.0f)
  1173. {
  1174. if (GetTerrainPointer(6, &pTerrain))
  1175. return pTerrain->GetShadowMapColor(fXRef + fTerrainSize, fYRef - fTerrainSize);
  1176. else
  1177. return 0xFFFFFFFF;
  1178. }
  1179. else if (fXRef >= 0.0f && fXRef < fTerrainSize)
  1180. {
  1181. if (GetTerrainPointer(7, &pTerrain))
  1182. return pTerrain->GetShadowMapColor(fXRef, fYRef - fTerrainSize);
  1183. else
  1184. return 0xFFFFFFFF;
  1185. }
  1186. else if (fXRef >= fTerrainSize && fXRef < 2.0f * fTerrainSize)
  1187. {
  1188. if (GetTerrainPointer(8, &pTerrain))
  1189. return pTerrain->GetShadowMapColor(fXRef - fTerrainSize, fYRef - fTerrainSize);
  1190. else
  1191. return 0xFFFFFFFF;
  1192. }
  1193. else
  1194. return 0xFFFFFFFF;
  1195. }
  1196. else
  1197. return 0xFFFFFFFF;
  1198.  
  1199. return 0xFFFFFFFF;
  1200. }
  1201.  
  1202. bool CMapOutdoor::isAttrOn(float fX, float fY, BYTE byAttr)
  1203. {
  1204. int iX, iY;
  1205. PR_FLOAT_TO_INT(fX, iX);
  1206. PR_FLOAT_TO_INT(fY, iY);
  1207.  
  1208. return isAttrOn(iX, iY, byAttr);
  1209. }
  1210.  
  1211. bool CMapOutdoor::GetAttr(float fX, float fY, BYTE * pbyAttr)
  1212. {
  1213. int iX, iY;
  1214. PR_FLOAT_TO_INT(fX, iX);
  1215. PR_FLOAT_TO_INT(fY, iY);
  1216.  
  1217. return GetAttr(iX, iY, pbyAttr);
  1218. }
  1219.  
  1220. bool CMapOutdoor::isAttrOn(int iX, int iY, BYTE byAttr)
  1221. {
  1222. if (iX < 0 || iY < 0 || iX > m_sTerrainCountX * CTerrainImpl::TERRAIN_XSIZE || iY > m_sTerrainCountY * CTerrainImpl::TERRAIN_YSIZE)
  1223. return false;
  1224.  
  1225. WORD wTerrainCoordX, wTerrainCoordY;
  1226. wTerrainCoordX = iX / CTerrainImpl::TERRAIN_XSIZE;
  1227. wTerrainCoordY = iY / CTerrainImpl::TERRAIN_YSIZE;
  1228.  
  1229. BYTE byTerrainNum;
  1230. if (!GetTerrainNumFromCoord(wTerrainCoordX, wTerrainCoordY, &byTerrainNum))
  1231. return false;
  1232. CTerrain * pTerrain;
  1233. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  1234. return false;
  1235.  
  1236. WORD wLocalX, wLocalY;
  1237. wLocalX = (iX - wTerrainCoordX * CTerrainImpl::TERRAIN_XSIZE) / (CTerrainImpl::HALF_CELLSCALE);
  1238. wLocalY = (iY - wTerrainCoordY * CTerrainImpl::TERRAIN_YSIZE) / (CTerrainImpl::HALF_CELLSCALE);
  1239.  
  1240. return pTerrain->isAttrOn(wLocalX, wLocalY, byAttr);
  1241. }
  1242.  
  1243. bool CMapOutdoor::GetAttr(int iX, int iY, BYTE * pbyAttr)
  1244. {
  1245. if (iX < 0 || iY < 0 || iX > m_sTerrainCountX * CTerrainImpl::TERRAIN_XSIZE || iY > m_sTerrainCountY * CTerrainImpl::TERRAIN_YSIZE)
  1246. return false;
  1247.  
  1248. WORD wTerrainCoordX, wTerrainCoordY;
  1249. wTerrainCoordX = iX / CTerrainImpl::TERRAIN_XSIZE;
  1250. wTerrainCoordY = iY / CTerrainImpl::TERRAIN_YSIZE;
  1251.  
  1252. BYTE byTerrainNum;
  1253. if (!GetTerrainNumFromCoord(wTerrainCoordX, wTerrainCoordY, &byTerrainNum))
  1254. return false;
  1255. CTerrain * pTerrain;
  1256. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  1257. return false;
  1258.  
  1259. WORD wLocalX, wLocalY;
  1260. wLocalX = (WORD) (iX - wTerrainCoordX * CTerrainImpl::TERRAIN_XSIZE) / (CTerrainImpl::HALF_CELLSCALE);
  1261. wLocalY = (WORD) (iY - wTerrainCoordY * CTerrainImpl::TERRAIN_YSIZE) / (CTerrainImpl::HALF_CELLSCALE);
  1262.  
  1263. BYTE byAttr = pTerrain->GetAttr(wLocalX, wLocalY);
  1264.  
  1265. *pbyAttr = byAttr;
  1266.  
  1267. return true;
  1268. }
  1269.  
  1270. // MonsterAreaInfo
  1271. CMonsterAreaInfo * CMapOutdoor::AddMonsterAreaInfo(long lOriginX, long lOriginY, long lSizeX, long lSizeY)
  1272. {
  1273. CMonsterAreaInfo * pMonsterAreaInfo = m_kPool_kMonsterAreaInfo.Alloc();
  1274. pMonsterAreaInfo->Clear();
  1275. pMonsterAreaInfo->SetOrigin(lOriginX, lOriginY);
  1276. pMonsterAreaInfo->SetSize(lSizeX, lSizeY);
  1277. m_MonsterAreaInfoPtrVector.push_back(pMonsterAreaInfo);
  1278.  
  1279. return pMonsterAreaInfo;
  1280. }
  1281.  
  1282. void CMapOutdoor::RemoveAllMonsterAreaInfo()
  1283. {
  1284. m_MonsterAreaInfoPtrVectorIterator = m_MonsterAreaInfoPtrVector.begin();
  1285. while (m_MonsterAreaInfoPtrVectorIterator != m_MonsterAreaInfoPtrVector.end())
  1286. {
  1287. CMonsterAreaInfo * pMonsterAreaInfo = *m_MonsterAreaInfoPtrVectorIterator;
  1288. pMonsterAreaInfo->Clear();
  1289. ++m_MonsterAreaInfoPtrVectorIterator;
  1290. }
  1291. m_kPool_kMonsterAreaInfo.FreeAll();
  1292. m_MonsterAreaInfoPtrVector.clear();
  1293. }
  1294.  
  1295. bool CMapOutdoor::GetMonsterAreaInfoFromVectorIndex(DWORD dwMonsterAreaInfoVectorIndex, CMonsterAreaInfo ** ppMonsterAreaInfo)
  1296. {
  1297. if (dwMonsterAreaInfoVectorIndex >= m_MonsterAreaInfoPtrVector.size())
  1298. return false;
  1299.  
  1300. *ppMonsterAreaInfo = m_MonsterAreaInfoPtrVector[dwMonsterAreaInfoVectorIndex];
  1301. return true;
  1302. }
  1303.  
  1304. //////////////////////////////////////////////////////////////////////////
  1305. CMonsterAreaInfo * CMapOutdoor::AddNewMonsterAreaInfo(long lOriginX, long lOriginY, long lSizeX, long lSizeY,
  1306. CMonsterAreaInfo::EMonsterAreaInfoType eMonsterAreaInfoType,
  1307. DWORD dwVID, DWORD dwCount, CMonsterAreaInfo::EMonsterDir eMonsterDir)
  1308. {
  1309. CMonsterAreaInfo * pMonsterAreaInfo = m_kPool_kMonsterAreaInfo.Alloc();
  1310. pMonsterAreaInfo->Clear();
  1311. pMonsterAreaInfo->SetOrigin(lOriginX, lOriginY);
  1312. pMonsterAreaInfo->SetSize(lSizeX, lSizeY);
  1313.  
  1314. pMonsterAreaInfo->SetMonsterAreaInfoType(eMonsterAreaInfoType);
  1315.  
  1316. if (CMonsterAreaInfo::MONSTERAREAINFOTYPE_MONSTER == eMonsterAreaInfoType)
  1317. pMonsterAreaInfo->SetMonsterVID(dwVID);
  1318. else if (CMonsterAreaInfo::MONSTERAREAINFOTYPE_GROUP == eMonsterAreaInfoType)
  1319. pMonsterAreaInfo->SetMonsterGroupID(dwVID);
  1320. pMonsterAreaInfo->SetMonsterCount(dwCount);
  1321. pMonsterAreaInfo->SetMonsterDirection(eMonsterDir);
  1322. m_MonsterAreaInfoPtrVector.push_back(pMonsterAreaInfo);
  1323.  
  1324. return pMonsterAreaInfo;
  1325. }
  1326.  
  1327. //////////////////////////////////////////////////////////////////////////
  1328. void CMapOutdoor::GetBaseXY(DWORD * pdwBaseX, DWORD * pdwBaseY)
  1329. {
  1330. *pdwBaseX = m_dwBaseX;
  1331. *pdwBaseY = m_dwBaseY;
  1332. }
  1333.  
  1334. void CMapOutdoor::SetBaseXY(DWORD dwBaseX, DWORD dwBaseY)
  1335. {
  1336. m_dwBaseX = dwBaseX;
  1337. m_dwBaseY = dwBaseY;
  1338. }
  1339.  
  1340. void CMapOutdoor::SetEnvironmentDataName(const std::string& strEnvironmentDataName)
  1341. {
  1342. m_envDataName = strEnvironmentDataName;
  1343. }
  1344.  
  1345. void CMapOutdoor::__XMasTree_Initialize()
  1346. {
  1347. m_kXMas.m_pkTree=NULL;
  1348. m_kXMas.m_iEffectID=-1;
  1349. }
  1350.  
  1351. void CMapOutdoor::XMasTree_Destroy()
  1352. {
  1353. if (m_kXMas.m_pkTree)
  1354. {
  1355. CSpeedTreeForestDirectX8& rkForest=CSpeedTreeForestDirectX8::Instance();
  1356. m_kXMas.m_pkTree->Clear();
  1357. rkForest.DeleteInstance(m_kXMas.m_pkTree);
  1358. m_kXMas.m_pkTree=NULL;
  1359. }
  1360. if (-1 != m_kXMas.m_iEffectID)
  1361. {
  1362. CEffectManager& rkEffMgr = CEffectManager::Instance();
  1363. rkEffMgr.DestroyEffectInstance(m_kXMas.m_iEffectID);
  1364. m_kXMas.m_iEffectID=-1;
  1365. }
  1366. }
  1367.  
  1368. void CMapOutdoor::__XMasTree_Create(float x, float y, float z, const char* c_szTreeName, const char* c_szEffName)
  1369. {
  1370. assert(NULL==m_kXMas.m_pkTree);
  1371. assert(-1==m_kXMas.m_iEffectID);
  1372.  
  1373. CSpeedTreeForestDirectX8& rkForest=CSpeedTreeForestDirectX8::Instance();
  1374. DWORD dwCRC32 = GetCaseCRC32(c_szTreeName, strlen(c_szTreeName));
  1375. m_kXMas.m_pkTree=rkForest.CreateInstance(x, y, z, dwCRC32, c_szTreeName);
  1376.  
  1377. CEffectManager& rkEffMgr = CEffectManager::Instance();
  1378. rkEffMgr.RegisterEffect(c_szEffName);
  1379. m_kXMas.m_iEffectID = rkEffMgr.CreateEffect(c_szEffName,
  1380. D3DXVECTOR3(x, y, z),
  1381. D3DXVECTOR3(0.0f, 0.0f, 0.0f));
  1382. }
  1383.  
  1384. void CMapOutdoor::XMasTree_Set(float x, float y, float z, const char* c_szTreeName, const char* c_szEffName)
  1385. {
  1386. XMasTree_Destroy();
  1387. __XMasTree_Create(x, y, z, c_szTreeName, c_szEffName);
  1388. }
  1389.  
  1390. void CMapOutdoor::SpecialEffect_Create(DWORD dwID, float x, float y, float z, const char* c_szEffName)
  1391. {
  1392. CEffectManager& rkEffMgr = CEffectManager::Instance();
  1393.  
  1394. TSpecialEffectMap::iterator itor = m_kMap_dwID_iEffectID.find(dwID);
  1395. if (m_kMap_dwID_iEffectID.end() != itor)
  1396. {
  1397. DWORD dwEffectID = itor->second;
  1398. if (rkEffMgr.SelectEffectInstance(dwEffectID))
  1399. {
  1400. D3DXMATRIX mat;
  1401. D3DXMatrixIdentity(&mat);
  1402. mat._41 = x;
  1403. mat._42 = y;
  1404. mat._43 = z;
  1405. rkEffMgr.SetEffectInstanceGlobalMatrix(mat);
  1406. return;
  1407. }
  1408. }
  1409.  
  1410. rkEffMgr.RegisterEffect(c_szEffName);
  1411. DWORD dwEffectID = rkEffMgr.CreateEffect(c_szEffName,
  1412. D3DXVECTOR3(x, y, z),
  1413. D3DXVECTOR3(0.0f, 0.0f, 0.0f));
  1414. m_kMap_dwID_iEffectID.insert(std::make_pair(dwID, dwEffectID));
  1415. }
  1416.  
  1417. void CMapOutdoor::SpecialEffect_Delete(DWORD dwID)
  1418. {
  1419. TSpecialEffectMap::iterator itor = m_kMap_dwID_iEffectID.find(dwID);
  1420.  
  1421. if (m_kMap_dwID_iEffectID.end() == itor)
  1422. return;
  1423.  
  1424. CEffectManager& rkEffMgr = CEffectManager::Instance();
  1425. int iEffectID = itor->second;
  1426. rkEffMgr.DestroyEffectInstance(iEffectID);
  1427. }
  1428.  
  1429. void CMapOutdoor::SpecialEffect_Destroy()
  1430. {
  1431. CEffectManager& rkEffMgr = CEffectManager::Instance();
  1432.  
  1433. TSpecialEffectMap::iterator itor = m_kMap_dwID_iEffectID.begin();
  1434. for (; itor != m_kMap_dwID_iEffectID.end(); ++itor)
  1435. {
  1436. int iEffectID = itor->second;
  1437. rkEffMgr.DestroyEffectInstance(iEffectID);
  1438. }
  1439. }
  1440.  
  1441. #ifdef ENABLE_PRIVATE_SHOP_SEARCH_SYSTEM
  1442. void CMapOutdoor::SpecialShopPosEffect_Create(DWORD dwID, float x, float y, float z, const char* c_szEffName)
  1443. {
  1444. CEffectManager& rkEffMgr = CEffectManager::Instance();
  1445.  
  1446. TSpecialEffectMap::iterator itor = m_kMap_dwID_iEffectID.find(dwID);
  1447. if (m_kMap_dwID_iEffectID.end() != itor)
  1448. {
  1449. DWORD dwEffectID = itor->second;
  1450.  
  1451. if (dwEffectID == m_iLastShopPos)
  1452. return;
  1453.  
  1454. if (rkEffMgr.SelectEffectInstance(dwEffectID))
  1455. {
  1456. D3DXMATRIX mat;
  1457. D3DXMatrixIdentity(&mat);
  1458. mat._41 = x;
  1459. mat._42 = y;
  1460. mat._43 = z;
  1461. rkEffMgr.SetEffectInstanceGlobalMatrix(mat);
  1462. return;
  1463. }
  1464. }
  1465.  
  1466. rkEffMgr.RegisterEffect(c_szEffName);
  1467. DWORD dwEffectID = rkEffMgr.CreateEffect(c_szEffName,
  1468. D3DXVECTOR3(x, y, z),
  1469. D3DXVECTOR3(0.0f, 0.0f, 0.0f));
  1470.  
  1471. m_iLastShopPos = dwEffectID;
  1472. m_kMap_dwID_iEffectID.insert(std::make_pair(dwID, dwEffectID));
  1473. }
  1474.  
  1475. void CMapOutdoor::SpecialShopPosEffect_Delete()
  1476. {
  1477. if (m_iLastShopPos != 0)
  1478. {
  1479. CEffectManager& rkEffMgr = CEffectManager::Instance();
  1480. rkEffMgr.DestroyEffectInstance(m_iLastShopPos);
  1481. m_iLastShopPos = 0;
  1482. }
  1483. }
  1484. #endif
  1485.  
  1486. void CMapOutdoor::ClearGuildArea()
  1487. {
  1488. m_rkList_kGuildArea.clear();
  1489. }
  1490.  
  1491. void CMapOutdoor::RegisterGuildArea(int isx, int isy, int iex, int iey)
  1492. {
  1493. RECT rect;
  1494. rect.left = isx;
  1495. rect.top = isy;
  1496. rect.right = iex;
  1497. rect.bottom = iey;
  1498. m_rkList_kGuildArea.push_back(rect);
  1499. }
  1500.  
  1501. void CMapOutdoor::VisibleMarkedArea()
  1502. {
  1503. std::map<int, BYTE*> kMap_pbyMarkBuf;
  1504. std::set<int> kSet_iProcessedMapIndex;
  1505.  
  1506. std::list<RECT>::iterator itorRect = m_rkList_kGuildArea.begin();
  1507. for (; itorRect != m_rkList_kGuildArea.end(); ++itorRect)
  1508. {
  1509. const RECT & rkRect = *itorRect;
  1510.  
  1511. int ix1Cell;
  1512. int iy1Cell;
  1513. BYTE byx1SubCell;
  1514. BYTE byy1SubCell;
  1515. WORD wx1TerrainNum;
  1516. WORD wy1TerrainNum;
  1517.  
  1518. int ix2Cell;
  1519. int iy2Cell;
  1520. BYTE byx2SubCell;
  1521. BYTE byy2SubCell;
  1522. WORD wx2TerrainNum;
  1523. WORD wy2TerrainNum;
  1524.  
  1525. ConvertToMapCoords(float(rkRect.left), float(rkRect.top), &ix1Cell, &iy1Cell, &byx1SubCell, &byy1SubCell, &wx1TerrainNum, &wy1TerrainNum);
  1526. ConvertToMapCoords(float(rkRect.right), float(rkRect.bottom), &ix2Cell, &iy2Cell, &byx2SubCell, &byy2SubCell, &wx2TerrainNum, &wy2TerrainNum);
  1527.  
  1528. ix1Cell = ix1Cell + wx1TerrainNum*CTerrain::ATTRMAP_XSIZE;
  1529. iy1Cell = iy1Cell + wy1TerrainNum*CTerrain::ATTRMAP_YSIZE;
  1530. ix2Cell = ix2Cell + wx2TerrainNum*CTerrain::ATTRMAP_XSIZE;
  1531. iy2Cell = iy2Cell + wy2TerrainNum*CTerrain::ATTRMAP_YSIZE;
  1532.  
  1533. for (int ixCell = ix1Cell; ixCell <= ix2Cell; ++ixCell)
  1534. for (int iyCell = iy1Cell; iyCell <= iy2Cell; ++iyCell)
  1535. {
  1536. int ixLocalCell = ixCell % CTerrain::ATTRMAP_XSIZE;
  1537. int iyLocalCell = iyCell % CTerrain::ATTRMAP_YSIZE;
  1538. int ixTerrain = ixCell / CTerrain::ATTRMAP_XSIZE;
  1539. int iyTerrain = iyCell / CTerrain::ATTRMAP_YSIZE;
  1540. int iTerrainNum = ixTerrain+iyTerrain*100;
  1541.  
  1542. BYTE byTerrainNum;
  1543. if (!GetTerrainNumFromCoord(ixTerrain, iyTerrain, &byTerrainNum))
  1544. continue;
  1545. CTerrain * pTerrain;
  1546. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  1547. continue;
  1548.  
  1549. if (kMap_pbyMarkBuf.end() == kMap_pbyMarkBuf.find(iTerrainNum))
  1550. {
  1551. BYTE * pbyBuf = new BYTE [CTerrain::ATTRMAP_XSIZE*CTerrain::ATTRMAP_YSIZE];
  1552. ZeroMemory(pbyBuf, CTerrain::ATTRMAP_XSIZE*CTerrain::ATTRMAP_YSIZE);
  1553. kMap_pbyMarkBuf[iTerrainNum] = pbyBuf;
  1554. }
  1555.  
  1556. BYTE * pbyBuf = kMap_pbyMarkBuf[iTerrainNum];
  1557. pbyBuf[ixLocalCell+iyLocalCell*CTerrain::ATTRMAP_XSIZE] = 0xff;
  1558. }
  1559. }
  1560.  
  1561. std::map<int, BYTE*>::iterator itorTerrain = kMap_pbyMarkBuf.begin();
  1562. for (; itorTerrain != kMap_pbyMarkBuf.end(); ++itorTerrain)
  1563. {
  1564. int iTerrainNum = itorTerrain->first;
  1565. int ixTerrain = iTerrainNum%100;
  1566. int iyTerrain = iTerrainNum/100;
  1567. BYTE * pbyBuf = itorTerrain->second;
  1568.  
  1569. BYTE byTerrainNum;
  1570. if (!GetTerrainNumFromCoord(ixTerrain, iyTerrain, &byTerrainNum))
  1571. continue;
  1572. CTerrain * pTerrain;
  1573. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  1574. continue;
  1575.  
  1576. pTerrain->AllocateMarkedSplats(pbyBuf);
  1577. }
  1578.  
  1579. stl_wipe_second(kMap_pbyMarkBuf);
  1580. }
  1581.  
  1582. void CMapOutdoor::DisableMarkedArea()
  1583. {
  1584. for (int i = 0; i < AROUND_AREA_NUM; ++i)
  1585. {
  1586. if (!m_pTerrain[i])
  1587. continue;
  1588.  
  1589. m_pTerrain[i]->DeallocateMarkedSplats();
  1590. }
  1591. }
  1592.  
  1593. void CMapOutdoor::ConvertToMapCoords(float fx, float fy, int *iCellX, int *iCellY, BYTE * pucSubCellX, BYTE * pucSubCellY, WORD * pwTerrainNumX, WORD * pwTerrainNumY)
  1594. {
  1595. if ( fy < 0 )
  1596. fy = -fy;
  1597.  
  1598. int ix, iy;
  1599. PR_FLOAT_TO_INT(fx, ix);
  1600. PR_FLOAT_TO_INT(fy, iy);
  1601.  
  1602. *pwTerrainNumX = ix / (CTerrainImpl::TERRAIN_XSIZE);
  1603. *pwTerrainNumY = iy / (CTerrainImpl::TERRAIN_YSIZE);
  1604.  
  1605. float maxx = (float) CTerrainImpl::TERRAIN_XSIZE;
  1606. float maxy = (float) CTerrainImpl::TERRAIN_YSIZE;
  1607.  
  1608. while (fx < 0)
  1609. fx += maxx;
  1610.  
  1611. while (fy < 0)
  1612. fy += maxy;
  1613.  
  1614. while (fx >= maxx)
  1615. fx -= maxx;
  1616.  
  1617. while (fy >= maxy)
  1618. fy -= maxy;
  1619.  
  1620. float fooscale = 1.0f / (float)(CTerrainImpl::HALF_CELLSCALE);
  1621.  
  1622. float fCellX, fCellY;
  1623.  
  1624. fCellX = fx * fooscale;
  1625. fCellY = fy * fooscale;
  1626.  
  1627. PR_FLOAT_TO_INT(fCellX, *iCellX);
  1628. PR_FLOAT_TO_INT(fCellY, *iCellY);
  1629.  
  1630. float fRatioooscale = ((float)CTerrainImpl::HEIGHT_TILE_XRATIO) * fooscale;
  1631.  
  1632. float fSubcellX, fSubcellY;
  1633. fSubcellX = fx * fRatioooscale;
  1634. fSubcellY = fy * fRatioooscale;
  1635.  
  1636. PR_FLOAT_TO_INT(fSubcellX, *pucSubCellX);
  1637. PR_FLOAT_TO_INT(fSubcellY, *pucSubCellY);
  1638. *pucSubCellX = (*pucSubCellX) % CTerrainImpl::HEIGHT_TILE_XRATIO;
  1639. *pucSubCellY = (*pucSubCellY) % CTerrainImpl::HEIGHT_TILE_YRATIO;
  1640. }
  1641.  
Advertisement
Add Comment
Please, Sign In to add comment