author | unC0Rr |
Tue, 15 Nov 2022 14:27:22 +0100 | |
changeset 15921 | 5b3beb90e1a6 |
parent 15919 | d52f5d8e75e6 |
child 15954 | 9502611bffc1 |
child 16045 | 4933920eba89 |
permissions | -rw-r--r-- |
14315
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
1 |
pub mod instance; |
14725 | 2 |
pub mod ipc; |
14356 | 3 |
mod render; |
15797 | 4 |
mod time; |
14174
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
5 |
mod world; |
14292
1aac8a62be6f
Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents:
14276
diff
changeset
|
6 |
|
14314 | 7 |
use std::{ |
15919 | 8 |
ffi::{CString, CStr}, |
14314 | 9 |
io::{Read, Write}, |
14315
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
10 |
mem::replace, |
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
11 |
os::raw::{c_char, c_void}, |
15919 | 12 |
path::Path, |
14314 | 13 |
}; |
14292
1aac8a62be6f
Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents:
14276
diff
changeset
|
14 |
|
14734 | 15 |
use integral_geometry::Point; |
16 |
||
14726 | 17 |
use self::instance::EngineInstance; |
14209 | 18 |
|
14174
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
19 |
#[repr(C)] |
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
20 |
#[derive(Copy, Clone)] |
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
21 |
pub struct PreviewInfo { |
14164 | 22 |
width: u32, |
23 |
height: u32, |
|
24 |
hedgehogs_number: u8, |
|
25 |
land: *const u8, |
|
26 |
} |
|
27 |
||
14875
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
28 |
#[repr(C)] |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
29 |
#[derive(Debug, PartialEq, Clone)] |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
30 |
pub enum SimpleEventType { |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
31 |
SwitchHedgehog, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
32 |
Timer, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
33 |
LongJump, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
34 |
HighJump, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
35 |
Accept, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
36 |
Deny, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
37 |
} |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
38 |
|
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
39 |
#[repr(C)] |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
40 |
#[derive(Debug, PartialEq, Clone)] |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
41 |
pub enum LongEventType { |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
42 |
ArrowUp, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
43 |
ArrowDown, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
44 |
ArrowLeft, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
45 |
ArrowRight, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
46 |
Precision, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
47 |
Attack, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
48 |
} |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
49 |
|
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
50 |
#[repr(C)] |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
51 |
#[derive(Debug, PartialEq, Clone)] |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
52 |
pub enum LongEventState { |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
53 |
Set, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
54 |
Unset, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
55 |
} |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
56 |
|
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
57 |
#[repr(C)] |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
58 |
#[derive(Debug, PartialEq, Clone)] |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
59 |
pub enum PositionedEventType { |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
60 |
CursorMove, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
61 |
CursorClick, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
62 |
} |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
63 |
|
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
64 |
#[no_mangle] |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
65 |
pub extern "C" fn simple_event(engine_state: &mut EngineInstance, event_type: SimpleEventType) {} |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
66 |
|
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
67 |
#[no_mangle] |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
68 |
pub extern "C" fn long_event( |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
69 |
engine_state: &mut EngineInstance, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
70 |
event_type: LongEventType, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
71 |
state: LongEventState, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
72 |
) { |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
73 |
println!("{:?}: {:?}", event_type, state); |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
74 |
} |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
75 |
|
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
76 |
#[no_mangle] |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
77 |
pub extern "C" fn positioned_event( |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
78 |
engine_state: &mut EngineInstance, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
79 |
event_type: PositionedEventType, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
80 |
x: i32, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
81 |
y: i32, |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
82 |
) { |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
83 |
} |
aed75d439027
Implement external events approach to input user actions into engine.
unc0rr
parents:
14734
diff
changeset
|
84 |
|
14164 | 85 |
#[no_mangle] |
14391
ef2fc0210362
Rename protocol_version to hedgewars_engine_protocol_version to ensure use of correct library
unC0Rr
parents:
14356
diff
changeset
|
86 |
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:
14356
diff
changeset
|
87 |
58 |
14164 | 88 |
} |
89 |
||
90 |
#[no_mangle] |
|
15919 | 91 |
pub extern "C" fn start_engine(data_path: *const i8) -> *mut EngineInstance { |
92 |
let data_path: &str = unsafe { CStr::from_ptr(data_path) }.to_str().unwrap(); |
|
93 |
||
94 |
let engine_state = Box::new(EngineInstance::new(Path::new(&data_path))); |
|
14174
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
95 |
|
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
96 |
Box::leak(engine_state) |
14164 | 97 |
} |
14174
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
98 |
|
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
99 |
#[no_mangle] |
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
100 |
pub extern "C" fn generate_preview(engine_state: &mut EngineInstance, preview: &mut PreviewInfo) { |
14293 | 101 |
(*engine_state).process_ipc_queue(); |
102 |
||
14174
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
103 |
(*engine_state).world.generate_preview(); |
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
104 |
|
14394
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14391
diff
changeset
|
105 |
if let Some(land_preview) = (*engine_state).world.preview() { |
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14391
diff
changeset
|
106 |
*preview = PreviewInfo { |
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14391
diff
changeset
|
107 |
width: land_preview.width() as u32, |
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14391
diff
changeset
|
108 |
height: land_preview.height() as u32, |
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14391
diff
changeset
|
109 |
hedgehogs_number: 0, |
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14391
diff
changeset
|
110 |
land: land_preview.raw_pixels().as_ptr(), |
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14391
diff
changeset
|
111 |
}; |
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14391
diff
changeset
|
112 |
} |
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14391
diff
changeset
|
113 |
} |
14174
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
114 |
|
14394
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14391
diff
changeset
|
115 |
#[no_mangle] |
15921
5b3beb90e1a6
Implement generation of c header from rust interface, adapt qmlfrontend
unC0Rr
parents:
15919
diff
changeset
|
116 |
pub extern "C" fn dispose_preview(engine_state: &mut EngineInstance) { |
14394
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14391
diff
changeset
|
117 |
(*engine_state).world.dispose_preview(); |
14174
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
118 |
} |
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
119 |
|
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
120 |
#[no_mangle] |
14293 | 121 |
pub extern "C" fn send_ipc(engine_state: &mut EngineInstance, buf: *const u8, size: usize) { |
14292
1aac8a62be6f
Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents:
14276
diff
changeset
|
122 |
unsafe { |
14315
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
123 |
(*engine_state) |
15286
07e909ba4203
Implement ipc queue which takes care of message ordering and timestamps
unC0Rr
parents:
14875
diff
changeset
|
124 |
.ipc_channel |
14315
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
125 |
.write(std::slice::from_raw_parts(buf, size)) |
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
126 |
.unwrap(); |
14292
1aac8a62be6f
Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents:
14276
diff
changeset
|
127 |
} |
1aac8a62be6f
Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents:
14276
diff
changeset
|
128 |
} |
1aac8a62be6f
Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents:
14276
diff
changeset
|
129 |
|
1aac8a62be6f
Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents:
14276
diff
changeset
|
130 |
#[no_mangle] |
14315
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
131 |
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:
14314
diff
changeset
|
132 |
unsafe { |
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
133 |
(*engine_state) |
15286
07e909ba4203
Implement ipc queue which takes care of message ordering and timestamps
unC0Rr
parents:
14875
diff
changeset
|
134 |
.ipc_channel |
14315
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
135 |
.read(std::slice::from_raw_parts_mut(buf, size)) |
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
136 |
.unwrap_or(0) |
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
137 |
} |
14292
1aac8a62be6f
Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents:
14276
diff
changeset
|
138 |
} |
1aac8a62be6f
Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents:
14276
diff
changeset
|
139 |
|
1aac8a62be6f
Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents:
14276
diff
changeset
|
140 |
#[no_mangle] |
14314 | 141 |
pub extern "C" fn setup_current_gl_context( |
142 |
engine_state: &mut EngineInstance, |
|
143 |
width: u16, |
|
144 |
height: u16, |
|
15921
5b3beb90e1a6
Implement generation of c header from rust interface, adapt qmlfrontend
unC0Rr
parents:
15919
diff
changeset
|
145 |
gl_loader: extern "C" fn(*const c_char) -> *mut c_void, |
14314 | 146 |
) { |
14727 | 147 |
gl::load_with(|name| { |
148 |
let c_name = CString::new(name).unwrap(); |
|
149 |
gl_loader(c_name.as_ptr()) |
|
150 |
}); |
|
14728 | 151 |
unsafe { |
152 |
gl::Viewport(0, 0, width as i32, height as i32); |
|
153 |
} |
|
14726 | 154 |
engine_state.world.create_renderer(width, height); |
14314 | 155 |
} |
156 |
||
157 |
#[no_mangle] |
|
158 |
pub extern "C" fn render_frame(engine_state: &mut EngineInstance) { |
|
14728 | 159 |
engine_state.render() |
14314 | 160 |
} |
161 |
||
162 |
#[no_mangle] |
|
14315
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
163 |
pub extern "C" fn advance_simulation(engine_state: &mut EngineInstance, ticks: u32) -> bool { |
14316 | 164 |
engine_state.world.step(); |
165 |
true |
|
14315
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
166 |
} |
14734 | 167 |
|
168 |
#[no_mangle] |
|
169 |
pub extern "C" fn move_camera(engine_state: &mut EngineInstance, delta_x: i32, delta_y: i32) { |
|
170 |
engine_state |
|
171 |
.world |
|
172 |
.move_camera(Point::new(delta_x, delta_y), 0.0); |
|
173 |
} |
|
174 |
||
14315
21be7838a127
Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents:
14314
diff
changeset
|
175 |
#[no_mangle] |
14174
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
176 |
pub extern "C" fn cleanup(engine_state: *mut EngineInstance) { |
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
177 |
unsafe { |
15921
5b3beb90e1a6
Implement generation of c header from rust interface, adapt qmlfrontend
unC0Rr
parents:
15919
diff
changeset
|
178 |
drop(Box::from_raw(engine_state)); |
14174
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
179 |
} |
b273b43b16d2
Make hedgewars-engine crate produce shared library, implement some basics
unC0Rr
parents:
14164
diff
changeset
|
180 |
} |