rust/lib-hedgewars-engine/src/lib.rs
author alfadur
Fri, 22 Mar 2019 20:37:21 +0300
changeset 14706 88b0efba77b9
parent 14705 19122a329774
child 14707 5237b4c44d11
permissions -rw-r--r--
init gl in frontend interface
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
     1
pub mod instance;
14704
12db7e435ea6 move camera into engine
alfadur
parents: 14702
diff changeset
     2
pub mod ipc;
14335
97be4f6bf264 add render module 🦔
alfadur
parents: 14295
diff changeset
     3
mod render;
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
     4
mod world;
14271
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
     5
14293
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
     6
use std::{
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
     7
    ffi::CString,
14293
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
     8
    io::{Read, Write},
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
     9
    mem::replace,
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    10
    os::raw::{c_char, c_void},
14293
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    11
};
14271
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    12
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    13
use self::instance::EngineInstance;
14188
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14169
diff changeset
    14
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    15
#[repr(C)]
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    16
#[derive(Copy, Clone)]
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    17
pub struct PreviewInfo {
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    18
    width: u32,
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    19
    height: u32,
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    20
    hedgehogs_number: u8,
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    21
    land: *const u8,
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    22
}
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    23
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    24
#[no_mangle]
14370
ef2fc0210362 Rename protocol_version to hedgewars_engine_protocol_version to ensure use of correct library
unC0Rr
parents: 14335
diff changeset
    25
pub extern "C" fn hedgewars_engine_protocol_version() -> u32 {
ef2fc0210362 Rename protocol_version to hedgewars_engine_protocol_version to ensure use of correct library
unC0Rr
parents: 14335
diff changeset
    26
    58
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    27
}
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    28
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    29
#[no_mangle]
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    30
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
    31
    let engine_state = Box::new(EngineInstance::new());
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    32
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    33
    Box::leak(engine_state)
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    34
}
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    35
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    36
#[no_mangle]
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    37
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
    38
    (*engine_state).process_ipc_queue();
3152d9fdb499 - Move EngineInstance into a separate module
unC0Rr
parents: 14271
diff changeset
    39
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    40
    (*engine_state).world.generate_preview();
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    41
14373
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14370
diff changeset
    42
    if let Some(land_preview) = (*engine_state).world.preview() {
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14370
diff changeset
    43
        *preview = PreviewInfo {
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14370
diff changeset
    44
            width: land_preview.width() as u32,
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14370
diff changeset
    45
            height: land_preview.height() as u32,
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14370
diff changeset
    46
            hedgehogs_number: 0,
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14370
diff changeset
    47
            land: land_preview.raw_pixels().as_ptr(),
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14370
diff changeset
    48
        };
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14370
diff changeset
    49
    }
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14370
diff changeset
    50
}
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    51
14373
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14370
diff changeset
    52
#[no_mangle]
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14370
diff changeset
    53
pub extern "C" fn dispose_preview(engine_state: &mut EngineInstance, preview: &mut PreviewInfo) {
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14370
diff changeset
    54
    (*engine_state).world.dispose_preview();
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    55
}
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    56
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
    57
#[no_mangle]
14272
3152d9fdb499 - Move EngineInstance into a separate module
unC0Rr
parents: 14271
diff changeset
    58
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
    59
    unsafe {
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    60
        (*engine_state)
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    61
            .ipc
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    62
            .write(std::slice::from_raw_parts(buf, size))
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    63
            .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]
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    68
pub extern "C" fn read_ipc(engine_state: &mut EngineInstance, buf: *mut u8, size: usize) -> usize {
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    69
    unsafe {
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    70
        (*engine_state)
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    71
            .ipc
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    72
            .read(std::slice::from_raw_parts_mut(buf, size))
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    73
            .unwrap_or(0)
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    74
    }
14271
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
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14255
diff changeset
    77
#[no_mangle]
14293
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    78
pub extern "C" fn setup_current_gl_context(
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    79
    engine_state: &mut EngineInstance,
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    80
    width: u16,
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    81
    height: u16,
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    82
    gl_loader: extern "C" fn(*const c_char) -> *const c_void,
14293
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    83
) {
14706
88b0efba77b9 init gl in frontend interface
alfadur
parents: 14705
diff changeset
    84
    gl::load_with(|name| {
88b0efba77b9 init gl in frontend interface
alfadur
parents: 14705
diff changeset
    85
        let c_name = CString::new(name).unwrap();
88b0efba77b9 init gl in frontend interface
alfadur
parents: 14705
diff changeset
    86
        gl_loader(c_name.as_ptr())
88b0efba77b9 init gl in frontend interface
alfadur
parents: 14705
diff changeset
    87
    });
88b0efba77b9 init gl in frontend interface
alfadur
parents: 14705
diff changeset
    88
    unsafe { gl::Viewport(0, 0, width as i32, height as i32); }
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    89
    engine_state.world.create_renderer(width, height);
14293
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    90
}
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    91
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    92
#[no_mangle]
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    93
pub extern "C" fn render_frame(engine_state: &mut EngineInstance) {
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14373
diff changeset
    94
    //engine_state.render()
14293
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    95
}
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    96
b8871dd33ec4 add gfx setup ffi
alfadur
parents: 14272
diff changeset
    97
#[no_mangle]
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
    98
pub extern "C" fn advance_simulation(engine_state: &mut EngineInstance, ticks: u32) -> bool {
14295
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14294
diff changeset
    99
    engine_state.world.step();
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14294
diff changeset
   100
    true
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
   101
}
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14293
diff changeset
   102
#[no_mangle]
14153
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
   103
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
   104
    unsafe {
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
   105
        Box::from_raw(engine_state);
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
   106
    }
b273b43b16d2 Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents: 14143
diff changeset
   107
}