#include "FogScene.h" #include "SceneStateMgr.h" CFogScene ::CFogScene() { m_bPick = false; srand(time(0)); m_ParticleNum = INIT_NUM; m_ClosePointNum = 0; m_FogBuffer = NULL; m_FogPointSpriteBuffer = NULL; m_BaseTexture = NULL; m_LodNum = 0; //Lod_Level = NEAR; m_SpeedPower = 0.0f; m_CenterPoint.x = m_CenterPoint.y = m_CenterPoint.z = 0.0f; m_Impress.x = m_Impress.y = m_Impress.z = 0.0f; m_Center = 0.0f; m_Size = 1.0f; m_SrcBlendMode = D3DBLEND_SRCALPHA; m_DstBlendMode = D3DBLEND_INVSRCALPHA; m_TextureNum = 0; m_Rad = 5.0f; m_FadeIn = 1.0f; m_FadeOut = 0.0f; m_Lod = NEAR_LOD; m_Device = CSceneManager::GetDevice(); m_FadeInSpeed = 1.0f; m_pPoint = NULL; m_BackFadeIn = 1.0f; } CFogScene ::CFogScene(int num) { m_BackFadeIn = 1.0f; m_pPoint = NULL; m_bPick = false; m_ParticleNum = num; m_ClosePointNum = 0; m_FogBuffer = NULL; m_FogPointSpriteBuffer = NULL; m_BaseTexture = NULL; m_LodNum = 0; //Lod_Level = NEAR; m_SpeedPower = 0.0f; m_Rad = 5.0f; m_CenterPoint.x = m_CenterPoint.y = m_CenterPoint.z = 0.0f; m_Impress.x = m_Impress.y = m_Impress.z = 0.0f; m_Center = 0.0f; m_Size = 1.0f; m_SrcBlendMode = D3DBLEND_SRCALPHA; m_DstBlendMode = D3DBLEND_INVSRCALPHA; m_Lod = NEAR_LOD; m_TextureNum = 0; m_FadeIn = 1.0f; m_FadeOut = 0.0f; m_Device = CSceneManager::GetDevice(); } void CFogScene::Create(vector3 cen) { m_Node = new ParticleNode[m_ParticleNum]; CTexture::SetPath(NATURETEXTUREPATH); m_BaseTexture=new CTexture; //texture image load m_BaseTexture->Load(FOGTEX); m_TextureNum++; //set fog parameter SetCenter(40000.0f); SetCenterPos(cen); SetFlow(cen.y - 200.0f); SetGravity(0.0f,0.0f,0.0f); vector3 tm; tm.z = 0.3f; tm.x = 0.6f; tm.y = 0.1f; // tm.x = tm.y = tm.z = 0.0f; // tm.x = 0.3f; // tm.y = 0.1f; SetSize(5000.0f); SetImpress(tm); SetPos(); SetColor(0.8f,0.8f,0.8f,0.5f); // SetVertexColor(0.3f,0.3f,0.3f,0.5f,2); // SetVertexColor(0.3f,0.3f,0.3f,0.5f,3); SetEtc(); SetRad(3000.0f); SetSpeed(0.0f,0.0f,0.0f); SetSpeedPower(0.0f); SetWind(0.0f,0.0f,0.0f); Setfadein(1.0f); SetFadeInSpeed(0.3f); SetFadeOutSpeed(3.0f); CreateVertexBuffer(); } /*°¢ vertex »ö ´Þ¸® ¼³Á¤ °í¶ó¿îµå 0------1 | | | | 3------2 */ void CFogScene::SetVertexColor(float r,float g,float b,float a,int dimension) { int i; for(i=0;iRelease(); if(m_FogPointSpriteBuffer != NULL) m_FogPointSpriteBuffer->Release(); if(m_Node != NULL) { delete[] m_Node; m_Node = NULL; } /* if(m_pVertex != NULL) { delete[] m_pVertex; m_pVertex = NULL; } if(m_pPoint != NULL) { delete[] m_pPoint; m_pPoint = NULL; }*/ if(m_BaseTexture != NULL) { delete m_BaseTexture; m_BaseTexture = NULL; } } void CFogScene::SetWind(float x,float y,float z) { m_Wind[0] = x; m_Wind[1] = y; m_Wind[2] = z; } void CFogScene::SetFlow(float flow_height,int index) { m_Node[index].Flow = flow_height; } void CFogScene::SetFlow(float flow_height) { int i; for(i=0;iCreateVertexBuffer( m_ParticleNum * sizeof(POINTVERTEX),D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY | D3DUSAGE_POINTS, D3DFVF_POINTVERTEX, D3DPOOL_DEFAULT, &m_FogPointSpriteBuffer); m_Device->CreateVertexBuffer(m_ParticleNum*sizeof(ParticleVertex) * 6,0, D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1,D3DPOOL_MANAGED,&m_FogBuffer); /* vector3 right; vector3 up; D3DXMATRIX m_World; m_pVertex = new ParticleVertex[m_ParticleNum * 6]; m_Device->GetTransform(D3DTS_VIEW,&m_World); right.x = m_World._11; right.y = m_World._21; right.z = m_World._31; up.x = m_World._12; up.y = m_World._22; up.z = m_World._32; if(m_Lod == NEAR_LOD) { for(i=0;iCreateVertexBuffer(m_ParticleNum*sizeof(ParticleVertex) * 6,0, D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1,D3DPOOL_MANAGED,&m_FogBuffer); VOID *tmp; m_FogBuffer->Lock(0,m_ParticleNum*sizeof(ParticleVertex) * 6, (BYTE **)&tmp,0); memcpy(tmp,m_pVertex,m_ParticleNum*sizeof(ParticleVertex) * 6); m_FogBuffer->Unlock(); delete[] m_pVertex; m_pVertex = NULL; */ } void CFogScene::ChangeVertexBuffer() { int i; int count = 0; int count2 = 0; vector3 right; vector3 up; D3DXMATRIX m_World; if(m_ClosePointNum >0) m_pVertex = new ParticleVertex[m_ClosePointNum * 6]; m_pPoint = new POINTVERTEX[m_ParticleNum - m_ClosePointNum]; m_Device->GetTransform(D3DTS_VIEW,&m_World); right.x = m_World._11; right.y = m_World._21; right.z = m_World._31; up.x = m_World._12; up.y = m_World._22; up.z = m_World._32; // Lod near if(m_Lod == NEAR_LOD) { for(i=0;iLock(0,m_ClosePointNum * sizeof(ParticleVertex) * 6, (BYTE **)&tmp,0); memcpy(tmp,m_pVertex,m_ClosePointNum * sizeof(ParticleVertex) * 6); m_FogBuffer->Unlock(); delete[] m_pVertex; m_pVertex = NULL; } //point sprite VOID *tmp2; m_FogPointSpriteBuffer->Lock(0,(m_ParticleNum - m_ClosePointNum) * sizeof(POINTVERTEX),(BYTE **)&tmp2 ,0); memcpy(tmp2,m_pPoint,sizeof(POINTVERTEX) * (m_ParticleNum - m_ClosePointNum)); m_FogPointSpriteBuffer->Unlock(); delete[] m_pPoint; m_pPoint = NULL; } // arg1 : LOD level void CFogScene::Render() { LRESULT rt; // À̺κÐÀÌ »èÁ¦. point sprite use. ChangeVertexBuffer(); if(m_Lod) { float size = 1.0f; if(m_Size > 1000.0f) { size += ((m_Size - 1000.0f)/1000.0f); } if(!m_bPick) m_Device->SetTexture(0,m_BaseTexture->GetTexture()); else { m_Device->SetTexture(0,NULL); CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); } // point sprite setting //////////////////////// CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSPRITEENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSCALEENABLE, TRUE ); HRESULT hr; CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSIZE, FtoDW(10.0f * size) ); CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSIZE_MIN, FtoDW(1.00f) ); CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSCALE_A, FtoDW(2.0f) ); CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSCALE_B, FtoDW(1.00f) ); CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSCALE_C, FtoDW(0.00f) ); /* hr = CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSCALE_A, FtoDW(0.00001f) ); hr = CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSCALE_B, FtoDW(0.00f) ); hr = CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSCALE_C, FtoDW(0.00f) ); */ //////////////////////////////////////////////// CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING, FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND,m_SrcBlendMode); CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND,m_DstBlendMode); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); //CSceneStateMgr::_SetD3DRenderState(D3DRS_DIFFUSEMATERIALSOURCE,D3DMCS_COLOR1); //m_Device->BeginScene(); 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_COLOROP,D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE); CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE); //// point sprite m_Device->SetStreamSource( 0, m_FogPointSpriteBuffer, sizeof(POINTVERTEX)); m_Device->SetVertexShader( D3DFVF_POINTVERTEX ); rt = m_Device->DrawPrimitive( D3DPT_POINTLIST, 0,m_ParticleNum - m_ClosePointNum); //// CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSIZE_MIN, FtoDW(0.00f) ); CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSIZE, FtoDW(1.0f) ); CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSPRITEENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_POINTSCALEENABLE,FALSE); // ÀÏ¹Ý quad if(m_ClosePointNum) { m_Device->SetStreamSource(0,m_FogBuffer,sizeof(ParticleVertex)); m_Device->SetVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1); rt = m_Device->DrawPrimitive(D3DPT_TRIANGLELIST,0,m_ClosePointNum*2); } // end setting //m_Device->EndScene(); if(m_bPick) CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_SOLID); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING, TRUE); } } void CFogScene::SetEtc() { int i; for(i=0;i0) // MessageBox(NULL,"test","test",MB_OK); m_Node[i].Y += m_Wind[1]; m_Node[i].Z += m_Wind[2]; //flow ¹ØÀ¸·Î´Â ¾È³ª°¡°Ô. if(m_Node[i].Flow <= m_Node[i].Y + m_Node[i].Yi) m_Node[i].Y += m_Node[i].Yi; m_Node[i].Z += m_Node[i].Zi; // Áß·Â Àû¿ë m_Node[i].X += m_Gravity[0]; m_Node[i].Y += m_Gravity[1]; m_Node[i].Z += m_Gravity[2]; if(m_Node[i].Active == false) { m_Node[i].X = m_Node[i].BackX; m_Node[i].Y = m_Node[i].BackY; m_Node[i].Z = m_Node[i].BackZ; m_Node[i].Xi = 0.0f; m_Node[i].Yi = 0.0f; m_Node[i].Zi = 0.0f; m_Node[i].bFadeIn = true; m_Node[i].bFade = false; //Node[i].Life = 1.0f; } //fade in if(m_Node[i].bFadeIn == true) { m_Node[i].Life +=m_Node[i].Fade * m_FadeInSpeed; if(m_Node[i].Life > m_FadeIn) { m_Node[i].Life = m_FadeIn; m_Node[i].Active = true; m_Node[i].bFadeIn = false; m_Node[i].bFade = false; } } } // ChangeVertexBuffer(); } void CFogScene::Resetting() { int i; for(i=0;i length && before.x != pos.x && before.y != pos.y && before.z != pos.z) { float Density = 0.66f; /*if(m_Node[i].Life > m_FadeOut) { // Á¶±Ý ÇÏÇØÁö°Ô.. Setfadein(0.7f); m_Node[i].Xi +=unit[0] * 0.01f; m_Node[i].bFade = true; //Node[i].Yi +=unit[1]; m_Node[i].Zi +=unit[2]*0.01f; }*/ CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE, TRUE); // fog Ä®¶ó¸¦ ¼³Á¤ÇÑ´Ù. CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGCOLOR,D3DCOLOR_COLORVALUE(m_Node[0].r[0],m_Node[0].g[0],m_Node[0].b[0],m_Node[0].Life)); CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGTABLEMODE,D3DFOG_EXP); CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density)); } else { CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,FALSE); before = pos; // ¿ÏÀüÈ÷ ÇÏÇØÁö°Ô..--; Setfadein(1.0f); } } } void CFogScene::ClosePerson(float x,float y,float z){ int i; float tmp[3] = {0.0f,0.0f,0.0f}; float unit[3] = {0.0f,0.0f,0.0f}; float length = 0.0f; float Density = 0.66f; // »ç¶÷ÀÌ ÇÑ»ç¶÷À϶§ ¸¸ÀÌ´Ù.. ¿©·¯¸íÀ̸é.. °¢ÀÚ »óÅ Ç÷¹±×·Î ¿òÁ÷ÀÓÀ» üũÇÏ¿©¾ß ÇÒ°Í // ÀüÀÇ ¿òÁ÷ÀÓ static float before[3] = {0.0f,0.0f,0.0f}; int f=0; m_ClosePointNum = 0; for(i=0;i length && (before[0] != x || before[1] != y || before[2] != z)) { if(m_Node[i].Life > m_FadeOut) { m_Node[i].Xi +=unit[0]*0.01f; m_Node[i].bFade = true; //Node[i].Yi +=unit[1]*5.0f; m_Node[i].Zi +=unit[2]*0.01f; } else { // f--; before[0] = x; before[1] = y; before[2] = z; } } if(m_Rad >length) { f++; } if(m_Rad + 7500.0f>length) { // point sprite -> bilboard fog settting m_ClosePointNum++; m_Node[i].m_bClose = true; } else { m_Node[i].m_bClose = false; } } // ³»°¡ ¾È°Ô¼Ó¿¡ ÀÖÀ»¶§. if(f>0) { // Á¶±Ý ÇÏÇØÁö°Ô.. Setfadein(m_BackFadeIn / 2.0f); } //³»°¡ ¾È°Ô¼Ó¿¡ ¾øÀ»¶§.. if(f==0) { // ¿ÏÀüÈ÷ ÇÏÇØÁö°Ô..--; Setfadein(m_BackFadeIn); } } void CFogScene::SetSize(float fsize) { m_Size = fsize; } void CFogScene::SetBlendMode(DWORD src,DWORD dst) { m_SrcBlendMode = src; m_DstBlendMode = dst; } void CFogScene::Setfadein(float f) { m_FadeIn = f; } void CFogScene::Setfadeout(float f) { m_FadeOut = f; } void CFogScene::SetBackFadeIn(float f) { m_BackFadeIn = f; }