Harbor

branch main
showing the latest snapshot on main
main.odin 1.5 KB · Plain text
gpu/examples/particles_3d/main.odin 0644 Raw
package main

import "core:fmt"
import gpu "../.."
import app "../../app"
import particles "../../particles"

main :: proc() {
	state, ok := app.init_window(800, 600, "GPU - 3D Particles")
	if !ok {
		return
	}
	defer app.shutdown(&state)

	camera := gpu.default_camera_3d()
	camera.position = {3, 2, 5}
	camera.target = {0, 1, 0}

	config := particles.default_config_3d()
	config.max_particles = 300
	config.emission_rate = 60
	config.direction = {0, 1, 0}
	config.gravity = {0, -4, 0}
	config.speed = {1, 3}
	config.spread = 25
	config.start_color = {1, 0.6, 0.1, 1}
	config.end_color = {1, 0, 0, 0}
	config.start_size = 0.12
	config.end_size = 0.02
	config.lifetime = {0.8, 2.0}

	ps, ps_ok := particles.init_3d(config)
	defer particles.destroy_3d(&ps)

	if !ps_ok {
		fmt.println("Failed to create 3D particle producer")
		return
	}

	for !app.window_should_close(&state) {
		app.update_camera(&state, &camera, .ORBITAL)
		particles.update_3d(&ps, {0, 0, 0}, app.get_frame_time(&state))

		frame := app.begin_frame(&state, {0.08, 0.08, 0.12, 1.0})
		gpu.set_camera_3d(&frame, camera)

		_ = gpu.draw_grid_frame(&frame, {slices = 10, spacing = 1})
		particles.draw_3d(&frame, &ps)

		fps_text := fmt.tprintf("FPS: %d", app.get_fps(&state))
		_ = gpu.draw_rect(&frame, {x = 5, y = 5, width = 80, height = 20, color = {0, 0, 0, 0.5}, sort_key = 10_000})
		gpu.draw_text_frame(&frame, {text = fps_text, x = 10, y = 9, color = gpu.WHITE, scale = 2, sort_key = 10_001})

		_ = app.submit_frame(&state, &frame)

		if app.is_key_pressed(&state, .Escape) {
			break
		}
	}
}