// SkyScene.cpp: implementation of the CSkyScene class. // ////////////////////////////////////////////////////////////////////// #include "SkyScene.h" #include "SceneManager.h" #include "CEffScript.h" #include "SceneStateMgr.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CTexture CSkyScene::m_CloudTexture; // Rain µ¿±â Ãß°¡ CTexture CSkyScene::m_LightLayerTexture[LIGHTLAYER]; CSkyScene::CSkyScene() { m_fFogLayerHeight[0]=50000.0f; m_fFogLayerHeight[1]=40000.0f; m_fFogLayerHeight[2]=0.0f; m_iRenderLightLayer[0] = 0; m_iRenderLightLayer[1] = 0; m_iRenderLightLayer[2] = 0; } CSkyScene::~CSkyScene() { } void CSkyScene::Create() { //LogMessage("SkyScene Create"); float fDivAng=(3.141597f*2.0f)/SKYDIVIDE; int i; m_SkyVertex[0].v=vector3(0.0f,fSky_Height,0.0f); m_SkyVertex[0].spec.c=0.0f; for(i=1;iCreateVertexBuffer(SKYVERTEX*sizeof(LVertex), D3DUSAGE_WRITEONLY,LVERTEXFVF,D3DPOOL_MANAGED, &m_pSkyVertex); m_pSkyVertex->Lock(0,0,(BYTE**)&pVertex,0); pVertex[0].v.x=0.0f; pVertex[0].v.z=0.0f; pVertex[0].v.y=fSky_Height; pVertex[0].diff.c=0xff0000af; pVertex[0].spec.c=0x0; float fDivAng=(3.141597f*2.0f)/SKYDIVIDE; for(int i=1;iUnlock(); CSceneManager::GetDevice()->CreateVertexBuffer(SKYVERTEX*sizeof(LVertex), D3DUSAGE_WRITEONLY,LVERTEXFVF,D3DPOOL_MANAGED, &m_pCloudVertex); m_pCloudVertex->Lock(0,0,(BYTE**)&pVertex,0); pVertex[0].v.x=0.0f; pVertex[0].v.z=0.0f; pVertex[0].v.y=fCloud_Height; pVertex[0].diff.c=0x0; pVertex[0].spec.c=0x0; pVertex[0].tu=0.0f; pVertex[0].tv=0.0f; for(i=1;iUnlock(); /* m_skymesh[0].x=0.0f; m_skymesh[0].z=0.0f; m_skymesh[0].y=80000; m_skymesh[0].color=0xff0000af; m_skymesh[0].specular=0x0; float fDivAng=(3.141597f*2.0f)/SKYDIVIDE; for(int i=1;iGetTransform(D3DTS_WORLD,(D3DMATRIX*)(&matWorld)); vector3 *vecViewPos=CSceneManager::GetCamera()->GetPosition(); matrix mat; mat.Translation(vector3(vecViewPos->x,0.0f,vecViewPos->z)); mat=mat*matWorld; pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&mat); pd3dDevice->SetTexture(0,NULL); pd3dDevice->SetTexture(1,NULL); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); pd3dDevice->SetVertexShader(LVERTEXFVF); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_SkyVertex,sizeof(LVertex)); // //CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); /* CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP,D3DTOP_SELECTARG2); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); pd3dDevice->SetTexture(0,m_CloudTexture.GetTexture()); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_CloudVertex[0],sizeof(LVertex)); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_CloudVertex[1],sizeof(LVertex)); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_CloudVertex[2],sizeof(LVertex)); */ //CSceneStateMgr::_SetD3DRenderState(D3DRS_ZFUNC,D3DCMP_ALWAYS); pd3dDevice->DrawPrimitiveUP(D3DPT_POINTLIST,STARVERTEX,m_StarVertex,sizeof(LVertex)); //CSceneStateMgr::_SetD3DRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); //*/ } void CSkyScene::SetColor(DWORD dwColor,DWORD dwCenterColor,DWORD *dwLayerColor) { int i=0; m_SkyVertex[0].diff.c=dwCenterColor; for(i=1;iLock(0,0,(BYTE**)&pVertex,0); pVertex[0].diff.c=dwCenterColor; for(int i=1;iUnlock(); m_FogLayer[0].c=dwLayerColor[0]; m_FogLayer[1].c=dwLayerColor[1]; m_FogLayer[2].c=dwLayerColor[2]; /* for(int i=0;iGetTransform(D3DTS_WORLD,matOldWorld); vector3 *vecViewPos=CSceneManager::GetCamera()->GetPosition(); pd3dDevice->SetTexture(1,NULL); matWorld.Translation(vector3(vecViewPos->x,0.0f,vecViewPos->z)); matWorld=matWorld*matOldWorld; pd3dDevice->SetTransform(D3DTS_WORLD,matWorld); //CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHT,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,FALSE); Indices[0]=0; Indices[1]=2; Indices[2]=1; Indices[3]=0; Indices[4]=3; Indices[5]=2; Vertex[0].v=vector3(-fSize,fSize,fSize); Vertex[0].tu=0.0f; Vertex[0].tv=1.0f; Vertex[1].v=vector3(fSize,fSize,fSize); Vertex[1].tu=1.0f; Vertex[1].tv=1.0f; Vertex[2].v=vector3(fSize,fSize,-fSize); Vertex[2].tu=1.0f; Vertex[2].tv=0.0f; Vertex[3].v=vector3(-fSize,fSize,-fSize); Vertex[3].tu=0.0f; Vertex[3].tv=0.0f; pd3dDevice->SetVertexShader(LVERTEXFVF); pd3dDevice->SetTexture(0,m_SkyTexture[4].GetTexture()); pd3dDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0,4,2,Indices,D3DFMT_INDEX16,Vertex, sizeof(LVertex)); Vertex[0].v=vector3(-fSize,0.0f,fSize); Vertex[0].tu=0.0; Vertex[0].tv=1.0; Vertex[1].v=vector3(fSize,0.0f,fSize); Vertex[1].tu=1.0; Vertex[1].tv=1.0; Vertex[2].v=vector3(fSize,fSize,fSize); Vertex[2].tu=1.0; Vertex[2].tv=0.0; Vertex[3].v=vector3(-fSize,fSize,fSize); Vertex[3].tu=0.0; Vertex[3].tv=0.0; pd3dDevice->SetTexture(0,m_SkyTexture[0].GetTexture()); pd3dDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0,4,2,Indices,D3DFMT_INDEX16,Vertex, sizeof(LVertex)); Vertex[0].v=vector3(fSize,0.0f,fSize); Vertex[1].v=vector3(fSize,0.0f,-fSize); Vertex[2].v=vector3(fSize,fSize,-fSize); Vertex[3].v=vector3(fSize,fSize,fSize); pd3dDevice->SetTexture(0,m_SkyTexture[1].GetTexture()); pd3dDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0,4,2,Indices,D3DFMT_INDEX16,Vertex, sizeof(LVertex)); Vertex[0].v=vector3(fSize,0.0f,-fSize); Vertex[1].v=vector3(-fSize,0.0f,-fSize); Vertex[2].v=vector3(-fSize,fSize,-fSize); Vertex[3].v=vector3(fSize,fSize,-fSize); pd3dDevice->SetTexture(0,m_SkyTexture[2].GetTexture()); pd3dDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0,4,2,Indices,D3DFMT_INDEX16,Vertex, sizeof(LVertex)); Vertex[0].v=vector3(-fSize,0.0f,-fSize); Vertex[1].v=vector3(-fSize,0.0f,fSize); Vertex[2].v=vector3(-fSize,fSize,fSize); Vertex[3].v=vector3(-fSize,fSize,-fSize); pd3dDevice->SetTexture(0,m_SkyTexture[3].GetTexture()); pd3dDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0,4,2,Indices,D3DFMT_INDEX16,Vertex, sizeof(LVertex)); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); } void CSkyScene::RenderCloud(LPDIRECT3DDEVICE8 pd3dDevice) { matrix matWorld; pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)(&matWorld)); vector3 *vecViewPos=CSceneManager::GetCamera()->GetPosition(); matrix mat; mat.Translation(vector3(vecViewPos->x,0.0f,vecViewPos->z)); mat=mat*matWorld; pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&mat); pd3dDevice->SetTexture(0,NULL); pd3dDevice->SetTexture(1,NULL); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0x11); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE, D3DZB_FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); pd3dDevice->SetVertexShader(LVERTEXFVF); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP,D3DTOP_SELECTARG2); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); // 12.21:: CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); // Rain µ¿±â Ãß°¡ if((m_iRenderLightLayer[0] > 0) && CRenderOption::m_bRain) { CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,FALSE); pd3dDevice->SetTexture(0,m_LightLayerTexture[0].GetTexture()); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_LightLayerVertex[0],sizeof(LVertex)); } // CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); pd3dDevice->SetTexture(0,m_CloudTexture.GetTexture()); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_CloudVertex[0],sizeof(LVertex)); if((m_iRenderLightLayer[1] > 0) && CRenderOption::m_bRain) { pd3dDevice->SetTexture(0,m_LightLayerTexture[1].GetTexture()); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_LightLayerVertex[1],sizeof(LVertex)); pd3dDevice->SetTexture(0,m_CloudTexture.GetTexture()); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); } pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_CloudVertex[1],sizeof(LVertex)); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); if((m_iRenderLightLayer[2] > 0) && CRenderOption::m_bRain) { pd3dDevice->SetTexture(0,m_LightLayerTexture[2].GetTexture()); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_LightLayerVertex[2],sizeof(LVertex)); pd3dDevice->SetTexture(0,m_CloudTexture.GetTexture()); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); } pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_CloudVertex[2],sizeof(LVertex)); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE, D3DZB_TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF,0xee); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); } void CSkyScene::Update(float fUpdate) { float fDivAng=(3.141597f*2.0f)/SKYDIVIDE; float fCloudFlow[3]; fCloudFlow[0]=0.0002f; fCloudFlow[1]=0.00008f; fCloudFlow[2]=0.00006f; for(int cCloud=0;cCloudGetScriptData("Rain.esf"); break; case 1: // pThunderEff->GetScriptData("Rain1.esf"); // Minotaurs ³¯¾¾ break; } CSceneManager::AddInterfaceScript(pThunderEff); vector3 *vecCameraPos = CSceneManager::m_ViewCamera->GetPosition(); pThunderEff->SetStartPos(vecCameraPos->x,vecCameraPos->y,vecCameraPos->z); pThunderEff->SetEndPos(vecCameraPos->x,vecCameraPos->y,vecCameraPos->z); pThunderEff->SetChr(NULL,NULL); pThunderEff->SetChrFwd(0.0f,0.0f,1.0f); } static DWORD dwPlaySound = 0; if(((dwTick - dwStartTime) / 16000) > dwPlaySound ) { dwPlaySound = ((dwTick - dwStartTime) / 16000); CEffScript *pThunderEff = new CEffScript; // pThunderEff->GetScriptData("Thunder.esf"); // Minotaurs³¯¾¾ CSceneManager::AddInterfaceScript(pThunderEff); //CSceneManager::AddEffectScript(pThunderEff); vector3 *vecCameraPos = CSceneManager::m_ViewCamera->GetPosition(); pThunderEff->SetStartPos(vecCameraPos->x,vecCameraPos->y,vecCameraPos->z); pThunderEff->SetEndPos(vecCameraPos->x,vecCameraPos->y,vecCameraPos->z); pThunderEff->SetChr(NULL,NULL); pThunderEff->SetChrFwd(0.0f,0.0f,1.0f); } if(((dwTick - dwStartTime) % 1000) < 5) { for(int cLightLayer = 0 ; cLightLayer < LIGHTLAYER; cLightLayer++) { m_iRenderLightLayer[cLightLayer] = rand() % 3; if(m_iRenderLightLayer[cLightLayer] > 0) { int alpha = rand() % 256; int iR,iG,iB; iR = 180 + rand() % 76; iG = 180 + rand() % 76; iB = 200 + rand() % 56; for(int i=0;i= 30) { int DelayFrame = ((int)(dwTick-dwDelayTick)/ 30); dwDelayTick = dwTick; for(int cLightLayer = 0 ; cLightLayer < LIGHTLAYER; cLightLayer++) { int alpha = 0; if(m_iRenderLightLayer[cLightLayer] > 0) { bool bEnd = false; int Endalpha = rand() % 256; int iR,iG,iB; iR = 180 + rand() % 76; iG = 180 + rand() % 76; iB = 200 + rand() % 56; for(int i=0;i 0) { alpha = m_LightLayerVertex[cLightLayer][i].diff.a; alpha -= (10 * DelayFrame); alpha = (alpha > 0) ? alpha : 0; m_LightLayerVertex[cLightLayer][i].diff.a = alpha; m_LightLayerVertex[cLightLayer][i].diff.c = D3DCOLOR_ARGB(alpha, m_LightLayerVertex[cLightLayer][i].diff.r, m_LightLayerVertex[cLightLayer][i].diff.g, m_LightLayerVertex[cLightLayer][i].diff.b, ); } else { m_LightLayerVertex[cLightLayer][i].diff.a = Endalpha; m_LightLayerVertex[cLightLayer][i].diff.r = iR; m_LightLayerVertex[cLightLayer][i].diff.r = iG; m_LightLayerVertex[cLightLayer][i].diff.r = iB; m_LightLayerVertex[cLightLayer][i].diff.c = D3DCOLOR_ARGB(Endalpha,iR,iG,iB); bEnd = true; } } if(bEnd == true) { m_iRenderLightLayer[cLightLayer]-=1; } } } } } } } void CSkyScene::RenderForGlare(LPDIRECT3DDEVICE8 pd3dDevice) { matrix matWorld; pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)(&matWorld)); vector3 *vecViewPos=CSceneManager::GetCamera()->GetPosition(); matrix mat; mat.Translation(vector3(vecViewPos->x,0.0f,vecViewPos->z)); mat=mat*matWorld; pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&mat); pd3dDevice->SetTexture(0,NULL); pd3dDevice->SetTexture(1,NULL); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); DWORD dwColor[3]; dwColor[0]=0xff222222; dwColor[1]=0xff222222; dwColor[2]=0xff222222; SetColor(CSceneManager::m_WeatherManager.m_InterGlareSkyLower.c,CSceneManager::m_WeatherManager.m_InterGlareSkyUpper.c,dwColor); //SetColor(0xffffffff,0xffffffff,dwColor); //SetColor(0xff000000,0xff000000,dwColor); vector3 vecSunPos=vector3(1.0f,0.0f,1.0f); vecSunPos.Normalize(); color clrRate; clrRate.c=0xff222222; vector3 vecPos; /* for(int i=0;iSetVertexShader(LVERTEXFVF); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,FALSE); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_SkyVertex,sizeof(LVertex)); pd3dDevice->SetTexture(0,m_CloudTexture.GetTexture()); CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG1,D3DTA_DIFFUSE); CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1); //CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffffffff); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND,D3DBLEND_INVSRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND,D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE); /* CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); //CSceneStateMgr::_SetD3DRenderState(D3DRS_BLENDOP,D3DBLENDOP_SUBTRACT); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_CloudVertex[0],sizeof(LVertex)); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_CloudVertex[1],sizeof(LVertex)); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,SKYDIVIDE,m_CloudVertex[2],sizeof(LVertex)); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); //CSceneStateMgr::_SetD3DRenderState(D3DRS_BLENDOP,D3DBLENDOP_ADD); */ }