# HG changeset patch # User unC0Rr # Date 1542880735 -3600 # Node ID 1aac8a62be6f730d2fa484c51457decbcb2cd946 # Parent efa901b04badbd2c4cc09d502983a9bb42864318 Implement send_ipc and read_ipc in engine lib, send_ipc in frontend diff -r efa901b04bad -r 1aac8a62be6f qmlfrontend/engine_instance.cpp --- a/qmlfrontend/engine_instance.cpp Thu Nov 22 00:49:55 2018 +0300 +++ b/qmlfrontend/engine_instance.cpp Thu Nov 22 10:58:55 2018 +0100 @@ -5,6 +5,13 @@ EngineInstance::~EngineInstance() { Engine::cleanup(m_instance); } +void EngineInstance::sendConfig(const GameConfig &config) { + for (auto b : config.config()) { + Engine::send_ipc(m_instance, reinterpret_cast(b.data()), + static_cast(b.size())); + } +} + Engine::PreviewInfo EngineInstance::generatePreview() { Engine::PreviewInfo pinfo; diff -r efa901b04bad -r 1aac8a62be6f qmlfrontend/engine_instance.h --- a/qmlfrontend/engine_instance.h Thu Nov 22 00:49:55 2018 +0300 +++ b/qmlfrontend/engine_instance.h Thu Nov 22 10:58:55 2018 +0100 @@ -5,12 +5,15 @@ #include +#include "game_config.h" + class EngineInstance : public QObject { Q_OBJECT public: explicit EngineInstance(QObject *parent = nullptr); ~EngineInstance(); + void sendConfig(const GameConfig &config); Engine::PreviewInfo generatePreview(); signals: diff -r efa901b04bad -r 1aac8a62be6f qmlfrontend/engine_interface.h --- a/qmlfrontend/engine_interface.h Thu Nov 22 00:49:55 2018 +0300 +++ b/qmlfrontend/engine_interface.h Thu Nov 22 10:58:55 2018 +0100 @@ -1,6 +1,7 @@ #ifndef ENGINE_H #define ENGINE_H +#include #include #ifdef __cplusplus @@ -23,11 +24,19 @@ PreviewInfo* preview); typedef void cleanup_t(EngineInstance* engine_state); +typedef void send_ipc_t(EngineInstance* engine_state, uint8_t* buf, + size_t size); +typedef size_t read_ipc_t(EngineInstance* engine_state, uint8_t* buf, + size_t size); + extern protocol_version_t* protocol_version; extern start_engine_t* start_engine; extern generate_preview_t* generate_preview; extern cleanup_t* cleanup; +extern send_ipc_t* send_ipc; +extern read_ipc_t* read_ipc; + #ifdef __cplusplus } }; diff -r efa901b04bad -r 1aac8a62be6f qmlfrontend/hwengine.cpp --- a/qmlfrontend/hwengine.cpp Thu Nov 22 00:49:55 2018 +0300 +++ b/qmlfrontend/hwengine.cpp Thu Nov 22 10:58:55 2018 +0100 @@ -5,7 +5,6 @@ #include "engine_instance.h" #include "engine_interface.h" -#include "game_view.h" #include "preview_image_provider.h" #include "hwengine.h" @@ -40,6 +39,8 @@ m_gameConfig.setPreview(true); EngineInstance engine; + engine.sendConfig(m_gameConfig); + Engine::PreviewInfo preview = engine.generatePreview(); QVector colorTable; diff -r efa901b04bad -r 1aac8a62be6f qmlfrontend/main.cpp --- a/qmlfrontend/main.cpp Thu Nov 22 00:49:55 2018 +0300 +++ b/qmlfrontend/main.cpp Thu Nov 22 10:58:55 2018 +0100 @@ -11,6 +11,8 @@ start_engine_t* start_engine; generate_preview_t* generate_preview; cleanup_t* cleanup; +send_ipc_t* send_ipc; +read_ipc_t* read_ipc; }; // namespace Engine void loadEngineLibrary() { @@ -32,6 +34,11 @@ Engine::cleanup = reinterpret_cast(hwlib.resolve("cleanup")); + Engine::send_ipc = + reinterpret_cast(hwlib.resolve("send_ipc")); + Engine::read_ipc = + reinterpret_cast(hwlib.resolve("read_ipc")); + if (Engine::protocol_version) qDebug() << "Loaded engine library with protocol version" << Engine::protocol_version(); diff -r efa901b04bad -r 1aac8a62be6f rust/lib-hedgewars-engine/src/lib.rs --- a/rust/lib-hedgewars-engine/src/lib.rs Thu Nov 22 00:49:55 2018 +0300 +++ b/rust/lib-hedgewars-engine/src/lib.rs Thu Nov 22 10:58:55 2018 +0100 @@ -1,23 +1,32 @@ +mod ipc; mod world; -mod ipc; + +use std::io::{Read, Write}; + +use self::ipc::IPC; #[repr(C)] pub struct EngineInstance { world: world::World, + ipc: IPC, } impl EngineInstance { pub fn new() -> Self { let world = world::World::new(); - Self { world } + Self { + world, + ipc: IPC::new(), + } } pub fn render( &self, context: &mut gfx::Encoder, - target: &gfx::handle::RenderTargetView) - where R: gfx::Resources, - C: gfx::CommandBuffer + target: &gfx::handle::RenderTargetView, + ) where + R: gfx::Resources, + C: gfx::CommandBuffer, { context.clear(target, [0.0, 0.5, 0.0, 1.0]); } @@ -39,9 +48,7 @@ #[no_mangle] pub extern "C" fn start_engine() -> *mut EngineInstance { - let engine_state = Box::new(EngineInstance { - world: world::World::new(), - }); + let engine_state = Box::new(EngineInstance::new()); Box::leak(engine_state) } @@ -61,6 +68,22 @@ } #[no_mangle] +pub extern "C" fn send_ipc(engine_state: &mut EngineInstance, buf: *const [u8], size: usize) { + unsafe { + (*engine_state).ipc.write(&(*buf)[0..size]); + } +} + +#[no_mangle] +pub extern "C" fn read_ipc( + engine_state: &mut EngineInstance, + buf: *mut [u8], + size: usize, +) -> usize { + unsafe { (*engine_state).ipc.read(&mut (*buf)[0..size]).unwrap_or(0) } +} + +#[no_mangle] pub extern "C" fn cleanup(engine_state: *mut EngineInstance) { unsafe { Box::from_raw(engine_state);