bool CPhysxSkeleton::AddFixedJoint(CXMLTreeNode _XMLObjects)
{
    string l_szActor1, l_szActor2, l_szDirection;

    l_szActor1        = _XMLObjects.GetAttribute<std::string>("Actor1" , "");
    l_szActor2        = _XMLObjects.GetAttribute<std::string>("Actor2" , "");
    l_szDirection = _XMLObjects.GetAttribute<std::string>("Direction" , "");

    CPhysxBone* l_pBone1 = GetPhysxBoneByName(l_szActor1);
    CPhysxBone* l_pBone2 = GetPhysxBoneByName(l_szActor2);

    CPhysicActor* l_pActor1 = 0;
    CPhysicActor* l_pActor2 = 0;

    CPhysicFixedJoint* l_pFixedJoint = 0;
    l_pFixedJoint = new CPhysicFixedJoint();
    l_pActor1 = l_pBone1->GetPhysxActor();

    if (l_szActor2 == "NULL")
    {
        l_pFixedJoint->SetInfo(l_pActor1);
    }
    else
    {
        l_pActor2 = l_pBone2->GetPhysxActor();
        l_pFixedJoint->SetInfo(l_pActor1, l_pActor2);
    }

    PhysXMInstance->AddPhysicFixedJoint(l_pFixedJoint);
    m_vFixedJoints.push_back(l_pFixedJoint);

    return true;
}
bool CPhysxSkeleton::AddFixedJoint(CXMLTreeNode _XMLObjects)
{
  string l_szActor1,l_szActor2, l_szDirection;

  l_szActor1		= _XMLObjects.GetPszISOProperty("Actor1" ,"");
  l_szActor2		= _XMLObjects.GetPszISOProperty("Actor2" ,"");
  l_szDirection	= _XMLObjects.GetPszISOProperty("Direction" ,"");

  CPhysxBone* l_pBone1 = GetPhysxBoneByName(l_szActor1);
  CPhysxBone* l_pBone2 = GetPhysxBoneByName(l_szActor2);

  CPhysicActor* l_pActor1 = 0;
  CPhysicActor* l_pActor2 = 0;

  CPhysicFixedJoint* l_pFixedJoint = 0;
  l_pFixedJoint = new CPhysicFixedJoint();
  l_pActor1 = l_pBone1->GetPhysxActor();

  if (l_szActor2=="NULL")
  {
    l_pFixedJoint->SetInfo(l_pActor1);
  }
  else
  {
    l_pActor2 = l_pBone2->GetPhysxActor();
    l_pFixedJoint->SetInfo(l_pActor1,l_pActor2);
  }

  CORE->GetPhysicsManager()->AddPhysicFixedJoint(l_pFixedJoint);
  m_vFixedJoints.push_back(l_pFixedJoint);

	return true;
}
void CPhysxSkeleton::InitParents()
{


    for(size_t i = 0; i < m_vBones.size(); ++i)
    {
        if (!m_vBones[i]->IsBoneRoot())
        {
            int l_iParentId = m_vBones[i]->GetParentID();
            if (l_iParentId != -1)
            {
                string l_szNameParent = m_pCalSkeleton->getBone(l_iParentId)->getCoreBone()->getName();
                CPhysxBone* l_pParentPhysBone = GetPhysxBoneByName(l_szNameParent);
                m_vBones[i]->SetParent(l_pParentPhysBone);
            }
            else
            {
                m_vBones[i]->SetParent(0);
            }
        }
        else
        {
            m_vBones[i]->SetParent(0);
        }
    }


}
bool CPhysxSkeleton::Load(const string& _szFileName)
{
  CXMLTreeNode l_XML;
  CXMLTreeNode l_XMLObjects;
	if(!l_XML.LoadFile(_szFileName.c_str()))
	{
		LOGGER->AddNewLog(ELL_WARNING,"CPhysxRagdoll:: No s'ha trobat el XML \"%s\"", _szFileName.c_str());
		return false;
	}
  
  l_XMLObjects = l_XML(0);
  int l_iNumObjects = l_XMLObjects.GetNumChildren();
  
	for(int i = 0; i < l_iNumObjects; i++)
	{
		CXMLTreeNode l_XMLObject = l_XMLObjects(i);
    string l_szType,l_szName;
 
		if(l_XMLObject.IsComment())
		{
			continue;
		}

    l_szName = l_XMLObject.GetPszISOProperty("name" ,"");
    l_szType = l_XMLObject.GetPszISOProperty("type" ,"");
    
    CPhysxBone* l_pBone = GetPhysxBoneByName(l_szName);

    if (l_pBone!=0)
    {
      if (l_szType=="box")
      {
        l_pBone->AddBoxActor(l_XMLObject, m_pEntity);
      }

      if (l_szType=="sphere")
      {
        l_pBone->AddSphereActor(l_XMLObject, m_pEntity);
      }

      if (l_szType=="capsule")
      {
        l_pBone->AddCapsuleActor(l_XMLObject, m_pEntity);
      }
    }
  }
  

  
  if (!m_bRagdollActive)
  {
    SleepPhysxBones();
  }

  return true;
}
void CPhysxSkeleton::UpdateCal3dFromPhysx()
{
    for(size_t i = 0; i < m_vBones.size(); ++i)
    {
        m_vBones[i]->UpdateCal3dFromPhysx();
    }

    m_mTransform = GetPhysxBoneByName("Bip01 Pelvis")->GetTransform();
    m_pCalSkeleton->calculateState();
}
bool CPhysxSkeleton::Load(const std::string& _szFileName)
{
  ASSERT(false,"No deberia de hacer esto!!!!");
    bool lOk = true;
    CXMLTreeNode l_XML;
    CXMLTreeNode l_XMLObjects;
    if(!l_XML.LoadAndFindNode(_szFileName.c_str(), "node" , l_XMLObjects))
    {
        LOG_WARNING_APPLICATION( "Could not open file %s", _szFileName.c_str());
        lOk = false;
    }
    else
    {
        for(uint32 i = 0, l_iNumObjects = l_XMLObjects.GetNumChildren(); i < l_iNumObjects; ++i)
        {
            const CXMLTreeNode& l_XMLObject = l_XMLObjects(i);
            const std::string& l_szName = l_XMLObject.GetAttribute<std::string>("name" , "");

            CPhysxBone* l_pBone = GetPhysxBoneByName(l_szName);

            if (l_pBone )
            {
                const std::string& l_szType = l_XMLObject.GetAttribute<std::string>("type" , "");
                if (l_szType == "box")
                {
                    l_pBone->AddBoxActor(l_XMLObject, m_pEntity);
                }
                else if (l_szType == "sphere")
                {
                    l_pBone->AddSphereActor(l_XMLObject, m_pEntity);
                }
                else if (l_szType == "capsule")
                {
                    l_pBone->AddCapsuleActor(l_XMLObject, m_pEntity);
                }
            }
        }

        if (!m_bRagdollActive)
        {
            SleepPhysxBones();
        }
    }

    return lOk;
}
bool CPhysxSkeleton::AddSphericalJoint(CXMLTreeNode _XMLObjects)
{
    string l_szActor1, l_szActor2, l_szDirection;

    l_szActor1        = _XMLObjects.GetAttribute<std::string>("Actor1" , "");
    l_szActor2        = _XMLObjects.GetAttribute<std::string>("Actor2" , "");
    l_szDirection = _XMLObjects.GetAttribute<std::string>("Direction" , "");

    SSphericalLimitInfo l_pJointInfo = GetJointParameterInfo(_XMLObjects);

    CPhysxBone* l_pBone1 = GetPhysxBoneByName(l_szActor1);
    CPhysxBone* l_pBone2 = GetPhysxBoneByName(l_szActor2);

    CPhysicActor* l_pActor1 = 0;
    CPhysicActor* l_pActor2 = 0;
    l_pActor1 = l_pBone1->GetPhysxActor();

    CPhysicSphericalJoint* l_pSphericalJoint = 0;
    l_pSphericalJoint = new CPhysicSphericalJoint();


    CalVector l_vCalVect = l_pBone1->GetCalBone()->getTranslationAbsolute();
    Math::Vect3f l_vJointPoint(-l_vCalVect.x, l_vCalVect.y, l_vCalVect.z);
    l_vJointPoint = m_mTransform * l_vJointPoint;
    Math::Vect3f l_vAxis;
    CalVector l_vVect;



    //MES PROVES
    if (l_szDirection == "Out")
    {
        if (l_pBone1->GetChildList().size() > 0)
        {
            int l_pChildId = l_pBone1->GetChildList()[0];
            string l_szNameChild = m_pCalSkeleton->getBone(l_pChildId)->getCoreBone()->getName();
            CPhysxBone* l_pPhysChild = GetPhysxBoneByName(l_szNameChild);
            l_vVect = l_pPhysChild->GetCalBone()->getTranslationAbsolute();
            l_vVect.x = -l_vVect.x;
            /*  l_vAxis = Math::Vect3f(l_vVect.x-l_vJointPoint.x,l_vVect.y-l_vJointPoint.y,l_vVect.z-l_vJointPoint.z);
                l_vAxis.Normalize();*/
        }
        else
        {
            Math::Vect3f l_vMiddle = l_pBone1->GetMiddlePoint();
            l_vVect = CalVector(l_vMiddle.x, l_vMiddle.y, l_vMiddle.z);
            /*  l_vAxis(l_vMiddle.x-l_vJointPoint.x,l_vMiddle.y-l_vJointPoint.y,l_vMiddle.z-l_vJointPoint.z);
                l_vAxis.Normalize();*/
        }
    }
    else if (l_szDirection == "In")
    {
      /*
        if (!l_pBone1->IsBoneRoot())
        {
            int l_pParentID = l_pBone1->GetParentID();
            string l_szNameParent = m_pCalSkeleton->getBone(l_pParentID)->getCoreBone()->getName();
            CPhysxBone* l_pPhysParent = GetPhysxBoneByName(l_szNameParent);
            CalVector l_vVect = l_pPhysParent->GetCalBone()->getTranslationAbsolute();
            l_vVect.x = -l_vVect.x;
            /*  l_vAxis = Math::Vect3f(l_vVect.x-l_vJointPoint.x,l_vVect.y-l_vJointPoint.y,l_vVect.z-l_vJointPoint.z);
                l_vAxis.Normalize();
        }
    */
    }


    Math::Vect3f l_vAxisAux(l_vVect.x, l_vVect.y, l_vVect.z);
    l_vAxisAux = m_mTransform * l_vAxisAux;
    l_vAxis = Math::Vect3f(l_vAxisAux.x - l_vJointPoint.x, l_vAxisAux.y - l_vJointPoint.y, l_vAxisAux.z - l_vJointPoint.z);
    l_vAxis.Normalize();

    l_pJointInfo.m_vAnchor = l_vJointPoint;
    l_pJointInfo.m_vAxis = l_vAxis;



    if (l_szActor2 == "NULL")
    {
        //l_pSphericalJoint->SetInfoComplete(l_vJointPoint,l_vAxis,l_pActor1);
        l_pSphericalJoint->SetInfoRagdoll(l_pJointInfo, l_pActor1);
    }
    else
    {
        l_pActor2 = l_pBone2->GetPhysxActor();
        //l_pSphericalJoint->SetInfoComplete(l_vJointPoint,l_vAxis,l_pActor1,l_pActor2);
        l_pSphericalJoint->SetInfoRagdoll(l_pJointInfo, l_pActor1, l_pActor2);
    }
    PhysXMInstance->AddPhysicSphericalJoint(l_pSphericalJoint);
    m_vSphericalJoints.push_back(l_pSphericalJoint);

    return true;
}