#ifndef MATHS_RAYS_H_ #define MATHS_RAYS_H_ // #include "../typedefs.h" #include "aabb.h" #include "glm/glm.hpp" #include #include typedef glm::highp_dvec3 rayvec3; typedef glm::highp_dvec2 rayvec2; 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{ public: std::array, AABBFACES_COUNT> faces; // every face is min-point and opposite corner point static constexpr std::array KINDS_ORDER = { AAFaceKind::Xperp, AAFaceKind::Xperp, AAFaceKind::Yperp, AAFaceKind::Yperp, AAFaceKind::Zperp, AAFaceKind::Zperp}; AABBFaces(){}; AABBFaces(const rayvec3& parentBoxPos, const AABB& parentBox); }; template<> struct std::hash{ std::size_t operator()(const rayvec3& r) const noexcept{ return std::hash{}(r.x) ^ (std::hash{}(r.y) << 1) ^ (std::hash{}(r.z) << 2); } }; class Rays{ protected: static const bool IS_RAYS_BOX_CACHE_ON = true; static std::unordered_map raysBoxCache_; //[boxPos]: faces array public: //optimized, NOT returns intersectPoint coordinates and normal vector template static RayRelation isRayIntersectsAAFace( const rayvec3& rayOrigin, const rayvec3& rayDir, const rayvec3& faceMin, const rayvec2& faceOppositeCorner ); //returns only normal template static RayRelation rayIntersectAAFace( const rayvec3& rayOrigin, const rayvec3& rayDir, const rayvec3& faceMin, const rayvec2& faceOppositeCorner, glm::ivec3& normal_ret ); //returns normal and distance template static RayRelation rayIntersectAAFace( const rayvec3& rayOrigin, const rayvec3& rayDir, const rayvec3& faceMin, const rayvec2& faceOppositeCorner, glm::ivec3& normal_ret, scalar_t& distance_ret ); // returns normal, distance and intersection point template static RayRelation rayIntersectAAFace( const rayvec3& rayOrigin, const rayvec3& rayDir, const rayvec3& faceMin, const rayvec2& faceOppositeCorner, glm::ivec3& normal_ret, scalar_t& distance_ret, rayvec3& intersectPoint_ret ); static RayRelation rayIntersectAABB( const rayvec3& rayOrigin, const rayvec3& rayDir, const rayvec3& boxPos, const AABB& box, float maxDist, glm::ivec3& normal_ret, scalar_t& distance_ret); static RayRelation rayIntersectAABBFaces( // calculates only normal and distance const rayvec3& rayOrigin, const rayvec3& rayDir, const AABBFaces& boxFaces, float maxDist, glm::ivec3& normal_ret, scalar_t& distance_ret); }; #endif // SRC_VOXNATHS_H_