wip: Changes of the week

- Move engine to a different crate
- Add engine trait
- Refactor the rest of the codebase to work with these changes
- Add debug ui buffer, use it to finish imgui support
This commit is contained in:
reo 2025-09-07 17:00:04 +03:00
parent 3fd5b09a94
commit 15122b8ebd
20 changed files with 344 additions and 117 deletions

114
Cargo.lock generated
View file

@ -245,6 +245,12 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "chlorine"
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c00d31b1d19317b4777ec879192d3745bd97d05262b4b19cb1dda284b9d22f19"
[[package]] [[package]]
name = "combine" name = "combine"
version = "4.6.7" version = "4.6.7"
@ -642,6 +648,51 @@ dependencies = [
"zune-jpeg", "zune-jpeg",
] ]
[[package]]
name = "imgui"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8addafa5cecf0515812226e806913814e02ce38d10215778082af5174abe5669"
dependencies = [
"bitflags 1.3.2",
"cfg-if",
"imgui-sys",
"mint",
"parking_lot",
]
[[package]]
name = "imgui-glium-renderer"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "781e53a393214a132c89c62e6e4b817645ad38832d3e334b2ad543f2c3df5106"
dependencies = [
"glium",
"imgui",
]
[[package]]
name = "imgui-sys"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ead193f9f4b60398e8b8f4ab1483e2321640d87aeebdaa3e5f44c55633ccd804"
dependencies = [
"cc",
"cfg-if",
"chlorine",
"mint",
]
[[package]]
name = "imgui-winit-support"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff7fcccfa9efab56c94274c0fec9939bb14149342b49e6a425883a5b7dda6a3f"
dependencies = [
"imgui",
"winit",
]
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.10.0" version = "2.10.0"
@ -757,6 +808,16 @@ version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
[[package]]
name = "lock_api"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
dependencies = [
"autocfg",
"scopeguard",
]
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.27" version = "0.4.27"
@ -797,6 +858,12 @@ dependencies = [
"simd-adler32", "simd-adler32",
] ]
[[package]]
name = "mint"
version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff"
[[package]] [[package]]
name = "ndk" name = "ndk"
version = "0.9.0" version = "0.9.0"
@ -1137,6 +1204,29 @@ dependencies = [
"ttf-parser", "ttf-parser",
] ]
[[package]]
name = "parking_lot"
version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
dependencies = [
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
dependencies = [
"cfg-if",
"libc",
"redox_syscall 0.5.17",
"smallvec",
"windows-targets 0.52.6",
]
[[package]] [[package]]
name = "percent-encoding" name = "percent-encoding"
version = "2.3.1" version = "2.3.1"
@ -1253,6 +1343,7 @@ name = "raidillon_core"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"hecs", "hecs",
"imgui",
"indexmap", "indexmap",
"raidillon_assets", "raidillon_assets",
"winit", "winit",
@ -1266,6 +1357,18 @@ dependencies = [
"raidillon_assets", "raidillon_assets",
] ]
[[package]]
name = "raidillon_engine"
version = "0.1.0"
dependencies = [
"hecs",
"indexmap",
"raidillon_assets",
"raidillon_core",
"raidillon_platform",
"winit",
]
[[package]] [[package]]
name = "raidillon_game" name = "raidillon_game"
version = "0.1.0" version = "0.1.0"
@ -1274,6 +1377,7 @@ dependencies = [
"raidillon_assets", "raidillon_assets",
"raidillon_core", "raidillon_core",
"raidillon_ecs", "raidillon_ecs",
"raidillon_engine",
"raidillon_glium", "raidillon_glium",
"raidillon_platform", "raidillon_platform",
] ]
@ -1286,10 +1390,14 @@ dependencies = [
"glam", "glam",
"glium", "glium",
"gltf", "gltf",
"imgui",
"imgui-glium-renderer",
"imgui-winit-support",
"indexmap", "indexmap",
"raidillon_assets", "raidillon_assets",
"raidillon_core", "raidillon_core",
"raidillon_ecs", "raidillon_ecs",
"raidillon_engine",
"raidillon_platform", "raidillon_platform",
"winit", "winit",
] ]
@ -1387,6 +1495,12 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]] [[package]]
name = "sctk-adwaita" name = "sctk-adwaita"
version = "0.10.1" version = "0.10.1"

