simplify rays (no templates)

This commit is contained in:
A-lex-Ra 2024-01-04 23:52:15 +06:00
parent 61dccbf8b9
commit f69f6e2711
2 changed files with 48 additions and 89 deletions

View file

@ -8,7 +8,6 @@
#include "glm/gtx/hash.hpp"
#include <array>
#include <unordered_map>
typedef glm::highp_dvec3 rayvec3;
typedef glm::highp_dvec2 rayvec2;
@ -17,31 +16,18 @@ typedef double scalar_t;
enum class RayRelation{
Embed=2, Intersect=1, Parallel=0, None=0
};
enum class AAFaceKind : unsigned char{
Xperp=0, Yperp=1, Zperp=2 //perpendicular faces to corresponding axis
};
const unsigned char AABBFACES_COUNT = 6;
class AABBFaces{
static const unsigned char AABBFACES_COUNT = 6;
public:
std::array<std::pair<rayvec3, rayvec2>, AABBFACES_COUNT> faces; // every face is min-point and opposite corner point
static constexpr std::array<AAFaceKind,AABBFACES_COUNT> KINDS_ORDER = {
AAFaceKind::Xperp, AAFaceKind::Xperp,
AAFaceKind::Yperp, AAFaceKind::Yperp,
AAFaceKind::Zperp, AAFaceKind::Zperp};
AABBFaces(){};
AABBFaces(const rayvec3& parentBoxPos, const AABB& parentBox);
};
class Ray{
protected:
static const bool IS_RAYS_BOX_CACHE_ON = false; // Now not working properly because not observe updates
static std::unordered_map<rayvec3, AABBFaces> raysBoxCache_; //[boxPos]: faces array
public:
rayvec3 origin;
rayvec3 dir;
@ -49,39 +35,32 @@ public:
Ray(const rayvec3& rayOrigin,
const rayvec3& rayDir);
//optimized, NOT returns intersectPoint coordinates and normal vector
template <AAFaceKind faceKind>
RayRelation isIntersectsAAFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner
);
//returns only normal
template <AAFaceKind faceKind>
RayRelation intersectAAFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner,
glm::ivec3& normal_ret
);
RayRelation isIntersectsYZFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner);
RayRelation isIntersectsXZFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner);
RayRelation isIntersectsXYFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner);
//returns normal and distance
template <AAFaceKind faceKind>
RayRelation intersectAAFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner,
glm::ivec3& normal_ret,
scalar_t& distance_ret
);
// returns normal, distance and intersection point
template <AAFaceKind faceKind>
RayRelation intersectAAFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner,
glm::ivec3& normal_ret,
scalar_t& distance_ret,
rayvec3& intersectPoint_ret
);
RayRelation intersectYZFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner,
glm::ivec3& normal_ret,
scalar_t& distance_ret);
RayRelation intersectXZFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner,
glm::ivec3& normal_ret,
scalar_t& distance_ret);
RayRelation intersectXYFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner,
glm::ivec3& normal_ret,
scalar_t& distance_ret);
RayRelation intersectAABB(
const rayvec3& boxPos,