// HeightFieldScene.cpp: implementation of the CHeightFieldScene class. // ////////////////////////////////////////////////////////////////////// #include "HeightFieldScene.h" #include "SceneManager.h" #include #include "RenderOption.h" #include "SceneStateMgr.h" inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); } ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CHeightFieldScene::CHeightFieldScene() { //LogMessage("Constructor HeightFieldScene"); m_NowPositionX=-100000000; m_NowPositionY=-100000000; m_NowTessellatePosX=-100000000; m_NowTessellatePosY=-100000000; //LogMessage("Constructor HeightFieldScene Complete"); // 03.03.04 House and Effect and object Culling flag m_bHouseCulling = true; m_bObjectCulling = true; m_bEffectCulling = true; m_pSectorSorts = NULL; m_iSortsNum = 0; } CHeightFieldScene::~CHeightFieldScene() { delete [] m_SectorScene; if(m_pSectorSorts != NULL) { delete[] m_pSectorSorts; m_pSectorSorts = NULL; } } void CHeightFieldScene::CheckingNextTerrain() { vector3 *ViewPos; vector3 CharPos; if(CSceneManager::m_ViewerMode==0 || CSceneManager::m_ViewerMode==2) ViewPos=CSceneManager::GetCamera()->GetPosition(); else { if( CSceneManager::m_CharacterManager.m_CharacterList.num == 0 ) { ViewPos=CSceneManager::GetCamera()->GetPosition(); } else { CSceneManager::m_CharacterManager.m_CharacterList[0].m_pChrmodel->GetPosition(CharPos.x,CharPos.y,CharPos.z); //CSceneManager::m_CharacterList[0]->GetPosition(CharPos.x,CharPos.y,CharPos.z); ViewPos=&CharPos; } } int UpdatePositionX=(int)(ViewPos->x/SECTORSIZE); int UpdatePositionY=(int)(ViewPos->z/SECTORSIZE); if(ViewPos->x < 0.0f) UpdatePositionX--; if(ViewPos->z < 0.0f) UpdatePositionY--; if( m_NowPositionX == UpdatePositionX && m_NowPositionY == UpdatePositionY) return; int WillX=(int)(ViewPos->x/SECTORSIZE); int WillY=(int)(ViewPos->z/SECTORSIZE); int MoveX=m_NowPositionX-WillX; int MoveY=m_NowPositionY-WillY; /* int UpdateSector[LSIZEX*LSIZEY]; int NotUpdateSector[LSIZEX*LSIZEY]; */ int *UpdateSector=new int[m_LSizeX*m_LSizeY]; int *NotUpdateSector=new int[m_LSizeX*m_LSizeY]; int CountUpdate=0; memset(NotUpdateSector,-1,sizeof(int)*m_LSizeX*m_LSizeY); int sectorx,sectory; int fx,fy; int ix,iy; memset(m_QuadSector,0,sizeof(m_QuadSector)); ///* for(ix=0;ix= WillX-(int)(m_LSizeX/2) && sectorx <= WillX+(int)(m_LSizeX/2)) && (sectory >= WillY-(int)(m_LSizeY/2) && sectory <= WillY+(int)(m_LSizeY/2)) ) { fx=sectorx-WillX+(int)(m_LSizeX/2); fy=sectory-WillY+(int)(m_LSizeY/2); NotUpdateSector[fx+fy*m_LSizeX]=0; m_QuadSector[fx+fy*m_LSizeX]=&m_SectorScene[ix+iy*m_LSizeX]; } else UpdateSector[CountUpdate++]=ix+iy*m_LSizeX; } } if(CountUpdate != m_LSizeX*m_LSizeY) { UpdateSector[CountUpdate]=-1; } for(int cSector=0;cSector= sectorx-1 && UpdatePositionY <= sectory+1 && UpdatePositionY >= sectory-1)) { if(m_SectorScene[cSector].m_ShadowUsed!=-1) { m_SectorScene[cSector].m_UsedShadowTerrain[m_SectorScene[cSector].m_ShadowUsed]=-1; m_SectorScene[cSector].m_ShadowUsed=-1; } } } int InnerCount=0; int CheckEndUpdate=0; for(ix=0;ix= sectorx-1 && UpdatePositionY <= sectory+1 && UpdatePositionY >= sectory-1)) { if(m_SectorScene[cSector].m_ShadowUsed!=-1) { m_SectorScene[cSector].m_UsedShadowTerrain[m_SectorScene[cSector].m_ShadowUsed]=-1; m_SectorScene[cSector].m_ShadowUsed=-1; m_SectorScene[cSector].GenerateWideMap(); } } } */ for(cSector=0;cSector= sectorx-1 && UpdatePositionY <= sectory+1 && UpdatePositionY >= sectory-1) { if(SHADOWSIZE!=0) m_SectorScene[cSector].GenerateShadow(BaseGraphicsLayer::GetDevice()); else m_SectorScene[cSector].GenerateWideMap(); } else { if(m_SectorScene[cSector].m_ShadowUsed!=-1) { m_SectorScene[cSector].m_UsedShadowTerrain[m_SectorScene[cSector].m_ShadowUsed]=-1; m_SectorScene[cSector].m_ShadowUsed=-1; m_SectorScene[cSector].GenerateWideMap(); } } } m_NowPositionX=UpdatePositionX; m_NowPositionY=UpdatePositionY; delete [] UpdateSector; delete [] NotUpdateSector; } void CHeightFieldScene::Create(int LSizeX,int LSizeY,CMapStorage *pMapStorage) { //LogMessage("HeightFieldScene Create"); m_LSizeX=LSizeX; m_LSizeY=LSizeY; int ix,iy; m_SectorScene=new CSectorScene[m_LSizeX*m_LSizeY]; //m_QuadSector=new CSectorScene[m_LSizeX*m_LSizeY]; m_pSectorSorts = new SectorSortNode_t[m_LSizeX*m_LSizeY]; for(ix=0;ixm_NextTriNode=0; m_SectorScene->m_WaterScene.Create(); m_GrassSceneManager.Create(); //LogMessage("HeightFieldScene Create Complete"); //m_GrassScene. } void CHeightFieldScene::RenderBlackWater(LPDIRECT3DDEVICE8 pd3dDevice) { pd3dDevice->LightEnable(0,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); bool *IsCulling=new bool[m_LSizeX*m_LSizeY]; int ix,iy; CSceneManager::m_cRenderSector=0; vector3 vecMinBox,vecMaxBox; for(ix=0;ixm_vecFrustumTop,-CSceneManager::GetCamera()->m_vecFrustumNormal[0],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumBottom,-CSceneManager::GetCamera()->m_vecFrustumNormal[1],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumLeft,-CSceneManager::GetCamera()->m_vecFrustumNormal[2],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumRight,-CSceneManager::GetCamera()->m_vecFrustumNormal[3],vecMaxBox,vecMinBox) < 0.0f) { IsCulling[ix+iy*m_LSizeX]=true; CSceneManager::m_cRenderSector++; } else { IsCulling[ix+iy*m_LSizeX]=false; } } } vector3 *vecViewPos=CSceneManager::GetCamera()->GetPosition(); //pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); //pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_TerrainLight); pd3dDevice->LightEnable(0,FALSE); pd3dDevice->LightEnable(1,FALSE); pd3dDevice->LightEnable(2,FALSE); pd3dDevice->LightEnable(3,FALSE); pd3dDevice->LightEnable(4,FALSE); pd3dDevice->LightEnable(5,FALSE); pd3dDevice->LightEnable(6,FALSE); pd3dDevice->LightEnable(7,FALSE); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); color TerrainColor; TerrainColor.a=0xff; TerrainColor.r=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.r*255; TerrainColor.g=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.g*255; TerrainColor.b=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.b*255; //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,TerrainColor.c); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterTerrainColor.c); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 ); CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 2 ); CSceneStateMgr::_SetD3DTextureStageState( 3, D3DTSS_TEXCOORDINDEX, 3 ); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); /**/ /* */ for(ix=0;ixm_bWaterRelection ) m_SectorScene[ix+iy*m_LSizeX].m_WaterScene.DeterminWaterTexture(pd3dDevice,true); else m_SectorScene[ix+iy*m_LSizeX].m_WaterScene.DeterminWaterTexture(pd3dDevice,false); m_SectorScene[ix+iy*m_LSizeX].RenderBlackWater(pd3dDevice,false); } } } } } void CHeightFieldScene::RenderWater(LPDIRECT3DDEVICE8 pd3dDevice) { pd3dDevice->LightEnable(0,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); bool *IsCulling=new bool[m_LSizeX*m_LSizeY]; int ix,iy; CSceneManager::m_cRenderSector=0; vector3 vecMinBox,vecMaxBox; for(ix=0;ixm_vecFrustumTop,-CSceneManager::GetCamera()->m_vecFrustumNormal[0],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumBottom,-CSceneManager::GetCamera()->m_vecFrustumNormal[1],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumLeft,-CSceneManager::GetCamera()->m_vecFrustumNormal[2],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumRight,-CSceneManager::GetCamera()->m_vecFrustumNormal[3],vecMaxBox,vecMinBox) < 0.0f) { IsCulling[ix+iy*m_LSizeX]=true; CSceneManager::m_cRenderSector++; } else { IsCulling[ix+iy*m_LSizeX]=false; } } } vector3 *vecViewPos=CSceneManager::GetCamera()->GetPosition(); //pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); //pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_TerrainLight); pd3dDevice->LightEnable(0,FALSE); pd3dDevice->LightEnable(1,FALSE); pd3dDevice->LightEnable(2,FALSE); pd3dDevice->LightEnable(3,FALSE); pd3dDevice->LightEnable(4,FALSE); pd3dDevice->LightEnable(5,FALSE); pd3dDevice->LightEnable(6,FALSE); pd3dDevice->LightEnable(7,FALSE); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); color TerrainColor; TerrainColor.a=0xff; TerrainColor.r=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.r*255; TerrainColor.g=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.g*255; TerrainColor.b=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.b*255; //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,TerrainColor.c); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterTerrainColor.c); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 ); CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 2 ); CSceneStateMgr::_SetD3DTextureStageState( 3, D3DTSS_TEXCOORDINDEX, 3 ); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); /**/ /* */ if(CRenderOption::m_bWaterBump) { bool bUpdate = false; for(ix=0;ix 30) && (bUpdate == true)) { CWaterScene::m_pWaterTexGenerator->Update(); ftime = fFtime; }*/ } for(ix=0;ixm_bWaterRelection ) m_SectorScene[ix+iy*m_LSizeX].m_WaterScene.DeterminWaterTexture(pd3dDevice,true); else m_SectorScene[ix+iy*m_LSizeX].m_WaterScene.DeterminWaterTexture(pd3dDevice,false); m_SectorScene[ix+iy*m_LSizeX].RenderWater(pd3dDevice,false); } } } } } void CHeightFieldScene::RenderMinimap(LPDIRECT3DDEVICE8 pd3dDevice) { CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,FALSE); pd3dDevice->LightEnable(0,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); if(CSceneManager::m_pBspScene) { pd3dDevice->SetTransform(D3DTS_WORLD,CSceneManager::m_pBspScene->m_AccumulateTM); matrix matHousePos; pd3dDevice->GetTransform(D3DTS_WORLD,matHousePos); matrix *matViewPosition=CSceneManager::GetCamera()->GetMatPosition(); matrix matViewPos; vector3 vecViewPos=matViewPosition->GetLoc(); matViewPos.Translation(vecViewPos); matrix matInvTM,matPos; matInvTM.Inverse(matHousePos); matPos=matViewPos*matInvTM; CSceneManager::m_pBspScene->m_HouseObject->m_pBspObject->Render(pd3dDevice,matPos.GetLoc()); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); if(CSceneManager::m_pBspScene->m_HouseObject->m_pBspObject->m_bSkyRender==false) return; //CSceneManager::m_pBspScene->Render(pd3dDevice); } // WaterReflection Count List WaterHeightList; int cDrawTerr=0; //bool IsCulling[LSIZEX*LSIZEY]; bool *IsCulling=new bool[m_LSizeX*m_LSizeY]; int ix,iy; CSceneManager::m_cRenderSector=0; vector3 vecMinBox,vecMaxBox; for(ix=0;ixm_vecFrustumTop,-CSceneManager::GetCamera()->m_vecFrustumNormal[0],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumBottom,-CSceneManager::GetCamera()->m_vecFrustumNormal[1],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumLeft,-CSceneManager::GetCamera()->m_vecFrustumNormal[2],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumRight,-CSceneManager::GetCamera()->m_vecFrustumNormal[3],vecMaxBox,vecMinBox) < 0.0f) { if(m_SectorScene[ix+iy*m_LSizeX].m_MapWater && m_SectorScene[ix+iy*m_LSizeX].m_MapWater->m_bWaterRelection) WaterHeightList.AddUnique(m_SectorScene[ix+iy*m_LSizeX].m_MapWater->m_fWaterHeight); IsCulling[ix+iy*m_LSizeX]=true; CSceneManager::m_cRenderSector++; } else { IsCulling[ix+iy*m_LSizeX]=true; CSceneManager::m_cRenderSector++; } } } int nDetailSector=0; int DetailSectorRender[9]={0,}; vector3 *vecViewPos=CSceneManager::GetCamera()->GetPosition(); //pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); //pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_TerrainLight); pd3dDevice->LightEnable(0,FALSE); pd3dDevice->LightEnable(1,FALSE); pd3dDevice->LightEnable(2,FALSE); pd3dDevice->LightEnable(3,FALSE); pd3dDevice->LightEnable(4,FALSE); pd3dDevice->LightEnable(5,FALSE); pd3dDevice->LightEnable(6,FALSE); pd3dDevice->LightEnable(7,FALSE); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); color TerrainColor; TerrainColor.a=0xff; TerrainColor.r=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.r*255; TerrainColor.g=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.g*255; TerrainColor.b=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.b*255; //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,TerrainColor.c); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterTerrainColor.c); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); //pd3dDevice->SetTexture(1,NULL); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); for(ix=0;ixSetTransform(D3DTS_WORLD,(D3DMATRIX*)(&m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM)); vecMinBox.x=m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._41; vecMaxBox.x=vecMinBox.x+SECTORSIZE; vecMinBox.z=m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43; vecMaxBox.z=vecMinBox.z+SECTORSIZE; if( vecMinBox.x <= vecViewPos->x && vecMaxBox.x >= vecViewPos->x && vecMinBox.z <= vecViewPos->z && vecMaxBox.z >= vecViewPos->z ) { m_SectorScene[ix+iy*m_LSizeX].RenderDetail(pd3dDevice); continue; } if( (fabsf(vecMinBox.z-vecViewPos->z) <= SECTORSIZE/3.0f || fabsf(vecMaxBox.z-vecViewPos->z) <= SECTORSIZE/3.0f ) && vecMinBox.x <= vecViewPos->x && vecMaxBox.x >= vecViewPos->x ) { m_SectorScene[ix+iy*m_LSizeX].RenderDetail(pd3dDevice); continue; } if( (fabsf(vecMinBox.x-vecViewPos->x) <= SECTORSIZE/3.0f || fabsf(vecMaxBox.x-vecViewPos->x) <= SECTORSIZE/3.0f ) && vecMinBox.z <= vecViewPos->z && vecMaxBox.z >= vecViewPos->z ) { m_SectorScene[ix+iy*m_LSizeX].RenderDetail(pd3dDevice); continue; } if( (fabsf(vecMinBox.x-vecViewPos->x) <= SECTORSIZE/3.0f || fabsf(vecMaxBox.x-vecViewPos->x) <= SECTORSIZE/3.0f ) && (fabsf(vecMinBox.z-vecViewPos->z) <= SECTORSIZE/3.0f || fabsf(vecMaxBox.z-vecViewPos->z) <= SECTORSIZE/3.0f ) ) { m_SectorScene[ix+iy*m_LSizeX].RenderDetail(pd3dDevice); continue; } m_SectorScene[ix+iy*m_LSizeX].Render(pd3dDevice); } } } //*/ CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); // ¹°¿¡ Àá±ä world effect ¸¦ À§ÇÑ render RenderMapEffect(); // Sector Light Render for(ix=0;ixSetTransform(D3DTS_TEXTURE1,(D3DMATRIX*)&matIndent); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); for(ix=0;ixSetMaterial( &mtrl ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); if(BaseGraphicsLayer::m_VoodooOption) CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); else CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF, 0xee ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); pd3dDevice->SetTexture(1,NULL); pd3dDevice->LightEnable(0,TRUE); pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); for(int cLight=1;cLight<8;cLight++) { pd3dDevice->LightEnable(cLight,FALSE); } pd3dDevice->LightEnable(0,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); for(ix=0;ix 30) && (bUpdate == true)) { CWaterScene::m_pWaterTexGenerator->Update(); ftime = fFtime; }*/ } for(ix=0;ixm_bWaterRelection ) m_SectorScene[ix+iy*m_LSizeX].m_WaterScene.DeterminWaterTexture(pd3dDevice,true); else m_SectorScene[ix+iy*m_LSizeX].m_WaterScene.DeterminWaterTexture(pd3dDevice,false); m_SectorScene[ix+iy*m_LSizeX].RenderWater(pd3dDevice,false); } } } } /* CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); //CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE); //CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); //CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); for(ix=0;ixGetMatPosition(); pd3dDevice->GetTransform(D3DTS_VIEW,&matView); int Uindexx=(int)((pmatView->_41)/SECTORSIZE); int Uindexy=(int)((pmatView->_43)/SECTORSIZE); int Sindexx,Sindexy; int iCurrentSector = 0; m_iSortsNum = 0; D3DXVECTOR4 vecViewSectorPos; for(ix=0;ix_42,m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43); D3DXVECTOR3 vecSectorTmPos = D3DXVECTOR3(m_SectorScene[ix+iy*m_LSizeX].m_TM._41,pmatView->_42,m_SectorScene[ix+iy*m_LSizeX].m_TM._43); D3DXVec3Transform(&vecViewSectorPos,&vecSectorTmPos,&matView); m_pSectorSorts[m_iSortsNum].fViewDist = vecViewSectorPos.z; m_pSectorSorts[m_iSortsNum++].iSectorIndex = (ix+iy*m_LSizeX); } } } qsort((void *)m_pSectorSorts,(size_t)m_iSortsNum, sizeof(SectorSortNode_t),Sector_tCompare); for(int iSortSector = 0;iSortSector < m_iSortsNum;iSortSector++ ) { CSectorScene *pSort = &(m_SectorScene[m_pSectorSorts[iSortSector].iSectorIndex]); Sindexx=(int)(pSort->m_TM._41/SECTORSIZE); Sindexy=(int)(pSort->m_TM._43/SECTORSIZE); if(!((Uindexx == Sindexx) && (Uindexy == Sindexy))) { pd3dDevice->LightEnable(0,FALSE); pSort->RenderPlant(pd3dDevice); } else { iCurrentSector = m_pSectorSorts[iSortSector].iSectorIndex; } } // ÇöÀç current Sector ¸¶Áö¸·¿¡ Renderring pd3dDevice->LightEnable(0,FALSE); m_SectorScene[iCurrentSector].RenderPlant(pd3dDevice); /* for(ix=0;ixLightEnable(0,FALSE); m_SectorScene[ix+iy*m_LSizeX].RenderPlant(pd3dDevice); } } } */ CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); pd3dDevice->LightEnable(0,FALSE); pd3dDevice->LightEnable(1,FALSE); pd3dDevice->LightEnable(2,FALSE); pd3dDevice->LightEnable(3,FALSE); pd3dDevice->LightEnable(4,FALSE); pd3dDevice->LightEnable(5,FALSE); pd3dDevice->LightEnable(6,FALSE); pd3dDevice->LightEnable(7,FALSE); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c); // 08.27 ¸·À½ /*CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterFurGrassColor.c); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); for(ix=0;ixLightEnable(0,FALSE); //CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); m_SectorScene[ix+iy*m_LSizeX].RenderGrass(pd3dDevice); } } } */ CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT); //CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2); /* CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE); */ CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); //CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); pd3dDevice->LightEnable(0,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); /*** for(ix=0;ixLightEnable(0,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_TEXCOORDINDEX,0); CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_TEXCOORDINDEX,1); //CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU); //CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); //CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); for(ix=0;ixSetTransform(D3DTS_WORLD,(D3DMATRIX*)(&m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM)); vecMinBox.x=m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._41; vecMaxBox.x=vecMinBox.x+SECTORSIZE; vecMinBox.z=m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43; vecMaxBox.z=vecMinBox.z+SECTORSIZE; if( vecMinBox.x <= vecViewPos->x && vecMaxBox.x >= vecViewPos->x && vecMinBox.z <= vecViewPos->z && vecMaxBox.z >= vecViewPos->z ) { m_SectorScene[ix+iy*m_LSizeX].RenderLandscapeEffect(pd3dDevice); //m_SectorScene[ix+iy*m_LSizeX].UpdateLandscapeEffect(); continue; } if( (fabsf(vecMinBox.z-vecViewPos->z) <= SECTORSIZE/2.0f || fabsf(vecMaxBox.z-vecViewPos->z) <= SECTORSIZE/2.0f ) && vecMinBox.x <= vecViewPos->x && vecMaxBox.x >= vecViewPos->x ) { m_SectorScene[ix+iy*m_LSizeX].RenderLandscapeEffect(pd3dDevice); //m_SectorScene[ix+iy*m_LSizeX].UpdateLandscapeEffect(); continue; } if( (fabsf(vecMinBox.x-vecViewPos->x) <= SECTORSIZE/2.0f || fabsf(vecMaxBox.x-vecViewPos->x) <= SECTORSIZE/2.0f ) && vecMinBox.z <= vecViewPos->z && vecMaxBox.z >= vecViewPos->z ) { m_SectorScene[ix+iy*m_LSizeX].RenderLandscapeEffect(pd3dDevice); //m_SectorScene[ix+iy*m_LSizeX].UpdateLandscapeEffect(); continue; } if( (fabsf(vecMinBox.x-vecViewPos->x) <= SECTORSIZE/2.0f || fabsf(vecMaxBox.x-vecViewPos->x) <= SECTORSIZE/2.0f ) && (fabsf(vecMinBox.z-vecViewPos->z) <= SECTORSIZE/2.0f || fabsf(vecMaxBox.z-vecViewPos->z) <= SECTORSIZE/2.0f ) ) { m_SectorScene[ix+iy*m_LSizeX].RenderLandscapeEffect(pd3dDevice); //m_SectorScene[ix+iy*m_LSizeX].UpdateLandscapeEffect(); continue; } } } } delete [] IsCulling; CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,TRUE); } void CHeightFieldScene::RenderEnv(LPDIRECT3DDEVICE8 pd3dDevice) { pd3dDevice->LightEnable(0,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); if(CSceneManager::m_pBspScene) { pd3dDevice->SetTransform(D3DTS_WORLD,CSceneManager::m_pBspScene->m_AccumulateTM); matrix matHousePos; pd3dDevice->GetTransform(D3DTS_WORLD,matHousePos); matrix *matViewPosition=CSceneManager::GetCamera()->GetMatPosition(); matrix matViewPos; vector3 vecViewPos=matViewPosition->GetLoc(); matViewPos.Translation(vecViewPos); matrix matInvTM,matPos; matInvTM.Inverse(matHousePos); matPos=matViewPos*matInvTM; CSceneManager::m_pBspScene->m_HouseObject->m_pBspObject->Render(pd3dDevice,matPos.GetLoc()); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); if(CSceneManager::m_pBspScene->m_HouseObject->m_pBspObject->m_bSkyRender==false) return; //CSceneManager::m_pBspScene->Render(pd3dDevice); } // WaterReflection Count List WaterHeightList; int cDrawTerr=0; //bool IsCulling[LSIZEX*LSIZEY]; bool *IsCulling=new bool[m_LSizeX*m_LSizeY]; int ix,iy; CSceneManager::m_cRenderSector=0; vector3 vecMinBox,vecMaxBox; for(ix=0;ixm_vecFrustumTop,-CSceneManager::GetCamera()->m_vecFrustumNormal[0],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumBottom,-CSceneManager::GetCamera()->m_vecFrustumNormal[1],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumLeft,-CSceneManager::GetCamera()->m_vecFrustumNormal[2],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumRight,-CSceneManager::GetCamera()->m_vecFrustumNormal[3],vecMaxBox,vecMinBox) < 0.0f) { if(m_SectorScene[ix+iy*m_LSizeX].m_MapWater && m_SectorScene[ix+iy*m_LSizeX].m_MapWater->m_bWaterRelection) WaterHeightList.AddUnique(m_SectorScene[ix+iy*m_LSizeX].m_MapWater->m_fWaterHeight); IsCulling[ix+iy*m_LSizeX]=true; CSceneManager::m_cRenderSector++; } else { IsCulling[ix+iy*m_LSizeX]=false; } } } int nDetailSector=0; int DetailSectorRender[9]={0,}; vector3 *vecViewPos=CSceneManager::GetCamera()->GetPosition(); //pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); //pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_TerrainLight); pd3dDevice->LightEnable(0,FALSE); pd3dDevice->LightEnable(1,FALSE); pd3dDevice->LightEnable(2,FALSE); pd3dDevice->LightEnable(3,FALSE); pd3dDevice->LightEnable(4,FALSE); pd3dDevice->LightEnable(5,FALSE); pd3dDevice->LightEnable(6,FALSE); pd3dDevice->LightEnable(7,FALSE); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); color TerrainColor; TerrainColor.a=0xff; TerrainColor.r=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.r*255; TerrainColor.g=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.g*255; TerrainColor.b=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.b*255; //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,TerrainColor.c); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterTerrainColor.c); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); //pd3dDevice->SetTexture(1,NULL); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); for(ix=0;ixSetTransform(D3DTS_WORLD,(D3DMATRIX*)(&m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM)); m_SectorScene[ix+iy*m_LSizeX].Render(pd3dDevice); } } } //*/ CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); ///* CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF, 0xee ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); //*/ CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); matrix matIndent; matIndent.MakeIdent(); pd3dDevice->SetTransform(D3DTS_TEXTURE1,(D3DMATRIX*)&matIndent); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); for(ix=0;ixSetMaterial( &mtrl ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); if(BaseGraphicsLayer::m_VoodooOption) CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); else CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF, 0xee ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); pd3dDevice->SetTexture(1,NULL); pd3dDevice->LightEnable(0,TRUE); pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); for(int cLight=1;cLight<8;cLight++) { pd3dDevice->LightEnable(cLight,FALSE); } pd3dDevice->LightEnable(0,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); CSceneManager::m_CharacterManager.RenderEnv(pd3dDevice); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 ); CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 2 ); CSceneStateMgr::_SetD3DTextureStageState( 3, D3DTSS_TEXCOORDINDEX, 3 ); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); CRenderOption::m_WaterBumpEnvRendering = false; for(ix=0;ixm_bWaterRelection ) m_SectorScene[ix+iy*m_LSizeX].m_WaterScene.DeterminWaterTexture(pd3dDevice,true); else m_SectorScene[ix+iy*m_LSizeX].m_WaterScene.DeterminWaterTexture(pd3dDevice,false); m_SectorScene[ix+iy*m_LSizeX].RenderWater(pd3dDevice,false); } } } } CRenderOption::m_WaterBumpEnvRendering = true; CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT); //CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); if(BaseGraphicsLayer::m_VoodooOption) CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); else CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); //CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE); //CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); for(ix=0;ixLightEnable(0,FALSE); m_SectorScene[ix+iy*m_LSizeX].RenderEnvPlant(pd3dDevice); } } } CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); pd3dDevice->LightEnable(0,FALSE); pd3dDevice->LightEnable(1,FALSE); pd3dDevice->LightEnable(2,FALSE); pd3dDevice->LightEnable(3,FALSE); pd3dDevice->LightEnable(4,FALSE); pd3dDevice->LightEnable(5,FALSE); pd3dDevice->LightEnable(6,FALSE); pd3dDevice->LightEnable(7,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT); //CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2); /* CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE); */ CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); //CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); pd3dDevice->LightEnable(0,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); pd3dDevice->LightEnable(0,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_TEXCOORDINDEX,0); CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_TEXCOORDINDEX,1); //CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU); //CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); //CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); delete [] IsCulling; } void CHeightFieldScene::Render(LPDIRECT3DDEVICE8 pd3dDevice,bool bEnv) { pd3dDevice->LightEnable(0,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); if(CSceneManager::GetInView()) { CHouseObjectScene *pHouse = NULL; if((pHouse = CSceneManager::GetInViewHouseScene())) { CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); ///* CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF, 0xee ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); //*/ CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); matrix matIndent; matIndent.MakeIdent(); pd3dDevice->SetTransform(D3DTS_TEXTURE1,(D3DMATRIX*)&matIndent); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)(&pHouse->m_AccumulateTM)); pHouse->Render(pd3dDevice); } CSceneManager::m_CharacterManager.Render(pd3dDevice); return; } if(CSceneManager::m_pBspScene) { pd3dDevice->SetTransform(D3DTS_WORLD,CSceneManager::m_pBspScene->m_AccumulateTM); matrix matHousePos; pd3dDevice->GetTransform(D3DTS_WORLD,matHousePos); matrix *matViewPosition=CSceneManager::GetCamera()->GetMatPosition(); matrix matViewPos; vector3 vecViewPos=matViewPosition->GetLoc(); matViewPos.Translation(vecViewPos); matrix matInvTM,matPos; matInvTM.Inverse(matHousePos); matPos=matViewPos*matInvTM; CSceneManager::m_pBspScene->m_HouseObject->m_pBspObject->Render(pd3dDevice,matPos.GetLoc()); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); if(CSceneManager::m_pBspScene->m_HouseObject->m_pBspObject->m_bSkyRender==false) return; //CSceneManager::m_pBspScene->Render(pd3dDevice); } // WaterReflection Count List WaterHeightList; int cDrawTerr=0; //bool IsCulling[LSIZEX*LSIZEY]; bool *IsCulling=new bool[m_LSizeX*m_LSizeY]; int ix,iy; CSceneManager::m_cRenderSector=0; vector3 vecMinBox,vecMaxBox; for(ix=0;ixm_vecFrustumTop,-CSceneManager::GetCamera()->m_vecFrustumNormal[0],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumBottom,-CSceneManager::GetCamera()->m_vecFrustumNormal[1],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumLeft,-CSceneManager::GetCamera()->m_vecFrustumNormal[2],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumRight,-CSceneManager::GetCamera()->m_vecFrustumNormal[3],vecMaxBox,vecMinBox) < 0.0f) { if(m_SectorScene[ix+iy*m_LSizeX].m_MapWater && m_SectorScene[ix+iy*m_LSizeX].m_MapWater->m_bWaterRelection) WaterHeightList.AddUnique(m_SectorScene[ix+iy*m_LSizeX].m_MapWater->m_fWaterHeight); IsCulling[ix+iy*m_LSizeX]=true; CSceneManager::m_cRenderSector++; } else { IsCulling[ix+iy*m_LSizeX]=false; } } } int nDetailSector=0; int DetailSectorRender[9]={0,}; vector3 *vecViewPos=CSceneManager::GetCamera()->GetPosition(); //pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); //pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_TerrainLight); pd3dDevice->LightEnable(0,FALSE); pd3dDevice->LightEnable(1,FALSE); pd3dDevice->LightEnable(2,FALSE); pd3dDevice->LightEnable(3,FALSE); pd3dDevice->LightEnable(4,FALSE); pd3dDevice->LightEnable(5,FALSE); pd3dDevice->LightEnable(6,FALSE); pd3dDevice->LightEnable(7,FALSE); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); color TerrainColor; TerrainColor.a=0xff; TerrainColor.r=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.r*255; TerrainColor.g=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.g*255; TerrainColor.b=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.b*255; //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,TerrainColor.c); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterTerrainColor.c); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); //pd3dDevice->SetTexture(1,NULL); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); for(ix=0;ixSetTransform(D3DTS_WORLD,(D3DMATRIX*)(&m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM)); vecMinBox.x=m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._41; vecMaxBox.x=vecMinBox.x+SECTORSIZE; vecMinBox.z=m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43; vecMaxBox.z=vecMinBox.z+SECTORSIZE; if( vecMinBox.x <= vecViewPos->x && vecMaxBox.x >= vecViewPos->x && vecMinBox.z <= vecViewPos->z && vecMaxBox.z >= vecViewPos->z ) { m_SectorScene[ix+iy*m_LSizeX].RenderDetail(pd3dDevice); continue; } if( (fabsf(vecMinBox.z-vecViewPos->z) <= SECTORSIZE/3.0f || fabsf(vecMaxBox.z-vecViewPos->z) <= SECTORSIZE/3.0f ) && vecMinBox.x <= vecViewPos->x && vecMaxBox.x >= vecViewPos->x ) { m_SectorScene[ix+iy*m_LSizeX].RenderDetail(pd3dDevice); continue; } if( (fabsf(vecMinBox.x-vecViewPos->x) <= SECTORSIZE/3.0f || fabsf(vecMaxBox.x-vecViewPos->x) <= SECTORSIZE/3.0f ) && vecMinBox.z <= vecViewPos->z && vecMaxBox.z >= vecViewPos->z ) { m_SectorScene[ix+iy*m_LSizeX].RenderDetail(pd3dDevice); continue; } if( (fabsf(vecMinBox.x-vecViewPos->x) <= SECTORSIZE/3.0f || fabsf(vecMaxBox.x-vecViewPos->x) <= SECTORSIZE/3.0f ) && (fabsf(vecMinBox.z-vecViewPos->z) <= SECTORSIZE/3.0f || fabsf(vecMaxBox.z-vecViewPos->z) <= SECTORSIZE/3.0f ) ) { m_SectorScene[ix+iy*m_LSizeX].RenderDetail(pd3dDevice); continue; } m_SectorScene[ix+iy*m_LSizeX].Render(pd3dDevice); } } } //*/ CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); // ¹°¿¡ Àá±ä world effect ¸¦ À§ÇÑ render RenderMapEffect(); // Sector Light Render for(ix=0;ixSetTransform(D3DTS_TEXTURE1,(D3DMATRIX*)&matIndent); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); for(ix=0;ixSetMaterial( &mtrl ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); if(BaseGraphicsLayer::m_VoodooOption) CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); else CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF, 0xee ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); pd3dDevice->SetTexture(1,NULL); pd3dDevice->LightEnable(0,TRUE); pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); for(int cLight=1;cLight<8;cLight++) { pd3dDevice->LightEnable(cLight,FALSE); } pd3dDevice->LightEnable(0,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); for(ix=0;ix 30) && (bUpdate == true)) { CWaterScene::m_pWaterTexGenerator->Update(); ftime = fFtime; }*/ CWaterScene::Update(); } for(ix=0;ixm_bWaterRelection ) m_SectorScene[ix+iy*m_LSizeX].m_WaterScene.DeterminWaterTexture(pd3dDevice,true); else m_SectorScene[ix+iy*m_LSizeX].m_WaterScene.DeterminWaterTexture(pd3dDevice,false); m_SectorScene[ix+iy*m_LSizeX].RenderWater(pd3dDevice,false); } } } } /* CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); //CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE); //CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); //CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); for(ix=0;ixGetMatPosition(); pd3dDevice->GetTransform(D3DTS_VIEW,&matView); int Uindexx=(int)((pmatView->_41)/SECTORSIZE); int Uindexy=(int)((pmatView->_43)/SECTORSIZE); int Sindexx,Sindexy; int iCurrentSector = 0; m_iSortsNum = 0; D3DXVECTOR4 vecViewSectorPos; for(ix=0;ix_42,m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43); D3DXVECTOR3 vecSectorTmPos = D3DXVECTOR3(m_SectorScene[ix+iy*m_LSizeX].m_TM._41,pmatView->_42,m_SectorScene[ix+iy*m_LSizeX].m_TM._43); D3DXVec3Transform(&vecViewSectorPos,&vecSectorTmPos,&matView); m_pSectorSorts[m_iSortsNum].fViewDist = vecViewSectorPos.z; m_pSectorSorts[m_iSortsNum++].iSectorIndex = (ix+iy*m_LSizeX); } } } qsort((void *)m_pSectorSorts,(size_t)m_iSortsNum, sizeof(SectorSortNode_t),Sector_tCompare); for(int iSortSector = 0;iSortSector < m_iSortsNum;iSortSector++ ) { CSectorScene *pSort = &(m_SectorScene[m_pSectorSorts[iSortSector].iSectorIndex]); Sindexx=(int)(pSort->m_TM._41/SECTORSIZE); Sindexy=(int)(pSort->m_TM._43/SECTORSIZE); if(!((Uindexx == Sindexx) && (Uindexy == Sindexy))) { pd3dDevice->LightEnable(0,FALSE); pSort->RenderPlant(pd3dDevice); } else { iCurrentSector = m_pSectorSorts[iSortSector].iSectorIndex; } } // ÇöÀç current Sector ¸¶Áö¸·¿¡ Renderring pd3dDevice->LightEnable(0,FALSE); m_SectorScene[iCurrentSector].RenderPlant(pd3dDevice); /* for(ix=0;ixLightEnable(0,FALSE); m_SectorScene[ix+iy*m_LSizeX].RenderPlant(pd3dDevice); } } } */ CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); pd3dDevice->LightEnable(0,FALSE); pd3dDevice->LightEnable(1,FALSE); pd3dDevice->LightEnable(2,FALSE); pd3dDevice->LightEnable(3,FALSE); pd3dDevice->LightEnable(4,FALSE); pd3dDevice->LightEnable(5,FALSE); pd3dDevice->LightEnable(6,FALSE); pd3dDevice->LightEnable(7,FALSE); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c); // 08.27 ¸·À½ /*CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterFurGrassColor.c); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); for(ix=0;ixLightEnable(0,FALSE); //CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); m_SectorScene[ix+iy*m_LSizeX].RenderGrass(pd3dDevice); } } } */ CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT); //CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2); /* CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE); */ CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); //CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); pd3dDevice->LightEnable(0,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); /*** for(ix=0;ixLightEnable(0,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_TEXCOORDINDEX,0); CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_TEXCOORDINDEX,1); //CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU); //CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); //CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); for(ix=0;ixSetTransform(D3DTS_WORLD,(D3DMATRIX*)(&m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM)); vecMinBox.x=m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._41; vecMaxBox.x=vecMinBox.x+SECTORSIZE; vecMinBox.z=m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43; vecMaxBox.z=vecMinBox.z+SECTORSIZE; if( vecMinBox.x <= vecViewPos->x && vecMaxBox.x >= vecViewPos->x && vecMinBox.z <= vecViewPos->z && vecMaxBox.z >= vecViewPos->z ) { m_SectorScene[ix+iy*m_LSizeX].RenderLandscapeEffect(pd3dDevice); //m_SectorScene[ix+iy*m_LSizeX].UpdateLandscapeEffect(); continue; } if( (fabsf(vecMinBox.z-vecViewPos->z) <= SECTORSIZE/2.0f || fabsf(vecMaxBox.z-vecViewPos->z) <= SECTORSIZE/2.0f ) && vecMinBox.x <= vecViewPos->x && vecMaxBox.x >= vecViewPos->x ) { m_SectorScene[ix+iy*m_LSizeX].RenderLandscapeEffect(pd3dDevice); //m_SectorScene[ix+iy*m_LSizeX].UpdateLandscapeEffect(); continue; } if( (fabsf(vecMinBox.x-vecViewPos->x) <= SECTORSIZE/2.0f || fabsf(vecMaxBox.x-vecViewPos->x) <= SECTORSIZE/2.0f ) && vecMinBox.z <= vecViewPos->z && vecMaxBox.z >= vecViewPos->z ) { m_SectorScene[ix+iy*m_LSizeX].RenderLandscapeEffect(pd3dDevice); //m_SectorScene[ix+iy*m_LSizeX].UpdateLandscapeEffect(); continue; } if( (fabsf(vecMinBox.x-vecViewPos->x) <= SECTORSIZE/2.0f || fabsf(vecMaxBox.x-vecViewPos->x) <= SECTORSIZE/2.0f ) && (fabsf(vecMinBox.z-vecViewPos->z) <= SECTORSIZE/2.0f || fabsf(vecMaxBox.z-vecViewPos->z) <= SECTORSIZE/2.0f ) ) { m_SectorScene[ix+iy*m_LSizeX].RenderLandscapeEffect(pd3dDevice); //m_SectorScene[ix+iy*m_LSizeX].UpdateLandscapeEffect(); continue; } } } } delete [] IsCulling; } void CHeightFieldScene::RenderMapEffect() { bool *IsCulling=new bool[m_LSizeX*m_LSizeY]; int ix,iy; CSceneManager::m_cRenderSector=0; vector3 vecMinBox,vecMaxBox; for(ix=0;ixm_vecFrustumTop,-CSceneManager::GetCamera()->m_vecFrustumNormal[0],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumBottom,-CSceneManager::GetCamera()->m_vecFrustumNormal[1],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumLeft,-CSceneManager::GetCamera()->m_vecFrustumNormal[2],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumRight,-CSceneManager::GetCamera()->m_vecFrustumNormal[3],vecMaxBox,vecMinBox) < 0.0f) { IsCulling[ix+iy*m_LSizeX]=true; CSceneManager::m_cRenderSector++; } else { IsCulling[ix+iy*m_LSizeX]=false; } } } //Effect for(ix=0;ixm_NextTriNode=0; CSectorScene *Patch; int ix,iy; for(ix=0;ixReset(); if(ix>0) Patch->m_BaseLeft.LeftNeighbor=&m_QuadSector[(ix-1)+iy*m_LSizeX]->m_BaseRight; else Patch->m_BaseLeft.LeftNeighbor=NULL; if(ixm_BaseRight.LeftNeighbor=&m_QuadSector[(ix+1)+iy*m_LSizeX]->m_BaseLeft; else Patch->m_BaseRight.LeftNeighbor=NULL; if(iy>0) Patch->m_BaseLeft.RightNeighbor=&m_QuadSector[ix+(iy-1)*m_LSizeX]->m_BaseRight; else Patch->m_BaseLeft.RightNeighbor=NULL; if(iym_BaseRight.RightNeighbor=&m_QuadSector[ix+(iy+1)*m_LSizeX]->m_BaseLeft; else Patch->m_BaseRight.RightNeighbor=NULL; } } for(int i=0;iGetPosition(); else { //CSceneManager::m_CharacterList[0]->GetPosition(CharPos.x,CharPos.y,CharPos.z); if( CSceneManager::m_CharacterManager.m_CharacterList.num == 0 ) { ViewPos=CSceneManager::GetCamera()->GetPosition(); } else { CSceneManager::m_CharacterManager.m_CharacterList[0].m_pChrmodel->GetPosition(CharPos.x,CharPos.y,CharPos.z); ViewPos=&CharPos; } } //vector3 *ViewPos=CSceneManager::GetCamera()->GetPosition(); if( m_NowTessellatePosX == (int)(ViewPos->x/(SECTORSIZE/FIELDDIVIDE)) && m_NowTessellatePosY == (int)(ViewPos->z/(SECTORSIZE/FIELDDIVIDE))) return false; Tessellate(); m_NowTessellatePosX=(int)(ViewPos->x/(SECTORSIZE/FIELDDIVIDE)); m_NowTessellatePosY=(int)(ViewPos->z/(SECTORSIZE/FIELDDIVIDE)); m_GrassSceneManager.UpdateRange(); return true; } /* matrix *matViewPosition=(matrix*)CSceneManager::GetCamera()->GetMatPosition(); matrix *matView=(matrix*)CSceneManager::GetCamera()->GetMatView(); matrix matFront; matFront.Translation(vector3(0.0f,0.0f,1.0f)); matFront=matFront*(*matViewPosition); vector3 vecRelectionDir; vector3 vecViewPos=matViewPosition->GetLoc(); vecRelectionDir=matFront.GetLoc()-vecViewPos; vecRelectionDir.y=-vecRelectionDir.y; //vecRelectionDir.y-=(2.0f*(vecRelectionDir.y-vecViewPos.y)); //vecViewPos.y=-vecViewPos.y; //vecViewPos.y+=3000.0f*2.0f; vector3 vecUp; vecUp.x=matView->_12; vecUp.y=-1.0f;//matView->_22; vecUp.z=matView->_32; vecUp.Normalize(); /* vecRelectionDir.x=matView->_13; vecRelectionDir.y=matView->_23; vecRelectionDir.z=matView->_33; /* vecRelectionDir.x=matView->_13; vecRelectionDir.y=1.0f; vecRelectionDir.z=matView->_33; // vecRelectionDir.x=0.0f; vecRelectionDir.y=1.0f; vecRelectionDir.z=0.0f; vecRelectionDir.Normalize(); //matRelectionView.CameraLookAt(vecViewPos,vecRelectionDir,vecUp); //matRelectionView.CameraLookAt(vecViewPos,vecRelectionDir,vecUp); //pd3dDevice->SetTransform(D3DTS_VIEW,(D3DMATRIX*)&matRelectionView); matFront.MakeIdent(); matFront._22=-1.0f; matrix temp; */ float CHeightFieldScene::GetHeight(vector3 vecPos) { int ix,iy; for(ix=0;ix vecPos.x && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43 <= vecPos.z && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43+SECTORSIZE > vecPos.z) { return m_SectorScene[ix+iy*m_LSizeX].GetHeight(vecPos); } } } return 0.0f; } void CHeightFieldScene::GetHeightFieldShadowPoly(vector3 vecPos,List &vecPolyList) { int ix,iy; for(ix=0;ix vecPos.x && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43 <= vecPos.z && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43+SECTORSIZE > vecPos.z) { //m_SectorScene[ix+iy*LSIZEX].GetShadowPoly(vecPos,vecPolyList); m_SectorScene[ix+iy*m_LSizeX].GetHeightFieldShadowPoly(vecPos,vecPolyList); break; } } } } void CHeightFieldScene::GetLight(vector3 vecPos,List &LightList) { int ix,iy; for(ix=0;ix vecPos.x && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43 <= vecPos.z && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43+SECTORSIZE > vecPos.z) { m_SectorScene[ix+iy*m_LSizeX].GetLight(vecPos,LightList); break; } } } } void CHeightFieldScene::GetInHouseShadowPoly(vector3 vecPos,List &vecPolyList,vector3 vecLightPos) { int ix,iy; for(ix=0;ix vecPos.x && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43 <= vecPos.z && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43+SECTORSIZE > vecPos.z) { m_SectorScene[ix+iy*m_LSizeX].GetInHouseShadowPoly(vecPos,vecPolyList,vecLightPos); break; } } } } void CHeightFieldScene::GetLineIntersectPoly(vector3 vecStart, vector3 vecEnd,List &vecPolyList) { int ix,iy; for(ix=0;ix vecStart.x && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43 <= vecStart.z && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43+SECTORSIZE > vecStart.z) { m_SectorScene[ix+iy*m_LSizeX].GetLineIntersectPoly(vecStart,vecEnd,vecPolyList); break; } } } } void CHeightFieldScene::AllObjectCalcLens() { int ix,iy; for(ix=0;ix &vecPolyList, float fRange) { int ix,iy; for(ix=0;ix vecPos.x && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43 <= vecPos.z && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43+SECTORSIZE > vecPos.z) { m_SectorScene[ix+iy*m_LSizeX].GetHeightFieldRangePoly(vecPos,vecPolyList,fRange); break; } } } } char* CHeightFieldScene::GetHeightFieldShadowCollision(vector3 vecPos) { int ix,iy; for(ix=0;ix vecPos.x && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43 <= vecPos.z && m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43+SECTORSIZE > vecPos.z) { if(m_SectorScene[ix+iy*m_LSizeX].m_ShadowUsed==-1) return NULL; return m_SectorScene[ix+iy*m_LSizeX].m_SectorShadowCollision[ m_SectorScene[ix+iy*m_LSizeX].m_ShadowUsed]; } } } return NULL; } void CHeightFieldScene::Update(float fUpdate) { m_GrassSceneManager.Update(fUpdate/30.0f); int ix,iy; for(ix=0;ix 19.0f || fTime < 6.0f) && ( CSceneManager::m_bCharacterLightOp)) { CSceneManager::m_bCharacterLight = true; } else CSceneManager::m_bCharacterLight = false; vector3 vecMinBox,vecMaxBox; for(ix=0;ixm_vecFrustumTop,-CSceneManager::GetCamera()->m_vecFrustumNormal[0],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumBottom,-CSceneManager::GetCamera()->m_vecFrustumNormal[1],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumLeft,-CSceneManager::GetCamera()->m_vecFrustumNormal[2],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumRight,-CSceneManager::GetCamera()->m_vecFrustumNormal[3],vecMaxBox,vecMinBox) < 0.0f) { if(fTime > 19.0f || fTime < 5.0f) m_SectorScene[ix+iy*m_LSizeX].SettingNight(true); else m_SectorScene[ix+iy*m_LSizeX].SettingNight(false); } } } } void CHeightFieldScene::GenerateSectorSceneObjects( int sectorX, int sectorY ) { for( int cSector = 0; cSector < GetLSizeX()*GetLSizeY(); cSector++ ) { int sectorindexx = m_SectorScene[cSector].m_AccumulateTM._41/SECTORSIZE; int sectorindexy = m_SectorScene[cSector].m_AccumulateTM._43/SECTORSIZE; if( sectorX == sectorindexx && sectorY == sectorindexy ) m_SectorScene[cSector].GenerateObject(); } } void CHeightFieldScene::RenderShadow(LPDIRECT3DDEVICE8 pd3dDevice) { int ix,iy; vector3 vecMinBox,vecMaxBox; for(ix=0;ixm_vecFrustumTop,-CSceneManager::GetCamera()->m_vecFrustumNormal[0],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumBottom,-CSceneManager::GetCamera()->m_vecFrustumNormal[1],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumLeft,-CSceneManager::GetCamera()->m_vecFrustumNormal[2],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumRight,-CSceneManager::GetCamera()->m_vecFrustumNormal[3],vecMaxBox,vecMinBox) < 0.0f) { if(CRenderOption::m_ObjectProjectShadow) m_SectorScene[ix+iy*m_LSizeX].RenderObjectShadow(pd3dDevice); pd3dDevice->SetTransform(D3DTS_WORLD,m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM); if(CRenderOption::m_TreeProjectShadow) m_SectorScene[ix+iy*m_LSizeX].m_TreeObjectNode.RenderShadow(pd3dDevice,CSectorScene::m_pShadowTexture); } } } //m_GrassSceneManager.RenderShadow(pd3dDevice,CSectorScene::m_pShadowTexture); } int CHeightFieldScene::AddShadowPoly(vector3 vecPos,int nMethod) { static int nID=0; CShadowedPoly AddNode; AddNode.m_vecShadowPos=vecPos; AddNode.m_nGatherMethod=nMethod; AddNode.m_nShadowID=nID; AddNode.m_bActive=true; m_ShadowedVertexList.Add(AddNode); nID++; return nID-1; } CHeightFieldScene::CShadowedPoly* CHeightFieldScene::GetShadowPolyList(int nID) { for(int i=0;im_vecFrustumTop,-CSceneManager::GetCamera()->m_vecFrustumNormal[0],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumBottom,-CSceneManager::GetCamera()->m_vecFrustumNormal[1],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumLeft,-CSceneManager::GetCamera()->m_vecFrustumNormal[2],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumRight,-CSceneManager::GetCamera()->m_vecFrustumNormal[3],vecMaxBox,vecMinBox) < 0.0f) { IsCulling[ix+iy*m_LSizeX]=true; } else { IsCulling[ix+iy*m_LSizeX]=false; } } } for(ix=0;ixfViewDist < ((SectorSortNode_t *)arg2)->fViewDist) return 1; else if(((SectorSortNode_t *)arg1)->fViewDist > ((SectorSortNode_t *)arg2)->fViewDist) return -1; return 0; } void CHeightFieldScene::Destroy(void) { for(int ix=0; ix < GetLSizeX(); ix++) { for(int iy = 0; iy < GetLSizeX(); iy++) { m_SectorScene[ix + iy * GetLSizeX()].UnloadAllData(); } } } void CHeightFieldScene::RenderBlackField( LPDIRECT3DDEVICE8 pDevice ) { pDevice->LightEnable(0,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); if(CSceneManager::m_pBspScene) { pDevice->SetTransform(D3DTS_WORLD,CSceneManager::m_pBspScene->m_AccumulateTM); matrix matHousePos; pDevice->GetTransform(D3DTS_WORLD,matHousePos); matrix *matViewPosition=CSceneManager::GetCamera()->GetMatPosition(); matrix matViewPos; vector3 vecViewPos=matViewPosition->GetLoc(); matViewPos.Translation(vecViewPos); matrix matInvTM,matPos; matInvTM.Inverse(matHousePos); matPos=matViewPos*matInvTM; CSceneManager::m_pBspScene->m_HouseObject->m_pBspObject->Render(pDevice,matPos.GetLoc()); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); if(CSceneManager::m_pBspScene->m_HouseObject->m_pBspObject->m_bSkyRender==false) return; //CSceneManager::m_pBspScene->Render(pd3dDevice); } // WaterReflection Count List WaterHeightList; int cDrawTerr=0; //bool IsCulling[LSIZEX*LSIZEY]; bool *IsCulling=new bool[m_LSizeX*m_LSizeY]; int ix,iy; CSceneManager::m_cRenderSector=0; vector3 vecMinBox,vecMaxBox; for(ix=0;ixm_vecFrustumTop,-CSceneManager::GetCamera()->m_vecFrustumNormal[0],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumBottom,-CSceneManager::GetCamera()->m_vecFrustumNormal[1],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumLeft,-CSceneManager::GetCamera()->m_vecFrustumNormal[2],vecMaxBox,vecMinBox) < 0.0f && CIntersection::PlaneAABBBox(CSceneManager::GetCamera()->m_vecFrustumRight,-CSceneManager::GetCamera()->m_vecFrustumNormal[3],vecMaxBox,vecMinBox) < 0.0f) { if(m_SectorScene[ix+iy*m_LSizeX].m_MapWater && m_SectorScene[ix+iy*m_LSizeX].m_MapWater->m_bWaterRelection) WaterHeightList.AddUnique(m_SectorScene[ix+iy*m_LSizeX].m_MapWater->m_fWaterHeight); IsCulling[ix+iy*m_LSizeX]=true; CSceneManager::m_cRenderSector++; } else { IsCulling[ix+iy*m_LSizeX]=false; } } } int nDetailSector=0; int DetailSectorRender[9]={0,}; vector3 *vecViewPos=CSceneManager::GetCamera()->GetPosition(); //pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); //pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); pDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_TerrainLight); pDevice->LightEnable(0,FALSE); pDevice->LightEnable(1,FALSE); pDevice->LightEnable(2,FALSE); pDevice->LightEnable(3,FALSE); pDevice->LightEnable(4,FALSE); pDevice->LightEnable(5,FALSE); pDevice->LightEnable(6,FALSE); pDevice->LightEnable(7,FALSE); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); color TerrainColor; TerrainColor.a=0xff; TerrainColor.r=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.r*255; TerrainColor.g=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.g*255; TerrainColor.b=CSceneManager::m_WeatherManager.m_SunLight.Diffuse.b*255; //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,TerrainColor.c); //CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterTerrainColor.c); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); //pd3dDevice->SetTexture(1,NULL); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,FALSE); for(ix=0;ixSetTransform(D3DTS_WORLD,(D3DMATRIX*)(&m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM)); vecMinBox.x=m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._41; vecMaxBox.x=vecMinBox.x+SECTORSIZE; vecMinBox.z=m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43; vecMaxBox.z=vecMinBox.z+SECTORSIZE; if( vecMinBox.x <= vecViewPos->x && vecMaxBox.x >= vecViewPos->x && vecMinBox.z <= vecViewPos->z && vecMaxBox.z >= vecViewPos->z ) { m_SectorScene[ix+iy*m_LSizeX].RenderBlackDetail(pDevice); continue; } if( (fabsf(vecMinBox.z-vecViewPos->z) <= SECTORSIZE/3.0f || fabsf(vecMaxBox.z-vecViewPos->z) <= SECTORSIZE/3.0f ) && vecMinBox.x <= vecViewPos->x && vecMaxBox.x >= vecViewPos->x ) { m_SectorScene[ix+iy*m_LSizeX].RenderBlackDetail(pDevice); continue; } if( (fabsf(vecMinBox.x-vecViewPos->x) <= SECTORSIZE/3.0f || fabsf(vecMaxBox.x-vecViewPos->x) <= SECTORSIZE/3.0f ) && vecMinBox.z <= vecViewPos->z && vecMaxBox.z >= vecViewPos->z ) { m_SectorScene[ix+iy*m_LSizeX].RenderBlackDetail(pDevice); continue; } if( (fabsf(vecMinBox.x-vecViewPos->x) <= SECTORSIZE/3.0f || fabsf(vecMaxBox.x-vecViewPos->x) <= SECTORSIZE/3.0f ) && (fabsf(vecMinBox.z-vecViewPos->z) <= SECTORSIZE/3.0f || fabsf(vecMaxBox.z-vecViewPos->z) <= SECTORSIZE/3.0f ) ) { m_SectorScene[ix+iy*m_LSizeX].RenderBlackDetail(pDevice); continue; } //m_SectorScene[ix+iy*m_LSizeX].Render(pd3dDevice); m_SectorScene[ix+iy*m_LSizeX].RenderBlackTerrain(pDevice); } } } for(ix=0;ixSetTexture(1,NULL); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 ); CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 2 ); CSceneStateMgr::_SetD3DTextureStageState( 3, D3DTSS_TEXCOORDINDEX, 3 ); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); //Sector Sorting CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT); if(BaseGraphicsLayer::m_VoodooOption) CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); else CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE); D3DXMATRIX matView; matrix *pmatView = CSceneManager::m_ViewCamera->GetMatPosition(); pDevice->GetTransform(D3DTS_VIEW,&matView); int Uindexx=(int)((pmatView->_41)/SECTORSIZE); int Uindexy=(int)((pmatView->_43)/SECTORSIZE); int Sindexx,Sindexy; int iCurrentSector = 0; m_iSortsNum = 0; D3DXVECTOR4 vecViewSectorPos; for(ix=0;ix_42,m_SectorScene[ix+iy*m_LSizeX].m_AccumulateTM._43/*m_TM._43*/); D3DXVECTOR3 vecSectorTmPos = D3DXVECTOR3(m_SectorScene[ix+iy*m_LSizeX].m_TM._41,pmatView->_42,m_SectorScene[ix+iy*m_LSizeX].m_TM._43); D3DXVec3Transform(&vecViewSectorPos,&vecSectorTmPos,&matView); m_pSectorSorts[m_iSortsNum].fViewDist = vecViewSectorPos.z; m_pSectorSorts[m_iSortsNum++].iSectorIndex = (ix+iy*m_LSizeX); } } } qsort((void *)m_pSectorSorts,(size_t)m_iSortsNum, sizeof(SectorSortNode_t),Sector_tCompare); for(int iSortSector = 0;iSortSector < m_iSortsNum;iSortSector++ ) { CSectorScene *pSort = &(m_SectorScene[m_pSectorSorts[iSortSector].iSectorIndex]); Sindexx=(int)(pSort->m_TM._41/SECTORSIZE); Sindexy=(int)(pSort->m_TM._43/SECTORSIZE); if(!((Uindexx == Sindexx) && (Uindexy == Sindexy))) { pDevice->LightEnable(0,FALSE); pSort->RenderBlackPlant(pDevice); } else { iCurrentSector = m_pSectorSorts[iSortSector].iSectorIndex; } } // ÇöÀç current Sector ¸¶Áö¸·¿¡ Renderring pDevice->LightEnable(0,FALSE); m_SectorScene[iCurrentSector].RenderBlackPlant(pDevice); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE, FALSE ); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); pDevice->LightEnable(0,FALSE); pDevice->LightEnable(1,FALSE); pDevice->LightEnable(2,FALSE); pDevice->LightEnable(3,FALSE); pDevice->LightEnable(4,FALSE); pDevice->LightEnable(5,FALSE); pDevice->LightEnable(6,FALSE); pDevice->LightEnable(7,FALSE); } bool CHeightFieldScene::CheckRayCollision(const D3DXVECTOR3 &vecPos1,const D3DXVECTOR3 &vecPos2) { int iMinX,iMaxX,iMinY,iMaxY; int iSectorX1,iSectorY1,iSectorX2,iSectorY2; iSectorX1 = (int)(vecPos1.x / SECTORSIZE); iSectorY1 = (int)(vecPos1.z / SECTORSIZE); iSectorX2 = (int)(vecPos2.x / SECTORSIZE); iSectorY2 = (int)(vecPos2.z / SECTORSIZE); if(iSectorX1 > iSectorX2) { iMinX = iSectorX2; iMaxX = iSectorX1; } else { iMinX = iSectorX1; iMaxX = iSectorX2; } if(iSectorY1 > iSectorY2) { iMinY = iSectorY2; iMaxY = iSectorY1; } else { iMinY = iSectorY1; iMaxY = iSectorY2; } int iIndex = -1; for(int i = iMinX; i <= iMaxX; i++ ) { for(int j = iMinY; j <= iMaxY; j++ ) { if((iIndex = GetSectorIndex(i,j)) != -1) { if(m_SectorScene[iIndex].CheckRayCollisionHouse(vecPos1,vecPos2)) return true; } } } return false; } int CHeightFieldScene::GetSectorIndex(const int iSX,const int iSY) { int iX,iY; for(int ix=0;ix