In the system Iv created you can move the emit position without it effecting the already emitted particles, I will have to do a youtube video showing this.
here is a cut down shader off what Im using.
//====================================================
// Particles Shader
// By EVOLVED
//====================================================
//--------------
// un-tweaks
//--------------
matrix ViewProj:ViewProjection;
matrix ViewInv:ViewInverse;
//--------------
// tweaks
//--------------
float4 ParticlePosition[100];
float4 ParticleColor[100];
float zshiftScale=0.001;
//--------------------------------
// Textures
//--------------------------------
texture ParticleTX <string Name = "";>;
sampler Particle=sampler_state
{
Texture=<ParticleTX>;
};
//--------------
// structs
//--------------
struct InPut
{
float4 Pos:POSITION;
float2 UV:TEXCOORD0;
float2 Index:TEXCOORD1;
};
struct OutPut
{
float4 OPos:POSITION;
float2 Tex:TEXCOORD0;
float4 ParColor:TEXCOORD1;
};
//--------------
// vertex shader
//--------------
OutPut VS(InPut IN)
{
OutPut OUT;
int Particle=IN.Index.x;
float4 NewPos=IN.Pos+float4(ParticlePosition[Particle].xyz,0);
float zshift=1+(length(NewPos-ViewInv[3].xyz)*zshiftScale);
float2 ScaleXY=IN.UV-0.5;
ScaleXY.x=ScaleXY.x*0.8f;
OUT.OPos=mul(NewPos,ViewProj)+float4(ScaleXY*ParticlePosition[Particle].w*zshift,0,0);
OUT.Tex=-IN.UV;
OUT.ParColor=ParticleColor[Particle];
return OUT;
}
//--------------
// pixel shader
//--------------
float4 PS(OutPut IN) : COLOR
{
float4 ParticleTexture=tex2D(Particle,IN.Tex);
return float4(IN.ParColor.xyz,ParticleTexture.x*IN.ParColor.w);
}
//--------------
// techniques
//--------------
technique Particle
{
pass p0
{
vertexShader= compile vs_2_0 VS();
pixelShader = compile ps_2_0 PS();
}
}
note: particle number element is stored in the U of objects uv stage 1( set vertexdata uv vertex,1,partical,0 )
[EDIT]
here a make particle object function Im using(bit unfinished),just use this with the above shader code and fill in the rest in dbp.
function MakeParticleObject(Obj,Particles)
Vertex=(((Particles+1)*3)*2)
Make Memblock 1,(Vertex*40)+12
Write Memblock Dword 1,0,(0x002 || 0x010 || 0x200)
Write Memblock Dword 1,4,40
Write Memblock Dword 1,8,Vertex
make mesh from memblock 1,1
delete memblock 1
make object Obj,1,0
set object normals Obj
delete mesh 1
make mesh from object 1,Obj
delete object Obj
Vertex=0:Index=0
lock vertexdata for mesh 1
for p=0 to Particles
set indexdata Vertex,Index+0:inc Vertex
set indexdata Vertex,Index+1:inc Vertex
set indexdata Vertex,Index+2:inc Vertex
set indexdata Vertex,Index+1:inc Vertex
set indexdata Vertex,Index+3:inc Vertex
set indexdata Vertex,Index+2:inc Vertex
set vertexdata uv Index,0,1,0
set vertexdata uv Index,1,p,0:inc Index
set vertexdata uv Index,0,0,0
set vertexdata uv Index,1,p,0:inc Index
set vertexdata uv Index,0,1,1
set vertexdata uv Index,1,p,0:inc Index
set vertexdata uv Index,0,0,1
set vertexdata uv Index,1,p,0:inc Index
next p
delete mesh from vertexdata Index,get vertexdata vertex count()-1,0,0
unlock vertexdata
make object Obj,1,0
convert object fvf Obj,(0x002 || 0x200)
endfunction