Browse Source

Merge pull request #24439 from staalduinen/mouse-motion-fix

fix near infinite loop when no previous mouse position
Rémi Verschelde 6 years ago
parent
commit
a06f8ca6b9
2 changed files with 6 additions and 3 deletions
  1. 5 3
      scene/main/viewport.cpp
  2. 1 0
      scene/main/viewport.h

+ 5 - 3
scene/main/viewport.cpp

@@ -435,7 +435,7 @@ void Viewport::_notification(int p_what) {
 						}
 					}
 
-					if (!has_mouse_motion) {
+					if (!has_mouse_motion && physics_has_last_mousepos) {
 						Ref<InputEventMouseMotion> mm;
 						mm.instance();
 						mm->set_global_position(physics_last_mousepos);
@@ -465,6 +465,7 @@ void Viewport::_notification(int p_what) {
 
 						pos = mm->get_position();
 						motion_tested = true;
+						physics_has_last_mousepos = true;
 						physics_last_mousepos = pos;
 						physics_last_mouse_state.alt = mm->get_alt();
 						physics_last_mouse_state.shift = mm->get_shift();
@@ -643,7 +644,7 @@ void Viewport::_notification(int p_what) {
 					}
 				}
 
-				if (!motion_tested && camera && physics_last_mousepos != Vector2(1e20, 1e20)) {
+				if (!motion_tested && camera && physics_has_last_mousepos) {
 
 					//test anyway for mouseenter/exit because objects might move
 					Vector3 from = camera->project_ray_origin(physics_last_mousepos);
@@ -3105,7 +3106,8 @@ Viewport::Viewport() {
 	physics_object_picking = false;
 	physics_object_capture = 0;
 	physics_object_over = 0;
-	physics_last_mousepos = Vector2(1e20, 1e20);
+	physics_has_last_mousepos = false;
+	physics_last_mousepos = Vector2(Math_INF, Math_INF);
 
 	shadow_atlas_size = 0;
 	for (int i = 0; i < 4; i++) {

+ 1 - 0
scene/main/viewport.h

@@ -209,6 +209,7 @@ private:
 	Transform physics_last_object_transform;
 	Transform physics_last_camera_transform;
 	ObjectID physics_last_id;
+	bool physics_has_last_mousepos;
 	Vector2 physics_last_mousepos;
 	struct {