engine/include/systems/collisions.h

76 lines
1.7 KiB
C
Raw Normal View History

2024-03-31 10:11:22 +00:00
#pragma once
2023-01-18 14:42:09 +00:00
2023-04-29 14:22:25 +00:00
#include <cstdint>
2023-05-01 12:55:49 +00:00
#include <vector>
2023-02-02 17:32:19 +00:00
2023-05-02 11:02:43 +00:00
#include <glm/mat4x4.hpp>
2023-05-01 13:13:35 +00:00
#include "components/collider.h"
2023-09-19 07:40:45 +00:00
#include "ecs.h"
2023-04-29 14:22:25 +00:00
2023-01-18 14:42:09 +00:00
namespace engine {
struct Ray {
glm::vec3 origin;
glm::vec3 direction;
2023-05-01 12:55:49 +00:00
};
struct Raycast {
glm::vec3 location;
glm::vec3 normal;
Entity hit_entity; // broken
float distance;
bool hit;
};
enum class AABBSide { Left, Right, Bottom, Top, Front, Back };
class CollisionSystem : public System {
public:
CollisionSystem(Scene* scene);
void OnComponentInsert(Entity entity) override;
void OnUpdate(float ts) override;
Raycast GetRaycast(Ray ray);
2024-03-14 04:25:02 +00:00
public:
// one node of the BVH
struct BiTreeNode {
enum class Type : uint8_t { BoundingVolume, Entity, Empty };
AABB box1;
AABB box2;
uint32_t index1; // index for either tree entry or entity, depending on type
uint32_t index2;
Type type1;
Type type2;
}; // 60 bytes with alignment of 4 allows for tight packing
// an array of these is used to build the BVH
struct PrimitiveInfo {
Entity entity;
AABB box;
glm::vec3 centroid;
PrimitiveInfo(const AABB& aabb, Entity entity_idx);
};
2024-03-14 04:25:02 +00:00
std::vector<BiTreeNode> bvh_{};
private:
size_t colliders_size_last_update_ = 0;
size_t colliders_size_now_ = 0;
struct RaycastTreeNodeResult {
glm::vec3 location;
Entity object_index;
AABBSide side;
float t;
bool hit; // if this is false, all other values are undefined
};
RaycastTreeNodeResult RaycastTreeNode(const Ray& ray, const BiTreeNode& node);
static int BuildNode(std::vector<PrimitiveInfo>& prims, std::vector<BiTreeNode>& tree_nodes);
};
2024-03-31 10:11:22 +00:00
} // namespace engine