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

Reply via email to