Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 43.64 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 D3DLIGHT9& 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. if ( D3DXVec3Length( &(v3ObjectPick - v3Start) ) >= D3DXVec3Length( &(v3TerrainPick - v3Start) ) )
  528. *v3IntersectPt = v3TerrainPick;
  529. else
  530. *v3IntersectPt = v3ObjectPick;
  531. return true;
  532. }
  533. else if (bObjectPick)
  534. {
  535. *v3IntersectPt = v3ObjectPick;
  536. return true;
  537. }
  538. else if (bTerrainPick)
  539. {
  540. *v3IntersectPt = v3TerrainPick;
  541. return true;
  542. }
  543.  
  544. return false;
  545. }
  546.  
  547. bool CMapOutdoor::GetPickingPointWithRayOnlyTerrain(const CRay & rRay, D3DXVECTOR3 * v3IntersectPt)
  548. {
  549. bool bTerrainPick = false;
  550. D3DXVECTOR3 v3TerrainPick;
  551.  
  552. D3DXVECTOR3 v3Start, v3End, v3Dir, v3CurPos;
  553. float fRayRange;
  554. rRay.GetStartPoint(&v3Start);
  555. rRay.GetDirection(&v3Dir, &fRayRange);
  556. rRay.GetEndPoint(&v3End);
  557.  
  558. Vector3d v3dStart, v3dEnd;
  559. v3dStart.Set(v3Start.x, v3Start.y, v3Start.z);
  560. v3dEnd.Set(v3End.x - v3Start.x, v3End.y - v3Start.y, v3End.z - v3Start.z);
  561.  
  562.  
  563.  
  564. float fPos = 0.0f;
  565. bTerrainPick=true;
  566. if (!__PickTerrainHeight(fPos, v3Start, v3End, 5.0f, fRayRange, 5000.0f, &v3TerrainPick))
  567. if (!__PickTerrainHeight(fPos, v3Start, v3End, 10.0f, fRayRange, 10000.0f, &v3TerrainPick))
  568. if (!__PickTerrainHeight(fPos, v3Start, v3End, 100.0f, fRayRange, 100000.0f, &v3TerrainPick))
  569. bTerrainPick=false;
  570.  
  571. if (bTerrainPick)
  572. {
  573. *v3IntersectPt = v3TerrainPick;
  574. return true;
  575. }
  576.  
  577. return false;
  578. }
  579. /*
  580. {
  581. bool bTerrainPick = false;
  582. D3DXVECTOR3 v3TerrainPick;
  583.  
  584. CTerrain * pTerrain;
  585.  
  586. D3DXVECTOR3 v3Start, v3End, v3Dir, v3CurPos;
  587. float fRayRange;
  588. rRay.GetStartPoint(&v3Start);
  589. rRay.GetDirection(&v3Dir, &fRayRange);
  590. rRay.GetEndPoint(&v3End);
  591.  
  592. Vector3d v3dStart, v3dEnd;
  593. v3dStart.Set(v3Start.x, v3Start.y, v3Start.z);
  594. v3dEnd.Set(v3End.x - v3Start.x, v3End.y - v3Start.y, v3End.z - v3Start.z);
  595.  
  596. float fAdd = 1.0f / fRayRange;
  597.  
  598. float ft = 0.0f;
  599. while (ft < 1.0f)
  600. {
  601. D3DXVec3Lerp(&v3CurPos, &v3Start, &v3End, ft);
  602. BYTE byTerrainNum;
  603. float fMultiplier = 1.0f;
  604. if (GetTerrainNum(v3CurPos.x, v3CurPos.y, &byTerrainNum))
  605. {
  606. if (GetTerrainPointer(byTerrainNum, &pTerrain))
  607. {
  608. int ix, iy;
  609. PR_FLOAT_TO_INT(v3CurPos.x, ix);
  610. PR_FLOAT_TO_INT(fabs(v3CurPos.y), iy);
  611. float fMapHeight = pTerrain->GetHeight(ix, iy);
  612. if ( fMapHeight >= v3CurPos.z)
  613. {
  614. bTerrainPick = true;
  615. v3TerrainPick = v3CurPos;
  616. break;
  617. }
  618. else
  619. fMultiplier = fMAX(1.0f, 0.01f * ( v3CurPos.z - fMapHeight ) );
  620. }
  621. }
  622. ft += fAdd * fMultiplier;
  623. }
  624.  
  625. if (bTerrainPick)
  626. {
  627. *v3IntersectPt = v3TerrainPick;
  628. return true;
  629. }
  630.  
  631. return false;
  632. }
  633. */
  634.  
  635. void CMapOutdoor::GetHeightMap(const BYTE & c_rucTerrainNum, WORD ** pwHeightMap)
  636. {
  637. if (c_rucTerrainNum < 0 || c_rucTerrainNum > AROUND_AREA_NUM - 1 || !m_pTerrain[c_rucTerrainNum])
  638. {
  639. *pwHeightMap = NULL;
  640. return;
  641. }
  642.  
  643. *pwHeightMap = m_pTerrain[c_rucTerrainNum]->GetHeightMap();
  644. }
  645.  
  646. void CMapOutdoor::GetNormalMap(const BYTE & c_rucTerrainNum, char ** pucNormalMap)
  647. {
  648. if (c_rucTerrainNum < 0 || c_rucTerrainNum > AROUND_AREA_NUM - 1 || !m_pTerrain[c_rucTerrainNum])
  649. {
  650. *pucNormalMap = NULL;
  651. return;
  652. }
  653.  
  654. *pucNormalMap = m_pTerrain[c_rucTerrainNum]->GetNormalMap();
  655. }
  656.  
  657. void CMapOutdoor::GetWaterMap(const BYTE & c_rucTerrainNum, BYTE ** pucWaterMap)
  658. {
  659. if (c_rucTerrainNum < 0 || c_rucTerrainNum > AROUND_AREA_NUM - 1 || !m_pTerrain[c_rucTerrainNum])
  660. {
  661. *pucWaterMap = NULL;
  662. return;
  663. }
  664.  
  665. *pucWaterMap = m_pTerrain[c_rucTerrainNum]->GetWaterMap();
  666. }
  667.  
  668. void CMapOutdoor::GetWaterHeight(BYTE byTerrainNum, BYTE byWaterNum, long * plWaterHeight)
  669. {
  670. if (byTerrainNum < 0 || byTerrainNum > AROUND_AREA_NUM - 1 || !m_pTerrain[byTerrainNum])
  671. {
  672. *plWaterHeight = -1;
  673. return;
  674. }
  675.  
  676. m_pTerrain[byTerrainNum]->GetWaterHeight(byWaterNum, plWaterHeight);
  677. }
  678.  
  679. bool CMapOutdoor::GetWaterHeight(int iX, int iY, long * plWaterHeight)
  680. {
  681. if (iX < 0 || iY < 0 || iX > m_sTerrainCountX * CTerrainImpl::TERRAIN_XSIZE || iY > m_sTerrainCountY * CTerrainImpl::TERRAIN_YSIZE)
  682. return false;
  683.  
  684. WORD wTerrainCoordX, wTerrainCoordY;
  685. wTerrainCoordX = iX / CTerrainImpl::TERRAIN_XSIZE;
  686. wTerrainCoordY = iY / CTerrainImpl::TERRAIN_YSIZE;
  687.  
  688. BYTE byTerrainNum;
  689. if (!GetTerrainNumFromCoord(wTerrainCoordX, wTerrainCoordY, &byTerrainNum))
  690. return false;
  691. CTerrain * pTerrain;
  692. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  693. return false;
  694.  
  695. WORD wLocalX, wLocalY;
  696. wLocalX = (iX - wTerrainCoordX * CTerrainImpl::TERRAIN_XSIZE) / (CTerrainImpl::WATERMAP_XSIZE);
  697. wLocalY = (iY - wTerrainCoordY * CTerrainImpl::TERRAIN_YSIZE) / (CTerrainImpl::WATERMAP_YSIZE);
  698.  
  699. return pTerrain->GetWaterHeight(wLocalX, wLocalY, plWaterHeight);
  700. }
  701.  
  702. //////////////////////////////////////////////////////////////////////////
  703. // Update
  704. //////////////////////////////////////////////////////////////////////////
  705.  
  706. bool CMapOutdoor::GetTerrainNumFromCoord(WORD wCoordX, WORD wCoordY, BYTE * pbyTerrainNum)
  707. {
  708. *pbyTerrainNum = (wCoordY - m_CurCoordinate.m_sTerrainCoordY + LOAD_SIZE_WIDTH) * 3 +
  709. (wCoordX - m_CurCoordinate.m_sTerrainCoordX + LOAD_SIZE_WIDTH);
  710.  
  711. if (*pbyTerrainNum < 0 || *pbyTerrainNum > AROUND_AREA_NUM)
  712. return false;
  713. return true;
  714. }
  715.  
  716. void CMapOutdoor::BuildViewFrustum(D3DXMATRIX & mat)
  717. {
  718. //m_plane[0] = D3DXPLANE(mat._14 + mat._13, mat._24 + mat._23, mat._34 + mat._33, mat._44 + mat._43);
  719. m_plane[0] = D3DXPLANE( mat._13, mat._23, mat._33, mat._43); // Near
  720. m_plane[1] = D3DXPLANE(mat._14 - mat._13, mat._24 - mat._23, mat._34 - mat._33, mat._44 - mat._43); // Far
  721. m_plane[2] = D3DXPLANE(mat._14 + mat._11, mat._24 + mat._21, mat._34 + mat._31, mat._44 + mat._41); // Left
  722. m_plane[3] = D3DXPLANE(mat._14 - mat._11, mat._24 - mat._21, mat._34 - mat._31, mat._44 - mat._41); // Right
  723. m_plane[4] = D3DXPLANE(mat._14 + mat._12, mat._24 + mat._22, mat._34 + mat._32, mat._44 + mat._42); // Bottom
  724. m_plane[5] = D3DXPLANE(mat._14 - mat._12, mat._24 - mat._22, mat._34 - mat._32, mat._44 - mat._42); // Top
  725.  
  726. for (int i = 0; i < 6; ++i)
  727. D3DXPlaneNormalize(&m_plane[i],&m_plane[i]);
  728. }
  729.  
  730. bool MAPOUTDOOR_GET_HEIGHT_USE2D = true;
  731. bool MAPOUTDOOR_GET_HEIGHT_TRACE = false;
  732.  
  733. void CMapOutdoor::__HeightCache_Update()
  734. {
  735. m_kHeightCache.m_isUpdated=true;
  736. }
  737.  
  738. void CMapOutdoor::__HeightCache_Init()
  739. {
  740. m_kHeightCache.m_isUpdated=false;
  741.  
  742. for (UINT uIndex=0; uIndex!=SHeightCache::HASH_SIZE; ++uIndex)
  743. m_kHeightCache.m_akVct_kItem[uIndex].clear();
  744. }
  745.  
  746. float CMapOutdoor::GetHeight(float fx, float fy)
  747. {
  748. float fTerrainHeight = GetTerrainHeight(fx, fy);
  749.  
  750. if (!m_bEnableTerrainOnlyForHeight)
  751. {
  752. CCullingManager & rkCullingMgr = CCullingManager::Instance();
  753.  
  754. float CHECK_HEIGHT = 25000.0f;
  755. float fObjectHeight = -CHECK_HEIGHT;
  756.  
  757. Vector3d aVector3d;
  758. aVector3d.Set(fx, -fy, fTerrainHeight);
  759.  
  760. FGetObjectHeight kGetObjHeight(fx, fy);
  761.  
  762. RangeTester<FGetObjectHeight> kRangeTester_kGetObjHeight(&kGetObjHeight);
  763. rkCullingMgr.PointTest2d(aVector3d, &kRangeTester_kGetObjHeight);
  764.  
  765. if (kGetObjHeight.m_bHeightFound)
  766. fObjectHeight = kGetObjHeight.m_fReturnHeight;
  767.  
  768. return fMAX(fObjectHeight, fTerrainHeight);
  769. }
  770.  
  771. return fTerrainHeight;
  772. }
  773.  
  774. float CMapOutdoor::GetCacheHeight(float fx, float fy)
  775. {
  776. unsigned int nx=int(fx);
  777. unsigned int ny=int(fy);
  778.  
  779. DWORD dwKey=0;
  780.  
  781. #ifdef __HEIGHT_CACHE_TRACE__
  782. static DWORD s_dwTotalCount=0;
  783. static DWORD s_dwHitCount=0;
  784. static DWORD s_dwErrorCount=0;
  785.  
  786. s_dwTotalCount++;
  787. #endif
  788.  
  789. std::vector<SHeightCache::SItem>* pkVct_kItem=NULL;
  790. if (m_kHeightCache.m_isUpdated && nx<16*30000 && ny<16*30000)
  791. {
  792. nx>>=4;
  793. ny>>=4;
  794. //short aPos[2]={nx, ny};
  795.  
  796. dwKey=(ny<<16)|nx;//CalcCRC16Words(2, aPos);
  797. pkVct_kItem=&m_kHeightCache.m_akVct_kItem[dwKey%SHeightCache::HASH_SIZE];
  798. std::vector<SHeightCache::SItem>::iterator i;
  799. for (i=pkVct_kItem->begin(); i!=pkVct_kItem->end(); ++i)
  800. {
  801. SHeightCache::SItem& rkItem=*i;
  802. if (rkItem.m_dwKey==dwKey)
  803. {
  804. #ifdef __HEIGHT_CACHE_TRACE__
  805. s_dwHitCount++;
  806.  
  807. if (s_dwTotalCount>1000)
  808. {
  809. DWORD dwHitRate=s_dwHitCount*1000/s_dwTotalCount;
  810. static DWORD s_dwMaxHitRate=0;
  811. if (s_dwMaxHitRate<dwHitRate)
  812. {
  813. s_dwMaxHitRate=dwHitRate;
  814. printf("HitRate %f\n", s_dwMaxHitRate*0.1f);
  815. }
  816.  
  817.  
  818. }
  819. #endif
  820. return rkItem.m_fHeight;
  821. }
  822. }
  823. }
  824. else
  825. {
  826. #ifdef __HEIGHT_CACHE_TRACE__
  827. s_dwErrorCount++;
  828. //printf("NoCache (%f, %f)\n", fx/100.0f, fy/100.0f);
  829. #endif
  830. }
  831. #ifdef __HEIGHT_CACHE_TRACE__
  832. if (s_dwTotalCount>=1000000)
  833. {
  834. printf("HitRate %f\n", s_dwHitCount*1000/s_dwTotalCount*0.1f);
  835. printf("ErrRate %f\n", s_dwErrorCount*1000/s_dwTotalCount*0.1f);
  836. s_dwHitCount=0;
  837. s_dwTotalCount=0;
  838. s_dwErrorCount=0;
  839. }
  840. #endif
  841.  
  842. float fTerrainHeight = GetTerrainHeight(fx, fy);
  843. #ifdef SPHERELIB_STRICT
  844. if (MAPOUTDOOR_GET_HEIGHT_TRACE)
  845. printf("Terrain %f\n", fTerrainHeight);
  846. #endif
  847. CCullingManager & rkCullingMgr = CCullingManager::Instance();
  848.  
  849. float CHECK_HEIGHT = 25000.0f;
  850. float fObjectHeight = -CHECK_HEIGHT;
  851.  
  852. if (MAPOUTDOOR_GET_HEIGHT_USE2D)
  853. {
  854. Vector3d aVector3d;
  855. aVector3d.Set(fx, -fy, fTerrainHeight);
  856.  
  857. FGetObjectHeight kGetObjHeight(fx, fy);
  858.  
  859. RangeTester<FGetObjectHeight> kRangeTester_kGetObjHeight(&kGetObjHeight);
  860. rkCullingMgr.PointTest2d(aVector3d, &kRangeTester_kGetObjHeight);
  861.  
  862. if (kGetObjHeight.m_bHeightFound)
  863. fObjectHeight = kGetObjHeight.m_fReturnHeight;
  864. }
  865. else
  866. {
  867. Vector3d aVector3d;
  868. aVector3d.Set(fx, -fy, fTerrainHeight);
  869.  
  870. Vector3d toTop;
  871. toTop.Set(0,0,CHECK_HEIGHT);
  872.  
  873. FGetObjectHeight kGetObjHeight(fx, fy);
  874. rkCullingMgr.ForInRay(aVector3d, toTop, &kGetObjHeight);
  875.  
  876. if (kGetObjHeight.m_bHeightFound)
  877. fObjectHeight = kGetObjHeight.m_fReturnHeight;
  878. }
  879.  
  880. float fHeight=fMAX(fObjectHeight, fTerrainHeight);
  881.  
  882. if (pkVct_kItem)
  883. {
  884. if (pkVct_kItem->size()>=200)
  885. {
  886. #ifdef __HEIGHT_CACHE_TRACE__
  887. printf("ClearCacheHeight[%d]\n", dwKey%SHeightCache::HASH_SIZE);
  888. #endif
  889. pkVct_kItem->clear();
  890. }
  891.  
  892. SHeightCache::SItem kItem;
  893. kItem.m_dwKey=dwKey;
  894. kItem.m_fHeight=fHeight;
  895. pkVct_kItem->push_back(kItem);
  896. }
  897.  
  898. return fHeight;
  899. }
  900.  
  901. bool CMapOutdoor::GetNormal(int ix, int iy, D3DXVECTOR3 * pv3Normal)
  902. {
  903. if (ix <= 0)
  904. ix = 0;
  905. else if (ix >= m_sTerrainCountX * CTerrainImpl::TERRAIN_XSIZE)
  906. ix = m_sTerrainCountX * CTerrainImpl::TERRAIN_XSIZE;
  907.  
  908. if (iy <= 0)
  909. iy = 0;
  910. else if (iy >= m_sTerrainCountY * CTerrainImpl::TERRAIN_YSIZE)
  911. iy = m_sTerrainCountY * CTerrainImpl::TERRAIN_YSIZE;
  912.  
  913. WORD usCoordX, usCoordY;
  914.  
  915. usCoordX = (WORD) (ix / (CTerrainImpl::TERRAIN_XSIZE));
  916. usCoordY = (WORD) (iy / (CTerrainImpl::TERRAIN_YSIZE));
  917.  
  918. if (usCoordX >= m_sTerrainCountX - 1)
  919. usCoordX = m_sTerrainCountX - 1;
  920.  
  921. if (usCoordY >= m_sTerrainCountY - 1)
  922. usCoordY = m_sTerrainCountY - 1;
  923.  
  924. BYTE byTerrainNum;
  925. if (!GetTerrainNumFromCoord(usCoordX, usCoordY, &byTerrainNum))
  926. return false;
  927.  
  928. CTerrain * pTerrain;
  929.  
  930. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  931. return false;
  932.  
  933. while (ix >= CTerrainImpl::TERRAIN_XSIZE)
  934. ix -= CTerrainImpl::TERRAIN_XSIZE;
  935.  
  936. while (iy >= CTerrainImpl::TERRAIN_YSIZE)
  937. iy -= CTerrainImpl::TERRAIN_YSIZE;
  938.  
  939. return pTerrain->GetNormal(ix, iy, pv3Normal);
  940. }
  941.  
  942. float CMapOutdoor::GetTerrainHeight(float fx, float fy)
  943. {
  944. if (fy < 0)
  945. fy = -fy;
  946. long lx, ly;
  947. PR_FLOAT_TO_INT(fx, lx);
  948. PR_FLOAT_TO_INT(fy, ly);
  949.  
  950. WORD usCoordX, usCoordY;
  951.  
  952. usCoordX = (WORD) (lx / CTerrainImpl::TERRAIN_XSIZE);
  953. usCoordY = (WORD) (ly / CTerrainImpl::TERRAIN_YSIZE);
  954.  
  955. BYTE byTerrainNum;
  956. if (!GetTerrainNumFromCoord(usCoordX, usCoordY, &byTerrainNum))
  957. return 0.0f;
  958.  
  959. CTerrain * pTerrain;
  960.  
  961. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  962. return 0.0f;
  963.  
  964. return pTerrain->GetHeight(lx, ly);
  965. }
  966.  
  967. //////////////////////////////////////////////////////////////////////////
  968. // For Grass
  969. float CMapOutdoor::GetHeight(float * pPos)
  970. {
  971. pPos[2] = GetHeight(pPos[0], pPos[1]);
  972. return pPos[2];
  973. }
  974.  
  975. bool CMapOutdoor::GetBrushColor(float fX, float fY, float* pLowColor, float* pHighColor)
  976. {
  977. bool bSuccess = false;
  978.  
  979. // float fU, fV;
  980. //
  981. // GetOneToOneMappingCoordinates(fX, fY, fU, fV);
  982. //
  983. // if (fU >= 0.0f && fU <= 1.0f && fV >= 0.0f && fV <= 1.0f)
  984. // {
  985. // int nImageCol = (m_cBrushMap.GetWidth() - 1) * fU;
  986. // int nImageRow = (m_cBrushMap.GetHeight() - 1) * fV;
  987. //
  988. // // low
  989. // BYTE* pPixel = m_cBrushMap.GetPixel(nImageCol, nImageRow);
  990. // pLowColor[0] = (pPixel[0] / 255.0f);
  991. // pLowColor[1] = (pPixel[1] / 255.0f);
  992. // pLowColor[2] = (pPixel[2] / 255.0f);
  993. // pLowColor[3] = (pPixel[3] / 255.0f);
  994. //
  995. // // high
  996. // pPixel = m_cBrushMap2.GetPixel(nImageCol, nImageRow);
  997. // pHighColor[0] = (pPixel[0] / 255.0f);
  998. // pHighColor[1] = (pPixel[1] / 255.0f);
  999. // pHighColor[2] = (pPixel[2] / 255.0f);
  1000. // pHighColor[3] = (pPixel[3] / 255.0f);
  1001. //
  1002. // bSuccess = true;
  1003. // }
  1004. pLowColor[0] = (1.0f);
  1005. pLowColor[1] = (1.0f);
  1006. pLowColor[2] = (1.0f);
  1007. pLowColor[3] = (1.0f);
  1008. pHighColor[0] = (1.0f);
  1009. pHighColor[1] = (1.0f);
  1010. pHighColor[2] = (1.0f);
  1011. pHighColor[3] = (1.0f);
  1012.  
  1013. return bSuccess;
  1014. }
  1015.  
  1016. // End of for grass
  1017. //////////////////////////////////////////////////////////////////////////
  1018. BOOL CMapOutdoor::GetAreaPointer(const BYTE c_byAreaNum, CArea ** ppArea)
  1019. {
  1020. if (c_byAreaNum >= AROUND_AREA_NUM)
  1021. {
  1022. *ppArea = NULL;
  1023. return FALSE;
  1024. }
  1025.  
  1026. if (NULL == m_pArea[c_byAreaNum])
  1027. {
  1028. *ppArea = NULL;
  1029. return FALSE;
  1030. }
  1031.  
  1032. *ppArea = m_pArea[c_byAreaNum];
  1033. return TRUE;
  1034. }
  1035.  
  1036. BOOL CMapOutdoor::GetTerrainPointer(const BYTE c_byTerrainNum, CTerrain ** ppTerrain)
  1037. {
  1038. if (c_byTerrainNum >= AROUND_AREA_NUM)
  1039. {
  1040. *ppTerrain = NULL;
  1041. return FALSE;
  1042. }
  1043.  
  1044. if (NULL == m_pTerrain[c_byTerrainNum])
  1045. {
  1046. *ppTerrain = NULL;
  1047. return FALSE;
  1048. }
  1049.  
  1050. *ppTerrain = m_pTerrain[c_byTerrainNum];
  1051. return TRUE;
  1052. }
  1053.  
  1054. void CMapOutdoor::InitializeFog()
  1055. {
  1056. memset(&m_matAlphaFogTexture, 0, sizeof(D3DXMATRIX));
  1057. m_matAlphaFogTexture._31 = -0.001f;
  1058. m_matAlphaFogTexture._41 = -7.0f;
  1059. m_matAlphaFogTexture._42 = 0.5f;
  1060. }
  1061.  
  1062. void CMapOutdoor::SaveAlphaFogOperation()
  1063. {
  1064. STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
  1065. STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
  1066. STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
  1067. STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
  1068. STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
  1069. STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
  1070. STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
  1071. STATEMANAGER.SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
  1072. STATEMANAGER.SetSamplerState(1, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
  1073.  
  1074. STATEMANAGER.SetTransform(D3DTS_TEXTURE1, &m_matAlphaFogTexture);
  1075. STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
  1076. STATEMANAGER.SetTexture(1, m_AlphaFogImageInstance.GetTexturePointer()->GetD3DTexture());
  1077. }
  1078.  
  1079. void CMapOutdoor::RestoreAlphaFogOperation()
  1080. {
  1081. STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
  1082. STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
  1083. STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE);
  1084. }
  1085.  
  1086.  
  1087. void CMapOutdoor::SetDrawShadow(bool bDrawShadow)
  1088. {
  1089. m_bDrawShadow = bDrawShadow;
  1090. }
  1091.  
  1092. void CMapOutdoor::SetDrawCharacterShadow(bool bDrawChrShadow)
  1093. {
  1094. m_bDrawChrShadow = bDrawChrShadow;
  1095. }
  1096.  
  1097. DWORD CMapOutdoor::GetShadowMapColor(float fx, float fy)
  1098. {
  1099. if (fy < 0)
  1100. fy = -fy;
  1101.  
  1102. float fTerrainSize = (float) (CTerrainImpl::TERRAIN_XSIZE);
  1103. float fXRef = fx - (float) (m_lCurCoordStartX);
  1104. float fYRef = fy - (float) (m_lCurCoordStartY);
  1105.  
  1106. CTerrain * pTerrain;
  1107.  
  1108. if (fYRef < -fTerrainSize)
  1109. return 0xFFFFFFFF;
  1110. else if (fYRef >= -fTerrainSize && fYRef < 0.0f)
  1111. {
  1112. if (fXRef < -fTerrainSize)
  1113. return 0xFFFFFFFF;
  1114. else if (fXRef >= -fTerrainSize && fXRef < 0.0f)
  1115. {
  1116. if (GetTerrainPointer(0, &pTerrain))
  1117. return pTerrain->GetShadowMapColor(fXRef + fTerrainSize, fYRef + fTerrainSize);
  1118. else
  1119. return 0xFFFFFFFF;
  1120. }
  1121. else if (fXRef >= 0.0f && fXRef < fTerrainSize)
  1122. {
  1123. if (GetTerrainPointer(1, &pTerrain))
  1124. return pTerrain->GetShadowMapColor(fXRef, fYRef + fTerrainSize);
  1125. else
  1126. return 0xFFFFFFFF;
  1127. }
  1128. else if (fXRef >= fTerrainSize && fXRef < 2.0f * fTerrainSize)
  1129. {
  1130. if (GetTerrainPointer(2, &pTerrain))
  1131. return pTerrain->GetShadowMapColor(fXRef - fTerrainSize, fYRef + fTerrainSize);
  1132. else
  1133. return 0xFFFFFFFF;
  1134. }
  1135. else
  1136. return 0xFFFFFFFF;
  1137. }
  1138. else if (fYRef >= 0.0f && fYRef < fTerrainSize)
  1139. {
  1140. if (fXRef < -fTerrainSize)
  1141. return 0xFFFFFFFF;
  1142. else if (fXRef >= -fTerrainSize && fXRef < 0.0f)
  1143. {
  1144. if (GetTerrainPointer(3, &pTerrain))
  1145. return pTerrain->GetShadowMapColor(fXRef + fTerrainSize, fYRef);
  1146. else
  1147. return 0xFFFFFFFF;
  1148. }
  1149. else if (fXRef >= 0.0f && fXRef < fTerrainSize)
  1150. {
  1151. if (GetTerrainPointer(4, &pTerrain))
  1152. return pTerrain->GetShadowMapColor(fXRef, fYRef);
  1153. else
  1154. return 0xFFFFFFFF;
  1155. }
  1156. else if (fXRef >= fTerrainSize && fXRef < 2.0f * fTerrainSize)
  1157. {
  1158. if (GetTerrainPointer(5, &pTerrain))
  1159. return pTerrain->GetShadowMapColor(fXRef - fTerrainSize, fYRef);
  1160. else
  1161. return 0xFFFFFFFF;
  1162. }
  1163. else
  1164. return 0xFFFFFFFF;
  1165. }
  1166. else if (fYRef >= fTerrainSize && fYRef < 2.0f * fTerrainSize)
  1167. {
  1168. if (fXRef < -fTerrainSize)
  1169. return 0xFFFFFFFF;
  1170. else if (fXRef >= -fTerrainSize && fXRef < 0.0f)
  1171. {
  1172. if (GetTerrainPointer(6, &pTerrain))
  1173. return pTerrain->GetShadowMapColor(fXRef + fTerrainSize, fYRef - fTerrainSize);
  1174. else
  1175. return 0xFFFFFFFF;
  1176. }
  1177. else if (fXRef >= 0.0f && fXRef < fTerrainSize)
  1178. {
  1179. if (GetTerrainPointer(7, &pTerrain))
  1180. return pTerrain->GetShadowMapColor(fXRef, fYRef - fTerrainSize);
  1181. else
  1182. return 0xFFFFFFFF;
  1183. }
  1184. else if (fXRef >= fTerrainSize && fXRef < 2.0f * fTerrainSize)
  1185. {
  1186. if (GetTerrainPointer(8, &pTerrain))
  1187. return pTerrain->GetShadowMapColor(fXRef - fTerrainSize, fYRef - fTerrainSize);
  1188. else
  1189. return 0xFFFFFFFF;
  1190. }
  1191. else
  1192. return 0xFFFFFFFF;
  1193. }
  1194. else
  1195. return 0xFFFFFFFF;
  1196.  
  1197. return 0xFFFFFFFF;
  1198. }
  1199.  
  1200. bool CMapOutdoor::isAttrOn(float fX, float fY, BYTE byAttr)
  1201. {
  1202. int iX, iY;
  1203. PR_FLOAT_TO_INT(fX, iX);
  1204. PR_FLOAT_TO_INT(fY, iY);
  1205.  
  1206. return isAttrOn(iX, iY, byAttr);
  1207. }
  1208.  
  1209. bool CMapOutdoor::GetAttr(float fX, float fY, BYTE * pbyAttr)
  1210. {
  1211. int iX, iY;
  1212. PR_FLOAT_TO_INT(fX, iX);
  1213. PR_FLOAT_TO_INT(fY, iY);
  1214.  
  1215. return GetAttr(iX, iY, pbyAttr);
  1216. }
  1217.  
  1218. bool CMapOutdoor::isAttrOn(int iX, int iY, BYTE byAttr)
  1219. {
  1220. if (iX < 0 || iY < 0 || iX > m_sTerrainCountX * CTerrainImpl::TERRAIN_XSIZE || iY > m_sTerrainCountY * CTerrainImpl::TERRAIN_YSIZE)
  1221. return false;
  1222.  
  1223. WORD wTerrainCoordX, wTerrainCoordY;
  1224. wTerrainCoordX = iX / CTerrainImpl::TERRAIN_XSIZE;
  1225. wTerrainCoordY = iY / CTerrainImpl::TERRAIN_YSIZE;
  1226.  
  1227. BYTE byTerrainNum;
  1228. if (!GetTerrainNumFromCoord(wTerrainCoordX, wTerrainCoordY, &byTerrainNum))
  1229. return false;
  1230. CTerrain * pTerrain;
  1231. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  1232. return false;
  1233.  
  1234. WORD wLocalX, wLocalY;
  1235. wLocalX = (iX - wTerrainCoordX * CTerrainImpl::TERRAIN_XSIZE) / (CTerrainImpl::HALF_CELLSCALE);
  1236. wLocalY = (iY - wTerrainCoordY * CTerrainImpl::TERRAIN_YSIZE) / (CTerrainImpl::HALF_CELLSCALE);
  1237.  
  1238. return pTerrain->isAttrOn(wLocalX, wLocalY, byAttr);
  1239. }
  1240.  
  1241. bool CMapOutdoor::GetAttr(int iX, int iY, BYTE * pbyAttr)
  1242. {
  1243. if (iX < 0 || iY < 0 || iX > m_sTerrainCountX * CTerrainImpl::TERRAIN_XSIZE || iY > m_sTerrainCountY * CTerrainImpl::TERRAIN_YSIZE)
  1244. return false;
  1245.  
  1246. WORD wTerrainCoordX, wTerrainCoordY;
  1247. wTerrainCoordX = iX / CTerrainImpl::TERRAIN_XSIZE;
  1248. wTerrainCoordY = iY / CTerrainImpl::TERRAIN_YSIZE;
  1249.  
  1250. BYTE byTerrainNum;
  1251. if (!GetTerrainNumFromCoord(wTerrainCoordX, wTerrainCoordY, &byTerrainNum))
  1252. return false;
  1253. CTerrain * pTerrain;
  1254. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  1255. return false;
  1256.  
  1257. WORD wLocalX, wLocalY;
  1258. wLocalX = (WORD) (iX - wTerrainCoordX * CTerrainImpl::TERRAIN_XSIZE) / (CTerrainImpl::HALF_CELLSCALE);
  1259. wLocalY = (WORD) (iY - wTerrainCoordY * CTerrainImpl::TERRAIN_YSIZE) / (CTerrainImpl::HALF_CELLSCALE);
  1260.  
  1261. BYTE byAttr = pTerrain->GetAttr(wLocalX, wLocalY);
  1262.  
  1263. *pbyAttr = byAttr;
  1264.  
  1265. return true;
  1266. }
  1267.  
  1268. // MonsterAreaInfo
  1269. CMonsterAreaInfo * CMapOutdoor::AddMonsterAreaInfo(long lOriginX, long lOriginY, long lSizeX, long lSizeY)
  1270. {
  1271. CMonsterAreaInfo * pMonsterAreaInfo = m_kPool_kMonsterAreaInfo.Alloc();
  1272. pMonsterAreaInfo->Clear();
  1273. pMonsterAreaInfo->SetOrigin(lOriginX, lOriginY);
  1274. pMonsterAreaInfo->SetSize(lSizeX, lSizeY);
  1275. m_MonsterAreaInfoPtrVector.push_back(pMonsterAreaInfo);
  1276.  
  1277. return pMonsterAreaInfo;
  1278. }
  1279.  
  1280. void CMapOutdoor::RemoveAllMonsterAreaInfo()
  1281. {
  1282. m_MonsterAreaInfoPtrVectorIterator = m_MonsterAreaInfoPtrVector.begin();
  1283. while (m_MonsterAreaInfoPtrVectorIterator != m_MonsterAreaInfoPtrVector.end())
  1284. {
  1285. CMonsterAreaInfo * pMonsterAreaInfo = *m_MonsterAreaInfoPtrVectorIterator;
  1286. pMonsterAreaInfo->Clear();
  1287. ++m_MonsterAreaInfoPtrVectorIterator;
  1288. }
  1289. m_kPool_kMonsterAreaInfo.FreeAll();
  1290. m_MonsterAreaInfoPtrVector.clear();
  1291. }
  1292.  
  1293. bool CMapOutdoor::GetMonsterAreaInfoFromVectorIndex(DWORD dwMonsterAreaInfoVectorIndex, CMonsterAreaInfo ** ppMonsterAreaInfo)
  1294. {
  1295. if (dwMonsterAreaInfoVectorIndex >= m_MonsterAreaInfoPtrVector.size())
  1296. return false;
  1297.  
  1298. *ppMonsterAreaInfo = m_MonsterAreaInfoPtrVector[dwMonsterAreaInfoVectorIndex];
  1299. return true;
  1300. }
  1301.  
  1302. //////////////////////////////////////////////////////////////////////////
  1303. CMonsterAreaInfo * CMapOutdoor::AddNewMonsterAreaInfo(long lOriginX, long lOriginY, long lSizeX, long lSizeY,
  1304. CMonsterAreaInfo::EMonsterAreaInfoType eMonsterAreaInfoType,
  1305. DWORD dwVID, DWORD dwCount, CMonsterAreaInfo::EMonsterDir eMonsterDir)
  1306. {
  1307. CMonsterAreaInfo * pMonsterAreaInfo = m_kPool_kMonsterAreaInfo.Alloc();
  1308. pMonsterAreaInfo->Clear();
  1309. pMonsterAreaInfo->SetOrigin(lOriginX, lOriginY);
  1310. pMonsterAreaInfo->SetSize(lSizeX, lSizeY);
  1311.  
  1312. pMonsterAreaInfo->SetMonsterAreaInfoType(eMonsterAreaInfoType);
  1313.  
  1314. if (CMonsterAreaInfo::MONSTERAREAINFOTYPE_MONSTER == eMonsterAreaInfoType)
  1315. pMonsterAreaInfo->SetMonsterVID(dwVID);
  1316. else if (CMonsterAreaInfo::MONSTERAREAINFOTYPE_GROUP == eMonsterAreaInfoType)
  1317. pMonsterAreaInfo->SetMonsterGroupID(dwVID);
  1318. pMonsterAreaInfo->SetMonsterCount(dwCount);
  1319. pMonsterAreaInfo->SetMonsterDirection(eMonsterDir);
  1320. m_MonsterAreaInfoPtrVector.push_back(pMonsterAreaInfo);
  1321.  
  1322. return pMonsterAreaInfo;
  1323. }
  1324.  
  1325. //////////////////////////////////////////////////////////////////////////
  1326. void CMapOutdoor::GetBaseXY(DWORD * pdwBaseX, DWORD * pdwBaseY)
  1327. {
  1328. *pdwBaseX = m_dwBaseX;
  1329. *pdwBaseY = m_dwBaseY;
  1330. }
  1331.  
  1332. void CMapOutdoor::SetBaseXY(DWORD dwBaseX, DWORD dwBaseY)
  1333. {
  1334. m_dwBaseX = dwBaseX;
  1335. m_dwBaseY = dwBaseY;
  1336. }
  1337.  
  1338. void CMapOutdoor::SetEnvironmentDataName(const std::string& strEnvironmentDataName)
  1339. {
  1340. m_envDataName = strEnvironmentDataName;
  1341. }
  1342.  
  1343. void CMapOutdoor::__XMasTree_Initialize()
  1344. {
  1345. m_kXMas.m_pkTree=NULL;
  1346. m_kXMas.m_iEffectID=-1;
  1347. }
  1348.  
  1349. void CMapOutdoor::XMasTree_Destroy()
  1350. {
  1351. if (m_kXMas.m_pkTree)
  1352. {
  1353. CSpeedTreeForestDirectX8& rkForest=CSpeedTreeForestDirectX8::Instance();
  1354. m_kXMas.m_pkTree->Clear();
  1355. rkForest.DeleteInstance(m_kXMas.m_pkTree);
  1356. m_kXMas.m_pkTree=NULL;
  1357. }
  1358. if (-1 != m_kXMas.m_iEffectID)
  1359. {
  1360. CEffectManager& rkEffMgr = CEffectManager::Instance();
  1361. rkEffMgr.DestroyEffectInstance(m_kXMas.m_iEffectID);
  1362. m_kXMas.m_iEffectID=-1;
  1363. }
  1364. }
  1365.  
  1366. void CMapOutdoor::__XMasTree_Create(float x, float y, float z, const char* c_szTreeName, const char* c_szEffName)
  1367. {
  1368. assert(NULL==m_kXMas.m_pkTree);
  1369. assert(-1==m_kXMas.m_iEffectID);
  1370.  
  1371. CSpeedTreeForestDirectX8& rkForest=CSpeedTreeForestDirectX8::Instance();
  1372. DWORD dwCRC32 = GetCaseCRC32(c_szTreeName, strlen(c_szTreeName));
  1373. m_kXMas.m_pkTree=rkForest.CreateInstance(x, y, z, dwCRC32, c_szTreeName);
  1374.  
  1375. CEffectManager& rkEffMgr = CEffectManager::Instance();
  1376. rkEffMgr.RegisterEffect(c_szEffName);
  1377. m_kXMas.m_iEffectID = rkEffMgr.CreateEffect(c_szEffName,
  1378. D3DXVECTOR3(x, y, z),
  1379. D3DXVECTOR3(0.0f, 0.0f, 0.0f));
  1380. }
  1381.  
  1382. void CMapOutdoor::XMasTree_Set(float x, float y, float z, const char* c_szTreeName, const char* c_szEffName)
  1383. {
  1384. XMasTree_Destroy();
  1385. __XMasTree_Create(x, y, z, c_szTreeName, c_szEffName);
  1386. }
  1387.  
  1388. void CMapOutdoor::SpecialEffect_Create(DWORD dwID, float x, float y, float z, const char* c_szEffName)
  1389. {
  1390. CEffectManager& rkEffMgr = CEffectManager::Instance();
  1391.  
  1392. TSpecialEffectMap::iterator itor = m_kMap_dwID_iEffectID.find(dwID);
  1393. if (m_kMap_dwID_iEffectID.end() != itor)
  1394. {
  1395. DWORD dwEffectID = itor->second;
  1396. if (rkEffMgr.SelectEffectInstance(dwEffectID))
  1397. {
  1398. D3DXMATRIX mat;
  1399. D3DXMatrixIdentity(&mat);
  1400. mat._41 = x;
  1401. mat._42 = y;
  1402. mat._43 = z;
  1403. rkEffMgr.SetEffectInstanceGlobalMatrix(mat);
  1404. return;
  1405. }
  1406. }
  1407.  
  1408. rkEffMgr.RegisterEffect(c_szEffName);
  1409. DWORD dwEffectID = rkEffMgr.CreateEffect(c_szEffName,
  1410. D3DXVECTOR3(x, y, z),
  1411. D3DXVECTOR3(0.0f, 0.0f, 0.0f));
  1412. m_kMap_dwID_iEffectID.insert(make_pair(dwID, dwEffectID));
  1413. }
  1414.  
  1415. void CMapOutdoor::SpecialEffect_Delete(DWORD dwID)
  1416. {
  1417. TSpecialEffectMap::iterator itor = m_kMap_dwID_iEffectID.find(dwID);
  1418.  
  1419. if (m_kMap_dwID_iEffectID.end() == itor)
  1420. return;
  1421.  
  1422. CEffectManager& rkEffMgr = CEffectManager::Instance();
  1423. int iEffectID = itor->second;
  1424. rkEffMgr.DestroyEffectInstance(iEffectID);
  1425. }
  1426.  
  1427. void CMapOutdoor::SpecialEffect_Destroy()
  1428. {
  1429. CEffectManager& rkEffMgr = CEffectManager::Instance();
  1430.  
  1431. TSpecialEffectMap::iterator itor = m_kMap_dwID_iEffectID.begin();
  1432. for (; itor != m_kMap_dwID_iEffectID.end(); ++itor)
  1433. {
  1434. int iEffectID = itor->second;
  1435. rkEffMgr.DestroyEffectInstance(iEffectID);
  1436. }
  1437. }
  1438.  
  1439. void CMapOutdoor::ClearGuildArea()
  1440. {
  1441. m_rkList_kGuildArea.clear();
  1442. }
  1443.  
  1444. void CMapOutdoor::RegisterGuildArea(int isx, int isy, int iex, int iey)
  1445. {
  1446. RECT rect;
  1447. rect.left = isx;
  1448. rect.top = isy;
  1449. rect.right = iex;
  1450. rect.bottom = iey;
  1451. m_rkList_kGuildArea.push_back(rect);
  1452. }
  1453.  
  1454. void CMapOutdoor::VisibleMarkedArea()
  1455. {
  1456. std::map<int, BYTE*> kMap_pbyMarkBuf;
  1457. std::set<int> kSet_iProcessedMapIndex;
  1458.  
  1459. std::list<RECT>::iterator itorRect = m_rkList_kGuildArea.begin();
  1460. for (; itorRect != m_rkList_kGuildArea.end(); ++itorRect)
  1461. {
  1462. const RECT & rkRect = *itorRect;
  1463.  
  1464. int ix1Cell;
  1465. int iy1Cell;
  1466. BYTE byx1SubCell;
  1467. BYTE byy1SubCell;
  1468. WORD wx1TerrainNum;
  1469. WORD wy1TerrainNum;
  1470.  
  1471. int ix2Cell;
  1472. int iy2Cell;
  1473. BYTE byx2SubCell;
  1474. BYTE byy2SubCell;
  1475. WORD wx2TerrainNum;
  1476. WORD wy2TerrainNum;
  1477.  
  1478. ConvertToMapCoords(float(rkRect.left), float(rkRect.top), &ix1Cell, &iy1Cell, &byx1SubCell, &byy1SubCell, &wx1TerrainNum, &wy1TerrainNum);
  1479. ConvertToMapCoords(float(rkRect.right), float(rkRect.bottom), &ix2Cell, &iy2Cell, &byx2SubCell, &byy2SubCell, &wx2TerrainNum, &wy2TerrainNum);
  1480.  
  1481. ix1Cell = ix1Cell + wx1TerrainNum*CTerrain::ATTRMAP_XSIZE;
  1482. iy1Cell = iy1Cell + wy1TerrainNum*CTerrain::ATTRMAP_YSIZE;
  1483. ix2Cell = ix2Cell + wx2TerrainNum*CTerrain::ATTRMAP_XSIZE;
  1484. iy2Cell = iy2Cell + wy2TerrainNum*CTerrain::ATTRMAP_YSIZE;
  1485.  
  1486. for (int ixCell = ix1Cell; ixCell <= ix2Cell; ++ixCell)
  1487. for (int iyCell = iy1Cell; iyCell <= iy2Cell; ++iyCell)
  1488. {
  1489. int ixLocalCell = ixCell % CTerrain::ATTRMAP_XSIZE;
  1490. int iyLocalCell = iyCell % CTerrain::ATTRMAP_YSIZE;
  1491. int ixTerrain = ixCell / CTerrain::ATTRMAP_XSIZE;
  1492. int iyTerrain = iyCell / CTerrain::ATTRMAP_YSIZE;
  1493. int iTerrainNum = ixTerrain+iyTerrain*100;
  1494.  
  1495. BYTE byTerrainNum;
  1496. if (!GetTerrainNumFromCoord(ixTerrain, iyTerrain, &byTerrainNum))
  1497. continue;
  1498. CTerrain * pTerrain;
  1499. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  1500. continue;
  1501.  
  1502. if (kMap_pbyMarkBuf.end() == kMap_pbyMarkBuf.find(iTerrainNum))
  1503. {
  1504. BYTE * pbyBuf = new BYTE [CTerrain::ATTRMAP_XSIZE*CTerrain::ATTRMAP_YSIZE];
  1505. ZeroMemory(pbyBuf, CTerrain::ATTRMAP_XSIZE*CTerrain::ATTRMAP_YSIZE);
  1506. kMap_pbyMarkBuf[iTerrainNum] = pbyBuf;
  1507. }
  1508.  
  1509. BYTE * pbyBuf = kMap_pbyMarkBuf[iTerrainNum];
  1510. pbyBuf[ixLocalCell+iyLocalCell*CTerrain::ATTRMAP_XSIZE] = 0xff;
  1511. }
  1512. }
  1513.  
  1514. std::map<int, BYTE*>::iterator itorTerrain = kMap_pbyMarkBuf.begin();
  1515. for (; itorTerrain != kMap_pbyMarkBuf.end(); ++itorTerrain)
  1516. {
  1517. int iTerrainNum = itorTerrain->first;
  1518. int ixTerrain = iTerrainNum%100;
  1519. int iyTerrain = iTerrainNum/100;
  1520. BYTE * pbyBuf = itorTerrain->second;
  1521.  
  1522. BYTE byTerrainNum;
  1523. if (!GetTerrainNumFromCoord(ixTerrain, iyTerrain, &byTerrainNum))
  1524. continue;
  1525. CTerrain * pTerrain;
  1526. if (!GetTerrainPointer(byTerrainNum, &pTerrain))
  1527. continue;
  1528.  
  1529. pTerrain->AllocateMarkedSplats(pbyBuf);
  1530. }
  1531.  
  1532. stl_wipe_second(kMap_pbyMarkBuf);
  1533. }
  1534.  
  1535. void CMapOutdoor::DisableMarkedArea()
  1536. {
  1537. for (int i = 0; i < AROUND_AREA_NUM; ++i)
  1538. {
  1539. if (!m_pTerrain[i])
  1540. continue;
  1541.  
  1542. m_pTerrain[i]->DeallocateMarkedSplats();
  1543. }
  1544. }
  1545.  
  1546. void CMapOutdoor::ConvertToMapCoords(float fx, float fy, int *iCellX, int *iCellY, BYTE * pucSubCellX, BYTE * pucSubCellY, WORD * pwTerrainNumX, WORD * pwTerrainNumY)
  1547. {
  1548. if ( fy < 0 )
  1549. fy = -fy;
  1550.  
  1551. int ix, iy;
  1552. PR_FLOAT_TO_INT(fx, ix);
  1553. PR_FLOAT_TO_INT(fy, iy);
  1554.  
  1555. *pwTerrainNumX = ix / (CTerrainImpl::TERRAIN_XSIZE);
  1556. *pwTerrainNumY = iy / (CTerrainImpl::TERRAIN_YSIZE);
  1557.  
  1558. float maxx = (float) CTerrainImpl::TERRAIN_XSIZE;
  1559. float maxy = (float) CTerrainImpl::TERRAIN_YSIZE;
  1560.  
  1561. while (fx < 0)
  1562. fx += maxx;
  1563.  
  1564. while (fy < 0)
  1565. fy += maxy;
  1566.  
  1567. while (fx >= maxx)
  1568. fx -= maxx;
  1569.  
  1570. while (fy >= maxy)
  1571. fy -= maxy;
  1572.  
  1573. float fooscale = 1.0f / (float)(CTerrainImpl::HALF_CELLSCALE);
  1574.  
  1575. float fCellX, fCellY;
  1576.  
  1577. fCellX = fx * fooscale;
  1578. fCellY = fy * fooscale;
  1579.  
  1580. PR_FLOAT_TO_INT(fCellX, *iCellX);
  1581. PR_FLOAT_TO_INT(fCellY, *iCellY);
  1582.  
  1583. float fRatioooscale = ((float)CTerrainImpl::HEIGHT_TILE_XRATIO) * fooscale;
  1584.  
  1585. float fSubcellX, fSubcellY;
  1586. fSubcellX = fx * fRatioooscale;
  1587. fSubcellY = fy * fRatioooscale;
  1588.  
  1589. PR_FLOAT_TO_INT(fSubcellX, *pucSubCellX);
  1590. PR_FLOAT_TO_INT(fSubcellY, *pucSubCellY);
  1591. *pucSubCellX = (*pucSubCellX) % CTerrainImpl::HEIGHT_TILE_XRATIO;
  1592. *pucSubCellY = (*pucSubCellY) % CTerrainImpl::HEIGHT_TILE_YRATIO;
  1593. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement