Files

125 lines
2.7 KiB
Go
Raw Permalink Normal View History

2026-07-09 08:33:57 +08:00
package cube
const (
// FaceDown represents the bottom face of a block.
FaceDown Face = iota
// FaceUp represents the top face of a block.
FaceUp
// FaceNorth represents the north face of a block.
FaceNorth
// FaceSouth represents the south face of a block.
FaceSouth
// FaceWest represents the west face of the block.
FaceWest
// FaceEast represents the east face of the block.
FaceEast
)
// Face represents the face of a block or entity.
type Face int
// Direction converts the Face to a Direction and returns it, assuming the Face
// is horizontal and not FaceUp or FaceDown.
func (f Face) Direction() Direction {
return Direction(f - 2)
}
// Opposite returns the opposite Face. FaceDown will return FaceUp, FaceNorth
// will return FaceSouth, FaceWest will return FaceEast, and vice versa.
func (f Face) Opposite() Face {
switch f {
default:
return FaceUp
case FaceUp:
return FaceDown
case FaceNorth:
return FaceSouth
case FaceSouth:
return FaceNorth
case FaceWest:
return FaceEast
case FaceEast:
return FaceWest
}
}
// Axis returns the Axis the face is facing. FaceEast and FaceWest correspond
// to the X Axis, FaceNorth and FaceSouth to the Z Axis and FaceUp and FaceDown
// to the Y Axis.
func (f Face) Axis() Axis {
switch f {
default:
return Y
case FaceEast, FaceWest:
return X
case FaceNorth, FaceSouth:
return Z
}
}
// RotateRight rotates the face 90 degrees to the right horizontally
// (clockwise) and returns the new Face.
func (f Face) RotateRight() Face {
switch f {
case FaceNorth:
return FaceEast
case FaceEast:
return FaceSouth
case FaceSouth:
return FaceWest
case FaceWest:
return FaceNorth
}
return f
}
// RotateLeft rotates the face 90 degrees to the left horizontally
// (counter-clockwise) and returns the new Face.
func (f Face) RotateLeft() Face {
switch f {
case FaceNorth:
return FaceWest
case FaceEast:
return FaceNorth
case FaceSouth:
return FaceEast
case FaceWest:
return FaceSouth
}
return f
}
// String returns the Face as a string.
func (f Face) String() string {
switch f {
case FaceUp:
return "up"
case FaceDown:
return "down"
case FaceNorth:
return "north"
case FaceSouth:
return "south"
case FaceWest:
return "west"
case FaceEast:
return "east"
}
panic("invalid face")
}
// Faces returns a list of all faces, starting with down, then up, then north
// to west.
func Faces() []Face {
return faces[:]
}
// HorizontalFaces returns a list of all horizontal faces, from north to west.
func HorizontalFaces() []Face {
return hFaces[:]
}
var hFaces = [...]Face{FaceNorth, FaceEast, FaceSouth, FaceWest}
var faces = [...]Face{FaceDown, FaceUp, FaceNorth, FaceEast, FaceSouth, FaceWest}