[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