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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2008-09-17 05:29:54 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2008-09-17 05:29:54 +0400
commit9064ed8d6aa934dedc4b344e328566a8549371f6 (patch)
tree81618923ec82eba64aa5caa6af6ffeb6231b996a /source/gameengine/Converter
parent9b7d40dbae1be5aa18894ffbc8f97a4a8c4c6fdd (diff)
Fix for bug #4192: game engine armatures that are dynamically added
but don't have an action got the pose of already added armatures, even though they're not related. This also fixes an issue where the armature in Blender would end up in the pose from the game after ESC, removes unneeded copies made during armature evaluation, and also solves the constraint copying hack.
Diffstat (limited to 'source/gameengine/Converter')
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.cpp6
-rw-r--r--source/gameengine/Converter/BL_ArmatureObject.cpp47
-rw-r--r--source/gameengine/Converter/BL_ArmatureObject.h3
-rw-r--r--source/gameengine/Converter/BL_ShapeDeformer.cpp4
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.cpp2
5 files changed, 28 insertions, 34 deletions
diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp
index b8514e33127..c08427c6d27 100644
--- a/source/gameengine/Converter/BL_ActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ActionActuator.cpp
@@ -59,11 +59,11 @@
BL_ActionActuator::~BL_ActionActuator()
{
if (m_pose)
- free_pose(m_pose);
+ game_free_pose(m_pose);
if (m_userpose)
- free_pose(m_userpose);
+ game_free_pose(m_userpose);
if (m_blendpose)
- free_pose(m_blendpose);
+ game_free_pose(m_blendpose);
}
void BL_ActionActuator::ProcessReplica(){
diff --git a/source/gameengine/Converter/BL_ArmatureObject.cpp b/source/gameengine/Converter/BL_ArmatureObject.cpp
index bf774bf7568..d2001212f7d 100644
--- a/source/gameengine/Converter/BL_ArmatureObject.cpp
+++ b/source/gameengine/Converter/BL_ArmatureObject.cpp
@@ -45,7 +45,6 @@
#include <config.h>
#endif
-
BL_ArmatureObject::BL_ArmatureObject(
void* sgReplicationInfo,
SG_Callbacks callbacks,
@@ -65,7 +64,7 @@ BL_ArmatureObject::BL_ArmatureObject(
* the original pose before calling into blender functions, to deal with
* replica's or other objects using the same blender object */
m_pose = NULL;
- copy_pose(&m_pose, m_objArma->pose, 1 /* copy_constraint_channels_hack */);
+ game_copy_pose(&m_pose, m_objArma->pose);
}
CValue* BL_ArmatureObject::GetReplica()
@@ -84,32 +83,30 @@ void BL_ArmatureObject::ProcessReplica(BL_ArmatureObject *replica)
KX_GameObject::ProcessReplica(replica);
replica->m_pose = NULL;
- copy_pose(&replica->m_pose, m_pose, 1 /* copy_constraint_channels_hack */);
+ game_copy_pose(&replica->m_pose, m_pose);
}
BL_ArmatureObject::~BL_ArmatureObject()
{
if (m_pose)
- free_pose(m_pose);
+ game_free_pose(m_pose);
}
-bool BL_ArmatureObject::VerifyPose()
+void BL_ArmatureObject::ApplyPose()
{
+ m_armpose = m_objArma->pose;
+ m_objArma->pose = m_pose;
+
if(m_lastapplyframe != m_lastframe) {
- extract_pose_from_pose(m_objArma->pose, m_pose);
where_is_pose(m_objArma);
m_lastapplyframe = m_lastframe;
- extract_pose_from_pose(m_pose, m_objArma->pose);
- return false;
}
- else
- return true;
}
-void BL_ArmatureObject::ApplyPose()
+void BL_ArmatureObject::RestorePose()
{
- if(VerifyPose())
- extract_pose_from_pose(m_objArma->pose, m_pose);
+ m_objArma->pose = m_armpose;
+ m_armpose = NULL;
}
void BL_ArmatureObject::SetPose(bPose *pose)
@@ -164,8 +161,7 @@ void BL_ArmatureObject::GetPose(bPose **pose)
a crash and memory leakage when
&BL_ActionActuator::m_pose is freed
*/
- int copy_constraint_channels_hack = 1;
- copy_pose(pose, m_pose, copy_constraint_channels_hack);
+ game_copy_pose(pose, m_pose);
}
else {
if (*pose == m_pose)
@@ -181,17 +177,10 @@ void BL_ArmatureObject::GetMRDPose(bPose **pose)
/* If the caller supplies a null pose, create a new one. */
/* Otherwise, copy the armature's pose channels into the caller-supplied pose */
- if (!*pose) {
- // must duplicate the constraints too otherwise we have corruption in free_pose_channels()
- // because it will free the blender constraints.
- // Ideally, blender should rememeber that the constraints were not copied so that
- // free_pose_channels() would not free them.
- copy_pose(pose, m_pose, 1);
- }
- else {
+ if (!*pose)
+ game_copy_pose(pose, m_pose);
+ else
extract_pose_from_pose(*pose, m_pose);
- }
-
}
short BL_ArmatureObject::GetActivePriority()
@@ -210,13 +199,11 @@ bool BL_ArmatureObject::GetBoneMatrix(Bone* bone, MT_Matrix4x4& matrix)
ApplyPose();
pchan = get_pose_channel(m_objArma->pose, bone->name);
-
- if(pchan) {
+ if(pchan)
matrix.setValue(&pchan->pose_mat[0][0]);
- return true;
- }
+ RestorePose();
- return false;
+ return (pchan != NULL);
}
float BL_ArmatureObject::GetBoneLength(Bone* bone) const
diff --git a/source/gameengine/Converter/BL_ArmatureObject.h b/source/gameengine/Converter/BL_ArmatureObject.h
index 6f2c0d2f4c9..d68e37d9e37 100644
--- a/source/gameengine/Converter/BL_ArmatureObject.h
+++ b/source/gameengine/Converter/BL_ArmatureObject.h
@@ -61,7 +61,7 @@ public:
void SetPose (struct bPose *pose);
void ApplyPose();
- bool VerifyPose();
+ void RestorePose();
bool SetActiveAction(class BL_ActionActuator *act, short priority, double curtime);
@@ -82,6 +82,7 @@ protected:
Object *m_objArma;
struct bArmature *m_armature;
struct bPose *m_pose;
+ struct bPose *m_armpose;
struct bPose *m_framePose;
double m_lastframe;
class BL_ActionActuator *m_activeAct;
diff --git a/source/gameengine/Converter/BL_ShapeDeformer.cpp b/source/gameengine/Converter/BL_ShapeDeformer.cpp
index 236cd1a6667..dfd33e45fef 100644
--- a/source/gameengine/Converter/BL_ShapeDeformer.cpp
+++ b/source/gameengine/Converter/BL_ShapeDeformer.cpp
@@ -109,6 +109,7 @@ bool BL_ShapeDeformer::ExecuteShapeDrivers(void)
vector<IpoCurve*>::iterator it;
void *poin;
int type;
+
// the shape drivers use the bone matrix as input. Must
// update the matrix now
m_armobj->ApplyPose();
@@ -121,7 +122,10 @@ bool BL_ShapeDeformer::ExecuteShapeDrivers(void)
if (poin)
write_ipo_poin(poin, type, icu->curval);
}
+
ForceUpdate();
+ m_armobj->RestorePose();
+
return true;
}
return false;
diff --git a/source/gameengine/Converter/BL_SkinDeformer.cpp b/source/gameengine/Converter/BL_SkinDeformer.cpp
index d8e7a9cdadf..b7b39ad7fbf 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.cpp
+++ b/source/gameengine/Converter/BL_SkinDeformer.cpp
@@ -197,6 +197,8 @@ bool BL_SkinDeformer::Update(void)
/* Update the current frame */
m_lastArmaUpdate=m_armobj->GetLastFrame();
+ m_armobj->RestorePose();
+
/* indicate that the m_transverts and normals are up to date */
return true;
}