summaryrefslogtreecommitdiff
path: root/bindgen/rust/celeritas-sys/examples
diff options
context:
space:
mode:
Diffstat (limited to 'bindgen/rust/celeritas-sys/examples')
-rw-r--r--bindgen/rust/celeritas-sys/examples/glfw.rs224
-rw-r--r--bindgen/rust/celeritas-sys/examples/gui_test.rs283
-rw-r--r--bindgen/rust/celeritas-sys/examples/main_loop.rs108
3 files changed, 615 insertions, 0 deletions
diff --git a/bindgen/rust/celeritas-sys/examples/glfw.rs b/bindgen/rust/celeritas-sys/examples/glfw.rs
new file mode 100644
index 0000000..0514032
--- /dev/null
+++ b/bindgen/rust/celeritas-sys/examples/glfw.rs
@@ -0,0 +1,224 @@
+use std::ffi::CString;
+use std::ptr::addr_of_mut;
+
+use celeritas::*;
+use egui_backend::egui::{vec2, Pos2, Rect};
+use egui_glfw as egui_backend;
+use egui_glfw::glfw::{fail_on_errors, Context};
+
+use egui_glfw::glfw;
+
+const SCREEN_WIDTH: u32 = 1000;
+const SCREEN_HEIGHT: u32 = 1000;
+
+fn main() {
+ unsafe {
+ let mut glfw = glfw::init(glfw::fail_on_errors!()).unwrap();
+ glfw.window_hint(glfw::WindowHint::ContextVersion(4, 1));
+ glfw.window_hint(glfw::WindowHint::OpenGlForwardCompat(true));
+ glfw.window_hint(glfw::WindowHint::OpenGlProfile(
+ glfw::OpenGlProfileHint::Core,
+ ));
+ glfw.window_hint(glfw::WindowHint::DoubleBuffer(true));
+ glfw.window_hint(glfw::WindowHint::Resizable(false));
+
+ let (mut window, events) = glfw
+ .create_window(
+ SCREEN_WIDTH,
+ SCREEN_HEIGHT,
+ "Egui in GLFW!",
+ glfw::WindowMode::Windowed,
+ )
+ .expect("Failed to create GLFW window.");
+
+ window.set_all_polling(true);
+ window.make_current();
+ // glfw.set_swap_interval(glfw::SwapInterval::None);
+ glfw.set_swap_interval(glfw::SwapInterval::Adaptive);
+
+ gl::load_with(|symbol| window.get_proc_address(symbol) as *const _);
+
+ let window_ptr = window.window_ptr();
+ unsafe {
+ // Cast the window pointer to the expected type
+ let window_ptr = window_ptr as *mut celeritas::GLFWwindow;
+ Core_Bringup(window_ptr);
+ };
+
+ let mut painter = egui_backend::Painter::new(&mut window);
+ let egui_ctx = egui::Context::default();
+
+ let (width, height) = window.get_framebuffer_size();
+ let native_pixels_per_point = window.get_content_scale().0;
+ let native_pixels_per_point = 1.0;
+ // egui_ctx.set_pixels_per_point(2.0);
+
+ let mut egui_input_state = egui_backend::EguiInputState::new(egui::RawInput {
+ screen_rect: Some(Rect::from_min_size(
+ Pos2::new(0f32, 0f32),
+ vec2(width as f32, height as f32) / native_pixels_per_point,
+ )),
+ ..Default::default()
+ });
+
+ egui_input_state.input.time = Some(0.01);
+
+ // let triangle = triangle::Triangle::new();
+ let slider = &mut 0.0;
+
+ // C data
+ let camera_pos = Vec3 {
+ x: 18.9,
+ y: 10.6,
+ z: 11.6,
+ };
+ let camera_front = Vec3 {
+ x: -0.6,
+ y: -0.2,
+ z: -0.7,
+ };
+ let camera = Camera_Create(
+ camera_pos,
+ camera_front,
+ Vec3 {
+ x: 0.0,
+ y: 1.0,
+ z: 0.0,
+ },
+ 45.0,
+ );
+ SetCamera(camera);
+
+ let mut cube_geo = Geo_CreateCuboid(f32x3 {
+ x: 2.0,
+ y: 2.0,
+ z: 2.0,
+ });
+ let mut crate_mesh = Mesh_Create(addr_of_mut!(cube_geo), false);
+ let albedo_map = TextureLoadFromFile(
+ CString::new("assets/demo/crate/Wood_Crate_001_basecolor.jpg")
+ .unwrap()
+ .as_ptr() as *const i8,
+ );
+ let roughness_map = TextureLoadFromFile(
+ CString::new("assets/demo/crate/Wood_Crate_001_roughness.jpg")
+ .unwrap()
+ .as_ptr() as *const i8,
+ );
+ let normal_map = TextureLoadFromFile(
+ CString::new("assets/demo/crate/Wood_Crate_001_normal.jpg")
+ .unwrap()
+ .as_ptr() as *const i8,
+ );
+ let ao_map = TextureLoadFromFile(
+ CString::new("assets/demo/crate/Wood_Crate_001_ambientOcclusion.jpg")
+ .unwrap()
+ .as_ptr() as *const i8,
+ );
+ let name: [i8; 64] = [0; 64];
+ let mut crate_mat = Material {
+ name: name,
+ kind: 0,
+ param_albedo: Vec3 {
+ x: 0.0,
+ y: 0.0,
+ z: 0.0,
+ },
+ param_metallic: 0.0,
+ param_roughness: 0.0,
+ param_ao: 0.0,
+ pbr_albedo_map: albedo_map,
+ pbr_normal_map: normal_map,
+ metal_roughness_combined: true,
+ pbr_metallic_map: TextureHandle { raw: 99999 },
+ pbr_roughness_map: roughness_map,
+ pbr_ao_map: ao_map,
+ };
+ let crate_renderent = RenderEnt {
+ mesh: addr_of_mut!(crate_mesh),
+ material: addr_of_mut!(crate_mat),
+ affine: mat4_ident(),
+ casts_shadows: true,
+ };
+ let mut render_ents: [RenderEnt; 1] = [crate_renderent];
+ let mut skybox = Skybox_Default();
+
+ // Main rendering loop
+ while !window.should_close() {
+ glfw.poll_events();
+
+ egui_ctx.begin_frame(egui_input_state.input.take());
+
+ unsafe {
+ gl::ClearColor(0.455, 0.302, 0.663, 1.0);
+ gl::Clear(gl::COLOR_BUFFER_BIT);
+ gl::Clear(gl::DEPTH_TEST);
+ }
+
+ Frame_Begin();
+ gl::Enable(gl::DEPTH_TEST);
+ gl::Enable(gl::CULL_FACE);
+
+ Skybox_Draw(addr_of_mut!(skybox), camera);
+ Render_RenderEntities(render_ents.as_mut_ptr(), render_ents.len());
+
+ // Frame_End();
+
+ // triangle.draw();
+
+ gl::Disable(gl::DEPTH_TEST);
+ gl::Disable(gl::CULL_FACE);
+
+ egui::Window::new("Egui with GLFW").show(&egui_ctx, |ui| {
+ ui.label("Celeritas in-game editor");
+ let btn_m = &mut ui.button("-");
+ let btn_p = &mut ui.button("+");
+
+ ui.add(egui::Slider::new(slider, 0.0..=100.0).text("My value"));
+
+ if btn_m.clicked() && *slider > 0.0 {
+ *slider -= 1.0;
+ }
+
+ if btn_p.clicked() && *slider < 100.0 {
+ *slider += 1.0;
+ }
+ });
+
+ let egui::FullOutput {
+ platform_output,
+ textures_delta,
+ shapes,
+ ..
+ } = egui_ctx.end_frame();
+
+ //Handle cut, copy text from egui
+ if !platform_output.copied_text.is_empty() {
+ egui_backend::copy_to_clipboard(&mut egui_input_state, platform_output.copied_text);
+ }
+
+ //Note: passing a bg_color to paint_jobs will clear any previously drawn stuff.
+ //Use this only if egui is being used for all drawing and you aren't mixing your own Open GL
+ //drawing calls with it.
+ //Since we are custom drawing an OpenGL Triangle we don't need egui to clear the background.
+
+ let clipped_shapes = egui_ctx.tessellate(shapes, native_pixels_per_point);
+ painter.paint_and_update_textures(
+ native_pixels_per_point,
+ &clipped_shapes,
+ &textures_delta,
+ );
+
+ for (_, event) in glfw::flush_messages(&events) {
+ match event {
+ glfw::WindowEvent::Close => window.set_should_close(true),
+ _ => {
+ egui_backend::handle_event(event, &mut egui_input_state);
+ }
+ }
+ }
+
+ window.swap_buffers();
+ }
+ }
+}
diff --git a/bindgen/rust/celeritas-sys/examples/gui_test.rs b/bindgen/rust/celeritas-sys/examples/gui_test.rs
new file mode 100644
index 0000000..ddd8b86
--- /dev/null
+++ b/bindgen/rust/celeritas-sys/examples/gui_test.rs
@@ -0,0 +1,283 @@
+// // #![windows_subsystem = "windows"] // to turn off console.
+
+// use std::ptr;
+// use std::{ffi::CString, ptr::addr_of_mut};
+
+// use celeritas::*;
+// use egui::DragValue;
+// use egui_overlay::{EguiOverlay, OverlayApp};
+// use egui_render_three_d::ThreeDBackend;
+// use egui_window_glfw_passthrough::glfw::Context;
+// use egui_window_glfw_passthrough::{GlfwBackend, GlfwConfig};
+
+// fn main() {
+// // use tracing_subscriber::{fmt, prelude::*, EnvFilter};
+// // if RUST_LOG is not set, we will use the following filters
+// // tracing_subscriber::registry()
+// // .with(fmt::layer())
+// // .with(
+// // EnvFilter::try_from_default_env()
+// // .unwrap_or(EnvFilter::new("debug,wgpu=warn,naga=warn")),
+// // )
+// // .init();
+
+// unsafe {
+// // let p: *mut GLFWwindow = ptr::null_mut();
+// // Core_Bringup(p);
+
+// // let core = get_global_core();
+// // let glfw_window_ptr = Core_GetGlfwWindowPtr(core);
+
+// let mut glfw_backend = GlfwBackend::new(GlfwConfig {
+// // this closure will be called before creating a window
+// glfw_callback: Box::new(|gtx| {
+// // some defualt hints. it is empty atm, but in future we might add some convenience hints to it.
+// (egui_window_glfw_passthrough::GlfwConfig::default().glfw_callback)(gtx);
+// // scale the window size based on monitor scale. as 800x600 looks too small on a 4k screen, compared to a hd screen in absolute pixel sizes.
+// gtx.window_hint(
+// egui_window_glfw_passthrough::glfw::WindowHint::ScaleToMonitor(true),
+// );
+// }),
+// opengl_window: Some(true), // macos doesn't support opengl.
+// transparent_window: Some(false),
+// window_title: "Celeritas egui".into(),
+// ..Default::default()
+// });
+
+// // always on top
+// // glfw_backend.window.set_floating(true);
+// // disable borders/titlebar
+// // glfw_backend.window.set_decorated(false);
+
+// let latest_size = glfw_backend.window.get_framebuffer_size();
+// let latest_size = [latest_size.0 as _, latest_size.1 as _];
+
+// let default_gfx_backend = {
+// ThreeDBackend::new(
+// egui_render_three_d::ThreeDConfig {
+// ..Default::default()
+// },
+// |s| glfw_backend.get_proc_address(s),
+// latest_size,
+// )
+// };
+
+// let glfw_window_ptr = glfw_backend.window.window_ptr();
+// unsafe {
+// // Cast the window pointer to the expected type
+// let window_ptr = glfw_window_ptr as *mut crate::GLFWwindow;
+// Core_Bringup(window_ptr);
+// };
+
+// // cam pos: 18.871811 10.658584 11.643305 cam frontL -0.644326 -0.209243 -0.735569
+// let camera_pos = Vec3 {
+// x: 18.9,
+// y: 10.6,
+// z: 11.6,
+// };
+// let camera_front = Vec3 {
+// x: -0.6,
+// y: -0.2,
+// z: -0.7,
+// };
+// let camera = Camera_Create(
+// camera_pos,
+// camera_front,
+// Vec3 {
+// x: 0.0,
+// y: 1.0,
+// z: 0.0,
+// },
+// 45.0,
+// );
+// SetCamera(camera);
+
+// let mut cube_geo = Geo_CreateCuboid(f32x3 {
+// x: 2.0,
+// y: 2.0,
+// z: 2.0,
+// });
+// let mut crate_mesh = Mesh_Create(addr_of_mut!(cube_geo), false);
+// let albedo_map = TextureLoadFromFile(
+// CString::new("assets/demo/crate/Wood_Crate_001_basecolor.jpg")
+// .unwrap()
+// .as_ptr() as *const i8,
+// );
+// let roughness_map = TextureLoadFromFile(
+// CString::new("assets/demo/crate/Wood_Crate_001_roughness.jpg")
+// .unwrap()
+// .as_ptr() as *const i8,
+// );
+// let normal_map = TextureLoadFromFile(
+// CString::new("assets/demo/crate/Wood_Crate_001_normal.jpg")
+// .unwrap()
+// .as_ptr() as *const i8,
+// );
+// let ao_map = TextureLoadFromFile(
+// CString::new("assets/demo/crate/Wood_Crate_001_ambientOcclusion.jpg")
+// .unwrap()
+// .as_ptr() as *const i8,
+// );
+// let name: [i8; 64] = [0; 64];
+// let mut crate_mat = Material {
+// name: name,
+// kind: 0,
+// param_albedo: Vec3 {
+// x: 0.0,
+// y: 0.0,
+// z: 0.0,
+// },
+// param_metallic: 0.0,
+// param_roughness: 0.0,
+// param_ao: 0.0,
+// pbr_albedo_map: albedo_map,
+// pbr_normal_map: normal_map,
+// metal_roughness_combined: true,
+// pbr_metallic_map: TextureHandle { raw: 99999 },
+// pbr_roughness_map: roughness_map,
+// pbr_ao_map: ao_map,
+// };
+// let crate_renderent = RenderEnt {
+// mesh: addr_of_mut!(crate_mesh),
+// material: addr_of_mut!(crate_mat),
+// affine: mat4_ident(),
+// casts_shadows: true,
+// };
+// let mut render_ents: [RenderEnt; 1] = [crate_renderent];
+
+// let world_state = HelloWorld {
+// frame: 0,
+// render_entities: render_ents,
+// };
+
+// let overlap_app = OverlayApp {
+// user_data: world_state,
+// egui_context: Default::default(),
+// default_gfx_backend,
+// glfw_backend,
+// };
+
+// overlap_app.enter_event_loop();
+
+// // celeritas::egui_utils::start(HelloWorld { frame: 0});
+// }
+// }
+
+// pub struct HelloWorld {
+// pub frame: u64,
+// pub render_entities: [RenderEnt; 1],
+// }
+// impl EguiOverlay for HelloWorld {
+// fn gui_run(
+// &mut self,
+// egui_context: &egui::Context,
+// _default_gfx_backend: &mut ThreeDBackend,
+// glfw_backend: &mut egui_window_glfw_passthrough::GlfwBackend,
+// ) {
+// unsafe {
+// // Frame_Begin();
+// // Render_RenderEntities(
+// // self.render_entities.as_mut_ptr(),
+// // self.render_entities.len(),
+// // );
+// // Frame_End();
+// }
+
+// // just some controls to show how you can use glfw_backend
+// egui::Window::new("controls").show(egui_context, |ui| {
+// ui.set_width(300.0);
+// self.frame += 1;
+// ui.label(format!("current frame number: {}", self.frame));
+// // sometimes, you want to see the borders to understand where the overlay is.
+// let mut borders = glfw_backend.window.is_decorated();
+// if ui.checkbox(&mut borders, "window borders").changed() {
+// glfw_backend.window.set_decorated(borders);
+// }
+
+// ui.label(format!(
+// "pixels_per_virtual_unit: {}",
+// glfw_backend.physical_pixels_per_virtual_unit
+// ));
+// ui.label(format!("window scale: {}", glfw_backend.scale));
+// ui.label(format!("cursor pos x: {}", glfw_backend.cursor_pos[0]));
+// ui.label(format!("cursor pos y: {}", glfw_backend.cursor_pos[1]));
+
+// ui.label(format!(
+// "passthrough: {}",
+// glfw_backend.window.is_mouse_passthrough()
+// ));
+// // how to change size.
+// // WARNING: don't use drag value, because window size changing while dragging ui messes things up.
+// let mut size = glfw_backend.window_size_logical;
+// let mut changed = false;
+// ui.horizontal(|ui| {
+// ui.label("width: ");
+// ui.add_enabled(false, DragValue::new(&mut size[0]));
+// if ui.button("inc").clicked() {
+// size[0] += 10.0;
+// changed = true;
+// }
+// if ui.button("dec").clicked() {
+// size[0] -= 10.0;
+// changed = true;
+// }
+// });
+// ui.horizontal(|ui| {
+// ui.label("height: ");
+// ui.add_enabled(false, DragValue::new(&mut size[1]));
+// if ui.button("inc").clicked() {
+// size[1] += 10.0;
+// changed = true;
+// }
+// if ui.button("dec").clicked() {
+// size[1] -= 10.0;
+// changed = true;
+// }
+// });
+// if changed {
+// glfw_backend.set_window_size(size);
+// }
+// // how to change size.
+// // WARNING: don't use drag value, because window size changing while dragging ui messes things up.
+// let mut pos = glfw_backend.window_position;
+// let mut changed = false;
+// ui.horizontal(|ui| {
+// ui.label("x: ");
+// ui.add_enabled(false, DragValue::new(&mut pos[0]));
+// if ui.button("inc").clicked() {
+// pos[0] += 10;
+// changed = true;
+// }
+// if ui.button("dec").clicked() {
+// pos[0] -= 10;
+// changed = true;
+// }
+// });
+// ui.horizontal(|ui| {
+// ui.label("y: ");
+// ui.add_enabled(false, DragValue::new(&mut pos[1]));
+// if ui.button("inc").clicked() {
+// pos[1] += 10;
+// changed = true;
+// }
+// if ui.button("dec").clicked() {
+// pos[1] -= 10;
+// changed = true;
+// }
+// });
+// if changed {
+// glfw_backend.window.set_pos(pos[0], pos[1]);
+// }
+// });
+
+// // here you decide if you want to be passthrough or not.
+// if egui_context.wants_pointer_input() || egui_context.wants_keyboard_input() {
+// // we need input, so we need the window to be NOT passthrough
+// glfw_backend.set_passthrough(false);
+// } else {
+// // we don't care about input, so the window can be passthrough now
+// glfw_backend.set_passthrough(true)
+// }
+// egui_context.request_repaint();
+// }
+// }
diff --git a/bindgen/rust/celeritas-sys/examples/main_loop.rs b/bindgen/rust/celeritas-sys/examples/main_loop.rs
new file mode 100644
index 0000000..65f4137
--- /dev/null
+++ b/bindgen/rust/celeritas-sys/examples/main_loop.rs
@@ -0,0 +1,108 @@
+use std::{
+ ffi::CString,
+ ptr::{self, addr_of_mut},
+};
+
+use celeritas::*;
+
+unsafe fn run_game() {
+ // init
+ let p: *mut GLFWwindow = ptr::null_mut();
+ Core_Bringup(p);
+
+ let core = get_global_core();
+ let glfw_window_ptr = Core_GetGlfwWindowPtr(core);
+
+ // cam pos: 18.871811 10.658584 11.643305 cam frontL -0.644326 -0.209243 -0.735569
+ let camera_pos = Vec3 {
+ x: 18.9,
+ y: 10.6,
+ z: 11.6,
+ };
+ let camera_front = Vec3 {
+ x: -0.6,
+ y: -0.2,
+ z: -0.7,
+ };
+ let camera = Camera_Create(
+ camera_pos,
+ camera_front,
+ Vec3 {
+ x: 0.0,
+ y: 1.0,
+ z: 0.0,
+ },
+ 45.0,
+ );
+ SetCamera(camera);
+
+ let mut cube_geo = Geo_CreateCuboid(f32x3 {
+ x: 2.0,
+ y: 2.0,
+ z: 2.0,
+ });
+ let mut crate_mesh = Mesh_Create(addr_of_mut!(cube_geo), false);
+ let albedo_map = TextureLoadFromFile(
+ CString::new("assets/demo/crate/Wood_Crate_001_basecolor.jpg")
+ .unwrap()
+ .as_ptr() as *const i8,
+ );
+ let roughness_map = TextureLoadFromFile(
+ CString::new("assets/demo/crate/Wood_Crate_001_roughness.jpg")
+ .unwrap()
+ .as_ptr() as *const i8,
+ );
+ let normal_map = TextureLoadFromFile(
+ CString::new("assets/demo/crate/Wood_Crate_001_normal.jpg")
+ .unwrap()
+ .as_ptr() as *const i8,
+ );
+ let ao_map = TextureLoadFromFile(
+ CString::new("assets/demo/crate/Wood_Crate_001_ambientOcclusion.jpg")
+ .unwrap()
+ .as_ptr() as *const i8,
+ );
+ let name: [i8; 64] = [0; 64];
+ let mut crate_mat = Material {
+ name: name,
+ kind: 0,
+ param_albedo: Vec3 {
+ x: 0.0,
+ y: 0.0,
+ z: 0.0,
+ },
+ param_metallic: 0.0,
+ param_roughness: 0.0,
+ param_ao: 0.0,
+ pbr_albedo_map: albedo_map,
+ pbr_normal_map: normal_map,
+ metal_roughness_combined: true,
+ pbr_metallic_map: TextureHandle { raw: 99999 },
+ pbr_roughness_map: roughness_map,
+ pbr_ao_map: ao_map,
+ };
+ let crate_renderent = RenderEnt {
+ mesh: addr_of_mut!(crate_mesh),
+ material: addr_of_mut!(crate_mat),
+ affine: mat4_ident(),
+ casts_shadows: true,
+ };
+ let mut render_entities: [RenderEnt; 1] = [crate_renderent];
+
+ // main loop
+ while !ShouldExit() {
+ Frame_Begin();
+
+ Render_RenderEntities(render_entities.as_mut_ptr(), render_entities.len());
+
+ Frame_End();
+ }
+}
+
+fn main() {
+ println!("Running from Rust!");
+
+ unsafe {
+ run_game();
+ }
+}