Advertisement
Guest User

Original Hand Written Champion

a guest
Jan 2nd, 2025
175
0
18 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1. #include "clDDA3.h"
  2. #include "clReal.h"
  3.  
  4. clDDA3::clDDA3(const clVec3& pos, const clVec3& dir)
  5.   : m_pos(pos)
  6.   , m_dir(dir)
  7. {
  8.   // Calculate inverse direction
  9.   m_invDir = clVec3::One() / dir;
  10.  
  11.   // Calculate integer direction
  12.   m_iDir = { int(dir.x >= 0), int(dir.y >= 0), int(dir.z >= 0) };
  13.  
  14.   // Calculate integer position
  15.   m_iPos = { (int)clFloor(pos.x), (int)clFloor(pos.y), (int)clFloor(pos.z) };
  16. }
  17.  
  18. clVec3I& clDDA3::Step()
  19. {
  20.   // Calculate dimension cross distance
  21.   clVec3 crossDist = (clVec3(m_iPos + m_iDir) - m_pos) * m_invDir;
  22.  
  23.   // Calculate first crossed dimension index
  24.   int firstCross = ((crossDist.x >= crossDist.y) && (crossDist.z > crossDist.y)) | (((crossDist.x >= crossDist.z) && (crossDist.y >= crossDist.z)) << 1);
  25.  
  26.   // Step across next dimension
  27.   switch (firstCross)
  28.   {
  29.   case 0:
  30.     m_iPos.x += (m_iDir.x << 1) - 1;
  31.     m_pos += m_dir * crossDist.x;
  32.     break;
  33.   case 1:
  34.     m_iPos.y += (m_iDir.y << 1) - 1;
  35.     m_pos += m_dir * crossDist.y;
  36.     break;
  37.   case 2:
  38.     m_iPos.z += (m_iDir.z << 1) - 1;
  39.     m_pos += m_dir * crossDist.z;
  40.     break;
  41.   }
  42.   return m_iPos;
  43. }
  44.  
  45. clVec3 clDDA3::Position()
  46. {
  47.   return m_pos;
  48. }
  49.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement