Jump to content
  • Advertisement
Sign in to follow this  
-Tau-

Particle rendering problem

This topic is 2192 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

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
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!