From 0360b454a432dc851cc1c5b0c365049ebafcec46 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Fri, 18 Apr 2014 11:43:54 -0300 Subject: -Fixed viewport stretch bugs -Fixed input in viewport stretch bugs -Fixed tilemap pixel overlap (really?) --- scene/2d/tile_map.cpp | 4 ++-- scene/gui/control.cpp | 22 ++++------------------ scene/gui/control.h | 1 - scene/main/scene_main_loop.cpp | 1 - scene/main/viewport.cpp | 29 +++++++++++++++++++++++------ scene/main/viewport.h | 1 + 6 files changed, 30 insertions(+), 28 deletions(-) (limited to 'scene') diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index b9e44d5053..57424d6654 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -585,8 +585,8 @@ TileMap::TileMap() { center_x=false; center_y=false; - fp_adjust=0.4; - fp_adjust=0.4; + fp_adjust=0.01; + fp_adjust=0.01; } TileMap::~TileMap() { diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index e0604b7cb8..4b4b4b3c73 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -645,19 +645,6 @@ void Control::_notification(int p_notification) { } -Size2 Control::_window_get_pos() const { - - if (data.viewport) { - - Rect2 r = data.viewport->get_visible_rect(); - return r.pos; - } else - return Point2(); - - //return get_global_transform().get_origin(); -} - - bool Control::clips_input() const { return false; @@ -956,12 +943,11 @@ void Control::_window_input_event(InputEvent p_event) { window->key_event_accepted=false; Point2 mpos =(get_canvas_transform()).affine_inverse().xform(Point2(p_event.mouse_button.x,p_event.mouse_button.y)); - if (p_event.mouse_button.pressed) { - Size2 pos = mpos - _window_get_pos(); + Size2 pos = mpos; if (window->mouse_focus && p_event.mouse_button.button_index!=window->mouse_focus_button) { //do not steal mouse focus and stuff @@ -1062,7 +1048,7 @@ void Control::_window_input_event(InputEvent p_event) { if (window->mouse_over && window->drag_data.get_type()!=Variant::NIL && p_event.mouse_button.button_index==BUTTON_LEFT) { - Size2 pos = mpos - _window_get_pos(); + Size2 pos = mpos; pos = window->focus_inv_xform.xform(pos); window->mouse_over->drop_data(pos,window->drag_data); window->drag_data=Variant(); @@ -1072,7 +1058,7 @@ void Control::_window_input_event(InputEvent p_event) { break; } - Size2 pos = mpos - _window_get_pos(); + Size2 pos = mpos; p_event.mouse_button.global_x = pos.x; p_event.mouse_button.global_y = pos.y; pos = window->focus_inv_xform.xform(pos); @@ -1103,7 +1089,7 @@ void Control::_window_input_event(InputEvent p_event) { window->key_event_accepted=false; Matrix32 localizer = (get_canvas_transform()).affine_inverse(); - Size2 pos = localizer.xform(Size2(p_event.mouse_motion.x,p_event.mouse_motion.y)) - _window_get_pos(); + Size2 pos = localizer.xform(Size2(p_event.mouse_motion.x,p_event.mouse_motion.y)); Vector2 speed = localizer.basis_xform(Point2(p_event.mouse_motion.speed_x,p_event.mouse_motion.speed_y)); Vector2 rel = localizer.basis_xform(Point2(p_event.mouse_motion.relative_x,p_event.mouse_motion.relative_y)); diff --git a/scene/gui/control.h b/scene/gui/control.h index dd8854f80e..f9225a1c2b 100644 --- a/scene/gui/control.h +++ b/scene/gui/control.h @@ -193,7 +193,6 @@ private: float _get_parent_range(int p_idx) const; float _get_range(int p_idx) const; - Point2 _window_get_pos() const; float _s2a(float p_val, AnchorType p_anchor,float p_range) const; float _a2s(float p_val, AnchorType p_anchor,float p_range) const; void _modal_stack_remove(); diff --git a/scene/main/scene_main_loop.cpp b/scene/main/scene_main_loop.cpp index 5ec416fb47..492c7633c1 100644 --- a/scene/main/scene_main_loop.cpp +++ b/scene/main/scene_main_loop.cpp @@ -940,7 +940,6 @@ void SceneMainLoop::_update_root_rect() { } break; case STRETCH_MODE_VIEWPORT: { - print_line("VP SIZE: "+viewport_size); root->set_rect(Rect2(Point2(),viewport_size)); root->set_size_override_stretch(false); root->set_size_override(false,Size2()); diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 0e32fd006d..c13b4eb060 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -764,13 +764,30 @@ bool Viewport::get_render_target_vflip() const{ } +Matrix32 Viewport::_get_input_pre_xform() const { + + Matrix32 pre_xf; + if (render_target) { + + ERR_FAIL_COND_V(to_screen_rect.size.x==0,pre_xf); + ERR_FAIL_COND_V(to_screen_rect.size.y==0,pre_xf); + pre_xf.scale(rect.size/to_screen_rect.size); + pre_xf.elements[2]=-to_screen_rect.pos; + } else { + + pre_xf.elements[2]=-rect.pos; + } + + return pre_xf; +} + void Viewport::_make_input_local(InputEvent& ev) { switch(ev.type) { case InputEvent::MOUSE_BUTTON: { - Matrix32 ai = get_final_transform().affine_inverse(); + Matrix32 ai = get_final_transform().affine_inverse() * _get_input_pre_xform(); Vector2 g = ai.xform(Vector2(ev.mouse_button.global_x,ev.mouse_button.global_y)); Vector2 l = ai.xform(Vector2(ev.mouse_button.x,ev.mouse_button.y)); ev.mouse_button.x=l.x; @@ -781,7 +798,7 @@ void Viewport::_make_input_local(InputEvent& ev) { } break; case InputEvent::MOUSE_MOTION: { - Matrix32 ai = get_final_transform().affine_inverse(); + Matrix32 ai = get_final_transform().affine_inverse() * _get_input_pre_xform(); Vector2 g = ai.xform(Vector2(ev.mouse_motion.global_x,ev.mouse_motion.global_y)); Vector2 l = ai.xform(Vector2(ev.mouse_motion.x,ev.mouse_motion.y)); Vector2 r = ai.xform(Vector2(ev.mouse_motion.relative_x,ev.mouse_motion.relative_y)); @@ -795,7 +812,7 @@ void Viewport::_make_input_local(InputEvent& ev) { } break; case InputEvent::SCREEN_TOUCH: { - Matrix32 ai = get_final_transform().affine_inverse(); + Matrix32 ai = get_final_transform().affine_inverse() * _get_input_pre_xform(); Vector2 t = ai.xform(Vector2(ev.screen_touch.x,ev.screen_touch.y)); ev.screen_touch.x=t.x; ev.screen_touch.y=t.y; @@ -803,7 +820,7 @@ void Viewport::_make_input_local(InputEvent& ev) { } break; case InputEvent::SCREEN_DRAG: { - Matrix32 ai = get_final_transform().affine_inverse(); + Matrix32 ai = get_final_transform().affine_inverse() * _get_input_pre_xform(); Vector2 t = ai.xform(Vector2(ev.screen_drag.x,ev.screen_drag.y)); Vector2 r = ai.xform(Vector2(ev.screen_drag.relative_x,ev.screen_drag.relative_y)); Vector2 s = ai.xform(Vector2(ev.screen_drag.speed_x,ev.screen_drag.speed_y)); @@ -821,13 +838,13 @@ void Viewport::_make_input_local(InputEvent& ev) { void Viewport::_vp_input(const InputEvent& p_ev) { - if (render_target) + if (render_target && to_screen_rect==Rect2()) return; //if render target, can't get input events //this one handles system input, p_ev are in system coordinates //they are converted to viewport coordinates - InputEvent ev = p_ev; + InputEvent ev = p_ev; _make_input_local(ev); input(ev); diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 33e1f27b93..178a7517f0 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -146,6 +146,7 @@ friend class RenderTargetTexture; void update_worlds(); + _FORCE_INLINE_ Matrix32 _get_input_pre_xform() const; void _vp_enter_scene(); void _vp_exit_scene(); -- cgit v1.2.3