
using MiniFB

# This function displays a time-varying mix of colors on screen. Demonstrates how to create a buffer and render it to a window. 
function plasma()
    pallete = zeros(UInt32, 512)
    WIDTH = 320
    HEIGHT = 240
    inc = 90 / 64;
    for c in 1:64
        col = round(Int, ((255 * sin( (c-1) * inc * π / 180)) + 0.5));
        pallete[64*0 + c] = mfb_rgb(col,     0,       0);
        pallete[64*1 + c] = mfb_rgb(255,     col,     0);
        pallete[64*2 + c] = mfb_rgb(255-col, 255,     0);
        pallete[64*3 + c] = mfb_rgb(0,       255,     col);
        pallete[64*4 + c] = mfb_rgb(0,       255-col, 255);
        pallete[64*5 + c] = mfb_rgb(col,     0,       255);
        pallete[64*6 + c] = mfb_rgb(255,     0,       255-col);
        pallete[64*7 + c] = mfb_rgb(255-col, 0,       0);
    end
    window = mfb_open_ex("Plasma Test", WIDTH, HEIGHT, MiniFB.WF_RESIZABLE);
    g_buffer = zeros(UInt32, WIDTH * HEIGHT)
    mfb_set_target_fps(10);
    time=0
    while mfb_wait_sync(window)
        time_x = sin(time * π / 180);
        time_y = cos(time * π / 180);
        i = 1;
        for y in 1:HEIGHT
            dy = cos((y * time_y) * π / 180); 
            for x in 1:WIDTH
                dx = sin((x * time_x) * π / 180); 
                idx = round(Int, ((2 + dx + dy) * 0.25 * 511) + 1)
                g_buffer[i] = pallete[idx];
                i += 1
            end
        end
        time += 1
        state = mfb_update(window, g_buffer);
        if state != MiniFB.STATE_OK
            break;
        end
    end
    mfb_close(window)
end

# Call the function
plasma()

# ![](../assets/plasma.png)