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
+23 -43
View File
@@ -4,8 +4,7 @@
#include "glm/glm.hpp" #include "glm/glm.hpp"
std::unordered_map<rayvec3, AABBFaces> Ray::raysBoxCache_ = {}; static const rayvec3 X_AXIS = rayvec3(1,0,0), Y_AXIS = rayvec3(0,1,0), Z_AXIS = rayvec3(0,0,1);
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) {} 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 ), rayvec2 yzMax = rayvec2(parentBoxPos.y + pbMax.y, parentBoxPos.z + pbMax.z ),
xzMax = rayvec2(parentBoxPos.x + pbMax.x, parentBoxPos.z + pbMax.z ), xzMax = rayvec2(parentBoxPos.x + pbMax.x, parentBoxPos.z + pbMax.z ),
xyMax = rayvec2(parentBoxPos.x + pbMax.x, parentBoxPos.y + pbMax.y ); 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::intersectYZFace(
RayRelation Ray::intersectAAFace<AAFaceKind::Xperp>(
const rayvec3& faceMin, const rayvec3& faceMin,
const rayvec2& faceOppositeCorner, //y and z global coords of opposite corner const rayvec2& faceOppositeCorner, //y and z global coords of opposite corner
glm::ivec3& normal_ret, glm::ivec3& normal_ret,
@@ -59,8 +58,7 @@ RayRelation Ray::intersectAAFace<AAFaceKind::Xperp>(
return RayRelation::None; return RayRelation::None;
} }
template <> RayRelation Ray::intersectXZFace(
RayRelation Ray::intersectAAFace<AAFaceKind::Yperp>(
const rayvec3& faceMin, const rayvec3& faceMin,
const rayvec2& faceOppositeCorner, //x and z global coords of opposite corner const rayvec2& faceOppositeCorner, //x and z global coords of opposite corner
glm::ivec3& normal_ret, glm::ivec3& normal_ret,
@@ -88,8 +86,7 @@ RayRelation Ray::intersectAAFace<AAFaceKind::Yperp>(
return RayRelation::None; return RayRelation::None;
} }
template <> RayRelation Ray::intersectXYFace(
RayRelation Ray::intersectAAFace<AAFaceKind::Zperp>(
const rayvec3& faceMin, const rayvec3& faceMin,
const rayvec2& faceOppositeCorner, //x and y global coords of opposite corner const rayvec2& faceOppositeCorner, //x and y global coords of opposite corner
glm::ivec3& normal_ret, glm::ivec3& normal_ret,
@@ -117,8 +114,7 @@ RayRelation Ray::intersectAAFace<AAFaceKind::Zperp>(
return RayRelation::None; return RayRelation::None;
} }
template <> RayRelation Ray::isIntersectsYZFace(
RayRelation Ray::isIntersectsAAFace<AAFaceKind::Xperp>(
const rayvec3& faceMin, const rayvec3& faceMin,
const rayvec2& faceOppositeCorner const rayvec2& faceOppositeCorner
){ ){
@@ -141,8 +137,7 @@ RayRelation Ray::isIntersectsAAFace<AAFaceKind::Xperp>(
return RayRelation::None; return RayRelation::None;
} }
template <> RayRelation Ray::isIntersectsXZFace(
RayRelation Ray::isIntersectsAAFace<AAFaceKind::Yperp>(
const rayvec3& faceMin, const rayvec3& faceMin,
const rayvec2& faceOppositeCorner const rayvec2& faceOppositeCorner
) { ) {
@@ -165,8 +160,7 @@ RayRelation Ray::isIntersectsAAFace<AAFaceKind::Yperp>(
return RayRelation::None; return RayRelation::None;
} }
template <> RayRelation Ray::isIntersectsXYFace(
RayRelation Ray::isIntersectsAAFace<AAFaceKind::Zperp>(
const rayvec3& faceMin, const rayvec3& faceMin,
const rayvec2& faceOppositeCorner const rayvec2& faceOppositeCorner
) { ) {
@@ -195,29 +189,15 @@ RayRelation Ray::intersectAABB(
float maxDist, float maxDist,
glm::ivec3& normal_ret, glm::ivec3& normal_ret,
scalar_t& distance_ret){ scalar_t& distance_ret){
if constexpr (IS_RAYS_BOX_CACHE_ON){ const AABBFaces& boxFaces = AABBFaces(boxPos, box);
return intersectAABBFaces(boxFaces, maxDist, normal_ret, distance_ret);
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);
}
} }
RayRelation Ray::intersectAABBFaces( RayRelation Ray::intersectAABBFaces(
const AABBFaces& boxFaces, const AABBFaces& boxFaces,
float maxDist, float maxDist,
glm::ivec3& normal_ret, glm::ivec3& normal_ret,
scalar_t& distance_ret){//TODO: points returning scalar_t& distance_ret){
scalar_t faceDist; scalar_t faceDist;
distance_ret = maxDist; distance_ret = maxDist;
@@ -225,7 +205,7 @@ RayRelation Ray::intersectAABBFaces(
//unsigned char intersectedCount = 0; //this code is very uncomfortable, DONT LEARN IT! //unsigned char intersectedCount = 0; //this code is very uncomfortable, DONT LEARN IT!
bool isIntersect = false; bool isIntersect = false;
if (intersectAAFace<AABBFaces::KINDS_ORDER[0]>( if (intersectYZFace(
boxFaces.faces[0].first, boxFaces.faces[0].second, bufNormal, faceDist boxFaces.faces[0].first, boxFaces.faces[0].second, bufNormal, faceDist
) > RayRelation::None && faceDist < distance_ret){ ) > RayRelation::None && faceDist < distance_ret){
isIntersect = true; isIntersect = true;
@@ -233,7 +213,7 @@ RayRelation Ray::intersectAABBFaces(
distance_ret = faceDist; distance_ret = faceDist;
} }
if (intersectAAFace<AABBFaces::KINDS_ORDER[1]>( if (intersectYZFace(
boxFaces.faces[1].first, boxFaces.faces[1].second, bufNormal, faceDist boxFaces.faces[1].first, boxFaces.faces[1].second, bufNormal, faceDist
) > RayRelation::None && faceDist < distance_ret) { ) > RayRelation::None && faceDist < distance_ret) {
isIntersect = true; isIntersect = true;
@@ -241,7 +221,7 @@ RayRelation Ray::intersectAABBFaces(
distance_ret = faceDist; distance_ret = faceDist;
} }
if (intersectAAFace<AABBFaces::KINDS_ORDER[2]>( if (intersectXZFace(
boxFaces.faces[2].first, boxFaces.faces[2].second, bufNormal, faceDist boxFaces.faces[2].first, boxFaces.faces[2].second, bufNormal, faceDist
) > RayRelation::None && faceDist < distance_ret) { ) > RayRelation::None && faceDist < distance_ret) {
isIntersect = true; isIntersect = true;
@@ -249,7 +229,7 @@ RayRelation Ray::intersectAABBFaces(
distance_ret = faceDist; distance_ret = faceDist;
} }
if (intersectAAFace<AABBFaces::KINDS_ORDER[3]>( if (intersectXZFace(
boxFaces.faces[3].first, boxFaces.faces[3].second, bufNormal, faceDist boxFaces.faces[3].first, boxFaces.faces[3].second, bufNormal, faceDist
) > RayRelation::None && faceDist < distance_ret) { ) > RayRelation::None && faceDist < distance_ret) {
isIntersect = true; isIntersect = true;
@@ -257,7 +237,7 @@ RayRelation Ray::intersectAABBFaces(
distance_ret = faceDist; distance_ret = faceDist;
} }
if (intersectAAFace<AABBFaces::KINDS_ORDER[4]>( if (intersectXYFace(
boxFaces.faces[4].first, boxFaces.faces[4].second, bufNormal, faceDist boxFaces.faces[4].first, boxFaces.faces[4].second, bufNormal, faceDist
) > RayRelation::None && faceDist < distance_ret) { ) > RayRelation::None && faceDist < distance_ret) {
isIntersect = true; isIntersect = true;
@@ -265,7 +245,7 @@ RayRelation Ray::intersectAABBFaces(
distance_ret = faceDist; distance_ret = faceDist;
} }
if (intersectAAFace<AABBFaces::KINDS_ORDER[5]>( if (intersectXYFace(
boxFaces.faces[5].first, boxFaces.faces[5].second, bufNormal, faceDist boxFaces.faces[5].first, boxFaces.faces[5].second, bufNormal, faceDist
) > RayRelation::None && faceDist < distance_ret) { ) > RayRelation::None && faceDist < distance_ret) {
isIntersect = true; isIntersect = true;
+25 -46
View File
@@ -8,7 +8,6 @@
#include "glm/gtx/hash.hpp" #include "glm/gtx/hash.hpp"
#include <array> #include <array>
#include <unordered_map>
typedef glm::highp_dvec3 rayvec3; typedef glm::highp_dvec3 rayvec3;
typedef glm::highp_dvec2 rayvec2; typedef glm::highp_dvec2 rayvec2;
@@ -17,31 +16,18 @@ typedef double scalar_t;
enum class RayRelation{ enum class RayRelation{
Embed=2, Intersect=1, Parallel=0, None=0 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{ class AABBFaces{
static const unsigned char AABBFACES_COUNT = 6;
public: public:
std::array<std::pair<rayvec3, rayvec2>, AABBFACES_COUNT> faces; // every face is min-point and opposite corner point 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(){};
AABBFaces(const rayvec3& parentBoxPos, const AABB& parentBox); AABBFaces(const rayvec3& parentBoxPos, const AABB& parentBox);
}; };
class Ray{ 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: public:
rayvec3 origin; rayvec3 origin;
rayvec3 dir; rayvec3 dir;
@@ -49,39 +35,32 @@ public:
Ray(const rayvec3& rayOrigin, Ray(const rayvec3& rayOrigin,
const rayvec3& rayDir); const rayvec3& rayDir);
//optimized, NOT returns intersectPoint coordinates and normal vector RayRelation isIntersectsYZFace(
template <AAFaceKind faceKind> const rayvec3& faceMin,
RayRelation isIntersectsAAFace( const rayvec2& faceOppositeCorner);
const rayvec3& faceMin, RayRelation isIntersectsXZFace(
const rayvec2& faceOppositeCorner const rayvec3& faceMin,
); const rayvec2& faceOppositeCorner);
RayRelation isIntersectsXYFace(
//returns only normal const rayvec3& faceMin,
template <AAFaceKind faceKind> const rayvec2& faceOppositeCorner);
RayRelation intersectAAFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner,
glm::ivec3& normal_ret
);
//returns normal and distance //returns normal and distance
template <AAFaceKind faceKind> RayRelation intersectYZFace(
RayRelation intersectAAFace( const rayvec3& faceMin,
const rayvec3& faceMin, const rayvec2& faceOppositeCorner,
const rayvec2& faceOppositeCorner, glm::ivec3& normal_ret,
glm::ivec3& normal_ret, scalar_t& distance_ret);
scalar_t& distance_ret RayRelation intersectXZFace(
); const rayvec3& faceMin,
const rayvec2& faceOppositeCorner,
// returns normal, distance and intersection point glm::ivec3& normal_ret,
template <AAFaceKind faceKind> scalar_t& distance_ret);
RayRelation intersectAAFace( RayRelation intersectXYFace(
const rayvec3& faceMin, const rayvec3& faceMin,
const rayvec2& faceOppositeCorner, const rayvec2& faceOppositeCorner,
glm::ivec3& normal_ret, glm::ivec3& normal_ret,
scalar_t& distance_ret, scalar_t& distance_ret);
rayvec3& intersectPoint_ret
);
RayRelation intersectAABB( RayRelation intersectAABB(
const rayvec3& boxPos, const rayvec3& boxPos,