# HG changeset patch # User unc0rr # Date 1543181569 -3600 # Node ID 21be7838a127dfa6160653e66ffec81e01444ad0 # Parent b8871dd33ec4d7711813c68e15be39fe7e01f4bd Add advance_simulation() function to engine lib, some WIP on frontend diff -r b8871dd33ec4 -r 21be7838a127 qmlfrontend/Page1.qml --- a/qmlfrontend/Page1.qml Sun Nov 25 05:52:06 2018 +0300 +++ b/qmlfrontend/Page1.qml Sun Nov 25 22:32:49 2018 +0100 @@ -3,8 +3,7 @@ Page1Form { tickButton.onClicked: { - - // item1.tick(100) + gameView.tick(100) } gameButton.onClicked: { HWEngine.runQuickGame() diff -r b8871dd33ec4 -r 21be7838a127 qmlfrontend/Page1Form.ui.qml --- a/qmlfrontend/Page1Form.ui.qml Sun Nov 25 05:52:06 2018 +0300 +++ b/qmlfrontend/Page1Form.ui.qml Sun Nov 25 22:32:49 2018 +0100 @@ -11,8 +11,8 @@ width: 1024 height: 800 property alias tickButton: tickButton + property alias gameView: gameView - //property alias item1: item1 ColumnLayout { anchors.fill: parent @@ -73,13 +73,11 @@ } } } - /* - GameView { - id: item1 - x: 8 - y: 154 - width: 1008 - height: 638 - } - */ + GameView { + id: gameView + x: 8 + y: 154 + width: 1008 + height: 638 + } } diff -r b8871dd33ec4 -r 21be7838a127 qmlfrontend/engine_instance.cpp --- a/qmlfrontend/engine_instance.cpp Sun Nov 25 05:52:06 2018 +0300 +++ b/qmlfrontend/engine_instance.cpp Sun Nov 25 22:32:49 2018 +0100 @@ -1,5 +1,7 @@ #include "engine_instance.h" +extern "C" void (*getProcAddress())(const char* fn) { return nullptr; } + EngineInstance::EngineInstance(QObject* parent) : QObject(parent), m_instance(Engine::start_engine()) {} @@ -16,7 +18,9 @@ void EngineInstance::renderFrame() {} -void EngineInstance::setOpenGLContext(QOpenGLContext* context) {} +void EngineInstance::setOpenGLContext(QOpenGLContext* context) { + Engine::setup_current_gl_context(m_instance, 0, 0, &getProcAddress); +} Engine::PreviewInfo EngineInstance::generatePreview() { Engine::PreviewInfo pinfo; diff -r b8871dd33ec4 -r 21be7838a127 qmlfrontend/engine_interface.h --- a/qmlfrontend/engine_interface.h Sun Nov 25 05:52:06 2018 +0300 +++ b/qmlfrontend/engine_interface.h Sun Nov 25 22:32:49 2018 +0100 @@ -29,6 +29,13 @@ typedef size_t read_ipc_t(EngineInstance* engine_state, uint8_t* buf, size_t size); +typedef void setup_current_gl_context_t(EngineInstance* engine_state, + uint16_t width, uint16_t height, + void (*())(const char*)); +typedef void render_frame_t(EngineInstance* engine_state); + +typedef bool advance_simulation_t(EngineInstance* engine_state, uint32_t ticks); + extern protocol_version_t* protocol_version; extern start_engine_t* start_engine; extern generate_preview_t* generate_preview; @@ -37,6 +44,10 @@ extern send_ipc_t* send_ipc; extern read_ipc_t* read_ipc; +extern setup_current_gl_context_t* setup_current_gl_context; +extern render_frame_t* render_frame; +extern advance_simulation_t* advance_simulation; + #ifdef __cplusplus } }; diff -r b8871dd33ec4 -r 21be7838a127 qmlfrontend/hwengine.cpp --- a/qmlfrontend/hwengine.cpp Sun Nov 25 05:52:06 2018 +0300 +++ b/qmlfrontend/hwengine.cpp Sun Nov 25 22:32:49 2018 +0100 @@ -5,6 +5,7 @@ #include "engine_instance.h" #include "engine_interface.h" +#include "game_view.h" #include "preview_image_provider.h" #include "hwengine.h" @@ -30,7 +31,7 @@ qDebug("HWEngine::exposeToQML"); qmlRegisterSingletonType("Hedgewars.Engine", 1, 0, "HWEngine", hwengine_singletontype_provider); - // qmlRegisterType("Hedgewars.Engine", 1, 0, "GameView"); + qmlRegisterType("Hedgewars.Engine", 1, 0, "GameView"); } void HWEngine::getPreview() { diff -r b8871dd33ec4 -r 21be7838a127 qmlfrontend/main.cpp --- a/qmlfrontend/main.cpp Sun Nov 25 05:52:06 2018 +0300 +++ b/qmlfrontend/main.cpp Sun Nov 25 22:32:49 2018 +0100 @@ -13,6 +13,9 @@ cleanup_t* cleanup; send_ipc_t* send_ipc; read_ipc_t* read_ipc; +setup_current_gl_context_t* setup_current_gl_context; +render_frame_t* render_frame; +advance_simulation_t* advance_simulation; }; // namespace Engine void loadEngineLibrary() { @@ -39,6 +42,14 @@ Engine::read_ipc = reinterpret_cast(hwlib.resolve("read_ipc")); + Engine::setup_current_gl_context = + reinterpret_cast( + hwlib.resolve("setup_current_gl_context")); + Engine::render_frame = + reinterpret_cast(hwlib.resolve("render_frame")); + Engine::advance_simulation = reinterpret_cast( + hwlib.resolve("advance_simulation")); + if (Engine::protocol_version) qDebug() << "Loaded engine library with protocol version" << Engine::protocol_version(); diff -r b8871dd33ec4 -r 21be7838a127 rust/lib-hedgewars-engine/src/instance.rs --- a/rust/lib-hedgewars-engine/src/instance.rs Sun Nov 25 05:52:06 2018 +0300 +++ b/rust/lib-hedgewars-engine/src/instance.rs Sun Nov 25 22:32:49 2018 +0100 @@ -1,16 +1,11 @@ use hedgewars_engine_messages::messages::{ ConfigEngineMessage::*, EngineMessage::*, KeystrokeAction::*, SyncedEngineMessage::*, - UnorderedEngineMessage::*, UnsyncedEngineMessage::*, * + UnorderedEngineMessage::*, UnsyncedEngineMessage::*, *, }; -use gfx::{ - format::{R8_G8_B8_A8, D24, Unorm} -}; +use self::gfx_gl::{CommandBuffer, Resources}; +use gfx::format::{Unorm, D24, R8_G8_B8_A8}; use gfx_device_gl as gfx_gl; -use self::gfx_gl::{ - Resources, - CommandBuffer -}; use super::{ipc::IPC, world::World}; @@ -19,13 +14,13 @@ pub factory: gfx_gl::Factory, pub render_target: gfx::handle::RenderTargetView, pub depth_buffer: gfx::handle::DepthStencilView, - pub command_buffer: gfx::Encoder + pub command_buffer: gfx::Encoder, } pub struct EngineInstance { pub world: World, pub ipc: IPC, - pub gl_context: Option + pub gl_context: Option, } impl EngineInstance { @@ -34,7 +29,7 @@ Self { world, ipc: IPC::new(), - gl_context: None + gl_context: None, } } @@ -70,11 +65,11 @@ println!("Processing message: {:?}", message); match message { Unknown => println!("Unknown message"), - Empty => println!("Empty message") , + Empty => println!("Empty message"), Synced(_, _) => unimplemented!(), Unsynced(_) => unimplemented!(), Unordered(unordered_message) => self.process_unordered_message(&unordered_message), - Config(config_message) => self.process_config_message(&config_message) + Config(config_message) => self.process_config_message(&config_message), } } } diff -r b8871dd33ec4 -r 21be7838a127 rust/lib-hedgewars-engine/src/ipc.rs --- a/rust/lib-hedgewars-engine/src/ipc.rs Sun Nov 25 05:52:06 2018 +0300 +++ b/rust/lib-hedgewars-engine/src/ipc.rs Sun Nov 25 22:32:49 2018 +0100 @@ -19,7 +19,7 @@ self.out_buffer.write(&message.to_bytes()).unwrap(); } - pub fn iter(& mut self) -> IPCMessagesIterator { + pub fn iter(&mut self) -> IPCMessagesIterator { IPCMessagesIterator::new(self) } } @@ -45,14 +45,12 @@ } pub struct IPCMessagesIterator<'a> { - ipc: &'a mut IPC + ipc: &'a mut IPC, } impl<'a> IPCMessagesIterator<'a> { pub fn new(ipc: &'a mut IPC) -> Self { - Self { - ipc - } + Self { ipc } } } diff -r b8871dd33ec4 -r 21be7838a127 rust/lib-hedgewars-engine/src/lib.rs --- a/rust/lib-hedgewars-engine/src/lib.rs Sun Nov 25 05:52:06 2018 +0300 +++ b/rust/lib-hedgewars-engine/src/lib.rs Sun Nov 25 22:32:49 2018 +0100 @@ -1,24 +1,18 @@ +pub mod instance; mod ipc; mod world; -pub mod instance; +use gfx::{format::Formatted, Encoder}; use std::{ + ffi::CString, io::{Read, Write}, - ffi::{CString}, - os::raw::{c_void, c_char}, - mem::replace -}; -use gfx::{ - Encoder, - format::Formatted, + mem::replace, + os::raw::{c_char, c_void}, }; use gfx_device_gl as gfx_gl; -use self::instance::{ - EngineInstance, - EngineGlContext -}; +use self::instance::{EngineGlContext, EngineInstance}; #[repr(C)] #[derive(Copy, Clone)] @@ -60,17 +54,21 @@ #[no_mangle] pub extern "C" fn send_ipc(engine_state: &mut EngineInstance, buf: *const u8, size: usize) { unsafe { - (*engine_state).ipc.write(std::slice::from_raw_parts(buf, size)).unwrap(); + (*engine_state) + .ipc + .write(std::slice::from_raw_parts(buf, size)) + .unwrap(); } } #[no_mangle] -pub extern "C" fn read_ipc( - engine_state: &mut EngineInstance, - buf: *mut u8, - size: usize, -) -> usize { - unsafe { (*engine_state).ipc.read(std::slice::from_raw_parts_mut(buf, size)).unwrap_or(0) } +pub extern "C" fn read_ipc(engine_state: &mut EngineInstance, buf: *mut u8, size: usize) -> usize { + unsafe { + (*engine_state) + .ipc + .read(std::slice::from_raw_parts_mut(buf, size)) + .unwrap_or(0) + } } #[no_mangle] @@ -78,7 +76,7 @@ engine_state: &mut EngineInstance, width: u16, height: u16, - gl_loader: extern "C" fn (*const c_char) -> *const c_void + gl_loader: extern "C" fn(*const c_char) -> *const c_void, ) { let (device, mut factory) = gfx_gl::create(|name| { let c_name = CString::new(name).unwrap(); @@ -89,7 +87,7 @@ let (render_target, depth_buffer) = gfx_gl::create_main_targets_raw( dimensions, gfx::format::Rgba8::get_format().0, - gfx::format::Depth::get_format().0 + gfx::format::Depth::get_format().0, ); let mut command_buffer: Encoder<_, _> = factory.create_command_buffer().into(); @@ -99,7 +97,7 @@ factory, render_target: gfx::memory::Typed::new(render_target), depth_buffer: gfx::memory::Typed::new(depth_buffer), - command_buffer + command_buffer, }) } @@ -113,6 +111,10 @@ } #[no_mangle] +pub extern "C" fn advance_simulation(engine_state: &mut EngineInstance, ticks: u32) -> bool { + unimplemented!() +} +#[no_mangle] pub extern "C" fn cleanup(engine_state: *mut EngineInstance) { unsafe { Box::from_raw(engine_state);