From c28554f3d0cf48ad25ed7a66dbdaec568da3c39f Mon Sep 17 00:00:00 2001 From: bartanakin Date: Sun, 13 Oct 2024 00:05:44 +0200 Subject: [PATCH 1/6] init scene --- include/Application.h | 13 ++++++++++--- include/Graphics/SpriteBuilder/SpriteBuilder.h | 12 ++++++------ lib/Graphics/SpriteBuilder/SpriteMerger.cpp | 6 +++++- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/include/Application.h b/include/Application.h index 9af5c62..d133a2c 100644 --- a/include/Application.h +++ b/include/Application.h @@ -1,4 +1,7 @@ #pragma once +#include +#include + #include "Collisions/CollisionDetectionStrategyInterface.h" #include "Dynamics/DynamicsUpdateStrategyInterface.h" #include "Dynamics/TimerInterface.h" @@ -8,6 +11,7 @@ #include #include + namespace Barta { template @@ -19,7 +23,7 @@ class Application { TimerInterface& timer, std::unique_ptr dynamicsUpdateStrategy, std::unique_ptr collisionDetectionStrategy - ): + ): windowName(std::move(windowName)), graphicsBridge(std::move(graphicsBridge)), eventLogger(std::make_unique()), @@ -28,8 +32,11 @@ class Application { dynamicsUpdateStrategy(std::move(dynamicsUpdateStrategy)), collisionEventsLogger({}), collisionExecutor(CollisionCoreExecutor(std::move(collisionDetectionStrategy))), - objectLists({}) {} - + objectLists({}) { + // this->collisionEventsLogger.logSubscriber(std::unique_ptr( + // new Barta::StaticCollisionResponseSubscriberType(*this->postDynamicsEventLogger) + // )); + } Application(const Application&) = delete; Application(Application&&) = delete; Application& operator=(const Application&) = delete; diff --git a/include/Graphics/SpriteBuilder/SpriteBuilder.h b/include/Graphics/SpriteBuilder/SpriteBuilder.h index dd8789f..be95334 100644 --- a/include/Graphics/SpriteBuilder/SpriteBuilder.h +++ b/include/Graphics/SpriteBuilder/SpriteBuilder.h @@ -82,12 +82,12 @@ class SpriteBuilder { return this; } - SpriteBuilder* setFontSize( - int fontSize - ) { - this->fontSize = fontSize; - return this; - } + SpriteBuilder* setVertex1(Vector2f vertex) { this->vertex1 = vertex; return this; } + SpriteBuilder* setVertex2(Vector2f vertex) { this->vertex2 = vertex; return this; } + SpriteBuilder* setVertex3(Vector2f vertex) { this->vertex3 = vertex; return this; } + SpriteBuilder* setSize(Vector2f size) { this->size = size; return this; } + SpriteBuilder* setString(std::string string) { this->string = string; return this; } + SpriteBuilder* setFontSize(int fontSize) { this->fontSize = fontSize; return this; } protected: Color color1; diff --git a/lib/Graphics/SpriteBuilder/SpriteMerger.cpp b/lib/Graphics/SpriteBuilder/SpriteMerger.cpp index af2ca5f..aec3ad1 100644 --- a/lib/Graphics/SpriteBuilder/SpriteMerger.cpp +++ b/lib/Graphics/SpriteBuilder/SpriteMerger.cpp @@ -80,7 +80,11 @@ Barta::SpriteMerger* Barta::SpriteMerger::addTriangle( this->data.push_back(0.f); } - for (const auto& color: {triangleSprite.color1, triangleSprite.color2, triangleSprite.color3}) { + for (const auto& color: { + triangleSprite.color1, + triangleSprite.color2, + triangleSprite.color3 + }) { this->data.push_back(color.r); this->data.push_back(color.g); this->data.push_back(color.b); From 818e584164661b01a025095d878fe7bfdf819158 Mon Sep 17 00:00:00 2001 From: bartanakin Date: Sun, 13 Oct 2024 15:52:29 +0200 Subject: [PATCH 2/6] shared_ptr for subscribers --- include/Application.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/include/Application.h b/include/Application.h index d133a2c..4a68dc2 100644 --- a/include/Application.h +++ b/include/Application.h @@ -7,11 +7,8 @@ #include "Dynamics/TimerInterface.h" #include "Graphics/BartaGraphicsBridgeInterface.h" #include "pch.h" -#include -#include #include - namespace Barta { template @@ -23,7 +20,7 @@ class Application { TimerInterface& timer, std::unique_ptr dynamicsUpdateStrategy, std::unique_ptr collisionDetectionStrategy - ): + ): windowName(std::move(windowName)), graphicsBridge(std::move(graphicsBridge)), eventLogger(std::make_unique()), @@ -37,6 +34,7 @@ class Application { // new Barta::StaticCollisionResponseSubscriberType(*this->postDynamicsEventLogger) // )); } + Application(const Application&) = delete; Application(Application&&) = delete; Application& operator=(const Application&) = delete; From 7d62a1ded36ebbb7442a6c9feb17bd4a42a23586 Mon Sep 17 00:00:00 2001 From: bartanakin Date: Sun, 20 Oct 2024 19:07:54 +0200 Subject: [PATCH 3/6] clang-format edit --- include/Graphics/SpriteBuilder/SpriteBuilder.h | 12 ++++++------ lib/Graphics/SpriteBuilder/SpriteMerger.cpp | 6 +----- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/include/Graphics/SpriteBuilder/SpriteBuilder.h b/include/Graphics/SpriteBuilder/SpriteBuilder.h index be95334..dd8789f 100644 --- a/include/Graphics/SpriteBuilder/SpriteBuilder.h +++ b/include/Graphics/SpriteBuilder/SpriteBuilder.h @@ -82,12 +82,12 @@ class SpriteBuilder { return this; } - SpriteBuilder* setVertex1(Vector2f vertex) { this->vertex1 = vertex; return this; } - SpriteBuilder* setVertex2(Vector2f vertex) { this->vertex2 = vertex; return this; } - SpriteBuilder* setVertex3(Vector2f vertex) { this->vertex3 = vertex; return this; } - SpriteBuilder* setSize(Vector2f size) { this->size = size; return this; } - SpriteBuilder* setString(std::string string) { this->string = string; return this; } - SpriteBuilder* setFontSize(int fontSize) { this->fontSize = fontSize; return this; } + SpriteBuilder* setFontSize( + int fontSize + ) { + this->fontSize = fontSize; + return this; + } protected: Color color1; diff --git a/lib/Graphics/SpriteBuilder/SpriteMerger.cpp b/lib/Graphics/SpriteBuilder/SpriteMerger.cpp index aec3ad1..af2ca5f 100644 --- a/lib/Graphics/SpriteBuilder/SpriteMerger.cpp +++ b/lib/Graphics/SpriteBuilder/SpriteMerger.cpp @@ -80,11 +80,7 @@ Barta::SpriteMerger* Barta::SpriteMerger::addTriangle( this->data.push_back(0.f); } - for (const auto& color: { - triangleSprite.color1, - triangleSprite.color2, - triangleSprite.color3 - }) { + for (const auto& color: {triangleSprite.color1, triangleSprite.color2, triangleSprite.color3}) { this->data.push_back(color.r); this->data.push_back(color.g); this->data.push_back(color.b); From 745841cb1e1fd5e0dc675f4b81fd77bc398f9162 Mon Sep 17 00:00:00 2001 From: bartanakin Date: Sun, 27 Oct 2024 19:25:03 +0100 Subject: [PATCH 4/6] OBB static collisiions --- include/Dynamics/DynamicsDifference.h | 8 +++-- include/Geometrics/TransformableInterface.h | 4 +-- include/Hitbox/HitboxInterface.h | 33 +++++++++++---------- lib/Hitbox/HitboxComposite.cpp | 1 + 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/include/Dynamics/DynamicsDifference.h b/include/Dynamics/DynamicsDifference.h index 4e28617..fad9a2a 100644 --- a/include/Dynamics/DynamicsDifference.h +++ b/include/Dynamics/DynamicsDifference.h @@ -23,9 +23,13 @@ struct DynamicsDifference { return *this; } - DynamicsDifference(const DynamicsDifference& second) = default; + DynamicsDifference( + const DynamicsDifference& second + ) = default; - DynamicsDifference operator-() const { return {-this->velocity, -this->acceleration, this->rotationVelocity}; } + DynamicsDifference operator-() const { + return {-this->velocity, -this->acceleration, this->rotationVelocity}; + } Vector2f velocity; Vector2f acceleration; diff --git a/include/Geometrics/TransformableInterface.h b/include/Geometrics/TransformableInterface.h index 470e7f1..660eaa7 100644 --- a/include/Geometrics/TransformableInterface.h +++ b/include/Geometrics/TransformableInterface.h @@ -24,6 +24,6 @@ class TransformableInterface { virtual Vector2f rotate(float, Vector2f) = 0; - virtual OBB getTransformedOBB(const OBB& aabb) const = 0; -}; + virtual OBB getTransformedOBB(const OBB& aabb) const = 0; + }; } diff --git a/include/Hitbox/HitboxInterface.h b/include/Hitbox/HitboxInterface.h index 0a7deb9..b198040 100644 --- a/include/Hitbox/HitboxInterface.h +++ b/include/Hitbox/HitboxInterface.h @@ -2,6 +2,7 @@ #include "../Collisions/CollisionDetectionStrategyInterface.h" #include "../Dynamics/DynamicsDifference.h" #include "../Geometrics/TransformableInterface.h" +#include "../Dynamics/DynamicsDifference.h" #include "../pch.h" namespace Barta { @@ -13,25 +14,25 @@ class HitboxInterface { virtual bool isWithin(const Vector2f& position) const = 0; - virtual CollisionTestResult intersects( - const HitboxInterface& secondHitbox, - const CollisionDetectionStrategyInterface& collisionDetector, - const DynamicsDifference& dynamicsDifference - ) const = 0; + virtual CollisionTestResult intersects( + const HitboxInterface& secondHitbox, + const CollisionDetectionStrategyInterface& collisionDetector, + const DynamicsDifference& dynamicsDifference + ) const = 0; virtual std::unique_ptr getTransformedHitbox(const TransformableInterface& transformable) const = 0; - virtual CollisionTestResult intersectsWithCircle( - const Circle& secondHitbox, - const CollisionDetectionStrategyInterface& collisionDetector, - const DynamicsDifference& dynamicsDifference - ) const = 0; - - virtual CollisionTestResult intersectsWithAABB( - const AABB& secondHitbox, - const CollisionDetectionStrategyInterface& collisionDetector, - const DynamicsDifference& dynamicsDifference - ) const = 0; + virtual CollisionTestResult intersectsWithCircle( + const Circle& secondHitbox, + const CollisionDetectionStrategyInterface& collisionDetector, + const DynamicsDifference& dynamicsDifference + ) const = 0; + + virtual CollisionTestResult intersectsWithAABB( + const AABB& secondHitbox, + const CollisionDetectionStrategyInterface& collisionDetector, + const DynamicsDifference& dynamicsDifference + ) const = 0; virtual CollisionTestResult intersectsWithOBB( const OBB& secondShape, diff --git a/lib/Hitbox/HitboxComposite.cpp b/lib/Hitbox/HitboxComposite.cpp index 4f9b211..921b990 100644 --- a/lib/Hitbox/HitboxComposite.cpp +++ b/lib/Hitbox/HitboxComposite.cpp @@ -88,6 +88,7 @@ Barta::CollisionTestResult Barta::HitboxComposite::intersectsWithOBB( const CollisionDetectionStrategyInterface& collisionDetector, const DynamicsDifference& dynamicsDifference ) const { + auto result = CollisionTestResult(false, std::numeric_limits::max()); for (auto& child: this->children) { auto currentResult = child->intersectsWithOBB(secondShape, collisionDetector, dynamicsDifference); From c0815129dee62b400c1525f3ca6d14c990c5aaba Mon Sep 17 00:00:00 2001 From: bartanakin Date: Sat, 9 Nov 2024 12:27:32 +0100 Subject: [PATCH 5/6] dynamics update system change --- include/Application.h | 1 - include/Dynamics/DynamicsDifference.h | 8 ++--- include/Geometrics/TransformableInterface.h | 4 +-- include/Hitbox/HitboxInterface.h | 33 ++++++++++----------- lib/Hitbox/HitboxComposite.cpp | 1 - 5 files changed, 20 insertions(+), 27 deletions(-) diff --git a/include/Application.h b/include/Application.h index 4a68dc2..cee9637 100644 --- a/include/Application.h +++ b/include/Application.h @@ -1,6 +1,5 @@ #pragma once #include -#include #include "Collisions/CollisionDetectionStrategyInterface.h" #include "Dynamics/DynamicsUpdateStrategyInterface.h" diff --git a/include/Dynamics/DynamicsDifference.h b/include/Dynamics/DynamicsDifference.h index fad9a2a..4e28617 100644 --- a/include/Dynamics/DynamicsDifference.h +++ b/include/Dynamics/DynamicsDifference.h @@ -23,13 +23,9 @@ struct DynamicsDifference { return *this; } - DynamicsDifference( - const DynamicsDifference& second - ) = default; + DynamicsDifference(const DynamicsDifference& second) = default; - DynamicsDifference operator-() const { - return {-this->velocity, -this->acceleration, this->rotationVelocity}; - } + DynamicsDifference operator-() const { return {-this->velocity, -this->acceleration, this->rotationVelocity}; } Vector2f velocity; Vector2f acceleration; diff --git a/include/Geometrics/TransformableInterface.h b/include/Geometrics/TransformableInterface.h index 660eaa7..470e7f1 100644 --- a/include/Geometrics/TransformableInterface.h +++ b/include/Geometrics/TransformableInterface.h @@ -24,6 +24,6 @@ class TransformableInterface { virtual Vector2f rotate(float, Vector2f) = 0; - virtual OBB getTransformedOBB(const OBB& aabb) const = 0; - }; + virtual OBB getTransformedOBB(const OBB& aabb) const = 0; +}; } diff --git a/include/Hitbox/HitboxInterface.h b/include/Hitbox/HitboxInterface.h index b198040..0a7deb9 100644 --- a/include/Hitbox/HitboxInterface.h +++ b/include/Hitbox/HitboxInterface.h @@ -2,7 +2,6 @@ #include "../Collisions/CollisionDetectionStrategyInterface.h" #include "../Dynamics/DynamicsDifference.h" #include "../Geometrics/TransformableInterface.h" -#include "../Dynamics/DynamicsDifference.h" #include "../pch.h" namespace Barta { @@ -14,25 +13,25 @@ class HitboxInterface { virtual bool isWithin(const Vector2f& position) const = 0; - virtual CollisionTestResult intersects( - const HitboxInterface& secondHitbox, - const CollisionDetectionStrategyInterface& collisionDetector, - const DynamicsDifference& dynamicsDifference - ) const = 0; + virtual CollisionTestResult intersects( + const HitboxInterface& secondHitbox, + const CollisionDetectionStrategyInterface& collisionDetector, + const DynamicsDifference& dynamicsDifference + ) const = 0; virtual std::unique_ptr getTransformedHitbox(const TransformableInterface& transformable) const = 0; - virtual CollisionTestResult intersectsWithCircle( - const Circle& secondHitbox, - const CollisionDetectionStrategyInterface& collisionDetector, - const DynamicsDifference& dynamicsDifference - ) const = 0; - - virtual CollisionTestResult intersectsWithAABB( - const AABB& secondHitbox, - const CollisionDetectionStrategyInterface& collisionDetector, - const DynamicsDifference& dynamicsDifference - ) const = 0; + virtual CollisionTestResult intersectsWithCircle( + const Circle& secondHitbox, + const CollisionDetectionStrategyInterface& collisionDetector, + const DynamicsDifference& dynamicsDifference + ) const = 0; + + virtual CollisionTestResult intersectsWithAABB( + const AABB& secondHitbox, + const CollisionDetectionStrategyInterface& collisionDetector, + const DynamicsDifference& dynamicsDifference + ) const = 0; virtual CollisionTestResult intersectsWithOBB( const OBB& secondShape, diff --git a/lib/Hitbox/HitboxComposite.cpp b/lib/Hitbox/HitboxComposite.cpp index 921b990..4f9b211 100644 --- a/lib/Hitbox/HitboxComposite.cpp +++ b/lib/Hitbox/HitboxComposite.cpp @@ -88,7 +88,6 @@ Barta::CollisionTestResult Barta::HitboxComposite::intersectsWithOBB( const CollisionDetectionStrategyInterface& collisionDetector, const DynamicsDifference& dynamicsDifference ) const { - auto result = CollisionTestResult(false, std::numeric_limits::max()); for (auto& child: this->children) { auto currentResult = child->intersectsWithOBB(secondShape, collisionDetector, dynamicsDifference); From d614e7d4533d1bed0bc46dbcc57df478d53859ed Mon Sep 17 00:00:00 2001 From: bartanakin Date: Sat, 16 Nov 2024 13:18:24 +0100 Subject: [PATCH 6/6] ai game 1 finished --- include/Application.h | 5 +- include/Debug/DebugGuardSubscriber.h | 22 +++++ .../ConstVelocityDynamicsUpdateStrategy.h | 8 +- include/Dynamics/DynamicsAwareInterface.h | 10 ++ include/Dynamics/DynamicsAwareListConcept.h | 14 +-- include/Geometrics/BartaShapes/AABB.h | 5 +- include/Geometrics/BartaShapes/OBB.h | 2 + include/Geometrics/Intersections.h | 68 ++----------- include/Geometrics/Ray.h | 16 +++ include/Geometrics/Vector2f.h | 6 +- .../SpriteBuilder/RectangleWithColorsSprite.h | 50 +++++----- include/Hitbox/AABB_Hitbox.h | 2 + include/Hitbox/CircleHitbox.h | 2 + include/Hitbox/HitboxAwareConcept.h | 15 +++ include/Hitbox/HitboxAwareInterface.h | 20 ++-- include/Hitbox/HitboxComposite.h | 2 + include/Hitbox/HitboxInterface.h | 3 + include/Hitbox/NullHitbox.h | 2 + include/Hitbox/OBB_Hitbox.h | 3 + include/StaticObjectManager.h | 98 ++++++++++--------- lib/CMakeLists.txt | 6 ++ lib/Debug/DebugGuardSubscriber.cpp | 23 +++++ lib/Geometrics/BartaShapes/OBB.cpp | 4 + lib/Geometrics/Intersections.cpp | 84 ++++++++++++++++ lib/Geometrics/Ray.cpp | 12 +++ lib/Geometrics/Vector2f.cpp | 13 ++- lib/Hitbox/AABB_Hitbox.cpp | 7 ++ lib/Hitbox/CircleHitbox.cpp | 7 ++ lib/Hitbox/HitboxComposite.cpp | 6 ++ lib/Hitbox/NullHitbox.cpp | 6 ++ lib/Hitbox/OBB_Hitbox.cpp | 7 ++ 31 files changed, 365 insertions(+), 163 deletions(-) create mode 100644 include/Debug/DebugGuardSubscriber.h create mode 100644 include/Geometrics/Ray.h create mode 100644 include/Hitbox/HitboxAwareConcept.h create mode 100644 lib/Debug/DebugGuardSubscriber.cpp create mode 100644 lib/Geometrics/Intersections.cpp create mode 100644 lib/Geometrics/Ray.cpp diff --git a/include/Application.h b/include/Application.h index cee9637..02932d1 100644 --- a/include/Application.h +++ b/include/Application.h @@ -1,11 +1,10 @@ #pragma once -#include - #include "Collisions/CollisionDetectionStrategyInterface.h" #include "Dynamics/DynamicsUpdateStrategyInterface.h" #include "Dynamics/TimerInterface.h" #include "Graphics/BartaGraphicsBridgeInterface.h" #include "pch.h" +#include #include namespace Barta { @@ -90,7 +89,7 @@ class Application { virtual void postDynamicUpdate() {} - virtual bool isRunning() const { return true; } + virtual bool isRunning() { return true; } protected: std::string windowName; diff --git a/include/Debug/DebugGuardSubscriber.h b/include/Debug/DebugGuardSubscriber.h new file mode 100644 index 0000000..0a1ca41 --- /dev/null +++ b/include/Debug/DebugGuardSubscriber.h @@ -0,0 +1,22 @@ +// +// Created by bartanakin on 11/10/24. +// + +#pragma once +#include + +namespace Barta::Debug { + +class DebugGuardSubscriber: virtual public KeyPressedSubscriberInterface { +public: + static bool debugGuard; + DebugGuardSubscriber() noexcept = default; + + bool handle(KeyPressedEvent& event) override; + + bool isValid() const noexcept override; + +private: +}; + +} // Barta::Debug diff --git a/include/Dynamics/ConstVelocityDynamicsUpdateStrategy.h b/include/Dynamics/ConstVelocityDynamicsUpdateStrategy.h index 8184910..8075154 100644 --- a/include/Dynamics/ConstVelocityDynamicsUpdateStrategy.h +++ b/include/Dynamics/ConstVelocityDynamicsUpdateStrategy.h @@ -65,12 +65,14 @@ class ConstVelocityDynamicsUpdateStrategy: public DynamicsUpdateStrategyInterfac continue; } - nextDynamics.velocity = applyAllowedDirections(nextDynamics.allowedDirections, nextDynamics.velocity); + nextDynamics.velocity = applyAllowedDirections(nextDynamics.allowedDirections, nextDynamics.velocity).zeroised(); // TODO add response force handling - nextDynamics.force = applyAllowedDirections(nextDynamics.allowedDirections, nextDynamics.force); + nextDynamics.force = applyAllowedDirections(nextDynamics.allowedDirections, nextDynamics.force).zeroised(); - object->move(applyAllowedDirections(nextDynamics.allowedDirections, nextDynamics.massCenter - dynamics.massCenter)); + auto shift = applyAllowedDirections(nextDynamics.allowedDirections, nextDynamics.massCenter - dynamics.massCenter).zeroised(); + nextDynamics.massCenter = dynamics.massCenter + shift; + object->move(shift); // TODO // object->rotate( // nextDynamics.rotationVelocity * object.deltaTime, diff --git a/include/Dynamics/DynamicsAwareInterface.h b/include/Dynamics/DynamicsAwareInterface.h index 151b529..a2de667 100644 --- a/include/Dynamics/DynamicsAwareInterface.h +++ b/include/Dynamics/DynamicsAwareInterface.h @@ -3,6 +3,7 @@ #include "../Geometrics/Vector2f.h" #include "../ReduceableList.h" #include "../pch.h" +#include "DynamicsAwareListConcept.h" #include "DynamicsDTO.h" #include "DynamicsDTOCollection.h" #include @@ -20,6 +21,15 @@ class DynamicsAwareInterface: public virtual BartaObjectInterface { virtual void rotate(float, Vector2f) = 0; + /** + * @deprecated use getCurrentDynamicsData() or getNextDynamicsData() instead + */ virtual DynamicsDTOCollection& getDynamicsDTOs() = 0; + + virtual const DynamicsDTO& getCurrentDynamicsData() final { return this->getDynamicsDTOs()[Barta::DynamicsDTOIteration::CURRENT]; } + + virtual DynamicsDTO& getNextDynamicsData() final { return this->getDynamicsDTOs()[Barta::DynamicsDTOIteration::NEXT]; } }; + +static_assert(DynamicsAwareConcept); } diff --git a/include/Dynamics/DynamicsAwareListConcept.h b/include/Dynamics/DynamicsAwareListConcept.h index 1ef98fa..5262445 100644 --- a/include/Dynamics/DynamicsAwareListConcept.h +++ b/include/Dynamics/DynamicsAwareListConcept.h @@ -4,20 +4,17 @@ #pragma once #include "DynamicsDTO.h" +#include "DynamicsDTOCollection.h" #include "pch.h" -template -concept DynamicsAwarePointerConcept = requires(T t, Barta::Vector2f v, float rotation) { - { t->getDynamicsDTOs() } -> std::same_as; - { t->move(v) } -> std::same_as; - { t->rotate(rotation) } -> std::same_as; -}; - template concept DynamicsAwareConcept = requires(T t, Barta::Vector2f v, float rotation) { { t.getDynamicsDTOs() } -> std::same_as; + { t.getCurrentDynamicsData() } -> std::same_as; + { t.getNextDynamicsData() } -> std::same_as; + { t.isToBeDeleted() } -> std::same_as; { t.move(v) } -> std::same_as; - { t.rotate(rotation) } -> std::same_as; + { t.rotate(rotation, v) } -> std::same_as; }; template @@ -26,5 +23,4 @@ concept DynamicsAwareListConcept = requires(T t) { { t.end() } -> std::sentinel_for; // TODO add concept for list entry - // requires DynamicsAwarePointerConcept>; }; diff --git a/include/Geometrics/BartaShapes/AABB.h b/include/Geometrics/BartaShapes/AABB.h index 696b1fa..680c032 100644 --- a/include/Geometrics/BartaShapes/AABB.h +++ b/include/Geometrics/BartaShapes/AABB.h @@ -22,6 +22,7 @@ class AABB { LEFT_TOP = TOP + LEFT }; + AABB() = default; AABB(const Vector2f& leftTop, const Vector2f& widthHeight); /* @@ -74,8 +75,8 @@ class AABB { VoronoiRegion findVoronoiRegionType(const Vector2f& point) const noexcept; private: - const Vector2f leftTop; - const Vector2f widthHeight; + Vector2f leftTop; + Vector2f widthHeight; }; inline AABB::VoronoiRegion operator|( diff --git a/include/Geometrics/BartaShapes/OBB.h b/include/Geometrics/BartaShapes/OBB.h index d636165..12cb265 100644 --- a/include/Geometrics/BartaShapes/OBB.h +++ b/include/Geometrics/BartaShapes/OBB.h @@ -37,6 +37,8 @@ class OBB: protected AABB { PointDistance closestPointTo(Vector2f) const noexcept; + Vector2f getCenter() const noexcept; + private: // radians float rotation; diff --git a/include/Geometrics/Intersections.h b/include/Geometrics/Intersections.h index db13084..fbd99fd 100644 --- a/include/Geometrics/Intersections.h +++ b/include/Geometrics/Intersections.h @@ -1,76 +1,20 @@ #pragma once -#include "../Utilities/QuadraticEquation.h" #include "BartaShapes/AABB.h" #include "BartaShapes/Circle.h" +#include "Ray.h" #include "Segment.h" namespace Barta { namespace Intersections { - auto segmentAndCircle( - const Segment& I, - const Circle& c - ) noexcept { - auto d = I.getEnd() - I.getBeginning(); - auto m = I.getBeginning() - c.getCenter(); - auto eq = Utils::QuadraticEquation(d * d, m * d * 2.f, m * m - c.getRadius() * c.getRadius()); - eq.solve(); - auto sol = eq.getSolutions(); - sol.erase(std::remove_if(sol.begin(), sol.end(), [](float t) { return t < 0.f || 1.f < t; }), sol.end()); + float lineAndLineRespectToFirst(const Segment& I1, const Segment& I2) noexcept; - return sol; - } + std::vector> segmentAndSegment(const Segment& I1, const Segment& I2) noexcept; - float lineAndLineRespectToFirst( - const Segment& I1, - const Segment& I2 - ) noexcept { - auto perpendicular = (I2.getEnd() - I2.getBeginning()).perpendicular(); - auto denom = (perpendicular * (I1.getEnd() - I1.getBeginning())); - if (denom == 0.f) { - return std::numeric_limits::infinity(); - } + std::vector> segmentAndAABB(const Segment& I, const AABB& aabb); - return (perpendicular * (I2.getBeginning() - I1.getBeginning())) / denom; - } + std::vector rayAndCircle(const Ray& ray, const Circle& c) noexcept; - auto segmentAndSegment( - const Segment& I1, - const Segment& I2 - ) noexcept { - std::vector> result; - auto barCoords = std::tuple(lineAndLineRespectToFirst(I1, I2), lineAndLineRespectToFirst(I2, I1)); - - if (0.f <= std::get<0>(barCoords) && std::get<0>(barCoords) <= 1.f && 0.f <= std::get<1>(barCoords) && std::get<1>(barCoords) <= 1.f) { - result.push_back(barCoords); - } - - return result; - } - - auto segmentAndAABB( - const Segment& I, - const AABB& aabb - ) { - decltype(segmentAndSegment(I, I)) intersections; - for (const auto& side: aabb.getSides()) { - auto sideIntersections = segmentAndSegment(I, side); - intersections.insert(intersections.end(), sideIntersections.begin(), sideIntersections.end()); - } - - if (intersections.size() == 2) { - if (std::get<0>(intersections[0]) > std::get<0>(intersections[1])) { - auto temp = intersections[0]; - intersections[0] = intersections[1]; - intersections[1] = temp; - } - } - - if (intersections.size() > 2) { - throw std::runtime_error("size too long"); - } - - return intersections; - } + std::vector segmentAndCircle(const Segment& I, const Circle& c) noexcept; } } diff --git a/include/Geometrics/Ray.h b/include/Geometrics/Ray.h new file mode 100644 index 0000000..f601eaf --- /dev/null +++ b/include/Geometrics/Ray.h @@ -0,0 +1,16 @@ +// +// Created by bartanakin on 11/15/24. +// + +#pragma once +#include "Vector2f.h" + +namespace Barta { + +struct Ray { + Vector2f origin; + Vector2f direction; + + Ray(Vector2f origin, Vector2f direction) noexcept; +}; +} diff --git a/include/Geometrics/Vector2f.h b/include/Geometrics/Vector2f.h index 6182102..f441ff3 100644 --- a/include/Geometrics/Vector2f.h +++ b/include/Geometrics/Vector2f.h @@ -5,7 +5,7 @@ namespace Barta { class Vector2f { public: - static constexpr float ZEROING_EDGE = 0.005f; + static constexpr float ZEROING_EDGE = 0.001f; float x; float y; constexpr Vector2f() noexcept = default; @@ -55,7 +55,7 @@ class Vector2f { Vector2f rotated(float radians) const noexcept; - float angleTo(Vector2f) const noexcept; + float angleTo(Vector2f = {1.f, 0.f}) const noexcept; Vector2f projection(Vector2f) const noexcept; @@ -71,6 +71,8 @@ class Vector2f { bool isZero() const noexcept; + float length() const noexcept; + /* * @deprecated */ diff --git a/include/Graphics/SpriteBuilder/RectangleWithColorsSprite.h b/include/Graphics/SpriteBuilder/RectangleWithColorsSprite.h index 0e875a6..0bbe286 100644 --- a/include/Graphics/SpriteBuilder/RectangleWithColorsSprite.h +++ b/include/Graphics/SpriteBuilder/RectangleWithColorsSprite.h @@ -1,30 +1,30 @@ #pragma once -#include "../Color.h" #include "../../Geometrics/BartaShapes/AABB.h" +#include "../Color.h" -namespace Barta{ - struct RectangleWithColorsSprite { - public: - RectangleWithColorsSprite( - Vector2f origin, - Vector2f size, - Color leftTopColor, - Color rightTopColor, - Color rightBottomColor, - Color leftBottomColor - ) noexcept : - aabb({origin, size}), - leftTopColor(leftTopColor), - rightTopColor(rightTopColor), - rightBottomColor(rightBottomColor), - leftBottomColor(leftBottomColor) - {} +namespace Barta { +struct RectangleWithColorsSprite { +public: + RectangleWithColorsSprite() noexcept = default; - AABB aabb; - Color leftTopColor; - Color rightTopColor; - Color rightBottomColor; - Color leftBottomColor; - }; -} + RectangleWithColorsSprite( + Vector2f origin, + Vector2f size, + Color leftTopColor, + Color rightTopColor, + Color rightBottomColor, + Color leftBottomColor + ) noexcept: + aabb({origin, size}), + leftTopColor(leftTopColor), + rightTopColor(rightTopColor), + rightBottomColor(rightBottomColor), + leftBottomColor(leftBottomColor) {} + AABB aabb; + Color leftTopColor; + Color rightTopColor; + Color rightBottomColor; + Color leftBottomColor; +}; +} diff --git a/include/Hitbox/AABB_Hitbox.h b/include/Hitbox/AABB_Hitbox.h index b6cfb37..b42816c 100644 --- a/include/Hitbox/AABB_Hitbox.h +++ b/include/Hitbox/AABB_Hitbox.h @@ -12,6 +12,8 @@ class AABB_Hitbox: public HitboxInterface { bool isWithin(const Vector2f& position) const override; + std::vector intersectsWithRay(const Ray& ray) const override; + CollisionTestResult intersects( const HitboxInterface& secondHitbox, const CollisionDetectionStrategyInterface& collisionDetector, diff --git a/include/Hitbox/CircleHitbox.h b/include/Hitbox/CircleHitbox.h index c58bbb9..8c6f171 100644 --- a/include/Hitbox/CircleHitbox.h +++ b/include/Hitbox/CircleHitbox.h @@ -11,6 +11,8 @@ class CircleHitbox final: public HitboxInterface { bool isWithin(const Vector2f& position) const override; + std::vector intersectsWithRay(const Ray& ray) const override; + CollisionTestResult intersects( const HitboxInterface& secondHitbox, const CollisionDetectionStrategyInterface& collisionDetector, diff --git a/include/Hitbox/HitboxAwareConcept.h b/include/Hitbox/HitboxAwareConcept.h new file mode 100644 index 0000000..83103e5 --- /dev/null +++ b/include/Hitbox/HitboxAwareConcept.h @@ -0,0 +1,15 @@ +// +// Created by bartanakin on 11/10/24. +// + +#pragma once +#include "HitboxInterface.h" +#include "pch.h" + +namespace Barta { +template +concept HitboxAwareConcept = requires(const T t) { + { t.getHitbox() } -> std::same_as>; +}; + +} diff --git a/include/Hitbox/HitboxAwareInterface.h b/include/Hitbox/HitboxAwareInterface.h index 2e44108..3fa12ed 100644 --- a/include/Hitbox/HitboxAwareInterface.h +++ b/include/Hitbox/HitboxAwareInterface.h @@ -1,16 +1,18 @@ #pragma once +#include "../Geometrics/TransformableInterface.h" #include "../pch.h" +#include "HitboxAwareConcept.h" #include "HitboxInterface.h" -#include "../Geometrics/TransformableInterface.h" -namespace Barta{ +namespace Barta { - class HitboxAware{ - public: - HitboxAware() = default; - virtual ~HitboxAware() = default; +class HitboxAware { +public: + HitboxAware() = default; + virtual ~HitboxAware() = default; - virtual std::unique_ptr getHitbox() const = 0; - }; -} + virtual std::unique_ptr getHitbox() const = 0; +}; +static_assert(HitboxAwareConcept); +} diff --git a/include/Hitbox/HitboxComposite.h b/include/Hitbox/HitboxComposite.h index 5c56971..3e444ba 100644 --- a/include/Hitbox/HitboxComposite.h +++ b/include/Hitbox/HitboxComposite.h @@ -13,6 +13,8 @@ class HitboxComposite final: public HitboxInterface { bool isWithin(const Vector2f& position) const override; + std::vector intersectsWithRay(const Ray& ray) const override; + CollisionTestResult intersects( const HitboxInterface& secondHitbox, const CollisionDetectionStrategyInterface& collisionDetector, diff --git a/include/Hitbox/HitboxInterface.h b/include/Hitbox/HitboxInterface.h index 0a7deb9..f288ee7 100644 --- a/include/Hitbox/HitboxInterface.h +++ b/include/Hitbox/HitboxInterface.h @@ -3,6 +3,7 @@ #include "../Dynamics/DynamicsDifference.h" #include "../Geometrics/TransformableInterface.h" #include "../pch.h" +#include "Geometrics/Ray.h" namespace Barta { @@ -13,6 +14,8 @@ class HitboxInterface { virtual bool isWithin(const Vector2f& position) const = 0; + virtual std::vector intersectsWithRay(const Ray& ray) const = 0; + virtual CollisionTestResult intersects( const HitboxInterface& secondHitbox, const CollisionDetectionStrategyInterface& collisionDetector, diff --git a/include/Hitbox/NullHitbox.h b/include/Hitbox/NullHitbox.h index 27fbb9f..d3dc55d 100644 --- a/include/Hitbox/NullHitbox.h +++ b/include/Hitbox/NullHitbox.h @@ -12,6 +12,8 @@ class NullHitbox final: public virtual HitboxInterface { bool isWithin(const Vector2f& position) const override; + std::vector intersectsWithRay(const Ray& ray) const override; + CollisionTestResult intersects( const HitboxInterface& secondHitbox, const CollisionDetectionStrategyInterface& collisionDetector, diff --git a/include/Hitbox/OBB_Hitbox.h b/include/Hitbox/OBB_Hitbox.h index 7652fe9..2707a3d 100644 --- a/include/Hitbox/OBB_Hitbox.h +++ b/include/Hitbox/OBB_Hitbox.h @@ -10,8 +10,11 @@ namespace Barta { class OBB_Hitbox: public virtual HitboxInterface { public: OBB_Hitbox(const OBB& obb) noexcept; + bool isWithin(const Vector2f& position) const override; + std::vector intersectsWithRay(const Ray& ray) const override; + CollisionTestResult intersects( const HitboxInterface& secondHitbox, const CollisionDetectionStrategyInterface& collisionDetector, diff --git a/include/StaticObjectManager.h b/include/StaticObjectManager.h index a7922a8..86bfc55 100644 --- a/include/StaticObjectManager.h +++ b/include/StaticObjectManager.h @@ -1,51 +1,57 @@ #pragma once -#include "pch.h" #include "ReduceableList.h" +#include "pch.h" #include -namespace Barta{ - template - using ListType = ReducibleList>; - - template - concept DeleteSettable = requires(T t) { - { t.isToBeDeleted() } -> std::same_as; - }; - - template - class StaticObjectManager : public StaticObjectManager, public StaticObjectManager{ - public: - StaticObjectManager() : StaticObjectManager(), StaticObjectManager() {} - ~StaticObjectManager() {}; - - using StaticObjectManager::reduceDeleted; - using StaticObjectManager::reduceDeleted; - using StaticObjectManager::addObject; - using StaticObjectManager::addObject; - using StaticObjectManager::getList; - using StaticObjectManager::getList; - }; - - template - class StaticObjectManager { - public: - StaticObjectManager() noexcept : objects(ListType()) {}; - ~StaticObjectManager() = default; - - void addObject(T* object) { - this->objects.push_back(object); - } - - void reduceDeleted() { - this->objects.reduce(); - }; - - ListType& getList(T* = nullptr) { - return this->objects; - }; - - private: - ListType objects; - }; +namespace Barta { +template +using ListType = ReducibleList>; + +template +concept DeleteSettable = requires(T t) { + { t.isToBeDeleted() } -> std::same_as; +}; + +template +class StaticObjectManager: public StaticObjectManager, public StaticObjectManager { +public: + StaticObjectManager(): + StaticObjectManager(), + StaticObjectManager() {} + + ~StaticObjectManager() {} + + using StaticObjectManager::reduceDeleted; + using StaticObjectManager::reduceDeleted; + using StaticObjectManager::addObject; + using StaticObjectManager::addObject; + using StaticObjectManager::getList; + using StaticObjectManager::getList; +}; + +template +class StaticObjectManager { +public: + StaticObjectManager() noexcept: + objects(ListType()) {} + + ~StaticObjectManager() = default; + + void addObject( + T* object + ) { + this->objects.push_back(object); + } + + void reduceDeleted() { this->objects.reduce(); } + + ListType& getList( + T* = nullptr + ) { + return this->objects; + } + +private: + ListType objects; +}; } - diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 6f03df0..3b85c60 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -12,6 +12,12 @@ add_library(${LIBRARY_NAME} ../include/Graphics/GraphicsDataTransformer.h ../include/Events/Subscribers/CollisionBrakeSubscriber.h ../include/Dynamics/DynamicsDTOCollection.h + ../include/Hitbox/HitboxAwareConcept.h + Debug/DebugGuardSubscriber.cpp + ../include/Debug/DebugGuardSubscriber.h + ../include/Geometrics/Ray.h + Geometrics/Ray.cpp + Geometrics/Intersections.cpp ) # target_precompile_headers(${PROJECT_NAME} PUBLIC diff --git a/lib/Debug/DebugGuardSubscriber.cpp b/lib/Debug/DebugGuardSubscriber.cpp new file mode 100644 index 0000000..ca996ca --- /dev/null +++ b/lib/Debug/DebugGuardSubscriber.cpp @@ -0,0 +1,23 @@ +// +// Created by bartanakin on 11/10/24. +// + +#include + +namespace Barta::Debug { +bool DebugGuardSubscriber::debugGuard = false; + +bool DebugGuardSubscriber::handle( + KeyPressedEvent& event +) { + if (event.key == BartaKeyMap::SPACEBAR) { + debugGuard = true; + } + + return false; +} + +bool DebugGuardSubscriber::isValid() const noexcept { + return true; +} +} // Barta diff --git a/lib/Geometrics/BartaShapes/OBB.cpp b/lib/Geometrics/BartaShapes/OBB.cpp index 60fd5a2..2409fd3 100644 --- a/lib/Geometrics/BartaShapes/OBB.cpp +++ b/lib/Geometrics/BartaShapes/OBB.cpp @@ -43,6 +43,10 @@ Barta::AABB::PointDistance Barta::OBB::closestPointTo( return AABB::closestPointTo((p - this->getLeftTop()).rotated(-this->getRotation()) + this->getLeftTop()); } +Barta::Vector2f Barta::OBB::getCenter() const noexcept { + return this->getLeftTop() + (this->getWidthHeight() * 0.5f).rotated(this->rotation); +} + std::vector Barta::OBB::getVertices() const noexcept { return {this->getFirstVertex(), this->getSecondVertex(), this->getThirdVertex(), this->getFourthVertex()}; } diff --git a/lib/Geometrics/Intersections.cpp b/lib/Geometrics/Intersections.cpp new file mode 100644 index 0000000..4e84b97 --- /dev/null +++ b/lib/Geometrics/Intersections.cpp @@ -0,0 +1,84 @@ +// +// Created by bartanakin on 11/15/24. +// + +#include +#include + +float Barta::Intersections::lineAndLineRespectToFirst( + const Segment& I1, + const Segment& I2 +) noexcept { + auto perpendicular = (I2.getEnd() - I2.getBeginning()).perpendicular(); + auto denom = (perpendicular * (I1.getEnd() - I1.getBeginning())); + if (denom == 0.f) { + return std::numeric_limits::infinity(); + } + + return (perpendicular * (I2.getBeginning() - I1.getBeginning())) / denom; +} + +std::vector> Barta::Intersections::segmentAndAABB( + const Segment& I, + const AABB& aabb +) { + decltype(segmentAndSegment(I, I)) intersections; + for (const auto& side: aabb.getSides()) { + auto sideIntersections = segmentAndSegment(I, side); + intersections.insert(intersections.end(), sideIntersections.begin(), sideIntersections.end()); + } + + if (intersections.size() == 2) { + if (std::get<0>(intersections[0]) > std::get<0>(intersections[1])) { + auto temp = intersections[0]; + intersections[0] = intersections[1]; + intersections[1] = temp; + } + } + + if (intersections.size() > 2) { + throw std::runtime_error("size too long"); + } + + return intersections; +} + +std::vector> Barta::Intersections::segmentAndSegment( + const Segment& I1, + const Segment& I2 +) noexcept { + std::vector> result; + auto barCoords = std::tuple(lineAndLineRespectToFirst(I1, I2), lineAndLineRespectToFirst(I2, I1)); + + if (0.f <= std::get<0>(barCoords) && std::get<0>(barCoords) <= 1.f && 0.f <= std::get<1>(barCoords) && std::get<1>(barCoords) <= 1.f) { + result.push_back(barCoords); + } + + return result; +} + +std::vector Barta::Intersections::segmentAndCircle( + const Segment& I, + const Circle& c +) noexcept { + auto sol = Intersections::rayAndCircle({I.getBeginning(), I.getEnd() - I.getBeginning()}, c); + + sol.erase(std::remove_if(sol.begin(), sol.end(), [](float t) { return 1.f < t; }), sol.end()); + + return sol; +} + +std::vector Barta::Intersections::rayAndCircle( + const Ray& ray, + const Circle& c +) noexcept { + auto d = ray.direction; + auto m = ray.origin - c.getCenter(); + auto eq = Utils::QuadraticEquation(d * d, m * d * 2.f, m * m - c.getRadius() * c.getRadius()); + eq.solve(); + auto sol = eq.getSolutions(); + + sol.erase(std::remove_if(sol.begin(), sol.end(), [](float t) { return t < 0.f; }), sol.end()); + + return sol; +} diff --git a/lib/Geometrics/Ray.cpp b/lib/Geometrics/Ray.cpp new file mode 100644 index 0000000..6fd4b0c --- /dev/null +++ b/lib/Geometrics/Ray.cpp @@ -0,0 +1,12 @@ +// +// Created by bartanakin on 11/15/24. +// + +#include "Geometrics/Ray.h" + +Barta::Ray::Ray( + Vector2f origin, + Vector2f direction +) noexcept: + origin(origin), + direction(direction) {} diff --git a/lib/Geometrics/Vector2f.cpp b/lib/Geometrics/Vector2f.cpp index 8428a33..416a203 100644 --- a/lib/Geometrics/Vector2f.cpp +++ b/lib/Geometrics/Vector2f.cpp @@ -74,7 +74,12 @@ Barta::Vector2f Barta::Vector2f::perpendicular() const { } Barta::Vector2f Barta::Vector2f::normalised() const { - return *this * (1.f / std::sqrt(this->squareOfDistance(Vector2f()))); + auto length = std::sqrt(this->squareOfDistance(Vector2f())); + if (length == 0) { + return {}; + } + + return *this * 1.f / length; } float Barta::Vector2f::normSquare() const { @@ -170,7 +175,11 @@ float& Barta::Vector2f::operator[]( } bool Barta::Vector2f::isZero() const noexcept { - return *this == Vector2f{}; + return this->zeroised() == Vector2f{}; +} + +float Barta::Vector2f::length() const noexcept { + return std::sqrt(this->normSquare()); } Barta::Vector2f Barta::Vector2f::zeroise( diff --git a/lib/Hitbox/AABB_Hitbox.cpp b/lib/Hitbox/AABB_Hitbox.cpp index 2a18a18..c8d3c52 100644 --- a/lib/Hitbox/AABB_Hitbox.cpp +++ b/lib/Hitbox/AABB_Hitbox.cpp @@ -16,6 +16,13 @@ bool Barta::AABB_Hitbox::isWithin( && this->getAABB().getLeftTop().getY() <= position.getY() && position.getY() <= this->getAABB().getRightBottom().getY(); } +std::vector Barta::AABB_Hitbox::intersectsWithRay( + const Ray& ray +) const { + // TODO + return {}; +} + Barta::CollisionTestResult Barta::AABB_Hitbox::intersects( const HitboxInterface& secondHitbox, const CollisionDetectionStrategyInterface& collisionDetector, diff --git a/lib/Hitbox/CircleHitbox.cpp b/lib/Hitbox/CircleHitbox.cpp index c0434c5..ee722af 100644 --- a/lib/Hitbox/CircleHitbox.cpp +++ b/lib/Hitbox/CircleHitbox.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include namespace Barta { @@ -69,6 +70,12 @@ bool CircleHitbox::isWithin( <= pow(this->circle.getRadius(), 2); } +std::vector CircleHitbox::intersectsWithRay( + const Ray& ray +) const { + return Intersections::rayAndCircle(ray, this->circle); +} + CollisionTestResult CircleHitbox::intersects( const HitboxInterface& secondHitbox, const CollisionDetectionStrategyInterface& collisionDetector, diff --git a/lib/Hitbox/HitboxComposite.cpp b/lib/Hitbox/HitboxComposite.cpp index 4f9b211..b358719 100644 --- a/lib/Hitbox/HitboxComposite.cpp +++ b/lib/Hitbox/HitboxComposite.cpp @@ -18,6 +18,12 @@ bool Barta::HitboxComposite::isWithin( return false; } +std::vector Barta::HitboxComposite::intersectsWithRay( + const Ray& ray +) const { + throw std::runtime_error("Not implemented"); +} + Barta::CollisionTestResult Barta::HitboxComposite::intersects( const HitboxInterface& secondHitbox, const CollisionDetectionStrategyInterface& collisionDetector, diff --git a/lib/Hitbox/NullHitbox.cpp b/lib/Hitbox/NullHitbox.cpp index 3e53429..98989a0 100644 --- a/lib/Hitbox/NullHitbox.cpp +++ b/lib/Hitbox/NullHitbox.cpp @@ -8,6 +8,12 @@ bool Barta::NullHitbox::isWithin( return false; } +std::vector Barta::NullHitbox::intersectsWithRay( + const Ray& ray +) const { + return {}; +} + Barta::CollisionTestResult Barta::NullHitbox::intersects( const HitboxInterface& secondHitbox, const CollisionDetectionStrategyInterface& collisionDetector, diff --git a/lib/Hitbox/OBB_Hitbox.cpp b/lib/Hitbox/OBB_Hitbox.cpp index 41b587b..8f9e841 100644 --- a/lib/Hitbox/OBB_Hitbox.cpp +++ b/lib/Hitbox/OBB_Hitbox.cpp @@ -5,6 +5,7 @@ #include "Collisions/CheckCollisionVisitors/OBB_AABBCheckCollisionVisitor.h" #include "Hitbox/OBB_Hitbox.h" #include +#include Barta::OBB_Hitbox::OBB_Hitbox( const OBB& obb @@ -20,6 +21,12 @@ bool Barta::OBB_Hitbox::isWithin( && rebasedPosition.getY() <= this->obb.getWidthHeight().y; } +std::vector Barta::OBB_Hitbox::intersectsWithRay( + const Ray& ray +) const { + throw std::runtime_error("Not implemented"); +} + Barta::CollisionTestResult Barta::OBB_Hitbox::intersects( const HitboxInterface& secondHitbox, const CollisionDetectionStrategyInterface& collisionDetector,