public GridPoint3D Translate(EDirection3D direction, int distance) { switch (direction) { case EDirection3D.Up: return(new GridPoint3D(X, Y + distance, Z)); case EDirection3D.Down: return(new GridPoint3D(X, Y - distance, Z)); case EDirection3D.Right: return(new GridPoint3D(X + distance, Y, Z)); case EDirection3D.Left: return(new GridPoint3D(X - distance, Y, Z)); case EDirection3D.Front: return(new GridPoint3D(X, Y, Z + distance)); case EDirection3D.Back: return(new GridPoint3D(X, Y, Z - distance)); default: throw new NotImplementedException(); } }
public GridPoint3D Rotate(EDirection3D direction) { switch (direction) { case EDirection3D.Up: return(new GridPoint3D(X, -Z, Y)); case EDirection3D.Down: return(new GridPoint3D(X, Z, -Y)); case EDirection3D.Front: return(new GridPoint3D(-X, Y, -Z)); case EDirection3D.Back: return(new GridPoint3D(X, Y, Z)); case EDirection3D.Left: return(new GridPoint3D(-Z, Y, X)); case EDirection3D.Right: return(new GridPoint3D(Z, Y, -X)); default: throw new NotImplementedException(); } }
public GridPoint3D(EDirection3D direction, int length = 1) { X = 0; Y = 0; Z = 0; switch (direction) { case EDirection3D.Up: Y = length; break; case EDirection3D.Down: Y = -length; break; case EDirection3D.Right: X = length; break; case EDirection3D.Left: X = -length; break; case EDirection3D.Front: Z = length; break; case EDirection3D.Back: Z = -length; break; default: throw new NotImplementedException(); } }
public static EGridAxis3D ToAxis(this EDirection3D direction) { return(m_Axes[(int)direction]); }
public static EDirection3D GetOpposite(this EDirection3D direction) { return(m_Opposite[(int)direction]); }
public GridHit3D(GridPoint3D point, EDirection3D face) { Point = point; Face = face; }
public static int Raycast(float startX, float startY, float startZ, float directionX, float directionY, float directionZ, GridHit3D[] hitBuffer) { int stepX = Math.Sign(directionX); int stepY = Math.Sign(directionY); int stepZ = Math.Sign(directionZ); if (stepX == 0 && stepY == 0 && stepZ == 0) { return(0); } int bufferSize = hitBuffer.Length; int currentX = (int)Math.Floor(startX); int currentY = (int)Math.Floor(startY); int currentZ = (int)Math.Floor(startZ); currentX = Math.Max(currentX, 0); currentY = Math.Max(currentY, 0); currentZ = Math.Max(currentZ, 0); float nextBoundX = CalculateBound(currentX, startX, stepX); float nextBoundY = CalculateBound(currentY, startY, stepY); float nextBoundZ = CalculateBound(currentZ, startZ, stepZ); float deltaX = (1f / directionX) * stepX; float deltaY = (1f / directionY) * stepY; float deltaZ = (1f / directionZ) * stepZ; float travelX = nextBoundX / directionX; float travelY = nextBoundY / directionY; float travelZ = nextBoundZ / directionZ; int iterator = 0; EDirection3D xExitFace = (stepX > 0 ? EDirection3D.Left : EDirection3D.Right); EDirection3D yExitFace = (stepY > 0 ? EDirection3D.Down : EDirection3D.Up); EDirection3D zExitFace = (stepZ > 0 ? EDirection3D.Back : EDirection3D.Front); EDirection3D selectedFace; float startDecimalX = startX - (float)Math.Truncate(startX); float startDecimalY = startY - (float)Math.Truncate(startY); float startDecimalZ = startZ - (float)Math.Truncate(startZ); if (startDecimalX < startDecimalY && startDecimalX < startDecimalZ) { selectedFace = (directionX > 0 ? EDirection3D.Left : EDirection3D.Right); } else if (startDecimalY < startDecimalX && startDecimalY < startDecimalZ) { selectedFace = (directionY > 0 ? EDirection3D.Down : EDirection3D.Up); } else { selectedFace = (directionZ > 0 ? EDirection3D.Back : EDirection3D.Front); } while (iterator < bufferSize) { GridPoint3D point = new GridPoint3D(currentX, currentY, currentZ); if (travelX < travelY) { if (travelX < travelZ) { hitBuffer[iterator++] = new GridHit3D(point, selectedFace); selectedFace = xExitFace; currentX += stepX; travelX += deltaX; } else { hitBuffer[iterator++] = new GridHit3D(point, selectedFace); selectedFace = zExitFace; currentZ += stepZ; travelZ += deltaZ; } } else { if (travelY < travelZ) { hitBuffer[iterator++] = new GridHit3D(point, selectedFace); selectedFace = yExitFace; currentY += stepY; travelY += deltaY; } else { hitBuffer[iterator++] = new GridHit3D(point, selectedFace); selectedFace = zExitFace; currentZ += stepZ; travelZ += deltaZ; } } } return(iterator); }