Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/gameengine/Ketsji/KX_IpoActuator.cpp')
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.cpp29
1 files changed, 22 insertions, 7 deletions
diff --git a/source/gameengine/Ketsji/KX_IpoActuator.cpp b/source/gameengine/Ketsji/KX_IpoActuator.cpp
index df4a5047ef1..ea9fe8554cc 100644
--- a/source/gameengine/Ketsji/KX_IpoActuator.cpp
+++ b/source/gameengine/Ketsji/KX_IpoActuator.cpp
@@ -112,13 +112,14 @@ KX_IpoActuator::KX_IpoActuator(SCA_IObject* gameobj,
m_endframe(endtime),
m_recurse(recurse),
m_localtime(starttime),
+ m_starttime(-1.0),
m_direction(1),
m_propname(propname),
m_ipo_as_force(ipo_as_force),
m_force_ipo_local(force_ipo_local),
m_type((IpoActType)acttype)
{
- m_starttime = -2.0*fabs(m_endframe - m_startframe) - 1.0;
+ // intentionally empty
}
void KX_IpoActuator::SetStart(float starttime)
@@ -188,11 +189,10 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
// result = true if animation has to be continued, false if animation stops
// maybe there are events for us in the queue !
bool bNegativeEvent = false;
- int numevents = 0;
+ int numevents = m_events.size();
if (frame)
{
- numevents = m_events.size();
for (vector<CValue*>::iterator i=m_events.end(); !(i==m_events.begin());)
{
--i;
@@ -204,13 +204,15 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
m_events.clear();
if (bNegativeEvent)
+ {
RemoveAllEvents();
+ }
}
double start_smaller_then_end = ( m_startframe < m_endframe ? 1.0 : -1.0);
bool result=true;
- if (m_starttime < -2.0*start_smaller_then_end*(m_endframe - m_startframe))
+ if (m_starttime < 0.0)
m_starttime = curtime;
switch (m_type)
@@ -271,7 +273,7 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
}
case KX_ACT_IPO_FLIPPER:
{
- result = !(bNegativeEvent && (m_localtime == m_startframe));
+ result = true;
if (numevents)
{
if (bNegativeEvent)
@@ -367,7 +369,20 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
CValue* propval = GetParent()->GetProperty(m_propname);
if (propval)
{
- m_localtime = propval->GetNumber();
+ float target = propval->GetNumber();
+ float delta_time = (curtime - m_starttime)*KX_FIXED_FRAME_PER_SEC;
+ if (target > m_localtime)
+ {
+ m_localtime += delta_time;
+ if (m_localtime > target)
+ m_localtime = target;
+ }
+ else
+ {
+ m_localtime -= delta_time;
+ if (m_localtime < target)
+ m_localtime = target;
+ }
CIpoAction ipoaction(
(KX_GameObject*) GetParent(),
@@ -389,7 +404,7 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
}
if (!result && m_type != KX_ACT_IPO_LOOPSTOP)
- m_starttime = -2.0*start_smaller_then_end*(m_endframe - m_startframe) - 1.0;
+ m_starttime = -1.0;
return result;
}