View file

@ -5,5 +5,6 @@ members = [
"platform", "platform",
"asset", "asset",
"game", "game",
"ecs" "ecs",
"engine"
] ]

View file

@ -8,3 +8,4 @@ hecs = "0.10.5"
indexmap = "2.10.0" indexmap = "2.10.0"
raidillon_assets = { path = "../asset" } raidillon_assets = { path = "../asset" }
winit = "0.30.12" winit = "0.30.12"
imgui = "0.12.0"

View file

@ -1,16 +1,11 @@
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
use std::sync::Arc;
use winit::event::Event; use winit::event::Event;
use raidillon_assets::{ModelManagerRef, ModelManager}; use raidillon_assets::{ModelManagerRef, ModelManager};
// TODO: Find a way to move this to raidillon_platform as it belongs there.
// TODO: The name "Context" doesn't imply the wide role of this structure.
/// This provides a bridge between the game logic systems (raidillon_core::System) and
/// platform-related data/utilities.
#[derive(Clone)] #[derive(Clone)]
pub struct PlatformContext { pub struct PlatformContext {
/// The latest winit event.
pub current_event: Event<()>, pub current_event: Event<()>,
pub asset_manager: ModelManagerRef, pub asset_manager: ModelManagerRef,
pub frame_width: f32, pub frame_width: f32,

40
core/src/debug_ui.rs Normal file
View file

@ -0,0 +1,40 @@
pub enum UICommand {
Text(String),
Separator,
}
pub struct DebugUIBuffer {
cmds: Vec<UICommand>,
}
impl DebugUIBuffer {
pub fn new() -> DebugUIBuffer {
DebugUIBuffer { cmds: vec![] }
}
// Commands
pub fn text(&mut self, text: String) {
self.cmds.push(UICommand::Text(text));
}
pub fn separator(&mut self) {
self.cmds.push(UICommand::Separator);
}
pub fn write_buffer(&self, ui: &imgui::Ui) {
for cmd in &self.cmds {
match cmd {
UICommand::Text(s) => {
ui.text(s);
}
UICommand::Separator => {
ui.separator();
}
}
}
}
pub fn reset_buffer(&mut self) {
self.cmds = vec![];
}
}

View file

@ -1,59 +1,15 @@
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
use winit::event::Event;
use crate::SceneManager;
use crate::system::{SystemContext, SystemManager};
use raidillon_assets::{ModelManager, ModelManagerRef};
use crate::context::PlatformContext; use crate::context::PlatformContext;
use crate::DebugUIBuffer;
use crate::scene::Scene;
pub struct Engine { pub trait EngineTrait {
pub scene_manager: SceneManager, fn new() -> Self;
pub system_manager: SystemManager, fn initialize(&mut self, platform_context: PlatformContext);
} fn update(&mut self, platform_context: PlatformContext);
fn current_scene_mut(&mut self) -> &mut Scene;
impl Engine { fn get_debug_ui_buffer(&self) -> Rc<RefCell<DebugUIBuffer>>;
pub fn new() -> Self { fn reset_debug_ui_buffer(&mut self);
let scene_manager = SceneManager::new(); fn scene_and_debug_ui_buffer_mut(&mut self) -> (&mut Scene, Rc<RefCell<DebugUIBuffer>>);
let system_manager = SystemManager::new();
Self {
scene_manager,
system_manager,
}
}
/// Initialize systems, load the world.
pub fn initialize(&mut self, platform_context: PlatformContext) {
// Engine Loading Stage 1: initialize systems
for (system_id, system) in self.system_manager.systems.iter_mut() {
system.initialize();
}
let mut ctx = SystemContext {
scene: self.scene_manager.current_mut(),
platform_context,
};
// Engine Loading Stage 2: load world
for (system_id, system) in self.system_manager.systems.iter_mut() {
system.load_world(&mut ctx);
}
}
/// Update the engine
pub fn update(&mut self, platform_context: PlatformContext) {
let mut ctx = SystemContext {
scene: self.scene_manager.current_mut(),
platform_context,
};
for (system_id, system) in self.system_manager.systems.iter_mut() {
system.update(&mut ctx);
}
}
// pub fn build_system_context(&mut self) -> SystemContext {
// SystemContext {
// scene: self.scene_manager.current_mut(),
// }
// }
} }

View file

@ -1,8 +1,5 @@
mod scene; pub mod engine;
mod engine; pub mod scene;
pub mod system;
pub mod context; pub mod context;
pub mod debug_ui;
pub use scene::{Scene, SceneManager}; pub use debug_ui::*;
pub use engine::Engine;
pub use system::{System, SystemManager};

View file

@ -17,6 +17,8 @@ impl Scene {
} }
} }
impl Scene {}
impl AsRef<Scene> for Scene { impl AsRef<Scene> for Scene {
fn as_ref(&self) -> &Scene { fn as_ref(&self) -> &Scene {
&self &self

12
engine/Cargo.toml Normal file
View file

@ -0,0 +1,12 @@
[package]
name = "raidillon_engine"
version = "0.1.0"
edition = "2024"
[dependencies]
raidillon_assets = { path = "../asset" }
raidillon_core = { path = "../core" }
raidillon_platform = { path = "../platform" }
winit = "0.30.12"
hecs = "0.10.5"
indexmap = "2.10.0"

83
engine/src/engine.rs Normal file
View file

@ -0,0 +1,83 @@
use std::cell::RefCell;
use std::rc::Rc;
use winit::event::Event;
use raidillon_core::scene::{Scene, SceneManager};
use crate::system::{SystemContext, SystemManager};
use raidillon_assets::{ModelManager, ModelManagerRef};
use raidillon_core::context::PlatformContext;
use raidillon_core::DebugUIBuffer;
use raidillon_core::engine::{EngineTrait};
pub struct Engine {
pub scene_manager: SceneManager,
pub system_manager: SystemManager,
debug_ui_buffer: Rc<RefCell<DebugUIBuffer>>,
}
impl EngineTrait for Engine {
fn new() -> Self {
let scene_manager = SceneManager::new();
let system_manager = SystemManager::new();
Self {
scene_manager,
system_manager,
debug_ui_buffer: Rc::new(RefCell::new(DebugUIBuffer::new())),
}
}
/// Initialize systems, load the world.
fn initialize(&mut self, platform_context: PlatformContext) {
// Engine Loading Stage 1: initialize systems
for (system_id, system) in self.system_manager.systems.iter_mut() {
system.initialize();
}
let mut ctx = SystemContext {
scene: self.scene_manager.current_mut(),
platform_context,
debug_ui_buffer: self.debug_ui_buffer.clone(),
};
// Engine Loading Stage 2: load world
for (system_id, system) in self.system_manager.systems.iter_mut() {
system.load_world(&mut ctx);
}
}
/// Update the engine
fn update(&mut self, platform_context: PlatformContext) {
self.debug_ui_buffer.borrow_mut().reset_buffer();
let mut ctx = SystemContext {
scene: self.scene_manager.current_mut(),
platform_context,
debug_ui_buffer: self.debug_ui_buffer.clone(),
};
for (system_id, system) in self.system_manager.systems.iter_mut() {
system.update(&mut ctx);
}
}
// pub fn build_system_context(&mut self) -> SystemContext {
// SystemContext {
// scene: self.scene_manager.current_mut(),
// }
// }
fn current_scene_mut(&mut self) -> &mut Scene {
self.scene_manager.current_mut()
}
fn get_debug_ui_buffer(&self) -> Rc<RefCell<DebugUIBuffer>> {
self.debug_ui_buffer.clone()
}
fn reset_debug_ui_buffer(&mut self) {
self.debug_ui_buffer.borrow_mut().reset_buffer();
}
fn scene_and_debug_ui_buffer_mut(&mut self) -> (&mut Scene, Rc<RefCell<DebugUIBuffer>>) {
let (sm, dub) = (&mut self.scene_manager, &mut self.debug_ui_buffer);
(sm.current_mut(), dub.clone())
}
}

4
engine/src/lib.rs Normal file
View file

@ -0,0 +1,4 @@
pub mod engine;
pub mod system;
pub use crate::engine::Engine;

View file

@ -1,12 +1,16 @@
use crate::Scene; use std::cell::RefCell;
use std::rc::Rc;
use raidillon_core::scene::Scene;
use indexmap::IndexMap; use indexmap::IndexMap;
use winit::event::Event; use winit::event::Event;
use crate::context::PlatformContext; use raidillon_core::context::PlatformContext;
use raidillon_core::DebugUIBuffer;
pub struct SystemContext<'a> { pub struct SystemContext<'a> {
// TODO: time delta etc. // TODO: time delta etc.
pub scene: &'a mut Scene, pub scene: &'a mut Scene,
pub platform_context: PlatformContext, pub platform_context: PlatformContext,
pub debug_ui_buffer: Rc<RefCell<DebugUIBuffer>>,
} }
pub trait System { pub trait System {

View file

@ -12,5 +12,6 @@ raidillon_core = { path = "../core" }
raidillon_platform = { path = "../platform" } raidillon_platform = { path = "../platform" }
raidillon_assets = { path = "../asset" } raidillon_assets = { path = "../asset" }
raidillon_ecs = { path = "../ecs" } raidillon_ecs = { path = "../ecs" }
raidillon_engine = { path = "../engine" }
raidillon_glium = { path = "../glium_platform", optional = true } raidillon_glium = { path = "../glium_platform", optional = true }
glam = "0.30.5" glam = "0.30.5"

View file

@ -1,13 +1,16 @@
use std::path::Path; use std::path::Path;
use glam::{Quat, Vec3}; use glam::{Quat, Vec3};
use raidillon_core::{Engine, Scene, System}; use raidillon_engine::{Engine, system::System};
use raidillon_core::system::SystemContext; use raidillon_engine::system::SystemContext;
use raidillon_platform::{Platform, Camera}; use raidillon_platform::{Platform, Camera};
use raidillon_assets::model_path; use raidillon_assets::model_path;
use raidillon_core::engine::EngineTrait;
use raidillon_ecs::components::ModelHandle; use raidillon_ecs::components::ModelHandle;
use raidillon_ecs::Transform; use raidillon_ecs::Transform;
use raidillon_core::scene::Scene;
#[cfg(feature = "glium")] #[cfg(feature = "glium")]
use raidillon_glium::GliumPlatform; use raidillon_glium::GliumPlatform;
use raidillon_core::DebugUIBuffer;
const TEST_GLTF: &str = "pink-monkey.gltf"; const TEST_GLTF: &str = "pink-monkey.gltf";
@ -48,6 +51,7 @@ impl System for RenderingTestSystem {
// if let Some(mut debug_ui) = ctx.platform_context.imgui_ui.as_ref().map(|ui| ui.borrow_mut()) { // if let Some(mut debug_ui) = ctx.platform_context.imgui_ui.as_ref().map(|ui| ui.borrow_mut()) {
// debug_ui.text("Hello World!"); // debug_ui.text("Hello World!");
// } // }
ctx.debug_ui_buffer.borrow_mut().text("Hello World!".to_owned());
} }
} }

View file

@ -12,6 +12,7 @@ raidillon_platform = { path = "../platform" }
raidillon_core = { path = "../core" } raidillon_core = { path = "../core" }
raidillon_assets = { path = "../asset" } raidillon_assets = { path = "../asset" }
raidillon_ecs = { path = "../ecs" } raidillon_ecs = { path = "../ecs" }
raidillon_engine = { path = "../engine" }
winit = "0.30.12" winit = "0.30.12"
indexmap = "2.10.0" indexmap = "2.10.0"
imgui = "0.12.0" imgui = "0.12.0"

View file

@ -12,25 +12,26 @@ use glium::Surface;
use crate::system::{RenderingSystemManager, RenderingSystem, RenderingContext, SystemID}; use crate::system::{RenderingSystemManager, RenderingSystem, RenderingContext, SystemID};
use winit::event::{Event, WindowEvent}; use winit::event::{Event, WindowEvent};
use raidillon_assets::{ModelManager, ModelManagerRef}; use raidillon_assets::{ModelManager, ModelManagerRef};
use raidillon_core::Engine; use raidillon_core::engine::EngineTrait;
use raidillon_engine::Engine;
use crate::{GliumAssetManager}; use crate::{GliumAssetManager};
use crate::render::debug_ui::ImguiBridge; use crate::render::debug_ui::ImguiBridge;
use crate::render::BasicMeshRenderingSystem; use crate::render::BasicMeshRenderingSystem;
pub const MESH_RENDERER: &str = "mesh_renderer"; pub const MESH_RENDERER: &str = "mesh_renderer";
pub const DEBUG_UI_RENDERER: &str = "debug_ui_renderer";
pub struct GliumPlatform { pub struct GliumPlatform<E: EngineTrait> {
event_loop: EventLoop<()>, event_loop: EventLoop<()>,
window: Window, window: Window,
display: Display<WindowSurface>, display: Display<WindowSurface>,
rendering_system_manager: RenderingSystemManager, rendering_system_manager: RenderingSystemManager,
asset_manager: ModelManagerRef, asset_manager: ModelManagerRef,
engine: Engine, engine: E,
imgui_bridge: ImguiBridge,
} }
impl Platform for GliumPlatform { impl<E: EngineTrait> Platform<E> for GliumPlatform<E> {
fn initialize(mut engine: Engine, title: String, width: u32, height: u32) -> Self { fn initialize(mut engine: E, title: String, width: u32, height: u32) -> Self {
let event_loop = glium::winit::event_loop::EventLoop::builder() let event_loop = glium::winit::event_loop::EventLoop::builder()
.build() .build()
.expect("create event-loop"); .expect("create event-loop");
@ -46,10 +47,13 @@ impl Platform for GliumPlatform {
// Install rendering systems // Install rendering systems
rendering_system_manager.add_system( rendering_system_manager.add_system(
MESH_RENDERER, MESH_RENDERER,
Box::new(BasicMeshRenderingSystem::initialize(&display)) Box::new(BasicMeshRenderingSystem::initialize(&display, &window))
); );
let imgui_bridge = ImguiBridge::new(&display, &window).unwrap(); rendering_system_manager.add_system(
DEBUG_UI_RENDERER,
Box::new(ImguiBridge::initialize(&display, &window)),
);
Self { Self {
event_loop, event_loop,
@ -58,7 +62,6 @@ impl Platform for GliumPlatform {
rendering_system_manager, rendering_system_manager,
asset_manager, asset_manager,
engine, engine,
imgui_bridge,
} }
} }
@ -81,11 +84,13 @@ impl Platform for GliumPlatform {
WindowEvent::RedrawRequested => { WindowEvent::RedrawRequested => {
let mut target = self.display.draw(); let mut target = self.display.draw();
target.clear_color_and_depth((0.1, 0.1, 0.15, 1.0), 1.0); target.clear_color_and_depth((0.1, 0.1, 0.15, 1.0), 1.0);
// TODO: let mut context; let (scene_mut, debug_ui_buffer) = self.engine.scene_and_debug_ui_buffer_mut();
let mut context = RenderingContext { let mut context = RenderingContext {
scene: self.engine.scene_manager.current_mut(), scene: scene_mut,
target: &mut target, target: &mut target,
asset_manager: self.asset_manager.clone(), asset_manager: self.asset_manager.clone(),
window: &mut self.window,
debug_ui_buffer,
}; };
for (system_id, system) in self.rendering_system_manager.systems.iter_mut() { for (system_id, system) in self.rendering_system_manager.systems.iter_mut() {

View file

@ -20,7 +20,7 @@ pub struct BasicMeshRenderingSystem {
} }
impl RenderingSystem for BasicMeshRenderingSystem { impl RenderingSystem for BasicMeshRenderingSystem {
fn initialize(display: &Display<WindowSurface>) -> Self { fn initialize(display: &Display<WindowSurface>, _window: &glium::winit::window::Window) -> Self {
const VERT_SRC: &str = include_shader!("gl_textured.vert"); const VERT_SRC: &str = include_shader!("gl_textured.vert");
const FRAG_SRC: &str = include_shader!("gl_textured.frag"); const FRAG_SRC: &str = include_shader!("gl_textured.frag");

View file

@ -1,5 +1,6 @@
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
use std::sync::Arc;
use std::time::Instant; use std::time::Instant;
use glium::Display; use glium::Display;
use glium::glutin::surface::WindowSurface; use glium::glutin::surface::WindowSurface;
@ -8,10 +9,11 @@ use imgui_winit_support::{HiDpiMode, WinitPlatform};
use imgui_glium_renderer::Renderer as ImguiGliumRenderer; use imgui_glium_renderer::Renderer as ImguiGliumRenderer;
use winit::raw_window_handle::DisplayHandle; use winit::raw_window_handle::DisplayHandle;
use winit::window::Window; use winit::window::Window;
use anyhow::Result; use anyhow::{Result};
use crate::RenderingSystem; use crate::RenderingSystem;
use crate::system::RenderingContext; use crate::system::RenderingContext;
use glium::Frame; use glium::Frame;
use raidillon_core::DebugUIBuffer;
pub struct ImguiBridge { pub struct ImguiBridge {
imgui: ImguiContext, imgui: ImguiContext,
@ -20,21 +22,6 @@ pub struct ImguiBridge {
} }
impl ImguiBridge { impl ImguiBridge {
pub fn new(display: &Display<WindowSurface>, window: &Window) -> Result<Self> {
let mut imgui = ImguiContext::create();
imgui.set_ini_filename(None);
let mut platform = WinitPlatform::new(&mut imgui);
platform.attach_window(imgui.io_mut(), window, HiDpiMode::Default);
imgui.fonts().add_font(&[imgui::FontSource::DefaultFontData { config: None }]);
let renderer = ImguiGliumRenderer::new(&mut imgui, display)?;
Ok(Self {
imgui,
platform,
renderer,
})
}
pub fn render<F>(&mut self, target: &mut Frame, window: &Window, build_ui: F) pub fn render<F>(&mut self, target: &mut Frame, window: &Window, build_ui: F)
where where
F: FnOnce(&imgui::Ui), F: FnOnce(&imgui::Ui),
@ -52,26 +39,43 @@ impl ImguiBridge {
.expect("imgui rendering failed"); .expect("imgui rendering failed");
} }
pub fn initialize_frame(&mut self) -> &mut imgui::Ui { // pub fn initialize_frame(&mut self) -> &mut imgui::Ui {
self.imgui.frame() // self.imgui.frame()
} // }
//
pub fn finish_frame(&mut self, target: &mut Frame, window: &Window, ui: imgui::Ui) { // pub fn finish_frame(&mut self, target: &mut Frame, window: &Window, ui: imgui::Ui) {
self.platform.prepare_render(&ui, window); // self.platform.prepare_render(&ui, window);
let draw_data = self.imgui.render(); // let draw_data = self.imgui.render();
self.renderer.render(target, draw_data).expect("imgui rendering failed"); // self.renderer.render(target, draw_data).expect("imgui rendering failed");
} // }
} }
impl RenderingSystem for ImguiBridge { impl RenderingSystem for ImguiBridge {
fn render(&mut self, ctx: &mut RenderingContext) { fn render(&mut self, ctx: &mut RenderingContext) {
todo!() let mut ui = self.imgui.frame();
ctx.debug_ui_buffer.borrow_mut().write_buffer(&mut ui);
self.platform.prepare_render(&ui, ctx.window);
let draw_data = self.imgui.render();
self.renderer.render(ctx.target, draw_data).expect("imgui rendering failed");
} }
fn initialize(display: &Display<WindowSurface>) -> Self fn initialize(display: &Display<WindowSurface>, window: &glium::winit::window::Window) -> Self
where where
Self: Sized, Self: Sized,
{ {
todo!() let mut imgui = ImguiContext::create();
imgui.set_ini_filename(None);
let mut platform = WinitPlatform::new(&mut imgui);
platform.attach_window(imgui.io_mut(), window, HiDpiMode::Default);
imgui.fonts().add_font(&[imgui::FontSource::DefaultFontData { config: None }]);
let renderer = ImguiGliumRenderer::new(&mut imgui, display).unwrap();
Self {
imgui,
platform,
renderer,
}
} }
} }

View file

@ -1,23 +1,26 @@
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
use raidillon_core::Scene; use raidillon_core::scene::Scene;
use glium::{Display, Frame}; use glium::{Display, Frame};
use glium::glutin::surface::WindowSurface; use glium::glutin::surface::WindowSurface;
use indexmap::IndexMap; use indexmap::IndexMap;
use raidillon_assets::ModelManagerRef; use raidillon_assets::ModelManagerRef;
use raidillon_core::DebugUIBuffer;
use crate::GliumAssetManager; use crate::GliumAssetManager;
pub struct RenderingContext<'a> { pub struct RenderingContext<'a> {
pub scene: &'a Scene, pub scene: &'a Scene,
pub target: &'a mut Frame, pub target: &'a mut Frame,
pub window: &'a mut glium::winit::window::Window,
pub asset_manager: ModelManagerRef, pub asset_manager: ModelManagerRef,
pub debug_ui_buffer: Rc<RefCell<DebugUIBuffer>>,
} }
/// The internal "rendering system" trait of glium_platform. /// The internal "rendering system" trait of glium_platform.
/// This is unrelated to the main System trait in core. /// This is unrelated to the main System trait in core.
pub trait RenderingSystem { pub trait RenderingSystem {
fn render(&mut self, ctx: &mut RenderingContext); fn render(&mut self, ctx: &mut RenderingContext);
fn initialize(display: &Display<WindowSurface>) -> Self where Self: Sized; fn initialize(display: &Display<WindowSurface>, window: &glium::winit::window::Window) -> Self where Self: Sized;
} }
pub type SystemID = &'static str; pub type SystemID = &'static str;

View file

@ -1,9 +1,9 @@
use raidillon_assets::ModelManager; use raidillon_assets::ModelManager;
use raidillon_core::Engine; use raidillon_core::engine::EngineTrait;
use crate::PlatformContext; use crate::PlatformContext;
pub trait Platform { pub trait Platform<E: EngineTrait> {
/// Initialize platform. /// Initialize platform.
fn initialize(engine: Engine, title: String, width: u32, height: u32) -> Self; fn initialize(engine: E, title: String, width: u32, height: u32) -> Self;
fn run(self); fn run(self);
} }