57 lines
1.8 KiB
GDScript
57 lines
1.8 KiB
GDScript
extends FunctionPlotter
|
|
class_name BarPlotter
|
|
|
|
|
|
signal point_entered(point, function)
|
|
signal point_exited(point, function)
|
|
|
|
var bars: PackedVector2Array
|
|
var bars_rects: Array
|
|
var focused_bar_midpoint: Point
|
|
|
|
var bar_size: float
|
|
|
|
func _init(function: Function) -> void:
|
|
super(function)
|
|
self.bar_size = function.props.get("bar_size", 5.0)
|
|
|
|
func _draw() -> void:
|
|
super._draw()
|
|
var box: Rect2 = get_box()
|
|
var x_sampled_domain: Dictionary = { lb = box.position.x, ub = box.end.x }
|
|
var y_sampled_domain: Dictionary = { lb = box.end.y, ub = box.position.y }
|
|
sample(x_sampled_domain, y_sampled_domain)
|
|
_draw_bars()
|
|
|
|
func sample(x_sampled_domain: Dictionary, y_sampled_domain: Dictionary) -> void:
|
|
bars = []
|
|
bars_rects = []
|
|
for i in function.__x.size():
|
|
var top: Vector2 = Vector2(
|
|
ECUtilities._map_domain(i, x_domain, x_sampled_domain),
|
|
ECUtilities._map_domain(function.__y[i], y_domain, y_sampled_domain)
|
|
)
|
|
var base: Vector2 = Vector2(top.x, ECUtilities._map_domain(0.0, y_domain, y_sampled_domain))
|
|
bars.push_back(top)
|
|
bars.push_back(base)
|
|
bars_rects.append(Rect2(Vector2(top.x - bar_size, top.y), Vector2(bar_size * 2, base.y - top.y)))
|
|
|
|
func _draw_bars() -> void:
|
|
for bar in bars_rects:
|
|
draw_rect(bar, function.get_color())
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event is InputEventMouse:
|
|
for i in bars_rects.size():
|
|
if bars_rects[i].grow(5).abs().has_point(get_relative_position(event.position)):
|
|
var point: Point = Point.new(bars_rects[i].get_center(), { x = function.__x[i], y = function.__y[i]})
|
|
if focused_bar_midpoint == point:
|
|
return
|
|
else:
|
|
focused_bar_midpoint = point
|
|
emit_signal("point_entered", point, function)
|
|
return
|
|
# Mouse is not in any point's box
|
|
emit_signal("point_exited", focused_bar_midpoint, function)
|
|
focused_bar_midpoint = null
|