forked from woofmeow/straywild
66 lines
1.3 KiB
GDScript
66 lines
1.3 KiB
GDScript
class_name TerrainChunkTopology
|
|
extends RefCounted
|
|
|
|
enum Edge {
|
|
NORTH,
|
|
EAST,
|
|
SOUTH,
|
|
WEST,
|
|
}
|
|
|
|
|
|
static func opposite_edge(edge: Edge) -> Edge:
|
|
return ((int(edge) + 2) % 4) as Edge
|
|
|
|
|
|
static func edge_name(edge: Edge) -> String:
|
|
match edge:
|
|
Edge.NORTH:
|
|
return "north"
|
|
Edge.EAST:
|
|
return "east"
|
|
Edge.SOUTH:
|
|
return "south"
|
|
Edge.WEST:
|
|
return "west"
|
|
return "unknown"
|
|
|
|
|
|
static func edge_normal(edge: Edge) -> Vector3:
|
|
match edge:
|
|
Edge.NORTH:
|
|
return Vector3.FORWARD
|
|
Edge.EAST:
|
|
return Vector3.RIGHT
|
|
Edge.SOUTH:
|
|
return Vector3.BACK
|
|
Edge.WEST:
|
|
return Vector3.LEFT
|
|
return Vector3.ZERO
|
|
|
|
|
|
static func grid_offset(edge: Edge) -> Vector2i:
|
|
match edge:
|
|
Edge.NORTH:
|
|
return Vector2i.UP
|
|
Edge.EAST:
|
|
return Vector2i.RIGHT
|
|
Edge.SOUTH:
|
|
return Vector2i.DOWN
|
|
Edge.WEST:
|
|
return Vector2i.LEFT
|
|
return Vector2i.ZERO
|
|
|
|
|
|
static func rotated_edge(edge: Edge, quarter_turns: int) -> Edge:
|
|
var angle := float(posmod(quarter_turns, 4)) * PI * 0.5
|
|
var normal := edge_normal(edge).rotated(Vector3.UP, angle)
|
|
var best_edge := Edge.NORTH
|
|
var best_dot := -INF
|
|
for candidate_value: int in Edge.values():
|
|
var candidate := candidate_value as Edge
|
|
var alignment := normal.dot(edge_normal(candidate))
|
|
if alignment > best_dot:
|
|
best_dot = alignment
|
|
best_edge = candidate
|
|
return best_edge
|