diff --git a/src/dawn/prefabs/SimpleSpinningCubePrefab.hpp b/src/dawn/prefabs/SimpleSpinningCubePrefab.hpp index 972acfe2..5a570f87 100644 --- a/src/dawn/prefabs/SimpleSpinningCubePrefab.hpp +++ b/src/dawn/prefabs/SimpleSpinningCubePrefab.hpp @@ -10,6 +10,7 @@ #include "scene/components/display/MeshHost.hpp" #include "scene/components/display/material/SimpleTexturedMaterial.hpp" #include "scene/components/example/ExampleSpin.hpp" +#include "scene/components/physics/3d/CubeCollider.hpp" namespace Dawn { class SimpleSpinningCubePrefab : @@ -31,8 +32,9 @@ namespace Dawn { void prefabInit(AssetManager *man) override { auto meshRenderer = this->addComponent(); meshHost = this->addComponent(); - auto spinning = this->addComponent(); material = this->addComponent(); + auto spinning = this->addComponent(); + auto collider = this->addComponent(); meshHost->mesh.createBuffers(CUBE_VERTICE_COUNT, CUBE_INDICE_COUNT); CubeMesh::buffer(&meshHost->mesh, glm::vec3(-0.5f, -0.5f, -0.5f), glm::vec3(1, 1, 1), 0, 0); diff --git a/src/dawn/scene/components/physics/3d/CMakeLists.txt b/src/dawn/scene/components/physics/3d/CMakeLists.txt index 4fefb26c..b2f59941 100644 --- a/src/dawn/scene/components/physics/3d/CMakeLists.txt +++ b/src/dawn/scene/components/physics/3d/CMakeLists.txt @@ -4,10 +4,11 @@ # https://opensource.org/licenses/MIT # Sources -# target_sources(${DAWN_TARGET_NAME} -# PRIVATE -# RayTester3D.cpp -# ) +target_sources(${DAWN_TARGET_NAME} + PRIVATE + Collider3D.cpp + CubeCollider.cpp +) -# Subdirs -add_subdirectory(collider) \ No newline at end of file +tool_scenecomponent(Collider3D scene/components/physics/3d/Collider3D.hpp) +tool_scenecomponent(CubeCollider scene/components/physics/3d/CubeCollider.hpp) \ No newline at end of file diff --git a/src/dawn/scene/components/physics/3d/collider/Collider3D.cpp b/src/dawn/scene/components/physics/3d/Collider3D.cpp similarity index 100% rename from src/dawn/scene/components/physics/3d/collider/Collider3D.cpp rename to src/dawn/scene/components/physics/3d/Collider3D.cpp diff --git a/src/dawn/scene/components/physics/3d/Collider3D.hpp b/src/dawn/scene/components/physics/3d/Collider3D.hpp new file mode 100644 index 00000000..34ad698d --- /dev/null +++ b/src/dawn/scene/components/physics/3d/Collider3D.hpp @@ -0,0 +1,47 @@ +// Copyright (c) 2023 Dominic Masters +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +#pragma once +#include "scene/SceneItemComponent.hpp" +#include "physics/3d/Ray3D.hpp" + +namespace Dawn { + struct Collider3DRayResult { + glm::vec3 point; + float_t distance; + glm::vec3 normal; + }; + + enum Collider3DType { + COLLIDER3D_TYPE_CUBE + }; + + class Collider3D : public SceneItemComponent { + protected: + + public: + Collider3D(SceneItem *item); + + /** + * Perform a raycast against this collider. + * + * @param result Where to store the result of the raycast collision + * @param ray The ray to cast against. + * @return True if the ray intercepts this collider, otherwise false. + */ + virtual bool_t raycast( + struct Collider3DRayResult *result, + struct Ray3D ray + ) = 0; + + /** + * Returns which type of collider this is. Useful for performing dynamic + * casting in your event listeners. + * + * @return The collider type this is. + */ + virtual enum Collider3DType getColliderType() = 0; + }; +} \ No newline at end of file diff --git a/src/dawn/scene/components/physics/3d/CubeCollider.cpp b/src/dawn/scene/components/physics/3d/CubeCollider.cpp new file mode 100644 index 00000000..abc33765 --- /dev/null +++ b/src/dawn/scene/components/physics/3d/CubeCollider.cpp @@ -0,0 +1,32 @@ +// Copyright (c) 2023 Dominic Masters +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +#include "CubeCollider.hpp" + +using namespace Dawn; + +CubeCollider::CubeCollider(SceneItem *item) : Collider3D(item) { + +} + +bool_t CubeCollider::raycast( + struct Collider3DRayResult *result, + struct Ray3D ray +) { + assertNotNull(result); + + return Dawn::raytestCube( + ray, + (struct AABB3D){ .min = this->min, .max = this->max }, + this->transform->getWorldTransform(), + &result->point, + &result->normal, + &result->distance + ); +} + +enum Collider3DType CubeCollider::getColliderType() { + return COLLIDER3D_TYPE_CUBE; +} \ No newline at end of file diff --git a/src/dawn/scene/components/physics/3d/collider/CubeCollider.hpp b/src/dawn/scene/components/physics/3d/CubeCollider.hpp similarity index 54% rename from src/dawn/scene/components/physics/3d/collider/CubeCollider.hpp rename to src/dawn/scene/components/physics/3d/CubeCollider.hpp index 5c9702aa..434161a4 100644 --- a/src/dawn/scene/components/physics/3d/collider/CubeCollider.hpp +++ b/src/dawn/scene/components/physics/3d/CubeCollider.hpp @@ -10,9 +10,16 @@ namespace Dawn { class CubeCollider : public Collider3D { public: - glm::vec3 center = glm::vec3(0, 0, 0); - glm::vec3 size = glm::vec3(1, 1, 1); + glm::vec3 min = glm::vec3(-0.5f, -0.5f, -0.5f); + glm::vec3 max = glm::vec3(0.5f, 0.5f, 0.5f); CubeCollider(SceneItem *item); + + bool_t raycast( + struct Collider3DRayResult *result, + struct Ray3D ray + ) override; + + enum Collider3DType getColliderType() override; }; } \ No newline at end of file diff --git a/src/dawn/scene/components/physics/3d/collider/CMakeLists.txt b/src/dawn/scene/components/physics/3d/collider/CMakeLists.txt deleted file mode 100644 index 878bfeac..00000000 --- a/src/dawn/scene/components/physics/3d/collider/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2023 Dominic Masters -# -# This software is released under the MIT License. -# https://opensource.org/licenses/MIT - -# Sources -target_sources(${DAWN_TARGET_NAME} - PRIVATE - Collider3D.cpp - CubeCollider.cpp -) - -tool_scenecomponent(Collider3D scene/components/physics/3d/collider/Collider3D.hpp) -tool_scenecomponent(CubeCollider scene/components/physics/3d/collider/CubeCollider.hpp) \ No newline at end of file diff --git a/src/dawn/scene/components/physics/3d/collider/Collider3D.hpp b/src/dawn/scene/components/physics/3d/collider/Collider3D.hpp deleted file mode 100644 index aaac2607..00000000 --- a/src/dawn/scene/components/physics/3d/collider/Collider3D.hpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2023 Dominic Masters -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - -#pragma once -#include "scene/SceneItemComponent.hpp" -#include "physics/3d/Ray3D.hpp" - -namespace Dawn { - struct Collider3DRayResult { - glm::vec3 normal; - glm::vec3 point; - }; - - class Collider3D : public SceneItemComponent { - public: - Collider3D(SceneItem *item); - - virtual bool_t raycast(struct Ray3D ray, struct Collider3DRayResult *out) = 0; - }; -} \ No newline at end of file diff --git a/src/dawn/scene/components/physics/3d/collider/CubeCollider.cpp b/src/dawn/scene/components/physics/3d/collider/CubeCollider.cpp deleted file mode 100644 index 63a30344..00000000 --- a/src/dawn/scene/components/physics/3d/collider/CubeCollider.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2023 Dominic Masters -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - -#include "CubeCollider.hpp" - -using namespace Dawn; - -CubeCollider::CubeCollider(SceneItem *item) : Collider3D(item) { - -} \ No newline at end of file diff --git a/src/dawntictactoe/components/TicTacToeGame.cpp b/src/dawntictactoe/components/TicTacToeGame.cpp index 26b51734..83250940 100644 --- a/src/dawntictactoe/components/TicTacToeGame.cpp +++ b/src/dawntictactoe/components/TicTacToeGame.cpp @@ -6,7 +6,7 @@ #include "TicTacToeGame.hpp" #include "game/DawnGame.hpp" #include "scene/components/example/ExampleSpin.hpp" -#include "physics/3d/Ray3D.hpp" +#include "scene/components/physics/3d/CubeCollider.hpp" using namespace Dawn; @@ -31,32 +31,14 @@ void TicTacToeGame::onSceneUpdate() { ray.origin = glm::vec3(1,2,3); ray.direction = camera->getRayDirectionFromScreenSpace(mouse); - struct AABB3D box; - box.min = glm::vec3(-0.5f, -0.5f, -0.5f); - box.max = glm::vec3(0.5f, 0.5f, 0.5f); + auto collider = getScene()->findComponent(); + if(collider == nullptr) return; - struct SceneDebugCube cube = { - .min = box.min, - .max = box.max, - .color COLOR_GREEN, - .transform = getScene()->findComponent()->transform->getWorldTransform() - }; - getScene()->debugCube(cube); - - glm::vec3 point, normal; - float_t distance; - - auto test = raytestCube( - ray, - box, - cube.transform, - &point, - &normal, - &distance - ); + struct Collider3DRayResult result; + auto test = collider->raycast(&result, ray); if(test) { - getScene()->debugRay((struct SceneDebugRay){ .start = point, .direction = normal, .color = COLOR_BLUE }); + getScene()->debugRay((struct SceneDebugRay){ .start = result.point, .direction = result.normal, .color = COLOR_BLUE }); } else { getScene()->debugRay((struct SceneDebugRay){ .start = ray.origin, .direction = ray.direction }); }