Here the code: Use your own images.
Code: Select all
;-----------------------------
;Torch demo Test 3 ---
;-----------------------------
;By DK_PETER
;12-july-2014
;If you have an eye for details in flames/fire/explosions
;you'll find, that imitating real fire without some serious scripting
;is extremely difficult to do..
;It would be nice to see other fire examples.
;This time I've added randomness to 10 particle emitters
;Directions and materials are changed each time you run
;this code. It's getting there and right now it's usable.
;Onwards to test 4..
EnableExplicit
InitEngine3D():InitSprite():InitMouse():InitKeyboard():InitSound()
UseJPEGImageDecoder()
UsePNGImageDecoder()
DeclareModule tbr
Declare.i SetResolution(Width.i = 1920,Height.i = 1080,Fullscreen.i = #False)
Declare.i GameOn()
EndDeclareModule
Module tbr
Structure _MESHDATA
id.i
mt.i
tx.i
ms.i
EndStructure
Declare.i Loadcave()
Declare.i ReadyEveryting()
Declare.i Loadcave()
Declare.i LoadTorch()
Global ca._MESHDATA,Tor._MESHDATA
Global Dim par._MESHDATA(10)
Global Cam.i,FS.i = #False
Global light.i, light2.i
Procedure.i SetResolution(Width.i = 1920,Height.i = 1080,Fullscreen.i = #False)
FS = Fullscreen
If Fullscreen=#False
win = OpenWindow(#PB_Any, 0, 0, Width, Height, "TBR",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
scr = OpenWindowedScreen(WindowID(win), 0, 0, Width, Height, #False, 0, 0, #PB_Screen_SmartSynchronization)
Else
;AntialiasingMode(#PB_AntialiasingMode_x6)
scr = OpenScreen(Width, Height, 32, "TBR",#PB_Screen_SmartSynchronization, 60)
EndIf
Cam = CreateCamera(#PB_Any, 0, 0, 100, 100)
WorldShadows(#PB_Shadow_TextureAdditive)
EndProcedure
Procedure.i ReadyEveryting()
Add3DArchive("mesh",#PB_3DArchive_FileSystem)
Add3DArchive("bitmap",#PB_3DArchive_FileSystem)
Add3DArchive("material",#PB_3DArchive_FileSystem)
Parse3DScripts()
EndProcedure
Procedure.f RandomF(min.f, Max.f, Res.i = 100000)
ProcedureReturn (Min + (Max - Min) * Random(Res) / Res)
EndProcedure
Procedure.i Loadcave()
ca\ms = LoadMesh(#PB_Any, "cave.mesh")
ca\mt = GetScriptMaterial(#PB_Any, "cave_tex")
ca\id = CreateEntity(#PB_Any, MeshID(ca\ms), #PB_Material_None, 0, 0, 0)
ScaleEntity(ca\id, 1200,800,1200)
EndProcedure
Procedure.i returnDirection()
Protected rdval.i = Random(10000,1)
Select rdval
Case 1 To 3333
ProcedureReturn -1
Case 3334 To 7000
ProcedureReturn 0
Default
ProcedureReturn 1
EndSelect
EndProcedure
Procedure.i LoadTorch()
Protected Dim tx.i(5)
Tor\ms = LoadMesh(#PB_Any, "torch.mesh")
Tor\mt = GetScriptMaterial(#PB_Any, "Torchstick_tex")
Tor\id = CreateEntity(#PB_Any, MeshID(Tor\ms),#PB_Material_None, 1, -1, -5)
RotateEntity(Tor\id, 0,0,30)
ScaleEntity(ca\id, 10,8,12)
For x = 0 To 4
tx(x) = LoadTexture(#PB_Any, Str(x+1) + ".jpg")
Next x
For x = 0 To 9
par(x)\id = CreateParticleEmitter(#PB_Any, 0.4, 0.4, 0.2, #PB_Particle_Point, -0.1, 0.8, -4.6)
ParticleEmitterDirection(par(x)\id,returnDirection(), 1, 0)
par(x)\mt = CreateMaterial(#PB_Any, TextureID(tx(Random(4,0))))
MaterialBlendingMode(par(x)\mt, #PB_Material_Add)
ParticleMaterial(par(x)\id,MaterialID(par(x)\mt))
ParticleEmissionRate(par(x)\id,Random(60,40))
ParticleSize(par(x)\id, RandomF(1,3), Randomf(0.5,1.0))
ParticleVelocity(par(x)\id, 0, 0.001)
ParticleTimeToLive(par(x)\id, 0.1, 0.1)
ParticleSpeedFactor(par(x)\id, 0.1)
Next x
light = CreateLight(#PB_Any, $00FFFF,-0.1, 0.8, -4.6,#PB_Light_Spot)
LightDirection(light,0,1,0)
EndProcedure
lightms = ElapsedMilliseconds()
Procedure.i GameOn()
ReadyEveryting()
Loadcave()
LoadTorch()
Repeat
If FS = #False
Repeat
ev = WindowEvent()
If ev = #PB_Event_CloseWindow
Quit = 1
EndIf
Until ev=0
EndIf
ExamineMouse()
mx.f = -MouseDeltaX() * 0.05
my.f = -MouseDeltaY() * 0.05
RotateCamera(Cam, my, mx, 0, #PB_Relative)
ExamineKeyboard()
RenderWorld()
If ElapsedMilliseconds() - lightms > 80
LightDirection(light, returnDirection(), 1, 0)
lightms=ElapsedMilliseconds()
EndIf
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
EndProcedure
EndModule
tbr::SetResolution()
tbr::GameOn()

