BGE Animations: Shape drivers are now working again.
authorMitchell Stokes <mogurijin@gmail.com>
Thu, 30 Jun 2011 19:33:13 +0000 (19:33 +0000)
committerMitchell Stokes <mogurijin@gmail.com>
Thu, 30 Jun 2011 19:33:13 +0000 (19:33 +0000)
source/gameengine/Converter/BL_ShapeDeformer.cpp
source/gameengine/Converter/BL_ShapeDeformer.h

index c651d457cd9869ecf9456020cb4b50ce6947b42d..a9c04a9230d51a6f4d63e5decd41db88e61a21e3 100644 (file)
 #include "RAS_MeshObject.h"
 
 //#include "BL_ArmatureController.h"
+#include "DNA_anim_types.h"
 #include "DNA_armature_types.h"
 #include "DNA_action_types.h"
 #include "DNA_key_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
-#include "DNA_ipo_types.h"
-#include "DNA_curve_types.h"
 #include "BKE_armature.h"
 #include "BKE_action.h"
 #include "BKE_key.h"
@@ -59,6 +58,7 @@
 
 extern "C"{
        #include "BKE_lattice.h"
+       #include "BKE_animsys.h"
 }
  
 
@@ -73,7 +73,8 @@ BL_ShapeDeformer::BL_ShapeDeformer(BL_DeformableGameObject *gameobj,
                     RAS_MeshObject *mesh)
                                :       
                                        BL_SkinDeformer(gameobj,bmeshobj, mesh),
-                                       m_lastShapeUpdate(-1)
+                                       m_lastShapeUpdate(-1),
+                                       m_useShapeDrivers(false)
 {
        m_key = m_bmesh->key;
        m_bmesh->key = copy_key(m_key);
@@ -89,7 +90,8 @@ BL_ShapeDeformer::BL_ShapeDeformer(BL_DeformableGameObject *gameobj,
                                BL_ArmatureObject* arma)
                                :
                                        BL_SkinDeformer(gameobj, bmeshobj_old, bmeshobj_new, mesh, release_object, recalc_normal, arma),
-                                       m_lastShapeUpdate(-1)
+                                       m_lastShapeUpdate(-1),
+                                       m_useShapeDrivers(false)
 {
        m_key = m_bmesh->key;
        m_bmesh->key = copy_key(m_key);
@@ -121,45 +123,23 @@ void BL_ShapeDeformer::ProcessReplica()
 
 bool BL_ShapeDeformer::LoadShapeDrivers(Object* arma)
 {
-       IpoCurve *icu;
-
-       m_shapeDrivers.clear();
-       // check if this mesh has armature driven shape keys
-       if (m_bmesh->key && m_bmesh->key->ipo) {
-               for(icu= (IpoCurve*)m_bmesh->key->ipo->curve.first; icu; icu= (IpoCurve*)icu->next) {
-                       if(icu->driver && 
-                               (icu->flag & IPO_MUTE) == 0 &&
-                               icu->driver->type == IPO_DRIVER_TYPE_NORMAL &&
-                               icu->driver->ob == arma &&
-                               icu->driver->blocktype == ID_AR) {
-                               // this shape key ipo curve has a driver on the parent armature
-                               // record this curve in the shape deformer so that the corresponding
-                               m_shapeDrivers.push_back(icu);
-                       }
-               }
-       }
-       return !m_shapeDrivers.empty();
+       // This used to check if we had drivers from this armature,
+       // now we just assume we want to use shape drivers
+       // and let the animsys handle things.
+       m_useShapeDrivers = true;
+
+       return true;
 }
 
 bool BL_ShapeDeformer::ExecuteShapeDrivers(void)
 {
-       if (!m_shapeDrivers.empty() && PoseUpdated()) {
-               vector<IpoCurve*>::iterator it;
-//             void *poin;
-//             int type;
-
+       if (m_useShapeDrivers && PoseUpdated()) {
                // the shape drivers use the bone matrix as input. Must 
                // update the matrix now
                m_armobj->ApplyPose();
 
-               for (it=m_shapeDrivers.begin(); it!=m_shapeDrivers.end(); it++) {
-                       // no need to set a specific time: this curve has a driver
-                       // XXX IpoCurve *icu = *it;
-                       //calc_icu(icu, 1.0f);
-                       //poin = get_ipo_poin((ID*)m_bmesh->key, icu, &type);
-                       //if (poin) 
-                       //      write_ipo_poin(poin, type, icu->curval);
-               }
+               // We don't need an actual time, just use 0
+               BKE_animsys_evaluate_animdata(&GetKey()->id, GetKey()->adt, 0.f, ADT_RECALC_DRIVERS);
 
                ForceUpdate();
                m_armobj->RestorePose();
index 7d33204fd4c82fc862b33ff5eb28873dd33362c0..655cc9d7aebc9d6e049597356ca5dd2ef2133e59 100644 (file)
@@ -42,8 +42,6 @@
 #include "BL_DeformableGameObject.h"
 #include <vector>
 
-struct IpoCurve;
-
 class BL_ShapeDeformer : public BL_SkinDeformer  
 {
 public:
@@ -77,9 +75,9 @@ public:
        };
 
 protected:
-       vector<IpoCurve*>                m_shapeDrivers;
-       double                                   m_lastShapeUpdate;
-       struct Key*                              m_key;
+       bool                    m_useShapeDrivers;      
+       double                  m_lastShapeUpdate;
+       struct Key*             m_key;
 
 
 #ifdef WITH_CXX_GUARDEDALLOC