Advertisement
Guest User

Untitled

a guest
Jul 5th, 2018
662
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.71 KB | None | 0 0
  1. if(mCulling)
  2. {
  3. if(det<LOCAL_EPSILON) return FALSE;
  4. // From here, det is > 0. So we can use integer cmp.
  5.  
  6. // Calculate distance from vert0 to ray origin
  7. Point tvec = mOrigin - vert0;
  8.  
  9. // Calculate U parameter and test bounds
  10. mStabbedFace.mU = tvec|pvec;
  11. // if(IR(u)&0x80000000 || u>det) return FALSE;
  12. // if(IS_NEGATIVE_FLOAT(mStabbedFace.mU) || IR(mStabbedFace.mU)>IR(det)) return FALSE;
  13. if(mStabbedFace.mU < 0.0f || mStabbedFace.mU > det) return FALSE;
  14.  
  15. // Prepare to test V parameter
  16. Point qvec = tvec^edge1;
  17.  
  18. // Calculate V parameter and test bounds
  19. mStabbedFace.mV = mDir|qvec;
  20. // if(IS_NEGATIVE_FLOAT(mStabbedFace.mV) || mStabbedFace.mU+mStabbedFace.mV>det) return FALSE;
  21. if(mStabbedFace.mV < 0.0f || (mStabbedFace.mU+mStabbedFace.mV) > det) return FALSE;
  22.  
  23. // Calculate t, scale parameters, ray intersects triangle
  24. mStabbedFace.mDistance = edge2|qvec;
  25. // Det > 0 so we can early exit here
  26. // Intersection point is valid if distance is positive (else it can just be a face behind the orig point)
  27. // if(IS_NEGATIVE_FLOAT(mStabbedFace.mDistance)) return FALSE;
  28. if(mStabbedFace.mDistance < 0.0f) return FALSE;
  29. // Else go on
  30. float OneOverDet = 1.0f / det;
  31. mStabbedFace.mDistance *= OneOverDet;
  32. mStabbedFace.mU *= OneOverDet;
  33. mStabbedFace.mV *= OneOverDet;
  34. }
  35. else
  36. {
  37. // the non-culling branch
  38. if(det>-LOCAL_EPSILON && det<LOCAL_EPSILON) return FALSE;
  39. float OneOverDet = 1.0f / det;
  40.  
  41. // Calculate distance from vert0 to ray origin
  42. Point tvec = mOrigin - vert0;
  43.  
  44. // Calculate U parameter and test bounds
  45. mStabbedFace.mU = (tvec|pvec) * OneOverDet;
  46. // if(IR(u)&0x80000000 || u>1.0f) return FALSE;
  47. // if(IS_NEGATIVE_FLOAT(mStabbedFace.mU) || IR(mStabbedFace.mU)>IEEE_1_0) return FALSE;
  48. if(mStabbedFace.mU < 0.0f || mStabbedFace.mU > 1.0f) return FALSE;
  49.  
  50. // prepare to test V parameter
  51. Point qvec = tvec^edge1;
  52.  
  53. // Calculate V parameter and test bounds
  54. mStabbedFace.mV = (mDir|qvec) * OneOverDet;
  55. // if(IS_NEGATIVE_FLOAT(mStabbedFace.mV) || mStabbedFace.mU+mStabbedFace.mV>1.0f) return FALSE;
  56. if(mStabbedFace.mV < 0.0f || (mStabbedFace.mU+mStabbedFace.mV) > 1.0f) return FALSE;
  57.  
  58. // Calculate t, ray intersects triangle
  59. mStabbedFace.mDistance = (edge2|qvec) * OneOverDet;
  60. // Intersection point is valid if distance is positive (else it can just be a face behind the orig point)
  61. // if(IS_NEGATIVE_FLOAT(mStabbedFace.mDistance)) return FALSE;
  62. if(mStabbedFace.mDistance < 0.0f) return FALSE;
  63. }
  64. return TRUE;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement