# HG changeset patch # User unc0rr # Date 1541624657 -3600 # Node ID 7d3b94cdc3c459dc68518bb1f69b6a75733376ac # Parent 8d9e3af8abce5fedd19753f16179b52352332cca - Move hedgewars-engine into lib-hedgewars-engine - Add command-line hedgewars-engine utility to use engine as standalone app diff -r 8d9e3af8abce -r 7d3b94cdc3c4 rust/hedgewars-engine/Cargo.toml --- a/rust/hedgewars-engine/Cargo.toml Wed Nov 07 15:18:09 2018 -0500 +++ b/rust/hedgewars-engine/Cargo.toml Wed Nov 07 22:04:17 2018 +0100 @@ -2,13 +2,9 @@ name = "hedgewars-engine" version = "0.1.0" authors = ["Andrey Korotaev "] +edition = "2018" [dependencies] -land2d = { path = "../land2d" } -lfprng = { path = "../lfprng" } -integral-geometry = { path = "../integral-geometry" } -landgen = { path = "../landgen" } +lib-hedgewars-engine = { path = "../lib-hedgewars-engine" } +libloading = "0.5.0" -[lib] -name = "hedgewars_engine" -crate-type = ["dylib"] diff -r 8d9e3af8abce -r 7d3b94cdc3c4 rust/hedgewars-engine/src/lib.rs --- a/rust/hedgewars-engine/src/lib.rs Wed Nov 07 15:18:09 2018 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -extern crate integral_geometry; -extern crate land2d; -extern crate landgen; -extern crate lfprng; - -mod world; - -#[repr(C)] -pub struct EngineInstance { - world: world::World, -} - -#[repr(C)] -#[derive(Copy, Clone)] -pub struct PreviewInfo { - width: u32, - height: u32, - hedgehogs_number: u8, - land: *const u8, -} - -#[no_mangle] -pub extern "C" fn protocol_version() -> u32 { - 56 -} - -#[no_mangle] -pub extern "C" fn start_engine() -> *mut EngineInstance { - let engine_state = Box::new(EngineInstance { - world: world::World::new(), - }); - - Box::leak(engine_state) -} - -#[no_mangle] -pub extern "C" fn generate_preview(engine_state: &mut EngineInstance, preview: &mut PreviewInfo) { - (*engine_state).world.generate_preview(); - - let land_preview = (*engine_state).world.preview(); - - *preview = PreviewInfo { - width: land_preview.width() as u32, - height: land_preview.height() as u32, - hedgehogs_number: 0, - land: land_preview.raw_pixels().as_ptr(), - }; -} - -#[no_mangle] -pub extern "C" fn cleanup(engine_state: *mut EngineInstance) { - unsafe { - Box::from_raw(engine_state); - } -} diff -r 8d9e3af8abce -r 7d3b94cdc3c4 rust/hedgewars-engine/src/main.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/hedgewars-engine/src/main.rs Wed Nov 07 22:04:17 2018 +0100 @@ -0,0 +1,26 @@ +extern crate libloading; + +use libloading::{Library, Symbol}; +use std::ops::Deref; + +struct EngineInstance {} + +struct Engine<'a> { + protocol_version: Symbol<'a, unsafe fn() -> u32>, + start_engine: Symbol<'a, unsafe fn() -> *mut EngineInstance>, + cleanup: Symbol<'a, unsafe fn(engine_state: *mut EngineInstance)>, +} + +fn main() { + let hwlib = Library::new("libhedgewars_engine.so").unwrap(); + + unsafe { + let engine = Engine { + protocol_version: hwlib.get(b"protocol_version").unwrap(), + start_engine: hwlib.get(b"start_engine").unwrap(), + cleanup: hwlib.get(b"cleanup").unwrap(), + }; + + println!("Hedgewars engine, protocol version {}", engine.protocol_version.deref()()); + } +} diff -r 8d9e3af8abce -r 7d3b94cdc3c4 rust/hedgewars-engine/src/world.rs --- a/rust/hedgewars-engine/src/world.rs Wed Nov 07 15:18:09 2018 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -use integral_geometry::{Point, Rect, Size}; -use land2d::Land2D; -use landgen::{ - outline_template::OutlineTemplate, template_based::TemplatedLandGenerator, - LandGenerationParameters, LandGenerator, -}; -use lfprng::LaggedFibonacciPRNG; - -pub struct World { - random_numbers_gen: LaggedFibonacciPRNG, - preview: Land2D, -} - -impl World { - pub fn new() -> Self { - Self { - random_numbers_gen: LaggedFibonacciPRNG::new(&[]), - preview: Land2D::new(Size::new(0, 0), 0), - } - } - - pub fn preview(&self) -> &Land2D { - &self.preview - } - - pub fn generate_preview(&mut self) { - fn template() -> OutlineTemplate { - let mut template = OutlineTemplate::new(Size::new(4096, 2048)); - template.islands = vec![vec![ - Rect::from_size_coords(100, 2050, 1, 1), - Rect::from_size_coords(100, 500, 400, 1200), - Rect::from_size_coords(3600, 500, 400, 1200), - Rect::from_size_coords(3900, 2050, 1, 1), - ]]; - template.fill_points = vec![Point::new(1, 0)]; - - template - } - - let params = LandGenerationParameters::new(0 as u8, 255, 5, false, false); - let landgen = TemplatedLandGenerator::new(template()); - self.preview = landgen.generate_land(¶ms, &mut self.random_numbers_gen); - } -} diff -r 8d9e3af8abce -r 7d3b94cdc3c4 rust/lib-hedgewars-engine/Cargo.toml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/lib-hedgewars-engine/Cargo.toml Wed Nov 07 22:04:17 2018 +0100 @@ -0,0 +1,14 @@ +[package] +name = "lib-hedgewars-engine" +version = "0.1.0" +authors = ["Andrey Korotaev "] + +[dependencies] +land2d = { path = "../land2d" } +lfprng = { path = "../lfprng" } +integral-geometry = { path = "../integral-geometry" } +landgen = { path = "../landgen" } + +[lib] +name = "hedgewars_engine" +crate-type = ["dylib"] diff -r 8d9e3af8abce -r 7d3b94cdc3c4 rust/lib-hedgewars-engine/src/lib.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/lib-hedgewars-engine/src/lib.rs Wed Nov 07 22:04:17 2018 +0100 @@ -0,0 +1,55 @@ +extern crate integral_geometry; +extern crate land2d; +extern crate landgen; +extern crate lfprng; + +mod world; + +#[repr(C)] +pub struct EngineInstance { + world: world::World, +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub struct PreviewInfo { + width: u32, + height: u32, + hedgehogs_number: u8, + land: *const u8, +} + +#[no_mangle] +pub extern "C" fn protocol_version() -> u32 { + 56 +} + +#[no_mangle] +pub extern "C" fn start_engine() -> *mut EngineInstance { + let engine_state = Box::new(EngineInstance { + world: world::World::new(), + }); + + Box::leak(engine_state) +} + +#[no_mangle] +pub extern "C" fn generate_preview(engine_state: &mut EngineInstance, preview: &mut PreviewInfo) { + (*engine_state).world.generate_preview(); + + let land_preview = (*engine_state).world.preview(); + + *preview = PreviewInfo { + width: land_preview.width() as u32, + height: land_preview.height() as u32, + hedgehogs_number: 0, + land: land_preview.raw_pixels().as_ptr(), + }; +} + +#[no_mangle] +pub extern "C" fn cleanup(engine_state: *mut EngineInstance) { + unsafe { + Box::from_raw(engine_state); + } +} diff -r 8d9e3af8abce -r 7d3b94cdc3c4 rust/lib-hedgewars-engine/src/world.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/lib-hedgewars-engine/src/world.rs Wed Nov 07 22:04:17 2018 +0100 @@ -0,0 +1,44 @@ +use integral_geometry::{Point, Rect, Size}; +use land2d::Land2D; +use landgen::{ + outline_template::OutlineTemplate, template_based::TemplatedLandGenerator, + LandGenerationParameters, LandGenerator, +}; +use lfprng::LaggedFibonacciPRNG; + +pub struct World { + random_numbers_gen: LaggedFibonacciPRNG, + preview: Land2D, +} + +impl World { + pub fn new() -> Self { + Self { + random_numbers_gen: LaggedFibonacciPRNG::new(&[]), + preview: Land2D::new(Size::new(0, 0), 0), + } + } + + pub fn preview(&self) -> &Land2D { + &self.preview + } + + pub fn generate_preview(&mut self) { + fn template() -> OutlineTemplate { + let mut template = OutlineTemplate::new(Size::new(4096, 2048)); + template.islands = vec![vec![ + Rect::from_size_coords(100, 2050, 1, 1), + Rect::from_size_coords(100, 500, 400, 1200), + Rect::from_size_coords(3600, 500, 400, 1200), + Rect::from_size_coords(3900, 2050, 1, 1), + ]]; + template.fill_points = vec![Point::new(1, 0)]; + + template + } + + let params = LandGenerationParameters::new(0 as u8, 255, 5, false, false); + let landgen = TemplatedLandGenerator::new(template()); + self.preview = landgen.generate_land(¶ms, &mut self.random_numbers_gen); + } +}