Revision: 23238
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23238
Author:   ben2610
Date:     2009-09-15 11:25:58 +0200 (Tue, 15 Sep 2009)

Log Message:
-----------
BGE: fix blending bugs in 2.5

Blending was based on flags that are not set anymore by
the 2.5 animation system. Apply blending on all channels
unconditionally (will also fix bug #18643). Fix bug with
blending disabled when more than one action plays at the
same time (blending is not working well on more than one
action at a time though). Fix bug with pose at the start
of the frame not correctly saved in case a high priority
action overwrites a previous low priority action (make
effect of actions independent of order)

These fixes will be merged with trunk when the itasc
branch is merged. 

Modified Paths:
--------------
    branches/itasc/source/gameengine/Converter/BL_ActionActuator.cpp
    branches/itasc/source/gameengine/Converter/BL_ArmatureObject.cpp

Modified: branches/itasc/source/gameengine/Converter/BL_ActionActuator.cpp
===================================================================
--- branches/itasc/source/gameengine/Converter/BL_ActionActuator.cpp    
2009-09-15 03:54:13 UTC (rev 23237)
+++ branches/itasc/source/gameengine/Converter/BL_ActionActuator.cpp    
2009-09-15 09:25:58 UTC (rev 23238)
@@ -571,7 +571,6 @@
                return NULL;
        }
        
-       pchan->flag |= POSE_ROT|POSE_LOC|POSE_SIZE;
        Py_RETURN_NONE;
 }
 

Modified: branches/itasc/source/gameengine/Converter/BL_ArmatureObject.cpp
===================================================================
--- branches/itasc/source/gameengine/Converter/BL_ArmatureObject.cpp    
2009-09-15 03:54:13 UTC (rev 23237)
+++ branches/itasc/source/gameengine/Converter/BL_ArmatureObject.cpp    
2009-09-15 09:25:58 UTC (rev 23238)
@@ -150,41 +150,32 @@
        
        schan= (bPoseChannel*)src->chanbase.first;
        for (dchan = (bPoseChannel*)dst->chanbase.first; dchan; 
dchan=(bPoseChannel*)dchan->next, schan= (bPoseChannel*)schan->next){
-               if (schan->flag & (POSE_ROT|POSE_LOC|POSE_SIZE)) {
-                       /* replaced quat->matrix->quat conversion with decent 
quaternion interpol (ton) */
+               // always blend on all channels since we don't know which one 
has been set
+               /* quat interpolation done separate */
+               if (schan->rotmode == PCHAN_ROT_QUAT) {
+                       float dquat[4], squat[4];
                        
-                       /* Do the transformation blend */
-                       if (schan->flag & POSE_ROT) {
-                               /* quat interpolation done separate */
-                               if (schan->rotmode == PCHAN_ROT_QUAT) {
-                                       float dquat[4], squat[4];
-                                       
-                                       QUATCOPY(dquat, dchan->quat);
-                                       QUATCOPY(squat, schan->quat);
-                                       if (mode==ACTSTRIPMODE_BLEND)
-                                               QuatInterpol(dchan->quat, 
dquat, squat, srcweight);
-                                       else {
-                                               QuatMulFac(squat, srcweight);
-                                               QuatMul(dchan->quat, dquat, 
squat);
-                                       }
-                                       
-                                       NormalQuat(dchan->quat);
-                               }
+                       QUATCOPY(dquat, dchan->quat);
+                       QUATCOPY(squat, schan->quat);
+                       if (mode==ACTSTRIPMODE_BLEND)
+                               QuatInterpol(dchan->quat, dquat, squat, 
srcweight);
+                       else {
+                               QuatMulFac(squat, srcweight);
+                               QuatMul(dchan->quat, dquat, squat);
                        }
+                       
+                       NormalQuat(dchan->quat);
+               }
 
-                       for (i=0; i<3; i++) {
-                               /* blending for loc and scale are pretty 
self-explanatory... */
-                               if (schan->flag & POSE_LOC)
-                                       dchan->loc[i] = 
(dchan->loc[i]*dstweight) + (schan->loc[i]*srcweight);
-                               if (schan->flag & POSE_SIZE)
-                                       dchan->size[i] = 1.0f + 
((dchan->size[i]-1.0f)*dstweight) + ((schan->size[i]-1.0f)*srcweight);
-                               
-                               /* euler-rotation interpolation done here 
instead... */
-                               // FIXME: are these results decent?
-                               if ((schan->flag & POSE_ROT) && 
(schan->rotmode))
-                                       dchan->eul[i] = 
(dchan->eul[i]*dstweight) + (schan->eul[i]*srcweight);
-                       }
-                       dchan->flag |= schan->flag;
+               for (i=0; i<3; i++) {
+                       /* blending for loc and scale are pretty 
self-explanatory... */
+                       dchan->loc[i] = (dchan->loc[i]*dstweight) + 
(schan->loc[i]*srcweight);
+                       dchan->size[i] = 1.0f + 
((dchan->size[i]-1.0f)*dstweight) + ((schan->size[i]-1.0f)*srcweight);
+                       
+                       /* euler-rotation interpolation done here instead... */
+                       // FIXME: are these results decent?
+                       if (schan->rotmode)
+                               dchan->eul[i] = (dchan->eul[i]*dstweight) + 
(schan->eul[i]*srcweight);
                }
                for(dcon= (bConstraint*)dchan->constraints.first, scon= 
(bConstraint*)schan->constraints.first; dcon && scon; dcon= 
(bConstraint*)dcon->next, scon= (bConstraint*)scon->next) {
                        /* no 'add' option for constraint blending */
@@ -298,6 +289,8 @@
        }
        if (m_pose)
                game_free_pose(m_pose);
+       if (m_framePose)
+               game_free_pose(m_framePose);
 }
 
 
@@ -544,18 +537,20 @@
                m_lastframe= curtime;
                m_activeAct = NULL;
                // remember the pose at the start of the frame
-               m_framePose = m_pose;
+               GetPose(&m_framePose);
        }
 
        if (act) 
        {
                if (priority<=m_activePriority)
                {
-                       if (priority<m_activePriority)
+                       if (priority<m_activePriority) {
                                // this action overwrites the previous ones, 
start from initial pose to cancel their effects
-                               m_pose = m_framePose;
-                       if (m_activeAct && (m_activeAct!=act))
-                               m_activeAct->SetBlendTime(0.0); /* Reset the 
blend timer */
+                               //SetPose(m_framePose);
+                               if (m_activeAct && (m_activeAct!=act))
+                                       /* Reset the blend timer since this new 
action cancels the old one */
+                                       m_activeAct->SetBlendTime(0.0); 
+                       }
                        m_activeAct = act;
                        m_activePriority = priority;
                        m_lastframe = curtime;


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to