rust/lib-hedgewars-engine/src/lib.rs
changeset 14271 1aac8a62be6f
parent 14255 a239e4243cf9
child 14272 3152d9fdb499
equal deleted inserted replaced
14270:efa901b04bad 14271:1aac8a62be6f
       
     1 mod ipc;
     1 mod world;
     2 mod world;
     2 mod ipc;
     3 
       
     4 use std::io::{Read, Write};
       
     5 
       
     6 use self::ipc::IPC;
     3 
     7 
     4 #[repr(C)]
     8 #[repr(C)]
     5 pub struct EngineInstance {
     9 pub struct EngineInstance {
     6     world: world::World,
    10     world: world::World,
       
    11     ipc: IPC,
     7 }
    12 }
     8 
    13 
     9 impl EngineInstance {
    14 impl EngineInstance {
    10     pub fn new() -> Self {
    15     pub fn new() -> Self {
    11         let world = world::World::new();
    16         let world = world::World::new();
    12         Self { world }
    17         Self {
       
    18             world,
       
    19             ipc: IPC::new(),
       
    20         }
    13     }
    21     }
    14 
    22 
    15     pub fn render<R, C>(
    23     pub fn render<R, C>(
    16         &self,
    24         &self,
    17         context: &mut gfx::Encoder<R, C>,
    25         context: &mut gfx::Encoder<R, C>,
    18         target: &gfx::handle::RenderTargetView<R, gfx::format::Rgba8>)
    26         target: &gfx::handle::RenderTargetView<R, gfx::format::Rgba8>,
    19         where R: gfx::Resources,
    27     ) where
    20               C: gfx::CommandBuffer<R>
    28         R: gfx::Resources,
       
    29         C: gfx::CommandBuffer<R>,
    21     {
    30     {
    22         context.clear(target, [0.0, 0.5, 0.0, 1.0]);
    31         context.clear(target, [0.0, 0.5, 0.0, 1.0]);
    23     }
    32     }
    24 }
    33 }
    25 
    34 
    37     56
    46     56
    38 }
    47 }
    39 
    48 
    40 #[no_mangle]
    49 #[no_mangle]
    41 pub extern "C" fn start_engine() -> *mut EngineInstance {
    50 pub extern "C" fn start_engine() -> *mut EngineInstance {
    42     let engine_state = Box::new(EngineInstance {
    51     let engine_state = Box::new(EngineInstance::new());
    43         world: world::World::new(),
       
    44     });
       
    45 
    52 
    46     Box::leak(engine_state)
    53     Box::leak(engine_state)
    47 }
    54 }
    48 
    55 
    49 #[no_mangle]
    56 #[no_mangle]
    59         land: land_preview.raw_pixels().as_ptr(),
    66         land: land_preview.raw_pixels().as_ptr(),
    60     };
    67     };
    61 }
    68 }
    62 
    69 
    63 #[no_mangle]
    70 #[no_mangle]
       
    71 pub extern "C" fn send_ipc(engine_state: &mut EngineInstance, buf: *const [u8], size: usize) {
       
    72     unsafe {
       
    73         (*engine_state).ipc.write(&(*buf)[0..size]);
       
    74     }
       
    75 }
       
    76 
       
    77 #[no_mangle]
       
    78 pub extern "C" fn read_ipc(
       
    79     engine_state: &mut EngineInstance,
       
    80     buf: *mut [u8],
       
    81     size: usize,
       
    82 ) -> usize {
       
    83     unsafe { (*engine_state).ipc.read(&mut (*buf)[0..size]).unwrap_or(0) }
       
    84 }
       
    85 
       
    86 #[no_mangle]
    64 pub extern "C" fn cleanup(engine_state: *mut EngineInstance) {
    87 pub extern "C" fn cleanup(engine_state: *mut EngineInstance) {
    65     unsafe {
    88     unsafe {
    66         Box::from_raw(engine_state);
    89         Box::from_raw(engine_state);
    67     }
    90     }
    68 }
    91 }