diff --git a/deerith_engine_client/include/deerith/universe.h b/deerith_engine_client/include/deerith/universe.h deleted file mode 100644 index 92719c3..0000000 --- a/deerith_engine_client/include/deerith/universe.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once -#include - -namespace deerith -{ - bool connect_to_universe(const char *address, int port); - void shutdown_universe(); - - bool is_universe_running(); - void render_universe(); -} \ No newline at end of file diff --git a/deerith_engine_client/include/deerith/world.h b/deerith_engine_client/include/deerith/world.h new file mode 100644 index 0000000..ed8842b --- /dev/null +++ b/deerith_engine_client/include/deerith/world.h @@ -0,0 +1,15 @@ +#pragma once +#include + +namespace deerith +{ + struct client_t; + + bool connect_to_world(const char *address, int port); + void shutdown_world(); + + bool is_world_running(); + void render_world(); + + client_t *get_server_client(); +} \ No newline at end of file diff --git a/deerith_engine_client/src/graphics/window.cpp b/deerith_engine_client/src/graphics/window.cpp index 9589710..f51e8fd 100644 --- a/deerith_engine_client/src/graphics/window.cpp +++ b/deerith_engine_client/src/graphics/window.cpp @@ -1,7 +1,7 @@ #include "deerith/graphics/window.h" #include "primitive_internals.h" #include "../network/network_internals.h" -#include +#include #include #include @@ -130,7 +130,7 @@ void deerith::shutdown_window() ImGui::DestroyContext(); shutdown_primitives(); - shutdown_universe(); + shutdown_world(); shutdown_network(); glfwDestroyWindow(window); diff --git a/deerith_engine_client/src/network/base_protocol.cpp b/deerith_engine_client/src/network/base_protocol.cpp index 62745e1..ed1dc49 100644 --- a/deerith_engine_client/src/network/base_protocol.cpp +++ b/deerith_engine_client/src/network/base_protocol.cpp @@ -1,9 +1,9 @@ #include #include "network/network_internals.h" -#include +#include void deerith::setup_base_protocols() { - router_add_packet_processor(); + router_add_packet_processor(); } \ No newline at end of file diff --git a/deerith_engine_client/src/network/network.cpp b/deerith_engine_client/src/network/network.cpp index 021216b..94d63a9 100644 --- a/deerith_engine_client/src/network/network.cpp +++ b/deerith_engine_client/src/network/network.cpp @@ -1,15 +1,24 @@ #include #include +#include #include #include +#include #include "network_internals.h" namespace deerith { ENetHost *client; - ENetPeer *client_peer; + ENetPeer *server_peer; + + std::unique_ptr server_client; +} + +deerith::client_t *deerith::get_server_client() +{ + return server_client.get(); } void deerith::connect_to_server(const char *address, int port) @@ -23,8 +32,10 @@ void deerith::connect_to_server(const char *address, int port) client = enet_host_create(NULL, 1, 2, 0, 0); deerith_assert(client, "connect_to_server failed to create host"); - client_peer = enet_host_connect(client, &eaddress, 2, 0); - deerith_assert(client_peer, "enet_host_connect failed on connect_to_server"); + server_peer = enet_host_connect(client, &eaddress, 2, 0); + deerith_assert(server_peer, "enet_host_connect failed on connect_to_server"); + + server_client = std::make_unique(server_peer); } int deerith::init_network() @@ -58,7 +69,7 @@ void deerith::flush_network_events() case ENET_EVENT_TYPE_RECEIVE: ENetPacket *packet = event.packet; - router_process_packet(packet->data, packet->dataLength); + router_process_packet(packet->data, packet->dataLength, server_client.get()); enet_packet_destroy(event.packet); break; } @@ -75,7 +86,7 @@ bool deerith::wait_till_connected_to_server() } else { - enet_peer_reset(client_peer); + enet_peer_reset(server_peer); deerith_error("failed to connect to server"); return false; } diff --git a/deerith_engine_client/src/universe/universe.cpp b/deerith_engine_client/src/universe/universe.cpp deleted file mode 100644 index d3d5f1a..0000000 --- a/deerith_engine_client/src/universe/universe.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include - -#include "network/network_internals.h" - -#include -#include - -namespace deerith -{ - std::unique_ptr universe_thread; - std::atomic universe_running = false; - - void universe_simulation(); -} - -bool deerith::connect_to_universe(const char *address, int port) -{ - deerith_assert(!universe_running, "connect_to_universe failed because there is a current running universe"); - - shutdown_universe(); - connect_to_server(address, port); - - if (!wait_till_connected_to_server()) - { - deerith_error("engine was not able to connect to server"); - return false; - } - - universe_running = true; - universe_thread = std::make_unique(universe_simulation); - return true; -} - -bool deerith::is_universe_running() -{ - return universe_running; -} - -void deerith::universe_simulation() -{ - while (universe_running) - { - flush_network_events(); - - wait_till_next_click(); - } - - universe_running = false; - deerith_trace("universe shutdown"); -} - -void deerith::shutdown_universe() -{ - universe_running = false; - if (universe_thread && universe_thread->joinable()) - universe_thread->join(); - universe_thread.reset(); -} diff --git a/deerith_engine_client/src/universe/universe_protocols.cpp b/deerith_engine_client/src/universe/universe_protocols.cpp deleted file mode 100644 index a70ee4d..0000000 --- a/deerith_engine_client/src/universe/universe_protocols.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include - -namespace deerith -{ -} - -template <> -void deerith::process_packet(sync_universe_tick_t &universe_tick) -{ - deerith_trace("sync_universe_tick_t tick set to {}", universe_tick.tick_id); - set_tick(universe_tick.tick_id); -} \ No newline at end of file diff --git a/deerith_engine_client/src/universe/universe_render.cpp b/deerith_engine_client/src/universe/universe_render.cpp deleted file mode 100644 index ed0257c..0000000 --- a/deerith_engine_client/src/universe/universe_render.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include - -void deerith::render_universe() -{ -} \ No newline at end of file diff --git a/deerith_engine_client/src/world/player_movment.cpp b/deerith_engine_client/src/world/player_movment.cpp new file mode 100644 index 0000000..58a47c8 --- /dev/null +++ b/deerith_engine_client/src/world/player_movment.cpp @@ -0,0 +1,27 @@ +#include +#include +#include + +#include +#include + +#include "world/world_internals.h" + +namespace deerith +{ + extern character_sync_interface_t character_sync_interface; +} + +void deerith::process_player_input() +{ + glm::vec2 movment = get_joystick_axes(0, 0); + character_sync_interface.move_input.push_value(movment); +} + +void deerith::send_player_input() +{ + sync_character_interface_t sync_character_interface; + sync_character_interface.load(character_sync_interface); + + router_send_packet(sync_character_interface, get_server_client()); +} \ No newline at end of file diff --git a/deerith_engine_client/src/world/universe.cpp b/deerith_engine_client/src/world/universe.cpp new file mode 100644 index 0000000..48b96d9 --- /dev/null +++ b/deerith_engine_client/src/world/universe.cpp @@ -0,0 +1,71 @@ +#include +#include + +#include + +#include "network/network_internals.h" +#include "world/world_internals.h" + +#include +#include + +namespace deerith +{ + std::unique_ptr world_thread; + std::atomic world_running = false; + + character_sync_interface_t character_sync_interface; + + void world_simulation(); +} + +bool deerith::connect_to_world(const char *address, int port) +{ + deerith_assert(!world_running, "connect_to_world failed because there is a current running world"); + + shutdown_world(); + connect_to_server(address, port); + + if (!wait_till_connected_to_server()) + { + deerith_error("engine was not able to connect to server"); + return false; + } + + world_running = true; + world_thread = std::make_unique(world_simulation); + return true; +} + +bool deerith::is_world_running() +{ + return world_running; +} + +void deerith::world_simulation() +{ + while (world_running) + { + flush_network_events(); + + process_player_input(); + + if (get_world_tick() % 2 == 0) + { + send_player_input(); + } + + wait_till_next_click(); + } + + world_running = false; + deerith_trace("world shutdown"); +} + +void deerith::shutdown_world() +{ + world_running = false; + if (world_thread && world_thread->joinable()) + world_thread->join(); + world_thread.reset(); +} diff --git a/deerith_engine_client/src/world/universe_internals.h b/deerith_engine_client/src/world/universe_internals.h new file mode 100644 index 0000000..19a5a1a --- /dev/null +++ b/deerith_engine_client/src/world/universe_internals.h @@ -0,0 +1,7 @@ +#pragma once + +namespace deerith +{ + void process_player_input(); + void send_player_input(); +} diff --git a/deerith_engine_client/src/world/universe_protocols.cpp b/deerith_engine_client/src/world/universe_protocols.cpp new file mode 100644 index 0000000..2dafda8 --- /dev/null +++ b/deerith_engine_client/src/world/universe_protocols.cpp @@ -0,0 +1,14 @@ +#include +#include +#include + +namespace deerith +{ +} + +template <> +void deerith::process_packet(sync_world_tick_t &world_tick, client_t *client) +{ + deerith_trace("sync_world_tick_t tick set to {}", world_tick.tick_id); + set_tick(world_tick.tick_id); +} \ No newline at end of file diff --git a/deerith_engine_client/src/world/universe_render.cpp b/deerith_engine_client/src/world/universe_render.cpp new file mode 100644 index 0000000..a9e95ab --- /dev/null +++ b/deerith_engine_client/src/world/universe_render.cpp @@ -0,0 +1,5 @@ +#include + +void deerith::render_world() +{ +} \ No newline at end of file diff --git a/deerith_engine_core/include/deerith/core/serialization_ext.h b/deerith_engine_core/include/deerith/core/serialization_ext.h new file mode 100644 index 0000000..7d880cf --- /dev/null +++ b/deerith_engine_core/include/deerith/core/serialization_ext.h @@ -0,0 +1,18 @@ +#pragma once + +#include + +namespace cereal +{ + template + void serialize(Archive &archive, glm::vec2 &vec) + { + archive(vec.x, vec.y); + } + + template + void serialize(Archive &archive, glm::vec3 &vec) + { + archive(vec.x, vec.y, vec.z); + } +} \ No newline at end of file diff --git a/deerith_engine_core/include/deerith/engine.h b/deerith_engine_core/include/deerith/engine.h index 87e264f..c93d45a 100644 --- a/deerith_engine_core/include/deerith/engine.h +++ b/deerith_engine_core/include/deerith/engine.h @@ -3,8 +3,9 @@ #include #include -#define UNIVERSE_SIMULATION_TICK_FREQ 50 +#define world_SIMULATION_TICK_FREQ 50 #define NETWORK_RELATIVE_TICK 2 + #define NETWORK_DELAY 10 namespace deerith diff --git a/deerith_engine_core/include/deerith/network/client.h b/deerith_engine_core/include/deerith/network/client.h new file mode 100644 index 0000000..eb02856 --- /dev/null +++ b/deerith_engine_core/include/deerith/network/client.h @@ -0,0 +1,11 @@ +#pragma once +#include + +namespace deerith +{ + struct client_t + { + client_t(ENetPeer *_peer) : peer(_peer) {} + ENetPeer *peer; + }; +} \ No newline at end of file diff --git a/deerith_engine_core/include/deerith/network/router.h b/deerith_engine_core/include/deerith/network/router.h index 88fed75..ac2a59d 100644 --- a/deerith_engine_core/include/deerith/network/router.h +++ b/deerith_engine_core/include/deerith/network/router.h @@ -1,5 +1,6 @@ #pragma once #include +#include #include #include @@ -10,25 +11,31 @@ namespace deerith { - using packet_processor_t = std::function; + using packet_processor_t = std::function; extern std::unordered_map packet_processors; template void router_add_packet_processor(); - void router_process_packet(const uint8_t *data, size_t size); + void router_process_packet(const uint8_t *data, size_t size, client_t *client); template - void router_send_packet(T &, ENetPeer *); + void router_send_packet(T &, client_t *); template - void process_packet(T &); + void process_packet(T &, client_t *client); } template void deerith::router_add_packet_processor() { - packet_processors[T::packet_id] = [](const uint8_t *data, size_t size) + packet_processors[T::packet_id] = [](const uint8_t *data, size_t size, client_t *client) { + if (!client) + { + deerith_error("router_add_packet_processor client is nullptr"); + return; + } + std::string buffer(reinterpret_cast(data), size); std::istringstream stream(buffer, std::ios::in | std::ios::binary); @@ -37,14 +44,20 @@ void deerith::router_add_packet_processor() T packet{}; archive(packet); - process_packet(packet); + process_packet(packet, client); }; } template -void deerith::router_send_packet(T &packet, ENetPeer *peer) +void deerith::router_send_packet(T &packet, client_t *client) { + if (!client) + { + deerith_error("router_send_packet client is nullptr"); + return; + } + std::ostringstream stream(std::ios::out | std::ios::binary); cereal::PortableBinaryOutputArchive archive(stream); @@ -73,7 +86,7 @@ void deerith::router_send_packet(T &packet, ENetPeer *peer) return; } - if (enet_peer_send(peer, 0, enet_packet) < 0) + if (enet_peer_send(client->peer, 0, enet_packet) < 0) { enet_packet_destroy(enet_packet); deerith_error("failed to send ENet packet"); diff --git a/deerith_engine_core/include/deerith/network/sync_variable.h b/deerith_engine_core/include/deerith/network/sync_variable.h index a0434c8..f0fe8c4 100644 --- a/deerith_engine_core/include/deerith/network/sync_variable.h +++ b/deerith_engine_core/include/deerith/network/sync_variable.h @@ -1,27 +1,110 @@ #pragma once #include +#include + #include #include -#define BUFFER_SIZE (NETWORK_DELAY + 20) +#include +#include + +#define SYNC_VARIABLE_STORAGE 30 +#define BUFFER_SIZE (NETWORK_DELAY + SYNC_VARIABLE_STORAGE) namespace deerith { + inline size_t get_sync_variable_index(size_t tick = get_world_tick()) + { + return ((size_t)tick) % BUFFER_SIZE; + }; + + template + struct sync_variable_transport_t; + template struct sync_variable_entry_t { T value; - uint32_t tick_id; + int tick_id = 0; + + template + void serialize(Archive &archive) + { + archive(value); + archive(tick_id); + } }; template class sync_variable_t { public: - ~sync_variable_t() override = default; + T pull_value() + { + sync_variable_entry_t &entry = buffer[get_sync_variable_index()]; + if (entry.tick_id != get_world_tick()) + { + return T(); + } + return entry.value; + } + + void push_value(const T &v) + { + set_value(v, get_world_tick() + NETWORK_DELAY); + } + + void set_value(const T &v, int tick_id = 0) + { + if (tick_id > get_world_tick() + SYNC_VARIABLE_STORAGE) + { + deerith_error("set_value error, tick_id > get_world_tick() + SYNC_VARIABLE_STORAGE, tick_id : {}", tick_id); + return; + } + sync_variable_entry_t &entry = buffer[get_sync_variable_index(tick_id)]; + entry.tick_id = tick_id; + entry.value = v; + } private: std::array, BUFFER_SIZE> buffer; + friend sync_variable_transport_t; }; + template + struct sync_variable_transport_t + { + std::array, NETWORK_DELAY> variable_transport_data; + + void load(const sync_variable_t &sync_var) + { + int begin_tick_id = get_world_tick(); + + for (int i = 0; i < NETWORK_DELAY; i++) + { + variable_transport_data[i] = + sync_var.buffer[get_sync_variable_index(i + begin_tick_id)]; + } + } + + void dipose(sync_variable_t &sync_var) + { + int begin_tick_id = get_world_tick(); + for (int i = 0; i < NETWORK_DELAY; i++) + { + const sync_variable_entry_t &entry = variable_transport_data[i]; + if (entry.tick_id < begin_tick_id || entry.tick_id >= begin_tick_id + NETWORK_DELAY) + { + continue; + } + sync_var.buffer[get_sync_variable_index(entry.tick_id)] = entry; + } + } + + template + void serialize(Archive &archive) + { + archive(variable_transport_data); + } + }; } \ No newline at end of file diff --git a/deerith_engine_core/include/deerith/packets/sync_character_interface.h b/deerith_engine_core/include/deerith/packets/sync_character_interface.h new file mode 100644 index 0000000..6cad0b9 --- /dev/null +++ b/deerith_engine_core/include/deerith/packets/sync_character_interface.h @@ -0,0 +1,30 @@ +#pragma once +#include +#include + +namespace deerith +{ + struct sync_character_interface_t + { + static constexpr uint16_t packet_id = 2; + static constexpr bool reliable = false; + + sync_variable_transport_t move_input_transport; + + void load(const character_sync_interface_t &ci) + { + move_input_transport.load(ci.move_input); + } + + void dipose(character_sync_interface_t &ci) + { + move_input_transport.load(ci.move_input); + } + + template + void serialize(Archive &archive) + { + archive(move_input_transport); + } + }; +} \ No newline at end of file diff --git a/deerith_engine_core/include/deerith/packets/sync_universe_tick.h b/deerith_engine_core/include/deerith/packets/sync_world_tick.h similarity index 91% rename from deerith_engine_core/include/deerith/packets/sync_universe_tick.h rename to deerith_engine_core/include/deerith/packets/sync_world_tick.h index 2b6447c..8667d08 100644 --- a/deerith_engine_core/include/deerith/packets/sync_universe_tick.h +++ b/deerith_engine_core/include/deerith/packets/sync_world_tick.h @@ -3,7 +3,7 @@ namespace deerith { - struct sync_universe_tick_t + struct sync_world_tick_t { static constexpr uint16_t packet_id = 1; static constexpr bool reliable = true; diff --git a/deerith_engine_core/include/deerith/world/character.h b/deerith_engine_core/include/deerith/world/character.h new file mode 100644 index 0000000..cdc66ae --- /dev/null +++ b/deerith_engine_core/include/deerith/world/character.h @@ -0,0 +1,10 @@ +#pragma once +#include + +namespace deerith +{ + struct character_t + { + }; + +} \ No newline at end of file diff --git a/deerith_engine_core/include/deerith/network/sync_user.h b/deerith_engine_core/include/deerith/world/character_sync_interface.h similarity index 82% rename from deerith_engine_core/include/deerith/network/sync_user.h rename to deerith_engine_core/include/deerith/world/character_sync_interface.h index c9ea1da..e11a1f5 100644 --- a/deerith_engine_core/include/deerith/network/sync_user.h +++ b/deerith_engine_core/include/deerith/world/character_sync_interface.h @@ -3,7 +3,7 @@ namespace deerith { - struct sync_user_t + struct character_sync_interface_t { sync_variable_t move_input; sync_variable_t position; diff --git a/deerith_engine_core/include/deerith/core/universe.h b/deerith_engine_core/include/deerith/world/world_core.h similarity index 77% rename from deerith_engine_core/include/deerith/core/universe.h rename to deerith_engine_core/include/deerith/world/world_core.h index 12af6fd..3ca0c06 100644 --- a/deerith_engine_core/include/deerith/core/universe.h +++ b/deerith_engine_core/include/deerith/world/world_core.h @@ -3,8 +3,10 @@ namespace deerith { - uint32_t get_universe_tick(); + uint32_t get_world_tick(); void wait_till_next_click(); void set_tick(uint32_t); -} \ No newline at end of file + +} +^^ \ No newline at end of file diff --git a/deerith_engine_core/src/router.cpp b/deerith_engine_core/src/router.cpp index d5bd73d..f710949 100644 --- a/deerith_engine_core/src/router.cpp +++ b/deerith_engine_core/src/router.cpp @@ -8,7 +8,7 @@ namespace deerith std::unordered_map packet_processors; } -void deerith::router_process_packet(const uint8_t *data, size_t size) +void deerith::router_process_packet(const uint8_t *data, size_t size, client_t *client) { if (size <= 2) { @@ -23,5 +23,5 @@ void deerith::router_process_packet(const uint8_t *data, size_t size) return; } - packet_processors[packet_id](&data[2], size - 2); + packet_processors[packet_id](&data[2], size - 2, client); } \ No newline at end of file diff --git a/deerith_engine_core/src/tick.cpp b/deerith_engine_core/src/tick.cpp index 32decee..a674080 100644 --- a/deerith_engine_core/src/tick.cpp +++ b/deerith_engine_core/src/tick.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -13,7 +13,7 @@ void deerith::set_tick(uint32_t v) tick_id = v; } -uint32_t deerith::get_universe_tick() +uint32_t deerith::get_world_tick() { return tick_id; } diff --git a/deerith_engine_server/CMakeLists.txt b/deerith_engine_server/CMakeLists.txt index 89149dc..652c56f 100644 --- a/deerith_engine_server/CMakeLists.txt +++ b/deerith_engine_server/CMakeLists.txt @@ -11,6 +11,8 @@ target_sources(DeerithServer ) target_include_directories(DeerithServer + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) diff --git a/deerith_engine_server/include/deerith/universe.h b/deerith_engine_server/include/deerith/universe.h deleted file mode 100644 index 4822678..0000000 --- a/deerith_engine_server/include/deerith/universe.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -#include - -namespace deerith -{ - void run_universe(int port); - void shutdown_universe(); - - bool is_universe_running(); -} \ No newline at end of file diff --git a/deerith_engine_server/include/deerith/world.h b/deerith_engine_server/include/deerith/world.h new file mode 100644 index 0000000..686dd4d --- /dev/null +++ b/deerith_engine_server/include/deerith/world.h @@ -0,0 +1,10 @@ +#pragma once +#include + +namespace deerith +{ + void run_world(int port); + void shutdown_world(); + + bool is_world_running(); +} \ No newline at end of file diff --git a/deerith_engine_server/src/network/base_protocols.cpp b/deerith_engine_server/src/network/base_protocols.cpp new file mode 100644 index 0000000..742e671 --- /dev/null +++ b/deerith_engine_server/src/network/base_protocols.cpp @@ -0,0 +1,9 @@ +#include "network/network_internals.h" +#include + +#include + +void deerith::load_base_protocols() +{ + router_add_packet_processor(); +} \ No newline at end of file diff --git a/deerith_engine_server/src/network/network.cpp b/deerith_engine_server/src/network/network.cpp index fd53dce..772f636 100644 --- a/deerith_engine_server/src/network/network.cpp +++ b/deerith_engine_server/src/network/network.cpp @@ -1,10 +1,15 @@ #include -#include +#include +#include +#include -#include +#include + +#include #include #include +#include #include "network_internals.h" @@ -12,7 +17,9 @@ namespace deerith { ENetHost *server; - std::vector new_clients; + std::vector> clients; + + void create_client(ENetPeer *peer); } bool deerith::init_server(int port) @@ -29,6 +36,9 @@ bool deerith::init_server(int port) deerith_error("init_server failed"); return false; } + + load_base_protocols(); + return true; } @@ -48,23 +58,15 @@ void deerith::shutdown_network() enet_deinitialize(); } -std::vector &deerith::get_new_clients() -{ - return new_clients; -} - void deerith::flush_network_events() { ENetEvent event; - new_clients.clear(); - - int result = 1; - while ((result = enet_host_service(server, &event, 0)) > 0) + while (enet_host_service(server, &event, 0) > 0) { switch (event.type) { case ENET_EVENT_TYPE_CONNECT: - new_clients.push_back(event.peer); + create_client(event.peer); break; case ENET_EVENT_TYPE_DISCONNECT: @@ -72,17 +74,27 @@ void deerith::flush_network_events() break; case ENET_EVENT_TYPE_RECEIVE: - printf("A packet of length %lu containing %s was received from %s on channel %u.\n", - event.packet->dataLength, - event.packet->data, - event.peer->data, - event.channelID); - + ENetPacket *packet = event.packet; + router_process_packet(packet->data, packet->dataLength, (client_t *)event.peer->data); enet_packet_destroy(event.packet); break; - - case ENET_EVENT_TYPE_NONE: - break; } } } + +void deerith::create_client(ENetPeer *peer) +{ + char enet_address[32]; + enet_address_get_host_ip(&peer->address, enet_address, 31); + deerith_trace("a new client has connected : {}", enet_address); + + sync_world_tick_t sync_world_tick; + sync_world_tick.tick_id = get_world_tick(); + + std::unique_ptr client = std::make_unique(peer); + peer->data = client.get(); + + clients.push_back(std::move(client)); + + router_send_packet(sync_world_tick, (client_t *)peer->data); +} \ No newline at end of file diff --git a/deerith_engine_server/src/network/network_internals.h b/deerith_engine_server/src/network/network_internals.h index a431c17..5722c1b 100644 --- a/deerith_engine_server/src/network/network_internals.h +++ b/deerith_engine_server/src/network/network_internals.h @@ -10,5 +10,6 @@ namespace deerith bool init_server(int port); void flush_network_events(); - std::vector &get_new_clients(); + void load_base_protocols(); + } \ No newline at end of file diff --git a/deerith_engine_server/src/universe.cpp b/deerith_engine_server/src/universe.cpp deleted file mode 100644 index e3b3a5c..0000000 --- a/deerith_engine_server/src/universe.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include - -#include -#include - -#include - -#include "network/network_internals.h" - -#include -#include - -namespace deerith -{ - int universe_tick = 0; - void universe_simulation(); - - std::atomic running = true; - - void create_client(ENetPeer *peer); - void handle_signal(int signal); -} - -void deerith::handle_signal(int signal) -{ - if (signal == SIGTERM) - running = false; -} - -void deerith::run_universe(int port) -{ - std::signal(SIGTERM, handle_signal); - - if (init_server(port)) - { - deerith_trace("server init on port {}", port); - while (running) - { - universe_simulation(); - } - } - else - { - deerith_error("could not init server"); - } -} - -void deerith::universe_simulation() -{ - flush_network_events(); - - for (ENetPeer *new_client : get_new_clients()) - { - create_client(new_client); - } - - wait_till_next_click(); -} - -void deerith::create_client(ENetPeer *client) -{ - char enet_address[32]; - enet_address_get_host_ip(&client->address, enet_address, 31); - deerith_trace("A new client has connected : {}", enet_address); - - sync_universe_tick_t sync_universe_tick; - sync_universe_tick.tick_id = get_universe_tick(); - - router_send_packet(sync_universe_tick, client); -} \ No newline at end of file diff --git a/deerith_engine_server/src/world.cpp b/deerith_engine_server/src/world.cpp new file mode 100644 index 0000000..352852e --- /dev/null +++ b/deerith_engine_server/src/world.cpp @@ -0,0 +1,51 @@ +#include + +#include +#include "network/network_internals.h" + +#include +#include + +namespace deerith +{ + int world_tick = 0; + void world_simulation(); + + std::atomic running = true; + + void create_client(ENetPeer *peer); + void handle_signal(int signal); +} + +void deerith::handle_signal(int signal) +{ + if (signal == SIGTERM) + running = false; +} + +void deerith::run_world(int port) +{ + std::signal(SIGTERM, handle_signal); + + if (init_server(port)) + { + deerith_trace("server init on port {}", port); + while (running) + { + world_simulation(); + } + } + else + { + deerith_error("could not init server"); + } +} + +void deerith::world_simulation() +{ + flush_network_events(); + + // process movments + + wait_till_next_click(); +} diff --git a/deerith_engine_server/src/world/character_sync.cpp b/deerith_engine_server/src/world/character_sync.cpp new file mode 100644 index 0000000..774598f --- /dev/null +++ b/deerith_engine_server/src/world/character_sync.cpp @@ -0,0 +1,15 @@ +#include + +#include +#include + +namespace deerith +{ + +} + +template <> +void deerith::process_packet(sync_character_interface_t &interface, client_t *client) +{ + deerith_trace("sync player input {} {}"); +} diff --git a/deerith_engine_server/src/world/universe_internals.h b/deerith_engine_server/src/world/universe_internals.h new file mode 100644 index 0000000..5b1d841 --- /dev/null +++ b/deerith_engine_server/src/world/universe_internals.h @@ -0,0 +1,6 @@ +#pragma once + +namespace deerith +{ + void update_players_characters(); +} \ No newline at end of file diff --git a/deerith_engine_server/src/world/universe_simulation.cpp b/deerith_engine_server/src/world/universe_simulation.cpp new file mode 100644 index 0000000..116967b --- /dev/null +++ b/deerith_engine_server/src/world/universe_simulation.cpp @@ -0,0 +1,5 @@ +#include "world/world_internals.h" + +void update_players_characters() +{ +} \ No newline at end of file diff --git a/sandbox/src/runtime/main.cpp b/sandbox/src/runtime/main.cpp index 1b535bf..0d542e8 100644 --- a/sandbox/src/runtime/main.cpp +++ b/sandbox/src/runtime/main.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #ifdef DEERITH_CLIENT @@ -11,7 +11,7 @@ int main(int args_count, const char **args) deerith::init_engine(); #ifdef DEERITH_SERVER - deerith::run_universe(8080); + deerith::run_world(8080); #endif #ifdef DEERITH_CLIENT @@ -24,13 +24,13 @@ int main(int args_count, const char **args) std::this_thread::sleep_for(std::chrono::milliseconds(100)); - if (deerith::connect_to_universe("127.0.0.1", 8080)) + if (deerith::connect_to_world("127.0.0.1", 8080)) { deerith_assert(deerith::init_window() == 0, "Failed to init_window"); while (deerith::begin_window_display()) { - deerith::render_universe(); + deerith::render_world(); deerith::finish_window_display(); }