rust/lib-hedgewars-engine/src/lib.rs
changeset 14293 b8871dd33ec4
parent 14272 3152d9fdb499
child 14294 21be7838a127
equal deleted inserted replaced
14292:1d4f1d700cdc 14293:b8871dd33ec4
     1 mod ipc;
     1 mod ipc;
     2 mod world;
     2 mod world;
     3 mod instance;
     3 pub mod instance;
     4 
     4 
     5 use std::io::{Read, Write};
     5 use std::{
       
     6     io::{Read, Write},
       
     7     ffi::{CString},
       
     8     os::raw::{c_void, c_char},
       
     9     mem::replace
       
    10 };
       
    11 use gfx::{
       
    12     Encoder,
       
    13     format::Formatted,
       
    14 };
     6 
    15 
     7 use self::instance::EngineInstance;
    16 use gfx_device_gl as gfx_gl;
       
    17 
       
    18 use self::instance::{
       
    19     EngineInstance,
       
    20     EngineGlContext
       
    21 };
     8 
    22 
     9 #[repr(C)]
    23 #[repr(C)]
    10 #[derive(Copy, Clone)]
    24 #[derive(Copy, Clone)]
    11 pub struct PreviewInfo {
    25 pub struct PreviewInfo {
    12     width: u32,
    26     width: u32,
    58 ) -> usize {
    72 ) -> usize {
    59     unsafe { (*engine_state).ipc.read(std::slice::from_raw_parts_mut(buf, size)).unwrap_or(0) }
    73     unsafe { (*engine_state).ipc.read(std::slice::from_raw_parts_mut(buf, size)).unwrap_or(0) }
    60 }
    74 }
    61 
    75 
    62 #[no_mangle]
    76 #[no_mangle]
       
    77 pub extern "C" fn setup_current_gl_context(
       
    78     engine_state: &mut EngineInstance,
       
    79     width: u16,
       
    80     height: u16,
       
    81     gl_loader: extern "C" fn (*const c_char) -> *const c_void
       
    82 ) {
       
    83     let (device, mut factory) = gfx_gl::create(|name| {
       
    84         let c_name = CString::new(name).unwrap();
       
    85         gl_loader(c_name.as_ptr())
       
    86     });
       
    87 
       
    88     let dimensions = (width, height, 1u16, gfx::texture::AaMode::Single);
       
    89     let (render_target, depth_buffer) = gfx_gl::create_main_targets_raw(
       
    90         dimensions,
       
    91         gfx::format::Rgba8::get_format().0,
       
    92         gfx::format::Depth::get_format().0
       
    93     );
       
    94 
       
    95     let mut command_buffer: Encoder<_, _> = factory.create_command_buffer().into();
       
    96 
       
    97     engine_state.gl_context = Some(EngineGlContext {
       
    98         device,
       
    99         factory,
       
   100         render_target: gfx::memory::Typed::new(render_target),
       
   101         depth_buffer: gfx::memory::Typed::new(depth_buffer),
       
   102         command_buffer
       
   103     })
       
   104 }
       
   105 
       
   106 #[no_mangle]
       
   107 pub extern "C" fn render_frame(engine_state: &mut EngineInstance) {
       
   108     let mut context = replace(&mut engine_state.gl_context, None);
       
   109     if let Some(ref mut c) = context {
       
   110         engine_state.render(&mut c.command_buffer, &mut c.render_target)
       
   111     }
       
   112     replace(&mut engine_state.gl_context, context);
       
   113 }
       
   114 
       
   115 #[no_mangle]
    63 pub extern "C" fn cleanup(engine_state: *mut EngineInstance) {
   116 pub extern "C" fn cleanup(engine_state: *mut EngineInstance) {
    64     unsafe {
   117     unsafe {
    65         Box::from_raw(engine_state);
   118         Box::from_raw(engine_state);
    66     }
   119     }
    67 }
   120 }