Try my new website:
www.urcho.com
- the new SIMPLE social network
Sign up
|
357
members |
125
snippets
Search for:
ALL
POPULAR
File Controls
Multiplayer Code
2D Effects
3D Effects
Oldskool demos
Basic Functions
Maths/Physics
Sound
Tutorials
Misc
Username:
Password:
Sign up
Smoke Particle Engine by Malice
[
back
]
Author:
Archive
| Viewed:
806
times | Language:
BlitzBasic 3D
| Category:
3D Effects
;************************ ;GALACTIC ALLEGIANCE v3.2 ;************************ ;******* FUNCTIONS ***** ;Coded By PJ Chowdhury 2006 ;For the Galactic Allegiance Open-Source Project ;These Functions Released as Full Public Domain ;The functions are used to create a particle emitter which will ;Then continue To emit smoke-like particles of the chosen specifications ;************************************************************************************************ ; EXAMPLE ;************************************************************************************************ Graphics3D 800,600,32,2 SetBuffer BackBuffer() cam=CreateCamera() CameraViewport cam,0,0,800,600 CameraRange cam,1,100 MoveEntity cam,0,0,-10 tex=CreateTexture(128,128,3) SetBuffer TextureBuffer(tex) ClsColor 0,0,0 Cls Color 255,255,255 Oval 64,64,64,64,1 SetBuffer BackBuffer() Global SmokeSprite=CreateSprite() ;*YOU WILL NEED A GLOBAL SPRITE WITH THE HANDLE SmokeSprite FOR THE FUNCTIONS TO WORK EntityFX SmokeSprite,1 EntityTexture SmokeSprite,tex EntityAlpha SmokeSprite,0 AmbientLight 180,180,180 sun=CreateLight(1) PositionEntity sun,40,20,60 PointEntity sun,cam cube=CreateCube() EntityColor cube,180,0,0 MoveEntity cube,-5,0,2 EntityPickMode cube,2 sphere=CreateSphere(20) EntityColor sphere,0,180,0 MoveEntity sphere,5,0,2 EntityPickMode sphere,2 cylinder=CreateCylinder(20,1) MoveEntity cylinder,0,4,10 RotateMesh cylinder,90,0,45 EntityColor cylinder,0,0,180 EntityPickMode cylinder,2 piv=CreatePivot() pyra=CreateCone(4,1) EntityColor pyra,180,180,0 MoveEntity pyra,0,-2,5 EntityPickMode pyra,2 EntityParent pyra,piv While Not KeyDown(1) TurnEntity piv,0,0.5,0 TurnEntity cylinder,1,5,0 If MouseHit(1) msh=CameraPick(cam,MouseX(),MouseY()) If msh>0 p=msh s#=Rnd#(0.001,0.5) d=Rand(1,5) c=Rand(64,192) f#=Rnd#(0.01,0.1) Emit_Smoke(p,s#,d,c,c,c,f#,Rand(0,20)) EndIf EndIf Update_Smoke() UpdateWorld RenderWorld Text 0,0,"CLICK ON A PRIMITIVE MESH TO APPLY A RANDOMISED SMOKE EMITTER" Text 0,100,"LAST EMITTER: "+msh Flip Wend ;************************************************************************************************* ; FUNCTIONS AND TYPES ;************************************************************************************************* Type Smoke_Particles Field Sprite Field Alpha# Field Fade# End Type Type Smoke_Emitter Field Pivot Field SP_Red Field SP_Green Field SP_Blue Field SP_Dens Field SP_Scale# Field SP_Fade# Field SP_Var End Type ;The main user-defining function is Emit_Smoke, ;Call this Function Whenever you wish To Add an emitter To your world ;Parent_Entity is the entity to which you wish to attach the emitter ;Sm_Scale# is the size of both the particles and the spread of the smoke effect ;Sm_Density changes the number of particles created per frame. Integers only ;Smoke_Red, Green and Blue determine the colour of smoke emitted by that emitter. ;Sm_fade# is the rate at which the particles fade out (Floats between 0.005 and 0.1 are best) ;Sm_Colour_Var is an amount (0 to 50 is a good range) to vary the colour of the smoke by Function Emit_Smoke(Parent_Entity,Sm_Scale#,Sm_Density,Smoke_Red,Smoke_Green,Smoke_Blue,Sm_Fade#,Sm_Colour_Var) Sm_emit.Smoke_Emitter= New Smoke_Emitter Sm_emit\pivot=CreatePivot() ;This pivot is in effect The particle emitter PositionEntity Sm_emit\pivot,EntityX#(Parent_Entity,1),EntityY#(Parent_Entity,1),EntityZ#(Parent_Entity,1),1 EntityParent Sm_emit\pivot,Parent_Entity ;Attach pivot to Parent Entity Sm_emit\SP_Dens=Sm_Density ;These lines feed Sm_emit\SP_Red=Smoke_Red ;the relevant data Sm_emit\SP_Green=Smoke_Green ;to the emitter Sm_emit\SP_Blue=Smoke_Blue ; Sm_emit\SP_Scale#=Sm_Scale# ;ensuring a record Sm_emit\SP_Fade#=Sm_Fade# ;is kept of the Sm_emit\SP_Var=Sm_Colour_Var ;particle criteria End Function Function Update_smoke() ;This function should be called each loop. For upd_Smoke.Smoke_Emitter=Each Smoke_Emitter For f=1 To upd_Smoke\SP_Dens ;sets a small loop to generate more particles for higher densities SmPart.Smoke_Particles = New Smoke_Particles ;Generates New Smoke Particles SmPart\Sprite=CopyEntity (SmokeSprite) ;Copies the generic Smoke Sprite SmPart\Alpha#=1 ;Sets the particles to be initially visible SmPart\Fade#=upd_Smoke\SP_Fade# ;Gives this Particle a fade index part_ScaleSmall#=((upd_smoke\SP_Scale#)/10) ; scl#=Rnd#(part_Scale#,upd_smoke\SP_Scale#) ; ; ScaleSprite SmPart\Sprite,scl#,scl# ;Scales the particle EntityColor SmPart\Sprite,upd_smoke\SP_Red+(Rand(0-upd_smoke\SP_var,upd_smoke\SP_var)),upd_smoke\SP_Blue+(Rand(0-upd_smoke\SP_var,upd_smoke\SP_var)),upd_smoke\SP_Green+(Rand(0-upd_smoke\SP_var,upd_smoke\SP_var)) ;Colours the particle PositionEntity SmPart\Sprite,EntityX#(upd_Smoke\Pivot,1),EntityY#(upd_Smoke\Pivot,1),EntityZ#(upd_Smoke\Pivot,1),1 part_ScaleSmall#=Part_ScaleSmall#*5 MoveEntity SmPart\Sprite,Rnd#(0-Part_ScaleSmall#,Part_ScaleSmall#),Rnd#(0-Part_ScaleSmall#,Part_ScaleSmall#),Rnd#(0-Part_ScaleSmall#,Part_ScaleSmall#) ;positions the particle Next Next For Upd_Parts.Smoke_Particles = Each Smoke_Particles ;This should also be called each loop EntityAlpha Upd_Parts\Sprite,Upd_Parts\Alpha# ; Upd_Parts\Alpha#=Upd_Parts\Alpha# - Upd_Parts\Fade# ; Fades the particle TranslateEntity Upd_Parts\Sprite,0,0.1,0 ;Makes the particles rise If Upd_Parts\Alpha#<=0 Then Delete Upd_Parts ;Destroy fully-faded articles Next End Function
Author Comments:
The Functions and Types allow you to attach a particle emitter to any existing entity (Meshes, Sprites, Pivots, Lights etc) The emitters, once placed, will continuously emit particles each loop.
Login or
create an account
to comment on this snippet