From 0a3f6b961eba7b48a5a26db13627c82e7b7a5667 Mon Sep 17 00:00:00 2001 From: Thomaltarix Date: Wed, 12 Jun 2024 18:28:36 +0200 Subject: [PATCH 1/6] refactor: Remove useless void specifiers --- gui/include/GameDatas/Tile.hpp | 4 ++-- gui/src/GameDatas/Tile.cpp | 4 ++-- gui/src/Render/Render.cpp | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gui/include/GameDatas/Tile.hpp b/gui/include/GameDatas/Tile.hpp index d0626664..2255f4ad 100644 --- a/gui/include/GameDatas/Tile.hpp +++ b/gui/include/GameDatas/Tile.hpp @@ -56,14 +56,14 @@ class Gui::Tile { * * @return std::pair - position x y */ - std::pair getPosition(void) const; + std::pair getPosition() const; /** * @brief Get the Position In Space object. * * @return Vector3 - Position in space. */ - Vector3 getPositionIn3DSpace(void); + Vector3 getPositionIn3DSpace(); /** * @brief Inventory of the tile. diff --git a/gui/src/GameDatas/Tile.cpp b/gui/src/GameDatas/Tile.cpp index 84e4c51a..69abffc4 100644 --- a/gui/src/GameDatas/Tile.cpp +++ b/gui/src/GameDatas/Tile.cpp @@ -24,12 +24,12 @@ void Gui::Tile::setPosition(std::pair position) _positionIn3DSpace = (Vector3) {(float)(position.first * SIZE_TILE), 0.0f, (float)(position.second * SIZE_TILE)}; } -std::pair Gui::Tile::getPosition(void) const +std::pair Gui::Tile::getPosition() const { return _position; } -Vector3 Gui::Tile::getPositionIn3DSpace(void) +Vector3 Gui::Tile::getPositionIn3DSpace() { return _positionIn3DSpace; } diff --git a/gui/src/Render/Render.cpp b/gui/src/Render/Render.cpp index bb3ae6bb..72b7a5c2 100644 --- a/gui/src/Render/Render.cpp +++ b/gui/src/Render/Render.cpp @@ -73,12 +73,12 @@ void Gui::Render::setIsDebug(bool isDebug) _isDebug = isDebug; } -bool Gui::Render::getIsDebug(void) +bool Gui::Render::getIsDebug() { return _isDebug; } -void Gui::Render::displayDebug(void) +void Gui::Render::displayDebug() { if (_isDebug) { DrawFPS(10, 10); @@ -95,7 +95,7 @@ void Gui::Render::displayDebug(void) } } -void Gui::Render::displayPlayers(void) +void Gui::Render::displayPlayers() { for (auto &team : _gameData->getTeams()) { for (auto &player : team.getPlayers()) { @@ -117,7 +117,7 @@ void Gui::Render::displayPlayers(void) } } -void Gui::Render::displayMap(void) +void Gui::Render::displayMap() { for (auto &line : _gameData->getMap()) { for (auto &tile : line) { From 5233eed12b2a19a22398b5af86d50de08ce1dcfa Mon Sep 17 00:00:00 2001 From: Thomaltarix Date: Wed, 12 Jun 2024 18:29:38 +0200 Subject: [PATCH 2/6] feat: Method to access the tile model --- gui/include/Render/Render.hpp | 6 ++++++ gui/src/Render/Render.cpp | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/gui/include/Render/Render.hpp b/gui/include/Render/Render.hpp index 9ebf4bcc..5cb19ef9 100644 --- a/gui/include/Render/Render.hpp +++ b/gui/include/Render/Render.hpp @@ -108,6 +108,12 @@ class Gui::Render { */ std::size_t getCameraPlayerPov() const; + /** + * @brief Get the Tile model. + * + */ + Model getTileModel() const; + private: UserCamera _camera; // Camera of the scene. diff --git a/gui/src/Render/Render.cpp b/gui/src/Render/Render.cpp index 72b7a5c2..67bca60b 100644 --- a/gui/src/Render/Render.cpp +++ b/gui/src/Render/Render.cpp @@ -242,3 +242,8 @@ std::size_t Gui::Render::getCameraPlayerPov() const { return _camera.getPlayerId(); } + +Model Gui::Render::getTileModel() const +{ + return _tileModel; +} From 9ce04a0e067fddd900b47bc3d000be48b8ba6d34 Mon Sep 17 00:00:00 2001 From: Thomaltarix Date: Wed, 12 Jun 2024 18:30:08 +0200 Subject: [PATCH 3/6] feat: Display of the tile and its hitbox --- gui/include/Render/Render.hpp | 6 ++++++ gui/src/Render/Render.cpp | 12 +++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/gui/include/Render/Render.hpp b/gui/include/Render/Render.hpp index 5cb19ef9..26c6f436 100644 --- a/gui/include/Render/Render.hpp +++ b/gui/include/Render/Render.hpp @@ -154,6 +154,12 @@ class Gui::Render { */ void displayMap(void); + /** + * @brief Display a Tile. + * + */ + void displayTile(Tile tile); + /** * @brief Display the eggs. * diff --git a/gui/src/Render/Render.cpp b/gui/src/Render/Render.cpp index 67bca60b..0cf76561 100644 --- a/gui/src/Render/Render.cpp +++ b/gui/src/Render/Render.cpp @@ -121,7 +121,7 @@ void Gui::Render::displayMap() { for (auto &line : _gameData->getMap()) { for (auto &tile : line) { - DrawModel(_tileModel, tile.getPositionIn3DSpace(), 1.0f, WHITE); + displayTile(tile); displayFood(tile); displayResources(tile); displayEggs(tile); @@ -130,6 +130,16 @@ void Gui::Render::displayMap() } } +void Gui::Render::displayTile(Tile tile) +{ + DrawModel(_tileModel, tile.getPositionIn3DSpace(), 1.0f, WHITE); + if (_isDebug) { + std::vector bboxes = tile.getTileBoundingBoxes(tile, _tileModel); + for (size_t i = 0; i < bboxes.size(); i++) + DrawBoundingBox(bboxes[i], GREEN); + } +} + void Gui::Render::displayEggs(Tile tile) const { for (auto &team : _gameData->getTeams()) { From d98eb3008052e6696068cfa215abd1842cc23efe Mon Sep 17 00:00:00 2001 From: Thomaltarix Date: Wed, 12 Jun 2024 18:31:32 +0200 Subject: [PATCH 4/6] feat: Tile methods to get hitboxes, isTileHit, etc... --- gui/include/GameDatas/Tile.hpp | 29 ++++++++++++++++++++++++ gui/src/GameDatas/Tile.cpp | 41 ++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/gui/include/GameDatas/Tile.hpp b/gui/include/GameDatas/Tile.hpp index 2255f4ad..0db4cb96 100644 --- a/gui/include/GameDatas/Tile.hpp +++ b/gui/include/GameDatas/Tile.hpp @@ -10,6 +10,8 @@ #include "raylib.h" #include "GameDatas/Inventory.hpp" +#include + namespace Gui { /** @@ -65,6 +67,33 @@ class Gui::Tile { */ Vector3 getPositionIn3DSpace(); + /** + * @brief Get the Tile Bounding Boxes object. + * + * @param tile Tile to get the bounding boxes. + * @return std::vector - Bounding boxes of the tile. + */ + std::vector getTileBoundingBoxes(Tile tile, Model tileModel); + + /** + * @brief Get the Tile Model Hitbox object. + * + * @param tile Tile to get the hitbox. + * @param camera Camera to get the hitbox. + * @return std::vector - Hitbox of the tile. + */ + std::vector getTileModelHitbox(Tile tile, Camera camera, Model tileModel); + + /** + * @brief Check if the tile is hit. + * + * @param camera Camera to check if the tile is hit. + * @param _tileModel Model of the tile. + * @return true - The tile is hit. + * @return false - The tile is not hit. + */ + bool isTileHit(Camera camera, Model _tileModel); + /** * @brief Inventory of the tile. * diff --git a/gui/src/GameDatas/Tile.cpp b/gui/src/GameDatas/Tile.cpp index 69abffc4..cd74ab44 100644 --- a/gui/src/GameDatas/Tile.cpp +++ b/gui/src/GameDatas/Tile.cpp @@ -33,3 +33,44 @@ Vector3 Gui::Tile::getPositionIn3DSpace() { return _positionIn3DSpace; } + +std::vector Gui::Tile::getTileBoundingBoxes(Tile tile, Model tileModel) +{ + std::vector bboxes; + + for (int i = 0; i < tileModel.meshCount; i++) { + BoundingBox bbox = GetMeshBoundingBox(tileModel.meshes[i]); + bbox.min.x += tile.getPositionIn3DSpace().x; + bbox.min.y += tile.getPositionIn3DSpace().y; + bbox.min.z += tile.getPositionIn3DSpace().z; + bbox.max.x += tile.getPositionIn3DSpace().x; + bbox.max.y += tile.getPositionIn3DSpace().y; + bbox.max.z += tile.getPositionIn3DSpace().z; + bboxes.push_back(bbox); + } + return bboxes; +} + +std::vector Gui::Tile::getTileModelHitbox(Tile tile, Camera camera, Model tileModel) +{ + std::vector towerBBox = tile.getTileBoundingBoxes(tile, tileModel); + std::vector boxHitInfo; + + Ray ray = GetMouseRay((Vector2){(float)GetScreenWidth() / 2, (float)GetScreenHeight() / 2}, camera); + + for (size_t i = 0; i < towerBBox.size(); i++) + boxHitInfo.push_back(GetRayCollisionBox(ray, towerBBox[i])); + return boxHitInfo; +} + +bool Gui::Tile::isTileHit(Camera camera, Model _tileModel) +{ + std::vector towerBBox = getTileBoundingBoxes(*this, _tileModel); + std::vector boxHitInfo = getTileModelHitbox(*this, camera, _tileModel); + + for (size_t i = 0; i < towerBBox.size(); i++) { + if (boxHitInfo[i].hit) + return true; + } + return false; +} From 837b5272d230da0e1686f46bb479c84c57087424 Mon Sep 17 00:00:00 2001 From: Thomaltarix Date: Wed, 12 Jun 2024 18:32:41 +0200 Subject: [PATCH 5/6] feat: Event to click on tiles on debug or not The Event on click is not set --- gui/include/Event/Event.hpp | 5 +++++ gui/src/Event/Event.cpp | 29 +++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/gui/include/Event/Event.hpp b/gui/include/Event/Event.hpp index 0ef4fbe1..0ea92d85 100644 --- a/gui/include/Event/Event.hpp +++ b/gui/include/Event/Event.hpp @@ -136,6 +136,11 @@ class Gui::Event { */ void selectPlayer(); + /** + * @brief Select the tile. + */ + void selectTile(); + /** * @brief Change the player. * diff --git a/gui/src/Event/Event.cpp b/gui/src/Event/Event.cpp index fb10059f..f8e37c22 100644 --- a/gui/src/Event/Event.cpp +++ b/gui/src/Event/Event.cpp @@ -70,9 +70,10 @@ void Gui::Event::setFreeCam() void Gui::Event::handleLeftClick() { - if (_render->getCameraType() == Gui::UserCamera::CameraType::FREE) + if (_render->getCameraType() == Gui::UserCamera::CameraType::FREE) { selectPlayer(); - else + selectTile(); + } else changePlayer(true); } @@ -105,6 +106,30 @@ void Gui::Event::selectPlayer() EndDrawing(); } +void Gui::Event::selectTile() +{ + BeginDrawing(); + BeginMode3D(*_render.get()->getCamera().get()); + for (auto &line : _gameData.get()->getMap()) { + for (auto &tile : line) { + if (_render.get()->getIsDebug()) { + std::vector bboxes = tile.getTileBoundingBoxes(tile, _render.get()->getTileModel()); + std::vector hitbox = tile.getTileModelHitbox(tile, *_render.get()->getCamera().get(), _render.get()->getTileModel()); + + for (size_t i = 0; i < bboxes.size(); i++) { + if (hitbox[i].hit) + DrawBoundingBox(bboxes[i], RED); + } + } + if (tile.isTileHit(*_render.get()->getCamera().get(), _render.get()->getTileModel())) + // TODO: Display the HUD of the tile + std::cout << "Tile hit" << std::endl; + } + } + EndMode3D(); + EndDrawing(); +} + void Gui::Event::changePlayer(bool turn) { size_t playerId = _render.get()->getCameraPlayerPov(); From 5a1e3da4b9e323057b263fd302028d72146a29b2 Mon Sep 17 00:00:00 2001 From: Thomaltarix Date: Wed, 12 Jun 2024 18:39:18 +0200 Subject: [PATCH 6/6] feat: Comment for the guy who will implement the HUD of the player --- gui/src/Event/Event.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gui/src/Event/Event.cpp b/gui/src/Event/Event.cpp index f8e37c22..4eed76d9 100644 --- a/gui/src/Event/Event.cpp +++ b/gui/src/Event/Event.cpp @@ -98,8 +98,10 @@ void Gui::Event::selectPlayer() DrawBoundingBox(bboxes[i], RED); } } - if (team.isPlayerHit(player.getId(), *_render.get()->getCamera().get())) + if (team.isPlayerHit(player.getId(), *_render.get()->getCamera().get())) { + // TODO: Display the player HUD this->changeCameraToPlayer(player.getId()); + } } } EndMode3D();