diff --git a/README.md b/README.md index 73f58b3..5e48a01 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,8 @@ sudo apt install \ libglm-dev \ libspdlog-dev \ libfmt-dev \ - libgl1-mesa-dev + libgl1-mesa-dev \ + libimgui-dev ``` ## Building diff --git a/deerith_engine_client/include/deerith/network/network.h b/deerith_engine_client/include/deerith/network/network.h deleted file mode 100644 index 4287ca8..0000000 --- a/deerith_engine_client/include/deerith/network/network.h +++ /dev/null @@ -1 +0,0 @@ -# \ No newline at end of file diff --git a/deerith_engine_client/include/deerith/universe/universe.h b/deerith_engine_client/include/deerith/universe/universe.h new file mode 100644 index 0000000..2dd64c3 --- /dev/null +++ b/deerith_engine_client/include/deerith/universe/universe.h @@ -0,0 +1,8 @@ +#pragma once + +namespace deerith +{ + void begin_connection_to_universe(const char *address, int port); + void shutdown_universe(); + bool is_universe_running(); +} \ No newline at end of file diff --git a/deerith_engine_client/src/core.cpp b/deerith_engine_client/src/graphics/core.cpp similarity index 100% rename from deerith_engine_client/src/core.cpp rename to deerith_engine_client/src/graphics/core.cpp diff --git a/deerith_engine_client/src/gl.cpp b/deerith_engine_client/src/graphics/gl.cpp similarity index 100% rename from deerith_engine_client/src/gl.cpp rename to deerith_engine_client/src/graphics/gl.cpp diff --git a/deerith_engine_client/src/input.cpp b/deerith_engine_client/src/graphics/input.cpp similarity index 100% rename from deerith_engine_client/src/input.cpp rename to deerith_engine_client/src/graphics/input.cpp diff --git a/deerith_engine_client/src/mesh.cpp b/deerith_engine_client/src/graphics/mesh.cpp similarity index 100% rename from deerith_engine_client/src/mesh.cpp rename to deerith_engine_client/src/graphics/mesh.cpp diff --git a/deerith_engine_client/src/primitive_internals.h b/deerith_engine_client/src/graphics/primitive_internals.h similarity index 100% rename from deerith_engine_client/src/primitive_internals.h rename to deerith_engine_client/src/graphics/primitive_internals.h diff --git a/deerith_engine_client/src/primitives.cpp b/deerith_engine_client/src/graphics/primitives.cpp similarity index 100% rename from deerith_engine_client/src/primitives.cpp rename to deerith_engine_client/src/graphics/primitives.cpp diff --git a/deerith_engine_client/src/shader.cpp b/deerith_engine_client/src/graphics/shader.cpp similarity index 100% rename from deerith_engine_client/src/shader.cpp rename to deerith_engine_client/src/graphics/shader.cpp diff --git a/deerith_engine_client/src/window.cpp b/deerith_engine_client/src/graphics/window.cpp similarity index 96% rename from deerith_engine_client/src/window.cpp rename to deerith_engine_client/src/graphics/window.cpp index 8b6f7b8..98c49b5 100644 --- a/deerith_engine_client/src/window.cpp +++ b/deerith_engine_client/src/graphics/window.cpp @@ -1,5 +1,7 @@ #include "deerith/graphics/window.h" #include "primitive_internals.h" +#include "../network/network_internals.h" +#include #include #include @@ -71,6 +73,7 @@ int deerith::init_window() init_primitives(); init_imgui(); + init_network(); return 0; } @@ -128,6 +131,8 @@ void deerith::shutdown_window() ImGui::DestroyContext(); shutdown_primitives(); + shutdown_universe(); + shutdown_network(); glfwDestroyWindow(window); glfwTerminate(); diff --git a/deerith_engine_client/src/network/network.cpp b/deerith_engine_client/src/network/network.cpp new file mode 100644 index 0000000..7f39a65 --- /dev/null +++ b/deerith_engine_client/src/network/network.cpp @@ -0,0 +1,63 @@ +#include +#include + +#include + +#include + +#include "network_internals.h" + +namespace deerith +{ + ENetHost *client; + ENetPeer *client_peer; +} + +void deerith::connect_to_server(const char *address, int port) +{ + ENetAddress eaddress = {0}; + eaddress.port = port; + + int result = enet_address_set_host(&eaddress, address); + deerith_client_assert(result == 0, "connect_to_server invalid address"); + + client = enet_host_create(NULL, 1, 2, 0, 0); + deerith_client_assert(client, "connect_to_server failed to create host"); + + client_peer = enet_host_connect(client, &eaddress, 2, 0); + deerith_client_assert(client_peer, "enet_host_connect failed on connect_to_server"); +} + +int deerith::init_network() +{ + if (enet_initialize() != 0) + { + deerith_client_error("An error occurred while initializing ENet.\n"); + return 1; + } + + return 0; +} + +void deerith::shutdown_network() +{ + enet_deinitialize(); +} + +bool deerith::wait_till_connected_to_server() +{ + ENetEvent event; + if (enet_host_service(client, &event, 5000) > 0 && + event.type == ENET_EVENT_TYPE_CONNECT) + { + deerith_client_info("Connected to server"); + return true; + } + + else + { + enet_peer_reset(client_peer); + deerith_client_error("Failed to connect to server"); + return false; + } +} \ No newline at end of file diff --git a/deerith_engine_client/src/network/network_internals.h b/deerith_engine_client/src/network/network_internals.h new file mode 100644 index 0000000..3ba755c --- /dev/null +++ b/deerith_engine_client/src/network/network_internals.h @@ -0,0 +1,10 @@ +#pragma once + +namespace deerith +{ + int init_network(); + void shutdown_network(); + + void connect_to_server(const char *address, int port); + bool wait_till_connected_to_server(); +} \ No newline at end of file diff --git a/deerith_engine_client/src/universe/universe.cpp b/deerith_engine_client/src/universe/universe.cpp new file mode 100644 index 0000000..dc28523 --- /dev/null +++ b/deerith_engine_client/src/universe/universe.cpp @@ -0,0 +1,60 @@ +#include +#include + +#include "../network/network_internals.h" + +#include +#include + +namespace deerith +{ + std::unique_ptr universe_thread = {}; + std::atomic universe_running = false; + + void universe_simulation(); +} + +void deerith::begin_connection_to_universe(const char *address, int port) +{ + deerith_core_assert(!universe_running, "begin_connection_to_universe failed because there is a current running universe"); + + if (universe_thread && universe_thread->joinable()) + universe_thread->join(); + + universe_thread.reset(); + + connect_to_server(address, port); + + universe_running = true; + universe_thread = std::make_unique(universe_simulation); +} + +bool deerith::is_universe_running() +{ + return universe_running; +} + +void deerith::universe_simulation() +{ + bool connected = wait_till_connected_to_server(); + + if (connected) + { + while (universe_running) + { + deerith_client_trace("another thread"); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + } + + deerith_client_trace("Thread stop"); + universe_running = false; +} + +void deerith::shutdown_universe() +{ + if (universe_thread && universe_thread->joinable()) + universe_thread->join(); + universe_running = false; + universe_thread.reset(); +} \ No newline at end of file diff --git a/deerith_engine_core/CMakeLists.txt b/deerith_engine_core/CMakeLists.txt index 0ec49f7..b7146d7 100644 --- a/deerith_engine_core/CMakeLists.txt +++ b/deerith_engine_core/CMakeLists.txt @@ -1,5 +1,18 @@ add_library(DeerithCore) +find_path(ENET_INCLUDE_DIR enet/enet.h) +find_library(ENET_LIBRARY enet) + +include(FetchContent) + +FetchContent_Declare( + EnTT + GIT_REPOSITORY https://github.com/skypjack/entt.git + GIT_TAG v3.16.0 +) + +FetchContent_MakeAvailable(EnTT) + find_package(spdlog REQUIRED) find_package(fmt REQUIRED) find_package(glm REQUIRED) @@ -17,6 +30,7 @@ target_sources(DeerithCore target_include_directories(DeerithCore PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include + ${ENET_INCLUDE_DIR} ) target_link_libraries(DeerithCore @@ -24,4 +38,5 @@ target_link_libraries(DeerithCore spdlog::spdlog fmt::fmt glm::glm + ${ENET_LIBRARY} ) \ No newline at end of file diff --git a/sandbox/src/client/main.cpp b/sandbox/src/client/main.cpp index 3ae4de2..4630720 100644 --- a/sandbox/src/client/main.cpp +++ b/sandbox/src/client/main.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -10,6 +11,9 @@ glm::vec2 player_pos(5, 5); +char net_address[16] = "127.0.0.1"; +int port = 8080; + float vel = 1; int main(int args_count, const char **args) @@ -37,8 +41,22 @@ int main(int args_count, const char **args) { ImGui::SliderFloat("Velocity", &vel, 0, 4); - ImGui::End(); + if (deerith::is_universe_running()) + { + ImGui::Text("Universe running"); + } + else + { + ImGui::InputText("Net Address", net_address, 16); + ImGui::InputInt("Net port", &port); + + if (ImGui::Button("Connect")) + { + deerith::begin_connection_to_universe(net_address, port); + } + } } + ImGui::End(); deerith::finish_window_display(); }