From f6096e28896fef71fa594fb0a39029036a7cf765 Mon Sep 17 00:00:00 2001 From: sebastian Date: Tue, 4 Aug 2026 15:50:07 +0200 Subject: [PATCH] ADD: PickingSystem with AABB --- .../standardComponents/PickableComponent.h | 4 ++-- engine/src/ecs/systems/PickingSystem.h | 19 +++++++++++-------- engine/src/layer/DebugLayer.cpp | 11 +++++++---- game/src/ludo/PiecePresenter.cpp | 2 +- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/engine/src/ecs/standardComponents/PickableComponent.h b/engine/src/ecs/standardComponents/PickableComponent.h index 6bd2456..6e08a8e 100644 --- a/engine/src/ecs/standardComponents/PickableComponent.h +++ b/engine/src/ecs/standardComponents/PickableComponent.h @@ -4,11 +4,11 @@ #ifndef COLORRACE_PICKABLECOMPONENT_H #define COLORRACE_PICKABLECOMPONENT_H -#include "loader/models/AABB.h" + namespace engine { struct PickableComponent { - AABB aabb; + }; } diff --git a/engine/src/ecs/systems/PickingSystem.h b/engine/src/ecs/systems/PickingSystem.h index 4f8465a..8e48972 100644 --- a/engine/src/ecs/systems/PickingSystem.h +++ b/engine/src/ecs/systems/PickingSystem.h @@ -15,7 +15,7 @@ #define GLM_ENABLE_EXPERIMENTAL #include -#include "glm/gtx/string_cast.hpp" +#include "ecs/standardComponents/MeshComponent.h" #include "renderer/entities/Camera.h" #include "spdlog/spdlog.h" @@ -32,20 +32,23 @@ namespace engine { //if (ImGui::GetIO().WantCaptureMouse) return std::nullopt; if (!mouse.isClickEvent(MouseButton::LEFT)) return std::nullopt; - std::cout << "PickingSystem::update" << std::endl; auto [origin, dir] = screenToRay(mouse.getXY(/*ndc=*/true), m_camera); - printf("Ray: %f %f %f\n", origin.x, origin.y, origin.z); - spdlog::info("Ray: {} {}", glm::to_string(origin), glm::to_string(dir)); float closestT = std::numeric_limits::max(); std::optional hit; for (const auto& [entity, pickable] : registry.getPool()) { const auto transform = registry.getComponent(entity); - // if (float t; raySphereIntersect(origin, dir, transform.m_position, pickable.radius, t) && t < closestT) { - // closestT = t; - // hit = entity; - // } + const auto mesh = registry.getComponent(entity); + + AABB transformedAABB = mesh.model->getAABB().transformed(transform.computeModelMatrix()); + Ray ray = Ray(origin, dir); + std::optional ray_hit = transformedAABB.intersects(ray, closestT); + if (ray_hit.has_value()) { + spdlog::info(std::format("Hit: {} {}", entity.value(), std::to_string(ray_hit.value().distance))); + closestT = ray_hit.value().distance; + hit = entity; + } } return hit; diff --git a/engine/src/layer/DebugLayer.cpp b/engine/src/layer/DebugLayer.cpp index 4ea265b..591dd91 100644 --- a/engine/src/layer/DebugLayer.cpp +++ b/engine/src/layer/DebugLayer.cpp @@ -4,6 +4,7 @@ #include "DebugLayer.h" +#include "ecs/standardComponents/MeshComponent.h" #include "ecs/standardComponents/PickableComponent.h" #include "ecs/standardComponents/TransformComponent.h" #include "GLFW/glfw3.h" @@ -24,12 +25,14 @@ void engine::DebugLayer::onRender() { if (m_showDebugInfo) { auto pickablePool = m_entityRegistry.getPool(); auto transforms = m_entityRegistry.getPool(); - for (auto& [entity, pickableComponent] : pickablePool) { if (transforms.has(entity)) { - glm::vec3 halfExtent = pickableComponent.aabb.getHalfExtent(); - spdlog::info(std::to_string(halfExtent.x) + " " + std::to_string(halfExtent.y) + " " + std::to_string(halfExtent.z)); - const auto sphereTransformComp = TransformComponent(transforms.get(entity).m_position, {0,0,0}, halfExtent); + auto meshComponent = m_entityRegistry.getComponent(entity); + glm::vec3 halfExtent = meshComponent.model.get()->getAABB().getHalfExtent(); + //spdlog::info(std::to_string(halfExtent.x) + " " + std::to_string(halfExtent.y) + " " + std::to_string(halfExtent.z)); + + AABB transformedAABB = meshComponent.model->getAABB().transformed(transforms.get(entity).computeModelMatrix()); + const auto sphereTransformComp = TransformComponent(transforms.get(entity).m_position, {0,0,0}, transformedAABB.getHalfExtent()); glm::mat4 modelMatrix = sphereTransformComp.computeModelMatrix(); RenderCommand renderCommand(m_sphereModel, modelMatrix); diff --git a/game/src/ludo/PiecePresenter.cpp b/game/src/ludo/PiecePresenter.cpp index 3af4c05..ec53a66 100644 --- a/game/src/ludo/PiecePresenter.cpp +++ b/game/src/ludo/PiecePresenter.cpp @@ -19,7 +19,7 @@ void ludo::PiecePresenter::spawnPieces(const ludo::LudoGameState &state) { {0.334296f, 0.334296f, 0.334296f}); m_registry.addComponent(entity, transform); m_registry.addComponent(entity, engine::MeshComponent(m_pieceModels[std::string(ludo::toString(piece.color))])); - m_registry.addComponent(entity, engine::PickableComponent(m_pieceModels[std::string(toString(piece.color))]->getAABB())); + m_registry.addComponent(entity, engine::PickableComponent()); m_pieceEntities.push_back(entity); } }