mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-11 05:51:51 +00:00
simplify rays (no templates)
This commit is contained in:
parent
61dccbf8b9
commit
f69f6e2711
2 changed files with 48 additions and 89 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue