diff --git a/PickingVisitor.cpp b/PickingVisitor.cpp index 36dfed5..1673d18 100644 --- a/PickingVisitor.cpp +++ b/PickingVisitor.cpp @@ -126,6 +126,13 @@ void PickingVisitor::visit(Handles &n) glm::vec4 S = glm::inverse(modelview_) * glm::vec4( 0.05f, 0.05f, 0.f, 0.f ); float scale = glm::length( glm::vec2(S) ); + // extract rotation from modelview + glm::mat4 ctm; + glm::vec3 rot(0.f); + glm::vec4 vec = modelview_ * glm::vec4(1.f, 0.f, 0.f, 0.f); + rot.z = glm::orientedAngle( glm::vec3(1.f, 0.f, 0.f), glm::normalize(glm::vec3(vec)), glm::vec3(0.f, 0.f, 1.f) ); + ctm = glm::rotate(glm::identity(), -rot.z, glm::vec3(0.f, 0.f, 1.f)) * modelview_ ; + bool picked = false; if ( n.type() == Handles::RESIZE ) { // 4 corners @@ -146,23 +153,23 @@ void PickingVisitor::visit(Handles &n) } else if ( n.type() == Handles::ROTATE ){ // the icon for rotation is on the right top corner at (0.12, 0.12) in scene coordinates - glm::vec4 vec = glm::inverse(modelview_) * glm::vec4( 0.12f, 0.12f, 0.f, 0.f ); - picked = glm::length( glm::vec2( 1.f, 1.f) + glm::vec2(vec) - glm::vec2(P) ) < 1.5f * scale; + glm::vec4 pos = glm::inverse(ctm) * glm::vec4( 0.12f, 0.12f, 0.f, 0.f ); + picked = glm::length( glm::vec2( 1.f, 1.f) + glm::vec2(pos) - glm::vec2(P) ) < 1.5f * scale; } else if ( n.type() == Handles::SCALE ){ // the icon for scaling is on the right bottom corner at (0.12, -0.12) in scene coordinates - glm::vec4 vec = glm::inverse(modelview_) * glm::vec4( 0.12f, -0.12f, 0.f, 0.f ); - picked = glm::length( glm::vec2( 1.f, -1.f) + glm::vec2(vec) - glm::vec2(P) ) < 1.5f * scale; + glm::vec4 pos = glm::inverse(ctm) * glm::vec4( 0.12f, -0.12f, 0.f, 0.f ); + picked = glm::length( glm::vec2( 1.f, -1.f) + glm::vec2(pos) - glm::vec2(P) ) < 1.5f * scale; } else if ( n.type() == Handles::CROP ){ // the icon for cropping is on the left bottom corner at (0.12, 0.12) in scene coordinates - glm::vec4 vec = glm::inverse(modelview_) * glm::vec4( 0.12f, 0.12f, 0.f, 0.f ); - picked = glm::length( glm::vec2( -1.f, -1.f) + glm::vec2(vec) - glm::vec2(P) ) < 1.5f * scale; + glm::vec4 pos = glm::inverse(ctm) * glm::vec4( 0.12f, 0.12f, 0.f, 0.f ); + picked = glm::length( glm::vec2( -1.f, -1.f) + glm::vec2(pos) - glm::vec2(P) ) < 1.5f * scale; } else if ( n.type() == Handles::MENU ){ // the icon for restore is on the left top corner at (-0.12, 0.12) in scene coordinates - glm::vec4 vec = glm::inverse(modelview_) * glm::vec4( -0.12f, 0.12f, 0.f, 0.f ); - picked = glm::length( glm::vec2( -1.f, 1.f) + glm::vec2(vec) - glm::vec2(P) ) < 1.5f * scale; + glm::vec4 pos = glm::inverse(ctm) * glm::vec4( -0.12f, 0.12f, 0.f, 0.f ); + picked = glm::length( glm::vec2( -1.f, 1.f) + glm::vec2(pos) - glm::vec2(P) ) < 1.5f * scale; } if ( picked )