Rollercoaster-Derivatives/addons/easy_charts/control_charts/plotters/bar_plotter.gd

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