Advertisement
Guest User

glorious DDA

a guest
Aug 24th, 2024
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. #ifndef clFreeStep_h__
  2. #define clFreeStep_h__
  3.  
  4. #include "clVector3.h"
  5.  
  6. class clFreeStep3
  7. {
  8. public:
  9.   clFreeStep3(const clVec3 &pos, const clVec3 &dir)
  10.   {
  11.     m_pos = v3I(clFloor(pos));
  12.     v3 invDir = v3(1.0) / clAbs(dir);
  13.     const i32 quality = 32;
  14.     invDir = clMin(invDir, v3(f32(clMaxValue<i32>() / quality)));
  15.     invDir *= (clMaxValue<i32>() / quality) / clMaxComponent(invDir);
  16.     v3 invDirSqrRounded = v3(clRound(invDir));
  17.     m_waveLengths = v3I(invDirSqrRounded);
  18.     clVec3I m_iSign = v3I(dir.x >= 0, dir.y >= 0, dir.z >= 0);
  19.     m_sign = m_iSign * 2 - 1;
  20.     v3 crossDist = (v3(m_pos + m_iSign) - pos);
  21.     m_wavePhase = v3I(clAbs(crossDist) * m_waveLengths);
  22.     auto d((v3(1.0) / m_waveLengths).Normalized()[0] * m_waveLengths[0]);
  23.     m_pipsPerMeter = i32(d);
  24.   }
  25.  
  26.   clVec3I Step()
  27.   {
  28.     ui8 minIndex = clMinComponentIndex(m_wavePhase);
  29.     i32 sub = m_wavePhase[minIndex];
  30.     m_wavePhase -= sub;
  31.     m_wavePhase[minIndex] = m_waveLengths[minIndex];
  32.     m_pos[minIndex] += m_sign[minIndex];
  33.     return m_pos;
  34.   }
  35.  
  36.   void Jump(i32 distance)
  37.   {
  38.     v3I64 pipDistance = v3I64(i64(m_pipsPerMeter) * distance);
  39.     v3I64 wholeSteps = pipDistance / m_waveLengths;
  40.     pipDistance -= wholeSteps * m_waveLengths;
  41.     v3I64 additionalWholeSteps = (pipDistance + m_waveLengths - m_wavePhase) / m_waveLengths;
  42.     wholeSteps += additionalWholeSteps;
  43.     v3I64 newPips = m_wavePhase - pipDistance + m_waveLengths;
  44.     for (int i = 0; i < 3; i++) m_wavePhase[i] = i32(newPips[i] % m_waveLengths[i]);
  45.     m_pos += v3I(wholeSteps * m_sign);
  46.   }
  47.  
  48. public:
  49.   clVec3I m_pos;
  50.   clVec3I m_sign;
  51.   v3I m_wavePhase;
  52.   v3I m_waveLengths;
  53.   i32 m_pipsPerMeter;
  54. };
  55.  
  56. #endif // clFreeStep_h__
  57.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement