www.pudn.com > 3DRPG.rar > Snow.cpp


#include "stdafx.h" 
#include "Snow.h" 
 
CSnow::CSnow(LPDIRECT3DDEVICE9 d3dd,DWORD Lenth,DWORD Width,DWORD Height,DWORD Density,float offset) 
{ 
	m_pD3DDevice=d3dd; 
	m_dwLenth=Lenth; 
	m_dwWidth=Width; 
	m_dwHeight=Height; 
	m_dwDensity=Density; 
	m_lSnowCount=(m_dwWidth*m_dwLenth*m_dwDensity*m_dwDensity); 
	m_fOffset=offset; 
	 
    
    InitialSnow(); 
} 
 
CSnow::~CSnow() 
{ 
	m_pVb->Release(); 
	m_pTx->Release(); 
} 
 
void CSnow::InitialSnow() 
{   SNOWVERTEX * vertex; 
 
    D3DXCreateTextureFromFile( m_pD3DDevice, "./res/snow2.tga",&m_pTx); 
	 
    m_pD3DDevice->CreateVertexBuffer( m_lSnowCount*sizeof(SNOWVERTEX),D3DUSAGE_WRITEONLY, 
		                               D3DFVF_SNOWVERTEX,D3DPOOL_MANAGED, &m_pVb,NULL ); 
 
   m_pVb->Lock( 0, m_lSnowCount*sizeof(SNOWVERTEX),(void**)&vertex, 0 ); 
 
     for( DWORD line = 0; line < (DWORD)(m_dwWidth*m_dwDensity) ; line++ ) 
    { 
		//float offwidth = (float)1/m_dwDensity; 
 
        for( DWORD seg=0; seg < (DWORD)(m_dwLenth*m_dwDensity); seg++ ) 
        { 
            FLOAT fRandx = ((FLOAT)rand()/(FLOAT)RAND_MAX) *10.0f; 
			FLOAT fRandy = ((FLOAT)rand()/(FLOAT)RAND_MAX) *10.0f; 
	        FLOAT fRandz = ((FLOAT)rand()/(FLOAT)RAND_MAX)*10.0f; 
		     
			//float offlenth = (float)1/m_dwDensity; 
            vertex->p.x =  -(float)m_dwWidth/2 + seg * ( fRandx); 
            vertex->p.y = (float)m_dwHeight + fRandy; 
            vertex->p.z =  -(float)m_dwLenth/2 + line *(fRandz); 
			vertex->color=D3DCOLOR_XRGB(255,255,255); 
			vertex++; 
		} 
	} 
	m_pVb->Unlock(); 
                                      
} 
 
void CSnow::MoveSnow(D3DXVECTOR3 k,D3DXVECTOR3 j) 
{     
     SNOWVERTEX * vertex=NULL; 
	 m_pVb->Lock(0,m_lSnowCount*sizeof(SNOWVERTEX),(void **)&vertex,0); 
 
	/* for( DWORD seg=0; seg < m_lSnowCount; seg++ ) 
    { 
        if(vertex->p.y < 0) 
			vertex->p.y = (float)m_dwHeight; 
		else 
			vertex->p.y -= offset; 
 
        vertex++; 
	}*/ 
	/* for(DWORD i=0;ip.x=(i/10)*k.x; 
		 vertex->p.y=(i/10)*k.y; 
		 vertex->p.z=(i/10)*k.z; 
 
         vertex->p.x=(i/10)*k.x+j.x; 
		 vertex->p.y=(i/10)*k.y+j.y; 
		 vertex->p.z=(i/10)*k.z+j.z; 
 
           vertex++; 
	 }*/ 
    m_pVb->Unlock(); 
 
} 
 
void CSnow::DrawSnow() 
{ 
   // D3DXMATRIX matWorld; 
	//D3DXMatrixTranslation( &matWorld, x,y,z ); 
 
	//m_pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld ); 
  SetMaterial(); 
	m_pD3DDevice->SetTexture( 0, m_pTx ); 
     
     
    
 
    m_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,   TRUE ); 
    m_pD3DDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA ); 
    m_pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 
 
    m_pD3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE ); 
    m_pD3DDevice->SetRenderState( D3DRS_ALPHAREF,        0x0f); 
    m_pD3DDevice->SetRenderState( D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL ); 
 
    m_pD3DDevice->SetRenderState( D3DRS_POINTSPRITEENABLE, TRUE ); 
    m_pD3DDevice->SetRenderState( D3DRS_POINTSCALEENABLE,  TRUE ); 
    m_pD3DDevice->SetRenderState( D3DRS_POINTSIZE,     FtoDW(2.00f) ); 
    m_pD3DDevice->SetRenderState( D3DRS_POINTSIZE_MIN, FtoDW(0.00f) ); 
    m_pD3DDevice->SetRenderState( D3DRS_POINTSCALE_A,  FtoDW(1.00f) ); 
    m_pD3DDevice->SetRenderState( D3DRS_POINTSCALE_B,  FtoDW(1.00f) ); 
    m_pD3DDevice->SetRenderState( D3DRS_POINTSCALE_C,  FtoDW(1.00f) ); 
 
    m_pD3DDevice->SetFVF( D3DFVF_SNOWVERTEX ); 
    m_pD3DDevice->SetStreamSource( 0, m_pVb,0, sizeof(SNOWVERTEX) ); 
   m_pD3DDevice->DrawPrimitive( D3DPT_POINTLIST, 
                                   0, m_lSnowCount); 
 
 
	/*MoveSnow(0.3f); 
 
	m_pD3DDevice->SetFVF( D3DFVF_SNOWVERTEX ); 
    m_pD3DDevice->SetStreamSource( 0, m_pVb,0, sizeof(SNOWVERTEX) ); 
    m_pD3DDevice->DrawPrimitive( D3DPT_POINTLIST, 
                                   0, m_lSnowCount); 
 
	m_pD3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE ); 
    m_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); 
     
	MoveSnow(m_fOffset);*/ 
} 
 
void CSnow::RenderSnow() 
{  // m_pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE); 
	DrawSnow(); 
} 
void CSnow::SetMaterial() 
{ 
    ZeroMemory(&mtrl,sizeof(mtrl)); 
    mtrl.Diffuse.r=mtrl.Ambient.r=1.0f; 
	mtrl.Diffuse.g=mtrl.Ambient.g=1.0f; 
	mtrl.Diffuse.b=mtrl.Ambient.b=1.0f; 
	mtrl.Diffuse.a=mtrl.Ambient.a=1.0f; 
    mtrl.Specular.r=0.0f; 
	mtrl.Specular.g=0.0f; 
	mtrl.Specular.b=0.0f; 
	mtrl.Specular.a=0.0f; 
 
	mtrl.Emissive.r=1.0f; 
	mtrl.Emissive.g=1.0f; 
	mtrl.Emissive.b=1.0f; 
	mtrl.Emissive.a=1.0f; 
     m_pD3DDevice->SetMaterial( &mtrl ); 
}