// SunScene.cpp: implementation of the CSunScene class. // ////////////////////////////////////////////////////////////////////// #include "SunScene.h" #include "SceneManager.h" #include #include "SceneStateMgr.h" #include "FullSceneEffect.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CSunScene::CSunScene() { ///* m_vecSunPosition.x=-1.0f; m_vecSunPosition.y=1.0f; m_vecSunPosition.z=1.0f; //*/ /* m_vecSunPosition.x=0.0f; m_vecSunPosition.y=0.0f; m_vecSunPosition.z=1.0f; //*/ m_vecSunPosition.Normalize(); m_fFlarePos[0]=-0.4f; m_fFlarePos[1]=0.2f; m_fFlarePos[2]=0.4f; m_fFlarePos[3]=0.8f; m_fFlarePos[4]=0.85f; m_fFlarePos[5]=1.5f; m_fFlarePos[6]=1.8f; m_fFlareSize[0]=60.0f; m_fFlareSize[1]=80.0f; m_fFlareSize[2]=120.0f; m_fFlareSize[3]=80.0f; m_fFlareSize[4]=135.0f; m_fFlareSize[5]=120.0f; m_fFlareSize[6]=300.0f; m_FlareColor[0].a=20; m_FlareColor[0].r=255; m_FlareColor[0].g=150; m_FlareColor[0].b=150; m_FlareColor[1].a=60; m_FlareColor[1].r=140; m_FlareColor[1].g=230; m_FlareColor[1].b=255; m_FlareColor[2].a=60; m_FlareColor[2].r=255; m_FlareColor[2].g=255; m_FlareColor[2].b=255; m_FlareColor[3].a=35; m_FlareColor[3].r=140; m_FlareColor[3].g=140; m_FlareColor[3].b=230; m_FlareColor[4].a=20; m_FlareColor[4].r=255; m_FlareColor[4].g=140; m_FlareColor[4].b=255; m_FlareColor[5].a=40; m_FlareColor[5].r=255; m_FlareColor[5].g=100; m_FlareColor[5].b=100; m_FlareColor[6].a=35; m_FlareColor[6].r=255; m_FlareColor[6].g=200; m_FlareColor[6].b=225; m_LastFlareColor[0].a=15; m_LastFlareColor[0].r=255; m_LastFlareColor[0].g=150; m_LastFlareColor[0].b=150; m_LastFlareColor[1].a=15; m_LastFlareColor[1].r=150; m_LastFlareColor[1].g=150; m_LastFlareColor[1].b=255; } CSunScene::~CSunScene() { } void CSunScene::Create() { //LogMessage("SunScene Create"); m_SunVertex[0].tu=0.0f; m_SunVertex[0].tv=1.0f; m_SunVertex[0].Diffuse.c=0xffffffff; m_SunVertex[0].Specular.c=0x0; m_SunVertex[1].tu=0.0f; m_SunVertex[1].tv=0.0f; m_SunVertex[1].Diffuse.c=0xffffffff; m_SunVertex[1].Specular.c=0x0; m_SunVertex[2].tu=1.0f; m_SunVertex[2].tv=1.0f; m_SunVertex[2].Diffuse.c=0xffffffff; m_SunVertex[2].Specular.c=0x0; m_SunVertex[3].tu=1.0f; m_SunVertex[3].tv=0.0f; m_SunVertex[3].Diffuse.c=0xffffffff; m_SunVertex[3].Specular.c=0x0; CTexture::SetPath(NATURETEXTUREPATH); m_SunTexture.Load("sun.dds"); m_SunFlareTexture.Load("sunflare.dds"); m_FlareTexture[0].Load("Flare0.dds"); m_FlareTexture[1].Load("Flare1.dds"); m_FlareTexture[2].Load("Flare2.dds"); m_FlareTexture[3].Load("Flare3.dds"); m_FlareTexture[4].Load("Flare4.dds"); m_FlareTexture[5].Load("Flare5.dds"); m_FlareTexture[6].Load("Flare6.dds"); m_MoonTexture.Load("moon.dds"); m_MoonFlareTexture.Load("moonflare.dds"); //LogMessage("SunScene Create Complete"); } void CSunScene::Render(LPDIRECT3DDEVICE8 pd3dDevice) { matrix matWorld; //pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)(&matWorld)); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_CURRENT ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); pd3dDevice->SetVertexShader(TLVERTEXFVF); pd3dDevice->SetTexture(1,NULL); //matrix *matViewPosition=(matrix*)CSceneManager::GetCamera()->GetMatPosition(); //pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)(&matWorld)); matWorld.MakeIdent(); vector3 vecViewPos=(*CSceneManager::GetCamera()->GetPosition()); //vector3 vecViewPos; /* vecViewPos.x=matViewPosition->_41; vecViewPos.y=matViewPosition->_42; vecViewPos.z=matViewPosition->_43; */ // Sun Rendering.& Calc Real Sun position.// vector3 vecRealSunPosition,vecProjectedPosition; vector3 vecSunPro; float fProjectedPositionW; vecRealSunPosition=vecViewPos+m_vecSunPosition*fSun_Length; matrix matTrans; matTrans.Translation(vecRealSunPosition); matTrans=matTrans*matWorld; vecRealSunPosition=matTrans.GetLoc(); bool isInScreenSun; matrix matIdent; matIdent.MakeIdent(); int ProjectionMode; if(matIdent==matWorld) ProjectionMode=0; else ProjectionMode=1; if(m_vecSunPosition.y<0.0f) vecRealSunPosition.y=-vecRealSunPosition.y; isInScreenSun=BaseGraphicsLayer::TransformVector(vecRealSunPosition,vecProjectedPosition,fProjectedPositionW); vecSunPro=vecProjectedPosition; float sx=75.0f; float sy=75.0f; float fBufferFullSceneX = 0.0f; float fBufferFullSceneY = 0.0f; float fTexX = 0.0f; float fTexY = 0.0f; float fComp1,fComp2; if(CRenderOption::m_bFullSceneEffect) { fBufferFullSceneX = CSceneManager::m_pFullSceneEffect->GetFrameWidth(); fBufferFullSceneY = CSceneManager::m_pFullSceneEffect->GetFrameHeight(); fComp1 = fBufferFullSceneX / fBufferFullSceneY; fTexX = CSceneManager::m_pFullSceneEffect->GetRenderWidth(); fTexY = CSceneManager::m_pFullSceneEffect->GetRenderHeight(); fComp2 = fTexX / fTexY; fComp2 = fComp1 / fComp2; sy = sx * fComp2; } if(m_vecSunPosition.y>=0.0f) { m_SunVertex[0].v=vecProjectedPosition; m_SunVertex[1].v=vecProjectedPosition; m_SunVertex[2].v=vecProjectedPosition; m_SunVertex[3].v=vecProjectedPosition; m_SunVertex[0].v.x-=sx;m_SunVertex[0].v.y+=sy; m_SunVertex[1].v.x-=sx;m_SunVertex[1].v.y-=sy; m_SunVertex[2].v.x+=sx;m_SunVertex[2].v.y+=sy; m_SunVertex[3].v.x+=sx;m_SunVertex[3].v.y-=sy; m_SunVertex[0].w=fProjectedPositionW; m_SunVertex[1].w=fProjectedPositionW; m_SunVertex[2].w=fProjectedPositionW; m_SunVertex[3].w=fProjectedPositionW; m_SunVertex[0].Diffuse.c=0xaaffffff; m_SunVertex[1].Diffuse.c=0xaaffffff; m_SunVertex[2].Diffuse.c=0xaaffffff; m_SunVertex[3].Diffuse.c=0xaaffffff; CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); pd3dDevice->SetTexture(0,m_SunTexture.GetTexture()); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_SunVertex,sizeof(TLVertex)); } else { float sx=60.0f; float sy=60.0f; if(CRenderOption::m_bFullSceneEffect) { fBufferFullSceneX = CSceneManager::m_pFullSceneEffect->GetFrameWidth(); fBufferFullSceneY = CSceneManager::m_pFullSceneEffect->GetFrameHeight(); fComp1 = fBufferFullSceneX / fBufferFullSceneY; fTexX = CSceneManager::m_pFullSceneEffect->GetRenderWidth(); fTexY = CSceneManager::m_pFullSceneEffect->GetRenderHeight(); fComp2 = fTexX / fTexY; fComp2 = fComp1 / fComp2; sy = sx * fComp2; } m_SunVertex[0].v=vecProjectedPosition; m_SunVertex[1].v=vecProjectedPosition; m_SunVertex[2].v=vecProjectedPosition; m_SunVertex[3].v=vecProjectedPosition; m_SunVertex[0].v.x-=sx;m_SunVertex[0].v.y+=sy; m_SunVertex[1].v.x-=sx;m_SunVertex[1].v.y-=sy; m_SunVertex[2].v.x+=sx;m_SunVertex[2].v.y+=sy; m_SunVertex[3].v.x+=sx;m_SunVertex[3].v.y-=sy; m_SunVertex[0].w=fProjectedPositionW; m_SunVertex[1].w=fProjectedPositionW; m_SunVertex[2].w=fProjectedPositionW; m_SunVertex[3].w=fProjectedPositionW; m_SunVertex[0].Diffuse.c=0xaaffffff; m_SunVertex[1].Diffuse.c=0xaaffffff; m_SunVertex[2].Diffuse.c=0xaaffffff; m_SunVertex[3].Diffuse.c=0xaaffffff; CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); float fRate=fabsf(m_vecSunPosition.y); fRate+=0.2f; unsigned char Alpha; if(fRate>=1.0f) Alpha=255; else { if(fRate-0.5f<=0.0f) Alpha=0; else Alpha=(unsigned char)((fRate-0.5f)*512.0f); //Alpha=(unsigned char)(fRate*255.0f); } m_SunVertex[0].Diffuse.a= m_SunVertex[1].Diffuse.a= m_SunVertex[2].Diffuse.a= m_SunVertex[3].Diffuse.a=Alpha; CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); pd3dDevice->SetTexture(0,m_MoonTexture.GetTexture()); pd3dDevice->SetTexture(1,NULL); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_SunVertex,sizeof(TLVertex)); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); pd3dDevice->SetTexture(0,m_MoonFlareTexture.GetTexture()); //pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_SunVertex,sizeof(TLVertex)); } CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); } void CSunScene::RenderFlare(LPDIRECT3DDEVICE8 pd3dDevice) { //if(LENSFLARE==0 || m_vecSunPosition.y<0.0f) CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); matrix matWorld; //pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)(&matWorld)); matWorld.MakeIdent(); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_CURRENT ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,FALSE); pd3dDevice->SetVertexShader(TLVERTEXFVF); pd3dDevice->SetTexture(1,NULL); matrix *matViewPosition=(matrix*)CSceneManager::GetCamera()->GetMatPosition(); vector3 vecViewPos=(*CSceneManager::GetCamera()->GetPosition()); //vector3 vecViewPos; /* vecViewPos.x=matViewPosition->_41; vecViewPos.y=matViewPosition->_42; vecViewPos.z=matViewPosition->_43; */ // Sun Rendering.& Calc Real Sun position.// vector3 vecRealSunPosition,vecProjectedPosition; vector3 vecSunPro; float fProjectedPositionW; vecRealSunPosition=vecViewPos+m_vecSunPosition*fSun_Length; matrix matTrans; matTrans.Translation(vecRealSunPosition); matTrans=matTrans*matWorld; vecRealSunPosition=matTrans.GetLoc(); bool isInScreenSun; matrix matIdent; matIdent.MakeIdent(); int ProjectionMode; if(matIdent==matWorld) ProjectionMode=0; else ProjectionMode=1; if(m_vecSunPosition.y<0.0f) vecRealSunPosition.y=-vecRealSunPosition.y; isInScreenSun=BaseGraphicsLayer::TransformVector(vecRealSunPosition,vecProjectedPosition,fProjectedPositionW); if(isInScreenSun) { if(vecProjectedPosition.z>=1.0f) isInScreenSun=false; } vecSunPro=vecProjectedPosition; float sx=75.0f; float sy=75.0f; /* if(m_vecSunPosition.y<0.0f) { CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); return; } */ vecProjectedPosition.z=vecProjectedPosition.z/fProjectedPositionW; if( vecProjectedPosition.z<0.0f || vecProjectedPosition.z>1.0f ) { CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); return; } /* if( vecProjectedPosition.x+5 < 0 || vecProjectedPosition.x-5 > BaseGraphicsLayer::m_lScreenSx || vecProjectedPosition.y+5 < 0 || vecProjectedPosition.y+5 > BaseGraphicsLayer::m_lScreenSy) { } */ vecProjectedPosition.x; vecProjectedPosition.y; // is Sun Drawed BackBuffer ? RECT rect; rect.left=vecProjectedPosition.x; rect.right=vecProjectedPosition.x+1; rect.top=vecProjectedPosition.y; rect.bottom=vecProjectedPosition.y+1; D3DLOCKED_RECT d3dlocked_rect; D3DSURFACE_DESC BackDesc; LPDIRECT3DSURFACE8 pBackBuffer; pd3dDevice->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&pBackBuffer); // Buffer Description Get pBackBuffer->GetDesc(&BackDesc); //pBackBuffer->LockRect(&d3dlocked_rect,&rect,D3DLOCK_READONLY); //pBackBuffer->LockRect(&d3dlocked_rect,&rect,D3DLOCK_NO_DIRTY_UPDATE); DWORD dwSunSize=0x0; float fRate=0.0f; for(int iy=-5;iy<5;iy++) { for(int ix=-5;ix<5;ix++) { rect.left=(int)vecProjectedPosition.x+ix; rect.right=(int)vecProjectedPosition.x+ix+1; rect.top=(int)vecProjectedPosition.y+iy; rect.bottom=(int)vecProjectedPosition.y+iy+1; // Àú ÇØ»óµµ ¿ùµå Å©¸®¿¡ÀÌÅÍ ÀÛ¾÷½Ã Back Buffer size¸¦ over ÇÏ¿© // rect¸¦ ¾òÀ¸·Á´Â °æ¿ì¿¡ ÇÁ·Î±×·¥ Á¾·áµÇ´Â ¹ö±× ¼öÁ¤ // 03.06.19 wizardbug if( rect.left>=0 && rect.left=0 && rect.top=0 && rect.right=0 && rect.bottomLockRect(&d3dlocked_rect,&rect,D3DLOCK_READONLY); WORD *e=(WORD*)d3dlocked_rect.pBits; if(*e>=0xaaaa) fRate+=1.0f; pBackBuffer->UnlockRect(); } } } bool isSunRendering=false; //oat fRate=((double)dwSunSize)/((double)0xffff); //fRate*=5.5f; if(fRate>=100.0f) { fRate=100.0f; } if(fRate>50.0f ) { isSunRendering=true; } pBackBuffer->Release(); //// // vector3 vecFlarePos; vector3 vecFlareSunPos; vector3 vecInterSunPos; vector3 vecEachFlarePos; // calculate for Flare-ViewFront position matrix matFlare; matFlare.Translation(vector3(0.0f,0.0f,fSun_FrontEye)); matFlare=matFlare*(*matViewPosition); vecFlarePos=matFlare.GetLoc(); if(m_vecSunPosition.y<0.0f) { vector3 vecMoonPos=m_vecSunPosition; vecMoonPos.y=-vecMoonPos.y; vecFlareSunPos=vecViewPos+vecMoonPos*fSun_FrontEye; } else { vecFlareSunPos=vecViewPos+m_vecSunPosition*fSun_FrontEye; } vecInterSunPos=vecFlarePos-vecFlareSunPos; vector3 vecNorFlareSunPos=vecFlareSunPos-vecViewPos; vector3 vecNorFlarePos=vecFlarePos-vecViewPos; vecNorFlareSunPos.Normalize(); vecNorFlarePos.Normalize(); float fFlareSize=vecNorFlareSunPos*vecNorFlarePos; float fFlareColor=vecNorFlareSunPos*vecNorFlarePos; float fSunSize=fFlareSize; fFlareColor*=(fRate/100.0f); fFlareSize=sqrtf( (1.0f-(fFlareSize*fFlareSize)) ); fFlareSize+=0.6f; fSunSize=1.0f/( (fSunSize-1.4f)*(fSunSize-1.4f) ); sx=200.0f*fSunSize; sy=200.0f*fSunSize; static float fRotateSunFlare[3]={0.0f,0.0f,0.0f}; fRotateSunFlare[0]+=0.001f; fRotateSunFlare[1]-=0.0008f; fRotateSunFlare[2]+=0.0006f; CSceneStateMgr::_SetD3DRenderState(D3DRS_ZFUNC,D3DCMP_ALWAYS); //if(LENSFLARE>=3) // First Sun Flare// if(m_vecSunPosition.y<0.0f) { float fTime = CSceneManager::GetWeatherTime(); if((fTime > 20.0f) || (fTime < 4.0f)) { sx=400; sy=400; pd3dDevice->SetTexture(0,m_MoonFlareTexture.GetTexture()); m_SunVertex[0].v=vecProjectedPosition; m_SunVertex[1].v=vecProjectedPosition; m_SunVertex[2].v=vecProjectedPosition; m_SunVertex[3].v=vecProjectedPosition; m_SunVertex[0].v.x+=sx*cosf(0.0f+fRotateSunFlare[0]); m_SunVertex[0].v.y+=sy*sinf(0.0f+fRotateSunFlare[0]); m_SunVertex[1].v.x+=sx*cosf(3.1415f*0.5f+fRotateSunFlare[0]); m_SunVertex[1].v.y+=sy*sinf(3.1415f*0.5f+fRotateSunFlare[0]); m_SunVertex[2].v.x+=sx*cosf(3.1415f*1.5f+fRotateSunFlare[0]); m_SunVertex[2].v.y+=sy*sinf(3.1415f*1.5f+fRotateSunFlare[0]); m_SunVertex[3].v.x+=sx*cosf(3.1415f+fRotateSunFlare[0]); m_SunVertex[3].v.y+=sy*sinf(3.1415f+fRotateSunFlare[0]); m_SunVertex[0].w=fProjectedPositionW; m_SunVertex[1].w=fProjectedPositionW; m_SunVertex[2].w=fProjectedPositionW; m_SunVertex[3].w=fProjectedPositionW; ///////////////////////// /* 03.9.2 ¼öÁ¤ color FlareColor; FlareColor=color::Interpolation(color(0x0,0x0,0x0,0x0),color(0x99,0x99,0x99,0x99),1.0f); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); m_SunVertex[0].Diffuse.c=FlareColor.c; m_SunVertex[1].Diffuse.c=FlareColor.c; m_SunVertex[2].Diffuse.c=FlareColor.c; m_SunVertex[3].Diffuse.c=FlareColor.c; */ CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffffffff); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); m_SunVertex[0].Diffuse.c=0xffffffff; m_SunVertex[1].Diffuse.c=0xffffffff; m_SunVertex[2].Diffuse.c=0xffffffff; m_SunVertex[3].Diffuse.c=0xffffffff; CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); //////////////////////// pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_SunVertex,sizeof(TLVertex)); //////////////////////// CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); /////////////////////// } } else { sx+=rand()%30; sy+=rand()%30; pd3dDevice->SetTexture(0,m_SunFlareTexture.GetTexture()); m_SunVertex[0].v=vecProjectedPosition; m_SunVertex[1].v=vecProjectedPosition; m_SunVertex[2].v=vecProjectedPosition; m_SunVertex[3].v=vecProjectedPosition; m_SunVertex[0].v.x+=sx*cosf(0.0f+fRotateSunFlare[0]); m_SunVertex[0].v.y+=sy*sinf(0.0f+fRotateSunFlare[0]); m_SunVertex[1].v.x+=sx*cosf(3.1415f*0.5f+fRotateSunFlare[0]); m_SunVertex[1].v.y+=sy*sinf(3.1415f*0.5f+fRotateSunFlare[0]); m_SunVertex[2].v.x+=sx*cosf(3.1415f*1.5f+fRotateSunFlare[0]); m_SunVertex[2].v.y+=sy*sinf(3.1415f*1.5f+fRotateSunFlare[0]); m_SunVertex[3].v.x+=sx*cosf(3.1415f+fRotateSunFlare[0]); m_SunVertex[3].v.y+=sy*sinf(3.1415f+fRotateSunFlare[0]); m_SunVertex[0].w=fProjectedPositionW; m_SunVertex[1].w=fProjectedPositionW; m_SunVertex[2].w=fProjectedPositionW; m_SunVertex[3].w=fProjectedPositionW; color FlareColor; FlareColor=color::Interpolation(color(0x0,0x0,0x0,0x0),color(0xaa,0xaa,0xaa,0xaa),fFlareColor); m_SunVertex[0].Diffuse.c=FlareColor.c; m_SunVertex[1].Diffuse.c=FlareColor.c; m_SunVertex[2].Diffuse.c=FlareColor.c; m_SunVertex[3].Diffuse.c=FlareColor.c; pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_SunVertex,sizeof(TLVertex)); // 2'nd Sun Flare// sx+=rand()%30; sy+=rand()%30; m_SunVertex[0].v=vecProjectedPosition; m_SunVertex[1].v=vecProjectedPosition; m_SunVertex[2].v=vecProjectedPosition; m_SunVertex[3].v=vecProjectedPosition; m_SunVertex[0].v.x+=sx*cosf(0.0f+fRotateSunFlare[1]); m_SunVertex[0].v.y+=sy*sinf(0.0f+fRotateSunFlare[1]); m_SunVertex[1].v.x+=sx*cosf(3.1415f*0.5f+fRotateSunFlare[1]); m_SunVertex[1].v.y+=sy*sinf(3.1415f*0.5f+fRotateSunFlare[1]); m_SunVertex[2].v.x+=sx*cosf(3.1415f*1.5f+fRotateSunFlare[1]); m_SunVertex[2].v.y+=sy*sinf(3.1415f*1.5f+fRotateSunFlare[1]); m_SunVertex[3].v.x+=sx*cosf(3.1415f+fRotateSunFlare[1]); m_SunVertex[3].v.y+=sy*sinf(3.1415f+fRotateSunFlare[1]); m_SunVertex[0].w=fProjectedPositionW; m_SunVertex[1].w=fProjectedPositionW; m_SunVertex[2].w=fProjectedPositionW; m_SunVertex[3].w=fProjectedPositionW; m_SunVertex[0].Diffuse.c=0x18444444; m_SunVertex[1].Diffuse.c=0x18444444; m_SunVertex[2].Diffuse.c=0x18444444; m_SunVertex[3].Diffuse.c=0x18444444; pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_SunVertex,sizeof(TLVertex)); // 3'nd Sun Flare// sx-=rand()%30; sy-=rand()%30; m_SunVertex[0].v=vecProjectedPosition; m_SunVertex[1].v=vecProjectedPosition; m_SunVertex[2].v=vecProjectedPosition; m_SunVertex[3].v=vecProjectedPosition; m_SunVertex[0].v.x+=sx*cosf(0.0f+fRotateSunFlare[2]); m_SunVertex[0].v.y+=sy*sinf(0.0f+fRotateSunFlare[2]); m_SunVertex[1].v.x+=sx*cosf(3.1415f*0.5f+fRotateSunFlare[2]); m_SunVertex[1].v.y+=sy*sinf(3.1415f*0.5f+fRotateSunFlare[2]); m_SunVertex[2].v.x+=sx*cosf(3.1415f*1.5f+fRotateSunFlare[2]); m_SunVertex[2].v.y+=sy*sinf(3.1415f*1.5f+fRotateSunFlare[2]); m_SunVertex[3].v.x+=sx*cosf(3.1415f+fRotateSunFlare[2]); m_SunVertex[3].v.y+=sy*sinf(3.1415f+fRotateSunFlare[2]); m_SunVertex[0].w=fProjectedPositionW; m_SunVertex[1].w=fProjectedPositionW; m_SunVertex[2].w=fProjectedPositionW; m_SunVertex[3].w=fProjectedPositionW; m_SunVertex[0].Diffuse.c=0x18444444; m_SunVertex[1].Diffuse.c=0x18444444; m_SunVertex[2].Diffuse.c=0x18444444; m_SunVertex[3].Diffuse.c=0x18444444; pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_SunVertex,sizeof(TLVertex)); } /* CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); return; */ CSceneStateMgr::_SetD3DRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL); //if(isInScreenSun ==false || isSunRendering==false || vecRealSunPosition.y <=10000.0f ) //if(isInScreenSun ==false || isSunRendering==false || vecRealSunPosition.y <=10000.0f ) if(isInScreenSun ==false || vecRealSunPosition.y <=10000.0f || m_vecSunPosition.y<0.0f) { CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); return; } static long LastFlareColor=0; LastFlareColor++; LastFlareColor%=(2); if(fRate>20.0f) { for(int cFlare=0;cFlareSetTexture(0,m_FlareTexture[cFlare].GetTexture()); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_SunVertex,sizeof(TLVertex)); } } CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE); }