From bdcaefc871fe8efcfa3920109e8a52d6a194955d Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Tue, 7 Nov 2023 16:32:51 -0500 Subject: display debug box for hovered entity --- src/game.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) (limited to 'src/game.cpp') diff --git a/src/game.cpp b/src/game.cpp index cd27812..bd13a22 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -15,9 +15,9 @@ #include "window.hpp" #include +#include #include #include -#include #include #include @@ -491,6 +491,22 @@ void teardownEditor() { PkeInput_DeactivateSet(debugControlsHandle); } +glm::vec3 unproject(glm::vec3 windowCoords) { + double xDevNorm = (2.0f * windowCoords.x) / Extent.width - 1.0f; + double yDevNorm = 1.0f - (2.0f * windowCoords.y) / Extent.height; + yDevNorm *= -1; + glm::vec4 clipCoords(xDevNorm, yDevNorm, windowCoords.z, 1.f); + + glm::vec4 rayEye = glm::inverse(UBO.proj) * clipCoords; + + glm::vec4 worldCoords = glm::inverse(UBO.model) * glm::inverse(UBO.view) * rayEye; + if (std::abs(0.0f - worldCoords.w) > 0.00001f) { + worldCoords *= 1.0f / worldCoords.w; + } + + return glm::vec3(worldCoords); +} + void Game_Tick(double delta) { /* * ECS_Tick() gets called first because it updates the public @@ -512,6 +528,39 @@ void Game_Tick(double delta) { ActiveCamera = &cameraDbg; } ECS_Tick_Early(delta); + + // raycast for hovering + do // while(0) + { + double xMousePos, yMousePos; + glfwGetCursorPos(window, &xMousePos, &yMousePos); + + glm::vec3 fromCoords{unproject(glm::vec3(xMousePos, yMousePos, -1.f))}; + glm::vec3 toCoords{unproject(glm::vec3(xMousePos, yMousePos, 1.f))}; + + btVector3 rayOrigin{}; + btVector3 rayDestination{}; + GlmToBullet(fromCoords, rayOrigin); + GlmToBullet(toCoords, rayDestination); + + btCollisionWorld::ClosestRayResultCallback rayResult{rayOrigin, rayDestination}; + rayResult.m_flags |= btTriangleRaycastCallback::kF_FilterBackfaces; + + BtDynamicsWorld->rayTest(rayOrigin, rayDestination, rayResult); + if (rayResult.hasHit()) { + EntityHandle_T hoveredEntity_T{reinterpret_cast(rayResult.m_collisionObject->getUserPointer())}; + EntityHandle hoveredEntity{hoveredEntity_T}; + const auto *inst = ECS_GetInstance(hoveredEntity); + const auto *grBinds = ECS_GetGrBinds(inst->grBindsHandle); + pkeDebugHitbox.instanceBuffer = grBinds->instanceBuffer; + pkeDebugHitbox.instanceStartingIndex = inst->index; + } else { + pkeDebugHitbox.instanceBuffer = VK_NULL_HANDLE; + pkeDebugHitbox.instanceStartingIndex = 0; + } + } + while (0); + if (shouldCreateEntityType) { assert(entityTypeToCreate != nullptr); assert(entityTypeToCreate != CAFE_BABE(EntityType)); -- cgit v1.2.3