Index: source/gameengine/Ketsji/KX_IpoActuator.cpp =================================================================== --- source/gameengine/Ketsji/KX_IpoActuator.cpp (r‚vision 13585) +++ source/gameengine/Ketsji/KX_IpoActuator.cpp (copie de travail) @@ -211,12 +211,6 @@ (*i)->Release(); } m_events.clear(); - - if (m_type != KX_ACT_IPO_PLAY) - { - if (bNegativeEvent) - RemoveAllEvents(); - } } double start_smaller_then_end = ( m_startframe < m_endframe ? 1.0 : -1.0); @@ -226,6 +220,7 @@ { if (m_starttime < -2.0*start_smaller_then_end*(m_endframe - m_startframe)) { + // start for all Ipo, initial start for LOOP_STOP m_starttime = curtime - KX_KetsjiEngine::GetSuspendedDelta(); m_bIpoPlaying = true; } @@ -238,17 +233,10 @@ { // Check if playing forwards. result = ! finished - if (!bNegativeEvent) - { - if (start_smaller_then_end > 0.0) - result = (m_localtime < m_endframe && !(m_localtime == m_startframe && bNegativeEvent)); - else - result = (m_localtime > m_endframe && !(m_localtime == m_startframe && bNegativeEvent)); - } + if (start_smaller_then_end > 0.0) + result = (m_localtime < m_endframe && m_bIpoPlaying); else - { - result = (m_bIpoPlaying && (m_localtime < m_endframe)); - } + result = (m_localtime > m_endframe && m_bIpoPlaying); if (result) { @@ -267,7 +255,6 @@ } else { m_localtime=m_startframe; - SetStartTime(curtime); m_direction=1; } break; @@ -275,7 +262,7 @@ case KX_ACT_IPO_PINGPONG: { result = true; - if (bNegativeEvent && ((m_localtime == m_startframe )|| (m_localtime == m_endframe))) + if (bNegativeEvent && !m_bIpoPlaying) result = false; else SetLocalTime(curtime); @@ -297,14 +284,18 @@ } case KX_ACT_IPO_FLIPPER: { - result = !(bNegativeEvent && (m_localtime == m_startframe)); + if (bNegativeEvent && !m_bIpoPlaying) + result = false; if (numevents) { + float oldDirection = m_direction; if (bNegativeEvent) m_direction = -1; else m_direction = 1; - SetStartTime(curtime); + if (m_direction != oldDirection) + // changing direction, reset start time + SetStartTime(curtime); } SetLocalTime(curtime); @@ -332,18 +323,26 @@ m_bNegativeEvent = false; numevents = 0; } - SetStartTime(curtime); + if (!m_bIpoPlaying) + { + // Ipo was stopped, make sure we will restart from where it stopped + SetStartTime(curtime); + if (!bNegativeEvent) + // positive signal will restart the Ipo + m_bIpoPlaying = true; + } + } // fall through to loopend, and quit the ipo animation immediatly } case KX_ACT_IPO_LOOPEND: { if (numevents){ - if (bNegativeEvent){ + if (bNegativeEvent && m_bIpoPlaying){ m_bNegativeEvent = true; } } - if (bNegativeEvent && m_localtime == m_startframe){ + if (bNegativeEvent && !m_bIpoPlaying){ result = false; } else @@ -414,8 +413,12 @@ result = false; } - if (!result && m_type != KX_ACT_IPO_LOOPSTOP) - m_starttime = -2.0*start_smaller_then_end*(m_endframe - m_startframe) - 1.0; + if (!result) + { + if (m_type != KX_ACT_IPO_LOOPSTOP) + m_starttime = -2.0*start_smaller_then_end*(m_endframe - m_startframe) - 1.0; + m_bIpoPlaying = false; + } return result; } Index: source/gameengine/Converter/KX_ConvertSensors.cpp =================================================================== --- source/gameengine/Converter/KX_ConvertSensors.cpp (r‚vision 13585) +++ source/gameengine/Converter/KX_ConvertSensors.cpp (copie de travail) @@ -386,8 +386,9 @@ bool bFindMaterial = false; PHY_IPhysicsController* physCtrl = kxscene->GetPhysicsEnvironment()->CreateSphereController(radius,pos); - if (isInActiveLayer) - kxscene->GetPhysicsEnvironment()->addSensor(physCtrl); + //will be done in KX_TouchEventManager::RegisterSensor() + //if (isInActiveLayer) + // kxscene->GetPhysicsEnvironment()->addSensor(physCtrl); Index: source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp =================================================================== --- source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp (r‚vision 13585) +++ source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp (copie de travail) @@ -142,7 +142,11 @@ result = (WasUp != m_IsUp); - // Return true if the message received state has changed. + // Return always true if a message was received otherwise we can loose messages + if (m_IsUp) + return true; + // Is it usefull to return also true when the first frame without a message?? + // This will cause a fast on/off cycle that seems useless! return result; }