rust/lib-hedgewars-engine/src/lib.rs
author alfadur
Sun, 25 Nov 2018 05:52:06 +0300
changeset 14293 b8871dd33ec4
parent 14272 3152d9fdb499
child 14294 21be7838a127
permissions -rw-r--r--
add gfx setup ffi
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14271
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
     1
mod ipc;
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
     2
mod world;
14293
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
     3
pub mod instance;
14271
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
     4
14293
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
     5
use std::{
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
     6
    io::{Read, Write},
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
     7
    ffi::{CString},
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
     8
    os::raw::{c_void, c_char},
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
     9
    mem::replace
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    10
};
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    11
use gfx::{
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    12
    Encoder,
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    13
    format::Formatted,
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    14
};
14271
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    15
14293
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    16
use gfx_device_gl as gfx_gl;
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    17
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    18
use self::instance::{
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    19
    EngineInstance,
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    20
    EngineGlContext
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    21
};
14188
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14169
diff changeset
    22
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    23
#[repr(C)]
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    24
#[derive(Copy, Clone)]
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    25
pub struct PreviewInfo {
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    26
    width: u32,
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    27
    height: u32,
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    28
    hedgehogs_number: u8,
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    29
    land: *const u8,
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    30
}
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    31
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    32
#[no_mangle]
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    33
pub extern "C" fn protocol_version() -> u32 {
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    34
    56
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    35
}
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    36
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    37
#[no_mangle]
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    38
pub extern "C" fn start_engine() -> *mut EngineInstance {
14271
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    39
    let engine_state = Box::new(EngineInstance::new());
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    40
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    41
    Box::leak(engine_state)
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    42
}
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    43
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    44
#[no_mangle]
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    45
pub extern "C" fn generate_preview(engine_state: &mut EngineInstance, preview: &mut PreviewInfo) {
14272
3152d9fdb499 - Move EngineInstance into a separate module
unC0Rr
parents: 14271
diff changeset
    46
    (*engine_state).process_ipc_queue();
3152d9fdb499 - Move EngineInstance into a separate module
unC0Rr
parents: 14271
diff changeset
    47
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    48
    (*engine_state).world.generate_preview();
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    49
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    50
    let land_preview = (*engine_state).world.preview();
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    51
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    52
    *preview = PreviewInfo {
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    53
        width: land_preview.width() as u32,
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    54
        height: land_preview.height() as u32,
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    55
        hedgehogs_number: 0,
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    56
        land: land_preview.raw_pixels().as_ptr(),
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    57
    };
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    58
}
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    59
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    60
#[no_mangle]
14272
3152d9fdb499 - Move EngineInstance into a separate module
unC0Rr
parents: 14271
diff changeset
    61
pub extern "C" fn send_ipc(engine_state: &mut EngineInstance, buf: *const u8, size: usize) {
14271
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    62
    unsafe {
14272
3152d9fdb499 - Move EngineInstance into a separate module
unC0Rr
parents: 14271
diff changeset
    63
        (*engine_state).ipc.write(std::slice::from_raw_parts(buf, size)).unwrap();
14271
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    64
    }
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    65
}
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    66
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    67
#[no_mangle]
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    68
pub extern "C" fn read_ipc(
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    69
    engine_state: &mut EngineInstance,
14272
3152d9fdb499 - Move EngineInstance into a separate module
unC0Rr
parents: 14271
diff changeset
    70
    buf: *mut u8,
14271
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    71
    size: usize,
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    72
) -> usize {
14272
3152d9fdb499 - Move EngineInstance into a separate module
unC0Rr
parents: 14271
diff changeset
    73
    unsafe { (*engine_state).ipc.read(std::slice::from_raw_parts_mut(buf, size)).unwrap_or(0) }
14271
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    74
}
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    75
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    76
#[no_mangle]
14293
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    77
pub extern "C" fn setup_current_gl_context(
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    78
    engine_state: &mut EngineInstance,
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    79
    width: u16,
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    80
    height: u16,
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    81
    gl_loader: extern "C" fn (*const c_char) -> *const c_void
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    82
) {
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    83
    let (device, mut factory) = gfx_gl::create(|name| {
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    84
        let c_name = CString::new(name).unwrap();
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    85
        gl_loader(c_name.as_ptr())
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    86
    });
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    87
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    88
    let dimensions = (width, height, 1u16, gfx::texture::AaMode::Single);
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    89
    let (render_target, depth_buffer) = gfx_gl::create_main_targets_raw(
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    90
        dimensions,
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    91
        gfx::format::Rgba8::get_format().0,
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    92
        gfx::format::Depth::get_format().0
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    93
    );
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    94
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    95
    let mut command_buffer: Encoder<_, _> = factory.create_command_buffer().into();
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    96
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    97
    engine_state.gl_context = Some(EngineGlContext {
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    98
        device,
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    99
        factory,
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   100
        render_target: gfx::memory::Typed::new(render_target),
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   101
        depth_buffer: gfx::memory::Typed::new(depth_buffer),
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   102
        command_buffer
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   103
    })
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   104
}
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   105
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   106
#[no_mangle]
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   107
pub extern "C" fn render_frame(engine_state: &mut EngineInstance) {
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   108
    let mut context = replace(&mut engine_state.gl_context, None);
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   109
    if let Some(ref mut c) = context {
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   110
        engine_state.render(&mut c.command_buffer, &mut c.render_target)
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   111
    }
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   112
    replace(&mut engine_state.gl_context, context);
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   113
}
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   114
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
   115
#[no_mangle]
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
   116
pub extern "C" fn cleanup(engine_state: *mut EngineInstance) {
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
   117
    unsafe {
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
   118
        Box::from_raw(engine_state);
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
   119
    }
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
   120
}