From 85f4f82660a623f48a335017917444152850a52c Mon Sep 17 00:00:00 2001 From: Rynort Date: Mon, 23 Oct 2023 17:51:29 -0400 Subject: [PATCH 01/10] avancement menu pause --- SQCSim2021/engine.cpp | 41 ++++++++++++++++++++++++++++++++++++++--- SQCSim2021/engine.h | 3 ++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index a5939e6..ee279dd 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -222,6 +222,37 @@ void Engine::DrawMenu() ShowCursor(); } +void Engine::DrawPause() +{ + static const int sTitle = 400; + static const int sButton = 225; + + glDisable(GL_LIGHTING); + + + glDisable(GL_DEPTH_TEST); + glDisable(GL_STENCIL_TEST); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, Width(), 0, Height(), -1, 1); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + MenuBGTexture.Bind(); + glLoadIdentity(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); + glVertex2i(0, 0); + glTexCoord2f(1, 0); + glVertex2i(800, 0); + glTexCoord2f(1, 1); + glVertex2i(800, 600); + glTexCoord2f(0, 1); + glVertex2i(0, 600); + glEnd(); +} + void Engine::Init() { GLenum glewErr = glewInit(); if (glewErr != GLEW_OK) { @@ -684,11 +715,11 @@ void Engine::Render(float elapsedTime) { if (leftright) vstep = Vector3f(m_player.GetPosition().x + m_player.GetDirection().z, m_player.GetPosition().y - 1.7f, m_player.GetPosition().z + m_player.GetDirection().x); else vstep = Vector3f(m_player.GetPosition().x - m_player.GetDirection().z, m_player.GetPosition().y - 1.7f, m_player.GetPosition().z - m_player.GetDirection().x); - m_audio.Create3DAudioObj(step, AUDIO_PATH "step.wav", vstep, m_player.GetVelocity(), .8f); + m_audio.Create3DAudioObj(step, AUDIO_PATH "step.wav", vstep, m_player.GetVelocity(), .8f, false); leftright = !leftright; break; case Player::Sound::FALL: - m_audio.Create3DAudioObj(step, AUDIO_PATH "hit.wav", m_player.GetPosition(), m_player.GetVelocity(), 1.f); + m_audio.Create3DAudioObj(step, AUDIO_PATH "hit.wav", m_player.GetPosition(), m_player.GetVelocity(), 1.f, false); break; default: break; } @@ -755,7 +786,7 @@ void Engine::Render(float elapsedTime) { static bool fell = false; if (m_player.GetPosition().y < 1.7f && !fell) { - m_audio.Create3DAudioObj(m_scream, AUDIO_PATH "scream.wav", m_player.GetPOV(), m_player.GetVelocity(), 1.f); + m_audio.Create3DAudioObj(m_scream, AUDIO_PATH "scream.wav", m_player.GetPOV(), m_player.GetVelocity(), 1.f, false); fell = true; } else if (m_player.GetPosition().y < -20.f) { @@ -767,6 +798,10 @@ void Engine::Render(float elapsedTime) { else if (m_gamestate == GameState::MAIN_MENU || m_gamestate == GameState::OPTIONS) { DrawMenu(); + } + else if (m_gamestate == GameState::PAUSE) + { + } else if (m_gamestate == GameState::QUIT) Stop(); diff --git a/SQCSim2021/engine.h b/SQCSim2021/engine.h index 57b4e2e..07e1211 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -25,6 +25,7 @@ public: Engine(); virtual ~Engine(); virtual void DrawMenu(); + virtual void DrawPause(); virtual void Init(); virtual void DeInit(); virtual void LoadResource(); @@ -80,7 +81,7 @@ private: Bullet* m_bullets[MAX_BULLETS]; //Menu - enum class GameState { MAIN_MENU, OPTIONS, QUIT, NEWG, PLAY }; + enum class GameState { MAIN_MENU, OPTIONS, QUIT, NEWG, PLAY, PAUSE }; GameState m_gamestate = GameState::MAIN_MENU; Texture MenuTitleTexture; Texture MenuBGTexture; From e5189f437c88a3c76737328e65cfc48d13d8379a Mon Sep 17 00:00:00 2001 From: Rynort Date: Mon, 30 Oct 2023 15:49:17 -0400 Subject: [PATCH 02/10] Finission du code pour le Pause --- SQCSim2021/engine.cpp | 22 +++++++++++++++++++--- SQCSim2021/engine.h | 1 + 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index ee279dd..84a8bfd 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -239,7 +239,7 @@ void Engine::DrawPause() glMatrixMode(GL_MODELVIEW); glPushMatrix(); - MenuBGTexture.Bind(); + PauseBGTexture.Bind(); glLoadIdentity(); glBegin(GL_QUADS); glTexCoord2f(0, 0); @@ -251,6 +251,14 @@ void Engine::DrawPause() glTexCoord2f(0, 1); glVertex2i(0, 600); glEnd(); + + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + ShowCursor(); } void Engine::Init() { @@ -329,6 +337,7 @@ void Engine::LoadResource() { LoadTexture(MenuTitleTexture, MENU_ITEM_PATH "test.png"); LoadTexture(MenuBGTexture, MENU_ITEM_PATH "test.png"); + LoadTexture(PauseBGTexture, MENU_ITEM_PATH "test.png"); LoadTexture(MenuQuitTexture, MENU_ITEM_PATH "BasicQuit.png"); LoadTexture(MenuOptionsTexture, MENU_ITEM_PATH "test.png"); LoadTexture(MenuStartTexture, MENU_ITEM_PATH "BasicPlay.png"); @@ -801,7 +810,7 @@ void Engine::Render(float elapsedTime) { } else if (m_gamestate == GameState::PAUSE) { - + DrawPause(); } else if (m_gamestate == GameState::QUIT) Stop(); @@ -830,7 +839,14 @@ void Engine::KeyPressEvent(unsigned char key) { } break; case 36: // ESC - Quitter - m_gamestate = GameState::MAIN_MENU; + if (m_gamestate == GameState::PLAY) + { + m_gamestate = GameState::PAUSE; + } + else if (m_gamestate == GameState::PAUSE) + { + m_gamestate = GameState::PLAY; + } //Stop(); break; case 57: // Space - Sauter diff --git a/SQCSim2021/engine.h b/SQCSim2021/engine.h index 07e1211..522e1a8 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -88,6 +88,7 @@ private: Texture MenuStartTexture; Texture MenuQuitTexture; Texture MenuOptionsTexture; + Texture PauseBGTexture; float m_scale; float m_time = 0; From cd921b3ab336609083edf5325086f255497d7898 Mon Sep 17 00:00:00 2001 From: Rynort Date: Mon, 6 Nov 2023 16:04:34 -0500 Subject: [PATCH 03/10] =?UTF-8?q?R=C3=A9paration=20du=20Merge=20du=20Pause?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SQCSim2021/engine.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index e80127f..9205360 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -429,10 +429,12 @@ void Engine::LoadResource() { LoadTexture(MenuTitleTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); LoadTexture(MenuBGTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); + LoadTexture(PauseBGTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); LoadTexture(SplachScreenTexture, TEXTURE_PATH "sc2.png"); LoadTexture(MenuQuitTexture, MENU_ITEM_PATH "BasicQuit.png"); LoadTexture(MenuOptionsTexture, MENU_ITEM_PATH "test.png"); LoadTexture(MenuStartTexture, MENU_ITEM_PATH "BasicPlay.png"); + TextureAtlas::TextureIndex texDirtIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal3.png"); TextureAtlas::TextureIndex texIceIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal2.png"); TextureAtlas::TextureIndex texGrassIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "grass.png"); From 253e49b1cc35f06a1c1c754c0645059024befb8a Mon Sep 17 00:00:00 2001 From: MarcEricMartel Date: Mon, 6 Nov 2023 16:43:52 -0500 Subject: [PATCH 04/10] DOMO ARIGATO, MISUTA ROBOTO :trollface: --- SQCSim-common/netprotocol.cpp | 76 +++++++++++++++++++++++++++++++++++ SQCSim-common/netprotocol.h | 1 + SQCSim-common/player.cpp | 2 + SQCSim-common/player.h | 1 + SQCSim-srv/connection.cpp | 44 ++++++++++++++++++++ SQCSim-srv/connection.h | 8 ++++ SQCSim-srv/server.cpp | 64 +++++++++++++++++------------ SQCSim2021/engine.cpp | 4 ++ SQCSim2021/engine.h | 2 +- SQCSim2021/mesh.cpp | 2 +- SQCSim2021/openglcontext.cpp | 2 +- SQCSim2021/openglcontext.h | 2 + 12 files changed, 180 insertions(+), 28 deletions(-) diff --git a/SQCSim-common/netprotocol.cpp b/SQCSim-common/netprotocol.cpp index c6c25dd..ad1a24b 100644 --- a/SQCSim-common/netprotocol.cpp +++ b/SQCSim-common/netprotocol.cpp @@ -1024,6 +1024,82 @@ std::vector netprot::recvPacks(SOCKET sock, Buffer* buf, Buffer* outbuf) } } +std::vector netprot::recvPacksFrom(SOCKET sock, Buffer* buf, sockaddr_in from, Buffer* outbuf) { + std::vector lsPck; + int len = buf->tmp ? buf->tmp - buf->ptr : 0, + end = 0; + char* cursor = buf->tmp ? buf->tmp : nullptr, + * next = buf->tmp ? buf->tmp + 1 : buf->ptr, + * last = buf->tmp ? buf->tmp : buf->ptr; + bool ended = true; + struct pollfd fds[1]; + sockaddr_in sockad = from; + addrlen_t socklen = sizeof(sockad); + + fds[0].fd = sock; + fds[0].events = POLLIN; + + while (true) { + if (!poll(fds, 1, 0)) { + if (ended) + buf->tmp = nullptr; + return lsPck; + } + + int bytes = recvfrom(sock, &buf->ptr[len], buf->len - len, 0, (sockaddr*)&sockad, &socklen); + if (bytes <= 0) { // si recv() retourne -1 ou 0; ça veut dire qu'il y a plus rien a lire qui n'a pas déjà été traité. + if (ended) + buf->tmp = nullptr; + return lsPck; + } + len += bytes; + end = len; + + ended = false; + + while (true) { + int cmp = 0; + + if (cursor) + end -= (cursor - buf->ptr); + + if (end < 0) + break; + + cursor = (char*)memchr(next, '\r', end); + + if (cursor) { + next = cursor; + cursor--; + + cmp = memcmp(cursor, Footer, sizeof(uint32_t)); + if (cmp == 0) { + if (!outbuf) { + lsPck.push_back(last); + cursor += sizeof(uint32_t); + last = cursor; + next = cursor + 1; + } + else { + memcpy(&outbuf->ptr[cursor - last], last, cursor - last); + lsPck.push_back(&outbuf->ptr[cursor - last]); + cursor += sizeof(uint32_t); + last = cursor; + next = cursor + 1; + } + } + } + else { + if (!outbuf) + buf->tmp = last; + cursor = &buf->ptr[len]; + next = cursor + 1; + break; + }; + } + } +} + template <> void netprot::sendPack(SOCKET sock, Packet* pack, Buffer* buf) { switch (pack->type) { diff --git a/SQCSim-common/netprotocol.h b/SQCSim-common/netprotocol.h index 432e31d..74fd929 100644 --- a/SQCSim-common/netprotocol.h +++ b/SQCSim-common/netprotocol.h @@ -173,6 +173,7 @@ namespace netprot { template void sendPackTo(SOCKET sock, T* pack, Buffer* buf, sockaddr_in* sockad); std::vector recvPacks(SOCKET sock, Buffer* buf, Buffer* oufbuf = nullptr); + std::vector recvPacksFrom(SOCKET sock, Buffer* buf, sockaddr_in from, Buffer* oufbuf = nullptr); /* Templates */ diff --git a/SQCSim-common/player.cpp b/SQCSim-common/player.cpp index 790507f..faedf2f 100644 --- a/SQCSim-common/player.cpp +++ b/SQCSim-common/player.cpp @@ -192,6 +192,8 @@ void Player::ApplyTransformation(Transformation& transformation, bool rel) const if (rel) transformation.ApplyTranslation(-GetPOV()); } +void Player::SetDirection(Vector3f dir) { m_direction = dir; } + Vector3f Player::GetPosition() const { return Vector3f(m_position.x + CHUNK_SIZE_X * WORLD_SIZE_X / 2, m_position.y, m_position.z + CHUNK_SIZE_Z * WORLD_SIZE_Y / 2); } Vector3f Player::GetVelocity() const { return m_velocity; } diff --git a/SQCSim-common/player.h b/SQCSim-common/player.h index eedbf74..9730c58 100644 --- a/SQCSim-common/player.h +++ b/SQCSim-common/player.h @@ -20,6 +20,7 @@ public: Sound ApplyPhysics(Vector3f input, World* world, float elapsedTime); void ApplyTransformation(Transformation& transformation, bool rel = true) const; + void SetDirection(Vector3f dir); Vector3f GetPosition() const; Vector3f GetDirection() const; Vector3f GetVelocity() const; diff --git a/SQCSim-srv/connection.cpp b/SQCSim-srv/connection.cpp index 079b0fb..c721255 100644 --- a/SQCSim-srv/connection.cpp +++ b/SQCSim-srv/connection.cpp @@ -47,6 +47,50 @@ PlayerInfo* Connection::getInfo() const { return (PlayerInfo*)&m_playinfo; } sockaddr_in* Connection::getAddr() const { return (sockaddr_in*)&m_addr; } +void Connection::getPacks() { + std::vector lsPck; + Input in; + while (true) { + lsPck = recvPacksFrom(m_sock, m_buf, m_addr); + + for (auto& pck : lsPck) { + uint32_t bsize = m_buf->len - (pck - m_buf->ptr); + switch (netprot::getType(pck, 1)) { + using enum netprot::PACKET_TYPE; + case INPUT: + if (Deserialize(&in, pck, &bsize)) + m_input_manifest.insert({ in.timestamp, in }); + break; + default: break; + } + } + lsPck.clear(); + } +} + +std::thread Connection::Start(){ return std::thread(getPacks); } + +void Connection::Run(World* world) { + Input in, last; + Output out; + float el; + + if (m_input_manifest.size() < 2) + return; + + in = m_input_manifest.at(m_input_manifest.size()); + last = m_input_manifest.at(m_input_manifest.size() - 1); + + el = (float)(in.timestamp - last.timestamp) / 1000.; + + player.get()->SetDirection(in.direction); + player.get()->ApplyPhysics(player.get()->GetInput(in.keys.forward, in.keys.backward, in.keys.left, in.keys.right, in.keys.jump, false, el), world, el); + + out.position = player.get()->GetPosition(); + out.direction = in.direction; + out.timestamp = in.timestamp; +} + void Connection::CleanInputManifest(Timestamp time) { auto wat = m_input_manifest.find(time); diff --git a/SQCSim-srv/connection.h b/SQCSim-srv/connection.h index 9233273..0d96bba 100644 --- a/SQCSim-srv/connection.h +++ b/SQCSim-srv/connection.h @@ -6,6 +6,7 @@ #include "../SQCSim-common/player.h" #include "../SQCSim-common/vector3.h" #include "../SQCSim-common/netprotocol.h" +#include "../SQCSim-common/world.h" #include "define.h" using namespace netprot; @@ -32,6 +33,12 @@ public: PlayerInfo* getInfo() const; sockaddr_in* getAddr() const; + void getPacks(); + + std::thread Start(); + + void Run(World* world); + void CleanInputManifest(Timestamp time); private: std::unordered_map m_input_manifest; @@ -43,5 +50,6 @@ private: LoginInfo m_loginfo; PlayerInfo m_playinfo; + Buffer* m_buf; }; #endif diff --git a/SQCSim-srv/server.cpp b/SQCSim-srv/server.cpp index fc2184e..72d53b4 100644 --- a/SQCSim-srv/server.cpp +++ b/SQCSim-srv/server.cpp @@ -175,17 +175,24 @@ int Server::Ready() { } void Server::Run() { + bool endgame = false; Input in; sockaddr_in sockad; addrlen_t socklen = sizeof(sockad); Log("Debut de la partie...", false, false); + int players = m_players.size(); + std::thread* getPacksThreads = new std::thread[players]; + m_world = std::make_unique(); m_world->SetSeed(m_game.seed); m_world->GetChunks().Reset(nullptr); m_world->BuildWorld(); + for (int x = 0; x < players; ++x) + getPacksThreads[x] = m_players[x].get()->start(); + for (auto& [key, conn] : m_players) { // Creation des instances de joueurs et premier sync. conn->player = std::make_unique(Vector3f(8.5f, CHUNK_SIZE_Y + 1.8f, 8.5f)); Sync sync; @@ -198,32 +205,39 @@ void Server::Run() { sendPack(conn->getSock(), &sync, &m_buf); } - while (true) { - if (recvfrom(m_sock_udp, m_buf.ptr, m_buf.len, 0, (sockaddr*)&sockad, &socklen) > 0) { - Packet pck = getPack(&m_buf); - switch (pck.type) { - using enum netprot::PACKET_TYPE; - case ERR: std::puts("ERROR!"); break; - case INPUT: std::puts("INPUT!"); break; - case OUTPUT: std::puts("OUTPUT!"); break; - case SYNC: std::puts("SYNC!"); break; - case TEAMINF: std::puts("TEAMINF!"); break; - case SELFINF: std::puts("SELFINF!"); break; - case PLAYINF: std::puts("PLAYINF!"); break; - case LOGINF: std::puts("LOGINF!"); break; - case CHUNKMOD: std::puts("CHUNKMOD!"); break; - case PLAYERMOD: std::puts("PLAYERMOD!"); break; - case PICKUPMOD: std::puts("PICKUPMOD!"); break; - case GAMEINFO: std::puts("GAMEINFO!"); break; - case ENDINFO: std::puts("ENDINFO!"); break; - case CHAT: std::puts("CHAT!"); break; - case ERRLOG: std::puts("ERRLOG!"); break; - case LAST_PACK: [[falltrough]]; - default: std::puts("wtf?!"); break; - } - netprot::emptyPack(pck); - } + while (!endgame) { + for (auto& [key, conn] : m_players) { + conn->player->GetInput + } } + + //while (true) { + // if (recvfrom(m_sock_udp, m_buf.ptr, m_buf.len, 0, (sockaddr*)&sockad, &socklen) > 0) { + // Packet pck = getPack(&m_buf); + // switch (pck.type) { + // using enum netprot::PACKET_TYPE; + // case ERR: std::puts("ERROR!"); break; + // case INPUT: std::puts("INPUT!"); break; + // case OUTPUT: std::puts("OUTPUT!"); break; + // case SYNC: std::puts("SYNC!"); break; + // case TEAMINF: std::puts("TEAMINF!"); break; + // case SELFINF: std::puts("SELFINF!"); break; + // case PLAYINF: std::puts("PLAYINF!"); break; + // case LOGINF: std::puts("LOGINF!"); break; + // case CHUNKMOD: std::puts("CHUNKMOD!"); break; + // case PLAYERMOD: std::puts("PLAYERMOD!"); break; + // case PICKUPMOD: std::puts("PICKUPMOD!"); break; + // case GAMEINFO: std::puts("GAMEINFO!"); break; + // case ENDINFO: std::puts("ENDINFO!"); break; + // case CHAT: std::puts("CHAT!"); break; + // case ERRLOG: std::puts("ERRLOG!"); break; + // case LAST_PACK: [[falltrough]]; + // default: std::puts("wtf?!"); break; + // } + // netprot::emptyPack(pck); + // } + //} + } inline std::string Server::LogTimestamp() { diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index 1e7ea27..b5d02ad 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -305,6 +305,10 @@ void Engine::Init() { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_SUBTRACT); + if (m_istarted) + return; + else m_istarted = true; + // // Objet de skybox avec sa propre texture et son propre shader! m_skybox.Init(0.2f); diff --git a/SQCSim2021/engine.h b/SQCSim2021/engine.h index 41b8a4f..72f7986 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -126,7 +126,7 @@ private: bool m_resetcountdown = false; bool m_soloMultiChoiceMade = false; bool m_stopcountdown = false; - + bool m_keyK = false; bool m_keyL = false; bool m_keyW = false; diff --git a/SQCSim2021/mesh.cpp b/SQCSim2021/mesh.cpp index 04294af..c6f6b9b 100644 --- a/SQCSim2021/mesh.cpp +++ b/SQCSim2021/mesh.cpp @@ -9,7 +9,7 @@ Mesh::~Mesh() { void Mesh::FlushMeshToVBO() { m_vertexBuffer.SetMeshData(m_vd, m_vcount); m_vcount = 0; - //delete[] m_vd; + delete[] m_vd; } void Mesh::FlushVBO() { diff --git a/SQCSim2021/openglcontext.cpp b/SQCSim2021/openglcontext.cpp index 7a61b07..6284446 100644 --- a/SQCSim2021/openglcontext.cpp +++ b/SQCSim2021/openglcontext.cpp @@ -15,7 +15,7 @@ bool OpenglContext::Start(const std::string& title, int width, int height, bool m_title = title; m_fullscreen = fullscreen; InitWindow(width, height); - + Init(); LoadResource(); diff --git a/SQCSim2021/openglcontext.h b/SQCSim2021/openglcontext.h index 3825b26..2718540 100644 --- a/SQCSim2021/openglcontext.h +++ b/SQCSim2021/openglcontext.h @@ -52,6 +52,8 @@ protected: void HideCursor(); void ShowCrossCursor() const; + bool m_istarted = false; + private: void InitWindow(int width, int height); MOUSE_BUTTON ConvertMouseButton(sf::Mouse::Button button) const; From bc1f4f750bb064f02c57a6415622ea6d42dc3244 Mon Sep 17 00:00:00 2001 From: MarcEricMartel Date: Mon, 6 Nov 2023 17:59:57 -0500 Subject: [PATCH 05/10] heum well --- SQCSim-srv/connection.cpp | 46 ++++++++++++++++++++++++++++----------- SQCSim-srv/connection.h | 12 ++++++---- SQCSim-srv/server.cpp | 14 +++++------- SQCSim-srv/server.h | 4 ++-- SQCSim2021/engine.cpp | 22 +++++++++++++++++-- SQCSim2021/engine.h | 2 +- 6 files changed, 70 insertions(+), 30 deletions(-) diff --git a/SQCSim-srv/connection.cpp b/SQCSim-srv/connection.cpp index c721255..4ac9968 100644 --- a/SQCSim-srv/connection.cpp +++ b/SQCSim-srv/connection.cpp @@ -47,19 +47,19 @@ PlayerInfo* Connection::getInfo() const { return (PlayerInfo*)&m_playinfo; } sockaddr_in* Connection::getAddr() const { return (sockaddr_in*)&m_addr; } -void Connection::getPacks() { +void Connection::getPacks(SOCKET sock) { std::vector lsPck; Input in; while (true) { - lsPck = recvPacksFrom(m_sock, m_buf, m_addr); + lsPck = recvPacksFrom(sock, &m_buf, m_addr); for (auto& pck : lsPck) { - uint32_t bsize = m_buf->len - (pck - m_buf->ptr); + uint32_t bsize = m_buf.len - (pck - m_buf.ptr); switch (netprot::getType(pck, 1)) { using enum netprot::PACKET_TYPE; case INPUT: if (Deserialize(&in, pck, &bsize)) - m_input_manifest.insert({ in.timestamp, in }); + m_input_manifest[in.timestamp] = in; break; default: break; } @@ -68,7 +68,17 @@ void Connection::getPacks() { } } -std::thread Connection::Start(){ return std::thread(getPacks); } +void Connection::sendPacks(SOCKET sock, std::unordered_map conns) { + while (m_last_out < m_output_manifest.size()) { + Output out = m_output_manifest.at(m_last_out++); + + for (auto& [key, conn] : conns) { + if (m_playinfo.id == conn->GetHash(true)) + continue; + sendPackTo(sock, &out, &m_bufout, conn->getAddr()); + } + } +} void Connection::Run(World* world) { Input in, last; @@ -78,17 +88,27 @@ void Connection::Run(World* world) { if (m_input_manifest.size() < 2) return; - in = m_input_manifest.at(m_input_manifest.size()); - last = m_input_manifest.at(m_input_manifest.size() - 1); + while (m_last_in < m_input_manifest.size()) { + in = m_input_manifest.at(m_last_in + 1); + last = m_input_manifest.at(m_last_in); - el = (float)(in.timestamp - last.timestamp) / 1000.; + el = (float)(in.timestamp - last.timestamp) / 1000.; + player.get()->SetDirection(in.direction); + player.get()->ApplyPhysics(player.get()->GetInput(in.keys.forward, + in.keys.backward, + in.keys.left, + in.keys.right, + in.keys.jump, false, el), world, el); - player.get()->SetDirection(in.direction); - player.get()->ApplyPhysics(player.get()->GetInput(in.keys.forward, in.keys.backward, in.keys.left, in.keys.right, in.keys.jump, false, el), world, el); + out.position = player.get()->GetPosition(); + out.direction = in.direction; + out.timestamp = in.timestamp; + out.id = m_playinfo.id; - out.position = player.get()->GetPosition(); - out.direction = in.direction; - out.timestamp = in.timestamp; + m_output_manifest[out.timestamp] = out; + + ++m_last_in; + } } void Connection::CleanInputManifest(Timestamp time) { diff --git a/SQCSim-srv/connection.h b/SQCSim-srv/connection.h index 0d96bba..af9c2df 100644 --- a/SQCSim-srv/connection.h +++ b/SQCSim-srv/connection.h @@ -33,9 +33,8 @@ public: PlayerInfo* getInfo() const; sockaddr_in* getAddr() const; - void getPacks(); - - std::thread Start(); + void getPacks(SOCKET sock); + void sendPacks(SOCKET sock, std::unordered_map conns); void Run(World* world); @@ -50,6 +49,11 @@ private: LoginInfo m_loginfo; PlayerInfo m_playinfo; - Buffer* m_buf; + Timestamp m_startsync; + + uint64_t m_last_in = 0, + m_last_out = 0; + Buffer m_buf, + m_bufout; }; #endif diff --git a/SQCSim-srv/server.cpp b/SQCSim-srv/server.cpp index 72d53b4..e724269 100644 --- a/SQCSim-srv/server.cpp +++ b/SQCSim-srv/server.cpp @@ -155,7 +155,7 @@ int Server::Ready() { play.tid = log->tid; sendPack(sock, &m_game, &m_buf); - std::unique_ptr conn = std::make_unique(sock, sockad, *log, play); + Connection* conn = new Connection(sock, sockad, *log, play); for (auto& [key, player] : m_players) { sendPack(player->getSock(), &play, &m_buf); // Envoyer les infos de joueur distant aux joueurs d�j� connect�s @@ -183,16 +183,12 @@ void Server::Run() { Log("Debut de la partie...", false, false); int players = m_players.size(); - std::thread* getPacksThreads = new std::thread[players]; - m_world = std::make_unique(); + m_world = new World(); m_world->SetSeed(m_game.seed); m_world->GetChunks().Reset(nullptr); m_world->BuildWorld(); - - for (int x = 0; x < players; ++x) - getPacksThreads[x] = m_players[x].get()->start(); - + for (auto& [key, conn] : m_players) { // Creation des instances de joueurs et premier sync. conn->player = std::make_unique(Vector3f(8.5f, CHUNK_SIZE_Y + 1.8f, 8.5f)); Sync sync; @@ -207,7 +203,9 @@ void Server::Run() { while (!endgame) { for (auto& [key, conn] : m_players) { - conn->player->GetInput + conn->getPacks(m_sock_udp); + conn->Run(m_world); + conn->sendPacks(m_sock_udp, m_players); } } diff --git a/SQCSim-srv/server.h b/SQCSim-srv/server.h index ee14723..dd5a397 100644 --- a/SQCSim-srv/server.h +++ b/SQCSim-srv/server.h @@ -36,12 +36,12 @@ private: Buffer m_buf; - std::unordered_map> m_players; + std::unordered_map m_players; std::unordered_map m_chatlog; std::vector m_ids; GameInfo m_game; - std::unique_ptr m_world = nullptr; + World* m_world = nullptr; const bool m_manual_setup = SRV_MANUAL_SETUP; std::string LogTimestamp(); diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index b5d02ad..c89c304 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -1111,6 +1111,7 @@ void Engine::Render(float elapsedTime) { using namespace std::chrono; using namespace netprot; Input input; + static std::vector lsPck; input.sid = m_conn.getId(); input.direction = m_player.GetDirection(); @@ -1123,10 +1124,27 @@ void Engine::Render(float elapsedTime) { input.keys.block = m_mouseR; input.keys.shoot = m_mouseL; - sendPackTo(m_conn.m_sock_udp, &input, &m_buf, &m_conn.m_srvsockaddr); + sendPackTo(m_conn.m_sock_udp, &input, &m_bufout, &m_conn.m_srvsockaddr); - // TODO: Faire la gestion de la réception de paquets. + lsPck = recvPacks(m_conn.m_sock_udp, &m_buf); + for (auto& pck : lsPck) { + uint32_t bsize = m_buf.len - (pck - m_buf.ptr); + netprot::Sync sync; + netprot::Output out; + switch (netprot::getType(pck, 1)) { + using enum netprot::PACKET_TYPE; + case SYNC: + if (!netprot::Deserialize(&sync, pck, &bsize)) {} + break; + case OUTPUT: + if (!netprot::Deserialize(&out, pck, &bsize)) {} + break; + default: + break; + } + } + lsPck.clear(); } } else if (m_gamestate == GameState::MAIN_MENU || m_gamestate == GameState::OPTIONS) diff --git a/SQCSim2021/engine.h b/SQCSim2021/engine.h index 72f7986..49263b3 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -90,7 +90,7 @@ private: Bullet* m_bullets[MAX_BULLETS]; std::unordered_map m_players; - netprot::Buffer m_buf; + netprot::Buffer m_buf, m_bufout; std::chrono::high_resolution_clock::time_point m_startTime; //Menu From 8bd46ba831267d10d75cfb264e597d1f1a9a3562 Mon Sep 17 00:00:00 2001 From: MarcEricMartel Date: Tue, 7 Nov 2023 07:46:11 -0500 Subject: [PATCH 06/10] Receiving :package: --- SQCSim2021/engine.cpp | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index c89c304..fa20611 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -1127,18 +1127,28 @@ void Engine::Render(float elapsedTime) { sendPackTo(m_conn.m_sock_udp, &input, &m_bufout, &m_conn.m_srvsockaddr); lsPck = recvPacks(m_conn.m_sock_udp, &m_buf); - - for (auto& pck : lsPck) { - uint32_t bsize = m_buf.len - (pck - m_buf.ptr); - netprot::Sync sync; - netprot::Output out; - switch (netprot::getType(pck, 1)) { - using enum netprot::PACKET_TYPE; + char* prevptr = nullptr; + for (auto& pck : lsPck) { // We could make a few threads out of this. + Sync sync; + Output out; + if (!prevptr) + prevptr = m_buf.ptr; + uint32_t bsize = m_buf.len - (pck - prevptr); + prevptr = pck; + switch (getType(pck, 1)) { + using enum PACKET_TYPE; case SYNC: - if (!netprot::Deserialize(&sync, pck, &bsize)) {} + if (Deserialize(&sync, pck, &bsize)) { + if (sync.sid != m_conn.getId()) + break; + // TODO: Vérifier si les positions concordent. + } break; case OUTPUT: - if (!netprot::Deserialize(&out, pck, &bsize)) {} + if (Deserialize(&out, pck, &bsize)) { + RemotePlayer* r = (RemotePlayer*)m_players[out.id]; + r->Feed(out); + } break; default: break; From e5e3c19137fe1dcc0ece3f8adf544d21424cbdca Mon Sep 17 00:00:00 2001 From: MarcEricMartel Date: Tue, 7 Nov 2023 07:56:59 -0500 Subject: [PATCH 07/10] =?UTF-8?q?:clock1:=20=20Impl=C3=A9mentation=20de=20?= =?UTF-8?q?la=20synchro=20basique.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SQCSim2021/engine.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index fa20611..6042225 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -1107,15 +1107,26 @@ void Engine::Render(float elapsedTime) { fell = false; } - if (m_networkgame) { + if (m_networkgame) { // Pour se gerer le paquet. using namespace std::chrono; using namespace netprot; + Timestamp tstamp = duration_cast(high_resolution_clock::now() - m_startTime).count(); Input input; + Sync sync; + uint64_t id = m_conn.getId(); static std::vector lsPck; - input.sid = m_conn.getId(); + if (false) { // TODO: Faire un checkup pour chaque ~1000ms. + sync.sid = id; + sync.timestamp = tstamp; + sync.position = m_player.GetPosition(); + sync.hp = m_player.GetHP(); + // TODO: Garrocher ca quelque-part. + } + + input.sid = id; input.direction = m_player.GetDirection(); - input.timestamp = duration_cast(high_resolution_clock::now() - m_startTime).count(); + input.timestamp = tstamp; input.keys.forward = m_keyW; input.keys.backward = m_keyS; input.keys.left = m_keyA; @@ -1141,7 +1152,7 @@ void Engine::Render(float elapsedTime) { if (Deserialize(&sync, pck, &bsize)) { if (sync.sid != m_conn.getId()) break; - // TODO: Vérifier si les positions concordent. + // TODO: Vérifier si les positions concordent au sync local. } break; case OUTPUT: From 80a5bf90b4ff6e84d6897a4449bd58e036f43de4 Mon Sep 17 00:00:00 2001 From: Jonathan Trottier Date: Wed, 8 Nov 2023 10:32:16 -0500 Subject: [PATCH 08/10] =?UTF-8?q?r=C3=A9tr=C3=A9cissement=20du=20monde?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SQCSim-common/world.cpp | 21 +++++++++++++++++++++ SQCSim-common/world.h | 2 ++ SQCSim2021/engine.cpp | 9 ++++++++- SQCSim2021/engine.h | 2 ++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/SQCSim-common/world.cpp b/SQCSim-common/world.cpp index c18c32c..a803e01 100644 --- a/SQCSim-common/world.cpp +++ b/SQCSim-common/world.cpp @@ -16,6 +16,9 @@ void World::SetSeed(uint64_t seed) { m_seed = seed; } + + + Chunk* World::ChunkAt(float x, float y, float z) const { int cx = (int)x / CHUNK_SIZE_X; int cz = (int)z / CHUNK_SIZE_Z; @@ -31,6 +34,24 @@ Chunk* World::ChunkAt(float x, float y, float z) const { Chunk* World::ChunkAt(const Vector3f& pos) const { return ChunkAt(pos.x, pos.y, pos.z); } +void World::RemoveChunk(int nbReduit) +{ + for (int x = 0; x < WORLD_SIZE_X; ++x) + for (int y = 0; y < WORLD_SIZE_Y; ++y) + { + if (x < nbReduit) + m_chunks.Remove(x,y); + if (y < nbReduit) + m_chunks.Remove(x, y); + if (y > WORLD_SIZE_Y - nbReduit) + m_chunks.Remove(x, y); + if (x > WORLD_SIZE_X - nbReduit) + m_chunks.Remove(x, y); + } + + +} + BlockType World::BlockAt(float x, float y, float z, BlockType defaultBlockType) const { Chunk* c = ChunkAt(x, y, z); diff --git a/SQCSim-common/world.h b/SQCSim-common/world.h index 8a166af..e9b4840 100644 --- a/SQCSim-common/world.h +++ b/SQCSim-common/world.h @@ -28,6 +28,8 @@ public: Chunk* ChunkAt(float x, float y, float z) const; Chunk* ChunkAt(const Vector3f& pos) const; + void RemoveChunk(int nbReduit); + BlockType BlockAt(float x, float y, float z, BlockType defaultBlockType = BTYPE_AIR) const; BlockType BlockAt(const Vector3f& pos, BlockType defaultBlockType = BTYPE_AIR) const; diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index 76f379b..bc4b6b5 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -883,7 +883,11 @@ void Engine::DrawHud(float elapsedTime, BlockType bloc) { glPushMatrix(); int timer = GetCountdown(elapsedTime); - + for (int i = 1; i < WORLD_SIZE_X; i++) + { + if (timer <= COUNTDOWN - m_timerReductionChunk * i) + m_world.RemoveChunk(m_nbReductionChunk * i); + } if (m_keyK) { SystemNotification(m_messageNotification); m_keyK = false; @@ -953,6 +957,8 @@ int Engine::GetFps(float elapsedTime) const { return 1 / elapsedTime; } int Engine::GetCountdown(float elapsedTime) { if (m_resetcountdown) { + m_nbReductionChunk = 4; + m_timerReductionChunk = 30; m_countdown = m_time + COUNTDOWN; m_resetcountdown = false; } @@ -1081,6 +1087,7 @@ void Engine::Render(float elapsedTime) { m_world.Update(m_bullets, m_player.GetPosition(), m_blockinfo); m_renderer.UpdateMesh(&m_world, m_player.GetPosition(), m_blockinfo); + if (m_isSkybox) m_skybox.Render(skybox); DrawHud(elapsedTime, bloc); diff --git a/SQCSim2021/engine.h b/SQCSim2021/engine.h index d51d064..ab48557 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -109,6 +109,8 @@ private: int m_renderCount = 0; int m_countdown = COUNTDOWN; + int m_nbReductionChunk = 4; + int m_timerReductionChunk = 30; bool m_damage = false; From c98625a610ed107b713eb5f8bab68e4bda56bc0e Mon Sep 17 00:00:00 2001 From: MarcEricMartel Date: Mon, 13 Nov 2023 16:46:03 -0500 Subject: [PATCH 09/10] correction --- SQCSim-common/world.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/SQCSim-common/world.cpp b/SQCSim-common/world.cpp index a803e01..25c5a3b 100644 --- a/SQCSim-common/world.cpp +++ b/SQCSim-common/world.cpp @@ -39,14 +39,22 @@ void World::RemoveChunk(int nbReduit) for (int x = 0; x < WORLD_SIZE_X; ++x) for (int y = 0; y < WORLD_SIZE_Y; ++y) { + Chunk* chk = nullptr; if (x < nbReduit) - m_chunks.Remove(x,y); + chk = m_chunks.Remove(x, y); if (y < nbReduit) - m_chunks.Remove(x, y); + chk = m_chunks.Remove(x, y); if (y > WORLD_SIZE_Y - nbReduit) - m_chunks.Remove(x, y); + chk = m_chunks.Remove(x, y); if (x > WORLD_SIZE_X - nbReduit) - m_chunks.Remove(x, y); + chk = m_chunks.Remove(x, y); + + // TODO: MakeDirty() les voisins pour qu'ils se redessinent. + + if (!chk) + continue; + + m_tbDeleted.emplace_back(chk); } From 86536fbb99538aca994a2810762a6ad49ce4e1a1 Mon Sep 17 00:00:00 2001 From: MarcEricMartel Date: Wed, 15 Nov 2023 08:27:51 -0500 Subject: [PATCH 10/10] =?UTF-8?q?Maintenant=20je=20comprend=20les=20singes?= =?UTF-8?q?=20au=20d=C3=A9but=20de=202001=20A=20Space=20Odyssey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SQCSim2021/engine.cpp | 14 ++++++++------ SQCSim2021/mesh.h | 2 +- SQCSim2021/remoteplayer.cpp | 17 +++++++++++------ SQCSim2021/renderer.cpp | 26 ++++++++++++++++++++++++++ SQCSim2021/renderer.h | 2 ++ 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index eb18f9d..81afefa 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -935,8 +935,10 @@ void Engine::DrawHud(float elapsedTime, BlockType bloc) { int timer = GetCountdown(elapsedTime); for (int i = 1; i < WORLD_SIZE_X; i++) { - if (timer <= COUNTDOWN - m_timerReductionChunk * i) + if (timer <= COUNTDOWN - m_timerReductionChunk * i) { m_world.RemoveChunk(m_nbReductionChunk * i); + m_renderer.RemoveChunk(m_nbReductionChunk * i); + } } if (m_keyK) { SystemNotification(m_messageNotification); @@ -1081,7 +1083,7 @@ void Engine::Render(float elapsedTime) { - m_remotePlayer.Render(m_textureAtlas, m_shader01, elapsedTime); + //m_remotePlayer.ApplyTransformation(all); if (m_mouseWU) bloc++; @@ -1138,15 +1140,15 @@ void Engine::Render(float elapsedTime) { } } - //m_renderer.RenderWorld(&m_world, m_renderCount, m_player.GetPosition(), m_player.GetDirection(), all, m_shader01, m_textureAtlas); + if (m_isSkybox) m_renderer.RenderWorld(&m_world, m_renderCount, m_player.GetPosition(), m_player.GetDirection(), all, m_shader01, m_textureAtlas); m_world.Update(m_bullets, m_player.GetPosition(), m_blockinfo); m_renderer.UpdateMesh(&m_world, m_player.GetPosition(), m_blockinfo); - + m_remotePlayer.Render(m_textureAtlas, m_shader01, elapsedTime); if (m_isSkybox) m_skybox.Render(skybox); - DrawHud(elapsedTime, bloc); - DisplayPovGun(); + if (m_isSkybox) DrawHud(elapsedTime, bloc); + if (m_isSkybox) DisplayPovGun(); ProcessNotificationQueue(); if (m_damage) { diff --git a/SQCSim2021/mesh.h b/SQCSim2021/mesh.h index 0a070ff..138d0e2 100644 --- a/SQCSim2021/mesh.h +++ b/SQCSim2021/mesh.h @@ -15,7 +15,7 @@ private: Chunk* m_chunk; // NE PAS DÉTRUIRE ICI. void AddBlockToMesh(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s, World* world); - + void RemoveChunk(int nbReduit); public: Mesh(Chunk* chunk); ~Mesh(); diff --git a/SQCSim2021/remoteplayer.cpp b/SQCSim2021/remoteplayer.cpp index 31d396c..9fd493d 100644 --- a/SQCSim2021/remoteplayer.cpp +++ b/SQCSim2021/remoteplayer.cpp @@ -87,15 +87,20 @@ void RemotePlayer::Feed(const netprot::Output out) { void RemotePlayer::Render(TextureAtlas& atlas, Shader& shader, float elapsedTime) { + shader.Use(); + //m_texture_front.Bind(); - m_texture_front.Bind(); + + float u, v, w, h; + atlas.Bind(); + atlas.TextureIndexToCoord(0, u, v, w, h); glBegin(GL_QUADS); - glTexCoord2f(0, 0); glVertex2f(0, 500); - glTexCoord2f(1, 0); glVertex2f(500, 500); - glTexCoord2f(1, 1); glVertex2f(500, 0); - glTexCoord2f(0, 1); glVertex2f(0, 0); + glTexCoord2f(u, v); glVertex3f(0, 50., 0); + glTexCoord2f(u+w, v); glVertex3f(50., 50., 0); + glTexCoord2f(u+w, v+h); glVertex3f(50., 0, 0); + glTexCoord2f(u, v+h); glVertex3f(0, 0, 0); glEnd(); - + shader.Disable(); } bool RemotePlayer::LoadTexture(Texture& texture, const std::string& filename, bool useMipmaps, bool stopOnError) diff --git a/SQCSim2021/renderer.cpp b/SQCSim2021/renderer.cpp index b4c8f91..b430b34 100644 --- a/SQCSim2021/renderer.cpp +++ b/SQCSim2021/renderer.cpp @@ -7,6 +7,32 @@ Renderer::Renderer() { Renderer::~Renderer() { } +void Renderer::RemoveChunk(int nbReduit) +{ + for (int x = 0; x < WORLD_SIZE_X; ++x) + for (int y = 0; y < WORLD_SIZE_Y; ++y) + { + Mesh* chk = nullptr; + if (x < nbReduit) + chk = m_meshes.Remove(x, y); + if (y < nbReduit) + chk = m_meshes.Remove(x, y); + if (y > WORLD_SIZE_Y - nbReduit) + chk = m_meshes.Remove(x, y); + if (x > WORLD_SIZE_X - nbReduit) + chk = m_meshes.Remove(x, y); + + // TODO: MakeDirty() les voisins pour qu'ils se redessinent. + + if (!chk) + continue; + + delete chk; + } + + +} + void Renderer::RenderWorld(World* origin, int& rendercount, const Vector3f& player_pos, const Vector3f& player_dir, Transformation& world, Shader& shader, TextureAtlas& atlas) const { rendercount = 0; Vector3f angle; diff --git a/SQCSim2021/renderer.h b/SQCSim2021/renderer.h index 8afdc3b..4c8e9dd 100644 --- a/SQCSim2021/renderer.h +++ b/SQCSim2021/renderer.h @@ -21,6 +21,8 @@ public: Renderer(); ~Renderer(); + void RemoveChunk(int nbReduit); + void UpdateMesh(World* origin, const Vector3f& player, BlockInfo* blockinfo[BTYPE_LAST]); void RenderWorld(World* origin, int& rendercount, const Vector3f& player_pos, const Vector3f& player_dir, Transformation& world, Shader& shader, TextureAtlas& atlas) const;