Files
Client/GameTools/Zallad3D SceneClass/TreeScene.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

1605 lines
48 KiB
C++
Raw Permalink Blame History

// 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;cPlant<MAX_TREE;cPlant++)
{
*(pPlantIndices++)=cPlant*8+0;
*(pPlantIndices++)=cPlant*8+1;
*(pPlantIndices++)=cPlant*8+2;
*(pPlantIndices++)=cPlant*8+1;
*(pPlantIndices++)=cPlant*8+2;
*(pPlantIndices++)=cPlant*8+3;
*(pPlantIndices++)=cPlant*8+4;
*(pPlantIndices++)=cPlant*8+5;
*(pPlantIndices++)=cPlant*8+6;
*(pPlantIndices++)=cPlant*8+5;
*(pPlantIndices++)=cPlant*8+6;
*(pPlantIndices++)=cPlant*8+7;
}
m_pPlantIndices->Unlock();
*/
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;i<MAX_TREEKIND;i++)
{
sprintf(strName,"NormalTree%d.R3S",i+1);
m_NormalTreeMesh[i]=CSceneManager::m_MeshObjectContainer.GetMeshObject(strName);
if(CRenderOption::m_TreeAnimation)
m_NormalTreeMesh[i]->ConvertTree();
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<cManySeed;i++)
{
PutRange[i]=rand()%MAX_SEEDRANGE;
PutSeedX[i]=rand()%(SECTORSX-(PutRange[i]*2));
PutSeedY[i]=rand()%(SECTORSY-(PutRange[i]*2));
PutSeedX[i]+=PutRange[i];
PutSeedY[i]+=PutRange[i];
PutSeedPoss[i]=(rand()%100)+90;
}
/*
for(ix=0;ix<SECTORSX;ix++)
{
for(iy=0;iy<SECTORSY;iy++)
{
for(iSeed=0;iSeed<cManySeed;iSeed++)
{
InterX=PutSeedX[iSeed]-ix;
InterY=PutSeedY[iSeed]-iy;
if(CFastMath::FastSqrt((InterX*InterX)+(InterY*InterY)) <= PutRange[iSeed])
{
if(m_usDetailTree[ix+iy*SECTORSX]==0xff)
{
if(cPlant>=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;ix<SECTORSX;ix++)
{
for(int iy=0;iy<SECTORSY;iy++)
{
if(m_usDetailTree[ix+iy*SECTORSX]!=0xff)
{
usTreeKind=m_usDetailTree[ix+iy*SECTORSX] & 0x3f;
vecPlantPos.x=ix*LINTERVAL+matParent._41;
vecPlantPos.y=m_pHeight[ix+iy*SECTORSX];
vecPlantPos.z=iy*LINTERVAL+matParent._43;
matPlantPos.Translation(vecPlantPos);
m_AccumulateTM=matPlantPos;
m_AccumulateTM._42-=10.0f;
matRot._41=m_AccumulateTM._41;
matRot._42=m_AccumulateTM._42;
matRot._43=m_AccumulateTM._43;
m_vecMinBox=m_NormalTreeMesh[usTreeKind]->m_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 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(CSceneManager::m_bCharacterLight) // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> light <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
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;ix<SECTORSX;ix++)
{
for(int iy=0;iy<SECTORSY;iy++)
{
if(m_usDetailTree[ix+iy*SECTORSX]!=0xff)
{
usTreeKind=m_usDetailTree[ix+iy*SECTORSX] & 0x3f;
vecPlantPos.x=ix*LINTERVAL+matParent._41;
vecPlantPos.y=m_pHeight[ix+iy*SECTORSX];
vecPlantPos.z=iy*LINTERVAL+matParent._43;
matPlantPos.Translation(vecPlantPos);
m_AccumulateTM=matPlantPos;
m_AccumulateTM._42-=10.0f;
matRot._41=m_AccumulateTM._41;
matRot._42=m_AccumulateTM._42;
matRot._43=m_AccumulateTM._43;
m_vecMinBox=m_NormalTreeMesh[usTreeKind]->m_MinBox;
m_vecMaxBox=m_NormalTreeMesh[usTreeKind]->m_MaxBox;
//Init();
if(m_usDetailTree[ix+iy*SECTORSX]&0x80)
{
if(isAABBCulling())
{
bool bLight = false;
// character Light <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(CSceneManager::m_bCharacterLight) // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> light <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
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;ix<SECTORSX;ix++)
{
for(int iy=0;iy<SECTORSY;iy++)
{
if(m_usDetailTree[ix+iy*SECTORSX]!=0xff)
{
usTreeKind=m_usDetailTree[ix+iy*SECTORSX] & 0x3f;
vecPlantPos.x=ix*LINTERVAL+matParent._41;
vecPlantPos.y=m_pHeight[ix+iy*SECTORSX];
vecPlantPos.z=iy*LINTERVAL+matParent._43;
matPlantPos.Translation(vecPlantPos);
m_AccumulateTM=matPlantPos;
m_AccumulateTM._42-=10.0f;
matRot._41=m_AccumulateTM._41;
matRot._42=m_AccumulateTM._42;
matRot._43=m_AccumulateTM._43;
m_vecMinBox=m_NormalTreeMesh[usTreeKind]->m_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 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(CSceneManager::m_bCharacterLight) // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> light <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
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;ix<SECTORSX;ix++)
{
for(int iy=0;iy<SECTORSY;iy++)
{
if(m_usDetailTree[ix+iy*SECTORSX]!=0xff)
{
usTreeKind=m_usDetailTree[ix+iy*SECTORSX] & 0x3f;
vecPlantPos.x=ix*LINTERVAL+matParent._41;
vecPlantPos.y=m_pHeight[ix+iy*SECTORSX];
vecPlantPos.z=iy*LINTERVAL+matParent._43;
matPlantPos.Translation(vecPlantPos);
m_AccumulateTM=matPlantPos;
m_AccumulateTM._42-=10.0f;
matRot._41=m_AccumulateTM._41;
matRot._42=m_AccumulateTM._42;
matRot._43=m_AccumulateTM._43;
m_vecMinBox=m_NormalTreeMesh[usTreeKind]->m_MinBox;
m_vecMaxBox=m_NormalTreeMesh[usTreeKind]->m_MaxBox;
//Init();
if(m_usDetailTree[ix+iy*SECTORSX]&0x80)
{
if(isAABBCulling())
{
bool bLight = false;
// character Light <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(CSceneManager::m_bCharacterLight) // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> light <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
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;cPlant<PlantMap->m_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;i<m_ShadowPolyList.num;i++)
{
CSceneManager::m_HeightField.DeleteShadowPolyList(m_ShadowPolyList[i]);
}
m_ShadowPolyList.num=0;
if(m_ViewPlants != NULL)
delete[] m_ViewPlants;
m_ViewPlants = new TreeNode_t[cPlant];
}
void CTreeScene::CalcObjectLens()
{
matrix *matViewPosition=(matrix*)CSceneManager::GetCamera()->GetMatPosition();
vector3 vecViewPos=matViewPosition->GetLoc();
vecViewPos.x-=m_AccumulateTM._41;
vecViewPos.z-=m_AccumulateTM._43;
if(CRenderOption::m_TreeProjectShadow)
{
for(int i=0;i<m_ShadowPolyList.num;i++)
{
if(m_ShadowPolyList[i]!=-1)
CSceneManager::m_HeightField.DeleteShadowPolyList(m_ShadowPolyList[i]);
}
m_ShadowPolyList.num=0;
}
float fLens=0.0f;
WORD usTree;
float fLens_FarTree=90000.0f;
if( 0.0f-fLens_FarTree <= vecViewPos.x &&
SECTORSIZE+fLens_FarTree > vecViewPos.x &&
0.0f-fLens_FarTree <= vecViewPos.z &&
SECTORSIZE+fLens_FarTree > vecViewPos.z)
{
for(int ix=0;ix<SECTORSX;ix++)
{
for(int iy=0;iy<SECTORSY;iy++)
{
if(m_usDetailTree[ix+iy*SECTORSX] !=0xff)
{
//m_usDetailTree[ix+iy*SECTORSX]=
// m_usDetailTree[ix+iy*SECTORSX]|0x80;
/*
float fLens=CFastMath::FastSqrt(
(((ix*LINTERVAL+m_AccumulateTM._41)-vecViewPos.x)*((ix*LINTERVAL+m_AccumulateTM._41)-vecViewPos.x))+
(((iy*LINTERVAL+m_AccumulateTM._43)-vecViewPos.z)*((iy*LINTERVAL+m_AccumulateTM._43)-vecViewPos.z))
);
if(fLens<=LENS_REALPOLYTREE)
m_usDetailTree[ix+iy*SECTORSX]=m_usDetailTree[ix+iy*SECTORSX]|0x80;
else
m_usDetailTree[ix+iy*SECTORSX]=m_usDetailTree[ix+iy*SECTORSX]&0x7f;
*/
usTree=m_usDetailTree[ix+iy*SECTORSX]&0x3f;
fLens=CFastMath::FastSqrt((ix*LINTERVAL-vecViewPos.x)*(ix*LINTERVAL-vecViewPos.x)+
(iy*LINTERVAL-vecViewPos.z)*(iy*LINTERVAL-vecViewPos.z));
if( fLens <= LENS_REALPOLYTREE)
{
m_usDetailTree[ix+iy*SECTORSX]=usTree|0x80;
vector3 vecTreePos=m_AccumulateTM.GetLoc();
vecTreePos.x+=ix*LINTERVAL;
vecTreePos.z+=iy*LINTERVAL;
if(CRenderOption::m_TreeProjectShadow)
m_ShadowPolyList.Add(CSceneManager::m_HeightField.AddShadowPoly(vecTreePos,1));
}
else if( fLens < fLens_FarTree)
{
m_usDetailTree[ix+iy*SECTORSX]=usTree|0x40;
if(CRenderOption::m_TreeProjectShadow)
m_ShadowPolyList.Add(-1);
}
else
{
m_usDetailTree[ix+iy*SECTORSX]=usTree;
if(CRenderOption::m_TreeProjectShadow)
m_ShadowPolyList.Add(-1);
}
}
}
}
}
}
void CTreeScene::RenderShadow(LPDIRECT3DDEVICE8 pd3dDevice, CRenderTexture &pShadowTexture)
{
pd3dDevice->EndScene();
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;ix<SECTORSX;ix++)
{
for(int iy=0;iy<SECTORSY;iy++)
{
if(m_usDetailTree[ix+iy*SECTORSX]!=0xff)
{
usTreeKind=m_usDetailTree[ix+iy*SECTORSX] & 0x3f;
vector3 vecPlantPos;
vecPlantPos.x=ix*LINTERVAL+matParent._41;
vecPlantPos.y=m_pHeight[ix+iy*SECTORSX];
vecPlantPos.z=iy*LINTERVAL+matParent._43;
matPlantPos.Translation(vecPlantPos);
m_AccumulateTM=matPlantPos;
m_AccumulateTM._42-=10.0f;
matRot._41=m_AccumulateTM._41;
matRot._42=m_AccumulateTM._42;
matRot._43=m_AccumulateTM._43;
m_vecMinBox=m_NormalTreeMesh[usTreeKind]->m_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;cTree<MAX_TREEKIND;cTree++)
{
if(bTreeKindRender[cTree]==false)
continue;
m_vecMinBox=m_NormalTreeMesh[cTree]->m_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<SECTORSX;ix++)
{
for(int iy=0;iy<SECTORSY;iy++)
{
if(m_usDetailTree[ix+iy*SECTORSX]!=0xff)
{
usTreeKind=m_usDetailTree[ix+iy*SECTORSX] & 0x3f;
vecPlantPos.x=ix*LINTERVAL+matParent._41;
vecPlantPos.y=m_pHeight[ix+iy*SECTORSX];
vecPlantPos.z=iy*LINTERVAL+matParent._43;
matPlantPos.Translation(vecPlantPos);
m_AccumulateTM=matPlantPos;
m_AccumulateTM._42-=10.0f;
matRot._41=m_AccumulateTM._41;
matRot._42=m_AccumulateTM._42;
matRot._43=m_AccumulateTM._43;
if(m_usDetailTree[ix+iy*SECTORSX]&0x80)
{
if(usTreeKind==cTree && bTreeRender[ix+iy*SECTORSX]==true)
{
//List<vector3> 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;cIndices<pNode->m_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;ix<SECTORSX;ix++)
{
for(int iy=0;iy<SECTORSY;iy++)
{
if(m_usDetailTree[ix+iy*SECTORSX]!=0xff)
{
usTreeKind=m_usDetailTree[ix+iy*SECTORSX] & 0x3f;
vecPlantPos.x=ix*LINTERVAL+matParent._41;
vecPlantPos.y=m_pHeight[ix+iy*SECTORSX];
vecPlantPos.z=iy*LINTERVAL+matParent._43;
matPlantPos.Translation(vecPlantPos);
m_AccumulateTM=matPlantPos;
m_AccumulateTM._42-=10.0f;
matRot._41=m_AccumulateTM._41;
matRot._42=m_AccumulateTM._42;
matRot._43=m_AccumulateTM._43;
m_vecMinBox=m_NormalTreeMesh[usTreeKind]->m_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 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(CSceneManager::m_bCharacterLight) // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> light <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
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);
}