alistair
2 years ago
18 changed files with 502 additions and 71 deletions
@ -0,0 +1,104 @@ |
|||||||
|
|
||||||
|
#include "jsonloader.h" |
||||||
|
#include "collision.h" |
||||||
|
|
||||||
|
|
||||||
|
namespace collision { |
||||||
|
|
||||||
|
// static CollisionInfo Collider::test(PlaneCollider a, SphereCollider b, glm::vec3 pa, glm::vec3 pb);
|
||||||
|
|
||||||
|
// static CollisionInfo Collider::test(SphereCollider a, PlaneCollider b, glm::vec3 pa, glm::vec3 pb);
|
||||||
|
|
||||||
|
// static CollisionInfo Collider::test(AABBCollider a, PlaneCollider b, glm::vec3 pa, glm::vec3 pb);
|
||||||
|
|
||||||
|
// static CollisionInfo Collider::test(PlaneCollider a, AABBCollider b, glm::vec3 pa, glm::vec3 pb);
|
||||||
|
|
||||||
|
// static CollisionInfo Collider::test(AABBCollider a, AABBCollider b, glm::vec3 pa, glm::vec3 pb);
|
||||||
|
|
||||||
|
|
||||||
|
CollisionInfo Collider::test(AABBCollider a, AABBCollider b, glm::vec3 pa, glm::vec3 pb) { |
||||||
|
CollisionInfo c; |
||||||
|
c.intersecting = false; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
CollisionInfo Collider::test(SphereCollider a, SphereCollider b, glm::vec3 pa, glm::vec3 pb) { |
||||||
|
CollisionInfo c; |
||||||
|
c.intersecting = false; |
||||||
|
if (glm::distance(pa, pb) < a.radius + b.radius) { |
||||||
|
c.intersecting = true; |
||||||
|
glm::vec3 restore = pa - pb; |
||||||
|
restore *= (a.radius + b.radius) / (glm::distance(pa, pb)); |
||||||
|
c.restore = restore; |
||||||
|
} |
||||||
|
return c; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
std::optional<AABBCollider> AABBCollider::from_json(json j) { |
||||||
|
// ["AABB": [0.1, 0.1]]
|
||||||
|
try { |
||||||
|
if (!j.contains(AABBCollider::name)) { |
||||||
|
return {}; |
||||||
|
} |
||||||
|
auto r = vec3_fromjson(j[AABBCollider::name]); |
||||||
|
if (!r) return {}; |
||||||
|
return AABBCollider(*r); |
||||||
|
} catch (std::exception &e) { |
||||||
|
return {}; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
std::optional<SphereCollider> SphereCollider::from_json(json j) { |
||||||
|
// ["SphereCollider": {"radius": 0.01}]
|
||||||
|
try { |
||||||
|
if (!j.contains(SphereCollider::name)) { |
||||||
|
return {}; |
||||||
|
} |
||||||
|
return SphereCollider((double)j[SphereCollider::name]["radius"]); |
||||||
|
} catch (std::exception &e) { |
||||||
|
return {}; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Collider::Collider (PlaneCollider p) : type(PLANE) { |
||||||
|
type = PLANE; |
||||||
|
inner.plane = p; |
||||||
|
} |
||||||
|
|
||||||
|
Collider::Collider (SphereCollider s) { |
||||||
|
type = SPHERE; |
||||||
|
inner.sphere = s; |
||||||
|
} |
||||||
|
|
||||||
|
Collider::Collider (AABBCollider a) { |
||||||
|
inner.aabb = a; |
||||||
|
type = AABB; |
||||||
|
} |
||||||
|
|
||||||
|
Collider::Collider (FPlaneCollider f) { |
||||||
|
type = FPLANE;; |
||||||
|
inner.fplane = f; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
std::optional<Collider> Collider::from_json(json j) { |
||||||
|
if (j.count(PlaneCollider::name)) { |
||||||
|
return {}; |
||||||
|
//return Collider(*PlaneCollider::from_json(j));
|
||||||
|
} else if (j.count(FPlaneCollider::name)) { |
||||||
|
return {}; |
||||||
|
//return Collider(*FPlaneCollider::from_json(j));
|
||||||
|
} else if (j.count(names[AABB])) { |
||||||
|
return Collider(*AABBCollider::from_json(j)); |
||||||
|
} else if (j.count(names[SPHERE])) { |
||||||
|
return Collider(*SphereCollider::from_json(j)); |
||||||
|
} else { |
||||||
|
return {}; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
std::string Collider::get_name() { |
||||||
|
return names[type]; |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,117 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <glm/common.hpp> |
||||||
|
#include <variant> |
||||||
|
#include <optional> |
||||||
|
#include <iostream> |
||||||
|
#include <glm/glm.hpp> |
||||||
|
#include <variant> |
||||||
|
|
||||||
|
#include "jsonloader.h" |
||||||
|
|
||||||
|
namespace collision { |
||||||
|
|
||||||
|
class CollisionInfo { |
||||||
|
public: |
||||||
|
bool intersecting; |
||||||
|
glm::vec3 restore; |
||||||
|
}; |
||||||
|
|
||||||
|
class PlaneCollider { |
||||||
|
public: |
||||||
|
static constexpr char * name = "Plane"; |
||||||
|
glm::vec3 orientation; |
||||||
|
PlaneCollider () {}; |
||||||
|
PlaneCollider(glm::vec3 orientation) { |
||||||
|
this->orientation = orientation; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
class FPlaneCollider { |
||||||
|
public: |
||||||
|
static constexpr char * name = "FinitePlane"; |
||||||
|
glm::vec3 orientation; |
||||||
|
glm::vec2 extents; |
||||||
|
FPlaneCollider() {} |
||||||
|
FPlaneCollider (glm::vec3 orientation, glm::vec2 extents) { |
||||||
|
this->orientation = orientation; |
||||||
|
this->extents = extents; |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
class AABBCollider { |
||||||
|
public: |
||||||
|
static constexpr char * name = "AABB"; |
||||||
|
glm::vec3 size; |
||||||
|
AABBCollider(){} |
||||||
|
AABBCollider(glm::vec3 size) { |
||||||
|
this->size = size; |
||||||
|
} |
||||||
|
|
||||||
|
static std::optional<AABBCollider> from_json(json j); |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
class SphereCollider { |
||||||
|
public: |
||||||
|
static constexpr char * name = "Sphere"; |
||||||
|
double radius; |
||||||
|
SphereCollider(){} |
||||||
|
SphereCollider(double radius) { |
||||||
|
this->radius = radius; |
||||||
|
} |
||||||
|
|
||||||
|
static std::optional<SphereCollider> from_json(json j); |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Collider { |
||||||
|
private: |
||||||
|
enum Type { |
||||||
|
NONE, |
||||||
|
PLANE, |
||||||
|
FPLANE, |
||||||
|
AABB, |
||||||
|
SPHERE, |
||||||
|
}; |
||||||
|
|
||||||
|
static constexpr char * names[] = { |
||||||
|
"NONE", |
||||||
|
"Plane", |
||||||
|
"Finite Plane", |
||||||
|
"AABB", |
||||||
|
"Sphere" |
||||||
|
}; |
||||||
|
|
||||||
|
Type type = NONE; |
||||||
|
union Colliders { |
||||||
|
PlaneCollider plane; |
||||||
|
FPlaneCollider fplane; |
||||||
|
AABBCollider aabb; |
||||||
|
SphereCollider sphere; |
||||||
|
Colliders() {} |
||||||
|
} inner; |
||||||
|
public: |
||||||
|
Collider (PlaneCollider p); |
||||||
|
Collider (SphereCollider s); |
||||||
|
Collider (AABBCollider a); |
||||||
|
Collider (FPlaneCollider f); |
||||||
|
|
||||||
|
static std::optional<Collider> from_json(json j); |
||||||
|
|
||||||
|
static CollisionInfo test(PlaneCollider a, SphereCollider b, glm::vec3 pa, glm::vec3 pb); |
||||||
|
static CollisionInfo test(SphereCollider a, PlaneCollider b, glm::vec3 pa, glm::vec3 pb); |
||||||
|
static CollisionInfo test(AABBCollider a, PlaneCollider b, glm::vec3 pa, glm::vec3 pb); |
||||||
|
static CollisionInfo test(PlaneCollider a, AABBCollider b, glm::vec3 pa, glm::vec3 pb); |
||||||
|
static CollisionInfo test(AABBCollider a, AABBCollider b, glm::vec3 pa, glm::vec3 pb); |
||||||
|
static CollisionInfo test(SphereCollider a, SphereCollider b, glm::vec3 pa, glm::vec3 pb); |
||||||
|
|
||||||
|
std::string get_name(); |
||||||
|
|
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
|
@ -0,0 +1,27 @@ |
|||||||
|
|
||||||
|
|
||||||
|
#include "jsonloader.h" |
||||||
|
|
||||||
|
std::optional<glm::vec3> vec3_fromjson(json j) noexcept { |
||||||
|
try { |
||||||
|
glm::vec3 c {j[0], j[1], j[2]}; |
||||||
|
return c; |
||||||
|
} catch (std::exception &e) { |
||||||
|
fmt::print("{} {}:{}:: {}", __FUNCTION__, __FILE__, __LINE__, e.what()); |
||||||
|
return {}; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
std::optional<glm::vec2> vec2_fromjson(json j) noexcept { |
||||||
|
try { |
||||||
|
glm::vec2 c {j[0], j[1]}; |
||||||
|
return c; |
||||||
|
} catch (std::exception &e) { |
||||||
|
fmt::print("{} {}:{}:: {}", __FUNCTION__, __FILE__, __LINE__, e.what()); |
||||||
|
return {}; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,13 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <nlohmann/json.hpp> |
||||||
|
using json = nlohmann::json; |
||||||
|
#include <optional> |
||||||
|
#include <glm/common.hpp> |
||||||
|
#include <glm/glm.hpp> |
||||||
|
#include <fmt/core.h> |
||||||
|
#include <optional> |
||||||
|
|
||||||
|
std::optional<glm::vec3> vec3_fromjson(json j) noexcept; |
||||||
|
|
||||||
|
std::optional<glm::vec2> vec2_fromjson(json j) noexcept; |
Loading…
Reference in new issue