November 25, 2020, 08:18:21 AM

Author Topic: [bb] "Twirly" special FX demo by big10p [ 1+ years ago ]  (Read 663 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] "Twirly" special FX demo by big10p [ 1+ years ago ]
« on: June 29, 2017, 12:28:42 AM »
Title : "Twirly" special FX demo
Author : big10p
Posted : 1+ years ago

Description : This was a special FX entity system I was working on about a year ago before I gave up on it after realizing that overlaying lots of blended layers on top of each other wasn't such a great idea (speed wise).

Anyway, I guess 'Twirlies' could still be used for certain things, like making a pretty screensaver, or something. They're pretty much infinately configurable as each can have it's own user defined CLUT which can be cycled etc.


Code :
Code: BlitzBasic
  1. ;
  2. ; Twirly Special FX demo by big10p (A.K.A. Chris Chadwick) 2003
  3. ;
  4.  
  5.  
  6.         Graphics3D 800,600,32
  7.         SetBuffer BackBuffer()
  8.  
  9.         WireFrame 0
  10.         AntiAlias 0
  11.  
  12.         SeedRnd MilliSecs()
  13.  
  14.         Type twirly_layerT
  15.                 Field ent                       ; Layer star mesh entity.
  16.                 Field rot#                      ; Amount to rotate layer each update.
  17.                 Field clut_i%           ; Index of layer's CLUT colour.
  18.         End Type
  19.        
  20.         Type twirlyT
  21.                 Field tx#,ty#           ; Demo-specific 2D twirly movement amounts.
  22.                
  23.                 Field piv                       ; Control pivot - all layers are attached to this.
  24.                 Field hidden%           ; Bool flag to indicate if Twirly is hidden.
  25.                 Field layer_bank        ; Bank holding Handle() IDs of all layers.
  26.                 Field num_layers%       ; Total number of Twirly layers.
  27.                 Field clut%                     ; clut_banks() index of Twirly's CLUT.
  28.                 Field max_clut_i%       ; Bank index of last colour (RGB set) in CLUT.
  29.                 Field clut_cycle%       ; CLUT cycle control. - left, 0 no cycle, + right.
  30.                 Field cycle_count%      ; Count down to next CLUT cycle.
  31.         End Type
  32.  
  33.         ; Create 2 starfield planes.
  34.         Global tex1 = CreateTexture(128,128,4)
  35.         make_tex(tex1)
  36.         plane1 = CreatePlane()
  37.         RotateEntity plane1,-90,0,0
  38.         PositionEntity plane1,0,0,10
  39.         EntityTexture plane1,tex1
  40.         Global tex2 = CreateTexture(128,128,4)
  41.         make_tex(tex2)
  42.         plane2 = CreatePlane()
  43.         RotateEntity plane2,-90,0,0
  44.         PositionEntity plane2,0,0,11
  45.         EntityTexture plane2,tex2
  46.        
  47.         Global frame_count%
  48.         Global fps%
  49.         Global slowest_fps%
  50.         Global fps_timeout%
  51.         Global frame_time%
  52.         Global slowest_frame%
  53.         Global frame_start%
  54.         fps_timer = CreateTimer(60)
  55.         slowmo% = False
  56.         wiref% = False
  57.                
  58.         Global cam = CreateCamera()
  59.         PositionEntity cam,0,0,-20
  60.         CameraZoom cam,1.4
  61.        
  62.         light = CreateLight()  
  63.        
  64.         Const END_OF_CLUT% = -1
  65.         Const END_OF_CLUT_LIST% = -2
  66.         Const MAX_CLUTS% = 100
  67.         Global num_cluts% = 0
  68.        
  69.         Dim clut_banks(MAX_CLUTS-1)
  70.         open_twirly()
  71.         copy_clut_grad(1,5)
  72.  
  73.         ; Create some twirlies.
  74.         For n = 1 To 3
  75.                 tw1.twirlyT = create_preset_twirly(n)
  76.                 PositionEntity tw1piv,Rnd(-5,5),Rnd(-5,5),-10  
  77.         Next
  78.        
  79.         vp1# = 1 : vp2# = 1
  80.                
  81.        
  82.         ; --- Main loop ---
  83.        
  84.         While Not KeyHit(1)
  85.  
  86.                 frame_start = MilliSecs()
  87.  
  88.                 If KeyHit(28) Then slowmo = Not slowmo
  89.                 If KeyHit(14) Then wiref = Not wiref : WireFrame wiref
  90.  
  91.                 For this.twirlyT = Each twirlyT
  92.                         CameraProject cam,EntityX(thispiv),EntityY(thispiv),EntityZ(thispiv)
  93.                         If ProjectedX() > 800 Or ProjectedX() < 0 Then this     x=-this x
  94.                         If ProjectedY() > 600 Or ProjectedY() < 0 Then this     y=-this y
  95.                         TranslateEntity thispiv,this    x,this  y,0
  96.                 Next
  97.                
  98.                 vp1 = vp1 - 0.003
  99.                 vp2 = vp2 - 0.001
  100.                 PositionTexture tex1,1,vp1
  101.                 PositionTexture tex2,1,vp2
  102.                
  103.                 update_twirly()
  104.                 RenderWorld
  105.                 ;show_info()
  106.                 ;show_clut(10,80)
  107.  
  108.                 frame_time = MilliSecs() - frame_start 
  109.                
  110.                 WaitTimer(fps_timer)
  111.                 Flip(1)
  112.  
  113.                 If slowmo Then Delay 200
  114.         Wend
  115.  
  116.         close_twirly()
  117.         ClearWorld     
  118.  
  119.         End
  120.  
  121.  
  122. ; The Twirly CLUTS, defined in RGB sets.
  123. .twirly_clut_data
  124.  
  125. Data 255,0,0
  126. Data 0,255,0
  127. Data 0,0,255
  128. Data END_OF_CLUT
  129.  
  130. Data 255,255,0
  131. Data 0,255,0
  132. Data 0,255,255
  133. Data 0,0,255
  134. Data 255,0,255
  135. Data 255,0,0
  136. Data END_OF_CLUT
  137.  
  138. Data END_OF_CLUT_LIST
  139.  
  140.  
  141. ;
  142. ; Draws random coloured starfield onto text.
  143. ;
  144. Function make_tex(tex)
  145.  
  146.         SetBuffer TextureBuffer(tex)
  147.  
  148.         For y = 0 To 127
  149.                 For x = 0 To 127
  150.                         WritePixel x,y,$00000000
  151.                 Next
  152.         Next
  153.         Color 255,255,255
  154.  
  155.         For n = 1 To 200
  156.                 r = Rand(0,255) Shl 16
  157.                 g = Rand(0,255) Shl 8
  158.                 b = Rand(0,255)
  159.                 WritePixel Rand(0,127),Rand(0,127),$ff000000 Or (r Or g Or b)
  160.         Next
  161.         ScaleTexture tex,30,30
  162.         SetBuffer BackBuffer()
  163.        
  164. End Function
  165.  
  166.  
  167. ;
  168. ; Prepares the Twirly system ready for use.
  169. ;
  170. Function open_twirly()
  171.  
  172.         Local r%,g%,b%
  173.         Local clut_size%[MAX_CLUTS-1]
  174.         Local cs% = 0
  175.                
  176.         ; Count CLUT entries and size.
  177.         Restore twirly_clut_data
  178.         Repeat
  179.                 Read r
  180.                 If r = END_OF_CLUT
  181.                         clut_size[num_cluts] = cs
  182.                         num_cluts = num_cluts + 1
  183.                         cs = 0
  184.                        
  185.                         Read r : If r = END_OF_CLUT_LIST Then Exit
  186.                 EndIf
  187.                 Read g
  188.                 Read b
  189.                
  190.                 cs = cs + 1
  191.         Forever
  192.        
  193.         ; Create CLUT banks.
  194.         Restore twirly_clut_data
  195.         For i = 0 To num_cluts-1
  196.                 clut_banks(i) = CreateBank((clut_size[i]*3)*4)
  197.        
  198.                 For n = 0 To BankSize(clut_banks(i))-1 Step 12
  199.                         Read r,g,b
  200.                         PokeInt clut_banks(i),n,r
  201.                         PokeInt clut_banks(i),n+4,g
  202.                         PokeInt clut_banks(i),n+8,b
  203.                 Next
  204.                
  205.                 Read dummy      ; Skip END_OF_CLUT terminator.
  206.         Next
  207.        
  208. End Function
  209.  
  210.  
  211. ;
  212. ; Closes down the Twirly system, freeing all resources.
  213. ;
  214. Function close_twirly()
  215.  
  216.         ; Kill all Twirlies.
  217.         For this.twirlyT = Each twirlyT
  218.                 free_twirly(this)
  219.         Next
  220.  
  221.         ; Free the CLUT banks.
  222.         For i = 0 To num_cluts-1
  223.                 FreeBank clut_banks(i)
  224.         Next
  225.        
  226. End Function
  227.  
  228.  
  229. ;
  230. ; Frees all resources used by a given twirly.
  231. ;
  232. ; Params:
  233. ; twirly - The twirly to be freed.
  234. ;
  235. Function free_twirly(twirly.twirlyT)
  236.  
  237.         ; Free all Twirly layer resources.
  238.         For n = 0 To BankSize(twirlylayer_bank)-1 Step 4
  239.                 layer.twirly_layerT = Object.twirly_layerT(PeekInt(twirlylayer_bank,n))
  240.                 FreeEntity layerent
  241.                 Delete layer   
  242.         Next
  243.        
  244.         ; Free actual Twirly resources.
  245.         FreeEntity twirlypiv
  246.         FreeBank layer_bank
  247.         Delete twirly
  248.        
  249. End Function
  250.  
  251.  
  252. ;
  253. ; Creates a single layer twirly. See create_star_mesh() for params.
  254. ;      
  255. Function create_twirly.twirlyT(radius#,points%,indent#,ratio%=True)
  256.        
  257.         twirly.twirlyT = New twirlyT
  258.         twirlypiv = CreatePivot()
  259.         RotateEntity twirlypiv,0,180,0  ; So we can point twirly at camera.
  260.         twirly
  261. um_layers = 1
  262.         twirlyhidden = False
  263.  
  264.         twirly  x = Rnd(.01,.03) : If Rand(0,1) Then twirly     x = -twirly     x
  265.         twirly  y = Rnd(.01,.03) : If Rand(0,1) Then twirly     y = -twirly     y
  266.        
  267.         layer.twirly_layerT = New twirly_layerT
  268.         twirlylayer_bank = CreateBank(4)
  269.         PokeInt twirlylayer_bank,0,Handle(layer)
  270.        
  271.         ; Create initial twirly layer.
  272.         layerent = create_star_mesh(radius,points,indent,ratio)
  273.         EntityParent layerent,twirlypiv
  274.         PositionEntity layerent,0,0,0,0
  275.         EntityFX layerent,1+4+8
  276.  
  277.         Return twirly
  278.  
  279. End Function
  280.  
  281.  
  282. ;
  283. ; Adds a layer to the specified, existing twirly.
  284. ; See create_star_mesh() for other params.
  285. ;
  286. Function add_twirly_layer(twirly.twirlyT,radius#,points%,indent#,ratio%=True)
  287.  
  288.         layer.twirly_layerT = New twirly_layerT
  289.         bs = BankSize(twirlylayer_bank)
  290.         ResizeBank twirlylayer_bank,bs+4
  291.         PokeInt twirlylayer_bank,bs,Handle(layer)
  292.        
  293.         ; Create twirly layer.
  294.         layerent = create_star_mesh(radius,points,indent,ratio)
  295.         PositionEntity layerent,0,0,Float(twirly
  296. um_layers)*0.001
  297.         EntityParent layerent,twirlypiv,1
  298.  
  299.         twirly
  300. um_layers = twirly
  301. um_layers + 1
  302.         EntityFX layerent,1+4+8
  303.  
  304. End Function
  305.  
  306.  
  307. ;
  308. ; Sequentially 'paints' all layers of a twirly with the given CLUT.
  309. ;
  310. ; Params:
  311. ; twirly - Twirly to be coloured with the specified CLUT.
  312. ; clut   - Number of CLUT to colour twirly with.
  313. ; cycle  - Specifies how to cycle the CLUT every time the twirly is updated:
  314. ;          0 (default) to not cycle the CLUT.
  315. ;          -1 to cycle the CLUT to the left.
  316. ;          1 to cycle the CLUT to the right.
  317. ; dir    - Direction to colour the twirly layers with:
  318. ;          0 (default) to colour layers from first-to-last.
  319. ;          1 to colour layers from last-to-first.
  320. ;
  321. Function set_twirly_clut(twirly.twirlyT,clut%,cycle%=0,dir%=0)
  322.  
  323.         clut_i% = 0
  324.         clut_size% = BankSize(clut_banks(clut))
  325.         cb = clut_banks(clut)
  326.        
  327.         If dir = 0
  328.                 For n = 0 To twirly
  329. um_layers-1
  330.                         id = PeekInt(twirlylayer_bank,n*4)
  331.                         layer.twirly_layerT = Object.twirly_layerT(id)
  332.                         layerclut_i = clut_i
  333.                         EntityColor layerent,PeekInt(cb,clut_i),PeekInt(cb,clut_i+4),PeekInt(cb,clut_i+8)
  334.                         clut_i = clut_i + 12
  335.                         If clut_i = clut_size Then clut_i = 0
  336.                 Next   
  337.         Else
  338.                 For n = twirly
  339. um_layers-1 To 0 Step -1
  340.                         id = PeekInt(twirlylayer_bank,n*4)
  341.                         layer.twirly_layerT = Object.twirly_layerT(id)
  342.                         layerclut_i = clut_i
  343.                         EntityColor layerent,PeekInt(cb,clut_i),PeekInt(cb,clut_i+4),PeekInt(cb,clut_i+8)
  344.                         clut_i = clut_i + 12
  345.                         If clut_i = clut_size Then clut_i = 0
  346.                 Next   
  347.         EndIf
  348.        
  349.         twirlyclut = clut
  350.         twirlyclut_cycle = cycle
  351.         twirlycycle_count = Abs(cycle)
  352.         twirlymax_clut_i = clut_size-12
  353.        
  354. End Function
  355.  
  356.  
  357. ;
  358. ; Sets all layers of a twirly to use a given blend mode.
  359. ;
  360. Function set_twirly_blend(twirly.twirlyT,mode%)
  361.  
  362.         For n = 0 To BankSize(twirlylayer_bank)-1 Step 4
  363.                 layer.twirly_layerT = Object.twirly_layerT(PeekInt(twirlylayer_bank,n))
  364.                 EntityBlend layerent,mode
  365.         Next
  366.        
  367. End Function
  368.  
  369.  
  370. ;
  371. ; Sets all layers of a twirly to use a given alpha level.
  372. ;
  373. Function set_twirly_alpha(twirly.twirlyT,alpha#)
  374.  
  375.         For n = 0 To BankSize(twirlylayer_bank)-1 Step 4
  376.                 layer.twirly_layerT = Object.twirly_layerT(PeekInt(twirlylayer_bank,n))
  377.                 EntityAlpha layerent,alpha
  378.         Next
  379.        
  380. End Function
  381.  
  382.  
  383. ;
  384. ; Creates a copy of an existing CLUT with gradients between each colour.
  385. ;
  386. ; Params:
  387. ; clut   - Number of CLUT to be copied.
  388. ; grads  - Number of gradients to insert between each colour.
  389. ; grad_r - Each colour from the copied CLUT is faded to this colour.
  390. ; grad_g   If not specified (default), colours fade to the next colour
  391. ; grad_b   from the CLUT being copied.
  392. ;
  393. ; Returns:
  394. ; Index of new clut in clut_banks() array.
  395. ;
  396. Function copy_clut_grad(clut%,grads%,grad_r#=-1,grad_g#=-1,grad_b#=-1)
  397.  
  398.         old_clut = clut_banks(clut)
  399.         old_size = BankSize(clut_banks(clut))
  400.  
  401.         new_clut = CreateBank(old_size*(grads+1))
  402.         clut_banks(num_cluts) = new_clut
  403.         num_cluts = num_cluts + 1
  404.        
  405.         poke_i = 0
  406.        
  407.         If grad_r=-1 Or grads=0
  408.                 ; Create gradients between adjacent colours from the copied CLUT.
  409.  
  410.                 grad_div = grads + 1
  411.                
  412.                 For i = 0 To old_size-1 Step 12
  413.                         r1# = Float(PeekInt(old_clut,i))
  414.                         g1# = Float(PeekInt(old_clut,i+4))
  415.                         b1# = Float(PeekInt(old_clut,i+8))
  416.        
  417.                         ; Get colour to fade to.
  418.                         If i = old_size-12
  419.                                 ; Wraparound to first colour.
  420.                                 r2# = Float(PeekInt(old_clut,0))
  421.                                 g2# = Float(PeekInt(old_clut,4))
  422.                                 b2# = Float(PeekInt(old_clut,8))
  423.                         Else
  424.                                 ; Use next colour in CLUT.
  425.                                 r2# = Float(PeekInt(old_clut,i+12))
  426.                                 g2# = Float(PeekInt(old_clut,i+12+4))
  427.                                 b2# = Float(PeekInt(old_clut,i+12+8))
  428.                         EndIf
  429.                                        
  430.                         r_step# = (r2-r1)/grad_div
  431.                         g_step# = (g2-g1)/grad_div
  432.                         b_step# = (b2-b1)/grad_div
  433.                        
  434.                         ; Add original colour and gradients to new CLUT.
  435.                         For n = 0 To grads
  436.                                 PokeInt new_clut,poke_i,  Int(r1 + (n*r_step))
  437.                                 PokeInt new_clut,poke_i+4,Int(g1 + (n*g_step))
  438.                                 PokeInt new_clut,poke_i+8,Int(b1 + (n*b_step))
  439.                                 poke_i = poke_i + 12
  440.                         Next
  441.                 Next
  442.         Else
  443.                 ; Create gradients from copied CLUT colour to grad_r,grad_g,grad_b.
  444.                
  445.                 For i = 0 To old_size-1 Step 12
  446.                         r1# = Float(PeekInt(old_clut,i))
  447.                         g1# = Float(PeekInt(old_clut,i+4))
  448.                         b1# = Float(PeekInt(old_clut,i+8))
  449.                
  450.                         r_step# = (grad_r-r1)/grads
  451.                         g_step# = (grad_g-g1)/grads
  452.                         b_step# = (grad_b-b1)/grads
  453.                        
  454.                         ; Add original colour and gradients to new CLUT.
  455.                         For n = 0 To grads
  456.                                 PokeInt new_clut,poke_i,  Int(r1 + (n*r_step))
  457.                                 PokeInt new_clut,poke_i+4,Int(g1 + (n*g_step))
  458.                                 PokeInt new_clut,poke_i+8,Int(b1 + (n*b_step))
  459.                                 poke_i = poke_i + 12
  460.                         Next
  461.                 Next   
  462.         EndIf
  463.        
  464.         Return num_cluts - 1
  465.                        
  466. End Function
  467.  
  468.  
  469. ;
  470. ; Updates ALL non-hidden Twirlies.
  471. ;
  472. Function update_twirly()
  473.  
  474.         For this.twirlyT = Each twirlyT
  475.                 If Not thishidden      
  476.                         PointEntity thispiv,cam
  477.                         cb = clut_banks(thisclut)
  478.        
  479.                         ; Twirly's CLUT cycle frequency management.
  480.                         do_cycle = False
  481.                         If thisclut_cycle
  482.                                 thiscycle_count = thiscycle_count - 1
  483.                                 If thiscycle_count = 0
  484.                                         thiscycle_count = Abs(thisclut_cycle)
  485.                                         do_cycle = True
  486.                                 EndIf
  487.                         EndIf
  488.                        
  489.                         If do_cycle
  490.                                 ; Update each layer attached to this twirly, cycling the CLUT.
  491.                                 For n = 0 To BankSize(thislayer_bank)-1 Step 4
  492.                                         layer.twirly_layerT = Object.twirly_layerT(PeekInt(thislayer_bank,n))
  493.                                         TurnEntity layerent,0,0,layer
  494. ot
  495.                        
  496.                                         If thisclut_cycle < 0
  497.                                                 ; Cycle CLUT to the left.
  498.                                                 clut_i = layerclut_i + 12
  499.                                                 If clut_i > thismax_clut_i Then clut_i = 0
  500.                                         Else
  501.                                                 ; Cycle CLUT to the right.
  502.                                                 clut_i = layerclut_i - 12
  503.                                                 If clut_i < 0 Then clut_i = thismax_clut_i
  504.                                         EndIf
  505.                
  506.                                         layerclut_i = clut_i
  507.                                         EntityColor layerent,PeekInt(cb,clut_i),PeekInt(cb,clut_i+4),PeekInt(cb,clut_i+8)
  508.                                 Next
  509.                         Else
  510.                                 ; Update each layer attached to this twirly.
  511.                                 For n = 0 To BankSize(thislayer_bank)-1 Step 4
  512.                                         layer.twirly_layerT = Object.twirly_layerT(PeekInt(thislayer_bank,n))
  513.                                         TurnEntity layerent,0,0,layer
  514. ot                     
  515.                                 Next
  516.                         EndIf
  517.  
  518.                 End If
  519.         Next
  520.                
  521. End Function
  522.  
  523.  
  524. ;
  525. ; Creates a planar, star-shaped mesh.
  526. ;
  527. ; Params:
  528. ; radius - Radius of star in world units.
  529. ; points - Number of points the star should have.
  530. ; indent - Sets the 'depth' of the indent between the points of the star.
  531. ; ratio  - True (default) to indicate that indent is a ratio of the radius
  532. ;          e.g. 1=no indent (circle), .5=indent midway between point and centre.
  533. ;          False to indicate that indent is an absolute size.
  534. ;
  535. ; Returns:
  536. ; The newly created star mesh.
  537. ;
  538. Function create_star_mesh(radius#=1.0,points%=5,indent#=0.5,ratio%=True)
  539.  
  540.         If ratio Then indent = radius * indent  ; Convert indent to ratio of radius.
  541.  
  542.         mesh = CreateMesh()
  543.         surf = CreateSurface(mesh)
  544.        
  545.         verts% = points * 2
  546.         vang# = 0
  547.         vang_step# = 360.0/Float(verts)
  548.  
  549.         ; Add verts for all star points & indents.
  550.         For n = 0 To verts-1
  551.  
  552.                 If (n And 1) Then size# = indent Else size# = radius
  553.  
  554.                 AddVertex(surf,Cos(vang)*size,Sin(vang)*size,0)
  555.                 VertexNormal surf,n,0,0,-1     
  556.  
  557.                 vang = vang + vang_step
  558.         Next   
  559.  
  560.         ; Add centre vert.
  561.         AddVertex(surf,0,0,0)
  562.         VertexNormal surf,verts,0,0,-1
  563.        
  564.         ; Make triangles.
  565.         For n = 0 To verts-2
  566.                 AddTriangle surf,n,verts,n+1
  567.         Next
  568.         AddTriangle surf,verts-1,verts,0
  569.  
  570.         Return mesh
  571.        
  572. End Function
  573.  
  574.  
  575. ;
  576. ; Creates a twirly_type preset twirly.
  577. ;
  578. Function create_preset_twirly.twirlyT(twirly_type%)
  579.  
  580.         Select twirly_type
  581.                 Case 1
  582.                         dir#=.01
  583.                         For n = 1 To 30
  584.                                 If n=1
  585.                                         tw.twirlyT = create_twirly(n*.01,10,.2)
  586.                                 Else
  587.                                         add_twirly_layer(tw,n*.1,10,.1)
  588.                                 EndIf
  589.                                 set_layer_rotate(tw,n-1,dir*n)
  590.                         Next
  591.                         set_twirly_clut(tw,2,2,1)
  592.                         set_twirly_blend(tw,3)
  593.                         set_twirly_alpha(tw,.2)
  594.                         Return tw
  595.                 Case 2
  596.                         dir#=.01
  597.                         For n = 1 To 30
  598.                                 If n=1
  599.                                         tw.twirlyT = create_twirly(n*.01,5,.2)
  600.                                 Else
  601.                                         add_twirly_layer(tw,n*.1,10,.3)
  602.                                 EndIf
  603.                                 set_layer_rotate(tw,n-1,dir*n)
  604.                                 dir = -dir
  605.                         Next
  606.                         set_twirly_clut(tw,2,2,1)
  607.                         set_twirly_blend(tw,3)
  608.                         set_twirly_alpha(tw,.2)
  609.                         Return tw
  610.                 Case 3
  611.                         dir#=.01
  612.                         For n = 1 To 30
  613.                                 If n=1
  614.                                         tw.twirlyT = create_twirly(n*.01,5,.2)
  615.                                 Else
  616.                                         add_twirly_layer(tw,n*.1,5,.3)
  617.                                 EndIf
  618.                                 set_layer_rotate(tw,n-1,dir*n)
  619.                         Next
  620.                         set_twirly_clut(tw,2,2,1)
  621.                         set_twirly_blend(tw,3)
  622.                         set_twirly_alpha(tw,.2)
  623.                         Return tw
  624.         End Select             
  625.        
  626. End Function
  627.  
  628.  
  629. ;
  630. ; Hides a Twirly from view. Ignores if Twirly is already hidden.
  631. ;
  632. ; Params:
  633. ; twirly - The Twirly to hide from view.
  634. ;
  635. Function hide_twirly(twirly.twirlyT)
  636.  
  637.         If twirlyhidden = False
  638.                 HideEntity twirlypiv
  639.                 twirlyhidden = True
  640.         End If
  641.        
  642. End Function
  643.  
  644.  
  645. ;
  646. ; Makes a hidden Twirly visible. Ignores if Twirly is already visible.
  647. ;
  648. ; Params:
  649. ; twirly - The hidden Twirly to make visible.
  650. ;
  651. Function show_twirly(twirly.twirlyT)
  652.  
  653.         If twirlyhidden = True
  654.                 ShowEntity twirlypiv
  655.                 twirlyhidden = False
  656.         End If
  657.        
  658. End Function
  659.  
  660.  
  661. ;
  662. ; Sets a given twirly layer to an absolute rotation.
  663. ;
  664. Function rotate_twirly_layer(twirly.twirlyT,layer%,rot#)
  665.  
  666.         star.twirly_layerT = Object.twirly_layerT(PeekInt(twirlylayer_bank,layer*4))
  667.         RotateEntity starent,0,0,rot,1
  668.  
  669. End Function
  670.  
  671.  
  672. ;
  673. ; Sets how much a given twirly layer should rotate by every update.
  674. ;
  675. Function set_layer_rotate(twirly.twirlyT,layer%,rot#)
  676.  
  677.         star.twirly_layerT = Object.twirly_layerT(PeekInt(twirlylayer_bank,layer*4))
  678.         star
  679. ot = rot
  680.  
  681. End Function
  682.  
  683.  
  684. ;
  685. ; Debug function to visually display CLUT(s).
  686. ;
  687. ; Params:
  688. ; cx   - Screen X coord to display CLUT at.
  689. ; cy   - Screen Y coord to display CLUT at.
  690. ; clut - Number of CLUT to display.
  691. ;        If not specified (default) then all CLUTS are displayed.
  692. ;
  693. Function show_clut(cx%=0,cy%=0,clut%=-1)
  694.  
  695.         Local cxs = cx
  696.         Local cw = 10
  697.         Local ch = 10
  698.         Local gap = 0
  699.        
  700.         If clut = -1
  701.                 first_clut = 0
  702.                 last_clut = num_cluts - 1
  703.         Else
  704.                 first_clut = clut
  705.                 last_clut = clut
  706.         EndIf
  707.                
  708.         For n = first_clut To last_clut
  709.                 clut = clut_banks(n)
  710.                
  711.                 For j = 0 To BankSize(clut)-1 Step 12
  712.                         r = PeekInt(clut,j)
  713.                         g = PeekInt(clut,j+4)
  714.                         b = PeekInt(clut,j+8)
  715.                         Color r,g,b
  716.                         Rect cx,cy,cw,ch,1
  717.                         cx = cx + cw + gap
  718.                         If (cx+cw-1)>=GraphicsWidth() Then cx=cxs:cy=cy+ch+gap
  719.                 Next
  720.        
  721.                 cx = cxs
  722.                 cy = cy + ch + 4
  723.         Next
  724.  
  725.         Color 255,255,255
  726.        
  727. End Function
  728.  
  729.  
  730. ;
  731. ; Display debug info.
  732. ;
  733. Function show_info()
  734.        
  735.         If fps_timeout
  736.                 frame_count = frame_count + 1
  737.  
  738.                 If MilliSecs() > fps_timeout Then
  739.                         fps_timeout = MilliSecs() + 1000
  740.                         fps = frame_count
  741.                         frame_count = 0
  742.                
  743.                         If fps < slowest_fps Or slowest_fps = 0 Then slowest_fps = fps
  744.                 EndIf
  745.                
  746.                 If frame_time > slowest_frame Then slowest_frame = frame_time
  747.                
  748.                 Color 0,255,0
  749.                 Text 10,10," Triangles: " + TrisRendered()
  750.                 Color 255,255,0
  751.                 Text 10,25," Millisecs: " + frame_time
  752.                 Text 10,40,"   Slowest: " + slowest_frame
  753.                 Color 0,255,255
  754.                 Text 10,55,"       FPS: " + fps
  755.                 Text 10,70,"     Worst: " + slowest_fps
  756.                 Color 255,255,255
  757.         Else
  758.                 ; First call initialization.
  759.                 fps_timeout = MilliSecs() + 1000
  760.         EndIf
  761.        
  762. End Function


Comments :


Clyde(Posted 1+ years ago)

 Wicked stuff there mate!


Rook Zimbabwe(Posted 1+ years ago)

 This has to be the coolest thing!


big10p(Posted 1+ years ago)

 Crikey, this is an old one. Glad you like it, though. :)


Yo! Wazzup?(Posted 1+ years ago)

 Oooohhhhh... pretty lights...


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal