Game client codebase including: - CharacterActionControl: Character and creature management - GlobalScript: Network, items, skills, quests, utilities - RYLClient: Main client application with GUI and event handlers - Engine: 3D rendering engine (RYLGL) - MemoryManager: Custom memory allocation - Library: Third-party dependencies (DirectX, boost, etc.) - Tools: Development utilities 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
843 lines
25 KiB
C++
843 lines
25 KiB
C++
// SunScene.cpp: implementation of the CSunScene class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
#include "SunScene.h"
|
||
#include "SceneManager.h"
|
||
#include <BaseGraphicsLayer.h>
|
||
#include "GMMemory.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()
|
||
{
|
||
m_SunTexture.Unload();
|
||
m_SunFlareTexture.Unload();
|
||
m_FlareTexture[0].Unload();
|
||
m_FlareTexture[1].Unload();
|
||
m_FlareTexture[2].Unload();
|
||
m_FlareTexture[3].Unload();
|
||
m_FlareTexture[4].Unload();
|
||
m_FlareTexture[5].Unload();
|
||
m_FlareTexture[6].Unload();
|
||
|
||
m_MoonTexture.Unload();
|
||
m_MoonFlareTexture.Unload();
|
||
}
|
||
|
||
void CSunScene::Reload()
|
||
{
|
||
m_SunTexture.Unload();
|
||
m_SunFlareTexture.Unload();
|
||
m_FlareTexture[0].Unload();
|
||
m_FlareTexture[1].Unload();
|
||
m_FlareTexture[2].Unload();
|
||
m_FlareTexture[3].Unload();
|
||
m_FlareTexture[4].Unload();
|
||
m_FlareTexture[5].Unload();
|
||
m_FlareTexture[6].Unload();
|
||
|
||
m_MoonTexture.Unload();
|
||
m_MoonFlareTexture.Unload();
|
||
|
||
|
||
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");
|
||
}
|
||
|
||
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));
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_CURRENT );
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
|
||
|
||
|
||
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
|
||
pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
||
pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE);
|
||
pd3dDevice->SetRenderState( D3DRS_FOGENABLE,FALSE);
|
||
|
||
pd3dDevice->SetRenderState(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;
|
||
*/
|
||
|
||
// edith 2009.08.26 <20>¾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// 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;
|
||
|
||
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;
|
||
|
||
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
|
||
pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
||
pd3dDevice->SetRenderState( 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;
|
||
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;
|
||
|
||
pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
||
pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
||
pd3dDevice->SetRenderState( 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;
|
||
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
|
||
|
||
pd3dDevice->SetTexture(0,m_MoonTexture.GetTexture());
|
||
pd3dDevice->SetTexture(1,NULL);
|
||
pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_SunVertex,sizeof(TLVertex));
|
||
|
||
pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
||
pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE);
|
||
|
||
pd3dDevice->SetTexture(0,m_MoonFlareTexture.GetTexture());
|
||
//pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_SunVertex,sizeof(TLVertex));
|
||
}
|
||
pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE);
|
||
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
|
||
pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
|
||
}
|
||
|
||
void CSunScene::RenderFlare(LPDIRECT3DDEVICE8 pd3dDevice)
|
||
{
|
||
//if(LENSFLARE==0 || m_vecSunPosition.y<0.0f)
|
||
pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE,FALSE);
|
||
pd3dDevice->SetRenderState( D3DRS_FOGENABLE,FALSE);
|
||
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
|
||
pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
||
pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE);
|
||
|
||
|
||
matrix matWorld;
|
||
//pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)(&matWorld));
|
||
matWorld.MakeIdent();
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_CURRENT );
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
|
||
|
||
|
||
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
|
||
pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
||
pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE);
|
||
pd3dDevice->SetRenderState( 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)
|
||
{
|
||
|
||
pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
|
||
pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE);
|
||
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
|
||
return;
|
||
}
|
||
*/
|
||
|
||
vecProjectedPosition.z=vecProjectedPosition.z/fProjectedPositionW;
|
||
if( vecProjectedPosition.z<0.0f ||
|
||
vecProjectedPosition.z>1.0f )
|
||
{
|
||
pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
|
||
pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE);
|
||
pd3dDevice->SetRenderState( 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);
|
||
|
||
static bool isInScreenSunPer = false;
|
||
static DWORD sunTick = timeGetTime();
|
||
|
||
float fRate=0.0f;
|
||
|
||
// edith 2009.08.26 <20>¾<EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>.
|
||
float fTime = CSceneManager::GetWeatherTime();
|
||
if(6.0f <= fTime && fTime < 7.0f ||
|
||
17.0f <= fTime && fTime < 18.0f)
|
||
fRate = 40.0;
|
||
else if(7.0f <= fTime && fTime < 8.0f ||
|
||
16.0f <= fTime && fTime < 17.0f)
|
||
fRate = 50.0;
|
||
else if(8.0f <= fTime && fTime < 9.0f ||
|
||
15.0f <= fTime && fTime < 16.0f)
|
||
fRate = 60.0;
|
||
else if(9.0f <= fTime && fTime < 10.0f ||
|
||
14.0f <= fTime && fTime < 15.0f)
|
||
fRate = 70.0;
|
||
else if(10.0f <= fTime && fTime < 11.0f ||
|
||
13.0f <= fTime && fTime < 14.0f)
|
||
fRate = 80.0;
|
||
else if(11.0f <= fTime && fTime < 13.0f)
|
||
fRate = 90.0;
|
||
|
||
/*
|
||
if(isInScreenSun == false)
|
||
{
|
||
isInScreenSunPer = isInScreenSun;
|
||
fRate = 0.0f;
|
||
}
|
||
else if((isInScreenSun && isInScreenSunPer != isInScreenSun) || (abs((int)timeGetTime()-(int)sunTick) > 1000))
|
||
{
|
||
fRate = 0.0f;
|
||
isInScreenSunPer = isInScreenSun;
|
||
sunTick = timeGetTime();
|
||
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;
|
||
// <20><> <20>ػ<EFBFBD><D8BB><EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><C5A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> Back Buffer size<7A><65> over <20>Ͽ<EFBFBD>
|
||
// rect<63><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿡 <20><><EFBFBD>α<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
// 03.06.19 wizardbug
|
||
if( rect.left>=0 && (unsigned int)rect.left<BackDesc.Width &&
|
||
rect.top>=0 && (unsigned int)rect.top<BackDesc.Height &&
|
||
rect.right>=0 && (unsigned int)rect.right<BackDesc.Width &&
|
||
rect.bottom>=0 && (unsigned int)rect.bottom<BackDesc.Height
|
||
)
|
||
{
|
||
memset(&d3dlocked_rect,0,sizeof(d3dlocked_rect));
|
||
pBackBuffer->LockRect(&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;
|
||
|
||
// edith 2009.08.26 <20>¾<EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> ũ<><C5A9>
|
||
fSunSize=1.0f/( (fSunSize-1.4f)*(fSunSize-1.4f) );
|
||
sx=180.0f*fSunSize;
|
||
sy=180.0f*fSunSize;
|
||
static float fRotateSunFlare[3]={0.0f,0.0f,0.0f};
|
||
fRotateSunFlare[0]+=0.001f;
|
||
fRotateSunFlare[1]-=0.0008f;
|
||
fRotateSunFlare[2]+=0.0006f;
|
||
|
||
pd3dDevice->SetRenderState(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 <20><><EFBFBD><EFBFBD>
|
||
color FlareColor;
|
||
FlareColor=color::Interpolation(color(0x0,0x0,0x0,0x0),color(0x99,0x99,0x99,0x99),1.0f);
|
||
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
||
pd3dDevice->SetTextureStageState( 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;
|
||
*/
|
||
pd3dDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xffffffff);
|
||
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
||
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR);
|
||
|
||
pd3dDevice->SetTextureStageState( 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;
|
||
|
||
|
||
pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);
|
||
pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE);
|
||
////////////////////////
|
||
pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_SunVertex,sizeof(TLVertex));
|
||
////////////////////////
|
||
pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
||
pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE);
|
||
pd3dDevice->SetTextureStageState( 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));
|
||
|
||
// edith 2009.08.26 <20>¾<EFBFBD> 2<><32> 3<><33> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// 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));
|
||
*/
|
||
}
|
||
/*
|
||
pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
|
||
pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE);
|
||
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
|
||
return;
|
||
*/
|
||
|
||
|
||
pd3dDevice->SetRenderState(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)
|
||
{
|
||
pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
|
||
pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE);
|
||
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
|
||
return;
|
||
}
|
||
|
||
// edith 2009.08.26 <20>¾翡<C2BE><E7BFA1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
||
static long LastFlareColor=0;
|
||
LastFlareColor++;
|
||
LastFlareColor%=(2);
|
||
|
||
if(fRate>20.0f)
|
||
{
|
||
for(int cFlare=0;cFlare<MAX_FLARE;cFlare++)
|
||
{
|
||
vecEachFlarePos=vecFlareSunPos+vecInterSunPos*m_fFlarePos[cFlare];
|
||
BaseGraphicsLayer::TransformVector(vecEachFlarePos,vecProjectedPosition,fProjectedPositionW);
|
||
sx=m_fFlareSize[cFlare]*fFlareSize;
|
||
sy=m_fFlareSize[cFlare]*fFlareSize;
|
||
vecRealSunPosition.z=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].v.z=0.1f;
|
||
m_SunVertex[1].v.z=0.1f;
|
||
m_SunVertex[2].v.z=0.1f;
|
||
m_SunVertex[3].v.z=0.1f;
|
||
m_SunVertex[0].Diffuse=m_FlareColor[cFlare];
|
||
m_SunVertex[1].Diffuse=m_FlareColor[cFlare];
|
||
m_SunVertex[2].Diffuse=m_FlareColor[cFlare];
|
||
m_SunVertex[3].Diffuse=m_FlareColor[cFlare];
|
||
|
||
if(cFlare==MAX_FLARE-1)
|
||
{
|
||
m_SunVertex[0].Diffuse=m_LastFlareColor[LastFlareColor];
|
||
m_SunVertex[1].Diffuse=m_LastFlareColor[LastFlareColor];
|
||
m_SunVertex[2].Diffuse=m_LastFlareColor[LastFlareColor];
|
||
m_SunVertex[3].Diffuse=m_LastFlareColor[LastFlareColor];
|
||
}
|
||
|
||
m_SunVertex[0].w=0.001f;
|
||
m_SunVertex[1].w=0.001f;
|
||
m_SunVertex[2].w=0.001f;
|
||
m_SunVertex[3].w=0.001f;
|
||
pd3dDevice->SetTexture(0,m_FlareTexture[cFlare].GetTexture());
|
||
pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_SunVertex,sizeof(TLVertex));
|
||
}
|
||
}
|
||
|
||
pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
|
||
pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE);
|
||
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
|
||
|
||
}
|