Code archives/3D Graphics - Misc/smoke
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| mousebutton to add smoke mousey to zoom in mousex to rotate about smoke requires a greyscale smoke bitmap | |||||
; smoke.bb
; by simon@acid.co.nz
; 2003.7.15 fixed global cam variable and added camera rot test on mousex
; demonstrates particle system using single surface of dynamic quads
; quads use position of particle and angle of camera to rebuild their
; billboard every update facing the camera with only 4 calls to vertexcoords
; commented code
; faster system may be possible placing textures in triangles instead of quads
; animation of particles is possible by scrolling through frames in texture
; mousebutton to add smoke
; mousey to zoom in
Graphics3D 800,600
Global cam=CreateCamera()
PositionEntity cam,0,25,-40
d.smoke=CreateSmoke()
While Not KeyHit(1)
rot#=rot#+MouseXSpeed()
PositionEntity cam,0,25,0
RotateEntity cam,10,rot,0
MoveEntity cam,0,0,-MouseY()
; If MouseDown(1) AddSmoke(d,5, 0,1,0,.01,Rnd(-.1,.1),Rnd(.2,.25),Rnd(-.1,.1), -1,600)
If MouseDown(1) AddSmoke(d,1, 0,1,0,.04 ,Rnd(-.1,.1),Rnd(.2,.25),Rnd(-.1,.1), -1,600)
UpdateWorld
UpdateSmoke(d)
RenderWorld
Flip
Wend
End
Const MAXDIRT=4096 ;4096 ;512
Type vector
Field x#
Field y#
Field z#
End Type
Type smoke
; Field node.node
Field mesh
Field surf
Field cache.asmoke
Field pos.asmoke
Field texture
Field smokex#
End Type
Type asmoke
Field link.asmoke
Field index
Field time
Field rgb
Field pos.vector
Field vel.vector
Field size#,vsize#
End Type
Function CreateSmoke.smoke();parent.node)
d.smoke=New smoke
brush=CreateBrush()
dust=LoadTexture("smoke.bmp",2)
BrushTexture brush,dust
BrushFX brush,3
BrushBlend brush,1
d\texture=dust
d\mesh=CreateMesh()
d\surf=CreateSurface(d\mesh,brush)
For i=1 To MAXDIRT
MakeSmoke(d)
Next
FreeBrush brush
Return d
End Function
Function DestroySmoke(d.smoke)
FreeEntity d\mesh
Delete d
End Function
Function UpdateSmoke(d.smoke)
; PositionTexture d\texture,d\smokex,0 //cycle 32 frames
; d\smokex=d\smokex+1.0/32
surf=d\surf
a.asmoke=d\cache
TFormVector -1,0,0,cam,0
camxx#=TFormedX()
camxy#=TFormedY()
camxz#=TFormedZ()
TFormVector 0,-1,0,cam,0
camyx#=TFormedX()
camyy#=TFormedY()
camyz#=TFormedZ()
While a<>Null
If a\time>0
a\time=a\time-1
a\vel\y=a\vel\y-GRAVITY/2
; AddVector a\pos,a\vel
p.vector=a\pos
p\x=p\x+a\vel\x
p\y=p\y+a\vel\y
p\z=p\z+a\vel\z
a\size=a\size+a\vsize
If a\time=0 Or a\pos\y<0
HideSmoke(d,a)
Else
scale#=a\size
cxx#=camxx*scale
cxy#=camxy*scale
cxz#=camxz*scale
cyx#=camyx*scale
cyy#=camyy*scale
cyz#=camyz*scale
i=a\index
x#=p\x-cyx+cxx
y#=p\y-cyy+cxy
z#=p\z-cyz+cxz
VertexCoords surf,i,x,y,z
x#=p\x-cyx-cxx
y#=p\y-cyy-cxy
z#=p\z-cyz-cxz
VertexCoords surf,i+1,x,y,z
x#=p\x+cyx-cxx
y#=p\y+cyy-cxy
z#=p\z+cyz-cxz
VertexCoords surf,i+2,x,y,z
x#=p\x+cyx+cxx
y#=p\y+cyy+cxy
z#=p\z+cyz+cxz
VertexCoords surf,i+3,x,y,z
; x#=p\x-cyx
; y#=p\y-cyy
; z#=p\z-cyz
; VertexCoords surf,i,x,y,z
; x=x+cyx-cxx
; y=y+cyy-cxy
; z=z+cyz-cxz
; VertexCoords surf,i+1,x,y,z
; x=x+cxx+cxx
; y=y+cxy+cxy
; z=z+cxz+cxz
; VertexCoords surf,i+2,x,y,z
EndIf
EndIf
a=a\link
Wend
End Function
Function HideSmoke(d.smoke,a.asmoke)
surf=d\surf
i=a\index
; VertexCoords surf,i,0,-500000,0
; VertexCoords surf,i+1,0,-500000,0
; VertexCoords surf,i+2,0,-500000,0
VertexCoords surf,i,0,-500000,0
VertexCoords surf,i+1,0,-500000,0
VertexCoords surf,i+2,0,-500000,0
VertexCoords surf,i+3,0,-500000,0
a\time=0
End Function
Function MakeSmoke(d.smoke)
a.asmoke=New asmoke
a\link=d\cache
d\cache=a
s=d\surf
i=AddVertex(s,0,-50000,0,0,0)
AddVertex(s,0,-50000,0,1,0)
AddVertex(s,0,-50000,0,1,1)
AddVertex(s,0,-50000,0,0,1)
AddTriangle s,i,i+1,i+2
AddTriangle s,i,i+2,i+3
; i=AddVertex(s,0,-50000,0,0.5,-.4)
; AddVertex(s,0,-50000,0,1.4,1)
; AddVertex(s,0,-50000,0,-.4,1)
; AddTriangle s,i,i+1,i+2
a\index=i
a\time=0
a\pos=New vector
a\vel=New vector
End Function
Function AddSmoke(s.smoke,size#,x#,y#,z#,vsize#,vx#,vy#,vz#,rgb,t)
a.asmoke=s\pos
If a=Null a=s\cache
s\pos=a\link
a\pos\x=x
a\pos\y=y
a\pos\z=z
a\vel\x=vx
a\vel\y=vy
a\vel\z=vz
a\rgb=rgb
r=(rgb Shr 16) And 255
g=(rgb Shr 8) And 255
b=rgb And 255
surf=s\surf
i=a\index
VertexColor surf,i+0,r,g,b
VertexColor surf,i+1,r,g,b
VertexColor surf,i+2,r,g,b
a\time=t
a\size=size
a\vsize=vsize
End Function
Function CheckSmoke.asmoke(a.asmoke,cx#,cy#,cz#,rr#)
While a<>Null
If a\time>0
p.vector=a\pos
x#=a\pos\x-cx
y#=a\pos\y-cy
z#=a\pos\z-cz
If x*x+y*y+z*z<rr Return a
EndIf
a=a\link
Wend
End Function |
Comments
None.
Code Archives Forum