Revision: 15266
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15266
Author:   blendix
Date:     2008-06-18 13:16:40 +0200 (Wed, 18 Jun 2008)

Log Message:
-----------
Apricot Branch: missed some files in last commit.

Added Paths:
-----------
    branches/apricot/source/gameengine/Converter/BL_ShapeActionActuator.cpp
    branches/apricot/source/gameengine/Converter/BL_ShapeActionActuator.h
    branches/apricot/source/gameengine/Converter/BL_ShapeDeformer.cpp
    branches/apricot/source/gameengine/Converter/BL_ShapeDeformer.h

Added: branches/apricot/source/gameengine/Converter/BL_ShapeActionActuator.cpp
===================================================================
--- branches/apricot/source/gameengine/Converter/BL_ShapeActionActuator.cpp     
                        (rev 0)
+++ branches/apricot/source/gameengine/Converter/BL_ShapeActionActuator.cpp     
2008-06-18 11:16:40 UTC (rev 15266)
@@ -0,0 +1,797 @@
+/**
+* $Id: BL_ShapeActionActuator.cpp 15261 2008-06-18 07:03:47Z ben2610 $
+*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+*/
+
+#if defined (__sgi)
+#include <math.h>
+#else
+#include <cmath>
+#endif
+
+#include "SCA_LogicManager.h"
+#include "BL_ShapeActionActuator.h"
+#include "BL_ActionActuator.h"
+#include "BL_ShapeDeformer.h"
+#include "KX_GameObject.h"
+#include "STR_HashedString.h"
+#include "DNA_action_types.h"
+#include "DNA_nla_types.h"
+#include "DNA_actuator_types.h"
+#include "BKE_action.h"
+#include "DNA_armature_types.h"
+#include "MEM_guardedalloc.h"
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "MT_Matrix4x4.h"
+#include "BKE_utildefines.h"
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+BL_ShapeActionActuator::~BL_ShapeActionActuator()
+{
+}
+
+void BL_ShapeActionActuator::ProcessReplica()
+{
+       m_localtime=m_startframe;
+       m_lastUpdate=-1;
+}
+
+void BL_ShapeActionActuator::SetBlendTime (float newtime)
+{
+       m_blendframe = newtime;
+}
+
+CValue* BL_ShapeActionActuator::GetReplica() 
+{
+       BL_ShapeActionActuator* replica = new 
BL_ShapeActionActuator(*this);//m_float,GetName());
+       replica->ProcessReplica();
+       
+       // this will copy properties and so on...
+       CValue::AddDataToReplica(replica);
+       return replica;
+}
+
+bool BL_ShapeActionActuator::ClampLocalTime()
+{
+       if (m_startframe < m_endframe)  {
+               if (m_localtime < m_startframe)
+               {
+                       m_localtime = m_startframe;
+                       return true;
+               } 
+               else if (m_localtime > m_endframe)
+               {
+                       m_localtime = m_endframe;
+                       return true;
+               }
+       } else {
+               if (m_localtime > m_startframe)
+               {
+                       m_localtime = m_startframe;
+                       return true;
+               }
+               else if (m_localtime < m_endframe)
+               {
+                       m_localtime = m_endframe;
+                       return true;
+               }
+       }
+       return false;
+}
+
+void BL_ShapeActionActuator::SetStartTime(float curtime)
+{
+       float direction = m_startframe < m_endframe ? 1.0 : -1.0;
+       
+       if (!(m_flag & ACT_FLAG_REVERSE))
+               m_starttime = curtime - direction*(m_localtime - 
m_startframe)/KX_KetsjiEngine::GetAnimFrameRate();
+       else
+               m_starttime = curtime - direction*(m_endframe - 
m_localtime)/KX_KetsjiEngine::GetAnimFrameRate();
+}
+
+void BL_ShapeActionActuator::SetLocalTime(float curtime)
+{
+       float delta_time = (curtime - 
m_starttime)*KX_KetsjiEngine::GetAnimFrameRate();
+       
+       if (m_endframe < m_startframe)
+               delta_time = -delta_time;
+
+       if (!(m_flag & ACT_FLAG_REVERSE))
+               m_localtime = m_startframe + delta_time;
+       else
+               m_localtime = m_endframe - delta_time;
+}
+
+void BL_ShapeActionActuator::BlendShape(Key* key, float srcweight)
+{
+       vector<float>::const_iterator it;
+       float dstweight;
+       int i;
+       KeyBlock *kb;
+       
+       dstweight = 1.0F - srcweight;
+
+       for (it=m_blendshape.begin(), kb = (KeyBlock*)key->block.first; 
+                kb && it != m_blendshape.end(); 
+                kb = (KeyBlock*)kb->next, it++) {
+               kb->curval = kb->curval * dstweight + (*it) * srcweight;
+       }
+}
+
+bool BL_ShapeActionActuator::Update(double curtime, bool frame)
+{
+       bool bNegativeEvent = false;
+       bool bPositiveEvent = false;
+       bool keepgoing = true;
+       bool wrap = false;
+       bool apply=true;
+       int     priority;
+       float newweight;
+       
+       // result = true if animation has to be continued, false if animation 
stops
+       // maybe there are events for us in the queue !
+       if (frame)
+       {
+               for (vector<CValue*>::iterator i=m_events.begin(); 
!(i==m_events.end());i++)
+               {
+                       if ((*i)->GetNumber() == 0.0f)
+                               bNegativeEvent = true;
+                       else
+                               bPositiveEvent= true;
+                       (*i)->Release();
+               
+               }
+               m_events.clear();
+               
+               if (bPositiveEvent)
+                       m_flag |= ACT_FLAG_ACTIVE;
+               
+               if (bNegativeEvent)
+               {
+                       if (!(m_flag & ACT_FLAG_ACTIVE))
+                               return false;
+                       m_flag &= ~ACT_FLAG_ACTIVE;
+               }
+       }
+       
+       /*      This action can only be attached to a deform object */
+       BL_DeformableGameObject *obj = (BL_DeformableGameObject*)GetParent();
+       float length = m_endframe - m_startframe;
+       
+       priority = m_priority;
+       
+       /* Determine pre-incrementation behaviour and set appropriate flags */
+       switch (m_playtype){
+       case ACT_ACTION_MOTION:
+               if (bNegativeEvent){
+                       keepgoing=false;
+                       apply=false;
+               };
+               break;
+       case ACT_ACTION_FROM_PROP:
+               if (bNegativeEvent){
+                       apply=false;
+                       keepgoing=false;
+               }
+               break;
+       case ACT_ACTION_LOOP_END:
+               if (bPositiveEvent){
+                       if (!(m_flag & ACT_FLAG_LOCKINPUT)){
+                               m_flag &= ~ACT_FLAG_KEYUP;
+                               m_flag &= ~ACT_FLAG_REVERSE;
+                               m_flag |= ACT_FLAG_LOCKINPUT;
+                               m_localtime = m_startframe;
+                               m_starttime = curtime;
+                       }
+               }
+               if (bNegativeEvent){
+                       m_flag |= ACT_FLAG_KEYUP;
+               }
+               break;
+       case ACT_ACTION_LOOP_STOP:
+               if (bPositiveEvent){
+                       if (!(m_flag & ACT_FLAG_LOCKINPUT)){
+                               m_flag &= ~ACT_FLAG_REVERSE;
+                               m_flag &= ~ACT_FLAG_KEYUP;
+                               m_flag |= ACT_FLAG_LOCKINPUT;
+                               SetStartTime(curtime);
+                       }
+               }
+               if (bNegativeEvent){
+                       m_flag |= ACT_FLAG_KEYUP;
+                       m_flag &= ~ACT_FLAG_LOCKINPUT;
+                       keepgoing=false;
+                       apply=false;
+               }
+               break;
+       case ACT_ACTION_FLIPPER:
+               if (bPositiveEvent){
+                       if (!(m_flag & ACT_FLAG_LOCKINPUT)){
+                               m_flag &= ~ACT_FLAG_REVERSE;
+                               m_flag |= ACT_FLAG_LOCKINPUT;
+                               SetStartTime(curtime);
+                       }
+               }
+               else if (bNegativeEvent){
+                       m_flag |= ACT_FLAG_REVERSE;
+                       m_flag &= ~ACT_FLAG_LOCKINPUT;
+                       SetStartTime(curtime);
+               }
+               break;
+       case ACT_ACTION_PLAY:
+               if (bPositiveEvent){
+                       if (!(m_flag & ACT_FLAG_LOCKINPUT)){
+                               m_flag &= ~ACT_FLAG_REVERSE;
+                               m_localtime = m_starttime;
+                               m_starttime = curtime;
+                               m_flag |= ACT_FLAG_LOCKINPUT;
+                       }
+               }
+               break;
+       default:
+               break;
+       }
+       
+       /* Perform increment */
+       if (keepgoing){
+               if (m_playtype == ACT_ACTION_MOTION){
+                       MT_Point3       newpos;
+                       MT_Point3       deltapos;
+                       
+                       newpos = obj->NodeGetWorldPosition();
+                       
+                       /* Find displacement */
+                       deltapos = newpos-m_lastpos;
+                       m_localtime += (length/m_stridelength) * 
deltapos.length();
+                       m_lastpos = newpos;
+               }
+               else{
+                       SetLocalTime(curtime);
+               }
+       }
+       
+       /* Check if a wrapping response is needed */
+       if (length){
+               if (m_localtime < m_startframe || m_localtime > m_endframe)
+               {
+                       m_localtime = m_startframe + fmod(m_localtime, length);
+                       wrap = true;
+               }
+       }
+       else
+               m_localtime = m_startframe;
+       
+       /* Perform post-increment tasks */
+       switch (m_playtype){
+       case ACT_ACTION_FROM_PROP:
+               {
+                       CValue* propval = GetParent()->GetProperty(m_propname);
+                       if (propval)
+                               m_localtime = propval->GetNumber();
+                       
+                       if (bNegativeEvent){
+                               keepgoing=false;
+                       }
+               }
+               break;
+       case ACT_ACTION_MOTION:
+               break;
+       case ACT_ACTION_LOOP_STOP:
+               break;
+       case ACT_ACTION_FLIPPER:
+               if (wrap){
+                       if (!(m_flag & ACT_FLAG_REVERSE)){
+                               m_localtime=m_endframe;
+                               //keepgoing = false;
+                       }
+                       else {
+                               m_localtime=m_startframe;
+                               keepgoing = false;
+                       }
+               }
+               break;
+       case ACT_ACTION_LOOP_END:
+               if (wrap){
+                       if (m_flag & ACT_FLAG_KEYUP){
+                               keepgoing = false;
+                               m_localtime = m_endframe;
+                               m_flag &= ~ACT_FLAG_LOCKINPUT;
+                       }
+                       SetStartTime(curtime);
+               }
+               break;
+       case ACT_ACTION_PLAY:
+               if (wrap){
+                       m_localtime = m_endframe;
+                       keepgoing = false;
+                       m_flag &= ~ACT_FLAG_LOCKINPUT;
+               }
+               break;
+       default:
+               keepgoing = false;
+               break;
+       }
+       
+       
+       if (bNegativeEvent)
+               m_blendframe=0.0f;
+       
+       /* Apply the pose if necessary*/
+       if (apply) {
+
+               /* Priority test */
+               if (obj->SetActiveAction(this, priority, curtime)){
+                       Key *key = obj->GetKey();
+
+                       if (!key) {
+                               // this could happen if the mesh was changed in 
the middle of an action
+                               // and the new mesh has no key, stop the action
+                               keepgoing = false;
+                       }
+                       else {
+                               ListBase tchanbase= {NULL, NULL};
+                       
+                               if (m_blendin && m_blendframe==0.0f){
+                                       // this is the start of the blending, 
remember the startup shape
+                                       obj->GetShape(m_blendshape);
+                                       m_blendstart = curtime;
+                               }
+                               // only interested in shape channel
+                               extract_ipochannels_from_action(&tchanbase, 
&key->id, m_action, "Shape", m_localtime);
+               
+                               if (!execute_ipochannels(&tchanbase)) {
+                                       // no update, this is possible if 
action does not match the keys, stop the action
+                                       keepgoing = false;
+                               } 
+                               else {
+                                       // the key have changed, apply blending 
if needed
+                                       if (m_blendin && 
(m_blendframe<m_blendin)){
+                                               newweight = 
(m_blendframe/(float)m_blendin);
+
+                                               BlendShape(key, 1.0f - 
newweight);
+
+                                               /* Increment current blending 
percentage */
+                                               m_blendframe = (curtime - 
m_blendstart)*KX_KetsjiEngine::GetAnimFrameRate();
+                                               if (m_blendframe>m_blendin)
+                                                       m_blendframe = 
m_blendin;
+                                       }
+                                       m_lastUpdate = m_localtime;
+                               }
+                               BLI_freelistN(&tchanbase);
+                       }
+               }
+               else{
+                       m_blendframe = 0.0f;
+               }
+       }
+       
+       if (!keepgoing){
+               m_blendframe = 0.0f;
+       }
+       return keepgoing;
+};
+
+/* ------------------------------------------------------------------------- */
+/* Python functions                                                          */
+/* ------------------------------------------------------------------------- */
+
+/* Integration hooks ------------------------------------------------------- */
+
+PyTypeObject BL_ShapeActionActuator::Type = {
+       PyObject_HEAD_INIT(&PyType_Type)
+               0,
+               "BL_ShapeActionActuator",
+               sizeof(BL_ShapeActionActuator),
+               0,
+               PyDestructor,
+               0,
+               __getattr,
+               __setattr,
+               0, //&MyPyCompare,
+               __repr,
+               0, //&cvalue_as_number,
+               0,
+               0,

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to