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"
std::unordered_map<rayvec3, AABBFaces> 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<AAFaceKind::Xperp>(
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<AAFaceKind::Xperp>(
return RayRelation::None;
}
template <>
RayRelation Ray::intersectAAFace<AAFaceKind::Yperp>(
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<AAFaceKind::Yperp>(
return RayRelation::None;
}
template <>
RayRelation Ray::intersectAAFace<AAFaceKind::Zperp>(
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<AAFaceKind::Zperp>(
return RayRelation::None;
}
template <>
RayRelation Ray::isIntersectsAAFace<AAFaceKind::Xperp>(
RayRelation Ray::isIntersectsYZFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner
){
@@ -141,8 +137,7 @@ RayRelation Ray::isIntersectsAAFace<AAFaceKind::Xperp>(
return RayRelation::None;
}
template <>
RayRelation Ray::isIntersectsAAFace<AAFaceKind::Yperp>(
RayRelation Ray::isIntersectsXZFace(
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner
) {
@@ -165,8 +160,7 @@ RayRelation Ray::isIntersectsAAFace<AAFaceKind::Yperp>(
return RayRelation::None;
}
template <>
RayRelation Ray::isIntersectsAAFace<AAFaceKind::Zperp>(
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<AABBFaces::KINDS_ORDER[0]>(
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<AABBFaces::KINDS_ORDER[1]>(
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<AABBFaces::KINDS_ORDER[2]>(
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<AABBFaces::KINDS_ORDER[3]>(
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<AABBFaces::KINDS_ORDER[4]>(
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<AABBFaces::KINDS_ORDER[5]>(
if (intersectXYFace(
boxFaces.faces[5].first, boxFaces.faces[5].second, bufNormal, faceDist
) > RayRelation::None && faceDist < distance_ret) {
isIntersect = true;