// TreeScene.cpp: implementation of the CTreeScene class. // ////////////////////////////////////////////////////////////////////// #include "TreeScene.h" #include "SceneManager.h" #include "RenderOption.h" #include "SceneStateMgr.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// #define TREESIZEX 1500.0f #define TREESIZEY 2700.0f CMeshObject *CTreeScene::m_NormalTreeMesh[MAX_TREEKIND]; CMeshObject *CTreeScene::m_NormalTreeMeshLOD[MAX_TREEKIND]; CMeshObject *CTreeScene::m_NormalTreeLeaves[MAX_TREEKIND]; CMeshObject *CTreeScene::m_NormalTreeTrunk[MAX_TREEKIND]; CTreeScene::CTreeScene() { m_pHeight=NULL; m_ViewPlants = NULL; m_iViewPlantsNum = 0; } CTreeScene::~CTreeScene() { if(m_ViewPlants) { delete[] m_ViewPlants; m_ViewPlants = NULL; } //m_pPlantVertex->Release(); //m_pPlantIndices->Release(); } void CTreeScene::Create() { //LogMessage("Tree Create"); //LogMessage("Tree Object Create VertexBuffer& IndexBuffer Create"); /* CSceneManager::GetDevice()->CreateVertexBuffer( MAX_TREE*8*sizeof(SimpleVertex), D3DUSAGE_WRITEONLY,SimpleFVF,D3DPOOL_MANAGED, &m_pPlantVertex); CSceneManager::GetDevice()->CreateIndexBuffer( MAX_TREE*12*sizeof(WORD),D3DUSAGE_WRITEONLY, D3DFMT_INDEX16,D3DPOOL_MANAGED, &m_pPlantIndices); */ //LogMessage("Tree Object Create VertexBuffer& IndexBuffer Create Complete"); /* WORD *pPlantIndices; m_pPlantIndices->Lock(0,MAX_TREE*12*sizeof(WORD),(BYTE**)&pPlantIndices,0); for(int cPlant=0;cPlantUnlock(); */ m_fRot=0.0f; /* if(m_NormalTreeMesh[0]==NULL) { //LogMessage("Tree Object load normaltree"); CTexture::SetPath(OBJECTTEXTUREPATH); CSceneManager::m_MeshObjectContainer.SetPath(TREEOBJECTPATH); char strName[256]; for(int i=0;iConvertTree(); else m_NormalTreeMesh[i]->ConvertNormal(); if(i+1<10) sprintf(strName,"tree0%d_lod_fr.R3S",i+1); else sprintf(strName,"tree%d_lod_fr.R3S",i+1); m_NormalTreeMeshLOD[i]=CSceneManager::m_MeshObjectContainer.GetMeshObject(strName); if(CRenderOption::m_TreeAnimation) m_NormalTreeMeshLOD[i]->ConvertTree(); else m_NormalTreeMeshLOD[i]->ConvertNormal(); } } */ //LogMessage("Tree Create Complete"); } void CTreeScene::GeneratePlant(int SeedX,int SeedY,float *pHeightData,float fAvgHeight) { srand((SeedX+SeedY)/100); int cManySeed=rand()%MAX_SEED; int PutSeedX[MAX_SEED],PutSeedY[MAX_SEED]; int PutRange[MAX_SEED]; int PutSeedPoss[MAX_SEED]; int ix,iy; int iSeed,InterX,InterY; int cPlant=0; m_pHeight=pHeightData; m_cPlant=0; memset(m_usDetailTree,0xff,sizeof(unsigned char)*SECTORSX*SECTORSY); for(int i=0;i=MAX_TREE) continue; if(PutSeedPoss[iSeed] > (rand()%100)) continue; if(pHeightData[ix+iy*SECTORSX]>FIELDMIDDLE) continue; m_usDetailTree[ix+iy*SECTORSX]=rand()%MAX_TREEKIND; cPlant++; } break; } } } } */ m_cPlant=cPlant; if(m_ViewPlants != NULL) delete[] m_ViewPlants; m_ViewPlants = new TreeNode_t[cPlant]; } void CTreeScene::RenderEnv(LPDIRECT3DDEVICE8 pd3dDevice) { if(m_cPlant==0) return; matrix matParent; D3DXMATRIX matView; pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParent); pd3dDevice->GetTransform(D3DTS_VIEW,&matView); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); pd3dDevice->LightEnable(0,TRUE); pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); matrix matPlantPos; vector3 vecPlantPos; matrix matRot; unsigned char usTreeKind; if(CRenderOption::m_TreeAnimation) { CSceneStateMgr::_SetD3DRenderState(D3DRS_VERTEXBLEND,D3DVBF_1WEIGHTS); matRot.Rotation(vector3(1.0f,0.0f,1.0f),(sinf(m_fRot))*0.06f); } m_iViewPlantsNum = 0; D3DXVECTOR4 vecViewPos; ////////////////////// /* */ for(int ix=0;ixm_MinBox; m_vecMaxBox=m_NormalTreeMesh[usTreeKind]->m_MaxBox; if(!CSceneManager::m_bSceneNodeCulling) { m_usDetailTree[ix+iy*SECTORSX] = m_usDetailTree[ix+iy*SECTORSX]|0x80; } //Init(); if(m_usDetailTree[ix+iy*SECTORSX]&0x80) { if(isAABBCulling()) { D3DXVECTOR3 vecPos = D3DXVECTOR3(vecPlantPos.x,vecPlantPos.y,vecPlantPos.z); D3DXVec3Transform(&vecViewPos,&vecPos,&matView); m_ViewPlants[m_iViewPlantsNum].fViewDist = vecViewPos.z; m_ViewPlants[m_iViewPlantsNum].matRot = matRot; m_ViewPlants[m_iViewPlantsNum].matTm = m_AccumulateTM; m_ViewPlants[m_iViewPlantsNum].ucKind = usTreeKind; m_ViewPlants[m_iViewPlantsNum++].iIndex = (ix+iy*SECTORSX); } } else { if(m_usDetailTree[ix+iy*SECTORSX]&0x40) { if(isAABBCulling()) { D3DXVECTOR3 vecPos = D3DXVECTOR3(vecPlantPos.x,vecPlantPos.y,vecPlantPos.z); D3DXVec3Transform(&vecViewPos,&vecPos,&matView); m_ViewPlants[m_iViewPlantsNum].fViewDist = vecViewPos.z; m_ViewPlants[m_iViewPlantsNum].matRot = matRot; m_ViewPlants[m_iViewPlantsNum].matTm = m_AccumulateTM; m_ViewPlants[m_iViewPlantsNum].ucKind = usTreeKind; m_ViewPlants[m_iViewPlantsNum++].iIndex = (ix+iy*SECTORSX); } } } } } } qsort((void *)m_ViewPlants,(size_t)m_iViewPlantsNum, sizeof(TreeNode_t),Tree_tCompare); float fFar = CSceneManager::m_WeatherManager.m_InterFogFar + 200.0f; vector3 *vecViewPos2=CSceneManager::GetCamera()->GetPosition(); D3DXVECTOR3 vecDist; float fDist; if(fFar > 48000.0f) fFar = 48000.0f; for(int iSortCount = 0; iSortCount < m_iViewPlantsNum; iSortCount++) { int iPlantIndex = m_ViewPlants[iSortCount].iIndex; D3DXVECTOR3 vecTreeCenter = D3DXVECTOR3(m_AccumulateTM._41, m_AccumulateTM._42, m_AccumulateTM._43); vecDist.x = vecViewPos2->x - vecTreeCenter.x; vecDist.y = vecViewPos2->y - vecTreeCenter.y; vecDist.z = vecViewPos2->z - vecTreeCenter.z; fDist = D3DXVec3Length(&vecDist); if(fDist > fFar) { break; } if(m_usDetailTree[iPlantIndex]&0x80) { bool bLight = false; // character Light ¿µÇâ À¯¹« if(CSceneManager::m_bCharacterLight) // ij¸¯ÅÍ ¹ã¿ë light Ä×À»¶§ { D3DXVECTOR3 vecPos = D3DXVECTOR3(CSceneManager::m_CharacterLight.Position.x, CSceneManager::m_CharacterLight.Position.y, CSceneManager::m_CharacterLight.Position.z); if(D3DXVec3Length(&(vecPos - vecTreeCenter)) <= (CSceneManager::m_CharacterLight.Range + 100.0f)) { pd3dDevice->SetLight(1,&(CSceneManager::m_CharacterLight)); pd3dDevice->LightEnable(1,TRUE); bLight = true; } } //CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT); if(CRenderOption::m_TreeAnimation) { pd3dDevice->SetTransform(D3DTS_WORLD1,(D3DMATRIX*)&m_ViewPlants[iSortCount].matTm); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_ViewPlants[iSortCount].matRot); } else { pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_ViewPlants[iSortCount].matTm); } CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xaa); m_NormalTreeMesh[m_ViewPlants[iSortCount].ucKind]->Render(pd3dDevice); if(bLight == true) { pd3dDevice->LightEnable(1,FALSE); } } else { if(m_usDetailTree[iPlantIndex]&0x40) { if(CRenderOption::m_TreeAnimation) { pd3dDevice->SetTransform(D3DTS_WORLD1,(D3DMATRIX*)&m_ViewPlants[iSortCount].matTm); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_ViewPlants[iSortCount].matRot); } else { pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_ViewPlants[iSortCount].matTm); } CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0x50); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); if(m_NormalTreeMeshLOD[m_ViewPlants[iSortCount].ucKind]) m_NormalTreeMeshLOD[m_ViewPlants[iSortCount].ucKind]->Render(pd3dDevice); if(CRenderOption::m_FullSceneGlare) { CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE,0); if(m_NormalTreeMeshLOD[m_ViewPlants[iSortCount].ucKind]) m_NormalTreeMeshLOD[m_ViewPlants[iSortCount].ucKind]->Render(pd3dDevice); CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED); } CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); } } } ////////////////////// /* for(int ix=0;ixm_MinBox; m_vecMaxBox=m_NormalTreeMesh[usTreeKind]->m_MaxBox; //Init(); if(m_usDetailTree[ix+iy*SECTORSX]&0x80) { if(isAABBCulling()) { bool bLight = false; // character Light ¿µÇâ À¯¹« if(CSceneManager::m_bCharacterLight) // ij¸¯ÅÍ ¹ã¿ë light Ä×À»¶§ { D3DXVECTOR3 vecPos = D3DXVECTOR3(CSceneManager::m_CharacterLight.Position.x, CSceneManager::m_CharacterLight.Position.y, CSceneManager::m_CharacterLight.Position.z); D3DXVECTOR3 vecTreeCenter = D3DXVECTOR3(m_AccumulateTM._41, m_AccumulateTM._42, m_AccumulateTM._43); if(D3DXVec3Length(&(vecPos - vecTreeCenter)) <= (CSceneManager::m_CharacterLight.Range + 100.0f)) { pd3dDevice->SetLight(1,&(CSceneManager::m_CharacterLight)); pd3dDevice->LightEnable(1,TRUE); bLight = true; } } //CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT); if(CRenderOption::m_TreeAnimation) { pd3dDevice->SetTransform(D3DTS_WORLD1,(D3DMATRIX*)&m_AccumulateTM); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&matRot); } else { pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_AccumulateTM); } //CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xaa); //if(usTreeKind==0) if(0) { CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xaa); m_NormalTreeTrunk[usTreeKind]->Render(pd3dDevice); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0x0); m_NormalTreeLeaves[usTreeKind]->Render(pd3dDevice); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); } else { CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xaa); m_NormalTreeMesh[usTreeKind]->Render(pd3dDevice); } if(bLight == true) { pd3dDevice->LightEnable(1,FALSE); } } } else { if(m_usDetailTree[ix+iy*SECTORSX]&0x40) { if(isAABBCulling()) { if(CRenderOption::m_TreeAnimation) { pd3dDevice->SetTransform(D3DTS_WORLD1,(D3DMATRIX*)&m_AccumulateTM); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&matRot); } else { pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_AccumulateTM); } CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0x50); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); if(m_NormalTreeMeshLOD[usTreeKind]) m_NormalTreeMeshLOD[usTreeKind]->Render(pd3dDevice); if(CRenderOption::m_FullSceneGlare) { CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE,0); if(m_NormalTreeMeshLOD[usTreeKind]) m_NormalTreeMeshLOD[usTreeKind]->Render(pd3dDevice); CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED); } CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); } } } } } } */ ////////////////////// CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xee); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParent); CSceneStateMgr::_SetD3DRenderState(D3DRS_VERTEXBLEND,D3DVBF_DISABLE); } void CTreeScene::Render(LPDIRECT3DDEVICE8 pd3dDevice) { if(m_cPlant==0) return; matrix matParent; D3DXMATRIX matView; pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParent); pd3dDevice->GetTransform(D3DTS_VIEW,&matView); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); pd3dDevice->LightEnable(0,TRUE); pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); matrix matPlantPos; vector3 vecPlantPos; /* if(GF3OPTION) { matrix matProjection,matHeightView,matTexScale,matInv,matView,mat,mat2,matTex; matProjection.MakeProjection(3.14159f/3.0f,1.0f,50,100000.0f); float fViewHeight=(SECTORSIZE/2.0f)/tanf(3.14159f/6.0f); matrix matWorld; pd3dDevice->GetTransform(D3DTS_WORLD,matWorld); float fCloudMoveX=(int)(matWorld._41/SECTORSIZE); float fCloudMoveZ=(int)(matWorld._43/SECTORSIZE); matHeightView.CameraLookAt(vector3(SECTORSIZE/2.0f+fCloudMoveX*SECTORSIZE,-fViewHeight,SECTORSIZE/2.0f+fCloudMoveZ*SECTORSIZE), vector3(SECTORSIZE/2.0f+fCloudMoveX*SECTORSIZE,0.0f,SECTORSIZE/2.0f+fCloudMoveZ*SECTORSIZE), vector3(0.0f,0.0f,-1.0f)); matTexScale.MakeIdent(); matTexScale._11=0.5f; matTexScale._22=-0.5f; matTexScale._33=0.0f; matTexScale._41=0.5f; matTexScale._42=0.5f; matTexScale._43=1.0f; matTexScale._44=1.0f; pd3dDevice->GetTransform(D3DTS_VIEW,matView); matInv.Inverse(matView); mat=matProjection*matTexScale; mat2=matHeightView*mat; matTex=matInv*mat2; matrix matTrans; matTrans.MakeIdent(); matTrans._11=0.11f; matTrans._22=0.11f; matTrans._31=CSectorScene::m_fCloudMove+fCloudMoveX*0.11f; matTrans._32=CSectorScene::m_fCloudMove+fCloudMoveZ*0.11f; matTex=matTex*matTrans; pd3dDevice->SetTransform(D3DTS_TEXTURE1,(D3DMATRIX*)&matTex); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_CAMERASPACEPOSITION ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_PROJECTED | D3DTTFF_COUNT3 ); pd3dDevice->SetTexture(1,CSectorScene::m_CloudShadow.GetTexture()); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT); } */ matrix matRot; unsigned char usTreeKind; if(CRenderOption::m_TreeAnimation) { CSceneStateMgr::_SetD3DRenderState(D3DRS_VERTEXBLEND,D3DVBF_1WEIGHTS); matRot.Rotation(vector3(1.0f,0.0f,1.0f),(sinf(m_fRot))*0.06f); } m_iViewPlantsNum = 0; D3DXVECTOR4 vecViewPos; ////////////////////// /* */ for(int ix=0;ixm_MinBox; m_vecMaxBox=m_NormalTreeMesh[usTreeKind]->m_MaxBox; if(!CSceneManager::m_bSceneNodeCulling) { m_usDetailTree[ix+iy*SECTORSX] = m_usDetailTree[ix+iy*SECTORSX]|0x80; } //Init(); if(m_usDetailTree[ix+iy*SECTORSX]&0x80) { if(isAABBCulling()) { D3DXVECTOR3 vecPos = D3DXVECTOR3(vecPlantPos.x,vecPlantPos.y,vecPlantPos.z); D3DXVec3Transform(&vecViewPos,&vecPos,&matView); m_ViewPlants[m_iViewPlantsNum].fViewDist = vecViewPos.z; m_ViewPlants[m_iViewPlantsNum].matRot = matRot; m_ViewPlants[m_iViewPlantsNum].matTm = m_AccumulateTM; m_ViewPlants[m_iViewPlantsNum].ucKind = usTreeKind; m_ViewPlants[m_iViewPlantsNum++].iIndex = (ix+iy*SECTORSX); } } else { if(m_usDetailTree[ix+iy*SECTORSX]&0x40) { if(isAABBCulling()) { D3DXVECTOR3 vecPos = D3DXVECTOR3(vecPlantPos.x,vecPlantPos.y,vecPlantPos.z); D3DXVec3Transform(&vecViewPos,&vecPos,&matView); m_ViewPlants[m_iViewPlantsNum].fViewDist = vecViewPos.z; m_ViewPlants[m_iViewPlantsNum].matRot = matRot; m_ViewPlants[m_iViewPlantsNum].matTm = m_AccumulateTM; m_ViewPlants[m_iViewPlantsNum].ucKind = usTreeKind; m_ViewPlants[m_iViewPlantsNum++].iIndex = (ix+iy*SECTORSX); } } } } } } qsort((void *)m_ViewPlants,(size_t)m_iViewPlantsNum, sizeof(TreeNode_t),Tree_tCompare); for(int iSortCount = 0; iSortCount < m_iViewPlantsNum; iSortCount++) { int iPlantIndex = m_ViewPlants[iSortCount].iIndex; if(m_usDetailTree[iPlantIndex]&0x80) { bool bLight = false; // character Light ¿µÇâ À¯¹« if(CSceneManager::m_bCharacterLight) // ij¸¯ÅÍ ¹ã¿ë light Ä×À»¶§ { D3DXVECTOR3 vecPos = D3DXVECTOR3(CSceneManager::m_CharacterLight.Position.x, CSceneManager::m_CharacterLight.Position.y, CSceneManager::m_CharacterLight.Position.z); D3DXVECTOR3 vecTreeCenter = D3DXVECTOR3(m_AccumulateTM._41, m_AccumulateTM._42, m_AccumulateTM._43); if(D3DXVec3Length(&(vecPos - vecTreeCenter)) <= (CSceneManager::m_CharacterLight.Range + 100.0f)) { pd3dDevice->SetLight(1,&(CSceneManager::m_CharacterLight)); pd3dDevice->LightEnable(1,TRUE); bLight = true; } } //CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT); if(CRenderOption::m_TreeAnimation) { pd3dDevice->SetTransform(D3DTS_WORLD1,(D3DMATRIX*)&m_ViewPlants[iSortCount].matTm); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_ViewPlants[iSortCount].matRot); } else { pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_ViewPlants[iSortCount].matTm); } CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xaa); m_NormalTreeMesh[m_ViewPlants[iSortCount].ucKind]->Render(pd3dDevice); if(bLight == true) { pd3dDevice->LightEnable(1,FALSE); } } else { if(m_usDetailTree[iPlantIndex]&0x40) { if(CRenderOption::m_TreeAnimation) { pd3dDevice->SetTransform(D3DTS_WORLD1,(D3DMATRIX*)&m_ViewPlants[iSortCount].matTm); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_ViewPlants[iSortCount].matRot); } else { pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_ViewPlants[iSortCount].matTm); } CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0x50); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); if(m_NormalTreeMeshLOD[m_ViewPlants[iSortCount].ucKind]) m_NormalTreeMeshLOD[m_ViewPlants[iSortCount].ucKind]->Render(pd3dDevice); if(CRenderOption::m_FullSceneGlare) { CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE,0); if(m_NormalTreeMeshLOD[m_ViewPlants[iSortCount].ucKind]) m_NormalTreeMeshLOD[m_ViewPlants[iSortCount].ucKind]->Render(pd3dDevice); CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED); } CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); } } } ////////////////////// /* for(int ix=0;ixm_MinBox; m_vecMaxBox=m_NormalTreeMesh[usTreeKind]->m_MaxBox; //Init(); if(m_usDetailTree[ix+iy*SECTORSX]&0x80) { if(isAABBCulling()) { bool bLight = false; // character Light ¿µÇâ À¯¹« if(CSceneManager::m_bCharacterLight) // ij¸¯ÅÍ ¹ã¿ë light Ä×À»¶§ { D3DXVECTOR3 vecPos = D3DXVECTOR3(CSceneManager::m_CharacterLight.Position.x, CSceneManager::m_CharacterLight.Position.y, CSceneManager::m_CharacterLight.Position.z); D3DXVECTOR3 vecTreeCenter = D3DXVECTOR3(m_AccumulateTM._41, m_AccumulateTM._42, m_AccumulateTM._43); if(D3DXVec3Length(&(vecPos - vecTreeCenter)) <= (CSceneManager::m_CharacterLight.Range + 100.0f)) { pd3dDevice->SetLight(1,&(CSceneManager::m_CharacterLight)); pd3dDevice->LightEnable(1,TRUE); bLight = true; } } //CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT); if(CRenderOption::m_TreeAnimation) { pd3dDevice->SetTransform(D3DTS_WORLD1,(D3DMATRIX*)&m_AccumulateTM); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&matRot); } else { pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_AccumulateTM); } //CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xaa); //if(usTreeKind==0) if(0) { CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xaa); m_NormalTreeTrunk[usTreeKind]->Render(pd3dDevice); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0x0); m_NormalTreeLeaves[usTreeKind]->Render(pd3dDevice); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); } else { CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xaa); m_NormalTreeMesh[usTreeKind]->Render(pd3dDevice); } if(bLight == true) { pd3dDevice->LightEnable(1,FALSE); } } } else { if(m_usDetailTree[ix+iy*SECTORSX]&0x40) { if(isAABBCulling()) { if(CRenderOption::m_TreeAnimation) { pd3dDevice->SetTransform(D3DTS_WORLD1,(D3DMATRIX*)&m_AccumulateTM); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&matRot); } else { pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_AccumulateTM); } CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0x50); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); if(m_NormalTreeMeshLOD[usTreeKind]) m_NormalTreeMeshLOD[usTreeKind]->Render(pd3dDevice); if(CRenderOption::m_FullSceneGlare) { CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE,0); if(m_NormalTreeMeshLOD[usTreeKind]) m_NormalTreeMeshLOD[usTreeKind]->Render(pd3dDevice); CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED); } CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); } } } } } } */ ////////////////////// //CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); /* if(GF3OPTION) { CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE ); } */ CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xee); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParent); CSceneStateMgr::_SetD3DRenderState(D3DRS_VERTEXBLEND,D3DVBF_DISABLE); } void CTreeScene::GeneratePlant(CSectorPlantMap *PlantMap,float *pHeightData) { int ix,iy; m_pHeight=pHeightData; m_cPlant=0; memset(m_usDetailTree,0xff,sizeof(unsigned char)*SECTORSX*SECTORSY); for(int cPlant=0;cPlantm_PlantKind.num;cPlant++) { ix=PlantMap->m_PlantPosX[cPlant]; iy=PlantMap->m_PlantPosZ[cPlant]; if( ix < 0 || ix>= SECTORSX || iy < 0 || iy>=SECTORSY) continue; m_usDetailTree[ix+iy*SECTORSX]=PlantMap->m_PlantKind[cPlant]; m_cPlant++; } for(int i=0;iGetMatPosition(); vector3 vecViewPos=matViewPosition->GetLoc(); vecViewPos.x-=m_AccumulateTM._41; vecViewPos.z-=m_AccumulateTM._43; if(CRenderOption::m_TreeProjectShadow) { for(int i=0;i vecViewPos.x && 0.0f-fLens_FarTree <= vecViewPos.z && SECTORSIZE+fLens_FarTree > vecViewPos.z) { for(int ix=0;ixEndScene(); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2); matrix matTexScale; matTexScale.MakeIdent(); matTexScale._11=0.5f; matTexScale._22=-0.5f; matTexScale._33=0.0f; matTexScale._41=0.5f; matTexScale._42=0.5f; matTexScale._43=1.0f; matTexScale._44=1.0f; matrix matView,matOldProj,matInv,matTex,matIndent; matIndent.MakeIdent(); pd3dDevice->GetTransform(D3DTS_VIEW,matView); pd3dDevice->GetTransform(D3DTS_PROJECTION,matOldProj); matInv.Inverse(matView); matrix matAdjLightProj,matLightProj; matAdjLightProj.MakeAdjustedProjectionMatrix(3.14159f/8.0f,1.0f,1.0f,500.0f,0.5f,-0.5f,(float)SHADOWSIZE, (float)SHADOWSIZE); matLightProj.MakeAdjustedProjectionMatrix(3.14159f/8.0f, 1.0f, 1.0f, 500.0f,0.0f, 0.0f,(float)SHADOWSIZE, (float)SHADOWSIZE); matrix matShadowProj; //matShadowProj.MakeProjection(3.14159f/4.0f,1.0f,10.0f,10000.0f); CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,FALSE); 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); pd3dDevice->LightEnable(8,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,0xff999999); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); vector3 vecSunLightDir( CSceneManager::m_WeatherManager.m_SunLight.Direction.x, CSceneManager::m_WeatherManager.m_SunLight.Direction.y, CSceneManager::m_WeatherManager.m_SunLight.Direction.z); vecSunLightDir.Normalize(); vecSunLightDir.y-=0.3f; vecSunLightDir.Normalize(); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,FALSE); matrix *matViewPosition=(matrix*)CSceneManager::GetCamera()->GetMatPosition(); vector3 vecViewPos=matViewPosition->GetLoc(); vector3 vecViewPosInter; vecViewPosInter; float fViewInter; matrix matRot; unsigned char usTreeKind; if(CRenderOption::m_TreeAnimation) { CSceneStateMgr::_SetD3DRenderState(D3DRS_VERTEXBLEND,D3DVBF_1WEIGHTS); matRot.Rotation(vector3(1.0f,0.0f,1.0f),(sinf(m_fRot))*0.06f); } vector3 vecPlantPos; matrix matParent,matPlantPos; pd3dDevice->GetTransform(D3DTS_WORLD,matParent); CSceneStateMgr::_SetD3DRenderState( D3DRS_ZWRITEENABLE,FALSE); m_AccumulateTM.Translation(vector3(0.0f,0.0f,0.0f)); bool bTreeKindRender[MAX_TREEKIND]; bool bTreeRender[SECTORSX*SECTORSY]; memset(bTreeKindRender,false,sizeof(bool)*MAX_TREEKIND); int cShadowList=0; for(int ix=0;ixm_MinBox; m_vecMaxBox=m_NormalTreeMesh[usTreeKind]->m_MaxBox; m_vecMinBox.x*=2.0f; m_vecMinBox.z*=2.0f; m_vecMaxBox.x*=2.0f; m_vecMaxBox.z*=2.0f; if(m_usDetailTree[ix+iy*SECTORSX]&0x80) { if(isAABBCulling()) { bTreeKindRender[usTreeKind]=true; bTreeRender[ix+iy*SECTORSX]=true; } else { bTreeRender[ix+iy*SECTORSX]=false; } } } else { bTreeRender[ix+iy*SECTORSX]=false; } } } matrix matObjectCamera; for(int cTree=0;cTreem_MinBox; m_vecMaxBox=m_NormalTreeMesh[cTree]->m_MaxBox; Init(); vector3 vecCenter=m_vecMaxBox+m_vecMinBox; vecCenter=vecCenter*0.5f; D3DXMatrixOrthoLH(matShadowProj,m_fRad*1.0f,m_fRad*1.0f,10.0f, 100000.0f); m_AccumulateTM.Translation(vector3(0.0f,0.0f,0.0f)); matRot._41=matRot._42=matRot._43=0.0f; pShadowTexture.Begin(pd3dDevice); pd3dDevice->Clear(0, NULL, D3DCLEAR_ZBUFFER|D3DCLEAR_TARGET,0xffffffff, 1.0f, 0); pd3dDevice->BeginScene(); matObjectCamera.CameraLookAt(vector3(0.0f,vecCenter.y,0.0f)-vecSunLightDir*1550.0f, vector3(0.0f,vecCenter.y,0.0f),vector3(0.0f,1.0f,0.0f)); pd3dDevice->SetTransform(D3DTS_VIEW,matObjectCamera); pd3dDevice->SetTransform(D3DTS_PROJECTION,matShadowProj); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1,D3DTA_DIFFUSE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP,D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP,D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP,D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_ALPHAOP,D3DTOP_DISABLE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,0xff000000); matrix matWorld; matWorld.MakeIdent(); CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED); if(CRenderOption::m_TreeAnimation) { pd3dDevice->SetTransform(D3DTS_WORLD1,(D3DMATRIX*)&m_AccumulateTM); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&matRot); } else { pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_AccumulateTM); } // CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xaa); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); m_NormalTreeMesh[cTree]->Render(pd3dDevice); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL); pd3dDevice->EndScene(); pShadowTexture.End(pd3dDevice); cShadowList=0; for(int ix=0;ix ShadowedPoly; //CSceneManager::m_HeightField.GetHeightFieldRangePoly(vecPlantPos,ShadowedPoly,3000.0f); CHeightFieldScene::CShadowedPoly *pNode; pNode=CSceneManager::m_HeightField.GetShadowPolyList(m_ShadowPolyList[cShadowList]); if(pNode==NULL) continue; if(pNode->m_ShadowedPolyList.num==0) continue; TTVertex *pShadowedVertex=new TTVertex[pNode->m_ShadowedPolyList.num]; WORD *pShadowedIndices=new WORD[pNode->m_ShadowedPolyList.num]; for(int cIndices=0;cIndicesm_ShadowedPolyList.num;cIndices++) { pShadowedVertex[cIndices].v=pNode->m_ShadowedPolyList[cIndices]; pShadowedVertex[cIndices].diff.c=0xff999999; pShadowedIndices[cIndices]=cIndices; } pd3dDevice->BeginScene(); pd3dDevice->SetTransform(D3DTS_VIEW,CSceneManager::m_ViewCamera->GetMatView()); //matObjectCamera.CameraLookAt(vecPlantPos+vecSunLightDir*1550.0f, // vecPlantPos,vector3(0.0f,1.0f,0.0f)); matObjectCamera.CameraLookAt(vecPlantPos+vector3(0.0f,vecCenter.y,0.0f)-vecSunLightDir*1550.0f, vecPlantPos+vector3(0.0f,vecCenter.y,0.0f),vector3(0.0f,1.0f,0.0f)); matrix mat,mat2; mat=matShadowProj*matTexScale; mat2=matObjectCamera*mat; matTex=matInv*mat2; pd3dDevice->SetTransform(D3DTS_PROJECTION,matOldProj); pd3dDevice->SetTransform(D3DTS_TEXTURE0,matTex); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_CAMERASPACEPOSITION ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_PROJECTED | D3DTTFF_COUNT3 ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP ); pd3dDevice->SetTexture(0,pShadowTexture.GetTexture()); pd3dDevice->SetVertexShader(TTVERTEXFVF); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1,D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2,D3DTA_DIFFUSE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP,D3DTOP_ADD); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP,D3DTOP_DISABLE); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_ZERO); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE); //CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE); matTex.MakeIdent(); pd3dDevice->SetTransform(D3DTS_WORLD,matTex); pd3dDevice->SetTransform(D3DTS_WORLD1,matTex); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZBIAS,14); CSceneStateMgr::_SetD3DRenderState( D3DRS_CULLMODE , D3DCULL_CCW); pd3dDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,0,pNode->m_ShadowedPolyList.num,pNode->m_ShadowedPolyList.num/3,pShadowedIndices, D3DFMT_INDEX16,pShadowedVertex,sizeof(TTVertex)); pd3dDevice->SetTransform(D3DTS_TEXTURE0,matTex); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZBIAS,0); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); delete [] pShadowedVertex; delete [] pShadowedIndices; pd3dDevice->EndScene(); } } cShadowList++; } } } } pd3dDevice->SetTransform(D3DTS_PROJECTION,matOldProj); pd3dDevice->SetTransform(D3DTS_VIEW,matView); ////////////////// CSceneStateMgr::_SetD3DRenderState( D3DRS_ZWRITEENABLE,TRUE); matrix matWorld; matWorld.MakeIdent(); pd3dDevice->SetTransform(D3DTS_WORLD1,matWorld); pd3dDevice->SetTransform(D3DTS_WORLD,matWorld); CSceneStateMgr::_SetD3DRenderState(D3DRS_VERTEXBLEND,D3DVBF_DISABLE); CSceneStateMgr::_SetD3DRenderState( D3DRS_CULLMODE , D3DCULL_CCW); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP ); pd3dDevice->BeginScene(); } void CTreeScene::DeleteAllData() { m_pHeight= NULL; m_cPlant=0; if(m_ViewPlants != NULL) { delete[] m_ViewPlants; m_ViewPlants = NULL; } } void CTreeScene::Update(float fUpdate) { m_fRot+=fUpdate; } int Tree_tCompare(const void *arg1,const void *arg2) { if(((TreeNode_t *)arg1)->fViewDist < ((TreeNode_t *)arg2)->fViewDist) return 1; else if(((TreeNode_t *)arg1)->fViewDist > ((TreeNode_t *)arg2)->fViewDist) return -1; return 0; } void CTreeScene::RenderBlack( LPDIRECT3DDEVICE8 pd3dDevice) { if(m_cPlant==0 ) return; matrix matParent; D3DXMATRIX matView; pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParent); pd3dDevice->GetTransform(D3DTS_VIEW,&matView); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); pd3dDevice->LightEnable(0,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); matrix matPlantPos; vector3 vecPlantPos; matrix matRot; unsigned char usTreeKind; if(CRenderOption::m_TreeAnimation) { CSceneStateMgr::_SetD3DRenderState(D3DRS_VERTEXBLEND,D3DVBF_1WEIGHTS); matRot.Rotation(vector3(1.0f,0.0f,1.0f),(sinf(m_fRot))*0.06f); } m_iViewPlantsNum = 0; D3DXVECTOR4 vecViewPos; for(int ix=0;ixm_MinBox; m_vecMaxBox=m_NormalTreeMesh[usTreeKind]->m_MaxBox; //Init(); if(m_usDetailTree[ix+iy*SECTORSX]&0x80) { if(isAABBCulling()) { D3DXVECTOR3 vecPos = D3DXVECTOR3(vecPlantPos.x,vecPlantPos.y,vecPlantPos.z); D3DXVec3Transform(&vecViewPos,&vecPos,&matView); m_ViewPlants[m_iViewPlantsNum].fViewDist = vecViewPos.z; m_ViewPlants[m_iViewPlantsNum].matRot = matRot; m_ViewPlants[m_iViewPlantsNum].matTm = m_AccumulateTM; m_ViewPlants[m_iViewPlantsNum].ucKind = usTreeKind; m_ViewPlants[m_iViewPlantsNum++].iIndex = (ix+iy*SECTORSX); } } else { if(m_usDetailTree[ix+iy*SECTORSX]&0x40) { if(isAABBCulling()) { D3DXVECTOR3 vecPos = D3DXVECTOR3(vecPlantPos.x,vecPlantPos.y,vecPlantPos.z); D3DXVec3Transform(&vecViewPos,&vecPos,&matView); m_ViewPlants[m_iViewPlantsNum].fViewDist = vecViewPos.z; m_ViewPlants[m_iViewPlantsNum].matRot = matRot; m_ViewPlants[m_iViewPlantsNum].matTm = m_AccumulateTM; m_ViewPlants[m_iViewPlantsNum].ucKind = usTreeKind; m_ViewPlants[m_iViewPlantsNum++].iIndex = (ix+iy*SECTORSX); } } } } } } qsort((void *)m_ViewPlants,(size_t)m_iViewPlantsNum, sizeof(TreeNode_t),Tree_tCompare); for(int iSortCount = 0; iSortCount < m_iViewPlantsNum; iSortCount++) { int iPlantIndex = m_ViewPlants[iSortCount].iIndex; if(m_usDetailTree[iPlantIndex]&0x80) { bool bLight = false; // character Light ¿µÇâ À¯¹« if(CSceneManager::m_bCharacterLight) // ij¸¯ÅÍ ¹ã¿ë light Ä×À»¶§ { D3DXVECTOR3 vecPos = D3DXVECTOR3(CSceneManager::m_CharacterLight.Position.x, CSceneManager::m_CharacterLight.Position.y, CSceneManager::m_CharacterLight.Position.z); D3DXVECTOR3 vecTreeCenter = D3DXVECTOR3(m_AccumulateTM._41, m_AccumulateTM._42, m_AccumulateTM._43); if(D3DXVec3Length(&(vecPos - vecTreeCenter)) <= (CSceneManager::m_CharacterLight.Range + 100.0f)) { pd3dDevice->SetLight(1,&(CSceneManager::m_CharacterLight)); pd3dDevice->LightEnable(1,TRUE); bLight = true; } } //CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT); if(CRenderOption::m_TreeAnimation) { pd3dDevice->SetTransform(D3DTS_WORLD1,(D3DMATRIX*)&m_ViewPlants[iSortCount].matTm); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_ViewPlants[iSortCount].matRot); } else { pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_ViewPlants[iSortCount].matTm); } CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xaa); //================================ // Test //================================ CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR, 0x00 ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TFACTOR ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); m_NormalTreeMesh[m_ViewPlants[iSortCount].ucKind]->Render(pd3dDevice); if(bLight == true) { pd3dDevice->LightEnable(1,FALSE); } } else { if(m_usDetailTree[iPlantIndex]&0x40) { if(CRenderOption::m_TreeAnimation) { pd3dDevice->SetTransform(D3DTS_WORLD1,(D3DMATRIX*)&m_ViewPlants[iSortCount].matTm); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_ViewPlants[iSortCount].matRot); } else { pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&m_ViewPlants[iSortCount].matTm); } CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0x50); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); //================================ // Test //================================ CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR, 0x00 ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TFACTOR ); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); if(m_NormalTreeMeshLOD[m_ViewPlants[iSortCount].ucKind]) m_NormalTreeMeshLOD[m_ViewPlants[iSortCount].ucKind]->Render(pd3dDevice); if(CRenderOption::m_FullSceneGlare) { CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE,0); if(m_NormalTreeMeshLOD[m_ViewPlants[iSortCount].ucKind]) m_NormalTreeMeshLOD[m_ViewPlants[iSortCount].ucKind]->Render(pd3dDevice); CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED); } CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); } } } CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xee); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParent); CSceneStateMgr::_SetD3DRenderState(D3DRS_VERTEXBLEND,D3DVBF_DISABLE); }