diff options
author | Aki <please@ignore.pl> | 2022-02-09 22:23:03 +0100 |
---|---|---|
committer | Aki <please@ignore.pl> | 2022-02-09 22:53:55 +0100 |
commit | 373dc625f82b47096893add42c4472e4a57ab7eb (patch) | |
tree | 640228d02476d379de13071b13d1b1fa322b767f /Opcode/OPC_RayTriOverlap.h | |
parent | 2d7dd844219965b81e81848e60d7f7bf23035ee4 (diff) | |
download | starshatter-373dc625f82b47096893add42c4472e4a57ab7eb.zip starshatter-373dc625f82b47096893add42c4472e4a57ab7eb.tar.gz starshatter-373dc625f82b47096893add42c4472e4a57ab7eb.tar.bz2 |
Moved third-party libraries to a separate subdirectory
Diffstat (limited to 'Opcode/OPC_RayTriOverlap.h')
-rw-r--r-- | Opcode/OPC_RayTriOverlap.h | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/Opcode/OPC_RayTriOverlap.h b/Opcode/OPC_RayTriOverlap.h deleted file mode 100644 index 405c7e1..0000000 --- a/Opcode/OPC_RayTriOverlap.h +++ /dev/null @@ -1,89 +0,0 @@ -#define LOCAL_EPSILON 0.000001f - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a ray-triangle intersection test. - * Original code from Tomas Möller's "Fast Minimum Storage Ray-Triangle Intersection". - * It's been optimized a bit with integer code, and modified to return a non-intersection if distance from - * ray origin to triangle is negative. - * - * \param vert0 [in] triangle vertex - * \param vert1 [in] triangle vertex - * \param vert2 [in] triangle vertex - * \return true on overlap. mStabbedFace is filled with relevant info. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL RayCollider::RayTriOverlap(const IcePoint& vert0, const IcePoint& vert1, const IcePoint& vert2) -{ - // Stats - mNbRayPrimTests++; - - // Find vectors for two edges sharing vert0 - IcePoint edge1 = vert1 - vert0; - IcePoint edge2 = vert2 - vert0; - - // Begin calculating determinant - also used to calculate U parameter - IcePoint pvec = mDir^edge2; - - // If determinant is near zero, ray lies in plane of triangle - float det = edge1|pvec; - - if(mCulling) - { - if(det<LOCAL_EPSILON) return FALSE; - // From here, det is > 0. So we can use integer cmp. - - // Calculate distance from vert0 to ray origin - IcePoint tvec = mOrigin - vert0; - - // Calculate U parameter and test bounds - mStabbedFace.mU = tvec|pvec; -// if(IR(u)&0x80000000 || u>det) return FALSE; - if(IS_NEGATIVE_FLOAT(mStabbedFace.mU) || IR(mStabbedFace.mU)>IR(det)) return FALSE; - - // Prepare to test V parameter - IcePoint qvec = tvec^edge1; - - // Calculate V parameter and test bounds - mStabbedFace.mV = mDir|qvec; - if(IS_NEGATIVE_FLOAT(mStabbedFace.mV) || mStabbedFace.mU+mStabbedFace.mV>det) return FALSE; - - // Calculate t, scale parameters, ray intersects triangle - mStabbedFace.mDistance = edge2|qvec; - // Det > 0 so we can early exit here - // Intersection IcePoint is valid if distance is positive (else it can just be a face behind the orig IcePoint) - if(IS_NEGATIVE_FLOAT(mStabbedFace.mDistance)) return FALSE; - // Else go on - float OneOverDet = 1.0f / det; - mStabbedFace.mDistance *= OneOverDet; - mStabbedFace.mU *= OneOverDet; - mStabbedFace.mV *= OneOverDet; - } - else - { - // the non-culling branch - if(det>-LOCAL_EPSILON && det<LOCAL_EPSILON) return FALSE; - float OneOverDet = 1.0f / det; - - // Calculate distance from vert0 to ray origin - IcePoint tvec = mOrigin - vert0; - - // Calculate U parameter and test bounds - mStabbedFace.mU = (tvec|pvec) * OneOverDet; -// if(IR(u)&0x80000000 || u>1.0f) return FALSE; - if(IS_NEGATIVE_FLOAT(mStabbedFace.mU) || IR(mStabbedFace.mU)>IEEE_1_0) return FALSE; - - // prepare to test V parameter - IcePoint qvec = tvec^edge1; - - // Calculate V parameter and test bounds - mStabbedFace.mV = (mDir|qvec) * OneOverDet; - if(IS_NEGATIVE_FLOAT(mStabbedFace.mV) || mStabbedFace.mU+mStabbedFace.mV>1.0f) return FALSE; - - // Calculate t, ray intersects triangle - mStabbedFace.mDistance = (edge2|qvec) * OneOverDet; - // Intersection IcePoint is valid if distance is positive (else it can just be a face behind the orig IcePoint) - if(IS_NEGATIVE_FLOAT(mStabbedFace.mDistance)) return FALSE; - } - return TRUE; -} |