More single surface particles
Blitz3D Forums/Blitz3D Programming/More single surface particles
| ||
| Hey, i'm still working on a single surface particle system, but i need to check a few thing :) 1. When i load in the texture i want for the particles, i load them in as an unanimated texture, formatted like an animated texture, but just loaded using loadtexture? 2. Then when i want to animate a particular quad, i simply adjust the uv co-ords for that triangle? 3. I need to know if using sin and cos are slow? I'm using them constantly and need any feisable speed ups i can get. 4. I assume that when a quad isn't being used, i adjust the uv co-ords so that no tetxure is showing? 5. I read something a while back about calling clear surface, and building the quads back from scratch every frame. Think i read that from Anthony Flacks post about his game. Sorry about the large number number of questions, but i feel like i'm learning alot jumping in with this stuff:) |
| ||
| It's ok, i've answered many of my own questions by mucking about. Question 3 would still be handy if answered :) I'll post my code. All you need is an image called "fire.png". Please try this and give me your opinions/suggestions for making it faster if possible :)
Graphics3D 800,600
SetBuffer BackBuffer()
cam=CreatePivot()
camera=CreateCamera(cam)
PositionEntity camera,0,0,-15
mesh=CreateMesh()
surface=CreateSurface(mesh)
NUM_PARTICLES=60
Type s_part
Field x#,y#,z#; central position for the quad
Field index; index for the first vertex
Field ang#; ang value. -45 for normal
Field alpha#
Field speed#
Field time
Field timer
Field ang_speed#
Field active
Field pindex
End Type
g_time=1
g_timer=MilliSecs()
cpx#=0
cpy#=0
cyz#=0
ang=-45
index=0
v0=AddVertex(surface,cpx+Sin(ang),cpy+Cos(ang),cpz,0,1)
v1=AddVertex(surface,cpx+Sin(ang+90),cpy+Cos(ang+90),cpz,1,1)
v2=AddVertex(surface,cpx+Sin(ang-90),cpy+Cos(ang-90),cpz,0,0)
v3=AddVertex(surface,cpx+Sin(ang+180),cpy+Cos(ang+180),cpz,1,0)
tri=AddTriangle(surface,v0,v1,v2)
tri1=AddTriangle(surface,v1,v3,v2)
tex=LoadTexture("fire.png",2)
EntityTexture mesh,tex
EntityFX mesh,32+2
EntityBlend mesh,3
VertexColor surface,0,200,200,200;,0.8
VertexColor surface,1,200,200,200;,0
VertexColor surface,2,200,200,200;,0
VertexColor surface,3,200,200,200;,0
For loop=0 To NUM_PARTICLES
Gosub create_spart
Next
While Not KeyHit(1)
;TranslateEntity mesh,0,0.01,0,True
TurnEntity mesh,0,0,1
cx=EntityPitch(camera,True)
cy=EntityYaw(camera,True)
cz=0
If MouseDown(1) Then ang=ang+1:Gosub rotatequad
If MouseDown(2) Then ang=ang-1:Gosub rotatequad
If KeyDown(203) Then cpx=cpx-0.1:Gosub rotatequad
If KeyDown(205) Then cpx=cpx+0.1:Gosub rotatequad
If KeyDown(200) Then cpy=cpy+0.1:Gosub rotatequad
If KeyDown(208) Then cpy=cpy-0.1:Gosub rotatequad
If KeyDown(2) Then Gosub create_spart
If MilliSecs()>g_time+g_timer Then
g_timer=MilliSecs()
Gosub new_spart
End If
RotateEntity mesh,cx,cy,cz
If MilliSecs()<timer+1000 Then
frame=frame+1
Else
fps=frame
frame=0
timer=MilliSecs()
End If
Gosub update_spart
UpdateWorld
RenderWorld
Text 0,0," Number of quads="+(index/4)+" fps="+fps+" trirednered="+TrisRendered()
Flip False
Wend
End
.rotatequad
VertexCoords(surface,0,cpx+Sin(ang),cpy+Cos(ang),cpz)
VertexCoords(surface,1,cpx+Sin(ang+90),cpy+Cos(ang+90),cpz)
VertexCoords(surface,2,cpx+Sin(ang-90),cpy+Cos(ang-90),cpz)
VertexCoords(surface,3,cpx+Sin(ang+180),cpy+Cos(ang+180),cpz)
Return
.create_spart
p.s_part=New s_part
p\pindex=index
index=index+4
p\x=Rnd(-2,2)
p\y=0;Rnd(-4,4)
p\z=Rnd(-2,2)
p\speed=Rnd(0.001,0.01)
p\time=Int(Rnd(500,2000))
p\ang_speed=Rnd(0.1,2)
p\ang=Rnd(-45,135)
v0=AddVertex(surface,p\x+Sin(p\ang),p\y+Cos(p\ang),p\z,0,1)
v1=AddVertex(surface,p\x+Sin(p\ang+90),p\y+Cos(p\ang+90),p\z,1,1)
v2=AddVertex(surface,p\x+Sin(p\ang-90),p\y+Cos(p\ang-90),p\z,0,0)
v3=AddVertex(surface,p\x+Sin(p\ang+180),p\y+Cos(p\ang+180),p\z,1,0)
tri=AddTriangle(surface,v0,v1,v2)
tri1=AddTriangle(surface,v1,v3,v2)
Return
.update_spart
For p.s_part=Each s_part
If p\active=1 Then
p\y=p\y+p\speed
p\ang=p\ang+p\ang_speed
VertexCoords(surface,p\pindex+0,p\x+Sin(p\ang),p\y+Cos(p\ang),p\z)
VertexCoords(surface,p\pindex+1,p\x+Sin(p\ang+90),p\y+Cos(p\ang+90),p\z)
VertexCoords(surface,p\pindex+2,p\x+Sin(p\ang-90),p\y+Cos(p\ang-90),p\z)
VertexCoords(surface,p\pindex+3,p\x+Sin(p\ang+180),p\y+Cos(p\ang+180),p\z)
If MilliSecs()>p\time+p\timer Then
p\active=0
VertexColor surface,p\pindex+0,200,200,200,0
VertexColor surface,p\pindex+1,200,200,200,0
VertexColor surface,p\pindex+2,200,200,200,0
VertexColor surface,p\pindex+3,200,200,200,0
End If
End If
Next
Return
.new_spart
loop_exit=0
For p.s_part=Each s_part
If p\active=0 Then
VertexColor surface,p\pindex+0,200,200,200,1
VertexColor surface,p\pindex+1,200,200,200,1
VertexColor surface,p\pindex+2,200,200,200,1
VertexColor surface,p\pindex+3,200,200,200,1
p\active=1
p\y=0
p\speed=Rnd(0.001,0.01)
p\timer=MilliSecs()
p\time=Int(Rnd(500,2000))
p\ang_speed=Rnd(0.01,0.3)
p\ang=Rnd(-45,135)
p\x=Rnd(-2,2)
p\z=Rnd(-2,2)
loop_exit=1
VertexCoords(surface,p\pindex+0,p\x+Sin(p\ang),p\y+Cos(p\ang),p\z)
VertexCoords(surface,p\pindex+1,p\x+Sin(p\ang+90),p\y+Cos(p\ang+90),p\z)
VertexCoords(surface,p\pindex+2,p\x+Sin(p\ang-90),p\y+Cos(p\ang-90),p\z)
VertexCoords(surface,p\pindex+3,p\x+Sin(p\ang+180),p\y+Cos(p\ang+180),p\z)
End If
If loop_exit=1 Then Exit
Next
Return
And use this for anything you want to. :D |