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 } |