[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47438] trunk/blender/intern/itasc: Fix [ #31544]: iTaSC assertion when creating armature with no joint.
Benoit Bolsee
benoit.bolsee at online.be
Tue Jun 5 00:29:29 CEST 2012
Revision: 47438
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47438
Author: ben2610
Date: 2012-06-04 22:29:17 +0000 (Mon, 04 Jun 2012)
Log Message:
-----------
Fix [#31544]: iTaSC assertion when creating armature with no joint. This degenerated case can be obtained by having a single bone in the IK chain and locking all 3 axis. This case was causing an assert in the KDL library. The bug is fixed by simply not creating the IK scene in this case.
Modified Paths:
--------------
trunk/blender/intern/itasc/Armature.cpp
trunk/blender/intern/itasc/Armature.hpp
trunk/blender/intern/itasc/FixedObject.cpp
trunk/blender/intern/itasc/FixedObject.hpp
trunk/blender/intern/itasc/MovingFrame.cpp
trunk/blender/intern/itasc/MovingFrame.hpp
trunk/blender/intern/itasc/Object.hpp
trunk/blender/intern/itasc/Scene.cpp
Modified: trunk/blender/intern/itasc/Armature.cpp
===================================================================
--- trunk/blender/intern/itasc/Armature.cpp 2012-06-04 22:17:40 UTC (rev 47437)
+++ trunk/blender/intern/itasc/Armature.cpp 2012-06-04 22:29:17 UTC (rev 47438)
@@ -369,11 +369,13 @@
return m_neffector++;
}
-void Armature::finalize()
+bool Armature::finalize()
{
unsigned int i, j, c;
if (m_finalized)
- return;
+ return true;
+ if (m_njoint == 0)
+ return false;
initialize(m_njoint, m_noutput, m_neffector);
for (i=c=0; i<m_nconstraint; i++) {
JointConstraint_struct* pConstraint = m_constraints[i];
@@ -410,6 +412,7 @@
if (m_armlength < KDL::epsilon)
m_armlength = KDL::epsilon;
m_finalized = true;
+ return true;
}
void Armature::pushCache(const Timestamp& timestamp)
Modified: trunk/blender/intern/itasc/Armature.hpp
===================================================================
--- trunk/blender/intern/itasc/Armature.hpp 2012-06-04 22:17:40 UTC (rev 47437)
+++ trunk/blender/intern/itasc/Armature.hpp 2012-06-04 22:29:17 UTC (rev 47438)
@@ -31,7 +31,7 @@
bool getSegment(const std::string& segment_name, const unsigned int q_size, const Joint* &p_joint, double &q_rest, double &q, const Frame* &p_tip);
bool getRelativeFrame(Frame& result, const std::string& segment_name, const std::string& base_name=m_root);
- virtual void finalize();
+ virtual bool finalize();
virtual int addEndEffector(const std::string& name);
virtual const Frame& getPose(const unsigned int end_effector);
Modified: trunk/blender/intern/itasc/FixedObject.cpp
===================================================================
--- trunk/blender/intern/itasc/FixedObject.cpp 2012-06-04 22:17:40 UTC (rev 47437)
+++ trunk/blender/intern/itasc/FixedObject.cpp 2012-06-04 22:29:17 UTC (rev 47438)
@@ -53,12 +53,13 @@
return -1;
}
-void FixedObject::finalize()
+bool FixedObject::finalize()
{
if (m_finalized)
- return;
+ return true;
initialize(0, m_nframe);
m_finalized = true;
+ return true;
}
const Frame& FixedObject::getPose(const unsigned int frameIndex)
Modified: trunk/blender/intern/itasc/FixedObject.hpp
===================================================================
--- trunk/blender/intern/itasc/FixedObject.hpp 2012-06-04 22:17:40 UTC (rev 47437)
+++ trunk/blender/intern/itasc/FixedObject.hpp 2012-06-04 22:29:17 UTC (rev 47438)
@@ -23,7 +23,7 @@
virtual void updateCoordinates(const Timestamp& timestamp) {};
virtual int addEndEffector(const std::string& name);
- virtual void finalize();
+ virtual bool finalize();
virtual const Frame& getPose(const unsigned int frameIndex);
virtual void updateKinematics(const Timestamp& timestamp) {};
virtual void pushCache(const Timestamp& timestamp) {};
Modified: trunk/blender/intern/itasc/MovingFrame.cpp
===================================================================
--- trunk/blender/intern/itasc/MovingFrame.cpp 2012-06-04 22:17:40 UTC (rev 47437)
+++ trunk/blender/intern/itasc/MovingFrame.cpp 2012-06-04 22:29:17 UTC (rev 47438)
@@ -27,9 +27,10 @@
{
}
-void MovingFrame::finalize()
+bool MovingFrame::finalize()
{
updateJacobian();
+ return true;
}
void MovingFrame::initCache(Cache *_cache)
Modified: trunk/blender/intern/itasc/MovingFrame.hpp
===================================================================
--- trunk/blender/intern/itasc/MovingFrame.hpp 2012-06-04 22:17:40 UTC (rev 47437)
+++ trunk/blender/intern/itasc/MovingFrame.hpp 2012-06-04 22:29:17 UTC (rev 47438)
@@ -28,7 +28,7 @@
virtual void updateKinematics(const Timestamp& timestamp);
virtual void pushCache(const Timestamp& timestamp);
virtual void initCache(Cache *_cache);
- virtual void finalize();
+ virtual bool finalize();
protected:
virtual void updateJacobian();
Modified: trunk/blender/intern/itasc/Object.hpp
===================================================================
--- trunk/blender/intern/itasc/Object.hpp 2012-06-04 22:17:40 UTC (rev 47437)
+++ trunk/blender/intern/itasc/Object.hpp 2012-06-04 22:29:17 UTC (rev 47438)
@@ -33,7 +33,7 @@
virtual ~Object(){};
virtual int addEndEffector(const std::string& name){return 0;};
- virtual void finalize(){};
+ virtual bool finalize(){return true;};
virtual const KDL::Frame& getPose(const unsigned int end_effector=0){return m_internalPose;};
virtual const ObjectType getType(){return m_type;};
virtual const unsigned int getNrOfCoordinates(){return 0;};
Modified: trunk/blender/intern/itasc/Scene.cpp
===================================================================
--- trunk/blender/intern/itasc/Scene.cpp 2012-06-04 22:17:40 UTC (rev 47437)
+++ trunk/blender/intern/itasc/Scene.cpp 2012-06-04 22:29:17 UTC (rev 47438)
@@ -91,7 +91,8 @@
bool Scene::addObject(const std::string& name, Object* object, UncontrolledObject* base, const std::string& baseFrame)
{
// finalize the object before adding
- object->finalize();
+ if (!object->finalize())
+ return false;
//Check if Object is controlled or uncontrolled.
if(object->getType()==Object::Controlled){
int baseFrameIndex = base->addEndEffector(baseFrame);
More information about the Bf-blender-cvs
mailing list