int SceneObjectReducedCPU6DOF::GetClosestVertex(Vec3d & queryPos, double * distance, double * auxVertexBuffer) { // transform the position to the local frame double queryPosv[3] = { queryPos[0], queryPos[1], queryPos[2] }; double localQueryPosv[3]; TransformToLocal(queryPosv, localQueryPosv); Vec3d localQueryPos(localQueryPosv); return SceneObjectReducedCPU::GetClosestVertex(localQueryPos, distance, auxVertexBuffer); }
void Desktop::HandleEvent( const sf::Event& event ) { // Activate context. Context::Activate( m_context ); sf::Vector2f local_pos; bool check_inside( false ); Widget::Ptr last_receiver( m_last_receiver.lock() ); // If we've got a mouse event, get local mouse position and mark event for being checked against widget's allocation. if( event.type == sf::Event::MouseMoved ) { m_last_mouse_pos.x = event.mouseMove.x; m_last_mouse_pos.y = event.mouseMove.y; local_pos = TransformToLocal( sf::Vector2f( static_cast<float>( event.mouseMove.x ), static_cast<float>( event.mouseMove.y ) ) ); check_inside = true; } else if( event.type == sf::Event::MouseButtonPressed || event.type == sf::Event::MouseButtonReleased ) { m_last_mouse_pos.x = event.mouseButton.x; m_last_mouse_pos.y = event.mouseButton.y; local_pos = TransformToLocal( sf::Vector2f( static_cast<float>( event.mouseButton.x ), static_cast<float>( event.mouseButton.y ) ) ); check_inside = true; } for( std::size_t index = 0; index < m_children.size(); ++index ) { Widget::Ptr widget( m_children[index] ); // Skip widget if not visible. if( !widget->IsVisible() ) { continue; } bool is_inside( widget->GetAllocation().contains( local_pos ) ); // If the event is a mouse button press, check if we need to focus another widget. if( index > 0 && event.type == sf::Event::MouseButtonPressed && is_inside ) { m_children.erase( m_children.begin() + index ); m_children.push_front( widget ); RecalculateWidgetLevels(); } // If inside check is needed, do so for all widgets except the top window. // Else it would run into trouble when moving the window, for example, // where the mouse may be outside the widget's allocation. if( check_inside && !is_inside && index > 0 ) { continue; } // If last receiver is different from current, fake a mouse move event so // that states are reset correctly. Warning, this is a hack, but it works™. // The fake event is also sent when the last mouse move event receiver // isn't the current and top one. if( event.type == sf::Event::MouseMoved && last_receiver && last_receiver != widget && last_receiver != m_children.front() ) { SendFakeMouseMoveEvent( last_receiver ); m_last_receiver = widget; last_receiver = widget; } widget->HandleEvent( event ); if( check_inside && is_inside ) { if( index < m_children.size() && widget == m_children[index] ) { m_last_receiver = widget; } break; } } // Restore previous context. Context::Deactivate(); }
bool BoneMoveable::HitTestWorld(const Point2F& worldPos) const { Point2F localPos = TransformToLocal(worldPos); return HitTestLocal(localPos); }
sf::Vector2f AnimatedSprite::TransformToLocal(const sf::Vector2f & Pt){ return TransformToLocal(Pt); }