code cleanup: function naming, use BKE_*type* prefix.
[blender.git] / source / gameengine / Converter / BL_ShapeDeformer.cpp
index c651d457cd9869ecf9456020cb4b50ce6947b42d..b93d731c5e6bfcdac49011a5a9ffa80b62886df6 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id$
- *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
 #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_global.h"
+#include "BKE_main.h"
 #include "BKE_key.h"
 #include "BKE_ipo.h"
 #include "MT_Point3.h"
 
 extern "C"{
        #include "BKE_lattice.h"
+       #include "BKE_animsys.h"
 }
  
 
@@ -69,14 +69,15 @@ extern "C"{
 //#undef __NLA_DEFNORMALS
 
 BL_ShapeDeformer::BL_ShapeDeformer(BL_DeformableGameObject *gameobj,
-                    Object *bmeshobj,
-                    RAS_MeshObject *mesh)
-                               :       
-                                       BL_SkinDeformer(gameobj,bmeshobj, mesh),
-                                       m_lastShapeUpdate(-1)
+                                   Object *bmeshobj,
+                                   RAS_MeshObject *mesh)
+    :
+      BL_SkinDeformer(gameobj,bmeshobj, mesh),
+      m_useShapeDrivers(false),
+      m_lastShapeUpdate(-1)
 {
        m_key = m_bmesh->key;
-       m_bmesh->key = copy_key(m_key);
+       m_bmesh->key = BKE_key_copy(m_key);
 };
 
 /* this second constructor is needed for making a mesh deformable on the fly. */
@@ -89,18 +90,22 @@ BL_ShapeDeformer::BL_ShapeDeformer(BL_DeformableGameObject *gameobj,
                                BL_ArmatureObject* arma)
                                :
                                        BL_SkinDeformer(gameobj, bmeshobj_old, bmeshobj_new, mesh, release_object, recalc_normal, arma),
+                                       m_useShapeDrivers(false),
                                        m_lastShapeUpdate(-1)
 {
        m_key = m_bmesh->key;
-       m_bmesh->key = copy_key(m_key);
+       m_bmesh->key = BKE_key_copy(m_key);
 };
 
 BL_ShapeDeformer::~BL_ShapeDeformer()
 {
-       if (m_key && m_bmesh->key)
+       if (m_key && m_bmesh->key && m_key != m_bmesh->key)
        {
-               free_key(m_bmesh->key);
+               BKE_key_free(m_bmesh->key);
+               BLI_remlink_safe(&G.main->key, m_bmesh->key);
+               MEM_freeN(m_bmesh->key);
                m_bmesh->key = m_key;
+               m_key = NULL;
        }
 };
 
@@ -121,45 +126,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(NULL, &GetKey()->id, GetKey()->adt, 0.f, ADT_RECALC_DRIVERS);
 
                ForceUpdate();
                m_armobj->RestorePose();