Revision: 16262 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16262 Author: blendix Date: 2008-08-26 19:38:39 +0200 (Tue, 26 Aug 2008)
Log Message: ----------- Apricot Branch: fix for a change I made to avoid doing where_is_pose too often, didn't work correct for multiple objects sharing the same armature. Modified Paths: -------------- branches/apricot/source/blender/blenkernel/intern/action.c branches/apricot/source/gameengine/Converter/BL_ArmatureObject.cpp branches/apricot/source/gameengine/Converter/BL_ArmatureObject.h branches/apricot/source/gameengine/Converter/BL_SkinDeformer.cpp branches/apricot/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp Modified: branches/apricot/source/blender/blenkernel/intern/action.c =================================================================== --- branches/apricot/source/blender/blenkernel/intern/action.c 2008-08-26 17:09:17 UTC (rev 16261) +++ branches/apricot/source/blender/blenkernel/intern/action.c 2008-08-26 17:38:39 UTC (rev 16262) @@ -347,6 +347,7 @@ VECCOPY(pchan->loc, chan->loc); VECCOPY(pchan->size, chan->size); QUATCOPY(pchan->quat, chan->quat); + Mat4CpyMat4(pchan->chan_mat, (float(*)[4])chan->chan_mat); pchan->flag= chan->flag; con= chan->constraints.first; Modified: branches/apricot/source/gameengine/Converter/BL_ArmatureObject.cpp =================================================================== --- branches/apricot/source/gameengine/Converter/BL_ArmatureObject.cpp 2008-08-26 17:09:17 UTC (rev 16261) +++ branches/apricot/source/gameengine/Converter/BL_ArmatureObject.cpp 2008-08-26 17:38:39 UTC (rev 16262) @@ -53,18 +53,19 @@ : KX_GameObject(sgReplicationInfo,callbacks), m_objArma(armature), - m_mrdPose(NULL), m_lastframe(0.0), m_activeAct(NULL), m_activePriority(999), - m_lastapplyframe(0.0), - m_lastapplypose(NULL) + m_lastapplyframe(0.0) { m_armature = get_armature(m_objArma); - m_pose = m_objArma->pose; + + /* we make a copy of blender object's pose, and then always swap it with + * the original pose before calling into blender functions, to deal with + * replica's or other objects using the same blender object */ + copy_pose(&m_pose, m_objArma->pose, 1 /* copy_constraint_channels_hack */); } - CValue* BL_ArmatureObject::GetReplica() { BL_ArmatureObject* replica = new BL_ArmatureObject(*this); @@ -80,42 +81,39 @@ { KX_GameObject::ProcessReplica(replica); + replica->m_pose = NULL; + copy_pose(&replica->m_pose, m_pose, 1 /* copy_constraint_channels_hack */); } BL_ArmatureObject::~BL_ArmatureObject() { - if (m_mrdPose) - free_pose(m_mrdPose); + if (m_pose) + free_pose(m_pose); } -/* note, you can only call this for exisiting Armature objects, and not mix it with other Armatures */ -/* there is only 1 unique Pose per Armature */ -void BL_ArmatureObject::ApplyPose() +bool BL_ArmatureObject::VerifyPose() { - if(m_lastapplyframe == m_lastframe && m_lastapplypose == m_pose) - return; - - if (m_pose) { - // copy to armature object - if (m_objArma->pose != m_pose)/* This should never happen but it does - Campbell */ - extract_pose_from_pose(m_objArma->pose, m_pose); - - // is this needed anymore? - //if (!m_mrdPose) - // copy_pose (&m_mrdPose, m_pose, 0); - //else - // extract_pose_from_pose(m_mrdPose, 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; - m_lastapplypose = m_pose; + extract_pose_from_pose(m_pose, m_objArma->pose); + return false; } + else + return true; } +void BL_ArmatureObject::ApplyPose() +{ + if(VerifyPose()) + extract_pose_from_pose(m_objArma->pose, m_pose); +} + void BL_ArmatureObject::SetPose(bPose *pose) { - m_pose = pose; + extract_pose_from_pose(m_pose, pose); + m_lastapplyframe = -1.0; } bool BL_ArmatureObject::SetActiveAction(BL_ActionActuator *act, short priority, double curtime) @@ -176,20 +174,16 @@ /* If the caller supplies a null pose, create a new one. */ /* Otherwise, copy the armature's pose channels into the caller-supplied pose */ - // is this needed anymore? - //if (!m_mrdPose){ - // copy_pose (&m_mrdPose, m_pose, 0); - //} - 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_objArma->pose, 1); + copy_pose(pose, m_pose, 1); } - else - extract_pose_from_pose(*pose, m_objArma->pose); + else { + extract_pose_from_pose(*pose, m_pose); + } } @@ -205,15 +199,16 @@ bool BL_ArmatureObject::GetBoneMatrix(Bone* bone, MT_Matrix4x4& matrix) { - Object* par_arma = m_objArma; + bPoseChannel *pchan; - ApplyPose(); - bPoseChannel *pchan= get_pose_channel(par_arma->pose, bone->name); + VerifyPose(); + pchan = get_pose_channel(m_pose, bone->name); if(pchan) { matrix.setValue(&pchan->pose_mat[0][0]); return true; } + return false; } Modified: branches/apricot/source/gameengine/Converter/BL_ArmatureObject.h =================================================================== --- branches/apricot/source/gameengine/Converter/BL_ArmatureObject.h 2008-08-26 17:09:17 UTC (rev 16261) +++ branches/apricot/source/gameengine/Converter/BL_ArmatureObject.h 2008-08-26 17:38:39 UTC (rev 16262) @@ -59,7 +59,10 @@ void GetMRDPose(struct bPose **pose); void GetPose(struct bPose **pose); void SetPose (struct bPose *pose); + void ApplyPose(); + bool VerifyPose(); + bool SetActiveAction(class BL_ActionActuator *act, short priority, double curtime); struct bArmature * GetArmature() { return m_armature; } @@ -79,13 +82,11 @@ Object *m_objArma; struct bArmature *m_armature; struct bPose *m_pose; - struct bPose *m_mrdPose; double m_lastframe; class BL_ActionActuator *m_activeAct; short m_activePriority; double m_lastapplyframe; - struct bPose *m_lastapplypose; }; #endif Modified: branches/apricot/source/gameengine/Converter/BL_SkinDeformer.cpp =================================================================== --- branches/apricot/source/gameengine/Converter/BL_SkinDeformer.cpp 2008-08-26 17:09:17 UTC (rev 16261) +++ branches/apricot/source/gameengine/Converter/BL_SkinDeformer.cpp 2008-08-26 17:38:39 UTC (rev 16262) @@ -171,8 +171,6 @@ /* but it requires the blender object pointer... */ Object* par_arma = m_armobj->GetArmatureObject(); - m_armobj->ApplyPose(); - /* store verts locally */ VerifyStorage(); @@ -180,6 +178,8 @@ for (int v =0; v<m_bmesh->totvert; v++) VECCOPY(m_transverts[v], m_bmesh->mvert[v].co); + m_armobj->ApplyPose(); + // save matrix first Mat4CpyMat4(obmat, m_objMesh->obmat); // set reference matrix Modified: branches/apricot/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp =================================================================== --- branches/apricot/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp 2008-08-26 17:09:17 UTC (rev 16261) +++ branches/apricot/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp 2008-08-26 17:38:39 UTC (rev 16262) @@ -199,8 +199,8 @@ darray = NULL; else if(darray->m_vertex.size()+numverts >= RAS_DisplayArray::BUCKET_MAX_VERTEX) darray = NULL; - - break; + else + break; } else darray = NULL; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs