summaryrefslogtreecommitdiff
path: root/src/game.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-11-07 16:32:51 -0500
committerJonathan Bradley <jcb@pikum.xyz>2023-11-15 13:23:41 -0500
commitbdcaefc871fe8efcfa3920109e8a52d6a194955d (patch)
treecabc444b7acc6d7ca97341798466c5d3d68ad526 /src/game.cpp
parent546e179d6095d07342b9b8f29f3b20eaaf3cf274 (diff)
display debug box for hovered entity
Diffstat (limited to 'src/game.cpp')
-rw-r--r--src/game.cpp51
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));