diff --git a/src/maths/rays.cpp b/src/maths/rays.cpp index 2e358bcf..d898ac4b 100644 --- a/src/maths/rays.cpp +++ b/src/maths/rays.cpp @@ -4,8 +4,7 @@ #include "glm/glm.hpp" -std::unordered_map Ray::raysBoxCache_ = {}; -const rayvec3 X_AXIS = rayvec3(1,0,0), Y_AXIS = rayvec3(0,1,0), Z_AXIS = rayvec3(0,0,1); +static const rayvec3 X_AXIS = rayvec3(1,0,0), Y_AXIS = rayvec3(0,1,0), Z_AXIS = rayvec3(0,0,1); Ray::Ray(const rayvec3& origin, const rayvec3& dir) : origin(origin), dir(dir) {} @@ -17,21 +16,21 @@ AABBFaces::AABBFaces(const rayvec3& parentBoxPos, const AABB& parentBox){ rayvec2 yzMax = rayvec2(parentBoxPos.y + pbMax.y, parentBoxPos.z + pbMax.z ), xzMax = rayvec2(parentBoxPos.x + pbMax.x, parentBoxPos.z + pbMax.z ), xyMax = rayvec2(parentBoxPos.x + pbMax.x, parentBoxPos.y + pbMax.y ); - faces[0] = {pbRealPos, yzMax}; //in order of AABBFaces::KINDS_ORDER! + faces[0] = { parentBoxPos + rayvec3(pbMax.x, pbMin.y, pbMin.z), yzMax }; - faces[1] = {parentBoxPos + rayvec3(pbMax.x, pbMin.y, pbMin.z), yzMax}; + faces[1] = {pbRealPos, yzMax}; - faces[2] = {pbRealPos, xzMax}; + faces[2] = { parentBoxPos + rayvec3(pbMin.x, pbMax.y, pbMin.z), xzMax }; - faces[3] = {parentBoxPos + rayvec3(pbMin.x, pbMax.y, pbMin.z), xzMax}; + faces[3] = {pbRealPos, xzMax}; - faces[4] = {pbRealPos, xyMax}; + faces[4] = { parentBoxPos + rayvec3(pbMin.x, pbMin.y, pbMax.z), xyMax }; + + faces[5] = {pbRealPos, xyMax}; - faces[5] = {parentBoxPos + rayvec3(pbMin.x, pbMin.y, pbMax.z), xyMax}; } -template <> -RayRelation Ray::intersectAAFace( +RayRelation Ray::intersectYZFace( const rayvec3& faceMin, const rayvec2& faceOppositeCorner, //y and z global coords of opposite corner glm::ivec3& normal_ret, @@ -59,8 +58,7 @@ RayRelation Ray::intersectAAFace( return RayRelation::None; } -template <> -RayRelation Ray::intersectAAFace( +RayRelation Ray::intersectXZFace( const rayvec3& faceMin, const rayvec2& faceOppositeCorner, //x and z global coords of opposite corner glm::ivec3& normal_ret, @@ -88,8 +86,7 @@ RayRelation Ray::intersectAAFace( return RayRelation::None; } -template <> -RayRelation Ray::intersectAAFace( +RayRelation Ray::intersectXYFace( const rayvec3& faceMin, const rayvec2& faceOppositeCorner, //x and y global coords of opposite corner glm::ivec3& normal_ret, @@ -117,8 +114,7 @@ RayRelation Ray::intersectAAFace( return RayRelation::None; } -template <> -RayRelation Ray::isIntersectsAAFace( +RayRelation Ray::isIntersectsYZFace( const rayvec3& faceMin, const rayvec2& faceOppositeCorner ){ @@ -141,8 +137,7 @@ RayRelation Ray::isIntersectsAAFace( return RayRelation::None; } -template <> -RayRelation Ray::isIntersectsAAFace( +RayRelation Ray::isIntersectsXZFace( const rayvec3& faceMin, const rayvec2& faceOppositeCorner ) { @@ -165,8 +160,7 @@ RayRelation Ray::isIntersectsAAFace( return RayRelation::None; } -template <> -RayRelation Ray::isIntersectsAAFace( +RayRelation Ray::isIntersectsXYFace( const rayvec3& faceMin, const rayvec2& faceOppositeCorner ) { @@ -195,29 +189,15 @@ RayRelation Ray::intersectAABB( float maxDist, glm::ivec3& normal_ret, scalar_t& distance_ret){ - if constexpr (IS_RAYS_BOX_CACHE_ON){ - - if (raysBoxCache_.find(boxPos) != raysBoxCache_.end()){ - const AABBFaces& boxFaces = raysBoxCache_[boxPos]; - return intersectAABBFaces(boxFaces, maxDist, normal_ret, distance_ret); - } else { - const AABBFaces& boxFaces = AABBFaces(boxPos, box); - raysBoxCache_[boxPos] = boxFaces; - return intersectAABBFaces(boxFaces, maxDist, normal_ret, distance_ret); - } - - } else { - const AABBFaces& boxFaces = AABBFaces(boxPos, box); - return intersectAABBFaces(boxFaces, maxDist, normal_ret, distance_ret); - } - + const AABBFaces& boxFaces = AABBFaces(boxPos, box); + return intersectAABBFaces(boxFaces, maxDist, normal_ret, distance_ret); } RayRelation Ray::intersectAABBFaces( const AABBFaces& boxFaces, float maxDist, glm::ivec3& normal_ret, - scalar_t& distance_ret){//TODO: points returning + scalar_t& distance_ret){ scalar_t faceDist; distance_ret = maxDist; @@ -225,7 +205,7 @@ RayRelation Ray::intersectAABBFaces( //unsigned char intersectedCount = 0; //this code is very uncomfortable, DONT LEARN IT! bool isIntersect = false; - if (intersectAAFace( + if (intersectYZFace( boxFaces.faces[0].first, boxFaces.faces[0].second, bufNormal, faceDist ) > RayRelation::None && faceDist < distance_ret){ isIntersect = true; @@ -233,7 +213,7 @@ RayRelation Ray::intersectAABBFaces( distance_ret = faceDist; } - if (intersectAAFace( + if (intersectYZFace( boxFaces.faces[1].first, boxFaces.faces[1].second, bufNormal, faceDist ) > RayRelation::None && faceDist < distance_ret) { isIntersect = true; @@ -241,7 +221,7 @@ RayRelation Ray::intersectAABBFaces( distance_ret = faceDist; } - if (intersectAAFace( + if (intersectXZFace( boxFaces.faces[2].first, boxFaces.faces[2].second, bufNormal, faceDist ) > RayRelation::None && faceDist < distance_ret) { isIntersect = true; @@ -249,7 +229,7 @@ RayRelation Ray::intersectAABBFaces( distance_ret = faceDist; } - if (intersectAAFace( + if (intersectXZFace( boxFaces.faces[3].first, boxFaces.faces[3].second, bufNormal, faceDist ) > RayRelation::None && faceDist < distance_ret) { isIntersect = true; @@ -257,7 +237,7 @@ RayRelation Ray::intersectAABBFaces( distance_ret = faceDist; } - if (intersectAAFace( + if (intersectXYFace( boxFaces.faces[4].first, boxFaces.faces[4].second, bufNormal, faceDist ) > RayRelation::None && faceDist < distance_ret) { isIntersect = true; @@ -265,7 +245,7 @@ RayRelation Ray::intersectAABBFaces( distance_ret = faceDist; } - if (intersectAAFace( + if (intersectXYFace( boxFaces.faces[5].first, boxFaces.faces[5].second, bufNormal, faceDist ) > RayRelation::None && faceDist < distance_ret) { isIntersect = true; diff --git a/src/maths/rays.h b/src/maths/rays.h index 47e8d5d7..1ee94e8b 100644 --- a/src/maths/rays.h +++ b/src/maths/rays.h @@ -8,7 +8,6 @@ #include "glm/gtx/hash.hpp" #include -#include 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, 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); }; class Ray{ -protected: - static const bool IS_RAYS_BOX_CACHE_ON = false; // Now not working properly because not observe updates - static std::unordered_map 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 - RayRelation isIntersectsAAFace( - const rayvec3& faceMin, - const rayvec2& faceOppositeCorner - ); - -//returns only normal - template - 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 - RayRelation intersectAAFace( - const rayvec3& faceMin, - const rayvec2& faceOppositeCorner, - glm::ivec3& normal_ret, - scalar_t& distance_ret - ); - -// returns normal, distance and intersection point - template - 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,