Sign in to follow this  
-Tau-

Particle rendering problem

Recommended Posts

Hi all,
I need som advice for vertex declaration / FVF with particles. Main issue is the texture on particles.
When i first created particle class and class to manipulate with particles, particle vertex had position normal and texcoord. After a while i understood that particle do not need a normal so i removed it. After that particle were either not drawn or drawn with only 1 color. First i used FVF, then i changed to vertex declaration in hope it will solve this problem.

[source]
struct PARTICLEVERTEX
{
D3DXVECTOR3 pos;
float tu, tv;
};

#define D3DFVF_PARTICLEVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)

void ParticleSystem::OnCreate(IDirect3DDevice9* pd3dDevice)
{
PARTICLEVERTEX *_Vertices = new PARTICLEVERTEX[4];
VOID *_pVertices;
pd3dDevice->CreateVertexBuffer( 4* sizeof( PARTICLEVERTEX ),
0, 0,
D3DPOOL_MANAGED, &m_pVB, NULL );
m_pVB->Lock( 0, 0, ( void** )&_pVertices, 0 );
{
_Vertices[0].pos=D3DXVECTOR3(-0.5 , -0.5, 0);
_Vertices[0].tu=0;
_Vertices[0].tv=1;
_Vertices[1].pos=D3DXVECTOR3(-0.5 , 0.5, 0);
_Vertices[1].tu=0;
_Vertices[1].tu=0;
_Vertices[2].pos=D3DXVECTOR3(0.5 , -0.5, 0);
_Vertices[2].tu=1;
_Vertices[2].tv=1;
_Vertices[3].pos=D3DXVECTOR3(0.5 , 0.5, 0);
_Vertices[3].tu=1;
_Vertices[3].tv=0;
}
memcpy( _pVertices, _Vertices, sizeof(PARTICLEVERTEX)*4 );
m_pVB->Unlock();
delete []_Vertices;

D3DVERTEXELEMENT9 f_par_VDecl[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
D3DDECL_END()
};

pd3dDevice->CreateVertexDeclaration( f_par_VDecl, &m_pDecl );
}

void ParticleSystem::draw(ID3DXEffect* pEffect, IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime)
{
if (!pfpar)
return;

if (pfpar->time_to_die<fTime)
{
particle *tdelete=pfpar;
pfpar=pfpar->pnext;
delete tdelete;
}

particle *akt=pfpar;

UINT iP,cP;
HRESULT hr;
D3DXMATRIXA16 mWorld;
pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof( PARTICLEVERTEX ) );
pd3dDevice->SetVertexDeclaration( m_pDecl );

while (akt)
{
if (akt->pnext)
if (akt->pnext->time_to_die<(float)fTime)
{
particle *tdelete=akt->pnext;
akt->pnext=akt->pnext->pnext;
delete tdelete;
}

akt->move(fTime, fElapsedTime);
D3DXMatrixTranslation(&mWorld, akt->pos.x, akt->pos.y, akt->pos.z);

V( pEffect->SetTexture( g_efn->g_txScene, v_ints_tex[akt->i_tex].v_tex[akt->akt_texture] ) );

V( pEffect->SetFloat( g_efn->particleScale, akt->scale) );
V( pEffect->SetVector( g_efn->g_MaterialColor, &akt->color) );
V( pEffect->SetMatrix( g_efn->g_mWorld, &mWorld ) );
V( pEffect->Begin( &cP, 0 ) );
for( iP = 0; iP < cP; iP++ )
{
V( pEffect->BeginPass( iP ) );
pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2);
pEffect->EndPass();
}
pEffect->End();

akt=akt->pnext;
}
}

////////////////////
////////////////////
void ParticleVS(float4 iPos : POSITION,
float2 iTex : TEXCOORD0,
out float4 oPos : POSITION,
out float2 oTex : TEXCOORD0)
{
float4x4 wv = mul(g_mWorld, g_mView);
oPos = iPos*float4(particleScale, particleScale, particleScale, 1.0) + float4(wv._41, wv._42, wv._43, 0.0);
oPos = mul( oPos, g_mProj );
oTex = iTex;
}

float4 ParticlePS(float2 iTex : TEXCOORD0) : COLOR0
{
return tex2D(g_samScene, iTex)*g_MaterialColor;
}[/source] Edited by -Tau-

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this