module main import os import gg import gx import rand import sokol.sgl const ( win_width = 800 win_height = 600 max_stars = 5000 max_v_letters = 5 ) struct Star { mut: x f32 y f32 z f32 r f32 g f32 b f32 } struct VLetter { mut: x f32 y f32 z f32 w f32 h f32 angle f32 dz f32 dangle f32 } struct App { mut: gg &gg.Context = unsafe { nil } image gg.Image stars []Star v_letters []VLetter } fn main() { mut app := &App{ gg: 0 stars: []Star{len: max_stars} v_letters: []VLetter{len: max_v_letters} } app.gg = gg.new_context( bg_color: gx.black width: win_width height: win_height create_window: true window_title: 'Star Vield' frame_fn: frame init_fn: init_images user_data: app ) for i in 0 .. max_stars { app.stars[i].x = rand.f32_in_range(-200.0, 200.0) or { -200.0 } app.stars[i].y = rand.f32_in_range(-200.0, 200.0) or { -200.0 } app.stars[i].z = rand.f32_in_range(-200.0, -100.0) or { -200.0 } app.stars[i].r = rand.f32_in_range(0.1, 1.0) or { 0.1 } app.stars[i].g = rand.f32_in_range(0.1, 1.0) or { 0.1 } app.stars[i].b = rand.f32_in_range(0.1, 1.0) or { 0.1 } } for i in 0 .. max_v_letters { app.v_letters[i].x = rand.f32_in_range(-20.0, 20.0) or { -20.0 } app.v_letters[i].y = rand.f32_in_range(-20.0, 20.0) or { -20.0 } app.v_letters[i].z = rand.f32_in_range(-5.0, -1.0) or { -5.0 } app.v_letters[i].w = rand.f32_in_range(5, 20) or { 5 } app.v_letters[i].h = app.v_letters[i].w app.v_letters[i].angle = rand.f32_in_range(0, 6.283184) or { 0 } app.v_letters[i].dangle = rand.f32_in_range(-0.05, 0.05) or { -0.05 } app.v_letters[i].dz = rand.f32_in_range(-0.1, -0.01) or { -0.1 } } app.gg.run() } fn init_images(mut app App) { mut logo_path := os.resource_abs_path(os.join_path('..', 'assets', 'logo.png')) app.image = app.gg.create_image(logo_path) or { panic(err) } } fn frame(mut app App) { app.gg.begin() app.draw() app.gg.end() } // fn C.glPointSize(size f32) fn (mut app App) draw() { sgl.defaults() sgl.perspective(sgl.rad(90), 1.0, 1.0, 100.0) // C.glPointSize(3.0) sgl.begin_points() for i in 0 .. app.stars.len { s := app.stars[i] sgl.v3f_c3f(s.x, s.y, s.z, s.r, s.g, s.b) app.stars[i].z += 0.3 if app.stars[i].z > -1.0 { app.stars[i].x = rand.f32_in_range(-200.0, 200.0) or { -200.0 } app.stars[i].y = rand.f32_in_range(-200.0, 200.0) or { -200.0 } app.stars[i].z = rand.f32_in_range(-200.0, -100.0) or { -200.0 } } } sgl.end() // //// for i in 0 .. app.v_letters.len { v := app.v_letters[i] sgl.defaults() sgl.perspective(sgl.rad(90), 1.0, 1.0, 100.0) sgl.rotate(v.angle, 0, 0, 1) app.gg.draw_image_3d(v.x, v.y, v.z, v.w, v.h, app.image) // app.v_letters[i].z += app.v_letters[i].dz app.v_letters[i].angle += app.v_letters[i].dangle if app.v_letters[i].z > -60.0 { app.v_letters[i].x += rand.f32_in_range(-0.05, 0.05) or { -0.05 } app.v_letters[i].y += rand.f32_in_range(-0.05, 0.05) or { -0.05 } } if app.v_letters[i].z < -95.0 { app.v_letters[i].h *= 0.8 app.v_letters[i].w *= 0.8 } if app.v_letters[i].z < -100.0 { app.v_letters[i].z = rand.f32_in_range(-5.0, -1.0) or { -5.0 } app.v_letters[i].h = 10.0 app.v_letters[i].w = 10.0 } } }