[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38108] branches/soc-2011-pepper/source/ gameengine: BGE Animations: Various fixes and bits of cleanup to get the action actuator to behave more like it did in trunk .
Mitchell Stokes
mogurijin at gmail.com
Tue Jul 5 07:22:03 CEST 2011
Revision: 38108
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38108
Author: moguri
Date: 2011-07-05 05:22:02 +0000 (Tue, 05 Jul 2011)
Log Message:
-----------
BGE Animations: Various fixes and bits of cleanup to get the action actuator to behave more like it did in trunk. The Pepper version is still more sensitive to pulses than the trunk version, but this is more accurate. I might try to address this, but I'm not sure.
Modified Paths:
--------------
branches/soc-2011-pepper/source/gameengine/Converter/BL_ActionActuator.cpp
branches/soc-2011-pepper/source/gameengine/Converter/BL_ActionActuator.h
branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.cpp
branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.h
branches/soc-2011-pepper/source/gameengine/Ketsji/BL_ActionManager.cpp
branches/soc-2011-pepper/source/gameengine/Ketsji/BL_ActionManager.h
branches/soc-2011-pepper/source/gameengine/Ketsji/KX_GameObject.cpp
branches/soc-2011-pepper/source/gameengine/Ketsji/KX_GameObject.h
Modified: branches/soc-2011-pepper/source/gameengine/Converter/BL_ActionActuator.cpp
===================================================================
--- branches/soc-2011-pepper/source/gameengine/Converter/BL_ActionActuator.cpp 2011-07-05 03:31:20 UTC (rev 38107)
+++ branches/soc-2011-pepper/source/gameengine/Converter/BL_ActionActuator.cpp 2011-07-05 05:22:02 UTC (rev 38108)
@@ -61,6 +61,49 @@
#include "RNA_define.h"
}
+BL_ActionActuator::BL_ActionActuator(SCA_IObject* gameobj,
+ const STR_String& propname,
+ const STR_String& framepropname,
+ float starttime,
+ float endtime,
+ struct bAction *action,
+ short playtype,
+ short blendin,
+ short priority,
+ short layer,
+ float layer_weight,
+ short ipo_flags,
+ short end_reset,
+ float stride)
+ : SCA_IActuator(gameobj, KX_ACT_ACTION),
+
+ m_lastpos(0, 0, 0),
+ m_blendframe(0),
+ m_flag(0),
+ m_startframe (starttime),
+ m_endframe(endtime) ,
+ m_starttime(0),
+ m_localtime(starttime),
+ m_lastUpdate(-1),
+ m_blendin(blendin),
+ m_blendstart(0),
+ m_stridelength(stride),
+ m_playtype(playtype),
+ m_priority(priority),
+ m_layer(layer),
+ m_layer_weight(layer_weight),
+ m_ipo_flags(ipo_flags),
+ m_pose(NULL),
+ m_blendpose(NULL),
+ m_userpose(NULL),
+ m_action(action),
+ m_propname(propname),
+ m_framepropname(framepropname)
+{
+ if (!end_reset)
+ m_flag |= ACT_FLAG_CONTINUE;
+};
+
BL_ActionActuator::~BL_ActionActuator()
{
if (m_pose)
@@ -92,6 +135,7 @@
return replica;
}
+#if 0
bool BL_ActionActuator::ClampLocalTime()
{
if (m_startframe < m_endframe)
@@ -143,7 +187,7 @@
else
m_localtime = m_endframe - delta_time;
}
-
+#endif
bool BL_ActionActuator::Update(double curtime, bool frame)
{
bool bNegativeEvent = false;
@@ -156,10 +200,6 @@
if (!m_action)
return false;
- // Don't do anything if we're not "active"
- if (!frame)
- return true;
-
// Convert playmode
if (m_playtype == ACT_ACTION_LOOP_END)
play_mode = BL_Action::ACT_MODE_LOOP;
@@ -173,32 +213,56 @@
play_mode = BL_Action::ACT_MODE_PLAY;
start = end = prop->GetNumber();
- m_is_going = false;
}
-
+
+
// Handle events
- bNegativeEvent = m_negevent;
- bPositiveEvent = m_posevent;
- RemoveAllEvents();
+ if (frame)
+ {
+ bNegativeEvent = m_negevent;
+ bPositiveEvent = m_posevent;
+ RemoveAllEvents();
+ }
+
+ if (bPositiveEvent)
+ {
+ if (m_flag & ACT_FLAG_ACTIVE && m_flag & ACT_FLAG_CONTINUE)
+ start = m_localtime = obj->GetActionFrame(m_layer);
- if (!m_is_going && bPositiveEvent)
- {
- m_is_going = true;
- if (obj->PlayAction(m_action->id.name+2, start, end, m_layer, m_priority, m_blendin, play_mode, m_layer_weight, m_ipo_flags) && m_end_reset)
- obj->SetActionFrame(m_layer, m_localtime);
+ if (obj->PlayAction(m_action->id.name+2, start, end, m_layer, m_priority, m_blendin, play_mode, m_layer_weight, m_ipo_flags))
+ {
+ m_flag |= ACT_FLAG_ACTIVE;
+ if (m_flag & ACT_FLAG_CONTINUE)
+ obj->SetActionFrame(m_layer, m_localtime);
+
+ if (m_playtype == ACT_ACTION_PLAY)
+ m_flag |= ACT_FLAG_PLAY_END;
+ else
+ m_flag &= ~ACT_FLAG_PLAY_END;
+ }
+ else
+ return false;
}
- else if (m_is_going && bNegativeEvent)
- {
+ else if ((m_flag & ACT_FLAG_ACTIVE) && bNegativeEvent)
+ {
+ bAction *curr_action = obj->GetCurrentAction(m_layer);
+ if (curr_action && curr_action != m_action)
+ {
+ // Someone changed the action on us, so we wont mess with it
+ // Hopefully there wont be too many problems with two actuators using
+ // the same action...
+ m_flag &= ~ACT_FLAG_ACTIVE;
+ return false;
+ }
+
if (m_playtype == ACT_ACTION_LOOP_STOP)
{
- if (!m_end_reset)
- {
- obj->StopAction(m_layer);
- return false;
- }
-
m_localtime = obj->GetActionFrame(m_layer);
obj->StopAction(m_layer); // Stop the action after getting the frame
+
+ // We're done
+ m_flag &= ~ACT_FLAG_ACTIVE;
+ return false;
}
else if (m_playtype == ACT_ACTION_LOOP_END)
{
@@ -207,7 +271,7 @@
obj->StopAction(m_layer);
obj->PlayAction(m_action->id.name+2, start, end, m_layer, m_priority, 0, BL_Action::ACT_MODE_PLAY, m_layer_weight, m_ipo_flags);
- return true;
+ m_flag |= ACT_FLAG_PLAY_END;
}
else if (m_playtype == ACT_ACTION_FLIPPER)
{
@@ -217,14 +281,12 @@
obj->StopAction(m_layer);
obj->PlayAction(m_action->id.name+2, start, end, m_layer, m_priority, 0, BL_Action::ACT_MODE_PLAY, m_layer_weight, m_ipo_flags);
- return true;
+ m_flag |= ACT_FLAG_PLAY_END;
}
-
- m_is_going = false;
}
// Handle a frame property if it's defined
- if (m_is_going && m_framepropname[0] != 0)
+ if ((m_flag & ACT_FLAG_ACTIVE) && m_framepropname[0] != 0)
{
CValue* oldprop = obj->GetProperty(m_framepropname);
CValue* newval = new CFloatValue(obj->GetActionFrame(m_layer));
@@ -235,10 +297,11 @@
newval->Release();
}
+
// Handle a finished animation
- if (m_is_going && obj->IsActionDone(m_layer))
+ if ((m_flag & ACT_FLAG_PLAY_END) && obj->IsActionDone(m_layer))
{
- m_is_going = false;
+ m_flag &= ~ACT_FLAG_ACTIVE;
obj->StopAction(m_layer);
return false;
}
@@ -740,7 +803,7 @@
KX_PYATTRIBUTE_FLOAT_RW_CHECK("frame", 0, MAXFRAMEF, BL_ActionActuator, m_localtime, CheckFrame),
KX_PYATTRIBUTE_STRING_RW("propName", 0, 31, false, BL_ActionActuator, m_propname),
KX_PYATTRIBUTE_STRING_RW("framePropName", 0, 31, false, BL_ActionActuator, m_framepropname),
- KX_PYATTRIBUTE_BOOL_RW("useContinue", BL_ActionActuator, m_end_reset),
+ KX_PYATTRIBUTE_RW_FUNCTION("useContinue", BL_ActionActuator, pyattr_get_use_continue, pyattr_set_use_continue),
KX_PYATTRIBUTE_FLOAT_RW_CHECK("blendTime", 0, MAXFRAMEF, BL_ActionActuator, m_blendframe, CheckBlendTime),
KX_PYATTRIBUTE_SHORT_RW_CHECK("mode",0,100,false,BL_ActionActuator,m_playtype,CheckType),
{ NULL } //Sentinel
@@ -800,4 +863,22 @@
return ret;
}
+PyObject* BL_ActionActuator::pyattr_get_use_continue(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ BL_ActionActuator* self= static_cast<BL_ActionActuator*>(self_v);
+ return PyBool_FromLong(self->m_flag & ACT_FLAG_CONTINUE);
+}
+
+int BL_ActionActuator::pyattr_set_use_continue(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ BL_ActionActuator* self= static_cast<BL_ActionActuator*>(self_v);
+
+ if (PyObject_IsTrue(value))
+ self->m_flag |= ACT_FLAG_CONTINUE;
+ else
+ self->m_flag &= ~ACT_FLAG_CONTINUE;
+
+ return PY_SET_ATTR_SUCCESS;
+}
+
#endif // WITH_PYTHON
Modified: branches/soc-2011-pepper/source/gameengine/Converter/BL_ActionActuator.h
===================================================================
--- branches/soc-2011-pepper/source/gameengine/Converter/BL_ActionActuator.h 2011-07-05 03:31:20 UTC (rev 38107)
+++ branches/soc-2011-pepper/source/gameengine/Converter/BL_ActionActuator.h 2011-07-05 05:22:02 UTC (rev 38108)
@@ -56,35 +56,8 @@
float layer_weight,
short ipo_flags,
short end_reset,
- float stride)
- : SCA_IActuator(gameobj, KX_ACT_ACTION),
-
- m_lastpos(0, 0, 0),
- m_blendframe(0),
- m_flag(0),
- m_startframe (starttime),
- m_endframe(endtime) ,
- m_starttime(0),
- m_localtime(starttime),
- m_lastUpdate(-1),
- m_blendin(blendin),
- m_blendstart(0),
- m_stridelength(stride),
- m_playtype(playtype),
- m_priority(priority),
- m_layer(layer),
- m_layer_weight(layer_weight),
- m_ipo_flags(ipo_flags),
- m_end_reset(end_reset),
- m_is_going(false),
- m_pose(NULL),
- m_blendpose(NULL),
- m_userpose(NULL),
- m_action(action),
- m_propname(propname),
- m_framepropname(framepropname)
- {
- };
+ float stride);
+
virtual ~BL_ActionActuator();
virtual bool Update(double curtime, bool frame);
virtual CValue* GetReplica();
@@ -103,6 +76,9 @@
static PyObject* pyattr_get_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_channel_names(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_use_continue(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_use_continue(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+
/* attribute check */
static int CheckFrame(void *self, const PyAttributeDef*)
{
@@ -147,9 +123,9 @@
protected:
- void SetStartTime(float curtime);
- void SetLocalTime(float curtime);
- bool ClampLocalTime();
+ //void SetStartTime(float curtime);
+ //void SetLocalTime(float curtime);
+ //bool ClampLocalTime();
MT_Point3 m_lastpos;
float m_blendframe;
@@ -172,8 +148,6 @@
short m_priority;
short m_layer;
short m_ipo_flags;
- bool m_end_reset;
- bool m_is_going;
struct bPose* m_pose;
struct bPose* m_blendpose;
struct bPose* m_userpose;
@@ -183,10 +157,13 @@
};
enum {
- ACT_FLAG_REVERSE = 0x00000001,
- ACT_FLAG_LOCKINPUT = 0x00000002,
- ACT_FLAG_KEYUP = 0x00000004,
- ACT_FLAG_ACTIVE = 0x00000008
+ ACT_FLAG_REVERSE = 1<<0,
+ ACT_FLAG_LOCKINPUT = 1<<1,
+ ACT_FLAG_KEYUP = 1<<2,
+ ACT_FLAG_ACTIVE = 1<<3,
+ ACT_FLAG_CONTINUE = 1<<4,
+ ACT_FLAG_PLAY_END = 1<<5
+
};
#endif
Modified: branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.cpp
===================================================================
--- branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.cpp 2011-07-05 03:31:20 UTC (rev 38107)
+++ branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.cpp 2011-07-05 05:22:02 UTC (rev 38108)
@@ -62,8 +62,7 @@
m_blendinpose(NULL),
m_sg_contr(NULL),
m_ptrrna(NULL),
- m_done(true),
- m_bcalc_local_time(true)
+ m_done(true)
{
if (m_obj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE)
{
@@ -197,6 +196,11 @@
m_sg_contr->SetOption(SG_Controller::SG_CONTR_IPO_LOCAL, m_ipo_flags & ACT_IPOFLAG_LOCAL);
}
+bAction *BL_Action::GetAction()
+{
+ return (IsDone()) ? NULL : m_action;
+}
+
float BL_Action::GetFrame()
{
return m_localtime;
@@ -204,14 +208,24 @@
void BL_Action::SetFrame(float frame)
{
+ float dt;
+
// Clamp the frame to the start and end frame
if (frame < min(m_startframe, m_endframe))
frame = min(m_startframe, m_endframe);
else if (frame > max(m_startframe, m_endframe))
frame = max(m_startframe, m_endframe);
+
+ // We don't set m_localtime directly since it's recalculated
+ // in the next update. So, we modify the value (m_starttime)
+ // used to calculate m_localtime the next time SetLocalTime() is called.
- m_localtime = frame;
- m_bcalc_local_time = false;
+ dt = frame-m_startframe;
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list