A WIP 3D game engine in C++ using OpenGL
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

104 lines
2.5 KiB

#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];
}
};