use const for readonly strings and set some functions to static
[blender.git] / source / gameengine / Converter / BL_ShapeDeformer.cpp
index 20ca7f07f2b19984ec981064901b97f0c9fc9719..fb0a86d60846b40779f04987a7c5df0cd3c36b38 100644 (file)
@@ -1,6 +1,4 @@
-/**
- * $Id$
- *
+/*
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
@@ -15,7 +13,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
  * All rights reserved.
  * ***** END GPL LICENSE BLOCK *****
  */
 
-#ifdef WIN32
+/** \file gameengine/Converter/BL_ShapeDeformer.cpp
+ *  \ingroup bgeconv
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
 #pragma warning (disable : 4786)
 #endif //WIN32
 
 #include "MEM_guardedalloc.h"
 #include "BL_ShapeDeformer.h"
-#include "GEN_Map.h"
+#include "CTR_Map.h"
 #include "STR_HashedString.h"
 #include "RAS_IPolygonMaterial.h"
-#include "BL_SkinMeshObject.h"
+#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"
 
 extern "C"{
        #include "BKE_lattice.h"
+       #include "BKE_animsys.h"
 }
- #include "BKE_utildefines.h"
 
 #include "BLI_blenlib.h"
-#include "BLI_arithb.h"
+#include "BLI_math.h"
 
 #define __NLA_DEFNORMALS
 //#undef __NLA_DEFNORMALS
 
+BL_ShapeDeformer::BL_ShapeDeformer(BL_DeformableGameObject *gameobj,
+                                   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);
+};
+
+/* this second constructor is needed for making a mesh deformable on the fly. */
+BL_ShapeDeformer::BL_ShapeDeformer(BL_DeformableGameObject *gameobj,
+                               Object *bmeshobj_old,
+                               Object *bmeshobj_new,
+                               RAS_MeshObject *mesh,
+                               bool release_object,
+                               bool recalc_normal,
+                               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);
+};
 
 BL_ShapeDeformer::~BL_ShapeDeformer()
 {
+       if (m_key && m_bmesh->key)
+       {
+               free_key(m_bmesh->key);
+               m_bmesh->key = m_key;
+       }
 };
 
 RAS_Deformer *BL_ShapeDeformer::GetReplica()
@@ -85,45 +121,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();
@@ -148,10 +162,13 @@ bool BL_ShapeDeformer::Update(void)
                // make sure the vertex weight cache is in line with this object
                m_pMeshObject->CheckWeightCache(blendobj);
 
-               /* we will blend the key directly in mvert array: it is used by armature as the start position */
+               /* we will blend the key directly in m_transverts array: it is used by armature as the start position */
                /* m_bmesh->key can be NULL in case of Modifier deformer */
                if (m_bmesh->key) {
-                       do_rel_key(0, m_bmesh->totvert, m_bmesh->totvert, (char *)m_bmesh->mvert->co, m_bmesh->key, 0);
+                       /* store verts locally */
+                       VerifyStorage();
+
+                       do_rel_key(0, m_bmesh->totvert, m_bmesh->totvert, (char *)(float *)m_transverts, m_bmesh->key, NULL, 0); /* last arg is ignored */
                        m_bDynamic = true;
                }
 
@@ -167,18 +184,12 @@ bool BL_ShapeDeformer::Update(void)
                bShapeUpdate = true;
        }
        // check for armature deform
-       bSkinUpdate = BL_SkinDeformer::Update();
+       bSkinUpdate = BL_SkinDeformer::UpdateInternal(bShapeUpdate && m_bDynamic);
 
        // non dynamic deformer = Modifer without armature and shape keys, no need to create storage
        if (!bSkinUpdate && bShapeUpdate && m_bDynamic) {
-               // this means that there is no armature, we still need to copy the vertex to m_transverts
-               // and update the normal (was not done after shape key calculation)
-
-               /* store verts locally */
-               VerifyStorage();
-
-               for (int v =0; v<m_bmesh->totvert; v++)
-                       VECCOPY(m_transverts[v], m_bmesh->mvert[v].co);
+               // this means that there is no armature, we still need to 
+               // update the normal (was not done after shape key calculation)
 
 #ifdef __NLA_DEFNORMALS
                if (m_recalcNormal)
@@ -188,3 +199,13 @@ bool BL_ShapeDeformer::Update(void)
        }
        return bSkinUpdate;
 }
+
+Key *BL_ShapeDeformer::GetKey()
+{
+       return m_bmesh->key;
+}
+
+void BL_ShapeDeformer::SetKey(Key *key)
+{
+       m_bmesh->key = key;
+}