2020-07-06 12:38:05 +00:00
|
|
|
extends Node2D
|
|
|
|
|
|
|
|
class_name Occluder
|
|
|
|
|
|
|
|
const MAX_LENGTH = 200
|
|
|
|
const EPSILON = 0.1
|
2020-07-06 19:58:42 +00:00
|
|
|
const DEBUG = false
|
2020-07-06 12:38:05 +00:00
|
|
|
|
|
|
|
var ignore_sides = [false, false, false, false]
|
|
|
|
var size = Vector2(32, 32)
|
|
|
|
var origin = null
|
|
|
|
var polygon: PoolVector2Array = [Vector2.ZERO, Vector2(size.x, 0), Vector2(size.x, size.y), Vector2(0, size.y)]
|
|
|
|
|
|
|
|
func _draw():
|
|
|
|
if polygon == null:
|
|
|
|
return
|
|
|
|
|
|
|
|
if origin == null:
|
|
|
|
return
|
|
|
|
|
|
|
|
var player_position = origin.global_position - global_position
|
|
|
|
|
|
|
|
# Find what edges is the players looking at
|
|
|
|
var edges = [
|
|
|
|
player_position.y < 0, # TOP
|
|
|
|
player_position.x > size.x*2, # RIGHT
|
|
|
|
player_position.y > size.y*2, # BOTTOM
|
|
|
|
player_position.x < 0 # LEFT
|
|
|
|
]
|
|
|
|
|
|
|
|
for current in range(0, polygon.size()):
|
|
|
|
var next = (current + 1) % polygon.size()
|
|
|
|
var previous = (current - 1) % polygon.size()
|
|
|
|
|
|
|
|
if not ignore_sides[current] and not edges[current]:
|
2020-07-06 19:58:42 +00:00
|
|
|
var points = [
|
2020-07-06 12:38:05 +00:00
|
|
|
(polygon[current] * 2.1 - origin.global_position + global_position) * MAX_LENGTH,
|
|
|
|
polygon[current], polygon[next],
|
|
|
|
(polygon[next] * 2.1 - origin.global_position + global_position) * MAX_LENGTH
|
2020-07-06 19:58:42 +00:00
|
|
|
]
|
|
|
|
draw_polygon(points, [Color.black])
|
|
|
|
if DEBUG:
|
|
|
|
draw_polyline(points, Color.rebeccapurple)
|
|
|
|
else:
|
|
|
|
if DEBUG:
|
|
|
|
if ignore_sides[current]:
|
|
|
|
draw_line(polygon[current], polygon[next], Color.red, 1)
|
|
|
|
else:
|
|
|
|
draw_line(polygon[current], polygon[next], Color.yellow, 2)
|
2020-07-06 12:38:05 +00:00
|
|
|
|
|
|
|
func _process(_delta):
|
|
|
|
update()
|
|
|
|
z_index = 999
|