9

« **on:** September 23, 2017 »
Trying to mimic a screen saver I've seen on mac. Looks like beams, but it's particles following moving cubic Bezier curves.

`import "ifx.lib"`

import "Speed.lib"

constant:

W 800

H 600

HW# 400.0

HH# 300.0

visible:

curves?[6]

particles?[500]

hidden:

randomize 3

create image 1, 31, 31

set image 1

set color 0, 0, 0

cls

for y = 0 to 30;

dy# = float(y - 15)

dysqr# = dy*dy

for x = 0 to 30

dx# = float(x - 15)

d# = sqr(dx*dx + dysqr)

if d < 15.0

c = int(32.0*(1.0 - d/15.0))

set color c, c, c

set pixel x, y

endif

next

next

set image primary

set window (screenw() - W)/2, (screenh() - H)/2, W, H

set redraw off

if not IFX_Init() then end

for i = 0 to sizeof(curves) - 1

_InitCurve curves[i]

next

for i = 0 to sizeof(particles) - 1

particles[i].c = -1

next

tick = 0

do

tick = tick + 1

for i = 0 to sizeof(curves) - 1

_UpdateCurve curves[i]

if tick%6 = i

_AddParticle i

endif

next

last = sizeof(particles) - 1

for i = 0 to last

if particles[i].c >= 0

particles[i].p# = particles[i].p# + 0.00225

if particles[i].p# > 1.0

particles[i].c = -1

endif

endif

next

set color 0, 0, 0, 16; cls

_IFX_Blur 16

_DrawParticles

redraw

_SPD_HoldFrame 60

until keydown(27, true)

procedure InitCurve(&curve?)

curve.x0# = HW

curve.y0# = HH

curve.d1# = 100.0 + float(rnd(300))

curve.a1# = float(rnd(360))

curve.x1# = HW + cos(curve.a1#)*curve.d1#

curve.y1# = HH + sin(curve.a1#)*curve.d1#

curve.s1# = float(rnd(100) - 50)*0.02

curve.d2# = 300.0 + float(rnd(300))

curve.a2# = float(rnd(360))

curve.x2# = HW + cos(curve.a2#)*curve.d2#

curve.y2# = HH + sin(curve.a2#)*curve.d2#

curve.s2# = float(rnd(100) - 50)*0.02

curve.d3# = 300.0 + float(rnd(300))

curve.a3# = float(rnd(360))

curve.x3# = HW + cos(curve.a3#)*curve.d3#

curve.y3# = HH + sin(curve.a3#)*curve.d3#

curve.s3# = float(rnd(100) - 50)*0.02

endproc

procedure UpdateCurve(&curve?)

curve.a1# = curve.a1# + curve.s1#

curve.x1# = HW + cos(curve.a1#)*curve.d1#

curve.y1# = HH + sin(curve.a1#)*curve.d1#

curve.a2# = curve.a2# + curve.s2#

curve.x2# = HW + cos(curve.a2#)*curve.d2#

curve.y2# = HH + sin(curve.a2#)*curve.d2#

curve.a3# = curve.a3# + curve.s3#

curve.x3# = HW + cos(curve.a3#)*curve.d3#

curve.y3# = HH + sin(curve.a3#)*curve.d3#

endproc

procedure EvaluateCurve(&curve?, p#, &x#, &y#)

ip# = 1.0 - p

a# = ip*ip*ip

b# = 3.0*ip*ip*p

c# = 3.0*ip*p*p

d# = p*p*p

x = a*curve.x0# + b*curve.x1# + c*curve.x2# + d*curve.x3#

y = a*curve.y0# + b*curve.y1# + c*curve.y2# + d*curve.y3#

endproc

' debug.

procedure PlotCurve(&curve?, points)

step# = 1.0/float(points)

p# = 0.0

x#; y#

for i = 0 to points - 1

_EvaluateCurve curve, p, x, y

set pixel int(x), int(y)

p = p + step

next

endproc

procedure AddParticle(index)

last = sizeof(particles) -1

for i = 0 to last

if particles[i].c < 0 then break

next

if i <= last

particles[i].c = index

particles[i].p# = 0.0

endif

endproc

procedure DrawParticles()

last = sizeof(particles) - 1

set additive true

for i = 0 to last

if particles[i].c >= 0

alpha = int((1.0 - particles[i].p#)*255.0)

set color 64, 128, 255, alpha

x#; y#

_EvaluateCurve curves[particles[i].c], particles[i].p#, x, y

'draw pixel int(x), int(y)

draw image 1, int(x), int(y)

endif

next

endproc