// 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;iAllLockBuffer(); for(int i=0;im_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;cObjectScenem_pObject->AllLockBuffer(); } // LightMap Generator List pMeshVertex; List pMeshIndices; List nMeshVertex; List nMeshIndices; List IndicesUsed; int cObject = 0; if(m_pOutHouseObject) { m_pOutHouseObject->AllLockBuffer(); for(cObject=0;cObjectGetObjectCount();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= -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;cObjectGetObjectCount();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;cObjectGetObjectCount();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;im_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;im_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;cObjectScenem_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,"¾ËÆÄ°è»ê ?","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,"µð·º¼Ç + Æ÷ÀÎÆ® + ½ºÄ«ÀÌ?","MSG",MB_YESNO) == IDNO) { iValue = 3; } */ switch(MessageBox(NULL,"¾ËÆÄ°è»ê ?","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;cObjectScenem_pObject->AllLockBuffer(); } vector3 vecLight(1.0f,1.0f,1.0f); vecLight=matSet*vecLight; vecLight.Normalize(); vector3 *vecFirstDetect[3]; List vecClassfy; List IndicesUsed; List LightmapSizeX; List LightmapSizeY; int UsedPlane=0; int cObject=0,cTotalObject=0; List pMeshVertex; List pMeshIndices; List nMeshVertex; int cIntersectionPoly=0; int NotUsedPlane=0; if(m_pOutHouseObject) { m_pOutHouseObject->AllLockBuffer(); for(cObject=0;cObjectGetObjectCount();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;cObjectGetObjectCount();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;cObjectGetObjectCount();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 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= -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;cIndicesx, 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;cIndicestu1=(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 InTriangle; List 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 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;cAmbientObjectm_TM; if(m_ObjectList[cObjectScene]->m_pObject->m_dwShader==MultiFVF) { matrix matTransPoly; for(int cMesh=0;cMeshm_pObject->m_nIndices.num;cMesh++) { MultiVertex *pVertex=(MultiVertex *)m_ObjectList[cObjectScene]->m_pObject->m_pVertex[cMesh]; for(int cIndices=0;cIndicesm_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;cMeshm_pObject->m_nIndices.num;cMesh++) { LightVertex *pVertex=(LightVertex *)m_ObjectList[cObjectScene]->m_pObject->m_pVertex[cMesh]; matrix matTransPoly; for(int cIndices=0;cIndicesm_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;cLightObjectm_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;cOtherObjectm_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;cMeshm_pObject->m_nIndices.num;cMesh++) { MultiVertex *pVertex=(MultiVertex *)m_ObjectList[cObjectScene]->m_pObject->m_pVertex[cMesh]; for(int cIndices=0;cIndicesm_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;cMeshm_pObject->m_nIndices.num;cMesh++) { LightVertex *pVertex=(LightVertex *)m_ObjectList[cObjectScene]->m_pObject->m_pVertex[cMesh]; matrix matTransPoly; for(int cIndices=0;cIndicesm_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;ixm_pObject->AllUnlockBuffer(); } /* LPDIRECT3DTEXTURE8 LightmapTexture=(LPDIRECT3DTEXTURE8)m_Lightmap.GetTexture(); LPDIRECT3DSURFACE8 Lightmap; LightmapTexture->GetSurfaceLevel(0,&Lightmap); LPDIRECT3DSURFACE8 LightmapSource=NULL; */ List 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= 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= 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> 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;cObjectAllUnlockBuffer(); 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;cObjectm_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 { // ¹ã 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); ///////////// ¿¥ºñ¾ðÆ® ¼öÁ¤ 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;cLightm_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;cObjectm_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;cLightm_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Áý { 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 && fViewInterRender(pd3dDevice); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); } else m_pMedHouseObject->Render(pd3dDevice); } if(m_pInHouseObject && fViewInterRender(pd3dDevice); } if(fViewInterSetMaterial( &mtrl ); pd3dDevice->SetTexture(1,NULL); int cLight=0; if(CSceneManager::m_bEditor) { for(cLight=0;cLightm_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;cObjectm_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;cLightm_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;iAddPoly(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;cObjectm_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;iGetObjectCount();i++) //DEL { //DEL pVertex=new vector3[m_pOutHouseObject->m_nVertex[i]]; //DEL for(int cv=0;cvm_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;iGetObjectCount();i++) //DEL { //DEL pVertex=new vector3[m_pMedHouseObject->m_nVertex[i]]; //DEL for(int cv=0;cvm_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;iGetObjectCount();i++) //DEL { //DEL pVertex=new vector3[m_pInHouseObject->m_nVertex[i]]; //DEL for(int cv=0;cvm_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;cObjectGetObjectCount();cObject++) { vector3 *AddVertex=new vector3[m_pOutHouseObject->m_nVertex[cObject]]; MultiVertex *pVertex=(MultiVertex*)m_pOutHouseObject->m_pVertex[cObject]; for(int cVertex=0;cVertexm_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;cObjectGetObjectCount();cObject++) { vector3 *AddVertex=new vector3[m_pInHouseObject->m_nVertex[cObject]]; MultiVertex *pVertex=(MultiVertex*)m_pInHouseObject->m_pVertex[cObject]; for(int cVertex=0;cVertexm_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;cObjectGetObjectCount();cObject++) { vector3 *AddVertex=new vector3[m_pMedHouseObject->m_nVertex[cObject]]; MultiVertex *pVertex=(MultiVertex*)m_pMedHouseObject->m_pVertex[cObject]; for(int cVertex=0;cVertexm_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;cObjectm_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 { // ¹ã 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); } } }