// RainParticle.cpp: implementation of the CRainParticle class. // ////////////////////////////////////////////////////////////////////// #include "RainParticle.h" #include "SceneManager.h" #include "SceneStateMgr.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CRainParticle::CRainParticle() { m_pVertexBuffer = NULL; m_pIndexBuffer = NULL; } CRainParticle::~CRainParticle() { if(m_pVertexBuffer != NULL) { m_pVertexBuffer->Release(); m_pVertexBuffer= NULL; } if(m_pIndexBuffer != NULL) { m_pIndexBuffer->Release(); m_pIndexBuffer = NULL; } } void CRainParticle::Init(int iNodesNum,char *strTexture) { int i; m_pDevice = CSceneManager::GetDevice(); InitParticle(iNodesNum,strTexture); m_pDevice->CreateVertexBuffer(sizeof(CRainParticleVertex) * m_iVertexBufferNum,D3DUSAGE_WRITEONLY,dwRainParticleVertexDecl,D3DPOOL_DEFAULT,&m_pVertexBuffer); m_pDevice->CreateIndexBuffer(sizeof(WORD) * m_iIndexBufferNum,D3DUSAGE_WRITEONLY,D3DFMT_INDEX16 ,D3DPOOL_DEFAULT,&m_pIndexBuffer); WORD *pIndex = NULL; m_pIndexBuffer->Lock(0,0,(BYTE **)&pIndex,0); for( i= 0 ; i < m_iNodesNum; i++ ) { pIndex[(i*6)] = (i * 4)+2; pIndex[(i*6)+1] = (i * 4); pIndex[(i*6)+2] = (i * 4)+3; pIndex[(i*6)+3] = (i * 4)+3; pIndex[(i*6)+4] = (i * 4); pIndex[(i*6)+5] = (i * 4)+1; //pIndex+=6; } m_pIndexBuffer->Unlock(); } /* 0 ---- 1 | | | | 2 ---- 3 Index : 203 , 301 */ void CRainParticle::UpdateBuffer(float fStep) { Update(fStep); int i; D3DXMATRIX matWorldView; D3DXMATRIX matWorld,matView; D3DXVECTOR3 vecRight,vecUp; D3DXVECTOR3 vecPos,vecSize; DWORD dwColor; D3DXVECTOR3 vecTmp; m_pDevice->GetTransform(D3DTS_VIEW,&matView); vecRight = D3DXVECTOR3(matView._11,matView._21,matView._31); D3DXVec3Normalize(&vecRight,&vecRight); vecUp = D3DXVECTOR3(matView._12,matView._22,matView._32); D3DXVec3Normalize(&vecUp,&vecUp); m_iScreenNodesNum = 0; CRainParticleVertex *pVertex = NULL; m_pVertexBuffer->Lock(0,0,(BYTE **)&pVertex,0); for(i = 0; i < m_iNodesNum; i++ ) { if( m_pNodes[i].m_fLife>0.0f ) { vecPos = m_pNodes[i].m_vecPos; vecSize = D3DXVECTOR3(m_pNodes[i].m_vecSize.x,m_pNodes[i].m_vecSize.z,0.0f); vecSize.z = (vecSize.x + vecSize.z) /2.0f; dwColor = D3DCOLOR_COLORVALUE(m_pNodes[i].m_vecColor.x,m_pNodes[i].m_vecColor.y,m_pNodes[i].m_vecColor.z,m_pNodes[i].m_fVisible); pVertex[m_iScreenNodesNum].m_dwColor = dwColor; pVertex[m_iScreenNodesNum + 1].m_dwColor = dwColor; pVertex[m_iScreenNodesNum + 2].m_dwColor = dwColor; pVertex[m_iScreenNodesNum + 3].m_dwColor = dwColor; pVertex[m_iScreenNodesNum].m_vecTexcoord = D3DXVECTOR2(0.0f,1.0f); pVertex[m_iScreenNodesNum + 1].m_vecTexcoord = D3DXVECTOR2(1.0f,1.0f); pVertex[m_iScreenNodesNum + 2].m_vecTexcoord = D3DXVECTOR2(0.0f,0.0f); pVertex[m_iScreenNodesNum + 3].m_vecTexcoord = D3DXVECTOR2(1.0f,0.0); vecTmp = (vecUp - vecRight); vecTmp.x *= vecSize.x; vecTmp.y *= vecSize.y; vecTmp.z *= vecSize.z; pVertex[m_iScreenNodesNum].m_vecPos = ( vecTmp )+vecPos; vecTmp = (vecRight + vecUp); vecTmp.x *= vecSize.x; vecTmp.y *= vecSize.y; vecTmp.z *= vecSize.z; pVertex[m_iScreenNodesNum+1].m_vecPos = ( vecTmp )+vecPos; vecTmp = (vecRight + vecUp); vecTmp.x *= -vecSize.x; vecTmp.y *= -vecSize.y; vecTmp.z *= -vecSize.z; pVertex[m_iScreenNodesNum+2].m_vecPos = ( vecTmp )+vecPos; vecTmp = (vecRight - vecUp); vecTmp.x *= vecSize.x; vecTmp.y *= vecSize.y; vecTmp.z *= vecSize.z; pVertex[m_iScreenNodesNum+3].m_vecPos = ( vecTmp )+vecPos; m_iScreenNodesNum += 4; } } m_pVertexBuffer->Unlock(); } void CRainParticle::Render() { D3DXMATRIX matWorld; D3DXMatrixIdentity(&matWorld); CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE); m_pDevice->SetStreamSource(0,m_pVertexBuffer,sizeof(CRainParticleVertex)); m_pDevice->SetIndices(m_pIndexBuffer,0); m_pDevice->SetTexture(0,m_pParticleTexture->GetTexture()); m_pDevice->SetVertexShader(dwRainParticleVertexDecl); m_pDevice->SetPixelShader(NULL); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE ); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE ); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR ); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR ); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE, TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE, FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE ); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); m_pDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0,m_iScreenNodesNum, 0,(m_iScreenNodesNum / 2)); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE, TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); }