prog8/examples/cx16/colorbars.p8

118 lines
2.6 KiB
Lua

%import gfx2
%import palette
%import textio
; TODO WORK IN PROGRESS...
; want to make Amiga 'copper' bars color cycling effects
main {
sub start() {
palette.set_all_black()
gfx2.screen_mode(4)
ubyte yy
for yy in 0 to 239
gfx2.horizontal_line(0, yy, 320, yy & 31)
repeat {
colors.random_half_bar()
colors.mirror_bar()
colors.set_palette()
repeat 20
sys.waitvsync()
}
repeat {
}
}
}
colors {
ubyte target_red
ubyte target_green
ubyte target_blue
ubyte[32] reds
ubyte[32] greens
ubyte[32] blues
ubyte bar_size
sub random_rgb12() {
do {
uword rr = rndw()
target_red = msb(rr) & 15
target_green = lsb(rr)
target_blue = target_green & 15
target_green >>= 4
} until target_red+target_green+target_blue >= 12
}
sub mirror_bar() {
; mirror the top half bar into the bottom half
ubyte ix=14
ubyte mix=16
do {
reds[mix] = reds[ix]
greens[mix] = greens[ix]
blues[mix] = blues[ix]
mix++
ix--
} until ix==255
reds[mix] = 0
greens[mix] = 0
blues[mix] = 0
}
sub random_half_bar() {
; fade black -> color then fade color -> white
; gradient calculations in 8.8 bits fixed-point
; could theoretically be 4.12 bits for even more fractional accuracy
random_rgb12()
uword r = $000
uword g = $000
uword b = $000
uword dr = target_red
uword dg = target_green
uword db = target_blue
ubyte ix = 1
; gradient from black to halfway color
reds[0] = 0
greens[0] = 0
blues[0] = 0
dr <<= 5
dg <<= 5
db <<= 5
continue_gradient()
; gradient from halfway color to white
dr = (($f00 - r) >> 3) - 1
dg = (($f00 - g) >> 3) - 1
db = (($f00 - b) >> 3) - 1
continue_gradient()
return
sub continue_gradient() {
repeat 8 {
reds[ix] = msb(r)
greens[ix] = msb(g)
blues[ix] = msb(b)
r += dr
g += dg
b += db
ix++
}
}
}
sub set_palette() {
ubyte ix
for ix in 0 to 31 {
uword color = mkword(reds[ix], (greens[ix] << 4) | blues[ix] )
palette.set_color(ix, color)
}
}
}