btPoint2PointConstraint( btRigidBody rbA, ref btVector3 pivotInA )
			: base( btObjectTypes.POINT2POINT_CONSTRAINT_TYPE, rbA )
		{
			m_pivotInA = ( pivotInA );
			rbA.m_worldTransform.Apply( ref pivotInA, out m_pivotInB );
			m_flags = ( 0 );
			m_useSolveConstraintObsolete = ( false );

		}
		///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). 
		///If no axis is provided, it uses the default axis for this constraint.
		public override void setParam( btConstraintParams num, double value, int axis = -1 )
		{
			if( axis != -1 )
			{
				btAssertConstrParams( false );
			}
			else
			{
				switch( num )
				{
					case btConstraintParams.BT_CONSTRAINT_ERP:
					case btConstraintParams.BT_CONSTRAINT_STOP_ERP:
						m_erp = value;
						m_flags |= btPoint2PointFlags.BT_P2P_FLAGS_ERP;
						break;
					case btConstraintParams.BT_CONSTRAINT_CFM:
					case btConstraintParams.BT_CONSTRAINT_STOP_CFM:
						m_cfm = value;
						m_flags |= btPoint2PointFlags.BT_P2P_FLAGS_CFM;
						break;
					default:
						btAssertConstrParams( false );
						break;
				}
			}
		}
		/*
		///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). 
		///If no axis is provided, it uses the default axis for this constraint.
		virtual void setParam( int num, double value, int axis = -1 );
		///return the local value of parameter
		virtual double getParam( int num, int axis = -1 );
		*/


		btPoint2PointConstraint( btRigidBody rbA, btRigidBody rbB, ref btVector3 pivotInA, ref btVector3 pivotInB )
				: base( btObjectTypes.POINT2POINT_CONSTRAINT_TYPE, rbA, rbB )
		{
			m_pivotInA = ( pivotInA );
			m_pivotInB = ( pivotInB );
			m_flags = ( 0 );
			m_useSolveConstraintObsolete = ( false );

		}