1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Add vararg call() method to C++ Callable

This commit is contained in:
kobewi
2023-07-11 16:18:10 +02:00
parent c7ed5d795e
commit 09b30be86d
27 changed files with 96 additions and 332 deletions

View File

@@ -47,7 +47,7 @@ bool ViewPanner::gui_input(const Ref<InputEvent> &p_event, Rect2 p_canvas_rect)
float zoom_factor = mb->get_factor() <= 0 ? 1.0 : mb->get_factor();
zoom_factor = ((scroll_zoom_factor - 1.0) * zoom_factor) + 1.0;
float zoom = (scroll_vec.x + scroll_vec.y) > 0 ? 1.0 / scroll_zoom_factor : scroll_zoom_factor;
callback_helper(zoom_callback, varray(zoom, mb->get_position(), p_event));
zoom_callback.call(zoom, mb->get_position(), p_event);
return true;
} else {
Vector2 panning = scroll_vec * mb->get_factor();
@@ -58,7 +58,7 @@ bool ViewPanner::gui_input(const Ref<InputEvent> &p_event, Rect2 p_canvas_rect)
} else if (mb->is_shift_pressed()) {
panning = Vector2(panning.y, panning.x);
}
callback_helper(pan_callback, varray(-panning * scroll_speed, p_event));
pan_callback.call(-panning * scroll_speed, p_event);
return true;
}
} else {
@@ -71,14 +71,14 @@ bool ViewPanner::gui_input(const Ref<InputEvent> &p_event, Rect2 p_canvas_rect)
} else if (mb->is_shift_pressed()) {
panning = Vector2(panning.y, panning.x);
}
callback_helper(pan_callback, varray(-panning * scroll_speed, p_event));
pan_callback.call(-panning * scroll_speed, p_event);
return true;
} else if (!mb->is_shift_pressed()) {
// Compute the zoom factor.
float zoom_factor = mb->get_factor() <= 0 ? 1.0 : mb->get_factor();
zoom_factor = ((scroll_zoom_factor - 1.0) * zoom_factor) + 1.0;
float zoom = (scroll_vec.x + scroll_vec.y) > 0 ? 1.0 / scroll_zoom_factor : scroll_zoom_factor;
callback_helper(zoom_callback, varray(zoom, mb->get_position(), p_event));
zoom_callback.call(zoom, mb->get_position(), p_event);
return true;
}
}
@@ -108,9 +108,9 @@ bool ViewPanner::gui_input(const Ref<InputEvent> &p_event, Rect2 p_canvas_rect)
if (mm.is_valid()) {
if (is_dragging) {
if (p_canvas_rect != Rect2()) {
callback_helper(pan_callback, varray(Input::get_singleton()->warp_mouse_motion(mm, p_canvas_rect), p_event));
pan_callback.call(Input::get_singleton()->warp_mouse_motion(mm, p_canvas_rect), p_event);
} else {
callback_helper(pan_callback, varray(mm->get_relative(), p_event));
pan_callback.call(mm->get_relative(), p_event);
}
return true;
}
@@ -119,13 +119,13 @@ bool ViewPanner::gui_input(const Ref<InputEvent> &p_event, Rect2 p_canvas_rect)
Ref<InputEventMagnifyGesture> magnify_gesture = p_event;
if (magnify_gesture.is_valid()) {
// Zoom gesture
callback_helper(zoom_callback, varray(magnify_gesture->get_factor(), magnify_gesture->get_position(), p_event));
zoom_callback.call(magnify_gesture->get_factor(), magnify_gesture->get_position(), p_event);
return true;
}
Ref<InputEventPanGesture> pan_gesture = p_event;
if (pan_gesture.is_valid()) {
callback_helper(pan_callback, varray(-pan_gesture->get_delta() * scroll_speed, p_event));
pan_callback.call(-pan_gesture->get_delta() * scroll_speed, p_event);
}
Ref<InputEventScreenDrag> screen_drag = p_event;
@@ -134,7 +134,7 @@ bool ViewPanner::gui_input(const Ref<InputEvent> &p_event, Rect2 p_canvas_rect)
// This set of events also generates/is generated by
// InputEventMouseButton/InputEventMouseMotion events which will be processed instead.
} else {
callback_helper(pan_callback, varray(screen_drag->get_relative(), p_event));
pan_callback.call(screen_drag->get_relative(), p_event);
}
}
@@ -157,17 +157,6 @@ void ViewPanner::release_pan_key() {
is_dragging = false;
}
void ViewPanner::callback_helper(Callable p_callback, Vector<Variant> p_args) {
const Variant **argptr = (const Variant **)alloca(sizeof(Variant *) * p_args.size());
for (int i = 0; i < p_args.size(); i++) {
argptr[i] = &p_args[i];
}
Variant result;
Callable::CallError ce;
p_callback.callp(argptr, p_args.size(), result, ce);
}
void ViewPanner::set_callbacks(Callable p_pan_callback, Callable p_zoom_callback) {
pan_callback = p_pan_callback;
zoom_callback = p_zoom_callback;