Firecracker

Everything related to 3D programming
User avatar
DK_PETER
Addict
Addict
Posts: 904
Joined: Sat Feb 19, 2011 10:06 am
Location: Denmark
Contact:

Firecracker

Post by DK_PETER »

Code: Select all

;Basic principle of a firecracker (scriptless)

EnableExplicit

InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()

Structure Particles
  id.i
  ma.i
EndStructure

Structure _object
  id.i
  ms.i
  tx.i
  ma.i
EndStructure

Structure _Default_mat
  smoke.i[2]
  crack.i[2]
  paper.i[2]
  fire.i[2]
  obj.i[2]
EndStructure

Structure FireCracker
  crk.Particles
  smoke.Particles
  paper.Particles
  fire.Particles
  ob._object
  startTime.i
EndStructure

Declare.i CreateStage()
Declare.i CreateCracker()
Declare.f RandomF(min.f, Max.f, Res.i = 100000)

Global NewList fc.FireCracker()
Global ground._object, basemat._Default_mat, ev.i, Cam.i

OpenWindow(0, 0, 0, 1024, 768, "Firecracker test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0), 0, 0, 1024, 768, #False, 0, 0)

cam = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(Cam, 0, 5, 0)
CameraDirection(cam, 0, 0, 1)
CreateStage()

Repeat
  
  Repeat
    ev = WindowEvent()
  Until ev = 0
  ExamineMouse()
  RotateCamera(Cam, -MouseDeltaY()*0.05, -MouseDeltaX()*0.05, 0, #PB_Relative)
  RenderWorld()
  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Space)
    CreateCracker()
  EndIf
  If ListSize(fc()) > 0
    ForEach fc()
      Select ElapsedMilliseconds()- fc()\startTime
        Case 0 To 1000
          HideParticleEmitter(fc()\fire\id, #False)
        Case 1001 To 1110
          HideParticleEmitter(fc()\smoke\id, #False)
          HideParticleEmitter(fc()\crk\id, #False)
          HideParticleEmitter(fc()\paper\id, #False)
          HideParticleEmitter(fc()\fire\id, #True)
        Case 1111 To 10000
          MoveParticleEmitter(fc()\paper\id, EntityX(fc()\ob\id,#PB_Absolute), EntityY(fc()\ob\id,#PB_Absolute), EntityZ(fc()\ob\id,#PB_Absolute),#PB_Absolute)
          ParticleEmitterDirection(fc()\paper\id, RandomF(-1,1), 0, Randomf(-1,1))
        Default
          FreeParticleEmitter(fc()\crk\id)
          FreeParticleEmitter(fc()\paper\id)
          FreeParticleEmitter(fc()\smoke\id)
          FreeParticleEmitter(fc()\fire\id)
          FreeEntity(fc()\ob\id)
          DeleteElement(fc())
      EndSelect
    Next
  EndIf
  FlipBuffers()
  
Until KeyboardPushed(#PB_Key_Escape)
End


Procedure.i CreateStage()
  Protected x.i , y.i, z.i
  ground\ms = CreatePlane(#PB_Any, 300, 300, 10, 10, 1, 1)
  ground\tx = CreateTexture(#PB_Any, 512, 512)
  StartDrawing(TextureOutput(ground\tx))
  Box(0, 0, 512, 512, $00B982)
  For y = 0 To 512 Step 64
    For x = 0 To 512 Step 64
      Box(x, 0, 32, 512, $686A69)
      Box(0, y, 512, 32, $686A69)
    Next x
  Next y
  StopDrawing()
  ground\ma = CreateMaterial(#PB_Any, TextureID(ground\tx))
  MaterialBlendingMode(ground\ma, #PB_Material_Add)
  ground\id = CreateEntity(#PB_Any, MeshID(ground\ms), MaterialID(ground\ma), 0, 0, 0)
  EntityPhysicBody(ground\id, #PB_Entity_StaticBody, 1, 0.2, 40.33)
  
  With basemat
    \crack[0] = CreateTexture(#PB_Any, 20, 20)
    StartDrawing(TextureOutput(\crack[0]))
    DrawingMode(#PB_2DDrawing_Gradient)
    FrontColor($7EFEFA)
    BackColor($00E1DA)
    EllipticalGradient(10, 10, 9, 9)
    Ellipse(10, 10, 9, 9)
    StopDrawing()
    \crack[1] = CreateMaterial(#PB_Any, TextureID(\crack[0]))
    MaterialBlendingMode(\crack[1], #PB_Material_Add)
    \paper[0] = CreateTexture(#PB_Any, 20, 20)
    StartDrawing(TextureOutput(\paper[0]))
    Box(0, 0, 20, 20, $ABDFD3)
    StopDrawing()
    \paper[1] = CreateMaterial(#PB_Any, TextureID(\paper[0]))
    MaterialBlendingMode(\paper[1], #PB_Material_Add)
    \smoke[0] = CreateTexture(#PB_Any, 20, 20)
    StartDrawing(TextureOutput(\smoke[0]))
    DrawingMode(#PB_2DDrawing_Gradient)
    FrontColor($111111)
    BackColor($777777)
    EllipticalGradient(10, 10, 8, 8)
    Ellipse(10, 10,8, 8)
    StopDrawing()
    \smoke[1] = CreateMaterial(#PB_Any, TextureID(\smoke[0]))
    MaterialBlendingMode(\smoke[1], #PB_Material_Color)
    \fire[0] = CreateTexture(#PB_Any, 20, 20)
    StartDrawing(TextureOutput(\fire[0]))
    DrawingMode(#PB_2DDrawing_Gradient)
    FrontColor($FEE689)
    BackColor($826800)
    EllipticalGradient(10, 10, 10, 5)
    Ellipse(10, 10, 10, 5)
    FrontColor($2FFAF9)
    BackColor($826800)
    EllipticalGradient(10, 5, 10, 5)
    Ellipse(10, 5, 10, 5)
    StopDrawing()
    \fire[1] = CreateMaterial(#PB_Any, TextureID(\fire[0]))
    MaterialBlendingMode(\fire[1], #PB_Material_Add)
    \obj[0]  = CreateTexture(#PB_Any, 50, 50)
    StartDrawing(TextureOutput(\obj[0]))
    Box(0, 0, 100, 100, $0025FD)
    DrawingMode(#PB_2DDrawing_Outlined)
    For z = 0 To 20
      Box(Random(45,1), Random(45,2), 5, 5, $00B6FD)
    Next z
    StopDrawing()
    \obj[1] = CreateMaterial(#PB_Any, TextureID(\obj[0]))
  EndWith
  
EndProcedure

Procedure.i CreateCracker()
  AddElement(fc())
  fc()\ob\ms = CreateCube(#PB_Any, 0.2)
  fc()\ob\id = CreateEntity(#PB_Any, MeshID(fc()\ob\ms),MaterialID(basemat\obj[1]), 0, 5,0)
  With fc()\crk
    \id = CreateParticleEmitter(#PB_Any, 0.6, 0.6, 0.6, #PB_Particle_Box, 0, 0, 0)
    \ma = CopyMaterial(basemat\crack[1], #PB_Any)
    ParticleSize(\id, 0.1, 0.1)
    ParticleEmissionRate(\id, 600)
    ParticleVelocity(\id, 0.01, 0.01)
    ParticleTimeToLive(\id, 0.01, 0.02)
    ParticleMaterial(\id, MaterialID(basemat\crack[1]))
    AttachEntityObject(fc()\ob\id, "", ParticleEmitterID(\id), 0, 0, 0, 0, 0, 0)
    HideParticleEmitter(\id, #True)
  EndWith
  
  With fc()\smoke
    \id = CreateParticleEmitter(#PB_Any, 1, 0.6, 1, #PB_Particle_Box, 0, 0, 0)
    \ma = CopyMaterial(basemat\smoke[1], #PB_Any)
    ParticleSize(\id, 1, 1)
    ParticleEmissionRate(\id, 20)
    ParticleVelocity(\id, 0.01, 0.01)
    ParticleTimeToLive(\id, 0.01, 0.36)
    ParticleSpeedFactor(\id, 0.2)
    ParticleMaterial(\id, MaterialID(basemat\smoke[1]))
    AttachEntityObject(fc()\ob\id, "", ParticleEmitterID(\id), 0, 0, 0, 0, 0, 0)
    HideParticleEmitter(\id, #True)
  EndWith
  
  With fc()\paper
    \id = CreateParticleEmitter(#PB_Any, 2.9, 0, 2.9, #PB_Particle_Box, 0, 0, 0)
    \ma = CopyMaterial(basemat\paper[1], #PB_Any)
    ParticleSize(\id, 0.02, 0.06)
    ParticleEmissionRate(\id, 50)
    ParticleVelocity(\id, 0.01, 0.02)
    ParticleTimeToLive(\id, 1.01, 1.5)
    ParticleSpeedFactor(\id, 0.2)
    ParticleMaterial(\id, MaterialID(basemat\paper[1]))
  EndWith
  
  With fc()\fire
    \id = CreateParticleEmitter(#PB_Any, 0.02, 0.2, 0.02, #PB_Particle_Point, 0, 0.2, 0)
    \ma = CopyMaterial(basemat\fire[1], #PB_Any)
    ParticleSize(\id, 0.02, 0.06)
    ParticleEmissionRate(\id, 60)
    ParticleVelocity(\id, 0.01, 0.01)
    ParticleTimeToLive(\id, 0.01, 0.02)
    ParticleMaterial(\id, MaterialID(basemat\fire[1]))
    AttachEntityObject(fc()\ob\id, "", ParticleEmitterID(\id), 0, 0, 0, 0, 0, 0)
    HideParticleEmitter(\id, #True)
  EndWith
  
  EntityPhysicBody(fc()\ob\id, #PB_Entity_BoxBody, 0.005, 2.41, 0.02)
  ApplyEntityImpulse(fc()\ob\id, 0, 0.015, 0.0441)
  
  fc()\startTime = ElapsedMilliseconds()
  
EndProcedure

Procedure.f RandomF(min.f, Max.f, Res.i = 100000)
  ProcedureReturn (Min + (Max - Min) * Random(Res) / Res)
EndProcedure
Current configurations:
Ubuntu 20.04/64 bit - Window 10 64 bit
Intel 6800K, GeForce Gtx 1060, 32 gb ram.
Amd Ryzen 9 5950X, GeForce 3070, 128 gb ram.
User avatar
em_uk
Enthusiast
Enthusiast
Posts: 366
Joined: Sun Aug 08, 2010 3:32 pm
Location: Manchester UK

Re: Firecracker

Post by em_uk »

Very nice!
----

R Tape loading error, 0:1
applePi
Addict
Addict
Posts: 1404
Joined: Sun Jun 25, 2006 7:28 pm

Re: Firecracker

Post by applePi »

certainly good firecracker demo, thanks , also i tested a low gravity :added WorldGravity(-1) before the main "Repeat Until" and when we press "Space" several times they fly in low speed beyond each other like a train.
i like the thin vapor, and think it is suitable as a vapor coming from a cup of tea or from a pipe .
User avatar
heartbone
Addict
Addict
Posts: 1058
Joined: Fri Apr 12, 2013 1:55 pm
Location: just outside of Ferguson

Re: Firecracker

Post by heartbone »

smoke.i[2]
crack.i[2]
not so subliminal message...
Keep it BASIC.
Post Reply