#pragma once #include "LineSegment.h" #include "Shape.h" #include #include namespace J3ML::Geometry { // TODO: Move to separate math lib, find duplicates! template void Swap(T &a, T &b) { T temp = std::move(a); a = std::move(b); b = std::move(temp); } using namespace LinearAlgebra; class Capsule : public Shape { public: // Specifies the two inner points of this capsule LineSegment l; // Specifies the radius of this capsule float r; Capsule(); Capsule(const LineSegment& endPoints, float radius); Capsule(const Vector3& bottomPt, const Vector3& topPt, float radius); bool IsDegenerate() const; float Height() const; float Diameter() const; Vector3 Bottom() const; Vector3 Center() const; Vector3 Centroid() const; Vector3 ExtremePoint(const Vector3& direction); AABB MinimalEnclosingAABB() const; void ProjectToAxis(const Vector3 &direction, float &outMin, float &outMax) const; bool Intersects(const Plane &plane) const; bool Intersects(const Ray &ray) const; bool Intersects(const Line &line) const; bool Intersects(const LineSegment &lineSegment) const; bool Intersects(const AABB &aabb) const; bool Intersects(const OBB &obb) const; bool Intersects(const Sphere &sphere) const; bool Intersects(const Capsule &capsule) const; bool Intersects(const Triangle &triangle) const; bool Intersects(const Polygon &polygon) const; bool Intersects(const Frustum &frustum) const; bool Intersects(const Polyhedron &polyhedron) const; }; }