use const for readonly strings and set some functions to static
[blender.git] / source / gameengine / Converter / BL_DeformableGameObject.cpp
index 68a2e41ca4714f6a4e281f508b3678c1b92f712c..9d514e996616653147626fc288373d5b182b403a 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 *****
  */
 
+/** \file gameengine/Converter/BL_DeformableGameObject.cpp
+ *  \ingroup bgeconv
+ */
+
+
 #include "BL_DeformableGameObject.h"
+#include "BL_ShapeDeformer.h"
+#include "BL_ShapeActionActuator.h"
+#include "RAS_MaterialBucket.h"
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
 
 BL_DeformableGameObject::~BL_DeformableGameObject()
 {
@@ -39,24 +42,75 @@ BL_DeformableGameObject::~BL_DeformableGameObject()
                delete m_pDeformer;             //      __NLA : Temporary until we decide where to put this
 }
 
-void   BL_DeformableGameObject::ProcessReplica(KX_GameObject* replica)
+void BL_DeformableGameObject::ProcessReplica()
 {
-       KX_GameObject::ProcessReplica(replica);
-
-       if (m_pDeformer){
-               ((BL_DeformableGameObject*)replica)->m_pDeformer = m_pDeformer->GetReplica();
-       }
+       KX_GameObject::ProcessReplica();
 
+       if (m_pDeformer)
+               m_pDeformer= (BL_MeshDeformer*)m_pDeformer->GetReplica();
 }
 
 CValue*                BL_DeformableGameObject::GetReplica()
 {
 
        BL_DeformableGameObject* replica = new BL_DeformableGameObject(*this);//m_float,GetName());
+       replica->ProcessReplica();
+       return replica;
+}
+
+bool BL_DeformableGameObject::SetActiveAction(BL_ShapeActionActuator *act, short priority, double curtime)
+{
+       if (curtime != m_lastframe){
+               m_activePriority = 9999;
+               m_lastframe= curtime;
+               m_activeAct = NULL;
+       }
+
+       if (priority<=m_activePriority)
+       {
+               if (m_activeAct && (m_activeAct!=act))
+                       m_activeAct->SetBlendTime(0.0f);        /* Reset the blend timer */
+               m_activeAct = act;
+               m_activePriority = priority;
+               m_lastframe = curtime;
        
-       // this will copy properties and so on...
-       CValue::AddDataToReplica(replica);
+               return true;
+       }
+       else{
+               act->SetBlendTime(0.0f);
+               return false;
+       }
+}
 
-       ProcessReplica(replica);
-       return replica;
+bool BL_DeformableGameObject::GetShape(vector<float> &shape)
+{
+       shape.clear();
+       BL_ShapeDeformer* shape_deformer = dynamic_cast<BL_ShapeDeformer*>(m_pDeformer);
+       if (shape_deformer)
+       {
+               // this check is normally superfluous: a shape deformer can only be created if the mesh
+               // has relative keys
+               Key* key = shape_deformer->GetKey();
+               if (key && key->type==KEY_RELATIVE) 
+               {
+                       KeyBlock *kb;
+                       for (kb = (KeyBlock*)key->block.first; kb; kb = (KeyBlock*)kb->next)
+                       {
+                               shape.push_back(kb->curval);
+                       }
+               }
+       }
+       return !shape.empty();
 }
+
+void BL_DeformableGameObject::SetDeformer(class RAS_Deformer* deformer)
+{
+       m_pDeformer = deformer;
+
+       SG_QList::iterator<RAS_MeshSlot> mit(m_meshSlots);
+       for(mit.begin(); !mit.end(); ++mit)
+       {
+               (*mit)->SetDeformer(deformer);
+       }
+}
+