You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-16 14:00:40 +00:00
Improve Camera2D limit editing
This commit is contained in:
@@ -134,6 +134,30 @@ bool Camera2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_event) {
|
|||||||
plugin->update_overlays();
|
plugin->update_overlays();
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case Drag::TOP_LEFT: {
|
||||||
|
selected_camera->set_limit(SIDE_LEFT, MIN(selected_camera->get_limit(SIDE_RIGHT), pos.x));
|
||||||
|
selected_camera->set_limit(SIDE_TOP, MIN(selected_camera->get_limit(SIDE_BOTTOM), pos.y));
|
||||||
|
plugin->update_overlays();
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case Drag::TOP_RIGHT: {
|
||||||
|
selected_camera->set_limit(SIDE_RIGHT, MAX(selected_camera->get_limit(SIDE_LEFT), pos.x));
|
||||||
|
selected_camera->set_limit(SIDE_TOP, MIN(selected_camera->get_limit(SIDE_BOTTOM), pos.y));
|
||||||
|
plugin->update_overlays();
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case Drag::BOTTOM_LEFT: {
|
||||||
|
selected_camera->set_limit(SIDE_LEFT, MIN(selected_camera->get_limit(SIDE_RIGHT), pos.x));
|
||||||
|
selected_camera->set_limit(SIDE_BOTTOM, MAX(selected_camera->get_limit(SIDE_TOP), pos.y));
|
||||||
|
plugin->update_overlays();
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case Drag::BOTTOM_RIGHT: {
|
||||||
|
selected_camera->set_limit(SIDE_RIGHT, MAX(selected_camera->get_limit(SIDE_LEFT), pos.x));
|
||||||
|
selected_camera->set_limit(SIDE_BOTTOM, MAX(selected_camera->get_limit(SIDE_TOP), pos.y));
|
||||||
|
plugin->update_overlays();
|
||||||
|
} break;
|
||||||
|
|
||||||
case Drag::CENTER: {
|
case Drag::CENTER: {
|
||||||
Rect2 target_rect = selected_camera->get_limit_rect();
|
Rect2 target_rect = selected_camera->get_limit_rect();
|
||||||
target_rect.position = pos - center_drag_point;
|
target_rect.position = pos - center_drag_point;
|
||||||
@@ -195,9 +219,18 @@ void Camera2DEditor::_update_hover(const Vector2 &p_mouse_pos) {
|
|||||||
|
|
||||||
const Rect2 limit_rect = CanvasItemEditor::get_singleton()->get_canvas_transform().xform(selected_camera->get_limit_rect());
|
const Rect2 limit_rect = CanvasItemEditor::get_singleton()->get_canvas_transform().xform(selected_camera->get_limit_rect());
|
||||||
const float drag_tolerance = 8.0;
|
const float drag_tolerance = 8.0;
|
||||||
|
const Vector2 tolerance_vector = Vector2(1, 1) * drag_tolerance;
|
||||||
|
|
||||||
hover_type = Drag::NONE;
|
hover_type = Drag::NONE;
|
||||||
if (p_mouse_pos.y > limit_rect.position.y && p_mouse_pos.y < limit_rect.get_end().y) {
|
if (Rect2(limit_rect.position - tolerance_vector, tolerance_vector * 2).has_point(p_mouse_pos)) {
|
||||||
|
hover_type = Drag::TOP_LEFT;
|
||||||
|
} else if (Rect2(Vector2(limit_rect.get_end().x, limit_rect.position.y) - tolerance_vector, tolerance_vector * 2).has_point(p_mouse_pos)) {
|
||||||
|
hover_type = Drag::TOP_RIGHT;
|
||||||
|
} else if (Rect2(Vector2(limit_rect.position.x, limit_rect.get_end().y) - tolerance_vector, tolerance_vector * 2).has_point(p_mouse_pos)) {
|
||||||
|
hover_type = Drag::BOTTOM_LEFT;
|
||||||
|
} else if (Rect2(limit_rect.get_end() - tolerance_vector, tolerance_vector * 2).has_point(p_mouse_pos)) {
|
||||||
|
hover_type = Drag::BOTTOM_RIGHT;
|
||||||
|
} else if (p_mouse_pos.y > limit_rect.position.y && p_mouse_pos.y < limit_rect.get_end().y) {
|
||||||
if (Math::abs(p_mouse_pos.x - limit_rect.position.x) < drag_tolerance) {
|
if (Math::abs(p_mouse_pos.x - limit_rect.position.x) < drag_tolerance) {
|
||||||
hover_type = Drag::LEFT;
|
hover_type = Drag::LEFT;
|
||||||
} else if (Math::abs(p_mouse_pos.x - limit_rect.get_end().x) < drag_tolerance) {
|
} else if (Math::abs(p_mouse_pos.x - limit_rect.get_end().x) < drag_tolerance) {
|
||||||
@@ -211,11 +244,21 @@ void Camera2DEditor::_update_hover(const Vector2 &p_mouse_pos) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Temporarily disabled, because it needs more changes.
|
|
||||||
if (hover_type == Drag::NONE && limit_rect.has_point(p_mouse_pos)) {
|
if (hover_type == Drag::NONE && limit_rect.has_point(p_mouse_pos)) {
|
||||||
hover_type = Drag::CENTER;
|
const Rect2 editor_rect = Rect2(Vector2(), CanvasItemEditor::get_singleton()->get_viewport_control()->get_size());
|
||||||
|
const Rect2 transformed_rect = selected_camera->get_viewport()->get_canvas_transform().xform_inv(limit_rect);
|
||||||
|
|
||||||
|
// Only allow center drag if any limit edge is visible on screen.
|
||||||
|
bool edge_visible = false;
|
||||||
|
edge_visible = edge_visible || (transformed_rect.get_end().y > editor_rect.position.y && transformed_rect.position.y < editor_rect.get_end().y && transformed_rect.position.x > editor_rect.position.x && transformed_rect.position.x < editor_rect.get_end().x);
|
||||||
|
edge_visible = edge_visible || (transformed_rect.get_end().y > editor_rect.position.y && transformed_rect.position.y < editor_rect.get_end().y && transformed_rect.get_end().x > editor_rect.position.x && transformed_rect.get_end().x < editor_rect.get_end().x);
|
||||||
|
edge_visible = edge_visible || (transformed_rect.get_end().x > editor_rect.position.x && transformed_rect.position.x < editor_rect.get_end().x && transformed_rect.position.y > editor_rect.position.y && transformed_rect.position.y < editor_rect.get_end().y);
|
||||||
|
edge_visible = edge_visible || (transformed_rect.get_end().x > editor_rect.position.x && transformed_rect.position.x < editor_rect.get_end().x && transformed_rect.get_end().y > editor_rect.position.y && transformed_rect.get_end().y < editor_rect.get_end().y);
|
||||||
|
|
||||||
|
if (edge_visible) {
|
||||||
|
hover_type = Drag::CENTER;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
switch (hover_type) {
|
switch (hover_type) {
|
||||||
case Drag::NONE: {
|
case Drag::NONE: {
|
||||||
@@ -229,6 +272,14 @@ void Camera2DEditor::_update_hover(const Vector2 &p_mouse_pos) {
|
|||||||
case Drag::BOTTOM: {
|
case Drag::BOTTOM: {
|
||||||
CanvasItemEditor::get_singleton()->set_cursor_shape_override(CURSOR_VSIZE);
|
CanvasItemEditor::get_singleton()->set_cursor_shape_override(CURSOR_VSIZE);
|
||||||
} break;
|
} break;
|
||||||
|
case Drag::TOP_LEFT:
|
||||||
|
case Drag::BOTTOM_RIGHT: {
|
||||||
|
CanvasItemEditor::get_singleton()->set_cursor_shape_override(CURSOR_FDIAGSIZE);
|
||||||
|
} break;
|
||||||
|
case Drag::TOP_RIGHT:
|
||||||
|
case Drag::BOTTOM_LEFT: {
|
||||||
|
CanvasItemEditor::get_singleton()->set_cursor_shape_override(CURSOR_BDIAGSIZE);
|
||||||
|
} break;
|
||||||
case Drag::CENTER: {
|
case Drag::CENTER: {
|
||||||
CanvasItemEditor::get_singleton()->set_cursor_shape_override(CURSOR_MOVE);
|
CanvasItemEditor::get_singleton()->set_cursor_shape_override(CURSOR_MOVE);
|
||||||
} break;
|
} break;
|
||||||
|
|||||||
@@ -51,6 +51,10 @@ class Camera2DEditor : public Control {
|
|||||||
TOP,
|
TOP,
|
||||||
RIGHT,
|
RIGHT,
|
||||||
BOTTOM,
|
BOTTOM,
|
||||||
|
TOP_LEFT,
|
||||||
|
TOP_RIGHT,
|
||||||
|
BOTTOM_LEFT,
|
||||||
|
BOTTOM_RIGHT,
|
||||||
CENTER,
|
CENTER,
|
||||||
};
|
};
|
||||||
Drag drag_type = Drag::NONE;
|
Drag drag_type = Drag::NONE;
|
||||||
|
|||||||
Reference in New Issue
Block a user