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);
}
Example #2
0
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();
}
Example #3
0
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);
}