diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-11-07 16:32:51 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-11-15 13:23:41 -0500 |
| commit | bdcaefc871fe8efcfa3920109e8a52d6a194955d (patch) | |
| tree | cabc444b7acc6d7ca97341798466c5d3d68ad526 /src/game.cpp | |
| parent | 546e179d6095d07342b9b8f29f3b20eaaf3cf274 (diff) | |
display debug box for hovered entity
Diffstat (limited to 'src/game.cpp')
| -rw-r--r-- | src/game.cpp | 51 |
1 files changed, 50 insertions, 1 deletions
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 <BulletCollision/CollisionShapes/btConvexHullShape.h> +#include <BulletCollision/NarrowPhaseCollision/btRaycastCallback.h> #include <GLFW/glfw3.h> #include <cstring> -#include <glm/gtc/quaternion.hpp> #include <iomanip> #include <ostream> @@ -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<EntityHandle_T>(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)); |
