diff --git a/Client/src/asteroid/main.cpp b/Client/src/asteroid/main.cpp index 2a1aafc..1a616c8 100644 --- a/Client/src/asteroid/main.cpp +++ b/Client/src/asteroid/main.cpp @@ -18,83 +18,27 @@ std::int32_t main(std::int32_t argc, gsl::zstring* argv) { #endif utils::ThreadPool tp(0); Network::IOCP iocp; - iocp.init(&tp, SessionProtocol::TLS); + iocp.init(&tp, SessionProtocol::TCP); Network::Address addr; in6_addr in6addr; - addr.set(AF_INET, "43.200.173.151", 9010); + addr.set(AF_INET6, "::1", 9010); Network::Socket sock; Network::TCPSocket TCPSock; Network::UDPSocket UDPSock; - TCPSock.init(AF_INET); - UDPSock.init(AF_INET); + TCPSock.init(AF_INET6); + UDPSock.init(AF_INET6); sock = TCPSock; if (sock.connect(addr) == INVALID_SOCKET) { spdlog::error("connect()"); std::exit(EXIT_FAILURE); } - // SSL_CTX* ctx = ::SSL_CTX_new(::OSSL_QUIC_client_method()); - SSL_CTX* ctx = SSL_CTX_new(TLS_client_method()); - if (ctx == NULL) { - printf("Failed to create the SSL_CTX\n"); - std::exit(EXIT_FAILURE); - } - - // SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); - /* * 인증서 검증을 비활성화합니다. - * SSL_VERIFY_NONE 플래그를 사용하면 클라이언트는 서버 인증서를 요청하거나 - * 확인하지 않습니다. 경고: 보안상 매우 위험합니다. 테스트용으로만 사용하세요. - */ - SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); - - /* Use the default trusted certificate store */ - if (!SSL_CTX_set_default_verify_paths(ctx)) { - printf("Failed to set the default trusted certificate store\n"); - std::exit(EXIT_FAILURE); - } - - Network::IOCPPASSINDATA* data = new Network::IOCPPASSINDATA(16 * 1024, ctx); + Network::IOCPPASSINDATA* data = new Network::IOCPPASSINDATA(16 * 1024); data->socket = std::make_shared(sock); data->IOCPInstance = &iocp; - - char buf[4096]; - int ret = 0; - while ((ret = SSL_connect(data->ssl.get())) != 1) { - if (BIO_ctrl_pending(SSL_get_wbio(data->ssl.get())) > 0) { - // wbio에서 암호화된 데이터를 읽어서 - int bytes_to_write = - BIO_read(SSL_get_wbio(data->ssl.get()), buf, sizeof(buf)); - if (bytes_to_write > 0) { - // 소켓으로 전송 - send(sock.sock, buf, bytes_to_write, 0); - } - } - int err = SSL_get_error(data->ssl.get(), ret); - if (err == SSL_ERROR_WANT_READ) { - // OpenSSL이 소켓에서 데이터를 더 읽어오길 원함 - // 소켓에서 데이터를 읽어서 - int bytes_read = recv(sock.sock, buf, sizeof(buf), 0); - if (bytes_read > 0) { - // rbio에 써준다 - BIO_write(SSL_get_rbio(data->ssl.get()), buf, bytes_read); - } else if (bytes_read == 0) { - // 소켓 연결이 끊김 - fprintf(stderr, "Socket closed during handshake.\n"); - return 0; - } else { - // 소켓 에러 (EAGAIN/EWOULDBLOCK은 논블록킹 소켓에서 정상) - // 실제 프로덕션 코드에서는 이 부분을 정교하게 처리해야 합니다. - } - } else { - printf("Failed to connect to server\n"); - std::exit(EXIT_FAILURE); - } - continue; - } - iocp.registerTCPSocket(data); std::vector send_data; @@ -102,14 +46,14 @@ std::int32_t main(std::int32_t argc, gsl::zstring* argv) { auto snowflake = utils::GenerateID(); auto timestamp = std::to_string(snowflake.timestamp); ::memcpy( - data->wsabuf.buf, timestamp.c_str(), 128 - /*(data->bufsize < timestamp.size()) ? data->bufsize : timestamp.size()*/); - data->wsabuf.len = timestamp.size(); + data->wsabuf.buf, timestamp.c_str(), + (data->bufsize < timestamp.size()) ? data->bufsize : timestamp.size()); + data->wsabuf.len = 16 * 1024; send_data.push_back(data); iocp.send(sock.sock, &send_data); Network::IOCPPASSINDATA* recv_data = - new Network::IOCPPASSINDATA(16 * 1024, ctx); + new Network::IOCPPASSINDATA(16 * 1024); recv_data->socket = std::make_shared(sock); recv_data->IOCPInstance = &iocp; while (!iocp.recv(recv_data)); // 어떤 데이터를 읽는걸 보장받고 싶다면 그냥 diff --git a/Client/src/vulkan_engine/asset/object/model.cpp b/Client/src/vulkan_engine/asset/object/model.cpp deleted file mode 100644 index 5c6143f..0000000 --- a/Client/src/vulkan_engine/asset/object/model.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "vulkan_engine/asset/object/model.h" - -#include "vulkan_engine/vulkan/graphics.h" - -namespace veng { - -Model::~Model() { - if (graphics_ == nullptr) return; - - graphics_->DestroyTexture(material.texture_handle); - graphics_->DestroyBuffer(vertex_buffer); - graphics_->DestroyBuffer(index_buffer); -} - -void veng::Model::Update(float dt) { - linear_velocity += linear_acceleration * dt; - position += linear_velocity * dt; - - angular_velocity += angular_acceleration * dt; - if (glm::length(angular_velocity) > 1e-6f) { - rotation = - glm::normalize(glm::rotate(rotation, glm::length(angular_velocity * dt), - glm::normalize(angular_velocity))); - } - - transform = glm::translate(glm::mat4(1.0f), position) * - glm::mat4_cast(rotation) * glm::scale(glm::mat4(1.0f), scale); -} - -} // namespace veng diff --git a/Server/CMakeLists.txt b/Server/CMakeLists.txt index a1627a5..4f48301 100644 --- a/Server/CMakeLists.txt +++ b/Server/CMakeLists.txt @@ -4,10 +4,92 @@ set(PROJECT_NAME "Server") project(${PROJECT_NAME}) -add_executable(${PROJECT_NAME} - "${CMAKE_CURRENT_SOURCE_DIR}/src/echoserver.cpp" +find_package(Vulkan REQUIRED) +find_package(OpenSSL REQUIRED) + +include(FetchContent) + +FetchContent_Declare( + glm + GIT_REPOSITORY "https://github.com/g-truc/glm.git" + GIT_TAG "1.0.1" + GIT_SHALLOW ON ) +FetchContent_MakeAvailable(glm) + +FetchContent_Declare( + spdlog + GIT_REPOSITORY "https://github.com/gabime/spdlog.git" + GIT_TAG "v1.15.2" + GIT_SHALLOW ON +) +FetchContent_MakeAvailable(spdlog) + +FetchContent_Declare( + glfw + GIT_REPOSITORY "https://github.com/glfw/glfw.git" + GIT_TAG "3.4" + GIT_SHALLOW ON +) +FetchContent_MakeAvailable(glfw) + +FetchContent_Declare( + GSL + GIT_REPOSITORY "https://github.com/microsoft/GSL.git" + GIT_TAG "v4.2.0" + GIT_SHALLOW ON +) +FetchContent_MakeAvailable(GSL) + +FetchContent_Declare( + ASSIMP + GIT_REPOSITORY "https://github.com/assimp/assimp.git" + GIT_TAG "v5.4.3" + GIT_SHALLOW ON +) +FetchContent_MakeAvailable(ASSIMP) + +file(GLOB_RECURSE Sources CONFIGURE_DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp" +) + +add_executable(${PROJECT_NAME} ${RootProjectSources} ${Sources}) +target_link_libraries(${PROJECT_NAME} PRIVATE Vulkan::Vulkan) +target_link_libraries(${PROJECT_NAME} PRIVATE glm) +target_link_libraries(${PROJECT_NAME} PRIVATE glfw) +target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft.GSL::GSL) +target_link_libraries(${PROJECT_NAME} PRIVATE spdlog) +target_link_libraries(${PROJECT_NAME} PRIVATE assimp::assimp) +target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::Crypto) +target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL) if(WIN32) target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32) -endif() \ No newline at end of file +endif() +if(UNIX AND NOT APPLE AND CMAKE_BUILD_TYPE STREQUAL "Release") + set_target_properties(${PROJECT_NAME} PROPERTIES + BUILD_WITH_INSTALL_RPATH TRUE + INSTALL_RPATH "$ORIGIN" + SKIP_BUILD_RPATH FALSE + BUILD_RPATH "$ORIGIN" + ) +endif() + +target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../include" "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20) + +target_precompile_headers(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../include/precomp.h") + +add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "$" + "$" + COMMENT "Copying spdlog DLL/so to output directory" +) + +add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + "$" + "$" + COMMENT "Copying spdlog library files and symlinks to output directory" +) \ No newline at end of file diff --git a/Server/src/echoserver.cpp b/Server/src/echoserver.cpp deleted file mode 100644 index 19d482e..0000000 --- a/Server/src/echoserver.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#pragma once - -#ifdef _WIN32 -#include -#include -#include -#include -#include -#define in_addr_t ULONG -#elif __linux__ -#include -#include -#include -#include -#include -#include -#include -#include -#define SOCKET int -#define INVALID_SOCKET -1 -#define SOCKET_ERROR -1 -#else -#error "이 플랫폼은 지원되지 않습니다." -#endif - -#include - -void err_quit(const char *msg) { - char *msgbuf = strerror(errno); - fprintf(stderr, "[%s] %s\n", msg, msgbuf); - exit(1); -} - -void err_display(const char *msg) { - char *msgbuf = strerror(errno); - fprintf(stderr, "[%s] %s\n", msg, msgbuf); -} - -#define LISTENIP "::" -#define LISTENPORT 9010 -#define BUFSIZE 100 - -int main(int argc, char *argv[]) { - WSADATA wsa; - if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { - err_quit("WSAStartup()"); - return EXIT_FAILURE; - } - SOCKET listenSocket = socket(AF_INET6, SOCK_STREAM, 0); - if (listenSocket == INVALID_SOCKET) err_quit("socket()"); - - struct sockaddr_in6 serverAddr; - memset(&serverAddr, 0, sizeof(serverAddr)); - serverAddr.sin6_family = AF_INET6; - inet_pton(AF_INET6, LISTENIP, &serverAddr.sin6_addr); - serverAddr.sin6_port = htons(LISTENPORT); - - if (SOCKET_ERROR == - bind(listenSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr))) - err_quit("bind()"); - if (SOCKET_ERROR == listen(listenSocket, SOMAXCONN)) err_quit("listen()"); - - SOCKET client_sock; - struct sockaddr_in6 client_addr; - socklen_t addr_len; - - addr_len = sizeof(client_addr); - printf("Waiting for connection...\n"); - client_sock = - accept(listenSocket, (struct sockaddr *)&client_addr, &addr_len); - if (client_sock == INVALID_SOCKET) err_quit("accept()"); - printf("Connection established!\n"); - - char buf[BUFSIZE + 1]; - - while (2) { - int retVal = recv(client_sock, buf, BUFSIZE, 0); - if (retVal == SOCKET_ERROR) - err_display("recv()"); - else if (retVal == 0) - break; - - char ipv6str[INET6_ADDRSTRLEN]; - inet_ntop(AF_INET6, &client_addr, ipv6str, sizeof(ipv6str)); - buf[retVal] = '\0'; - printf("[TCP/%s:%d] %s\n", ipv6str, ntohs(client_addr.sin6_port), buf); - - if (SOCKET_ERROR == send(client_sock, buf, BUFSIZE, 0)) - err_display("send()"); - } - - WSACleanup(); -} diff --git a/Server/src/server.cpp b/Server/src/server.cpp new file mode 100644 index 0000000..ed00f4c --- /dev/null +++ b/Server/src/server.cpp @@ -0,0 +1,77 @@ +#include + +#include "socket/iocp.h" +#include "socket/tcp_socket.h" +#include "socket/udp_socket.h" +#include "socket/wsa_manager.h" +#include "utils/log.h" +#include "utils/snowflake.h" +#include "socket/packet.h" + +#define LISTENIP "::" +#define LISTENPORT 9010 + +void EchoClient(utils::ThreadPool* tp, Network::IOCP* iocp, + Network::TCPSocket NewSock, Network::Address NewAddr) { + Network::IOCPPASSINDATA* recv_data = new Network::IOCPPASSINDATA(16 * 1024); + recv_data->socket = std::make_shared(NewSock); + recv_data->IOCPInstance = iocp; + auto timestamp = std::chrono::system_clock::now(); + while (!iocp->recv(recv_data)) { + if (std::chrono::duration_cast( + std::chrono::system_clock::now() - timestamp) + .count() == 1000) { + tp->enqueueJob(EchoClient, iocp, NewSock, NewAddr); + return; + } + } + + std::vector send_data; + recv_data->event = Network::IOCPEVENT::WRITE; + send_data.push_back(recv_data); + iocp->send(NewSock.sock, &send_data); + + tp->enqueueJob(EchoClient, iocp, NewSock, NewAddr); +} + +int main(int argc, char* argv[]) { + Network::WSAManager wsamanager; +#if !defined(NDEBUG) + utils::setDefaultLogger(spdlog::level::level_enum::debug, "log.log", 1024, 2); +#endif + utils::ThreadPool tp(0); + Network::IOCP iocp; + iocp.init(&tp, SessionProtocol::TCP); + + Network::Address addr; + + addr.set(AF_INET6, "::", 9010); + + Network::Socket* sock; + Network::TCPSocket TCPSock; + TCPSock.init(AF_INET6); + sock = &TCPSock; + if (TCPSock.bind(addr) == INVALID_SOCKET) { + spdlog::error("bind()"); + std::exit(EXIT_FAILURE); + } + if (TCPSock.listen(SOMAXCONN) == INVALID_SOCKET) { + spdlog::error("listen()"); + std::exit(EXIT_FAILURE); + } + + while (true) { + Network::TCPSocket NewSock; + Network::Address NewAddr; + NewAddr.length = addr.length; + spdlog::info("Waiting for connection"); + TCPSock.accept(NewSock, NewAddr); + + Network::IOCPPASSINDATA* data = new Network::IOCPPASSINDATA(16 * 1024); + data->socket = std::make_shared(NewSock); + data->IOCPInstance = &iocp; + iocp.registerTCPSocket(data); + + tp.enqueueJob(EchoClient, &iocp, NewSock, NewAddr); + } +} diff --git a/impl/socket/iocp.cpp b/impl/socket/iocp.cpp index e364637..7dd7291 100644 --- a/impl/socket/iocp.cpp +++ b/impl/socket/iocp.cpp @@ -176,9 +176,12 @@ void IOCP::iocpWatcher_(utils::ThreadPool* IOCPThread) { std::vector buf(16384); // SSL_read최대 반환 크기 int red_data = 0; std::lock_guard lock(*GetRecvQueueMutex_(sock)); - auto queue_list = GetRecvQueue_(data->socket->sock); + auto queue_list = GetRecvQueue_(sock); if (data->event == IOCPEVENT::READ) { - if (proto_ == SessionProtocol::TLS || proto_ == SessionProtocol::QUIC) { + if (proto_ == SessionProtocol::TLS || + proto_ == SessionProtocol::QUIC) { // DEPRECATED. openssl을 사용할 수가 + // 없기 때문에 추후 완성 뒤에 기능을 + // 붙이든 해야 할 듯 함. // DEBUG: BIO_write 전 OpenSSL 에러 스택 확인 (혹시 모를 이전 에러) ERR_print_errors_fp(stderr); // 이미 오류 스택에 뭔가 있는지 확인용 fprintf(stderr, "--- Before BIO_write ---\n"); diff --git a/impl/socket/socket.cpp b/impl/socket/socket.cpp index bf63997..816388c 100644 --- a/impl/socket/socket.cpp +++ b/impl/socket/socket.cpp @@ -41,7 +41,7 @@ Socket::operator SOCKET() { void Socket::set(const SOCKET __sock, int __domain) { if (__sock == INVALID_SOCKET) { - spdlog::critical("socket()"); + spdlog::error("set failed errno:{} {}", errno, strerror(errno)); std::exit(EXIT_FAILURE); } diff --git a/impl/socket/tcp_socket.cpp b/impl/socket/tcp_socket.cpp index 2bb5477..d113fe2 100644 --- a/impl/socket/tcp_socket.cpp +++ b/impl/socket/tcp_socket.cpp @@ -11,9 +11,14 @@ int TCPSocket::listen(int __n) { } void TCPSocket::accept(TCPSocket &newSock, Address &__addr) { - newSock.set(::accept(sock, &__addr.addr, &__addr.length), domain); + SOCKET newsock = INVALID_SOCKET; + newsock = ::accept(sock, &__addr.addr, &__addr.length); + if (newsock == INVALID_SOCKET) { + spdlog::error("accept() errno:{} {}", errno, strerror(errno)); + std::exit(EXIT_FAILURE); + } + newSock.set(newsock, domain); memcpy(&newSock.remoteAddr, &__addr, sizeof(Address)); - if (newSock.sock == INVALID_SOCKET) spdlog::error("accept()"); } int TCPSocket::connect(Address &serveraddr) { diff --git a/Client/src/vulkan_engine/asset/loader.cpp b/impl/vulkan_engine/asset/loader.cpp similarity index 100% rename from Client/src/vulkan_engine/asset/loader.cpp rename to impl/vulkan_engine/asset/loader.cpp diff --git a/impl/vulkan_engine/asset/object/model.cpp b/impl/vulkan_engine/asset/object/model.cpp new file mode 100644 index 0000000..8713f1f --- /dev/null +++ b/impl/vulkan_engine/asset/object/model.cpp @@ -0,0 +1,91 @@ +#include "vulkan_engine/asset/object/model.h" + +#include "vulkan_engine/vulkan/graphics.h" + +namespace veng { + +Model::~Model() { + if (graphics_ == nullptr) return; + + graphics_->DestroyTexture(material.texture_handle); + graphics_->DestroyBuffer(vertex_buffer); + graphics_->DestroyBuffer(index_buffer); +} + +template +static void Append(std::vector& dst, const T& data) { + const char* ptr = reinterpret_cast(&data); + dst.insert(dst.end(), ptr, ptr + sizeof(T)); +} + +std::vector Model::Serialize() { + std::vector serialized; + + Append(serialized, ID); + + Append(serialized, transform); + Append(serialized, position); + Append(serialized, linear_velocity); + Append(serialized, linear_acceleration); + Append(serialized, rotation); + Append(serialized, angular_velocity); + Append(serialized, angular_acceleration); + Append(serialized, scale); + Append(serialized, original_offset); + + Append(serialized, radius); + + uint8_t vis = visible ? 1 : 0; + uint8_t col = colision ? 1 : 0; + Append(serialized, vis); + Append(serialized, col); + + return serialized; +} + +template +static void Extract(const std::vector& src, size_t& offset, T& out) { + std::memcpy(&out, src.data() + offset, sizeof(T)); + offset += sizeof(T); +} + +void Model::Deserialize(std::vector data) { + size_t offset = 0; + + Extract(data, offset, ID); + + Extract(data, offset, transform); + Extract(data, offset, position); + Extract(data, offset, linear_velocity); + Extract(data, offset, linear_acceleration); + Extract(data, offset, rotation); + Extract(data, offset, angular_velocity); + Extract(data, offset, angular_acceleration); + Extract(data, offset, scale); + Extract(data, offset, original_offset); + + Extract(data, offset, radius); + + uint8_t vis = 0, col = 0; + Extract(data, offset, vis); + Extract(data, offset, col); + visible = vis != 0; + colision = col != 0; +} + +void veng::Model::Update(float dt) { + linear_velocity += linear_acceleration * dt; + position += linear_velocity * dt; + + angular_velocity += angular_acceleration * dt; + if (glm::length(angular_velocity) > 1e-6f) { + rotation = + glm::normalize(glm::rotate(rotation, glm::length(angular_velocity * dt), + glm::normalize(angular_velocity))); + } + + transform = glm::translate(glm::mat4(1.0f), position) * + glm::mat4_cast(rotation) * glm::scale(glm::mat4(1.0f), scale); +} + +} // namespace veng diff --git a/Client/src/vulkan_engine/glfw/glfw_initialization.cpp b/impl/vulkan_engine/glfw/glfw_initialization.cpp similarity index 100% rename from Client/src/vulkan_engine/glfw/glfw_initialization.cpp rename to impl/vulkan_engine/glfw/glfw_initialization.cpp diff --git a/Client/src/vulkan_engine/glfw/glfw_moniotr.cpp b/impl/vulkan_engine/glfw/glfw_moniotr.cpp similarity index 100% rename from Client/src/vulkan_engine/glfw/glfw_moniotr.cpp rename to impl/vulkan_engine/glfw/glfw_moniotr.cpp diff --git a/Client/src/vulkan_engine/glfw/glfw_window.cpp b/impl/vulkan_engine/glfw/glfw_window.cpp similarity index 100% rename from Client/src/vulkan_engine/glfw/glfw_window.cpp rename to impl/vulkan_engine/glfw/glfw_window.cpp diff --git a/Client/src/vulkan_engine/stb/stb_image.cpp b/impl/vulkan_engine/stb/stb_image.cpp similarity index 100% rename from Client/src/vulkan_engine/stb/stb_image.cpp rename to impl/vulkan_engine/stb/stb_image.cpp diff --git a/Client/src/vulkan_engine/utilities.cpp b/impl/vulkan_engine/utilities.cpp similarity index 100% rename from Client/src/vulkan_engine/utilities.cpp rename to impl/vulkan_engine/utilities.cpp diff --git a/Client/src/vulkan_engine/vulkan/buffers.cpp b/impl/vulkan_engine/vulkan/buffers.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/buffers.cpp rename to impl/vulkan_engine/vulkan/buffers.cpp diff --git a/Client/src/vulkan_engine/vulkan/class.cpp b/impl/vulkan_engine/vulkan/class.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/class.cpp rename to impl/vulkan_engine/vulkan/class.cpp diff --git a/Client/src/vulkan_engine/vulkan/coordinate.cpp b/impl/vulkan_engine/vulkan/coordinate.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/coordinate.cpp rename to impl/vulkan_engine/vulkan/coordinate.cpp diff --git a/Client/src/vulkan_engine/vulkan/devices_and_queues.cpp b/impl/vulkan_engine/vulkan/devices_and_queues.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/devices_and_queues.cpp rename to impl/vulkan_engine/vulkan/devices_and_queues.cpp diff --git a/Client/src/vulkan_engine/vulkan/drawing.cpp b/impl/vulkan_engine/vulkan/drawing.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/drawing.cpp rename to impl/vulkan_engine/vulkan/drawing.cpp diff --git a/Client/src/vulkan_engine/vulkan/engine.cpp b/impl/vulkan_engine/vulkan/engine.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/engine.cpp rename to impl/vulkan_engine/vulkan/engine.cpp diff --git a/Client/src/vulkan_engine/vulkan/graphics_pipeline.cpp b/impl/vulkan_engine/vulkan/graphics_pipeline.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/graphics_pipeline.cpp rename to impl/vulkan_engine/vulkan/graphics_pipeline.cpp diff --git a/Client/src/vulkan_engine/vulkan/instance_and_extensions.cpp b/impl/vulkan_engine/vulkan/instance_and_extensions.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/instance_and_extensions.cpp rename to impl/vulkan_engine/vulkan/instance_and_extensions.cpp diff --git a/Client/src/vulkan_engine/vulkan/physics.cpp b/impl/vulkan_engine/vulkan/physics.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/physics.cpp rename to impl/vulkan_engine/vulkan/physics.cpp diff --git a/Client/src/vulkan_engine/vulkan/presentation.cpp b/impl/vulkan_engine/vulkan/presentation.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/presentation.cpp rename to impl/vulkan_engine/vulkan/presentation.cpp diff --git a/Client/src/vulkan_engine/vulkan/texture.cpp b/impl/vulkan_engine/vulkan/texture.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/texture.cpp rename to impl/vulkan_engine/vulkan/texture.cpp diff --git a/Client/src/vulkan_engine/vulkan/validation_layers.cpp b/impl/vulkan_engine/vulkan/validation_layers.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/validation_layers.cpp rename to impl/vulkan_engine/vulkan/validation_layers.cpp diff --git a/Client/src/vulkan_engine/vulkan/vk_function_ext_impl.cpp b/impl/vulkan_engine/vulkan/vk_function_ext_impl.cpp similarity index 100% rename from Client/src/vulkan_engine/vulkan/vk_function_ext_impl.cpp rename to impl/vulkan_engine/vulkan/vk_function_ext_impl.cpp diff --git a/Client/include/glfw/glfw_initialization.h b/include/glfw/glfw_initialization.h similarity index 100% rename from Client/include/glfw/glfw_initialization.h rename to include/glfw/glfw_initialization.h diff --git a/Client/include/glfw/glfw_monitor.h b/include/glfw/glfw_monitor.h similarity index 100% rename from Client/include/glfw/glfw_monitor.h rename to include/glfw/glfw_monitor.h diff --git a/Client/include/glfw/glfw_window.h b/include/glfw/glfw_window.h similarity index 100% rename from Client/include/glfw/glfw_window.h rename to include/glfw/glfw_window.h diff --git a/include/socket/iocp.h b/include/socket/iocp.h index fefd94f..1f560da 100644 --- a/include/socket/iocp.h +++ b/include/socket/iocp.h @@ -82,11 +82,12 @@ struct IOCPPASSINDATA { wsabuf.len = bufsize; } - IOCPPASSINDATA(const IOCPPASSINDATA& other) { + /*IOCPPASSINDATA(const IOCPPASSINDATA& other) { if (this != &other) { std::memset(&overlapped, 0, sizeof(overlapped)); event = other.event; socket = other.socket; + ssl = other.ssl; transferredbytes = other.transferredbytes; bufsize = other.bufsize; IOCPInstance = other.IOCPInstance; @@ -97,18 +98,19 @@ struct IOCPPASSINDATA { wsabuf.len = other.bufsize; std::memcpy(wsabuf.buf, other.wsabuf.buf, other.wsabuf.len); } - } + }*/ ~IOCPPASSINDATA() { if (wsabuf.buf != nullptr) delete[] wsabuf.buf; wsabuf.buf = nullptr; } - IOCPPASSINDATA& operator=(const IOCPPASSINDATA& other) { + /*IOCPPASSINDATA& operator=(const IOCPPASSINDATA& other) { if (this != &other) { std::memset(&overlapped, 0, sizeof(overlapped)); event = other.event; socket = other.socket; + ssl = other.ssl; transferredbytes = other.transferredbytes; bufsize = other.bufsize; IOCPInstance = other.IOCPInstance; @@ -121,7 +123,10 @@ struct IOCPPASSINDATA { std::memcpy(wsabuf.buf, other.wsabuf.buf, other.wsabuf.len); } return *this; - } + }*/ + + IOCPPASSINDATA(const IOCPPASSINDATA& other) = delete; + IOCPPASSINDATA& operator=(const IOCPPASSINDATA&) = delete; }; class IOCP { diff --git a/include/socket/packet.h b/include/socket/packet.h new file mode 100644 index 0000000..c644f88 --- /dev/null +++ b/include/socket/packet.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +namespace Packet { + +enum class Opcode { + NOP, + SPAWNMODEL, + DESPAWNMODEL, + UPDATEMODEL, + REQUESTMODELIDLIST, + COUNT +}; + +struct Header { + Opcode opcode; + std::uint32_t body_length; +}; + +} // namespace Packet diff --git a/Client/include/stb/stb_image.h b/include/stb/stb_image.h similarity index 100% rename from Client/include/stb/stb_image.h rename to include/stb/stb_image.h diff --git a/include/utils/snowflake.h b/include/utils/snowflake.h index 1e86bc9..29cf42f 100644 --- a/include/utils/snowflake.h +++ b/include/utils/snowflake.h @@ -16,6 +16,13 @@ struct Snowflake { bool operator==(const Snowflake& other) const { return snowflake == other.snowflake; } + + std::vector Serialize() { + std::vector serialized; + serialized.insert(serialized.end(), &snowflake, + &snowflake + sizeof(std::uint64_t)); + return serialized; + } }; Snowflake GenerateID(); diff --git a/Client/include/vulkan_engine/asset/loader.h b/include/vulkan_engine/asset/loader.h similarity index 100% rename from Client/include/vulkan_engine/asset/loader.h rename to include/vulkan_engine/asset/loader.h diff --git a/Client/include/vulkan_engine/asset/object/material.h b/include/vulkan_engine/asset/object/material.h similarity index 100% rename from Client/include/vulkan_engine/asset/object/material.h rename to include/vulkan_engine/asset/object/material.h diff --git a/Client/include/vulkan_engine/asset/object/model.h b/include/vulkan_engine/asset/object/model.h similarity index 94% rename from Client/include/vulkan_engine/asset/object/model.h rename to include/vulkan_engine/asset/object/model.h index 503d70a..d27e9d3 100644 --- a/Client/include/vulkan_engine/asset/object/model.h +++ b/include/vulkan_engine/asset/object/model.h @@ -7,6 +7,7 @@ #include "material.h" #include "vulkan_engine/vulkan/buffer_handle.h" #include "vulkan_engine/vulkan/vertex.h" +#include "utils/snowflake.h" namespace veng { struct Model { @@ -34,6 +35,7 @@ struct Model { OnColision(other.OnColision), visible(other.visible), colision(other.colision) { + ID = utils::GenerateID(); graphics_ = nullptr; } @@ -57,12 +59,16 @@ struct Model { OnColision(other.OnColision), visible(other.visible), colision(other.colision) { + ID = other.ID; + ::memset(&other.ID, 0, 64); + graphics_ = other.graphics_; other.graphics_ = nullptr; } Model& operator=(const Model& other) { if (this != &other) { + ID = utils::GenerateID(); vertices = other.vertices; vertex_buffer = other.vertex_buffer; indices = other.indices; @@ -90,6 +96,8 @@ struct Model { Model& operator=(Model&& other) noexcept { if (this != &other) { + ID = other.ID; + ::memset(&other.ID, 0, 64); vertices = std::move(other.vertices); vertex_buffer = other.vertex_buffer; indices = std::move(other.indices); @@ -110,12 +118,15 @@ struct Model { visible = other.visible; colision = other.colision; - // graphics_만 옮기고, 원본은 nullptr graphics_ = other.graphics_; other.graphics_ = nullptr; } return *this; } + utils::Snowflake ID; + + std::vector Serialize(); + void Deserialize(std::vector data); std::vector vertices; veng::BufferHandle vertex_buffer; diff --git a/Client/include/vulkan_engine/utilities.h b/include/vulkan_engine/utilities.h similarity index 100% rename from Client/include/vulkan_engine/utilities.h rename to include/vulkan_engine/utilities.h diff --git a/Client/include/vulkan_engine/vulkan/buffer_handle.h b/include/vulkan_engine/vulkan/buffer_handle.h similarity index 100% rename from Client/include/vulkan_engine/vulkan/buffer_handle.h rename to include/vulkan_engine/vulkan/buffer_handle.h diff --git a/Client/include/vulkan_engine/vulkan/coordinate.h b/include/vulkan_engine/vulkan/coordinate.h similarity index 100% rename from Client/include/vulkan_engine/vulkan/coordinate.h rename to include/vulkan_engine/vulkan/coordinate.h diff --git a/Client/include/vulkan_engine/vulkan/engine.h b/include/vulkan_engine/vulkan/engine.h similarity index 100% rename from Client/include/vulkan_engine/vulkan/engine.h rename to include/vulkan_engine/vulkan/engine.h diff --git a/Client/include/vulkan_engine/vulkan/graphics.h b/include/vulkan_engine/vulkan/graphics.h similarity index 100% rename from Client/include/vulkan_engine/vulkan/graphics.h rename to include/vulkan_engine/vulkan/graphics.h diff --git a/Client/include/vulkan_engine/vulkan/physics.h b/include/vulkan_engine/vulkan/physics.h similarity index 100% rename from Client/include/vulkan_engine/vulkan/physics.h rename to include/vulkan_engine/vulkan/physics.h diff --git a/Client/include/vulkan_engine/vulkan/texture_handle.h b/include/vulkan_engine/vulkan/texture_handle.h similarity index 100% rename from Client/include/vulkan_engine/vulkan/texture_handle.h rename to include/vulkan_engine/vulkan/texture_handle.h diff --git a/Client/include/vulkan_engine/vulkan/uniform_transformations.h b/include/vulkan_engine/vulkan/uniform_transformations.h similarity index 100% rename from Client/include/vulkan_engine/vulkan/uniform_transformations.h rename to include/vulkan_engine/vulkan/uniform_transformations.h diff --git a/Client/include/vulkan_engine/vulkan/vertex.h b/include/vulkan_engine/vulkan/vertex.h similarity index 100% rename from Client/include/vulkan_engine/vulkan/vertex.h rename to include/vulkan_engine/vulkan/vertex.h