summaryrefslogtreecommitdiff
path: root/indra/newview/llphysicsmotion.cpp
diff options
context:
space:
mode:
authorOz Linden <oz@lindenlab.com>2018-05-29 11:49:46 -0400
committerOz Linden <oz@lindenlab.com>2018-05-29 11:49:46 -0400
commitc18a4cb0117b6e865a72a01465606c67a7e3bf6d (patch)
tree25abf867eabd03b7804a1e36e9c9af2513636cc7 /indra/newview/llphysicsmotion.cpp
parent77344afa8b39b4c1fcebda4de63998a67fd4debb (diff)
parentc70119ebabc4b06e2b0db02aea8c56e01fbc666e (diff)
merge changes for 5.1.4-release
Diffstat (limited to 'indra/newview/llphysicsmotion.cpp')
-rw-r--r--indra/newview/llphysicsmotion.cpp16
1 files changed, 7 insertions, 9 deletions
diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index 08d734ddac..f48ce680fd 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -44,7 +44,9 @@ typedef std::map<std::string, std::string> controller_map_t;
typedef std::map<std::string, F32> default_controller_map_t;
#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f
-#define TIME_ITERATION_STEP 0.05f
+// we use TIME_ITERATION_STEP_MAX in division operation, make sure this is a simple
+// value and devision result won't end with repeated/recurring tail like 1.333(3)
+#define TIME_ITERATION_STEP_MAX 0.05f // minimal step size will end up as 0.025
inline F64 llsgn(const F64 a)
{
@@ -480,7 +482,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
if (!mParamDriver)
return FALSE;
- if (!mLastTime)
+ if (!mLastTime || mLastTime >= time)
{
mLastTime = time;
return FALSE;
@@ -561,14 +563,10 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
// bounce at right (relatively) position.
// Note: this doesn't look to be optimal, since it provides only "roughly same" behavior, but
// irregularity at higher fps looks to be insignificant so it works good enough for low fps.
- for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP)
+ U32 steps = (U32)(time_delta / TIME_ITERATION_STEP_MAX) + 1;
+ F32 time_iteration_step = time_delta / (F32)steps; //minimal step size ends up as 0.025
+ for (U32 i = 0; i < steps; i++)
{
- F32 time_iteration_step = TIME_ITERATION_STEP;
- if (time_iteration + TIME_ITERATION_STEP > time_delta)
- {
- time_iteration_step = time_delta-time_iteration;
- }
-
// mPositon_local should be in normalized 0,1 range already. Just making sure...
const F32 position_current_local = llclamp(mPosition_local,
0.0f,