Files
Client/GameTools/Zallad3D SceneClass/HouseObject.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

4362 lines
148 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// HouseObject.cpp: implementation of the CHouseObject class.
//
//////////////////////////////////////////////////////////////////////
#include "HouseObject.h"
#include "SceneManager.h"
#include "BaseGraphicsLayer.h"
#include "RenderOption.h"
#include "SceneStateMgr.h"
#include "WBLightMapGenerator.h"
DWORD CHouseObject::m_dwShadowMapVertexShader=0xffffffff;
DWORD CHouseObject::m_dwShadowMapPixelShader=0xffffffff;
DWORD CHouseObject::m_dwHouseDiffuseVertexShader=0xffffffff;
DWORD CHouseObject::m_dwHouseDiffusePixelShader=0xffffffff;
DWORD CHouseObject::m_dwHouseSpecularVertexShader=0xffffffff;
DWORD CHouseObject::m_dwHouseSpecularPixelShader=0xffffffff;
LPDIRECT3DCUBETEXTURE8 CHouseObject::m_pNormalizeCubeMap=NULL;
char strHouseDiffuseVertexShader[]=
"vs.1.1\n"
"m4x4 oPos,v0,c16\n"
"m4x4 r0,v0,c16\n"
"mov oT0.xy,v2.xy\n"//Diffuse
"mov oT1.xy,v2.xy\n"//Diffuse
"mov oT2.xy,v3.xy\n"//Lightmap
"mov oFog.x,r0.z\n";
char strHouseDiffusePixelShader[]=
"ps.1.1\n"
"tex t0\n"//Diffuse
"tex t1\n"//Diffuse
"tex t2\n"//Lightmap"
"mov r0,t0\n"
"mul r0,r0,c0\n"
"mul_x2 r0,r0,t2\n";
char strHouseSpecularVertexShader[]=
"vs.1.0\n"
"m4x4 oPos, v0, c16\n"
"mov oT0.xy, v2.xy\n" // Texture Coords
"mov oT1.xy, v2.xy\n" // Bump
"mov oT2.xy, v3.xy\n" // Lightmap
//;r9 = tangent U vector = normal cross tangent V vector
"mov r8, v4\n"
"mul r9, r8.yzxw, v1.zxyw\n"
"mad r9, -r8.zxyw, v1.yzxw, r9\n"
/*
*/
"sub r1, c32, v0\n" // Light direction
//Normalize
"dp3 r11.x,r1.xyz,r1.xyz\n"
"rsq r11.xyz,r11.x\n"
"mul r1.xyz, r1.xyz, r11.xyz\n"
"sub r0, c35, v0\n" //Viewer direction
//Normalize
"dp3 r11.x,r0.xyz,r0.xyz\n"
"rsq r11.xyz,r11.x\n"
"mul r0.xyz, r0.xyz, r11.xyz\n"
"add r4.xyz, r0.xyz, r1.xyz\n" //Halfway
//;r4 = tangent space halfway vector
"dp3 r6.x, r9, r4\n"
"dp3 r6.y, r8, r4\n"
"dp3 r6.z, v1, r4\n"
"mov oT3.xyz,r6.xyz\n"; // Halfway vector to be renormalized by cube map
char strHouseSpecularPixelShader[]=
"ps.1.1\n"
"def c0,0.9,0.9,0.9,0.9\n"
"tex t0\n"//diffuse
"tex t1\n"//normal
"tex t2\n"//Light
"tex t3\n"//
//"mov r0,t3\n";
"dp3_sat r0,t1_bx2,t3_bx2\n"//N.H
"mul r1,r0,r0\n"
"mul r0,r1,r1\n"
"mul r1,r0,r0\n"
"mul r0,r1,r1\n"
"mul r0,r0,t2\n"
"mul r0,r0,t2\n"
"mul r0,r0,t1.a\n";
//"mul_x2 r0,r1,t1.a\n";
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CHouseObject::CHouseObject()
{
m_pBackupTmp.num = 0;
m_pBackupVertex.num = 0;
m_pInHouseObject=NULL;
m_pMedHouseObject=NULL;
m_pOutHouseObject=NULL;
m_pLodHouseObject=NULL;
m_pOctree=NULL;
m_isHaveLightmap=false;
m_isHaveInLightmap = false;
m_bConvertNight = false;
m_bNightMap = false;
m_bNightUv = false;
m_bModulate2X = false;
if(CRenderOption::m_AllObjectBump && m_dwHouseDiffusePixelShader==0xffffffff)
{
DWORD dwBumpVertexDecl[]=
{
D3DVSD_STREAM( 0 ),
D3DVSD_REG( 0, D3DVSDT_FLOAT3 ), // Position
D3DVSD_REG( 1, D3DVSDT_FLOAT3 ), // Normal
D3DVSD_REG( 2, D3DVSDT_FLOAT2 ), // Tex coords 1
D3DVSD_REG( 3, D3DVSDT_FLOAT2 ), // Tex coords 2
D3DVSD_REG( 4, D3DVSDT_FLOAT3 ), // Tagent U
D3DVSD_END()
};
LPD3DXBUFFER pCode;
D3DXAssembleShader(strHouseDiffusePixelShader,strlen(strHouseDiffusePixelShader),0,NULL,&pCode,NULL);
BaseGraphicsLayer::GetDevice()->CreatePixelShader((DWORD*)pCode->GetBufferPointer(),&m_dwHouseDiffusePixelShader);
pCode->Release();
D3DXAssembleShader(strHouseDiffuseVertexShader,strlen(strHouseDiffuseVertexShader),0,NULL,&pCode,NULL);
BaseGraphicsLayer::GetDevice()->CreateVertexShader( dwBumpVertexDecl, (DWORD*)pCode->GetBufferPointer(), &m_dwHouseDiffuseVertexShader, 0 );
pCode->Release();
D3DXAssembleShader(strHouseSpecularPixelShader,strlen(strHouseSpecularPixelShader),0,NULL,&pCode,NULL);
BaseGraphicsLayer::GetDevice()->CreatePixelShader((DWORD*)pCode->GetBufferPointer(),&m_dwHouseSpecularPixelShader);
pCode->Release();
D3DXAssembleShader(strHouseSpecularVertexShader,strlen(strHouseSpecularVertexShader),0,NULL,&pCode,NULL);
BaseGraphicsLayer::GetDevice()->CreateVertexShader( dwBumpVertexDecl, (DWORD*)pCode->GetBufferPointer(), &m_dwHouseSpecularVertexShader, 0 );
pCode->Release();
char strNormalizeCubeMap[256];
sprintf(strNormalizeCubeMap,"%s\\%s",NATURETEXTUREPATH,"NormalizeCubeMap.dds");
D3DXCreateCubeTextureFromFile(CSceneManager::GetDevice(),strNormalizeCubeMap,&m_pNormalizeCubeMap);
//D3DXCreateCubeTextureFromFile(CSceneManager::GetDevice(),"c:/NormalizeCubeMap.dds",&m_pNormalizeCubeMap);
}
/*
if(m_dwShadowMapVertexShader==0xffffffff && GF3OPTION==1)
{
DWORD dwMultiVertexDecl[] =
{
D3DVSD_STREAM( 0 ),
D3DVSD_REG( 0, D3DVSDT_FLOAT3 ), // Position
D3DVSD_REG( 1, D3DVSDT_D3DCOLOR),
D3DVSD_REG( 2, D3DVSDT_D3DCOLOR),
D3DVSD_REG( 3, D3DVSDT_FLOAT2 ), // Tex coords 1
D3DVSD_REG( 4, D3DVSDT_FLOAT2 ), // Tex coords 2
D3DVSD_END()
};
DWORD dwDetailVertexDecl[] =
{
D3DVSD_STREAM( 0 ),
D3DVSD_REG( 0, D3DVSDT_FLOAT3 ), // Position
D3DVSD_REG( 1, D3DVSDT_FLOAT3 ),
D3DVSD_REG( 2, D3DVSDT_FLOAT2 ), // Tex coords 1
D3DVSD_REG( 3, D3DVSDT_FLOAT2 ), // Tex coords 2
D3DVSD_END()
};
char strShaderPath[256];
sprintf(strShaderPath,"%s%s",SHADERPATH,"ShadowMap.vsh");
LPD3DXBUFFER pCode;
D3DXAssembleShaderFromFile(strShaderPath,0,NULL,&pCode,NULL);
BaseGraphicsLayer::GetDevice()->CreateVertexShader( dwDetailVertexDecl,
(DWORD*)pCode->GetBufferPointer(),
&m_dwShadowMapVertexShader, 0 );
pCode->Release();
sprintf(strShaderPath,"%s%s",SHADERPATH,"ShadowMap.psh");
D3DXAssembleShaderFromFile(strShaderPath,0,NULL,&pCode,NULL);
BaseGraphicsLayer::GetDevice()->CreatePixelShader((DWORD*)pCode->GetBufferPointer(),
&m_dwShadowMapPixelShader);
pCode->Release();
}
*/
}
CHouseObject::~CHouseObject()
{
int i;
if(m_pBspObject)
{
delete m_pBspObject;
m_pBspObject=NULL;
}
for(i=0;i<m_pBackupVertex.num;i++)
delete[] m_pBackupVertex[i];
for(i=0;i<m_pBackupTmp.num;i++)
delete[] m_pBackupTmp[i];
m_pBackupVertex.num = 0;
m_pBackupTmp.num = 0;
}
bool CHouseObject::SettingNight(bool bNight)
{
if(bNight == m_bConvertNight)
return bNight;
// Data Load failed <20><> <20>ǹ<EFBFBD><C7B9≯<EFBFBD>..
if(m_bNightMap == false || m_bNightUv == false)
return false;
int cObject = 0;
m_bConvertNight = bNight;
if(m_pOutHouseObject)
{
m_pOutHouseObject->AllLockBuffer();
for(int i=0;i<m_pOutHouseObject->m_pVertexBuffer.num;i++)
{
memcpy(m_pBackupTmp[i],m_pOutHouseObject->m_pVertex[i],sizeof(MultiVertex) * m_pOutHouseObject->m_nVertex[i]);
memcpy(m_pOutHouseObject->m_pVertex[i],m_pBackupVertex[i],sizeof(MultiVertex) * m_pOutHouseObject->m_nVertex[i]);
memcpy(m_pBackupVertex[i],m_pBackupTmp[i],sizeof(MultiVertex) * m_pOutHouseObject->m_nVertex[i]);
}
m_pOutHouseObject->AllUnlockBuffer();
}
return m_bConvertNight;
}
const long MAX_OBJECT=100;
void CHouseObject::GenerateNewLightmap(int iValue,matrix matSet,matrix matHouseTM,CSectorLight *pLights,int iLights)
{
WBLightMapGenerator NewGenerator;
int i,j,k,l;
char de[256];
if(m_pOutHouseObject->m_dwShader!=MultiFVF)
{
m_pOutHouseObject->ConvertMulti();
if(m_pMedHouseObject)
m_pMedHouseObject->ConvertMulti();
if(m_pInHouseObject)
m_pInHouseObject->ConvertMulti();
}
int cObjectScene=0;
for(cObjectScene=0;cObjectScene<m_ObjectList.num;cObjectScene++)
{
m_ObjectList[cObjectScene]->m_pObject->AllLockBuffer();
}
// LightMap Generator
List<MultiVertex*> pMeshVertex;
List<WORD*> pMeshIndices;
List<int> nMeshVertex;
List<long> nMeshIndices;
List<int*> IndicesUsed;
int cObject = 0;
if(m_pOutHouseObject)
{
m_pOutHouseObject->AllLockBuffer();
for(cObject=0;cObject<m_pOutHouseObject->GetObjectCount();cObject++)
{
int *pUsedIndices=new int[m_pOutHouseObject->m_nIndices[cObject]];
memset(pUsedIndices,-1,sizeof(int)*m_pOutHouseObject->m_nIndices[cObject]);
IndicesUsed.Add(pUsedIndices);
pMeshVertex.Add((MultiVertex*)m_pOutHouseObject->m_pVertex[cObject]);
pMeshIndices.Add(m_pOutHouseObject->m_pIndices[cObject]);
nMeshIndices.Add(m_pOutHouseObject->m_nIndices[cObject]);
nMeshVertex.Add(m_pOutHouseObject->m_nVertex[cObject]);
}
}
/* vector3 *vecTestClassfy[3];
vector3 vecTestNormal;
for(int cInObject=0;cInObject<nMeshIndices.num;cInObject++)
{
MultiVertex *pTestVertex=pMeshVertex[cInObject];
WORD *pTestIndices=pMeshIndices[cInObject];
for(cIndices=0;cIndices<nMeshIndices[cInObject];cIndices++)
{
if(IndicesUsed[cInObject][cIndices]==-1)
{
vecTestClassfy[0]=&pTestVertex[pTestIndices[cIndices*3+0]].v;
vecTestClassfy[1]=&pTestVertex[pTestIndices[cIndices*3+1]].v;
vecTestClassfy[2]=&pTestVertex[pTestIndices[cIndices*3+2]].v;
vecTestNormal=(*vecTestClassfy[1]-*vecTestClassfy[0])^(*vecTestClassfy[2]-*vecTestClassfy[0]);
vecTestNormal.Normalize();
if(!(vecTestNormal == vecFirstNormal))
continue;
fDistance[0]= vecFirstNormal * ( (*vecTestClassfy[0])-(*vecFirstDetect[0]));
fDistance[1]= vecFirstNormal * ( (*vecTestClassfy[1])-(*vecFirstDetect[0]));
fDistance[2]= vecFirstNormal * ( (*vecTestClassfy[2])-(*vecFirstDetect[0]));
if( fDistance[0] >= -NEARPLANEVALUE && fDistance[0] <= NEARPLANEVALUE &&
fDistance[1] >= -NEARPLANEVALUE && fDistance[1] <= NEARPLANEVALUE &&
fDistance[2] >= -NEARPLANEVALUE && fDistance[2] <= NEARPLANEVALUE)
{
vecClassfy.Add(vecTestClassfy[0]);
vecClassfy.Add(vecTestClassfy[1]);
vecClassfy.Add(vecTestClassfy[2]);
IndicesUsed[cInObject][cIndices]=UsedPlane;
cUsedClassfy++;
continue;
} //IF
} //if
} //for
}//for
*/
/* if(m_pInHouseObject)
{
m_pInHouseObject->AllLockBuffer();
for(cObject=0;cObject<m_pInHouseObject->GetObjectCount();cObject++)
{
pMeshVertex.Add((MultiVertex*)m_pInHouseObject->m_pVertex[cObject]);
pMeshIndices.Add(m_pInHouseObject->m_pIndices[cObject]);
nMeshIndices.Add(m_pInHouseObject->m_nIndices[cObject]);
nMeshVertex.Add(m_pInHouseObject->m_nVertex[cObject]);
}
}
if(m_pMedHouseObject)
{
m_pMedHouseObject->AllLockBuffer();
for(cObject=0;cObject<m_pMedHouseObject->GetObjectCount();cObject++)
{
pMeshVertex.Add((MultiVertex*)m_pMedHouseObject->m_pVertex[cObject]);
pMeshIndices.Add(m_pMedHouseObject->m_pIndices[cObject]);
nMeshIndices.Add(m_pMedHouseObject->m_nIndices[cObject]);
nMeshVertex.Add(m_pMedHouseObject->m_nVertex[cObject]);
}
}
*/
AllocConsole();
HANDLE hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
COORD cd;
DWORD dwWordLens;
char strObjectInfo[256];
sprintf(strObjectInfo,"Generate Face to House");
cd.X=0;
cd.Y=0;
WriteConsoleOutputCharacter(hStdOut,strObjectInfo,strlen(strObjectInfo),cd,&dwWordLens);
// FILE *fp = fopen("c:\\test.txt","wt");
// Generate Face
for(i = 0; i < nMeshIndices.num; i++ )
{
/* for( j = 0 ; j < nMeshVertex[i]; j++)
{
fprintf(fp,"%f %f %f\n",pMeshVertex[i][j].v.x,pMeshVertex[i][j].v.y,pMeshVertex[i][j].v.z);
}*/
for( j = 0 ;j < nMeshIndices[i]; j++ )
{
WBLightMapFace *pFace = new WBLightMapFace;
pFace->m_iVerts = 3;
pFace->m_pVerts = new WBLightVertex[3];
pFace->m_iIndex[0] = pMeshIndices[i][(j * 3)];
pFace->m_iIndex[1] = pMeshIndices[i][(j * 3)+ 1];
pFace->m_iIndex[2] = pMeshIndices[i][(j * 3)+ 2];
pFace->m_iObject = i;
/* fprintf(fp,"Object %d : %d %d %d\n",pFace->m_iObject, pFace->m_iIndex[0],
pFace->m_iIndex[1],
pFace->m_iIndex[2]);*/
pFace->m_pVerts[0].m_vecPos = D3DXVECTOR3(pMeshVertex[i][pFace->m_iIndex[0]].v.x,
pMeshVertex[i][pFace->m_iIndex[0]].v.y,
pMeshVertex[i][pFace->m_iIndex[0]].v.z);
pFace->m_pVerts[1].m_vecPos = D3DXVECTOR3(pMeshVertex[i][pFace->m_iIndex[1]].v.x,
pMeshVertex[i][pFace->m_iIndex[1]].v.y,
pMeshVertex[i][pFace->m_iIndex[1]].v.z);
pFace->m_pVerts[2].m_vecPos = D3DXVECTOR3(pMeshVertex[i][pFace->m_iIndex[2]].v.x,
pMeshVertex[i][pFace->m_iIndex[2]].v.y,
pMeshVertex[i][pFace->m_iIndex[2]].v.z);
/* fprintf(fp,"%f %f %f\n%f %f %f\n%f %f %f\n",pFace->m_pVerts[0].m_vecPos.x,pFace->m_pVerts[0].m_vecPos.y,pFace->m_pVerts[0].m_vecPos.z,
pFace->m_pVerts[1].m_vecPos.x,pFace->m_pVerts[1].m_vecPos.y,pFace->m_pVerts[1].m_vecPos.z,
pFace->m_pVerts[2].m_vecPos.x,pFace->m_pVerts[2].m_vecPos.y,pFace->m_pVerts[2].m_vecPos.z);
*/
D3DXVECTOR3 vecNormal;
D3DXVECTOR3 vec1 = pFace->m_pVerts[2].m_vecPos - pFace->m_pVerts[0].m_vecPos;
D3DXVECTOR3 vec2 = pFace->m_pVerts[1].m_vecPos - pFace->m_pVerts[0].m_vecPos;
D3DXVec3Cross(&vecNormal,&vec2,&vec1);
D3DXVec3Normalize(&vecNormal,&vecNormal);
/* if(fabs(vecNormal.x) <= 0.03)
vecNormal.x = 0.0f;
if(fabs(vecNormal.y) <= 0.03)
vecNormal.y = 0.0f;
if(fabs(vecNormal.z) <= 0.03)
vecNormal.z = 0.0f;
D3DXVec3Normalize(&vecNormal,&vecNormal);
*/
pFace->m_vecNormal = vecNormal;
pFace->GetMinMax();
NewGenerator.InputFace(pFace);
}
}
// fclose(fp);
sprintf(strObjectInfo,"Generate Light to House");
cd.X=0;
cd.Y=1;
WriteConsoleOutputCharacter(hStdOut,strObjectInfo,strlen(strObjectInfo),cd,&dwWordLens);
// Input Light
WBLight *pWBLights = new WBLight[iLights];
for( i = 0; i < iLights; i++ )
{
////////////////
D3DXMATRIX matTmp;
D3DXMATRIX matInv;
D3DXMatrixIdentity(&matTmp);
matTmp._11 = matHouseTM._11;
matTmp._12 = matHouseTM._12;
matTmp._13 = matHouseTM._13;
matTmp._14 = matHouseTM._14;
matTmp._21 = matHouseTM._21;
matTmp._22 = matHouseTM._22;
matTmp._23 = matHouseTM._23;
matTmp._24 = matHouseTM._24;
matTmp._31 = matHouseTM._31;
matTmp._32 = matHouseTM._32;
matTmp._33 = matHouseTM._33;
matTmp._34 = matHouseTM._34;
matTmp._41 = matHouseTM._41;
matTmp._42 = matHouseTM._42;
matTmp._43 = matHouseTM._43;
matTmp._44 = matHouseTM._44;
D3DXMatrixInverse(&matInv,NULL,&matTmp);
D3DXMatrixIdentity(&matTmp);
matTmp._41 = pLights[i].m_vecPos.x;
matTmp._42 = pLights[i].m_vecPos.y;
matTmp._43 = pLights[i].m_vecPos.z;
D3DXMatrixMultiply(&matTmp,&matTmp,&matInv);
pWBLights[i].m_vecPos.x = matTmp._41;
pWBLights[i].m_vecPos.y = matTmp._42;
pWBLights[i].m_vecPos.z = matTmp._43;
/////
pWBLights[i].m_vecColor = pLights[i].m_vecColor;
pWBLights[i].m_vecColor.x = pWBLights[i].m_vecColor.x / 255.0f;
pWBLights[i].m_vecColor.y = pWBLights[i].m_vecColor.y / 255.0f;
pWBLights[i].m_vecColor.z = pWBLights[i].m_vecColor.z / 255.0f;
pWBLights[i].m_fRange = pLights[i].m_fRange;
NewGenerator.InputLight(&(pWBLights[i]));
NewGenerator.m_fShadowFactor = pLights[i].m_fShadowFactors;
NewGenerator.m_iLightSamples = pLights[i].m_iLightSamples;
NewGenerator.m_iShadowSamples = pLights[i].m_iShadowSamples;
NewGenerator.m_iLightMapAmb = pLights[i].m_iAmbient;
NewGenerator.m_fExposure = pLights[i].m_fExpose;
}
// Calc LightMap
sprintf(strObjectInfo,"Generate Lightmap");
cd.X=0;
cd.Y=2;
WriteConsoleOutputCharacter(hStdOut,strObjectInfo,strlen(strObjectInfo),cd,&dwWordLens);
NewGenerator.LightMapGenerate(iValue);
delete[] pWBLights;
byte m_ucLight[262144];
int icount = 0;
int icount2 = 0;
for(j=0;j < 256;j++) {
for(k=0;k < 256;k++) {
m_ucLight[icount2++] = (byte)(NewGenerator.m_lstLightMapTexs[0]->bmp[icount + 2]); //B
m_ucLight[icount2++] = (byte)(NewGenerator.m_lstLightMapTexs[0]->bmp[icount + 1]); //G
m_ucLight[icount2++] = (byte)(NewGenerator.m_lstLightMapTexs[0]->bmp[icount]); //R
m_ucLight[icount2++] = (byte)255;
icount +=3;
}
}
m_BackupLightmap.CreateEmptyTexture(256,256,0,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED);
m_BackupLightmap.FillTexture(m_ucLight);
// fill uv
if(m_pOutHouseObject)
{
for(int i=0;i<m_pOutHouseObject->m_pVertexBuffer.num;i++)
{
MultiVertex *pVertexNode = new MultiVertex[m_pOutHouseObject->m_nVertex[i]];
MultiVertex *pVertexNode2 = new MultiVertex[m_pOutHouseObject->m_nVertex[i]];
memcpy(pVertexNode,m_pOutHouseObject->m_pVertex[i],sizeof(MultiVertex)*(m_pOutHouseObject->m_nVertex[i]));
m_pBackupVertex.Add(pVertexNode);
m_pBackupTmp.Add(pVertexNode2);
}
}
for( i = 0; i < NewGenerator.m_iFaces; i++)
{
int iObject = NewGenerator.m_lstFaces[i]->m_iObject;
for(j = 0; j < 3; j++)
{
int iCurrent = NewGenerator.m_lstFaces[i]->m_iIndex[j];
MultiVertex *pVerts = (MultiVertex *)(m_pBackupVertex[iObject]);
pVerts[iCurrent].tu1 = NewGenerator.m_lstFaces[i]->m_pVerts[j].m_vecTexcoord.x;
pVerts[iCurrent].tv1 = NewGenerator.m_lstFaces[i]->m_pVerts[j].m_vecTexcoord.y;
}
}
// Uv save
/* char HouseMeshObjectPath[MAX_NAMEBUFFER] = {0};
FILE *fp = NULL;
sprintf(HouseMeshObjectPath,"%s%s",HOUSEOBJECTPATH,m_strOutName);
int iLength = strlen(HouseMeshObjectPath);
HouseMeshObjectPath[iLength - 1] = '\0';
HouseMeshObjectPath[iLength - 2] = 'v';
HouseMeshObjectPath[iLength - 3] = 'u';
fp = fopen(HouseMeshObjectPath,"wb");
for(int i=0;i<m_pOutHouseObject->m_pVertexBuffer.num;i++)
{
fwrite((m_pBackupVertex[i]),sizeof(MultiVertex)*(m_pOutHouseObject->m_nVertex[i]),1,fp);
}
m_bConvertNight = false;
m_bNightData = true;
fclose(fp);
*/
/*
for( i = 0; i < NewGenerator.m_iFaces; i++)
{
int iObject = NewGenerator.m_lstFaces[i]->m_iObject;
for(j = 0; j < 3; j++)
{
int iCurrent = NewGenerator.m_lstFaces[i]->m_iIndex[j];
MultiVertex *pVerts = (MultiVertex *)(m_pOutHouseObject->m_pVertex[iObject]);
pVerts[iCurrent].tu1 = NewGenerator.m_lstFaces[i]->m_pVerts[j].m_vecTexcoord.x;
pVerts[iCurrent].tv1 = NewGenerator.m_lstFaces[i]->m_pVerts[j].m_vecTexcoord.y;
}
}
*/
sprintf(strObjectInfo,"Save Lightmap");
cd.X=0;
cd.Y=3;
WriteConsoleOutputCharacter(hStdOut,strObjectInfo,strlen(strObjectInfo),cd,&dwWordLens);
for(cObjectScene=0;cObjectScene<m_ObjectList.num;cObjectScene++)
{
m_ObjectList[cObjectScene]->m_pObject->AllUnlockBuffer();
}
if(m_pOutHouseObject)
m_pOutHouseObject->AllUnlockBuffer();
}
void CHouseObject::GenerateCaldronPointLightmap(matrix matSet,matrix matHouseTM,CSectorLight *pLights,int iLights)
{
char de[256];
if(!m_pInHouseObject)
return;
int iValue = 1;
FILE *fp = fopen("c:/mp-project/CaldronLightData.dat","wb+");
fwrite(&iLights,sizeof(int),1,fp);
D3DXVECTOR3 vecPos,vecColor;
float fRad;
/// Light Save File Create
for(int i = 0; i < iLights; i++ )
{
////////////////
D3DXMATRIX matTmp;
D3DXMATRIX matInv;
D3DXMatrixIdentity(&matTmp);
matTmp._11 = matHouseTM._11;
matTmp._12 = matHouseTM._12;
matTmp._13 = matHouseTM._13;
matTmp._14 = matHouseTM._14;
matTmp._21 = matHouseTM._21;
matTmp._22 = matHouseTM._22;
matTmp._23 = matHouseTM._23;
matTmp._24 = matHouseTM._24;
matTmp._31 = matHouseTM._31;
matTmp._32 = matHouseTM._32;
matTmp._33 = matHouseTM._33;
matTmp._34 = matHouseTM._34;
matTmp._41 = matHouseTM._41;
matTmp._42 = matHouseTM._42;
matTmp._43 = matHouseTM._43;
matTmp._44 = matHouseTM._44;
D3DXMatrixInverse(&matInv,NULL,&matTmp);
D3DXMatrixIdentity(&matTmp);
matTmp._41 = pLights[i].m_vecPos.x;
matTmp._42 = pLights[i].m_vecPos.y;
matTmp._43 = pLights[i].m_vecPos.z;
D3DXMatrixMultiply(&matTmp,&matTmp,&matInv);
vecPos.x = matTmp._41;
vecPos.y = matTmp._42;
vecPos.z = matTmp._43;
vecColor = pLights[i].m_vecColor / 255.0f;
fRad = pLights[i].m_fRange;
fwrite(&vecPos,sizeof(D3DXVECTOR3),1,fp);
fwrite(&vecColor,sizeof(D3DXVECTOR3),1,fp);
fwrite(&fRad,sizeof(float),1,fp);
}
fclose(fp);
char strArg[256];
char strDDSName[MAX_NAMEBUFFER];
char *strTextureName = strrchr(m_pInHouseObject->m_strMeshName,'\\');
sprintf(strDDSName,"%s\\%s",LIGHTMAPTEXTUREPATH,strTextureName);
strTextureName = strrchr(strDDSName,'.');
(*strTextureName) = '.';
strTextureName++;
(*strTextureName) = 'd';
strTextureName++;
(*strTextureName) = 'd';
strTextureName++;
(*strTextureName) = 's';
strTextureName++;
(*strTextureName) = 0;
D3DXVECTOR3 vecLight = D3DXVECTOR3(1.0f,1.0f,1.0f);
switch(MessageBox(NULL,"<EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD> ?","MSG",MB_YESNO))
{
case IDNO:
sprintf(strArg,"%s %d %f %f %f %s %s %s %d","Caldron_LightmapGenerator",iValue,vecLight.x,vecLight.y,vecLight.z,m_pInHouseObject->m_strMeshName,"t",strDDSName,0);
break;
case IDYES:
sprintf(strArg,"%s %d %f %f %f %s %s %s %d","Caldron_LightmapGenerator",iValue,vecLight.x,vecLight.y,vecLight.z,m_pInHouseObject->m_strMeshName,"t",strDDSName,1);
break;
}
MessageBox(NULL,strArg,"tt",MB_OK);
if(m_pInHouseObject)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess(
"c:/mp-project/Caldron_LightmapGenerator.exe",
strArg, // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
CREATE_NEW_PROCESS_GROUP, // No creation flags.
NULL, // Use parent's environment block.
"c:/mp-project/", // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
MessageBox(NULL,"CreateProcess failed.","Error",MB_OK);
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
}
void CHouseObject::GenerateCaldronLightmap(matrix matSet,matrix matHouseTM,CSectorLight *pLights,int iLights)
{
char de[256];
if(!m_pOutHouseObject)
return;
FILE *fp = fopen("c:/mp-project/CaldronLightData.dat","wb+");
fwrite(&iLights,sizeof(int),1,fp);
D3DXVECTOR3 vecPos,vecColor;
float fRad;
/// Light Save File Create
for(int i = 0; i < iLights; i++ )
{
////////////////
D3DXMATRIX matTmp;
D3DXMATRIX matInv;
D3DXMatrixIdentity(&matTmp);
matTmp._11 = matHouseTM._11;
matTmp._12 = matHouseTM._12;
matTmp._13 = matHouseTM._13;
matTmp._14 = matHouseTM._14;
matTmp._21 = matHouseTM._21;
matTmp._22 = matHouseTM._22;
matTmp._23 = matHouseTM._23;
matTmp._24 = matHouseTM._24;
matTmp._31 = matHouseTM._31;
matTmp._32 = matHouseTM._32;
matTmp._33 = matHouseTM._33;
matTmp._34 = matHouseTM._34;
matTmp._41 = matHouseTM._41;
matTmp._42 = matHouseTM._42;
matTmp._43 = matHouseTM._43;
matTmp._44 = matHouseTM._44;
D3DXMatrixInverse(&matInv,NULL,&matTmp);
D3DXMatrixIdentity(&matTmp);
matTmp._41 = pLights[i].m_vecPos.x;
matTmp._42 = pLights[i].m_vecPos.y;
matTmp._43 = pLights[i].m_vecPos.z;
D3DXMatrixMultiply(&matTmp,&matTmp,&matInv);
vecPos.x = matTmp._41;
vecPos.y = matTmp._42;
vecPos.z = matTmp._43;
vecColor = pLights[i].m_vecColor / 255.0f;
fRad = pLights[i].m_fRange;
fwrite(&vecPos,sizeof(D3DXVECTOR3),1,fp);
fwrite(&vecColor,sizeof(D3DXVECTOR3),1,fp);
fwrite(&fRad,sizeof(float),1,fp);
}
fclose(fp);
vector3 vecLight(-1.0f,-1.0f,-1.0f);
vecLight=matSet*vecLight;
vecLight.Normalize();
char strArg[256];
char strDDSName[MAX_NAMEBUFFER];
char *strTextureName = strrchr(m_pOutHouseObject->m_strMeshName,'\\');
sprintf(strDDSName,"%s\\%s",LIGHTMAPTEXTUREPATH,strTextureName);
strTextureName = strrchr(strDDSName,'.');
(*strTextureName) = '.';
strTextureName++;
(*strTextureName) = 'd';
strTextureName++;
(*strTextureName) = 'd';
strTextureName++;
(*strTextureName) = 's';
strTextureName++;
(*strTextureName) = 0;
int iValue = 2;
/* if(MessageBox(NULL,"<22>𷺼<EFBFBD> + <20><><EFBFBD><EFBFBD>Ʈ + <20><>ī<EFBFBD><C4AB>?","MSG",MB_YESNO) == IDNO)
{
iValue = 3;
}
*/
switch(MessageBox(NULL,"<EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD> ?","MSG",MB_YESNO))
{
case IDNO:
if(m_pMedHouseObject)
sprintf(strArg,"%s %d %f %f %f %s %s %s %d","Caldron_LightmapGenerator",iValue,vecLight.x,vecLight.y,vecLight.z,m_pOutHouseObject->m_strMeshName,m_pMedHouseObject->m_strMeshName,strDDSName,0);
else
sprintf(strArg,"%s %d %f %f %f %s %s %s %d","Caldron_LightmapGenerator",iValue,vecLight.x,vecLight.y,vecLight.z,m_pOutHouseObject->m_strMeshName,"t",strDDSName,0);
break;
case IDYES:
if(m_pMedHouseObject)
sprintf(strArg,"%s %d %f %f %f %s %s %s %d","Caldron_LightmapGenerator",iValue,vecLight.x,vecLight.y,vecLight.z,m_pOutHouseObject->m_strMeshName,m_pMedHouseObject->m_strMeshName,strDDSName,1);
else
sprintf(strArg,"%s %d %f %f %f %s %s %s %d","Caldron_LightmapGenerator",iValue,vecLight.x,vecLight.y,vecLight.z,m_pOutHouseObject->m_strMeshName,"t",strDDSName,1);
break;
}
MessageBox(NULL,strArg,"tt",MB_OK);
if(m_pOutHouseObject)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess(
"c:/mp-project/Caldron_LightmapGenerator.exe",
strArg, // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
CREATE_NEW_PROCESS_GROUP, // No creation flags.
NULL, // Use parent's environment block.
"c:/mp-project/", // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
MessageBox(NULL,"CreateProcess failed.","Error",MB_OK);
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
}
void CHouseObject::GenerateLightmap(matrix matSet,matrix matHouseTM,int LightmapMode)
{
char de[256];
if(m_pOutHouseObject->m_dwShader!=MultiFVF)
{
m_pOutHouseObject->ConvertMulti();
if(m_pMedHouseObject)
m_pMedHouseObject->ConvertMulti();
if(m_pInHouseObject)
m_pInHouseObject->ConvertMulti();
}
int cObjectScene=0;
for(cObjectScene=0;cObjectScene<m_ObjectList.num;cObjectScene++)
{
m_ObjectList[cObjectScene]->m_pObject->AllLockBuffer();
}
vector3 vecLight(1.0f,1.0f,1.0f);
vecLight=matSet*vecLight;
vecLight.Normalize();
vector3 *vecFirstDetect[3];
List<vector3*> vecClassfy;
List<int*> IndicesUsed;
List<int> LightmapSizeX;
List<int> LightmapSizeY;
int UsedPlane=0;
int cObject=0,cTotalObject=0;
List<MultiVertex*> pMeshVertex;
List<WORD*> pMeshIndices;
List<int> nMeshVertex;
int cIntersectionPoly=0;
int NotUsedPlane=0;
if(m_pOutHouseObject)
{
m_pOutHouseObject->AllLockBuffer();
for(cObject=0;cObject<m_pOutHouseObject->GetObjectCount();cObject++,cTotalObject++)
{
int *pUsedIndices=new int[m_pOutHouseObject->m_nIndices[cObject]];
memset(pUsedIndices,-1,sizeof(int)*m_pOutHouseObject->m_nIndices[cObject]);
IndicesUsed.Add(pUsedIndices);
pMeshVertex.Add((MultiVertex*)m_pOutHouseObject->m_pVertex[cObject]);
pMeshIndices.Add(m_pOutHouseObject->m_pIndices[cObject]);
m_nIndices.Add(m_pOutHouseObject->m_nIndices[cObject]);
nMeshVertex.Add(m_pOutHouseObject->m_nVertex[cObject]);
}
}
if(m_pInHouseObject)
{
m_pInHouseObject->AllLockBuffer();
for(cObject=0;cObject<m_pInHouseObject->GetObjectCount();cObject++,cTotalObject++)
{
int *pUsedIndices=new int[m_pInHouseObject->m_nIndices[cObject]];
memset(pUsedIndices,-1,sizeof(int)*m_pInHouseObject->m_nIndices[cObject]);
IndicesUsed.Add(pUsedIndices);
pMeshVertex.Add((MultiVertex*)m_pInHouseObject->m_pVertex[cObject]);
pMeshIndices.Add(m_pInHouseObject->m_pIndices[cObject]);
m_nIndices.Add(m_pInHouseObject->m_nIndices[cObject]);
nMeshVertex.Add(m_pInHouseObject->m_nVertex[cObject]);
}
}
cIntersectionPoly=cTotalObject;
if(m_pMedHouseObject)
{
m_pMedHouseObject->AllLockBuffer();
for(cObject=0;cObject<m_pMedHouseObject->GetObjectCount();cObject++,cTotalObject++)
{
int *pUsedIndices=new int[m_pMedHouseObject->m_nIndices[cObject]];
memset(pUsedIndices,-1,sizeof(int)*m_pMedHouseObject->m_nIndices[cObject]);
IndicesUsed.Add(pUsedIndices);
pMeshVertex.Add((MultiVertex*)m_pMedHouseObject->m_pVertex[cObject]);
pMeshIndices.Add(m_pMedHouseObject->m_pIndices[cObject]);
m_nIndices.Add(m_pMedHouseObject->m_nIndices[cObject]);
nMeshVertex.Add(m_pMedHouseObject->m_nVertex[cObject]);
}
}
int NoWantedLightmap=0;
//CTexture *lightmap=new CTexture[1024];
List<DWORD*> LightmapStorage;
float fMax_PlaneArea=0.0f;
float fMin_PlaneArea=100000000.0f;
float fTotal_PlaneArea=0.0f;
AllocConsole();
HANDLE hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
int a=strlen("abcd");
COORD cd;
DWORD dwWordLens;
for(cObject=0;cObject<IndicesUsed.num;cObject++)
{
bool isRemainIndices=true;
MultiVertex *pVertex=pMeshVertex[cObject];
WORD *pIndices=pMeshIndices[cObject];
char strObjectInfo[256];
sprintf(strObjectInfo,"Object %d/%d",cObject,IndicesUsed.num);
cd.X=0;
cd.Y=0;
WriteConsoleOutputCharacter(hStdOut,strObjectInfo,strlen(strObjectInfo),cd,&dwWordLens);
while(isRemainIndices)
{
int cRemainPoly=0;
for(int cIndices=0;cIndices<m_nIndices[cObject];cIndices++)
{
if(IndicesUsed[cObject][cIndices]==-1)
{
vecFirstDetect[0]=&pVertex[ pIndices[cIndices*3+0] ].v;
vecFirstDetect[1]=&pVertex[ pIndices[cIndices*3+1] ].v;
vecFirstDetect[2]=&pVertex[ pIndices[cIndices*3+2] ].v;
IndicesUsed[cObject][cIndices]=UsedPlane;
break;
}
}
if(cIndices==m_nIndices[cObject])
break;
vecClassfy.num=0;
vecClassfy.Add(vecFirstDetect[0]);
vecClassfy.Add(vecFirstDetect[1]);
vecClassfy.Add(vecFirstDetect[2]);
int cUsedClassfy=1;
float fDistance[3];
vector3 vecFirstNormal=(*vecFirstDetect[1]-*vecFirstDetect[0])^(*vecFirstDetect[2]-*vecFirstDetect[0]);
vecFirstNormal.Normalize();
vector3 *vecTestClassfy[3];
vector3 vecTestNormal;
for(int cInObject=0;cInObject<m_nIndices.num;cInObject++)
{
MultiVertex *pTestVertex=pMeshVertex[cInObject];
WORD *pTestIndices=pMeshIndices[cInObject];
for(cIndices=0;cIndices<m_nIndices[cInObject];cIndices++)
{
if(IndicesUsed[cInObject][cIndices]==-1)
{
cRemainPoly++;
vecTestClassfy[0]=&pTestVertex[pTestIndices[cIndices*3+0]].v;
vecTestClassfy[1]=&pTestVertex[pTestIndices[cIndices*3+1]].v;
vecTestClassfy[2]=&pTestVertex[pTestIndices[cIndices*3+2]].v;
vecTestNormal=(*vecTestClassfy[1]-*vecTestClassfy[0])^(*vecTestClassfy[2]-*vecTestClassfy[0]);
vecTestNormal.Normalize();
if(!(vecTestNormal == vecFirstNormal))
continue;
// vecTestClassfy[0])-(*vecFirstDetect[0]) <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> vecFirstNormal<61><6C><EFBFBD>Ϳ<EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>
fDistance[0]= vecFirstNormal * ( (*vecTestClassfy[0])-(*vecFirstDetect[0]));
fDistance[1]= vecFirstNormal * ( (*vecTestClassfy[1])-(*vecFirstDetect[0]));
fDistance[2]= vecFirstNormal * ( (*vecTestClassfy[2])-(*vecFirstDetect[0]));
if( fDistance[0] >= -NEARPLANEVALUE && fDistance[0] <= NEARPLANEVALUE &&
fDistance[1] >= -NEARPLANEVALUE && fDistance[1] <= NEARPLANEVALUE &&
fDistance[2] >= -NEARPLANEVALUE && fDistance[2] <= NEARPLANEVALUE)
{
vecClassfy.Add(vecTestClassfy[0]);
vecClassfy.Add(vecTestClassfy[1]);
vecClassfy.Add(vecTestClassfy[2]);
IndicesUsed[cInObject][cIndices]=UsedPlane;
cUsedClassfy++;
continue;
} //IF
} //if
} //for
}//for
vector3 C= vecFirstNormal^vector3(0.0f,1.0f,0.0f);
C.Normalize();
float fAngleZ=acosf(vecFirstNormal.y);
sprintf(de,"Angle = %f",fAngleZ);
//MessageBox(0,de,0,0);
matrix matPlaneRot;
matPlaneRot.Rotation(C,-fAngleZ);
if(fAngleZ>=-0.005f && fAngleZ<=0.005f) matPlaneRot.MakeIdent();
if(fAngleZ>=3.140f) matPlaneRot.MakeIdent();
if(vecFirstNormal == vector3(0.0f,1.0f,0.0f))
matPlaneRot.MakeIdent();
if(vecFirstNormal == vector3(0.0f,-1.0f,0.0f))
matPlaneRot.MakeIdent();
matrix matPos;
matPos.Translation(vector3(vecFirstDetect[0]->x,vecFirstDetect[0]->y,vecFirstDetect[0]->z));
matPos=matPos*matPlaneRot;
sprintf(de,"vector = %f, %f, %f",vecFirstDetect[0]->x,vecFirstDetect[0]->y,vecFirstDetect[0]->z);
//MessageBox(0,de,0,0);
float fMaxX,fMinX,fMaxZ,fMinZ;
fMaxX=matPos._41;fMaxZ=matPos._43;
sprintf(de,"Max = %f, %f",fMaxX,fMaxZ);
//MessageBox(0,de,0,0);
fMinX=matPos._41;fMinZ=matPos._43;
sprintf(de,"Min = %f, %f",fMinX,fMinZ);
//MessageBox(0,de,0,0);
vector3 *TempPos=new vector3[cUsedClassfy*3];
for(cIndices=0;cIndices<cUsedClassfy;cIndices++)
{
for(int Inner=0;Inner<3;Inner++)
{
matPos.Translation(vector3(vecClassfy[cIndices*3+Inner]->x,
vecClassfy[cIndices*3+Inner]->y,
vecClassfy[cIndices*3+Inner]->z));
matPos=matPos*matPlaneRot;
TempPos[cIndices*3+Inner].x=matPos._41;
TempPos[cIndices*3+Inner].y=matPos._42;
TempPos[cIndices*3+Inner].z=matPos._43;
if(fMaxX < TempPos[cIndices*3+Inner].x) fMaxX=TempPos[cIndices*3+Inner].x;
if(fMaxZ < TempPos[cIndices*3+Inner].z) fMaxZ=TempPos[cIndices*3+Inner].z;
if(fMinX > TempPos[cIndices*3+Inner].x) fMinX=TempPos[cIndices*3+Inner].x;
if(fMinZ > TempPos[cIndices*3+Inner].z) fMinZ=TempPos[cIndices*3+Inner].z;
}
}
float fInterX=fMaxX-fMinX;
float fInterZ=fMaxZ-fMinZ;
if( fabs(fInterX*fInterZ) > fMax_PlaneArea)
{
fMax_PlaneArea=fabs(fInterX*fInterZ);
}
if( fabs(fInterX*fInterZ) < fMin_PlaneArea)
{
fMin_PlaneArea=fabs(fInterX*fInterZ);
}
fTotal_PlaneArea+=fabs(fInterX*fInterZ);
int LightX=fabs(fInterX/PERLIGHTMAP)+1;
int LightY=fabs(fInterZ/PERLIGHTMAP)+1;
LightmapSizeX.Add(LightX);
LightmapSizeY.Add(LightY);
for(cIndices=0;cIndices<cUsedClassfy;cIndices++)
{
((MultiVertex*)vecClassfy[cIndices*3+0])->tu1=(TempPos[cIndices*3+0].x-fMinX)/fInterX;
((MultiVertex*)vecClassfy[cIndices*3+0])->tv1=(TempPos[cIndices*3+0].z-fMinZ)/fInterZ;
((MultiVertex*)vecClassfy[cIndices*3+1])->tu1=(TempPos[cIndices*3+1].x-fMinX)/fInterX;
((MultiVertex*)vecClassfy[cIndices*3+1])->tv1=(TempPos[cIndices*3+1].z-fMinZ)/fInterZ;
((MultiVertex*)vecClassfy[cIndices*3+2])->tu1=(TempPos[cIndices*3+2].x-fMinX)/fInterX;
((MultiVertex*)vecClassfy[cIndices*3+2])->tv1=(TempPos[cIndices*3+2].z-fMinZ)/fInterZ;
}
vector3 vecOri,vecU,vecV;
vecOri.x=fMinX;vecOri.y=TempPos[0].y;vecOri.z=fMinZ;
vecU.x=fMaxX;vecU.y=TempPos[0].y;vecU.z=fMinZ;
vecV.x=fMinX;vecV.y=TempPos[0].y;vecV.z=fMaxZ;
matPlaneRot.Rotation(C,fAngleZ);
if(fAngleZ>=-0.005f && fAngleZ<=0.005f) matPlaneRot.MakeIdent();
if(fAngleZ>=3.140f) matPlaneRot.MakeIdent();
if(vecFirstNormal == vector3(0.0f,1.0f,0.0f))
matPlaneRot.MakeIdent();
if(vecFirstNormal == vector3(0.0f,-1.0f,0.0f))
matPlaneRot.MakeIdent();
matPos.Translation(vecOri);
matPos=matPos*matPlaneRot;
vecOri=matPos.GetLoc();
matPos.Translation(vecU);
matPos=matPos*matPlaneRot;
vecU=matPos.GetLoc();
matPos.Translation(vecV);
matPos=matPos*matPlaneRot;
vecV=matPos.GetLoc();
//delete [] TempPos;
//vecU=(vecU-vecOri)/(LIGHTMAPSIZE);
//vecV=(vecV-vecOri)/(LIGHTMAPSIZE);
vecU=(vecU-vecOri)/(LightmapSizeX[UsedPlane]);
vecV=(vecV-vecOri)/(LightmapSizeY[UsedPlane]);
float fLightBright=vecFirstNormal*vecLight;
fLightBright+=0.3f;
color LightColor;
LightColor.r=(COLORVALUE)(0xff*fLightBright);
LightColor.g=(COLORVALUE)(0xff*fLightBright);
LightColor.b=(COLORVALUE)(0xff*fLightBright);
LightColor.a=0xff;
if(fLightBright<=0.0f)
{
if(LightmapMode==0)
{
LightColor.r=(COLORVALUE)(60);LightColor.g=(COLORVALUE)(60);LightColor.b=(COLORVALUE)(60);
LightColor.a=0xff;
}
else
{
LightColor.r=(COLORVALUE)(20);LightColor.g=(COLORVALUE)(20);LightColor.b=(COLORVALUE)(20);
LightColor.a=0xff;
}
}
if(fLightBright>1.0f)
{
LightColor.r=(COLORVALUE)(255);LightColor.g=(COLORVALUE)(255);LightColor.b=(COLORVALUE)(255);
LightColor.a=0xff;
}
vector3 *v[3];
DWORD *AddLightmap=new DWORD[LightmapSizeX[UsedPlane]*LightmapSizeY[UsedPlane]];
for(int j=0;j<LightmapSizeX[UsedPlane];j++)
{
for(int k=0;k<LightmapSizeY[UsedPlane];k++)
{
AddLightmap[j+k*LightmapSizeX[UsedPlane]]=LightColor.c;
}
}
//LightmapStorage.Add(AddLightmap);
DWORD *pSurface=AddLightmap;
List<POINT> InTriangle;
List<POINT> NotInTriangle;
sprintf(strObjectInfo,"Remain poly %d ",cRemainPoly);
cd.X=0;
cd.Y=1;
WriteConsoleOutputCharacter(hStdOut,strObjectInfo,strlen(strObjectInfo),cd,&dwWordLens);
{
int cLightmapCurrentCalc=0;
for(int iu=0;iu<LightmapSizeX[UsedPlane];iu++)
{
for(int iv=0;iv<LightmapSizeY[UsedPlane];iv++)
{
cLightmapCurrentCalc++;
sprintf(strObjectInfo,"Remain poly %d , Lightmap Calc %8d/%8d",cRemainPoly,cLightmapCurrentCalc,LightmapSizeX[UsedPlane]*LightmapSizeY[UsedPlane]);
cd.X=0;
cd.Y=1;
WriteConsoleOutputCharacter(hStdOut,strObjectInfo,strlen(strObjectInfo),cd,&dwWordLens);
vector3 vecStart=vecOri+vecU*(float)iu+vecV*(float)iv+vecU*0.5f+vecV*0.5f;
vector3 vecEnd=vecOri+vecU*(float)iu+vecV*(float)iv+vecU*0.5f+vecV*0.5f+vecLight*10000.0f;
vector3 vecNormalEnd=vecFirstNormal*10000.0f+vecStart;
vector3 vecNegaEnd=vecOri+vecU*(float)iu+vecV*(float)iv+vecU*0.5f+vecV*0.5f+vecLight*(-10000.0f);
bool bInTriangle=true;
//*
for(int cOtherObject=0;cOtherObject<cIntersectionPoly;cOtherObject++)
{
MultiVertex *pOtherVertex=pMeshVertex[cOtherObject];
WORD *pIndices=pMeshIndices[cOtherObject];
for(int cOtherPoly=0;cOtherPoly<m_nIndices[cOtherObject];cOtherPoly++)
{
if(IndicesUsed[cOtherObject][cOtherPoly]==UsedPlane)
{
v[0]=(vector3*)&pOtherVertex[pIndices[cOtherPoly*3+0]];
v[1]=(vector3*)&pOtherVertex[pIndices[cOtherPoly*3+1]];
v[2]=(vector3*)&pOtherVertex[pIndices[cOtherPoly*3+2]];
vector3 pPoly[3];
pPoly[0]=*v[0];
pPoly[1]=*v[1];
pPoly[2]=*v[2];
float fLightLens;
if(CIntersection::PolygonRay( vecStart,vecEnd,
pPoly,fLightLens))
{
bInTriangle=true;
}
if(CIntersection::PolygonRay( vecStart,vecNegaEnd,
pPoly,fLightLens))
{
bInTriangle=true;
}
}
}
if(bInTriangle)
break;
}
if(bInTriangle==false)
{
pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=LightColor.c;
POINT AddNot;
AddNot.x=iu;
AddNot.y=iv;
NotInTriangle.Add(AddNot);
}
else
{
POINT Add;
Add.x=iu;
Add.y=iv;
InTriangle.Add(Add);
}
bool isAmbientWrite=false;
for(cOtherObject=0;cOtherObject<cIntersectionPoly;cOtherObject++)
{
MultiVertex *pOtherVertex=pMeshVertex[cOtherObject];
WORD *pIndices=pMeshIndices[cOtherObject];
for(int cOtherPoly=0;cOtherPoly<m_nIndices[cOtherObject];cOtherPoly++)
{
if(IndicesUsed[cOtherObject][cOtherPoly]!=UsedPlane)
{
v[0]=(vector3*)&pOtherVertex[pIndices[cOtherPoly*3+0]];
v[1]=(vector3*)&pOtherVertex[pIndices[cOtherPoly*3+1]];
v[2]=(vector3*)&pOtherVertex[pIndices[cOtherPoly*3+2]];
vector3 pPoly[3];
pPoly[0]=*v[0];
pPoly[1]=*v[1];
pPoly[2]=*v[2];
float fLightLens;
bool bAmbientIntersection=false;
if(CIntersection::PolygonRay( vecStart,vecEnd,
pPoly,fLightLens))
{
if(LightmapMode==0)
{
// <20>Ÿ<EFBFBD><C5B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> normal <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> poly <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> collision <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
vector3 vecPolyCross = (pPoly[1] - pPoly[0]) ^ (pPoly[2] - pPoly[0]);
vecPolyCross.Normalize();
float fDot = vecPolyCross * vecFirstNormal;
float fDist[3];
fDist[0]= vecFirstNormal * ( (pPoly[0])-(*vecFirstDetect[0]));
fDist[1]= vecFirstNormal * ( (pPoly[1])-(*vecFirstDetect[0]));
fDist[2]= vecFirstNormal * ( (pPoly[2])-(*vecFirstDetect[0]));
float fControlDist = 150.0f;
if( (fabs(fDist[0]) <= fControlDist) &&
(fabs(fDist[1]) <= fControlDist) &&
(fabs(fDist[2]) <= fControlDist) &&
(fabs(fDot) > 0.6f))
{
pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=0xff606060;
}
else {
// Ambient Write
pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=0xff606060;
}
}
else
{
pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=0xff202020;
for(int cAmbientObject=0;cAmbientObject<cIntersectionPoly;cAmbientObject++)
{
MultiVertex *pAmbientVertex=pMeshVertex[cAmbientObject];
WORD *pAmbientIndices=pMeshIndices[cAmbientObject];
for(int cAmbientPoly=0;cAmbientPoly<m_nIndices[cAmbientObject];cAmbientPoly++)
{
if(IndicesUsed[cAmbientObject][cAmbientPoly]!=UsedPlane)
{
v[0]=(vector3*)&pAmbientVertex[pAmbientIndices[cAmbientPoly*3+0]];
v[1]=(vector3*)&pAmbientVertex[pAmbientIndices[cAmbientPoly*3+1]];
v[2]=(vector3*)&pAmbientVertex[pAmbientIndices[cAmbientPoly*3+2]];
vector3 pPoly[3];
pPoly[0]=*v[0];
pPoly[1]=*v[1];
pPoly[2]=*v[2];
float fLightLens;
if(CIntersection::PolygonRay( vecStart,vecNormalEnd,pPoly,fLightLens))
{
bAmbientIntersection=true;
}
}
}
}
if(bAmbientIntersection==false)
{
isAmbientWrite=true;
pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=0xff606060;
}
}
}
}
}
}
for(cObjectScene=0;cObjectScene<m_ObjectList.num;cObjectScene++)
{
matrix matObjectTM=m_ObjectList[cObjectScene]->m_TM;
if(m_ObjectList[cObjectScene]->m_pObject->m_dwShader==MultiFVF)
{
matrix matTransPoly;
for(int cMesh=0;cMesh<m_ObjectList[cObjectScene]->m_pObject->m_nIndices.num;cMesh++)
{
MultiVertex *pVertex=(MultiVertex *)m_ObjectList[cObjectScene]->m_pObject->m_pVertex[cMesh];
for(int cIndices=0;cIndices<m_ObjectList[cObjectScene]->m_pObject->m_nIndices[cMesh];cIndices++)
{
v[0]=(vector3*)&pVertex[m_ObjectList[cObjectScene]->m_pObject->m_pIndices[cMesh][cIndices*3+0]];
v[1]=(vector3*)&pVertex[m_ObjectList[cObjectScene]->m_pObject->m_pIndices[cMesh][cIndices*3+1]];
v[2]=(vector3*)&pVertex[m_ObjectList[cObjectScene]->m_pObject->m_pIndices[cMesh][cIndices*3+2]];
vector3 pPoly[3];
pPoly[0]=*v[0];
pPoly[1]=*v[1];
pPoly[2]=*v[2];
matTransPoly.Translation(pPoly[0]);
matTransPoly=matTransPoly*matObjectTM;
pPoly[0]=matTransPoly.GetLoc();
matTransPoly.Translation(pPoly[1]);
matTransPoly=matTransPoly*matObjectTM;
pPoly[1]=matTransPoly.GetLoc();
matTransPoly.Translation(pPoly[2]);
matTransPoly=matTransPoly*matObjectTM;
pPoly[2]=matTransPoly.GetLoc();
float fLightLens;
if(CIntersection::PolygonRay( vecStart,vecEnd,
pPoly,fLightLens))
{
if(LightmapMode==0)
{
pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=0xff606060;
}
else
{
if(isAmbientWrite)
{
pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=0xff606060;
}
else
{
pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=0xff202020;
}
}
}
}
}
}
else
{
for(int cMesh=0;cMesh<m_ObjectList[cObjectScene]->m_pObject->m_nIndices.num;cMesh++)
{
LightVertex *pVertex=(LightVertex *)m_ObjectList[cObjectScene]->m_pObject->m_pVertex[cMesh];
matrix matTransPoly;
for(int cIndices=0;cIndices<m_ObjectList[cObjectScene]->m_pObject->m_nIndices[cMesh];cIndices++)
{
v[0]=(vector3*)&pVertex[m_ObjectList[cObjectScene]->m_pObject->m_pIndices[cMesh][cIndices*3+0]];
v[1]=(vector3*)&pVertex[m_ObjectList[cObjectScene]->m_pObject->m_pIndices[cMesh][cIndices*3+1]];
v[2]=(vector3*)&pVertex[m_ObjectList[cObjectScene]->m_pObject->m_pIndices[cMesh][cIndices*3+2]];
vector3 pPoly[3];
pPoly[0]=*v[0];
pPoly[1]=*v[1];
pPoly[2]=*v[2];
matTransPoly.Translation(pPoly[0]);
matTransPoly=matTransPoly*matObjectTM;
pPoly[0]=matTransPoly.GetLoc();
matTransPoly.Translation(pPoly[1]);
matTransPoly=matTransPoly*matObjectTM;
pPoly[1]=matTransPoly.GetLoc();
matTransPoly.Translation(pPoly[2]);
matTransPoly=matTransPoly*matObjectTM;
pPoly[2]=matTransPoly.GetLoc();
float fLightLens;
if(CIntersection::PolygonRay( vecStart,vecEnd,
pPoly,fLightLens))
{
if(LightmapMode==0)
{
pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=0xff606060;
}
else
{
if(isAmbientWrite)
{
pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=0xff606060;
}
else
{
pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=0xff202020;
}
}
}
}
}
}
}
bool isNotIntersection;
for(int cLightObject=0;cLightObject<m_LightList.num;cLightObject++)
{
vector3 vecInterStartLight;
vecEnd.x=m_LightList[cLightObject]->m_TM._41;
vecEnd.y=m_LightList[cLightObject]->m_TM._42;
vecEnd.z=m_LightList[cLightObject]->m_TM._43;
vecInterStartLight=vecEnd-vecStart;
float fLightLens=vecInterStartLight.GetLens();
if(fLightLens >= m_LightList[cLightObject]->m_pLightObject->m_fLightRange)
continue;
isNotIntersection=false;
for(int cOtherObject=0;cOtherObject<cIntersectionPoly;cOtherObject++)
{
MultiVertex *pOtherVertex=pMeshVertex[cOtherObject];
WORD *pIndices=pMeshIndices[cOtherObject];
for(int cOtherPoly=0;cOtherPoly<m_nIndices[cOtherObject];cOtherPoly++)
{
if(IndicesUsed[cOtherObject][cOtherPoly]!=UsedPlane)
{
v[0]=(vector3*)&pOtherVertex[pIndices[cOtherPoly*3+0]];
v[1]=(vector3*)&pOtherVertex[pIndices[cOtherPoly*3+1]];
v[2]=(vector3*)&pOtherVertex[pIndices[cOtherPoly*3+2]];
float fTempLightLens;
vector3 pPoly[3];
pPoly[0]=*v[0];
pPoly[1]=*v[1];
pPoly[2]=*v[2];
if(CIntersection::PolygonRay( vecStart,vecEnd,
pPoly,fTempLightLens))
{
isNotIntersection=true;
}
}
}
}
///*
for(cObjectScene=0;cObjectScene<m_ObjectList.num;cObjectScene++)
{
matrix matObjectTM=m_ObjectList[cObjectScene]->m_TM;
vector3 vecObjectPos=matObjectTM.GetLoc();
vector3 vecLightPos=m_LightList[cLightObject]->m_TM.GetLoc();
vector3 vecInter=vecObjectPos-vecLightPos;
float fInter=vecInter.GetLens();
if(fInter < m_LightList[cLightObject]->m_pLightObject->m_fLightRange + m_ObjectList[cObjectScene]->m_fRad)
{
//??
}
//matrix matObjectTM=m_ObjectList[cObjectScene]->m_TM;
if(m_ObjectList[cObjectScene]->m_pObject->m_dwShader==MultiFVF)
{
matrix matTransPoly;
for(int cMesh=0;cMesh<m_ObjectList[cObjectScene]->m_pObject->m_nIndices.num;cMesh++)
{
MultiVertex *pVertex=(MultiVertex *)m_ObjectList[cObjectScene]->m_pObject->m_pVertex[cMesh];
for(int cIndices=0;cIndices<m_ObjectList[cObjectScene]->m_pObject->m_nIndices[cMesh];cIndices++)
{
v[0]=(vector3*)&pVertex[m_ObjectList[cObjectScene]->m_pObject->m_pIndices[cMesh][cIndices*3+0]];
v[1]=(vector3*)&pVertex[m_ObjectList[cObjectScene]->m_pObject->m_pIndices[cMesh][cIndices*3+1]];
v[2]=(vector3*)&pVertex[m_ObjectList[cObjectScene]->m_pObject->m_pIndices[cMesh][cIndices*3+2]];
vector3 pPoly[3];
pPoly[0]=*v[0];
pPoly[1]=*v[1];
pPoly[2]=*v[2];
matTransPoly.Translation(pPoly[0]);
matTransPoly=matTransPoly*matObjectTM;
pPoly[0]=matTransPoly.GetLoc();
matTransPoly.Translation(pPoly[1]);
matTransPoly=matTransPoly*matObjectTM;
pPoly[1]=matTransPoly.GetLoc();
matTransPoly.Translation(pPoly[2]);
matTransPoly=matTransPoly*matObjectTM;
pPoly[2]=matTransPoly.GetLoc();
float fLightLens;
if(CIntersection::PolygonRay( vecStart,vecEnd,
pPoly,fLightLens))
{
isNotIntersection=true;
}
}
}
}
else
{
for(int cMesh=0;cMesh<m_ObjectList[cObjectScene]->m_pObject->m_nIndices.num;cMesh++)
{
LightVertex *pVertex=(LightVertex *)m_ObjectList[cObjectScene]->m_pObject->m_pVertex[cMesh];
matrix matTransPoly;
for(int cIndices=0;cIndices<m_ObjectList[cObjectScene]->m_pObject->m_nIndices[cMesh];cIndices++)
{
v[0]=(vector3*)&pVertex[m_ObjectList[cObjectScene]->m_pObject->m_pIndices[cMesh][cIndices*3+0]];
v[1]=(vector3*)&pVertex[m_ObjectList[cObjectScene]->m_pObject->m_pIndices[cMesh][cIndices*3+1]];
v[2]=(vector3*)&pVertex[m_ObjectList[cObjectScene]->m_pObject->m_pIndices[cMesh][cIndices*3+2]];
vector3 pPoly[3];
pPoly[0]=*v[0];
pPoly[1]=*v[1];
pPoly[2]=*v[2];
matTransPoly.Translation(pPoly[0]);
matTransPoly=matTransPoly*matObjectTM;
pPoly[0]=matTransPoly.GetLoc();
matTransPoly.Translation(pPoly[1]);
matTransPoly=matTransPoly*matObjectTM;
pPoly[1]=matTransPoly.GetLoc();
matTransPoly.Translation(pPoly[2]);
matTransPoly=matTransPoly*matObjectTM;
pPoly[2]=matTransPoly.GetLoc();
float fLightLens;
if(CIntersection::PolygonRay( vecStart,vecEnd,
pPoly,fLightLens))
{
//pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=0xff666666;
//pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=0xff000000;
isNotIntersection=true;
}
}
}
}
}
if(isNotIntersection==false)
{
color lightmapcolor;
lightmapcolor.c=pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]];
float fLightRate=1.0f-(fLightLens/m_LightList[cLightObject]->m_pLightObject->m_fLightRange);
if(fLightRate>=1.0f)
fLightRate=1.0f;
color AdderColor=color::Interpolation(color(0,0,0),m_LightList[cLightObject]->m_pLightObject->m_LightColor,fLightRate);
lightmapcolor=lightmapcolor+AdderColor;
if(fLightRate>0.5f)
fLightRate+=0.1f;
pSurface[iu+iv*(int)LightmapSizeX[UsedPlane]]=lightmapcolor.c;
}
}
//*/
}
}
}
//*/
pSurface=new DWORD[(LightmapSizeX[UsedPlane]+2)*(LightmapSizeY[UsedPlane]+2)];
for(int ix=0;ix<LightmapSizeX[UsedPlane];ix++)
{
for(int iy=0;iy<LightmapSizeY[UsedPlane];iy++)
{
pSurface[(ix+1)+(iy+1)*(LightmapSizeX[UsedPlane]+2)]=
AddLightmap[ix+iy*LightmapSizeX[UsedPlane]];
}
}
for(ix=0;ix<LightmapSizeX[UsedPlane];ix++)
{
pSurface[ix+1]=AddLightmap[ix];
pSurface[ix+1+(LightmapSizeY[UsedPlane]+1)*(LightmapSizeX[UsedPlane]+2)]=
AddLightmap[ix+(LightmapSizeY[UsedPlane]-1)*(LightmapSizeX[UsedPlane])];
}
for(int iy=0;iy<LightmapSizeY[UsedPlane];iy++)
{
pSurface[(iy+1)*(LightmapSizeX[UsedPlane]+2)]
=AddLightmap[iy*LightmapSizeX[UsedPlane]];
pSurface[ (LightmapSizeX[UsedPlane]+1)+(iy+1)*(LightmapSizeX[UsedPlane]+2)]=
AddLightmap[(LightmapSizeX[UsedPlane]-1)+iy*LightmapSizeX[UsedPlane]];
}
LightmapSizeX[UsedPlane]+=2;
LightmapSizeY[UsedPlane]+=2;
LightmapStorage.Add(pSurface);
UsedPlane++;
for(cIndices=0;cIndices<m_nIndices[cObject];cIndices++)
{
if(IndicesUsed[cObject][cIndices]==-1)
break;
}
if(cIndices==m_nIndices[cObject])
isRemainIndices=false;
}
}
for(cObjectScene=0;cObjectScene<m_ObjectList.num;cObjectScene++)
{
m_ObjectList[cObjectScene]->m_pObject->AllUnlockBuffer();
}
/*
LPDIRECT3DTEXTURE8 LightmapTexture=(LPDIRECT3DTEXTURE8)m_Lightmap.GetTexture();
LPDIRECT3DSURFACE8 Lightmap;
LightmapTexture->GetSurfaceLevel(0,&Lightmap);
LPDIRECT3DSURFACE8 LightmapSource=NULL;
*/
List<RECT> UsedLightmap;
int UsedTextureSizeX=1024,UsedTextureSizeY=512;
long PredictSizeX[10]={128,256,256,512,512,1024,1024,2048,2048,4096};
long PredictSizeY[10]={128,128,256,256,512,512,1024,1024,2048,4096};
bool isNotvalid;
int ix,iy;
bool isWriteLightmap=true;
bool inX,inY;
/*
for(int cPredict=0;cPredict<10;cPredict++)
{
*/
int cPredict=0;
isNotvalid=true;
UsedTextureSizeX=PredictSizeX[cPredict];
UsedTextureSizeY=PredictSizeY[cPredict];
char strObjectInfo[256];
for(int cPlane=0;cPlane<UsedPlane;cPlane++)
{
sprintf(strObjectInfo,"PredictSize %d,%d ",UsedTextureSizeX,UsedTextureSizeY);
cd.X=0;
cd.Y=2;
WriteConsoleOutputCharacter(hStdOut,strObjectInfo,strlen(strObjectInfo),cd,&dwWordLens);
sprintf(strObjectInfo,"Plane Calc %d/%d ",cPlane,UsedPlane);
cd.X=0;
cd.Y=3;
WriteConsoleOutputCharacter(hStdOut,strObjectInfo,strlen(strObjectInfo),cd,&dwWordLens);
isWriteLightmap=false;
for(iy=0;iy<UsedTextureSizeY-LightmapSizeY[cPlane];iy++)
{
isWriteLightmap=false;
for(ix=0;ix<UsedTextureSizeX-LightmapSizeX[cPlane];ix++)
{
isWriteLightmap=true;
for(int cUsedMap=0;cUsedMap<UsedLightmap.num;cUsedMap++)
{
inX=false;
inY=false;
if( ix<=UsedLightmap[cUsedMap].left)
{
if( ix+LightmapSizeX[cPlane] >= UsedLightmap[cUsedMap].left)
inX=true;
}
else
{
if( ix <=UsedLightmap[cUsedMap].right)
inX=true;
}
if( iy<=UsedLightmap[cUsedMap].top)
{
if( iy+LightmapSizeY[cPlane] >= UsedLightmap[cUsedMap].top)
inY=true;
}
else
{
if( iy <=UsedLightmap[cUsedMap].bottom)
inY=true;
}
if( inX && inY)
{
isWriteLightmap=false;
break;
}
}
if(isWriteLightmap)
{
RECT AddMap;
AddMap.left=ix;
AddMap.right=ix+LightmapSizeX[cPlane]-1;
AddMap.top=iy;
AddMap.bottom=iy+LightmapSizeY[cPlane]-1;
UsedLightmap.Add(AddMap);
break;
}
}
if(isWriteLightmap)
{
break;
}
}
if(isWriteLightmap==false)
{
cPredict++;
if(cPredict==10)
{
isNotvalid=false;
break;
}
UsedTextureSizeX=PredictSizeX[cPredict];
UsedTextureSizeY=PredictSizeY[cPredict];
cPlane--;
continue;
//isNotvalid=false;
//break;
}
}
UsedLightmap.num=0;
if(isNotvalid==false)
{
MessageBox(NULL,"Lightmap is not valid",0,0);
exit(0);
}
/*
}
if(cPredict==10)
{
MessageBox(NULL,"Lightmap is not valid",0,0);
}
*/
UsedLightmap.num=0;
float fSmallToBigX,fSmallToBigY;
float fStartTu,fStartTv;
m_Lightmap.CreateEmpty(UsedTextureSizeX,UsedTextureSizeY,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,1);
DWORD *pLightmap=(DWORD*)m_Lightmap.Lock();
// Init Texture
for(iy = 0; iy < UsedTextureSizeY; iy++) {
for(ix = 0;ix < UsedTextureSizeX;ix++) {
pLightmap[ix + (iy * UsedTextureSizeY)] = 0xff606060;
}
}
for(cPlane=0;cPlane<UsedPlane;cPlane++)
{
for(iy=0;iy<UsedTextureSizeY-LightmapSizeY[cPlane];iy++)
{
for(ix=0;ix<UsedTextureSizeX-LightmapSizeX[cPlane];ix++)
{
isWriteLightmap=true;
for(int cUsedMap=0;cUsedMap<UsedLightmap.num;cUsedMap++)
{
inX=false;
inY=false;
if( ix<=UsedLightmap[cUsedMap].left)
{
if( ix+LightmapSizeX[cPlane] >= UsedLightmap[cUsedMap].left)
inX=true;
}
else
{
if( ix <=UsedLightmap[cUsedMap].right)
inX=true;
}
if( iy<=UsedLightmap[cUsedMap].top)
{
if( iy+LightmapSizeY[cPlane] >= UsedLightmap[cUsedMap].top)
inY=true;
}
else
{
if( iy <=UsedLightmap[cUsedMap].bottom)
inY=true;
}
if( inX && inY)
{
isWriteLightmap=false;
break;
}
}
if(isWriteLightmap==true)
goto WRITELIGHTMAP;
}
}
continue;
WRITELIGHTMAP:
///*
sprintf(strObjectInfo,"Lightmap Write Calc %d/%d ",cPlane,UsedPlane);
cd.X=0;
cd.Y=4;
WriteConsoleOutputCharacter(hStdOut,strObjectInfo,strlen(strObjectInfo),cd,&dwWordLens);
fStartTu=(float)ix/(float)UsedTextureSizeX+1.0f/(float)UsedTextureSizeX;
fStartTv=(float)iy/(float)UsedTextureSizeY+1.0f/(float)UsedTextureSizeY;
fSmallToBigX=(float)(LightmapSizeX[cPlane]-2)/(float)UsedTextureSizeX;
fSmallToBigY=(float)(LightmapSizeY[cPlane]-2)/(float)UsedTextureSizeY;
//*/
RECT AddMap;
AddMap.left=ix;
AddMap.right=ix+LightmapSizeX[cPlane]-1;
AddMap.top=iy;
AddMap.bottom=iy+LightmapSizeY[cPlane]-1;
UsedLightmap.Add(AddMap);
RECT rect={0,0,LightmapSizeX[cPlane],LightmapSizeY[cPlane]};
for(ix=0;ix<LightmapSizeX[cPlane];ix++)
{
for(iy=0;iy<LightmapSizeY[cPlane];iy++)
{
pLightmap[ AddMap.left + ix + ( AddMap.top + iy ) * UsedTextureSizeX]=
LightmapStorage[cPlane][ix+iy*LightmapSizeX[cPlane]];
}
}
// Lightmap Blurring
for(ix = 0; ix < LightmapSizeX[cPlane];ix++) {
for(iy = 0; iy < LightmapSizeY[cPlane];iy++) {
DWORD dwColor = pLightmap[ AddMap.left + ix + ( AddMap.top + iy ) * UsedTextureSizeX];
DWORD dwTargetPixel;
BYTE dwRed = dwColor;
BYTE dwGreen = dwColor >> 8;
BYTE dwBlue = dwColor >> 16;
BYTE dwAlpha = dwColor >> 24;
float fCurrentPixel[4];
fCurrentPixel[0] = (float)dwAlpha;
fCurrentPixel[1] = (float)dwRed;
fCurrentPixel[2] = (float)dwGreen;
fCurrentPixel[3] = (float)dwBlue;
int iLegal = 0;
if(ix > 0) { // Left
dwTargetPixel = pLightmap[AddMap.left + ix - 1 + (AddMap.top + iy) * UsedTextureSizeX];
dwRed= dwTargetPixel;
dwGreen = dwTargetPixel >> 8;
dwBlue = dwTargetPixel >> 16;
dwAlpha = dwTargetPixel >> 24;
fCurrentPixel[0] += (float)dwAlpha;
fCurrentPixel[1] += (float)dwRed;
fCurrentPixel[2] += (float)dwGreen;
fCurrentPixel[3] += (float)dwBlue;
iLegal++;
}
if(ix < (LightmapSizeX[cPlane]) -1) { //Right
dwTargetPixel = pLightmap[AddMap.left + ix + 1 + (AddMap.top + iy) * UsedTextureSizeX];
dwRed= dwTargetPixel;
dwGreen = dwTargetPixel >> 8;
dwBlue = dwTargetPixel >> 16;
dwAlpha = dwTargetPixel >> 24;
fCurrentPixel[0] += (float)dwAlpha;
fCurrentPixel[1] += (float)dwRed;
fCurrentPixel[2] += (float)dwGreen;
fCurrentPixel[3] += (float)dwBlue;
iLegal++;
}
if(iy > 0) { //Up
dwTargetPixel = pLightmap[AddMap.left + ix + (AddMap.top + iy - 1) * UsedTextureSizeX];
dwRed= dwTargetPixel;
dwGreen = dwTargetPixel >> 8;
dwBlue = dwTargetPixel >> 16;
dwAlpha = dwTargetPixel >> 24;
fCurrentPixel[0] += (float)dwAlpha;
fCurrentPixel[1] += (float)dwRed;
fCurrentPixel[2] += (float)dwGreen;
fCurrentPixel[3] += (float)dwBlue;
iLegal++;
}
if(iy < (LightmapSizeY[cPlane]) -1) { //Down
dwTargetPixel = pLightmap[AddMap.left + ix + (AddMap.top + iy + 1) * UsedTextureSizeX];
dwRed= dwTargetPixel;
dwGreen = dwTargetPixel >> 8;
dwBlue = dwTargetPixel >> 16;
dwAlpha = dwTargetPixel >> 24;
fCurrentPixel[0] += (float)dwAlpha;
fCurrentPixel[1] += (float)dwRed;
fCurrentPixel[2] += (float)dwGreen;
fCurrentPixel[3] += (float)dwBlue;
iLegal++;
}
if((ix >0) && (iy > 0)) { // Left-Up
dwTargetPixel = pLightmap[AddMap.left + ix - 1 + (AddMap.top + iy - 1) * UsedTextureSizeX];
dwRed= dwTargetPixel;
dwGreen = dwTargetPixel >> 8;
dwBlue = dwTargetPixel >> 16;
dwAlpha = dwTargetPixel >> 24;
fCurrentPixel[0] += (float)dwAlpha;
fCurrentPixel[1] += (float)dwRed;
fCurrentPixel[2] += (float)dwGreen;
fCurrentPixel[3] += (float)dwBlue;
iLegal++;
}
if((ix < (LightmapSizeX[cPlane]) -1) && (iy < (LightmapSizeY[cPlane]) -1)) { //Right-down
dwTargetPixel = pLightmap[AddMap.left + ix + 1 + (AddMap.top + iy + 1) * UsedTextureSizeX];
dwRed= dwTargetPixel;
dwGreen = dwTargetPixel >> 8;
dwBlue = dwTargetPixel >> 16;
dwAlpha = dwTargetPixel >> 24;
fCurrentPixel[0] += (float)dwAlpha;
fCurrentPixel[1] += (float)dwRed;
fCurrentPixel[2] += (float)dwGreen;
fCurrentPixel[3] += (float)dwBlue;
iLegal++;
}
if((ix < (LightmapSizeX[cPlane]) -1 ) && (iy > 0)) { //Right up
dwTargetPixel = pLightmap[AddMap.left + ix + 1 + (AddMap.top + iy - 1) * UsedTextureSizeX];
dwRed= dwTargetPixel;
dwGreen = dwTargetPixel >> 8;
dwBlue = dwTargetPixel >> 16;
dwAlpha = dwTargetPixel >> 24;
fCurrentPixel[0] += (float)dwAlpha;
fCurrentPixel[1] += (float)dwRed;
fCurrentPixel[2] += (float)dwGreen;
fCurrentPixel[3] += (float)dwBlue;
iLegal++;
}
if((ix > 0) && (iy <(LightmapSizeY[cPlane]) -1)) { // Left Down
dwTargetPixel = pLightmap[AddMap.left + ix - 1 + (AddMap.top + iy + 1) * UsedTextureSizeX];
dwRed= dwTargetPixel;
dwGreen = dwTargetPixel >> 8;
dwBlue = dwTargetPixel >> 16;
dwAlpha = dwTargetPixel >> 24;
fCurrentPixel[0] += (float)dwAlpha;
fCurrentPixel[1] += (float)dwRed;
fCurrentPixel[2] += (float)dwGreen;
fCurrentPixel[3] += (float)dwBlue;
iLegal++;
}
int k;
for(k = 0; k < 4; k++ ) {
float fTmp = fCurrentPixel[k];
fTmp = (fTmp / (float)( iLegal + 1));
fCurrentPixel[k] = fTmp;
}
int iColor[4];
iColor[0] = (int)fCurrentPixel[0];
iColor[1] = (int)fCurrentPixel[1];
iColor[2] = (int)fCurrentPixel[2];
iColor[3] = (int)fCurrentPixel[3];
iColor[0] = (iColor[0] <= 255) ? iColor[0] : 255;
iColor[1] = (iColor[1] <= 255) ? iColor[1] : 255;
iColor[2] = (iColor[2] <= 255) ? iColor[2] : 255;
iColor[3] = (iColor[3] <= 255) ? iColor[3] : 255;
DWORD dwResult = D3DCOLOR_ARGB(255,iColor[1],iColor[2],iColor[3]);
pLightmap[ AddMap.left + ix + ( AddMap.top + iy ) * UsedTextureSizeX] = dwResult;
}
}
for(int cObject=0;cObject<IndicesUsed.num;cObject++)
{
MultiVertex *pVertex=pMeshVertex[cObject];
WORD *pIndices=pMeshIndices[cObject];
bool *isAlreadyUVTransfer=new bool[nMeshVertex[cObject]];
memset(isAlreadyUVTransfer,0,sizeof(bool)*nMeshVertex[cObject]);
for(int cIndices=0;cIndices<m_nIndices[cObject];cIndices++)
{
if(IndicesUsed[cObject][cIndices]==cPlane)
{
if(isAlreadyUVTransfer[pIndices[cIndices*3+0]] == false)
{
pVertex[ pIndices[cIndices*3+0] ].tu1=fStartTu+pVertex[pIndices[cIndices*3+0]].tu1*fSmallToBigX;
pVertex[ pIndices[cIndices*3+0] ].tv1=fStartTv+pVertex[pIndices[cIndices*3+0]].tv1*fSmallToBigY;
isAlreadyUVTransfer[pIndices[cIndices*3+0]]=true;
}
if(isAlreadyUVTransfer[pIndices[cIndices*3+1]] == false)
{
pVertex[ pIndices[cIndices*3+1] ].tu1=fStartTu+pVertex[pIndices[cIndices*3+1]].tu1*fSmallToBigX;
pVertex[ pIndices[cIndices*3+1] ].tv1=fStartTv+pVertex[pIndices[cIndices*3+1]].tv1*fSmallToBigY;
isAlreadyUVTransfer[pIndices[cIndices*3+1]]=true;
}
if(isAlreadyUVTransfer[pIndices[cIndices*3+2]] == false)
{
pVertex[ pIndices[cIndices*3+2] ].tu1=fStartTu+pVertex[pIndices[cIndices*3+2]].tu1*fSmallToBigX;
pVertex[ pIndices[cIndices*3+2] ].tv1=fStartTv+pVertex[pIndices[cIndices*3+2]].tv1*fSmallToBigY;
isAlreadyUVTransfer[pIndices[cIndices*3+2]]=true;
}
}
}
delete [] isAlreadyUVTransfer;
}
}
m_Lightmap.Unlock();
if(m_pOutHouseObject)
m_pOutHouseObject->AllUnlockBuffer();
if(m_pMedHouseObject)
m_pMedHouseObject->AllUnlockBuffer();
if(m_pInHouseObject)
m_pInHouseObject->AllUnlockBuffer();
m_isHaveLightmap=true;
m_nIndices.num=0;
}
void CHouseObject::Render(LPDIRECT3DDEVICE8 pd3dDevice)
{
D3DMATERIAL8 mtrl;
ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) );
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
pd3dDevice->SetMaterial( &mtrl );
if(m_pBspObject)
{
if(CSceneManager::m_bEditor)
{
if(CSceneManager::m_PickHouseScene && CSceneManager::m_PickHouseScene->m_HouseObject == this)
{
m_pBspObject->RenderBox(pd3dDevice,0xffff0000);
}
else
{
m_pBspObject->RenderBox(pd3dDevice,0xffffffff);
}
matrix matTM,matParentWorld;
pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParentWorld);
for(int cObject=0;cObject<m_ObjectList.num;cObject++)
{
matTM=m_ObjectList[cObject]->m_TM*matParentWorld;
pd3dDevice->SetTransform(D3DTS_WORLD,matTM);
m_ObjectList[cObject]->m_AccumulateTM=matTM;
//if(m_ObjectList[cObject]->isCulling())
{
if(CSceneManager::m_PickObjectScene==m_ObjectList[cObject])
{
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR,0xffffffff);
m_ObjectList[cObject]->m_pObject->RenderBox(pd3dDevice);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
}
m_ObjectList[cObject]->m_pObject->Render(pd3dDevice);
}
}
pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParentWorld);
}
return;
/*
matrix matHousePos;
pd3dDevice->GetTransform(D3DTS_WORLD,matHousePos);
//matrix *matViewPosition=GetCamera()->GetMatPosition();
//m_BspScene.Render(m_pd3dDevice,matViewPosition->GetLoc());
matrix *matViewPosition=CSceneManager::GetCamera()->GetMatPosition();
matrix matViewPos;
vector3 vecViewPos=matViewPosition->GetLoc();
matViewPos.Translation(vecViewPos);
matrix matInvTM,matPos;
matInvTM.Inverse(matHousePos);
matPos=matViewPos*matInvTM;
if( m_pBspObject->m_vecMinBox.x <= matPos._41 && m_pBspObject->m_vecMaxBox.x >= matPos._41 &&
m_pBspObject->m_vecMinBox.y <= matPos._42 && m_pBspObject->m_vecMaxBox.y >= matPos._42 &&
m_pBspObject->m_vecMinBox.z <= matPos._43 && m_pBspObject->m_vecMaxBox.z >= matPos._43 )
{
if(m_pBspObject->FindCluster(matPos.GetLoc())!=-1)
{
m_pBspObject->Render(pd3dDevice,matPos.GetLoc());
}
}
*/
/*
matrix matInvTM,matTM;
matTM.Translation(vector3(fXp,fYp,fZp));
matInvTM.Inverse(CSceneManager::m_PickHouseScene->m_AccumulateTM);
CLightObjectScene *AddLightScene=new CLightObjectScene();
AddLightScene->m_TM=matTM*matInvTM;
m_pBspObject->m_vecMaxBox;
m_pBspObject->m_vecMinBox;
*/
}
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE);
pd3dDevice->SetTexture(2,NULL);
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE);
/*
pd3dDevice->SetTexture(1,NULL);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
*/
//matrix matWVP=RenderShadow(pd3dDevice);
/*
matrix matProjection,matHeightView,matTexScale,matInv,matView;
matProjection.MakeProjection(3.14159f/3.0f,1.0f,50,100000.0f);
float fViewHeight=(SECTORSIZE/2.0f)/tanf(3.14159f/6.0f);
matHeightView.CameraLookAt(vector3(SECTORSIZE/2.0f,fViewHeight,SECTORSIZE/2.0f),vector3(SECTORSIZE/2.0f,0.0f,SECTORSIZE/2.0f),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;
pd3dDevice->SetTransform(D3DTS_TEXTURE2,(D3DMATRIX*)&matTex);
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_CAMERASPACEPOSITION );
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_PROJECTED | D3DTTFF_COUNT3 );
pd3dDevice->SetTexture(2,CSectorScene::
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 2 );
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE );
*/
if(m_pLodHouseObject && !m_pOutHouseObject)
{
pd3dDevice->LightEnable(0,TRUE);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
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::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
/*
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_MODULATE2X);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT);
}
*/
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE);
m_pLodHouseObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
/*
if(GF3OPTION)
{
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE );
}
*/
return;
}
if(m_pOutHouseObject)
{
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xaa);
if(m_isHaveLightmap)
{
if(CRenderOption::m_AllObjectBump)
{
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_TEXCOORDINDEX,0);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_TEXCOORDINDEX,1);
CSceneStateMgr::_SetD3DTextureStageState(2,D3DTSS_TEXCOORDINDEX,2);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_TEXCOORDINDEX,3);
pd3dDevice->SetTexture(2,m_Lightmap.GetTexture());
//pd3dDevice->SetTexture(3,m_pNormalizeCubeMap);
float fHouseAmbientLight[4]={CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.r/255.0f,
CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.g/255.0f,
CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.b/255.0f,1.0f};
pd3dDevice->SetPixelShaderConstant(0,fHouseAmbientLight,1);
matrix matView,matProjection,matWorld,matWVP;
pd3dDevice->GetTransform(D3DTS_VIEW,matView);
pd3dDevice->GetTransform(D3DTS_PROJECTION,matProjection);
pd3dDevice->GetTransform(D3DTS_WORLD,matWorld);
matWVP=matWorld*matView*matProjection;
matWVP.Transpose();
pd3dDevice->SetVertexShaderConstant(16,&matWVP, 4);
/*
vector3 vecPos=matWorld.GetLoc();
pd3dDevice->SetVertexShaderConstant(16,&matWVP, 4);
matrix matInv;
matInv.Inverse(matWorld);
matrix *matViewPosition=CSceneManager::GetCamera()->GetMatPosition();
vector3 vecViewPos=vector3(matViewPosition->_41,matViewPosition->_42,matViewPosition->_43);
matrix matViewPos;
matViewPos.Translation(vecViewPos);
matViewPos=matViewPos*matInv;
float fObjectSpaceViewPosition[4]={matViewPos._41,matViewPos._42,matViewPos._43,0.0f};
pd3dDevice->SetVertexShaderConstant(35,fObjectSpaceViewPosition,1);
//////////////////
matWorld._41=matWorld._42=matWorld._43=0.0f;
matInv.Inverse(matWorld);
vector3 vecLightPos=vector3(1.0f,2.0f,1.0f);
vecLightPos.Normalize();
vecLightPos=vecLightPos*10000.0f;
matrix matLightPos;
matLightPos.Translation(vecLightPos);
//matLightPos=matWorld*matLightPos;
matLightPos=matLightPos*matInv;
float fObjectSpaceLightPosition[4]={matLightPos._41,matLightPos._42,matLightPos._43,1.0f};
pd3dDevice->SetVertexShaderConstant(32,fObjectSpaceLightPosition,1);
*/
pd3dDevice->SetPixelShader(m_dwHouseDiffusePixelShader);
m_pOutHouseObject->m_dwCustomizeShader=m_dwHouseDiffuseVertexShader;
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSU,D3DTADDRESS_CLAMP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSV,D3DTADDRESS_CLAMP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSW,D3DTADDRESS_CLAMP);
m_pOutHouseObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSU,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSV,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSW,D3DTADDRESS_WRAP);
pd3dDevice->SetPixelShader(NULL);
m_pOutHouseObject->m_dwCustomizeShader=0xffffffff;
/*
pd3dDevice->SetPixelShader(m_dwHouseSpecularPixelShader);
m_pOutHouseObject->m_dwCustomizeShader=m_dwHouseSpecularVertexShader;
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSU,D3DTADDRESS_CLAMP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSV,D3DTADDRESS_CLAMP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSW,D3DTADDRESS_CLAMP);
m_pOutHouseObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSU,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSV,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSW,D3DTADDRESS_WRAP);
pd3dDevice->SetPixelShader(NULL);
m_pOutHouseObject->m_dwCustomizeShader=0xffffffff;
*/
}
else
{
// <20><>
if(m_bNightUv == true && m_bNightMap == true && m_bConvertNight == true)
pd3dDevice->SetTexture(1,m_BackupLightmap.GetTexture());
else
pd3dDevice->SetTexture(1,m_Lightmap.GetTexture());
pd3dDevice->LightEnable(0,FALSE);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
/**/
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT);
if(m_bModulate2X)
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
else
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
/**/
if(m_bNightUv != true || m_bNightMap != true || m_bConvertNight != true)
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_TEXCOORDINDEX,0);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_TEXCOORDINDEX,1);
////
//CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
//CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE);
m_pOutHouseObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
}
/*
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_TEXTURE2,(D3DMATRIX*)&matTex);
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_CAMERASPACEPOSITION );
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_PROJECTED | D3DTTFF_COUNT3 );
pd3dDevice->SetTexture(2,CSectorScene::m_CloudShadow.GetTexture());
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_MODULATE);
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT);
}
*/
/*
if(GF3OPTION)
{
matrix matTex;
matTex.MakeIdent();
pd3dDevice->SetTransform(D3DTS_TEXTURE2,(D3DMATRIX*)&matTex);
pd3dDevice->SetPixelShader(NULL);
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 2 );
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE );
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE);
pd3dDevice->SetTexture(2,NULL);
}
*/
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
}
else
{
/*
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,FALSE);
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
CSceneStateMgr::_SetD3DTextureStageState( 2,D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_COUNT3);
CSceneStateMgr::_SetD3DRenderState(D3DRS_NORMALIZENORMALS,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_LOCALVIEWER,TRUE);
pd3dDevice->SetTexture(2,CSceneManager::m_LightCubeTexture);
pd3dDevice->SetTexture(2,CSceneManager::m_DiffuseLightCubeTexture.GetTexture());
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP,D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP,D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_COLOROP,D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState(2, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
CSceneStateMgr::_SetD3DTextureStageState(2, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
CSceneStateMgr::_SetD3DTextureStageState(2, D3DTSS_ADDRESSW, D3DTADDRESS_CLAMP);
m_pOutHouseObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_TEXCOORDINDEX,2);
CSceneStateMgr::_SetD3DTextureStageState(2 ,D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
*/
CSceneManager::CGlareNode AddNode;
AddNode.m_bCubeEnv=true;
pd3dDevice->GetTransform(D3DTS_WORLD,AddNode.m_matPosition);
AddNode.m_pMeshObject=m_pOutHouseObject;
//CSceneManager::AddGlareNode(AddNode);
CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
pd3dDevice->LightEnable(0,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,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);
if(m_Detailmap.GetTexture())
{
pd3dDevice->SetTexture(1,m_Detailmap.GetTexture());
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
matrix matTex;
matTex.MakeIdent();
matTex._11=10.0f;
matTex._22=10.0f;
pd3dDevice->SetTransform(D3DTS_TEXTURE1,(D3DMATRIX*)&matTex);
pd3dDevice->SetPixelShader(NULL);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
m_pOutHouseObject->Render(pd3dDevice);
matTex.MakeIdent();
pd3dDevice->SetTransform(D3DTS_TEXTURE1,(D3DMATRIX*)&matTex);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE );
}
else
{
pd3dDevice->SetTexture(1,NULL);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_pOutHouseObject->Render(pd3dDevice);
}
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE);
}
}
if(m_pMedHouseObject)
{
if(m_isHaveLightmap)
{
pd3dDevice->SetTexture(1,m_Lightmap.GetTexture());
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 );
if(BaseGraphicsLayer::m_VoodooOption)
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE);
else
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
pd3dDevice->LightEnable(0,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE);
///////////// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
/**/
if(m_bNightUv != true || m_bNightMap != true || m_bConvertNight != true)
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR);
/////////////
m_pMedHouseObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
}
else
{
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE);
pd3dDevice->LightEnable(0,TRUE);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
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::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR, CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
m_pMedHouseObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE);
}
}
if(m_LightList.num>0 || m_ObjectList.num>0)
{
/*
pd3dDevice->SetTexture(1,NULL);
matrix matTM,matParentWorld;
pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParentWorld);
int cLight=0;
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
if(CSceneManager::m_bEditor)
{
for(cLight=0;cLight<m_LightList.num;cLight++)
{
matTM=m_LightList[cLight]->m_TM*matParentWorld;
pd3dDevice->SetTransform(D3DTS_WORLD ,matTM);
m_LightList[cLight]->m_AccumulateTM=matTM;
if(m_LightList[cLight]->isCulling())
{
if(CSceneManager::m_PickLightScene==m_LightList[cLight])
{
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR,0xffffffff);
m_LightList[cLight]->m_pLightObject->m_pLightObject->RenderBox(pd3dDevice);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
}
m_LightList[cLight]->m_pLightObject->m_pLightObject->Render(pd3dDevice);
}
}
}
matrix matLightTM;
int cEnableLight=1;
D3DLIGHT8 light;
ZeroMemory( &light, sizeof(D3DLIGHT8) );
light.Type=D3DLIGHT_POINT;
light.Attenuation0=1.0f;
pd3dDevice->SetLight( 0,&light );
vector3 vecLight,vecObject,vecInter;
float fInter;
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, 0xff303030);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
pd3dDevice->SetTexture(1,NULL);
for(int cObject=0;cObject<m_ObjectList.num;cObject++)
{
matTM=m_ObjectList[cObject]->m_TM*matParentWorld;
pd3dDevice->SetTransform(D3DTS_WORLD,matTM);
m_ObjectList[cObject]->m_AccumulateTM=matTM;
if(m_ObjectList[cObject]->isCulling())
{
if(m_ObjectList[cObject]->m_isAlpha)
{
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE);
}
cEnableLight=0;
for(cLight=0;cLight<m_LightList.num;cLight++)
{
matLightTM=m_LightList[cLight]->m_TM*matParentWorld;
vecLight=matLightTM.GetLoc();
vecObject=matTM.GetLoc();
vecInter=vecObject-vecLight;
fInter=vecInter.GetLens();
if(fInter > m_LightList[cLight]->m_pLightObject->m_fLightRange+m_ObjectList[cObject]->m_fRad)
continue;
if(matTM._42 <= matLightTM._42)
{
light.Diffuse.r=m_LightList[cLight]->m_pLightObject->m_LightColor.r/255.0f;
light.Diffuse.g=m_LightList[cLight]->m_pLightObject->m_LightColor.g/255.0f;
light.Diffuse.b=m_LightList[cLight]->m_pLightObject->m_LightColor.b/255.0f;
light.Position.x = light.Direction.x = matLightTM._41;
light.Position.y = light.Direction.y = matLightTM._42;
light.Position.z = light.Direction.z = matLightTM._43;
light.Range=m_LightList[cLight]->m_pLightObject->m_fLightRange;
pd3dDevice->SetLight( cEnableLight,&light );
pd3dDevice->LightEnable(cEnableLight,TRUE);
cEnableLight++;
}
}
if(CSceneManager::m_PickObjectScene==m_ObjectList[cObject])
{
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR,0xffffffff);
m_ObjectList[cObject]->m_pObject->RenderBox(pd3dDevice);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
}
m_ObjectList[cObject]->m_pObject->Render(pd3dDevice);
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);
if(m_ObjectList[cObject]->m_isAlpha)
{
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
}
}
}
*/
//pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParentWorld);
}
if(m_pInHouseObject)
{
if(m_isHaveInLightmap)
{
pd3dDevice->SetTexture(1,m_InLightmap.GetTexture());
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
if(BaseGraphicsLayer::m_VoodooOption)
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE);
else
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
pd3dDevice->LightEnable(0,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, 0xffffffff);
m_pInHouseObject->Render(pd3dDevice);
}
else
{
pd3dDevice->LightEnable(0,TRUE);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
//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::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
m_pInHouseObject->Render(pd3dDevice);
}
}
/*
m_pOutHouseObject->Render(pd3dDevice);
m_pMedHouseObject>Render(pd3dDevice);
m_pInHouseObject>Render(pd3dDevice);
*/
/*
D3DMATERIAL8 mtrl;
ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) );
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
pd3dDevice->SetMaterial( &mtrl );
matrix matParentWorld,matTM;
pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParentWorld);
vector3 vecHousePos;
vecHousePos.x=matParentWorld._41;
vecHousePos.y=matParentWorld._42;
vecHousePos.z=matParentWorld._43;
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
//CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_AmbientColor->c);
CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
if(m_isHaveLightmap)
{
pd3dDevice->SetTexture(1,m_Lightmap.GetTexture());
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 );
pd3dDevice->LightEnable(0,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
}
else
{
pd3dDevice->SetTexture(1,NULL);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
//CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
}
matrix *matViewPosition=(matrix*)CSceneManager::GetCamera()->GetMatPosition();
vector3 vecViewPos=matViewPosition->GetLoc();
vector3 vecViewPosInter;
vecViewPosInter=vecHousePos-vecViewPos;
float fViewInter=vecViewPosInter.GetLens();
if(fViewInter < MAX_HOUSEVIEWRANGE)
{
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);
if( fViewInter >MAX_HOUSEDISAPPER )
{
float fBlend=(fViewInter-MAX_HOUSEDISAPPER)/(MAX_HOUSEVIEWRANGE-MAX_HOUSEDISAPPER);
color TextureFactorColor;
TextureFactorColor=color::Interpolation(color(0,0,0,255),color(0,0,0,0),fBlend);
CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR,TextureFactorColor.c);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
if(m_pLodHouseObject)
{
pd3dDevice->SetTexture(1,NULL);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
//CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
pd3dDevice->LightEnable(0,TRUE);
m_pLodHouseObject->Render(pd3dDevice);
}
else
{
if(m_isHaveLightmap)
{
pd3dDevice->LightEnable(0,FALSE);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
m_pOutHouseObject->Render(pd3dDevice);
}
else
{
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
pd3dDevice->LightEnable(0,TRUE);
pd3dDevice->SetTexture(1,NULL);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
//CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
//CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
m_pOutHouseObject->Render(pd3dDevice);
}
}
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
return;
}
if(fViewInter>MAX_OUTVIEWRANGE)//LOD<4F><44>
{
if(m_pLodHouseObject)
{
pd3dDevice->SetTexture(1,NULL);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
//CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
pd3dDevice->LightEnable(0,TRUE);
m_pLodHouseObject->Render(pd3dDevice);
}
else
{
if(m_isHaveLightmap)
{
pd3dDevice->LightEnable(0,FALSE);
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::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
if(m_pOutHouseObject)
m_pOutHouseObject->Render(pd3dDevice);
}
else
{
pd3dDevice->LightEnable(0,TRUE);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
pd3dDevice->SetTexture(1,NULL);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
//CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
//CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
if(m_pOutHouseObject)
m_pOutHouseObject->Render(pd3dDevice);
}
}
}
else
{
if(m_isHaveLightmap)
{
pd3dDevice->LightEnable(0,FALSE);
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::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
if(m_pOutHouseObject)
m_pOutHouseObject->Render(pd3dDevice);
}
else
{
pd3dDevice->LightEnable(0,TRUE);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
pd3dDevice->SetTexture(1,NULL);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
//CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
//CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
if(m_pOutHouseObject)
m_pOutHouseObject->Render(pd3dDevice);
}
}
if(m_pMedHouseObject && fViewInter<MAX_MEDVIEWRANGE)
{
if(fViewInter<MAX_MEDVIEWRANGE)
{
color TextureFactorColor;
TextureFactorColor.a=255;
TextureFactorColor.r=0;
TextureFactorColor.g=0;
TextureFactorColor.b=0;
CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR,TextureFactorColor.c);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE);
m_pMedHouseObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
}
else
m_pMedHouseObject->Render(pd3dDevice);
}
if(m_pInHouseObject && fViewInter<MAX_INVIEWRANGE)
{
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, 0xffffffff);
m_pInHouseObject->Render(pd3dDevice);
}
if(fViewInter<MAX_INVIEWRANGE)
{
D3DMATERIAL8 mtrl;
ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) );
mtrl.Diffuse.r = mtrl.Ambient.r = 0.8f;
mtrl.Diffuse.g = mtrl.Ambient.g = 0.8f;
mtrl.Diffuse.b = mtrl.Ambient.b = 0.8f;
mtrl.Diffuse.a = mtrl.Ambient.a = 0.8f;
pd3dDevice->SetMaterial( &mtrl );
pd3dDevice->SetTexture(1,NULL);
int cLight=0;
if(CSceneManager::m_bEditor)
{
for(cLight=0;cLight<m_LightList.num;cLight++)
{
matTM=m_LightList[cLight]->m_TM*matParentWorld;
pd3dDevice->SetTransform(D3DTS_WORLD ,matTM);
m_LightList[cLight]->m_AccumulateTM=matTM;
if(m_LightList[cLight]->isCulling())
{
if(CSceneManager::m_PickLightScene==m_LightList[cLight])
{
m_LightList[cLight]->m_pLightObject->m_pLightObject->RenderBox(pd3dDevice);
}
if(CSceneManager::m_bIsPickObjectMoving!=MOVE_LIGHT)
m_LightList[cLight]->m_pLightObject->m_pLightObject->Render(pd3dDevice);
else
{
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE);
m_LightList[cLight]->m_pLightObject->m_pLightObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE);
}
}
}
}
matrix matLightTM;
int cEnableLight=1;
D3DLIGHT8 light;
ZeroMemory( &light, sizeof(D3DLIGHT8) );
light.Type=D3DLIGHT_POINT;
light.Attenuation0=1.0f;
pd3dDevice->SetLight( 0,&light );
vector3 vecLight,vecObject,vecInter;
float fInter;
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, 0xff303030);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
pd3dDevice->SetTexture(1,NULL);
for(int cObject=0;cObject<m_ObjectList.num;cObject++)
{
matTM=m_ObjectList[cObject]->m_TM*matParentWorld;
pd3dDevice->SetTransform(D3DTS_WORLD,matTM);
m_ObjectList[cObject]->m_AccumulateTM=matTM;
if(m_ObjectList[cObject]->isCulling())
{
CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR,0xffffffff);
if(m_ObjectList[cObject]->m_isAlpha)
{
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE);
}
cEnableLight=0;
for(cLight=0;cLight<m_LightList.num;cLight++)
{
matLightTM=m_LightList[cLight]->m_TM*matParentWorld;
//vecLight=m_LightList[cLight]->m_TM.GetLoc();
vecLight=matLightTM.GetLoc();
vecObject=matTM.GetLoc();
//vecObject=m_ObjectList[cObject]->m_TM.GetLoc();
vecInter=vecObject-vecLight;
fInter=vecInter.GetLens();
if(fInter > m_LightList[cLight]->m_pLightObject->m_fLightRange+m_ObjectList[cObject]->m_fRad)
continue;
if(matTM._42 <= matLightTM._42)
{
light.Diffuse.r=m_LightList[cLight]->m_pLightObject->m_LightColor.r/255.0f;
light.Diffuse.g=m_LightList[cLight]->m_pLightObject->m_LightColor.g/255.0f;
light.Diffuse.b=m_LightList[cLight]->m_pLightObject->m_LightColor.b/255.0f;
light.Position.x = light.Direction.x = matLightTM._41;
light.Position.y = light.Direction.y = matLightTM._42;
light.Position.z = light.Direction.z = matLightTM._43;
light.Range=m_LightList[cLight]->m_pLightObject->m_fLightRange;
pd3dDevice->SetLight( cEnableLight,&light );
pd3dDevice->LightEnable(cEnableLight,TRUE);
cEnableLight++;
}
}
if(CSceneManager::m_PickObjectScene==m_ObjectList[cObject])
{
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE);
m_ObjectList[cObject]->m_pObject->RenderBox(pd3dDevice);
m_ObjectList[cObject]->m_pObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE);
}
if(CSceneManager::m_bIsPickObjectMoving!=MOVE_OBJECT)
m_ObjectList[cObject]->m_pObject->Render(pd3dDevice);
else
{
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE);
m_ObjectList[cObject]->m_pObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE);
}
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);
if(m_ObjectList[cObject]->m_isAlpha)
{
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
}
}
}
}
if( fViewInter >MAX_HOUSEDISAPPER )
{
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
}
}
*/
}
void CHouseObject::GenerateOctree()
{
GetPolygon();
m_pOctree=new COctreeScene();
vector3 pPoly[3];
for(int i=0;i<m_pVertex.num;i++)
{
WORD *pIndices=m_pIndices[i];
vector3 *pVertex=m_pVertex[i];
for(int cIndices=0;cIndices<m_nIndices[i];cIndices++)
{
pPoly[0]=pVertex[pIndices[cIndices*3+0]];
pPoly[1]=pVertex[pIndices[cIndices*3+1]];
pPoly[2]=pVertex[pIndices[cIndices*3+2]];
m_pOctree->AddPoly(pPoly);
}
}
vector3 vecBoundBox[8];
vector3 vecPolyTest[3];
vector3 vecPlaneNormal;
matrix matTrans;
float fIntersection;
WORD wCollisionIndices[]=
{
4,1,0,
1,4,5,
5,3,1,
3,5,7,
7,2,3,
2,7,6,
6,0,2,
0,6,4
};
vector3 vecDirection[8];
vecDirection[0]=vector3(0.707f,0.0f,0.707f);
vecDirection[1]=vector3(0.707f,0.0f,-0.707f);
vecDirection[2]=vector3(-0.707f,0.0f,0.707f);
vecDirection[3]=vector3(-0.707f,0.0f,-0.707f);
vecDirection[4]=vector3(1.0f,0.0f,0.0f);
vecDirection[5]=vector3(-1.0f,0.0f,0.0f);
vecDirection[6]=vector3(0.0f,0.0f,1.0f);
vecDirection[7]=vector3(0.0f,0.0f,-1.0f);
vector3 vecLens;
matrix matTM;
for(int cObject=0;cObject<m_ObjectList.num;cObject++)
{
matTM=m_ObjectList[cObject]->m_TM;
vecBoundBox[0].x=m_ObjectList[cObject]->m_vecMinBox.x;
vecBoundBox[0].y=m_ObjectList[cObject]->m_vecMinBox.y;
vecBoundBox[0].z=m_ObjectList[cObject]->m_vecMinBox.z;
vecBoundBox[1].x=m_ObjectList[cObject]->m_vecMaxBox.x;
vecBoundBox[1].y=m_ObjectList[cObject]->m_vecMinBox.y;
vecBoundBox[1].z=m_ObjectList[cObject]->m_vecMinBox.z;
vecBoundBox[2].x=m_ObjectList[cObject]->m_vecMinBox.x;
vecBoundBox[2].y=m_ObjectList[cObject]->m_vecMinBox.y;
vecBoundBox[2].z=m_ObjectList[cObject]->m_vecMaxBox.z;
vecBoundBox[3].x=m_ObjectList[cObject]->m_vecMaxBox.x;
vecBoundBox[3].y=m_ObjectList[cObject]->m_vecMinBox.y;
vecBoundBox[3].z=m_ObjectList[cObject]->m_vecMaxBox.z;
vecBoundBox[4].x=m_ObjectList[cObject]->m_vecMinBox.x;
vecBoundBox[4].y=m_ObjectList[cObject]->m_vecMaxBox.y+50.0f;
vecBoundBox[4].z=m_ObjectList[cObject]->m_vecMinBox.z;
vecBoundBox[5].x=m_ObjectList[cObject]->m_vecMaxBox.x;
vecBoundBox[5].y=m_ObjectList[cObject]->m_vecMaxBox.y+50.0f;
vecBoundBox[5].z=m_ObjectList[cObject]->m_vecMinBox.z;
vecBoundBox[6].x=m_ObjectList[cObject]->m_vecMinBox.x;
vecBoundBox[6].y=m_ObjectList[cObject]->m_vecMaxBox.y+50.0f;
vecBoundBox[6].z=m_ObjectList[cObject]->m_vecMaxBox.z;
vecBoundBox[7].x=m_ObjectList[cObject]->m_vecMaxBox.x;
vecBoundBox[7].y=m_ObjectList[cObject]->m_vecMaxBox.y+50.0f;
vecBoundBox[7].z=m_ObjectList[cObject]->m_vecMaxBox.z;
for(int i=0;i<8;i++)
{
matTrans.Translation(vecBoundBox[i]);
matTrans=matTrans*matTM;
vecBoundBox[i]=matTrans.GetLoc();
}
//
//vecPolyTest[0]=vecBoundBox[4];
//vecPolyTest[1]=vecBoundBox[0];
//vecPolyTest[2]=vecBoundBox[1];
bool bAlready=false;
for(int cIndices=0;cIndices<8;cIndices++)
{
vecPolyTest[0]=vecBoundBox[wCollisionIndices[cIndices*3+0]];
vecPolyTest[1]=vecBoundBox[wCollisionIndices[cIndices*3+1]];
vecPolyTest[2]=vecBoundBox[wCollisionIndices[cIndices*3+2]];
m_pOctree->AddPoly(vecPolyTest);
}
}
m_pOctree->GenerateOctree();
}
//DEL void CHouseObject::GetVertex()
//DEL {
//DEL vector3 *pVertex;
//DEL WORD *pIndices;
//DEL if(m_pOutHouseObject)
//DEL {
//DEL m_pOutHouseObject->AllLockBuffer();
//DEL for(int i=0;i<m_pOutHouseObject->GetObjectCount();i++)
//DEL {
//DEL pVertex=new vector3[m_pOutHouseObject->m_nVertex[i]];
//DEL for(int cv=0;cv<m_pOutHouseObject->m_nVertex[i];cv++)
//DEL //pVertex[cv]=((MultiVertex)m_pOutHouseObject->m_pVertex[i][cv]).v;
//DEL pVertex[cv]=m_pOutHouseObject->m_pVertex[i]
//DEL m_pVertex.Add(pVertex);
//DEL m_nVertex.Add(m_pOutHouseObject->m_nVertex[i]);
//DEL
//DEL pIndices=new WORD[m_pOutHouseObject->m_nIndices[i]*3];
//DEL memcpy(pIndices,m_pOutHouseObject->m_pIndices[i],sizeof(WORD)*m_pOutHouseObject->m_nIndices[i]*3);
//DEL
//DEL m_pIndices.Add(pIndices);
//DEL m_nIndices.Add(m_pOutHouseObject->m_nIndices[i]);
//DEL //m_pIndices.Add(m_pOutHouseObject->m_pIndices[i]);
//DEL //m_nIndices.Add(m_pOutHouseObject->m_nIndices[i]);
//DEL }
//DEL }
//DEL if(m_pMedHouseObject)
//DEL {
//DEL m_pMedHouseObject->AllLockBuffer();
//DEL for(int i=0;i<m_pMedHouseObject->GetObjectCount();i++)
//DEL {
//DEL pVertex=new vector3[m_pMedHouseObject->m_nVertex[i]];
//DEL for(int cv=0;cv<m_pMedHouseObject->m_nVertex[i];cv++)
//DEL pVertex[cv]=m_pMedHouseObject->m_pVertex[i][cv].v;
//DEL m_pVertex.Add(pVertex);
//DEL m_nVertex.Add(m_pMedHouseObject->m_nVertex[i]);
//DEL
//DEL pIndices=new WORD[m_pMedHouseObject->m_nIndices[i]*3];
//DEL memcpy(pIndices,m_pMedHouseObject->m_pIndices[i],sizeof(WORD)*m_pMedHouseObject->m_nIndices[i]*3);
//DEL
//DEL m_pIndices.Add(pIndices);
//DEL m_nIndices.Add(m_pMedHouseObject->m_nIndices[i]);
//DEL
//DEL
//DEL //m_pIndices.Add(m_pMedHouseObject->m_pIndices[i]);
//DEL //m_nIndices.Add(m_pMedHouseObject->m_nIndices[i]);
//DEL }
//DEL }
//DEL if(m_pInHouseObject)
//DEL {
//DEL m_pInHouseObject->AllLockBuffer();
//DEL for(int i=0;i<m_pInHouseObject->GetObjectCount();i++)
//DEL {
//DEL pVertex=new vector3[m_pInHouseObject->m_nVertex[i]];
//DEL for(int cv=0;cv<m_pInHouseObject->m_nVertex[i];cv++)
//DEL pVertex[cv]=m_pInHouseObject->m_pVertex[i][cv].v;
//DEL m_pVertex.Add(pVertex);
//DEL m_nVertex.Add(m_pInHouseObject->m_nVertex[i]);
//DEL
//DEL
//DEL pIndices=new WORD[m_pInHouseObject->m_nIndices[i]*3];
//DEL memcpy(pIndices,m_pInHouseObject->m_pIndices[i],sizeof(WORD)*m_pInHouseObject->m_nIndices[i]*3);
//DEL
//DEL m_pIndices.Add(pIndices);
//DEL m_nIndices.Add(m_pInHouseObject->m_nIndices[i]);
//DEL
//DEL //m_pIndices.Add(m_pInHouseObject->m_pIndices[i]);
//DEL //m_nIndices.Add(m_pInHouseObject->m_nIndices[i]);
//DEL }
//DEL }
//DEL
//DEL if(m_pOutHouseObject)
//DEL m_pOutHouseObject->AllUnlockBuffer();
//DEL if(m_pMedHouseObject)
//DEL m_pMedHouseObject->AllUnlockBuffer();
//DEL if(m_pInHouseObject)
//DEL m_pInHouseObject->AllUnlockBuffer();
//DEL
//DEL }
void CHouseObject::CalcBox(vector3 &MinBox, vector3 &MaxBox,int iSelect)
{
if(!iSelect)
{
if(m_pLodHouseObject)
{
MaxBox=m_pLodHouseObject->m_MaxBox;
MinBox=m_pLodHouseObject->m_MinBox;
}
if(m_pOutHouseObject)
{
MaxBox=m_pOutHouseObject->m_MaxBox;
MinBox=m_pOutHouseObject->m_MinBox;
}
if(m_pMedHouseObject)
{
if(MaxBox.x < m_pMedHouseObject->m_MaxBox.x)
MaxBox.x=m_pMedHouseObject->m_MaxBox.x;
if(MaxBox.y < m_pMedHouseObject->m_MaxBox.y)
MaxBox.y=m_pMedHouseObject->m_MaxBox.y;
if(MaxBox.z < m_pMedHouseObject->m_MaxBox.z)
MaxBox.z=m_pMedHouseObject->m_MaxBox.z;
if(MinBox.x > m_pMedHouseObject->m_MinBox.x)
MaxBox.x=m_pMedHouseObject->m_MinBox.x;
if(MinBox.y > m_pMedHouseObject->m_MinBox.y)
MinBox.y=m_pMedHouseObject->m_MinBox.y;
if(MinBox.z > m_pMedHouseObject->m_MinBox.z)
MinBox.z=m_pMedHouseObject->m_MinBox.z;
}
if(m_pInHouseObject)
{
if(MaxBox.x < m_pOutHouseObject->m_MaxBox.x)
MaxBox.x=m_pOutHouseObject->m_MaxBox.x;
if(MaxBox.y < m_pOutHouseObject->m_MaxBox.y)
MaxBox.y=m_pOutHouseObject->m_MaxBox.y;
if(MaxBox.z < m_pOutHouseObject->m_MaxBox.z)
MaxBox.z=m_pOutHouseObject->m_MaxBox.z;
if(MinBox.x > m_pOutHouseObject->m_MinBox.x)
MaxBox.x=m_pOutHouseObject->m_MinBox.x;
if(MinBox.y > m_pOutHouseObject->m_MinBox.y)
MinBox.y=m_pOutHouseObject->m_MinBox.y;
if(MinBox.z > m_pOutHouseObject->m_MinBox.z)
MinBox.z=m_pOutHouseObject->m_MinBox.z;
}
}
else if(iSelect == 1)
{
if(m_pInHouseObject)
{
MaxBox = m_pInHouseObject->m_MaxBox;
MinBox = m_pInHouseObject->m_MinBox;
}
}
}
void CHouseObject::GetPolygon()
{
int cObject;
m_pIndices.num=0;
m_nIndices.num=0;
m_pVertex.num=0;
if(m_pOutHouseObject)
{
m_pOutHouseObject->AllLockBuffer();
for(cObject=0;cObject<m_pOutHouseObject->GetObjectCount();cObject++)
{
vector3 *AddVertex=new vector3[m_pOutHouseObject->m_nVertex[cObject]];
MultiVertex *pVertex=(MultiVertex*)m_pOutHouseObject->m_pVertex[cObject];
for(int cVertex=0;cVertex<m_pOutHouseObject->m_nVertex[cObject];cVertex++)
AddVertex[cVertex]=pVertex[cVertex].v;
m_pVertex.Add(AddVertex);
WORD *AddIndices=new WORD[m_pOutHouseObject->m_nIndices[cObject]*3];
memcpy(AddIndices,m_pOutHouseObject->m_pIndices[cObject],sizeof(WORD)*3*m_pOutHouseObject->m_nIndices[cObject]);
m_pIndices.Add(AddIndices);
m_nIndices.Add(m_pOutHouseObject->m_nIndices[cObject]);
}
m_pOutHouseObject->AllUnlockBuffer();
}
if(m_pInHouseObject)
{
m_pInHouseObject->AllLockBuffer();
for(cObject=0;cObject<m_pInHouseObject->GetObjectCount();cObject++)
{
vector3 *AddVertex=new vector3[m_pInHouseObject->m_nVertex[cObject]];
MultiVertex *pVertex=(MultiVertex*)m_pInHouseObject->m_pVertex[cObject];
for(int cVertex=0;cVertex<m_pInHouseObject->m_nVertex[cObject];cVertex++)
AddVertex[cVertex]=pVertex[cVertex].v;
m_pVertex.Add(AddVertex);
WORD *AddIndices=new WORD[m_pInHouseObject->m_nIndices[cObject]*3];
memcpy(AddIndices,m_pInHouseObject->m_pIndices[cObject],sizeof(WORD)*3*m_pInHouseObject->m_nIndices[cObject]);
m_pIndices.Add(AddIndices);
m_nIndices.Add(m_pInHouseObject->m_nIndices[cObject]);
}
m_pInHouseObject->AllUnlockBuffer();
}
if(m_pMedHouseObject)
{
m_pMedHouseObject->AllLockBuffer();
for(cObject=0;cObject<m_pMedHouseObject->GetObjectCount();cObject++)
{
vector3 *AddVertex=new vector3[m_pMedHouseObject->m_nVertex[cObject]];
MultiVertex *pVertex=(MultiVertex*)m_pMedHouseObject->m_pVertex[cObject];
for(int cVertex=0;cVertex<m_pMedHouseObject->m_nVertex[cObject];cVertex++)
AddVertex[cVertex]=pVertex[cVertex].v;
m_pVertex.Add(AddVertex);
WORD *AddIndices=new WORD[m_pMedHouseObject->m_nIndices[cObject]*3];
memcpy(AddIndices,m_pMedHouseObject->m_pIndices[cObject],sizeof(WORD)*3*m_pMedHouseObject->m_nIndices[cObject]);
m_pIndices.Add(AddIndices);
m_nIndices.Add(m_pMedHouseObject->m_nIndices[cObject]);
}
m_pMedHouseObject->AllUnlockBuffer();
}
}
matrix CHouseObject::RenderShadow(LPDIRECT3DDEVICE8 pd3dDevice)
{
matrix matOldCamera,matOldProjection;
pd3dDevice->GetTransform(D3DTS_VIEW,matOldCamera);
pd3dDevice->GetTransform(D3DTS_PROJECTION,matOldProjection);
pd3dDevice->EndScene();
//CShadowMap::Begin(pd3dDevice);
pd3dDevice->BeginScene();
//CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE, 0);
pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00BFBFBF, 1.0f, 0L);
matrix matShadowProj;
matShadowProj.MakeProjection(3.14159f/3.0f,1.0f,1500.0f,6500.0f);
matrix matParentWorld;
pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParentWorld);
vector3 vecHousePos=matParentWorld.GetLoc();
matrix matShadowCamera;
pd3dDevice->SetTransform(D3DTS_PROJECTION,matShadowProj);
static float fRot=0.0f;
vector3 vecSunLight;
vecSunLight.y=0.5f;
vecSunLight.x=sinf(fRot);
vecSunLight.z=cosf(fRot);
vecSunLight.Normalize();
fRot+=0.0008f;
if(m_pOutHouseObject)
{
vector3 vecCenter=(m_pOutHouseObject->m_MaxBox+m_pOutHouseObject->m_MinBox)/2.0f;
matShadowCamera.CameraLookAt(
vecHousePos+vecSunLight*4500.0f+vecCenter,
vecHousePos+vecCenter,
vector3(0.0f,1.0f,0.0f));
pd3dDevice->SetTransform(D3DTS_VIEW,matShadowCamera);
pd3dDevice->SetTexture(1,m_Lightmap.GetTexture());
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 );
pd3dDevice->LightEnable(0,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
DWORD dwTempShader=m_pOutHouseObject->m_dwCustomizeShader;
m_pOutHouseObject->m_dwCustomizeShader=0xffffffff;
m_pOutHouseObject->Render(pd3dDevice);
m_pOutHouseObject->m_dwCustomizeShader=dwTempShader;
pd3dDevice->SetVertexShaderConstant(12,&vecSunLight,1);
}
//matParentWorld.Transpose();
matrix matWVP;
matWVP=matParentWorld*matShadowCamera;
matWVP=matWVP*matShadowProj;
/*
CSceneStateMgr::_SetD3DRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE |
D3DCOLORWRITEENABLE_GREEN |
D3DCOLORWRITEENABLE_RED);
*/
pd3dDevice->EndScene();
//CShadowMap::End(pd3dDevice);
pd3dDevice->BeginScene();
pd3dDevice->SetTransform(D3DTS_VIEW,matOldCamera);
pd3dDevice->SetTransform(D3DTS_PROJECTION,matOldProjection);
return matWVP;
}
void CHouseObject::RenderGlare(LPDIRECT3DDEVICE8 pd3dDevice)
{
if(m_pBspObject)
{
return;
}
if(m_pLodHouseObject && !m_pOutHouseObject)
{
return;
}
if(m_pOutHouseObject)
{
if(m_isHaveLightmap)
{
if(CRenderOption::m_AllObjectBump)
{
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_TEXCOORDINDEX,0);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_TEXCOORDINDEX,1);
CSceneStateMgr::_SetD3DTextureStageState(2,D3DTSS_TEXCOORDINDEX,2);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_TEXCOORDINDEX,3);
pd3dDevice->SetTexture(2,m_Lightmap.GetTexture());
pd3dDevice->SetTexture(3,m_pNormalizeCubeMap);
matrix matView,matProjection,matWorld,matWVP;
pd3dDevice->GetTransform(D3DTS_VIEW,matView);
pd3dDevice->GetTransform(D3DTS_PROJECTION,matProjection);
pd3dDevice->GetTransform(D3DTS_WORLD,matWorld);
matWVP=matWorld*matView*matProjection;
matWVP.Transpose();
vector3 vecPos=matWorld.GetLoc();
pd3dDevice->SetVertexShaderConstant(16,&matWVP, 4);
matrix matInv;
matInv.Inverse(matWorld);
matrix *matViewPosition=CSceneManager::GetCamera()->GetMatPosition();
vector3 vecViewPos=vector3(matViewPosition->_41,matViewPosition->_42,matViewPosition->_43);
matrix matViewPos;
matViewPos.Translation(vecViewPos);
matViewPos=matViewPos*matInv;
float fObjectSpaceViewPosition[4]={matViewPos._41,matViewPos._42,matViewPos._43,0.0f};
pd3dDevice->SetVertexShaderConstant(35,fObjectSpaceViewPosition,1);
//////////////////
matWorld._41=matWorld._42=matWorld._43=0.0f;
matInv.Inverse(matWorld);
vector3 vecLightPos=vector3(1.0f,1.0f,1.0f);
vecLightPos.Normalize();
vecLightPos=vecLightPos*10000.0f;
matrix matLightPos;
matLightPos.Translation(vecLightPos);
matLightPos=matLightPos*matInv;
float fObjectSpaceLightPosition[4]={matLightPos._41,matLightPos._42,matLightPos._43,1.0f};
pd3dDevice->SetVertexShaderConstant(32,fObjectSpaceLightPosition,1);
/*
pd3dDevice->SetPixelShader(m_dwHouseDiffusePixelShader);
m_pOutHouseObject->m_dwCustomizeShader=m_dwHouseDiffuseVertexShader;
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSU,D3DTADDRESS_CLAMP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSV,D3DTADDRESS_CLAMP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSW,D3DTADDRESS_CLAMP);
m_pOutHouseObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSU,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSV,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSW,D3DTADDRESS_WRAP);
pd3dDevice->SetPixelShader(NULL);
m_pOutHouseObject->m_dwCustomizeShader=0xffffffff;
*/
pd3dDevice->SetPixelShader(m_dwHouseSpecularPixelShader);
m_pOutHouseObject->m_dwCustomizeShader=m_dwHouseSpecularVertexShader;
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ADDRESSU,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ADDRESSV,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ADDRESSW,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ADDRESSU,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ADDRESSV,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ADDRESSW,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(2,D3DTSS_ADDRESSU,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(2,D3DTSS_ADDRESSV,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(2,D3DTSS_ADDRESSW,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSU,D3DTADDRESS_CLAMP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSV,D3DTADDRESS_CLAMP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSW,D3DTADDRESS_CLAMP);
m_pOutHouseObject->Render(pd3dDevice);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSU,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSV,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSW,D3DTADDRESS_WRAP);
pd3dDevice->SetPixelShader(NULL);
m_pOutHouseObject->m_dwCustomizeShader=0xffffffff;
pd3dDevice->SetTexture(3,NULL);
}
}
}
}
void CHouseObject::RenderBlack( LPDIRECT3DDEVICE8 pd3dDevice )
{
D3DMATERIAL8 mtrl;
ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) );
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
pd3dDevice->SetMaterial( &mtrl );
if(m_pBspObject)
{
if(CSceneManager::m_bEditor)
{
if(CSceneManager::m_PickHouseScene && CSceneManager::m_PickHouseScene->m_HouseObject == this)
{
m_pBspObject->RenderBox(pd3dDevice,0xffff0000);
}
else
{
m_pBspObject->RenderBox(pd3dDevice,0xffffffff);
}
matrix matTM,matParentWorld;
pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParentWorld);
for(int cObject=0;cObject<m_ObjectList.num;cObject++)
{
matTM=m_ObjectList[cObject]->m_TM*matParentWorld;
pd3dDevice->SetTransform(D3DTS_WORLD,matTM);
m_ObjectList[cObject]->m_AccumulateTM=matTM;
//if(m_ObjectList[cObject]->isCulling())
{
if(CSceneManager::m_PickObjectScene==m_ObjectList[cObject])
{
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR,0xffffffff);
m_ObjectList[cObject]->m_pObject->RenderBox(pd3dDevice);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
}
//==============
// 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_ObjectList[cObject]->m_pObject->RenderGlare(pd3dDevice);
}
}
pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&matParentWorld);
}
return;
}
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE);
pd3dDevice->SetTexture(2,NULL);
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE);
if(m_pLodHouseObject && !m_pOutHouseObject)
{
pd3dDevice->LightEnable(0,TRUE);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
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::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
//==============
// 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 );
*/
/*CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
*/
m_pLodHouseObject->RenderGlare(pd3dDevice);
return;
}
if(m_pOutHouseObject)
{
if(m_isHaveLightmap)
{
if(CRenderOption::m_AllObjectBump)
{
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_TEXCOORDINDEX,0);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_TEXCOORDINDEX,1);
CSceneStateMgr::_SetD3DTextureStageState(2,D3DTSS_TEXCOORDINDEX,2);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_TEXCOORDINDEX,3);
pd3dDevice->SetTexture(2,m_Lightmap.GetTexture());
//pd3dDevice->SetTexture(3,m_pNormalizeCubeMap);
float fHouseAmbientLight[4]={CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.r/255.0f,
CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.g/255.0f,
CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.b/255.0f,1.0f};
pd3dDevice->SetPixelShaderConstant(0,fHouseAmbientLight,1);
matrix matView,matProjection,matWorld,matWVP;
pd3dDevice->GetTransform(D3DTS_VIEW,matView);
pd3dDevice->GetTransform(D3DTS_PROJECTION,matProjection);
pd3dDevice->GetTransform(D3DTS_WORLD,matWorld);
matWVP=matWorld*matView*matProjection;
matWVP.Transpose();
pd3dDevice->SetVertexShaderConstant(16,&matWVP, 4);
pd3dDevice->SetPixelShader(m_dwHouseDiffusePixelShader);
m_pOutHouseObject->m_dwCustomizeShader=m_dwHouseDiffuseVertexShader;
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSU,D3DTADDRESS_CLAMP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSV,D3DTADDRESS_CLAMP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSW,D3DTADDRESS_CLAMP);
//==============
// 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_pOutHouseObject->RenderGlare(pd3dDevice);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSU,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSV,D3DTADDRESS_WRAP);
CSceneStateMgr::_SetD3DTextureStageState(3,D3DTSS_ADDRESSW,D3DTADDRESS_WRAP);
pd3dDevice->SetPixelShader(NULL);
m_pOutHouseObject->m_dwCustomizeShader=0xffffffff;
}
else
{
// <20><>
if(m_bNightUv == true && m_bNightMap == true && m_bConvertNight == true)
pd3dDevice->SetTexture(1,m_BackupLightmap.GetTexture());
else
pd3dDevice->SetTexture(1,m_Lightmap.GetTexture());
pd3dDevice->LightEnable(0,FALSE);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
/**/
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
/**/
if(m_bNightUv != true || m_bNightMap != true || m_bConvertNight != true)
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_TEXCOORDINDEX,0);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_TEXCOORDINDEX,1);
////
//==============
// 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 );
*/
/*CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
*/
m_pOutHouseObject->RenderGlare(pd3dDevice);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
}
}
else
{
CSceneManager::CGlareNode AddNode;
AddNode.m_bCubeEnv=true;
pd3dDevice->GetTransform(D3DTS_WORLD,AddNode.m_matPosition);
AddNode.m_pMeshObject=m_pOutHouseObject;
//CSceneManager::AddGlareNode(AddNode);
CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
pd3dDevice->LightEnable(0,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,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);
if(m_Detailmap.GetTexture())
{
pd3dDevice->SetTexture(1,m_Detailmap.GetTexture());
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
matrix matTex;
matTex.MakeIdent();
matTex._11=10.0f;
matTex._22=10.0f;
pd3dDevice->SetTransform(D3DTS_TEXTURE1,(D3DMATRIX*)&matTex);
pd3dDevice->SetPixelShader(NULL);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
//==============
// 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 );*/
/*CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
*/
m_pOutHouseObject->RenderGlare(pd3dDevice);
matTex.MakeIdent();
pd3dDevice->SetTransform(D3DTS_TEXTURE1,(D3DMATRIX*)&matTex);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE );
}
else
{
pd3dDevice->SetTexture(1,NULL);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
//==============
// 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 );
*/
/*CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
*/
m_pOutHouseObject->RenderGlare(pd3dDevice);
}
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE);
}
}
if(m_pMedHouseObject)
{
if(m_isHaveLightmap)
{
pd3dDevice->SetTexture(1,m_Lightmap.GetTexture());
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 );
if(BaseGraphicsLayer::m_VoodooOption)
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE);
else
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
pd3dDevice->LightEnable(0,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE);
//==============
// 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 );
*/
/*CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
*/
m_pMedHouseObject->RenderGlare(pd3dDevice);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
}
else
{
pd3dDevice->LightEnable(0,TRUE);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
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::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
//==============
// 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 );
*/
/*CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
*/
m_pMedHouseObject->RenderGlare(pd3dDevice);
}
}
if(m_LightList.num>0 || m_ObjectList.num>0)
{
}
if(m_pInHouseObject)
{
if(m_isHaveLightmap)
{
pd3dDevice->SetTexture(1,m_Lightmap.GetTexture());
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 );
if(BaseGraphicsLayer::m_VoodooOption)
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE);
else
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
pd3dDevice->LightEnable(0,FALSE);
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, 0xffffffff);
//==============
// 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 );
*/
/*CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
*/
m_pInHouseObject->RenderGlare(pd3dDevice);
}
else
{
pd3dDevice->LightEnable(0,TRUE);
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
//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::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
//==============
// 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 );
*/
/*CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
*/
m_pInHouseObject->RenderGlare(pd3dDevice);
}
}
}