rust/lib-hedgewars-engine/src/lib.rs
changeset 14314 b8871dd33ec4
parent 14293 3152d9fdb499
child 14315 21be7838a127
--- a/rust/lib-hedgewars-engine/src/lib.rs	Sun Nov 25 00:23:32 2018 +0100
+++ b/rust/lib-hedgewars-engine/src/lib.rs	Sun Nov 25 05:52:06 2018 +0300
@@ -1,10 +1,24 @@
 mod ipc;
 mod world;
-mod instance;
+pub mod instance;
 
-use std::io::{Read, Write};
+use std::{
+    io::{Read, Write},
+    ffi::{CString},
+    os::raw::{c_void, c_char},
+    mem::replace
+};
+use gfx::{
+    Encoder,
+    format::Formatted,
+};
 
-use self::instance::EngineInstance;
+use gfx_device_gl as gfx_gl;
+
+use self::instance::{
+    EngineInstance,
+    EngineGlContext
+};
 
 #[repr(C)]
 #[derive(Copy, Clone)]
@@ -60,6 +74,45 @@
 }
 
 #[no_mangle]
+pub extern "C" fn setup_current_gl_context(
+    engine_state: &mut EngineInstance,
+    width: u16,
+    height: u16,
+    gl_loader: extern "C" fn (*const c_char) -> *const c_void
+) {
+    let (device, mut factory) = gfx_gl::create(|name| {
+        let c_name = CString::new(name).unwrap();
+        gl_loader(c_name.as_ptr())
+    });
+
+    let dimensions = (width, height, 1u16, gfx::texture::AaMode::Single);
+    let (render_target, depth_buffer) = gfx_gl::create_main_targets_raw(
+        dimensions,
+        gfx::format::Rgba8::get_format().0,
+        gfx::format::Depth::get_format().0
+    );
+
+    let mut command_buffer: Encoder<_, _> = factory.create_command_buffer().into();
+
+    engine_state.gl_context = Some(EngineGlContext {
+        device,
+        factory,
+        render_target: gfx::memory::Typed::new(render_target),
+        depth_buffer: gfx::memory::Typed::new(depth_buffer),
+        command_buffer
+    })
+}
+
+#[no_mangle]
+pub extern "C" fn render_frame(engine_state: &mut EngineInstance) {
+    let mut context = replace(&mut engine_state.gl_context, None);
+    if let Some(ref mut c) = context {
+        engine_state.render(&mut c.command_buffer, &mut c.render_target)
+    }
+    replace(&mut engine_state.gl_context, context);
+}
+
+#[no_mangle]
 pub extern "C" fn cleanup(engine_state: *mut EngineInstance) {
     unsafe {
         Box::from_raw(engine_state);