/* Copyright (c) <2003-2011> <Julio Jerez, Newton Game Dynamics>
 * 
 * This software is provided 'as-is', without any express or implied
 * warranty. In no event will the authors be held liable for any damages
 * arising from the use of this software.
 * 
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 * 
 * 1. The origin of this software must not be misrepresented; you must not
 * claim that you wrote the original software. If you use this software
 * in a product, an acknowledgment in the product documentation would be
 * appreciated but is not required.
 * 
 * 2. Altered source versions must be plainly marked as such, and must not be
 * misrepresented as being the original software.
 * 
 * 3. This notice may not be removed or altered from any source distribution.
 */

#include "dgPhysicsStdafx.h"
#include "dgBody.h"
#include "dgPointToCurveConstraint.h"

/*


 //////////////////////////////////////////////////////////////////////
 // Construction/Destruction
 //////////////////////////////////////////////////////////////////////

 dgPointToCurveConstraint::dgPointToCurveConstraint()
 {

 }

 dgPointToCurveConstraint::~dgPointToCurveConstraint()
 {
 }


 dgPointToCurveConstraint* dgPointToCurveConstraint::Create(dgWorld* world)
 {
 dgPointToCurveConstraint*	constraint;

 constraint = dgPointToCurveConstraintArray::GetPool().GetElement();

 constraint->Init();
 constraint->m_maxDOF = 2;
 constraint->m_destructor = NULL;
 constraint->m_constId = dgPointToCurveConstraintId;
 return constraint;
 }

 void dgPointToCurveConstraint::Remove(dgWorld* world)
 {
 dgBallConstraintArray& array = *world;
 dgBilateralConstraint::Remove ();
 //	dgBallConstraintArray::GetPool().RemoveElement (this);
 array.RemoveElement (this);

 }

 void dgPointToCurveConstraint::SetDestructorCallback (OnConstraintDestroy destructor)
 {
 m_destructor = destructor;
 }


 //dgUnsigned32 dgPointToCurveConstraint::CalcRestrictedDOF()
 //{
 //	_ASSERTE (0);
 //	return 0;
 //}


 void dgPointToCurveConstraint::SetPivotPoint(
 const dgVector &pivot,
 OnPointToCurveCallback curve, 
 void *curveContext)
 {
 _ASSERTE (0);

 //	_ASSERTE (m_dynamic0);

 //	m_curve = curve;
 //	m_context = curveContext;
 //	m_pivot = m_dynamic0->GetBody()->GetMatrix().UntransformVector (pivot);

 }


 dgUnsigned32 dgPointToCurveConstraint::JacobianDerivative (dgContraintDescritor& params)
 {
 _ASSERTE (0);
 return 0;
 //	dgBody* body0;
 //	dgFloat32 kPosit;
 //	
 //	_ASSERTE (m_dynamic0);
 //	
 //	body0 = m_dynamic0->GetBody();
 //	_ASSERTE (body0);
 //	
 //	_ASSERTE (body0->GetDynamic() == m_dynamic0);
 //	
 //	const dgMatrix& mat0 = body0->GetMatrix();
 //
 //	dgVector front;
 //	dgVector up;
 //	dgVector right;
 //	dgVector tangent;
 //  dgVector pivet1;
 //	dgVector pivet0 (mat0.RotateVector (m_pivot));
 //
 //	dgVector	point (pivet0 + mat0.posit);
 //	m_curve (m_context, pivet0, pivet1, front);

 //	front = front.Scale (dgRsqrt (front % front)); 
 //	Create__Basis(front, up, right);

 //	dgVector pivetUp (pivet0 * up);
 //	dgVector pivetRight (pivet0 * right);

 //	dgJacobian* jacobian01 = params.m_jacobian_01; 

 //	jacobian01[0].derivative[0] = up.m_x;
 //	jacobian01[0].derivative[1] = up.m_y;
 //	jacobian01[0].derivative[2] = up.m_z;
 //	jacobian01[0].derivative[3] = pivetUp.m_x;
 //	jacobian01[0].derivative[4] = pivetUp.m_y;
 //	jacobian01[0].derivative[5] = pivetUp.m_z;
 
 //	jacobian01[1].derivative[0] = right.m_x;
 //	jacobian01[1].derivative[1] = right.m_y;
 //	jacobian01[1].derivative[2] = right.m_z;
 //	jacobian01[1].derivative[3] = pivetRight.m_x;
 //	jacobian01[1].derivative[4] = pivetRight.m_y;
 //	jacobian01[1].derivative[5] = pivetRight.m_z;

 //	kPosit = 0.7f * params.m_invTimestep * params.m_invTimestep;
 //	dgVector positError (pivet1 - point);

 //	params.m_jointAccel[0] = (positError % up) * kPosit;
 //	params.m_jointAccel[1] = (positError % right) * kPosit;
 }
 */

