GLC_Matrix4x4 GLC_PullManipulator::doManipulate(const GLC_Point3d& newPoint, const GLC_Vector3d& projectionDirection)
{
	// Project the given point on the sliding plane with the given direction
	GLC_Point3d projectedPoint;
	GLC_Line3d projectionLine(newPoint, projectionDirection);
	glc::lineIntersectPlane(projectionLine, GLC_AbstractManipulator::m_SliddingPlane, &projectedPoint);

	// Project the point on the pulling direction
	projectedPoint= glc::project(projectedPoint, GLC_Line3d(GLC_AbstractManipulator::previousPosition(), m_PullDirection));

	// Compute the translation matrix
	GLC_Matrix4x4 translationMatrix(projectedPoint - GLC_AbstractManipulator::m_PreviousPosition);

	// Update previous position to this position
	GLC_AbstractManipulator::m_PreviousPosition= projectedPoint;
	return translationMatrix;
}
GLC_AbstractManipulator* GLC_CuttingPlane::rotationNavigator(int index)
{
	index= index - 2;
	Q_ASSERT((index > -1) && (index < 3));

	const GLC_Matrix4x4 rotationMatrix(m_CompMatrix.rotationMatrix());
	GLC_Vector3d axis;
	if (index == 0)
	{
		axis= rotationMatrix * glc::X_AXIS;
	}
	else if (index == 1)
	{
		axis= rotationMatrix * glc::Y_AXIS;
	}
	else
	{
		axis= rotationMatrix * glc::Z_AXIS;
	}
	GLC_AbstractManipulator* pManipulator= new GLC_RotationManipulator(GLC_3DWidget::widgetManagerHandle()->viewport(), GLC_Line3d(m_CurrentNavigatorPosition, axis));

	return pManipulator;
}