Advertisement
Guest User

3D Fire Lines - DARK BASIC port - Version 03

a guest
Apr 17th, 2022
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.86 KB | None | 0 0
  1. ; PROJECT : 3D Fire Lines - DARK BASIC port - Version 03
  2. ; AUTHOR : Kev Picone - http://PlayBASIC.com
  3. ; CREATED : 15/04/2022
  4. ; EDITED : 17/04/2022
  5. ; ---------------------------------------------------------------------
  6.  
  7. ` *=---------------------------------------------------------------------=*
  8. ` *=---------------------------------------------------------------------=*
  9. ` *=-------------------->> PORTED FROM DARK BASIC <<---------------------=*
  10. ` *=---------------------------------------------------------------------=*
  11. ` *=---------------------------------------------------------------------=*
  12.  
  13.  
  14. ` This is the final version of the effect. In this edition we've
  15. ` added smoother motion of the fire lines with alpha addition for
  16. ` the rendering a circle to show the head of the line as well as
  17. ` a pass of alpha multiply.
  18.  
  19. ` *=---------------------------------------------------------------------=*
  20. `
  21. ` >> 3D Fire Lines V0.03 <<
  22. `
  23. ` By Kevin Picone
  24. `
  25. ` Original: 24,May,2001
  26. `
  27. ` PlayBASIC Update: 15,April,2022
  28. `
  29. ` (c) Copyright 2001/2022, By Kevin Picone, All Rights Reserved.
  30. `
  31. ` *=---------------------------------------------------------------------=*
  32. ` www.Underwaredesign.com www.PlayBASIC.com
  33. ` *=---------------------------------------------------------------------=*
  34. `
  35. ` So WHAT does this do ?:
  36. ` =======================
  37. `
  38. ` The Idea for this effect comes from both a demo "Jn_omega" wrote and a
  39. ` open gl demo I saw a while back. Figured, it might make an interesting
  40. ` snippet, so here it is.
  41. `
  42. ` This demo renders a group of glowing (for want of a better word) lines
  43. ` moving in 3D space. While DB's line speed does put the breaks on this
  44. ` effect, it's 'not' entirely to blame, as the update routine is shifting
  45. ` data it really doesn't need too.. but i'm not fussed Smiley
  46. `
  47. `
  48. ` Bugs:
  49. ` =====
  50. `
  51. ` One thing that is missing from this demo and perhaps those will a keen
  52. ` eye would have spotted it, is the lack of zbuffering in the rendering,
  53. ` granted it's fairly hard to tell with only a hand full of lines, but
  54. ` it is missing none the less.
  55. `
  56. `
  57. ` Release Info:
  58. ` =============
  59. `
  60. ` Your welcome to use this code freely in your own projects, a credit
  61. ` and perhaps a link would be nice. Thank You.
  62. `
  63. `
  64. ` Cya,
  65. ` Kevin Picone
  66. `
  67. ` *=---------------------------------------------------------------------=*
  68.  
  69.  
  70. #include "blitimage"
  71.  
  72. ` Define Useful Constants (just makes the code more user friendly/readable)
  73.  
  74.  
  75. constant Mode_3d=ac(1)
  76. constant Mode_2d=ac(1)
  77.  
  78.  
  79.  
  80. ` Define Program Constants.
  81.  
  82. ScreenWidth =GetScreenWidth()
  83. ScreenHeight =GetScreenHeight()
  84. ScreenBitDepth=16
  85.  
  86. Title$ = "3D Fire Lines"
  87. Version$ = "V0.03"
  88.  
  89. titlescreen Title$+" "+Version$
  90.  
  91.  
  92.  
  93. ` Setup The Fire Line Array and Define How many LINES we want, and how
  94. ` LONG they should be.
  95.  
  96. Numb_of_FireLines =200
  97. Numb_of_FireLinesSegMents =200
  98.  
  99.  
  100. ` Select a mode to run the demo in 3D or 2D are possible
  101.  
  102. FireLines_status=Mode_3D
  103. ` FireLines_status=MODE_2D
  104.  
  105.  
  106.  
  107. gosub _Init_Fire_lines
  108.  
  109.  
  110.  
  111. ` *=----------------------------------------------------------------=*
  112. ` Main Loop
  113. ` *=----------------------------------------------------------------=*
  114.  
  115. Screen=NewFXImage( ScreenWidth, ScreenHeight)
  116.  
  117. do
  118.  
  119. rendertoimage Screen
  120.  
  121.  
  122. gosub _Handle_Fire_Lines
  123.  
  124.  
  125. inkmode 1+64
  126. if FireLines_status=MOde_3D
  127.  
  128. ` Change Angles for 3D Fire lines
  129. anglex#=wrapangle(anglex#,0)
  130. angley#=wrapangle(angley#,0.2)
  131. anglez#=wrapangle(anglez#,0.15)
  132.  
  133. gosub _Render_3D_Fire_Lines
  134.  
  135. else
  136. gosub _Render_2D_Fire_Lines
  137. endif
  138. inkmode 1
  139.  
  140. rendertoscreen
  141.  
  142.  
  143. BlitImageAlphaPostMultColour(Screen,0,0,RGB(200,190,190))
  144.  
  145. sync
  146. loop Spacekey()=true
  147.  
  148.  
  149.  
  150. end
  151.  
  152.  
  153.  
  154.  
  155.  
  156. _Init_Fire_lines:
  157.  
  158.  
  159. if FireLines_status=MODE_3D
  160. limit=2000
  161. FireLine_Limits_xposr=limit
  162. FireLine_Limits_xposl=FireLine_Limits_xposr*-1
  163. FireLine_Limits_yposr=limit
  164. FireLine_Limits_yposl=FireLine_Limits_yposr*-1
  165. FireLine_Limits_zposr=limit
  166. FireLine_Limits_zposl=FireLine_Limits_zposr*-1
  167. else
  168. FireLine_Limits_xposr=screenwidth
  169. FireLine_Limits_xposl=0
  170. FireLine_Limits_yposr=screenheight
  171. FireLine_Limits_yposl=0
  172. FireLine_Limits_zposr=screnwidth
  173. FireLine_Limits_zposl=0
  174. endif
  175.  
  176. ` define fire line structures.
  177.  
  178. i=0
  179.  
  180. FirelineSeg_xpos=i: inc i
  181. FirelineSeg_ypos=i: inc i
  182. FirelineSeg_zpos=i: inc i
  183. FirelineSeg_Size=i
  184.  
  185.  
  186. i=0
  187.  
  188. Fireline_PaletteNumber=i : inc i
  189.  
  190. Fireline_UpdateTimer=i : inc i
  191. Fireline_ResetTimer=i : inc i
  192.  
  193.  
  194. Fireline_Xchange=i : inc i
  195. Fireline_Ychange=i : inc i
  196. Fireline_Zchange=i : inc i
  197.  
  198. Fireline_XSpeed=i : inc i
  199. Fireline_YSpeed=i : inc i
  200. Fireline_ZSpeed=i : inc i
  201.  
  202.  
  203. Fireline_NEW_XSpeed=i : inc i
  204. Fireline_NEW_YSpeed=i : inc i
  205. Fireline_NEW_ZSpeed=i : inc i
  206.  
  207.  
  208. Fireline_SegmentHeader=i : inc i,(Numb_of_FireLinesSegments*FirelineSeg_Size)
  209. Fireline_SegmentEnd=I : inc i
  210.  
  211. Fireline_SegmentRotXHeader=i : inc i,Numb_of_FireLinesSegments
  212. Fireline_SegmentRotYHeader=i : inc i,Numb_of_FireLinesSegments
  213.  
  214.  
  215.  
  216. Fireline_StructureSize=i: inc i
  217.  
  218. if FireLines_status=MODE_2D
  219. Speed=3
  220. else
  221. Speed=16
  222. endif
  223.  
  224. dim FireLineBuffer#(Numb_of_FireLines,Fireline_StructureSize)
  225.  
  226. for Lp=0 to Numb_of_FireLines-1
  227.  
  228. FireLineBuffer#(lp,Fireline_ResetTimer) =rndrange(10,50)
  229. FireLineBuffer#(lp,Fireline_UpdateTimer) =0
  230. FireLineBuffer#(lp,Fireline_Xchange)=RndSpeed#(Speed)
  231. FireLineBuffer#(lp,Fireline_Ychange)=RndSpeed#(Speed)
  232. FireLineBuffer#(lp,Fireline_Zchange)=RndSpeed#(Speed)
  233.  
  234. o=Fireline_Segmentheader
  235.  
  236. x=random_range(FireLine_Limits_xposl,FireLine_Limits_xposr)
  237. y=random_range(FireLine_Limits_yposl,FireLine_Limits_yposr)
  238. z=random_range(FireLine_Limits_zposl,FireLine_Limits_zposr)
  239.  
  240.  
  241. for lp2=0 to Numb_of_FireLinesSegments-1
  242.  
  243. FireLineBuffer#(lp,o+FirelineSeg_xpos)=x
  244. FireLineBuffer#(lp,o+FirelineSeg_ypos)=y
  245. FireLineBuffer#(lp,o+FirelineSeg_zpos)=z
  246.  
  247. o=o+FirelineSeg_Size
  248.  
  249. next lp2
  250.  
  251. next lp
  252.  
  253. dim palettes(0,0)
  254.  
  255. gosub _Build_Palettes
  256.  
  257.  
  258. return
  259.  
  260.  
  261. ` *=----------------------------------------------------------------=*
  262. ` *=-------------------- Render 3D Fire Lines ----------------------=*
  263. ` *=----------------------------------------------------------------=*
  264. `
  265. ` This routine first rotates and projects a fire lines vertex then
  266. ` renders it to the display.
  267.  
  268.  
  269.  
  270. _Render_3D_Fire_Lines:
  271.  
  272. cx#=cos(anglex#)
  273. sx#=sin(anglex#)
  274. cy#=cos(angley#)
  275. sy#=sin(angley#)
  276. cz#=cos(anglez#)
  277. sz#=sin(anglez#)
  278.  
  279. scale#=3000+cos(ScaleAngle#)*500
  280. ScaleAngle#=wrapangle(ScaleAngle#,0.25)
  281. projection#=400
  282.  
  283.  
  284. Screen_CentX=ScreenWidth/2
  285. Screen_CentY=ScreenHeight/2
  286.  
  287.  
  288. lockbuffer
  289. For Lp=0 to Numb_of_FireLines-1
  290.  
  291. xpos=Fireline_SegmentHeader+FirelineSeg_xpos
  292. ypos=Fireline_SegmentHeader+FirelineSeg_ypos
  293. zpos=Fireline_SegmentHeader+FirelineSeg_zpos
  294.  
  295. rxpos=Fireline_SegmentRotXHeader
  296. rypos=Fireline_SegmentRotYHeader
  297.  
  298.  
  299. depth_of_header#=0
  300.  
  301. for rotatelp=0 to Numb_of_FireLinesSegments-1
  302. ` Rotate Points
  303.  
  304. y#=(cx#*FireLineBuffer#(lp,ypos))-(sx#*FireLineBuffer#(lp,zpos))
  305. z#=(cx#*FireLineBuffer#(lp,zpos))+(sx#*FireLineBuffer#(lp,ypos))
  306. x#=(cY#*Z#)-(sy#*FireLineBuffer#(lp,xpos))
  307. z#=((cy#*FireLineBuffer#(lp,xpos))+(sy#*Z#))+scale#
  308.  
  309. ` Projected this point to screen for 2d rendering
  310.  
  311. if z#=0 then z#=0.01
  312.  
  313. if rotatelp=0
  314. depth_of_header#=z#
  315. endif
  316.  
  317. FireLineBuffer#(lp,rxpos)=((((cz#*X#)-(sz#*Y#))*projection#)/z#)+Screen_CentX
  318. FireLineBuffer#(lp,rypos)=((((cz#*Y#)+(sz#*X#))*projection#)/z#)+Screen_CentY
  319.  
  320. inc rXpos
  321. inc rYpos
  322.  
  323. Xpos=Xpos+FirelineSeg_Size
  324. Ypos=Ypos+FirelineSeg_Size
  325. Zpos=Zpos+FirelineSeg_Size
  326. next rotatelp
  327.  
  328.  
  329. ` Render Fire Line
  330. xpos=Fireline_SegmentRotXHeader
  331. ypos=Fireline_SegmentRotYHeader
  332.  
  333.  
  334. LastWidth#=50
  335. if depth_of_header#>1
  336. for renderlp=0 to Numb_of_FireLinesSegments-2
  337.  
  338. NextRGB = palettes(lp,renderlp)
  339. x1=FireLineBuffer#(lp,xpos)
  340. y1=FireLineBuffer#(lp,ypos)
  341.  
  342. if renderlp=0
  343. Radius# = (200*projection#)/depth_of_header#
  344. for z=0 to 90-1 step 20
  345. circlec x1,y1,sin(z)*Radius#,true, rgbfade( NextRGB,(90-(z/0.9))*0.15)
  346. next
  347.  
  348. endif
  349.  
  350. inc Xpos
  351. inc Ypos
  352. linec x1,y1,FireLineBuffer#(lp,xpos),FireLineBuffer#(lp,ypos),NextRGB
  353.  
  354. next renderlp
  355. endif
  356.  
  357. next lp
  358. unlockbuffer
  359. Return
  360.  
  361.  
  362.  
  363.  
  364.  
  365. ` *=----------------------------------------------------------------=*
  366. ` *=---------------------- 2D Fire Lines --------------------------=*
  367. ` *=----------------------------------------------------------------=*
  368.  
  369. ` render the fire lines in 2D, so this routine ingore's the Z cords
  370. ` and renders the pure X & Y coords directly to the display..
  371.  
  372.  
  373.  
  374. _Render_2D_Fire_Lines:
  375.  
  376. For Lp=0 to Numb_of_FireLines-1
  377.  
  378. xpos=Fireline_SegmentHeader+FirelineSeg_xpos
  379. ypos=Fireline_SegmentHeader+FirelineSeg_ypos
  380.  
  381. for renderlp=0 to Numb_of_FireLinesSegments-2
  382.  
  383. ink palettes(lp,renderlp)
  384. x1=FireLineBuffer#(lp,xpos)
  385. y1=FireLineBuffer#(lp,ypos)
  386.  
  387. Xpos=Xpos+FirelineSeg_Size
  388. Ypos=Ypos+FirelineSeg_Size
  389.  
  390. line x1,y1,FireLineBuffer#(lp,xpos),FireLineBuffer#(lp,ypos)
  391.  
  392. next renderlp
  393.  
  394. next lp
  395.  
  396. Return
  397.  
  398.  
  399.  
  400. ` *=----------------------------------------------------------------=*
  401. ` *=--------------------- Handle Fire Lines ------------------------=*
  402. ` *=----------------------------------------------------------------=*
  403.  
  404.  
  405.  
  406.  
  407. _Handle_Fire_Lines:
  408.  
  409.  
  410. ` precalc the segment headers
  411. sh_xpos=Fireline_SegmentHeader+FirelineSeg_xpos
  412. sh_ypos=Fireline_SegmentHeader+FirelineSeg_ypos
  413. sh_zpos=Fireline_SegmentHeader+FirelineSeg_zpos
  414.  
  415.  
  416. ` Process the fire lines (move the head point and scroll point data)
  417. For Lp=0 to Numb_of_FireLines-1
  418.  
  419.  
  420. UpdateFrames#=FireLineBuffer#(lp,Fireline_ResetTimer)
  421.  
  422.  
  423.  
  424. if FireLineBuffer#(lp,Fireline_UpdateTimer) >UpdateFrames#
  425.  
  426. FireLineBuffer#(lp,Fireline_UpdateTimer)=0
  427. speed=16
  428. FireLineBuffer#(lp,Fireline_Xchange)=RndSpeed#(Speed)
  429. FireLineBuffer#(lp,Fireline_Ychange)=RndSpeed#(Speed)
  430. FireLineBuffer#(lp,Fireline_Zchange)=RndSpeed#(Speed)
  431.  
  432.  
  433. xchange=FireLineBuffer#(lp,FireLine_XChange)
  434. ychange=FireLineBuffer#(lp,FireLine_YChange)
  435. zchange=FireLineBuffer#(lp,FireLine_ZChange)
  436.  
  437. Speedx#=FireLineBuffer#(lp,FireLine_NEW_XSpeed)
  438. Speedy#=FireLineBuffer#(lp,FireLine_NEW_YSpeed)
  439. Speedz#=FireLineBuffer#(lp,FireLine_NEW_ZSpeed)
  440.  
  441. // old new speed , old speed
  442. FireLineBuffer#(lp,FireLine_XSpeed) = Speedx#
  443. FireLineBuffer#(lp,FireLine_YSpeed) = Speedy#
  444. FireLineBuffer#(lp,FireLine_ZSpeed) = Speedz#
  445.  
  446. FireLineBuffer#(lp,FireLine_NEW_XSpeed)=Xchange
  447. FireLineBuffer#(lp,FireLine_NEW_YSpeed)=Ychange
  448. FireLineBuffer#(lp,FireLine_NEW_ZSpeed)=Zchange
  449.  
  450. endif
  451.  
  452.  
  453. LerpScale# =FireLineBuffer#(lp,Fireline_UpdateTimer)/UpdateFrames#
  454.  
  455. FireLineBuffer#(lp,Fireline_UpdateTimer)++
  456.  
  457. ` Scroll Coords Segment Data,
  458. Doffset=Fireline_SegmentEnd-(FirelineSeg_Size)
  459. Soffset=Doffset-(FirelineSeg_Size)
  460.  
  461. for scrsegslp=0 to Numb_of_FireLinesSegments-2
  462.  
  463. FireLineBuffer#(lp,Doffset) =FireLineBuffer#(lp,Soffset)
  464. FireLineBuffer#(lp,Doffset+1) =FireLineBuffer#(lp,Soffset+1)
  465. FireLineBuffer#(lp,Doffset+2) =FireLineBuffer#(lp,Soffset+2)
  466.  
  467. Soffset =Soffset-FirelineSeg_Size
  468. Doffset =Doffset-FirelineSeg_Size
  469.  
  470. next ScrSegslp
  471.  
  472.  
  473. ` Move Header Point
  474.  
  475. oldXpos#=FireLineBuffer#(lp,sh_xpos)
  476. oldYpos#=FireLineBuffer#(lp,sh_ypos)
  477. oldZpos#=FireLineBuffer#(lp,sh_zpos)
  478.  
  479.  
  480. SpeedX# = lerp#(FireLineBuffer#(lp,FireLine_XSpeed),FireLineBuffer#(lp,FireLine_NEW_XSpeed),LerpScale#)
  481. SpeedY# = lerp#(FireLineBuffer#(lp,FireLine_YSpeed),FireLineBuffer#(lp,FireLine_NEW_YSpeed),LerpScale#)
  482. SpeedZ# = lerp#(FireLineBuffer#(lp,FireLine_ZSpeed),FireLineBuffer#(lp,FireLine_NEW_ZSpeed),LerpScale#)
  483.  
  484. Xpos#=oldXpos#+speedx# ;FireLineBuffer#(lp,FireLine_Xspeed)
  485. Ypos#=oldYpos#+speedy# ; FireLineBuffer#(lp,FireLine_Yspeed)
  486. Zpos#=oldZpos#+speedz# ;FireLineBuffer#(lp,FireLine_Zspeed)
  487.  
  488. ` rebound point if it's outside the legal movement area
  489. if xpos# > FireLine_Limits_xposr then FireLineBuffer#(lp,FireLine_Xspeed)=FireLineBuffer#(lp,FireLine_New_Xspeed)*-1: xpos#=oldXpos#
  490. if ypos# > FireLine_Limits_yposr then FireLineBuffer#(lp,FireLine_Yspeed)=FireLineBuffer#(lp,FireLine_New_Yspeed)*-1: Ypos#=oldYpos#
  491. if zpos# > FireLine_Limits_zposr then FireLineBuffer#(lp,FireLine_Zspeed)=FireLineBuffer#(lp,FireLine_New_Zspeed)*-1: Zpos#=oldZpos#
  492.  
  493. if xpos# < FireLine_Limits_xposl then FireLineBuffer#(lp,FireLine_Xspeed)=FireLineBuffer#(lp,FireLine_New_Xspeed)*-1: xpos#=oldXpos#
  494. if ypos# < FireLine_Limits_yposl then FireLineBuffer#(lp,FireLine_Yspeed)=FireLineBuffer#(lp,FireLine_New_Yspeed)*-1: ypos#=oldYpos#
  495. if zpos# < FireLine_Limits_zposl then FireLineBuffer#(lp,FireLine_Zspeed)=FireLineBuffer#(lp,FireLine_New_Zspeed)*-1: zpos#=oldZpos#
  496.  
  497.  
  498. FireLineBuffer#(lp,sh_xpos)=xpos#
  499. FireLineBuffer#(lp,sh_ypos)=ypos#
  500. FireLineBuffer#(lp,sh_zpos)=zpos#
  501.  
  502.  
  503. next Lp
  504. return
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511. ` *=----------------------------------------------------------------=*
  512. ` *=---------------------- Build Palettes --------------------------=*
  513. ` *=----------------------------------------------------------------=*
  514.  
  515. ` Palette spread ='s 255,255,255 towards RANDOM COLOUR towards BLACK
  516.  
  517.  
  518. _Build_Palettes:
  519.  
  520. dim palettes(Numb_of_FireLines,Numb_of_FireLinesSegments)
  521.  
  522. _mid=8
  523. Theend=Numb_of_FireLinesSegments
  524. lockbuffer
  525. for palettelp=0 to Numb_of_FireLines-1
  526.  
  527. ` create fire line main colour
  528. mr#=rnd(255)
  529. mg#=rnd(255)
  530. mb#=rnd(255)
  531.  
  532. ` Interpolate palette WHITE to FIRE LINES COLOUR
  533.  
  534. ; r1#=255: g1#=255: b1#=255
  535. r2#=mr#: g2#=mg#: b2#=mb#
  536. ; _int_colours(palettelp,0,_mid,r1#,g1#,b1#,r2#,g2#,b2#)
  537.  
  538.  
  539. ; gouraudstriph 0,$ffffff,_mid,rgb(mr#,mg#,mb#),0
  540. ` Interpolate FIRE LINES COLOUR to BLACK
  541.  
  542. r1#=mr#: g1#=mg#: b1#=mb#
  543. r2#=0: g2#=0: b2#=0
  544. ; _int_colours(palettelp,_mid,theend,r1#,g1#,b1#,r2#,g2#,b2#)
  545. _int_colours(palettelp, 0,theend,r1#,g1#,b1#,r2#,g2#,b2#)
  546.  
  547. next palettelp
  548. unlockbuffer
  549. return
  550.  
  551.  
  552. function _int_colours(l,p1,p2,r1#,g1#,b1#,r2#,g2#,b2#)
  553.  
  554. dp#=p2-p1
  555.  
  556. dr#=r2#-r1#
  557. dg#=g2#-g1#
  558. db#=b2#-b1#
  559.  
  560. gr#=dr#/dp#
  561. gg#=dg#/dp#
  562. gb#=db#/dp#
  563.  
  564. for lp=p1 to p2-1
  565. c=rgb(r1#,g1#,b1#)
  566. palettes(l,lp)=c
  567. r1#=r1#+gr#
  568. g1#=g1#+gg#
  569. b1#=b1#+gb#
  570. dotc lp,l,c
  571. next lp
  572. c=rgb(r1#,g1#,b1#)
  573. palettes(l,lp)=c
  574.  
  575. endfunction
  576.  
  577.  
  578. function random_range(bot,top)
  579. if bot>top
  580. b=top:t=bot
  581. else
  582. b=bot:t=top
  583. endif
  584. d=top-bot
  585. result=bot+(rnd(d))
  586. endfunction result
  587.  
  588.  
  589.  
  590. Function Lerp#(Src#,Dest#,Scale#)
  591. Result#=Src#+((Dest#-src#)*Scale#)
  592. EndFunction Result#
  593.  
  594.  
  595.  
  596.  
  597. Function RndSpeed#(ThisRange)
  598. repeat
  599. result#=rndrange#(-ThisRange,ThisRange)
  600. until result#
  601. EndFunction Result#
  602.  
  603.  
  604.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement