Advertisement
Guest User

Untitled

a guest
Jan 2nd, 2025
319
0
18 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 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 DoubleRes()
  37.   {
  38.     v3I residual = m_waveLengths - m_wavePhase; // Convert to residual
  39.     v3I half = residual / (m_waveLengths / 2);
  40.     residual = v3I(residual.x % (m_waveLengths.x >> 1), residual.y % (residual.y >> 1), residual.z % (m_waveLengths.z >> 1));
  41.     m_wavePhase = m_waveLengths - residual; // Convert residual back to wave length
  42.     m_pos = m_pos * 2 + half * m_sign;
  43.   }
  44.  
  45.   void Jump(i32 distance)
  46.   {
  47.     v3I64 pipDistance = v3I64(i64(m_pipsPerMeter) * distance);
  48.     v3I64 wholeSteps = pipDistance / m_waveLengths;
  49.     pipDistance -= wholeSteps * m_waveLengths;
  50.     v3I64 additionalWholeSteps = (pipDistance + m_waveLengths - m_wavePhase) / m_waveLengths;
  51.     wholeSteps += additionalWholeSteps;
  52.     v3I64 newPips = m_wavePhase - pipDistance + m_waveLengths;
  53.     for (int i = 0; i < 3; i++) m_wavePhase[i] = i32(newPips[i] % m_waveLengths[i]);
  54.     m_pos += v3I(wholeSteps * m_sign);
  55.   }
  56.  
  57. public:
  58.   clVec3I m_pos;
  59.   clVec3I m_sign;
  60.   v3I m_wavePhase;
  61.   v3I m_waveLengths;
  62.   i32 m_pipsPerMeter;
  63. };
  64.  
  65. #endif // clFreeStep_h__
  66.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement