Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Bolsee <benoit.bolsee@online.be>2012-06-05 02:29:17 +0400
committerBenoit Bolsee <benoit.bolsee@online.be>2012-06-05 02:29:17 +0400
commit8db6e682e9c0d55a34c64a490cbf29ff301c4973 (patch)
tree306b1eb927d6768f88a149167c62d9724f8f6814 /intern/itasc
parent0d3b19e7340e0f3fa075e90e695ddf760529b925 (diff)
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.
Diffstat (limited to 'intern/itasc')
-rw-r--r--intern/itasc/Armature.cpp7
-rw-r--r--intern/itasc/Armature.hpp2
-rw-r--r--intern/itasc/FixedObject.cpp5
-rw-r--r--intern/itasc/FixedObject.hpp2
-rw-r--r--intern/itasc/MovingFrame.cpp3
-rw-r--r--intern/itasc/MovingFrame.hpp2
-rw-r--r--intern/itasc/Object.hpp2
-rw-r--r--intern/itasc/Scene.cpp3
8 files changed, 16 insertions, 10 deletions
diff --git a/intern/itasc/Armature.cpp b/intern/itasc/Armature.cpp
index 916b0bc7bf3..dd5c1921a98 100644
--- a/intern/itasc/Armature.cpp
+++ b/intern/itasc/Armature.cpp
@@ -369,11 +369,13 @@ int Armature::addEndEffector(const std::string& name)
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 @@ void Armature::finalize()
if (m_armlength < KDL::epsilon)
m_armlength = KDL::epsilon;
m_finalized = true;
+ return true;
}
void Armature::pushCache(const Timestamp& timestamp)
diff --git a/intern/itasc/Armature.hpp b/intern/itasc/Armature.hpp
index 0f4abeab4f0..63d1899f4e9 100644
--- a/intern/itasc/Armature.hpp
+++ b/intern/itasc/Armature.hpp
@@ -31,7 +31,7 @@ public:
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);
diff --git a/intern/itasc/FixedObject.cpp b/intern/itasc/FixedObject.cpp
index 9dc4d69878a..2a1e66f9c6f 100644
--- a/intern/itasc/FixedObject.cpp
+++ b/intern/itasc/FixedObject.cpp
@@ -53,12 +53,13 @@ int FixedObject::addEndEffector(const std::string& name)
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)
diff --git a/intern/itasc/FixedObject.hpp b/intern/itasc/FixedObject.hpp
index b4279d9adcb..ad26e7cb2d6 100644
--- a/intern/itasc/FixedObject.hpp
+++ b/intern/itasc/FixedObject.hpp
@@ -23,7 +23,7 @@ public:
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) {};
diff --git a/intern/itasc/MovingFrame.cpp b/intern/itasc/MovingFrame.cpp
index 3b0ee7842ca..90ebe091eb5 100644
--- a/intern/itasc/MovingFrame.cpp
+++ b/intern/itasc/MovingFrame.cpp
@@ -27,9 +27,10 @@ MovingFrame::~MovingFrame()
{
}
-void MovingFrame::finalize()
+bool MovingFrame::finalize()
{
updateJacobian();
+ return true;
}
void MovingFrame::initCache(Cache *_cache)
diff --git a/intern/itasc/MovingFrame.hpp b/intern/itasc/MovingFrame.hpp
index 21cb344980a..d2a956d7312 100644
--- a/intern/itasc/MovingFrame.hpp
+++ b/intern/itasc/MovingFrame.hpp
@@ -28,7 +28,7 @@ public:
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();
diff --git a/intern/itasc/Object.hpp b/intern/itasc/Object.hpp
index 5aa4346fc4b..bf80d83e5aa 100644
--- a/intern/itasc/Object.hpp
+++ b/intern/itasc/Object.hpp
@@ -33,7 +33,7 @@ public:
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;};
diff --git a/intern/itasc/Scene.cpp b/intern/itasc/Scene.cpp
index 16f8551bfc7..877cd883208 100644
--- a/intern/itasc/Scene.cpp
+++ b/intern/itasc/Scene.cpp
@@ -91,7 +91,8 @@ bool Scene::setParam(SceneParam paramId, double value)
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);