diff options
Diffstat (limited to '')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs index 6d0db2e..9501e2d 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs | |||
@@ -138,7 +138,8 @@ public class BSVMotor : BSMotor | |||
138 | CurrentValue = TargetValue = Vector3.Zero; | 138 | CurrentValue = TargetValue = Vector3.Zero; |
139 | } | 139 | } |
140 | 140 | ||
141 | // Compute the next step and return the new current value | 141 | // Compute the next step and return the new current value. |
142 | // Returns the correction needed to move 'current' to 'target'. | ||
142 | public virtual Vector3 Step(float timeStep) | 143 | public virtual Vector3 Step(float timeStep) |
143 | { | 144 | { |
144 | if (!Enabled) return TargetValue; | 145 | if (!Enabled) return TargetValue; |
@@ -148,9 +149,10 @@ public class BSVMotor : BSMotor | |||
148 | 149 | ||
149 | Vector3 correction = Vector3.Zero; | 150 | Vector3 correction = Vector3.Zero; |
150 | Vector3 error = TargetValue - CurrentValue; | 151 | Vector3 error = TargetValue - CurrentValue; |
152 | LastError = error; | ||
151 | if (!ErrorIsZero(error)) | 153 | if (!ErrorIsZero(error)) |
152 | { | 154 | { |
153 | correction = Step(timeStep, error); | 155 | correction = StepError(timeStep, error); |
154 | 156 | ||
155 | CurrentValue += correction; | 157 | CurrentValue += correction; |
156 | 158 | ||
@@ -187,20 +189,31 @@ public class BSVMotor : BSMotor | |||
187 | else | 189 | else |
188 | { | 190 | { |
189 | // Difference between what we have and target is small. Motor is done. | 191 | // Difference between what we have and target is small. Motor is done. |
192 | if (TargetValue.ApproxEquals(Vector3.Zero, ErrorZeroThreshold)) | ||
193 | { | ||
194 | // The target can step down to nearly zero but not get there. If close to zero | ||
195 | // it is really zero. | ||
196 | TargetValue = Vector3.Zero; | ||
197 | } | ||
190 | CurrentValue = TargetValue; | 198 | CurrentValue = TargetValue; |
191 | MDetailLog("{0}, BSVMotor.Step,zero,{1},origTgt={2},origCurr={3},ret={4}", | 199 | MDetailLog("{0}, BSVMotor.Step,zero,{1},origTgt={2},origCurr={3},currTgt={4},currCurr={5}", |
192 | BSScene.DetailLogZero, UseName, origCurrVal, origTarget, CurrentValue); | 200 | BSScene.DetailLogZero, UseName, origCurrVal, origTarget, TargetValue, CurrentValue); |
193 | } | 201 | } |
194 | 202 | ||
195 | return CurrentValue; | 203 | return correction; |
204 | } | ||
205 | // version of step that sets the current value before doing the step | ||
206 | public virtual Vector3 Step(float timeStep, Vector3 current) | ||
207 | { | ||
208 | CurrentValue = current; | ||
209 | return Step(timeStep); | ||
196 | } | 210 | } |
197 | public virtual Vector3 Step(float timeStep, Vector3 error) | 211 | public virtual Vector3 StepError(float timeStep, Vector3 error) |
198 | { | 212 | { |
199 | if (!Enabled) return Vector3.Zero; | 213 | if (!Enabled) return Vector3.Zero; |
200 | 214 | ||
201 | LastError = error; | ||
202 | Vector3 returnCorrection = Vector3.Zero; | 215 | Vector3 returnCorrection = Vector3.Zero; |
203 | if (!ErrorIsZero()) | 216 | if (!ErrorIsZero(error)) |
204 | { | 217 | { |
205 | // correction = error / secondsItShouldTakeToCorrect | 218 | // correction = error / secondsItShouldTakeToCorrect |
206 | Vector3 correctionAmount; | 219 | Vector3 correctionAmount; |
@@ -302,9 +315,10 @@ public class BSFMotor : BSMotor | |||
302 | 315 | ||
303 | float correction = 0f; | 316 | float correction = 0f; |
304 | float error = TargetValue - CurrentValue; | 317 | float error = TargetValue - CurrentValue; |
318 | LastError = error; | ||
305 | if (!ErrorIsZero(error)) | 319 | if (!ErrorIsZero(error)) |
306 | { | 320 | { |
307 | correction = Step(timeStep, error); | 321 | correction = StepError(timeStep, error); |
308 | 322 | ||
309 | CurrentValue += correction; | 323 | CurrentValue += correction; |
310 | 324 | ||
@@ -339,6 +353,12 @@ public class BSFMotor : BSMotor | |||
339 | else | 353 | else |
340 | { | 354 | { |
341 | // Difference between what we have and target is small. Motor is done. | 355 | // Difference between what we have and target is small. Motor is done. |
356 | if (Util.InRange<float>(TargetValue, -ErrorZeroThreshold, ErrorZeroThreshold)) | ||
357 | { | ||
358 | // The target can step down to nearly zero but not get there. If close to zero | ||
359 | // it is really zero. | ||
360 | TargetValue = 0f; | ||
361 | } | ||
342 | CurrentValue = TargetValue; | 362 | CurrentValue = TargetValue; |
343 | MDetailLog("{0}, BSFMotor.Step,zero,{1},origTgt={2},origCurr={3},ret={4}", | 363 | MDetailLog("{0}, BSFMotor.Step,zero,{1},origTgt={2},origCurr={3},ret={4}", |
344 | BSScene.DetailLogZero, UseName, origCurrVal, origTarget, CurrentValue); | 364 | BSScene.DetailLogZero, UseName, origCurrVal, origTarget, CurrentValue); |
@@ -347,13 +367,12 @@ public class BSFMotor : BSMotor | |||
347 | return CurrentValue; | 367 | return CurrentValue; |
348 | } | 368 | } |
349 | 369 | ||
350 | public virtual float Step(float timeStep, float error) | 370 | public virtual float StepError(float timeStep, float error) |
351 | { | 371 | { |
352 | if (!Enabled) return 0f; | 372 | if (!Enabled) return 0f; |
353 | 373 | ||
354 | LastError = error; | ||
355 | float returnCorrection = 0f; | 374 | float returnCorrection = 0f; |
356 | if (!ErrorIsZero()) | 375 | if (!ErrorIsZero(error)) |
357 | { | 376 | { |
358 | // correction = error / secondsItShouldTakeToCorrect | 377 | // correction = error / secondsItShouldTakeToCorrect |
359 | float correctionAmount; | 378 | float correctionAmount; |
@@ -440,8 +459,8 @@ public class BSPIDVMotor : BSVMotor | |||
440 | } | 459 | } |
441 | } | 460 | } |
442 | 461 | ||
443 | // Ignore Current and Target Values and just advance the PID computation on this error. | 462 | // Advance the PID computation on this error. |
444 | public override Vector3 Step(float timeStep, Vector3 error) | 463 | public override Vector3 StepError(float timeStep, Vector3 error) |
445 | { | 464 | { |
446 | if (!Enabled) return Vector3.Zero; | 465 | if (!Enabled) return Vector3.Zero; |
447 | 466 | ||