Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "clDDA3.h"
- #include "clReal.h"
- clDDA3::clDDA3(const clVec3& pos, const clVec3& dir)
- : m_pos(pos)
- , m_dir(dir)
- {
- // Calculate inverse direction
- m_invDir = clVec3::One() / dir;
- // Calculate integer direction
- m_iDir = { int(dir.x >= 0), int(dir.y >= 0), int(dir.z >= 0) };
- // Calculate integer position
- m_iPos = { (int)clFloor(pos.x), (int)clFloor(pos.y), (int)clFloor(pos.z) };
- }
- clVec3I& clDDA3::Step()
- {
- // Calculate dimension cross distance
- clVec3 crossDist = (clVec3(m_iPos + m_iDir) - m_pos) * m_invDir;
- // Calculate first crossed dimension index
- int firstCross = ((crossDist.x >= crossDist.y) && (crossDist.z > crossDist.y)) | (((crossDist.x >= crossDist.z) && (crossDist.y >= crossDist.z)) << 1);
- // Step across next dimension
- switch (firstCross)
- {
- case 0:
- m_iPos.x += (m_iDir.x << 1) - 1;
- m_pos += m_dir * crossDist.x;
- break;
- case 1:
- m_iPos.y += (m_iDir.y << 1) - 1;
- m_pos += m_dir * crossDist.y;
- break;
- case 2:
- m_iPos.z += (m_iDir.z << 1) - 1;
- m_pos += m_dir * crossDist.z;
- break;
- }
- return m_iPos;
- }
- clVec3 clDDA3::Position()
- {
- return m_pos;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement