rays fixed

This commit is contained in:
A-lex-Ra 2023-12-10 20:06:18 +06:00
parent 5bc75c3f2d
commit 1e39b5d05d
4 changed files with 192 additions and 235 deletions

View file

@ -10,6 +10,7 @@
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
@ -37,43 +38,58 @@ public:
template<>
struct std::hash<rayvec3>{
std::size_t operator()(const rayvec3& r) const noexcept{
return std::hash<double>{}(r.x) ^ (std::hash<double>{}(r.y) << 1) ^ (std::hash<double>{}(r.z) << 2);
return std::hash<scalar_t>{}(r.x) ^ (std::hash<scalar_t>{}(r.y) << 1) ^ (std::hash<scalar_t>{}(r.z) << 2);
}
};
class Rays{
protected:
static const bool IS_RAYS_BOX_CACHE_ON = false;
static const bool IS_RAYS_BOX_CACHE_ON = true;
static std::unordered_map<rayvec3, AABBFaces> raysBoxCache_; //[boxPos]: faces array
public:
template <AAFaceKind faceKind>
static RayRelation rayIntersectAAFace(
const rayvec3& rayOrigin,
const rayvec3& rayDir,
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner,
rayvec3& intersectPoint_ret
);
static double updateNormal(
double newDistApprox,
const glm::ivec3& newNormal,
double currentDistApprox,
glm::ivec3& normal_ret
);
//optimized, not returns intersectPoint coordinates
//optimized, NOT returns intersectPoint coordinates and normal vector
template <AAFaceKind faceKind>
static RayRelation isRayIntersectsAAFace(
const rayvec3& rayOrigin,
const rayvec3& rayDir,
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner
);
//returns only normal
template <AAFaceKind faceKind>
static RayRelation rayIntersectAAFace(
const rayvec3& rayOrigin,
const rayvec3& rayDir,
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner,
glm::ivec3& normal_ret
);
//returns normal and distance
template <AAFaceKind faceKind>
static RayRelation rayIntersectAAFace(
const rayvec3& rayOrigin,
const rayvec3& rayDir,
const rayvec3& faceMin,
const rayvec2& faceOppositeCorner,
glm::ivec3& normal_ret,
double& currentDistApprox
);
scalar_t& distance_ret
);
// returns normal, distance and intersection point
template <AAFaceKind faceKind>
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,
@ -81,18 +97,16 @@ static RayRelation rayIntersectAABB(
const rayvec3& boxPos,
const AABB& box,
float maxDist,
rayvec3& pointIn_ret,
rayvec3& pointOut_ret,
glm::ivec3& normal_ret);
glm::ivec3& normal_ret,
scalar_t& distance_ret);
static RayRelation rayIntersectAABBFaces(
static RayRelation rayIntersectAABBFaces( // calculates only normal and distance
const rayvec3& rayOrigin,
const rayvec3& rayDir,
const AABBFaces& boxFaces,
float maxDist,
rayvec3& pointIn_ret,
rayvec3& pointOut_ret,
glm::ivec3& normal_ret);
glm::ivec3& normal_ret,
scalar_t& distance_ret);
};
#endif // SRC_VOXNATHS_H_