diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs | 63 |
1 files changed, 57 insertions, 6 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs index e91bfa8..851d508 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs | |||
@@ -1,3 +1,30 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | * | ||
27 | */ | ||
1 | using System; | 28 | using System; |
2 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
3 | using System.Text; | 30 | using System.Text; |
@@ -8,7 +35,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
8 | public abstract class BSMotor | 35 | public abstract class BSMotor |
9 | { | 36 | { |
10 | // Timescales and other things can be turned off by setting them to 'infinite'. | 37 | // Timescales and other things can be turned off by setting them to 'infinite'. |
11 | public const float Infinite = 10000f; | 38 | public const float Infinite = 12345f; |
12 | public readonly static Vector3 InfiniteVector = new Vector3(BSMotor.Infinite, BSMotor.Infinite, BSMotor.Infinite); | 39 | public readonly static Vector3 InfiniteVector = new Vector3(BSMotor.Infinite, BSMotor.Infinite, BSMotor.Infinite); |
13 | 40 | ||
14 | public BSMotor(string useName) | 41 | public BSMotor(string useName) |
@@ -19,7 +46,9 @@ public abstract class BSMotor | |||
19 | public virtual void Reset() { } | 46 | public virtual void Reset() { } |
20 | public virtual void Zero() { } | 47 | public virtual void Zero() { } |
21 | 48 | ||
49 | // A name passed at motor creation for easily identifyable debugging messages. | ||
22 | public string UseName { get; private set; } | 50 | public string UseName { get; private set; } |
51 | |||
23 | // Used only for outputting debug information. Might not be set so check for null. | 52 | // Used only for outputting debug information. Might not be set so check for null. |
24 | public BSScene PhysicsScene { get; set; } | 53 | public BSScene PhysicsScene { get; set; } |
25 | protected void MDetailLog(string msg, params Object[] parms) | 54 | protected void MDetailLog(string msg, params Object[] parms) |
@@ -34,10 +63,23 @@ public abstract class BSMotor | |||
34 | } | 63 | } |
35 | } | 64 | } |
36 | // Can all the incremental stepping be replaced with motor classes? | 65 | // Can all the incremental stepping be replaced with motor classes? |
66 | |||
67 | // Motor which moves CurrentValue to TargetValue over TimeScale seconds. | ||
68 | // The TargetValue is decays in TargetValueDecayTimeScale and | ||
69 | // the CurrentValue will be held back by FrictionTimeScale. | ||
70 | // TimeScale and TargetDelayTimeScale may be 'infinite' which means go decay. | ||
71 | |||
72 | // For instance, if something is moving at speed X and the desired speed is Y, | ||
73 | // CurrentValue is X and TargetValue is Y. As the motor is stepped, new | ||
74 | // values of CurrentValue are returned that approach the TargetValue. | ||
75 | // The feature of decaying TargetValue is so vehicles will eventually | ||
76 | // come to a stop rather than run forever. This can be disabled by | ||
77 | // setting TargetValueDecayTimescale to 'infinite'. | ||
78 | // The change from CurrentValue to TargetValue is linear over TimeScale seconds. | ||
37 | public class BSVMotor : BSMotor | 79 | public class BSVMotor : BSMotor |
38 | { | 80 | { |
39 | public Vector3 FrameOfReference { get; set; } | 81 | // public Vector3 FrameOfReference { get; set; } |
40 | public Vector3 Offset { get; set; } | 82 | // public Vector3 Offset { get; set; } |
41 | 83 | ||
42 | public float TimeScale { get; set; } | 84 | public float TimeScale { get; set; } |
43 | public float TargetValueDecayTimeScale { get; set; } | 85 | public float TargetValueDecayTimeScale { get; set; } |
@@ -72,6 +114,14 @@ public class BSVMotor : BSMotor | |||
72 | { | 114 | { |
73 | TargetValue = target; | 115 | TargetValue = target; |
74 | } | 116 | } |
117 | |||
118 | // A form of stepping that does not take the time quantum into account. | ||
119 | // The caller must do the right thing later. | ||
120 | public Vector3 Step() | ||
121 | { | ||
122 | return Step(1f); | ||
123 | } | ||
124 | |||
75 | public Vector3 Step(float timeStep) | 125 | public Vector3 Step(float timeStep) |
76 | { | 126 | { |
77 | Vector3 returnCurrent = Vector3.Zero; | 127 | Vector3 returnCurrent = Vector3.Zero; |
@@ -99,18 +149,19 @@ public class BSVMotor : BSMotor | |||
99 | if (FrictionTimescale != BSMotor.InfiniteVector) | 149 | if (FrictionTimescale != BSMotor.InfiniteVector) |
100 | { | 150 | { |
101 | // frictionFactor = (Vector3.One / FrictionTimescale) * timeStep; | 151 | // frictionFactor = (Vector3.One / FrictionTimescale) * timeStep; |
152 | // Individual friction components can be 'infinite' so compute each separately. | ||
102 | frictionFactor.X = FrictionTimescale.X == BSMotor.Infinite ? 0f : (1f / FrictionTimescale.X) * timeStep; | 153 | frictionFactor.X = FrictionTimescale.X == BSMotor.Infinite ? 0f : (1f / FrictionTimescale.X) * timeStep; |
103 | frictionFactor.Y = FrictionTimescale.Y == BSMotor.Infinite ? 0f : (1f / FrictionTimescale.Y) * timeStep; | 154 | frictionFactor.Y = FrictionTimescale.Y == BSMotor.Infinite ? 0f : (1f / FrictionTimescale.Y) * timeStep; |
104 | frictionFactor.Z = FrictionTimescale.Z == BSMotor.Infinite ? 0f : (1f / FrictionTimescale.Z) * timeStep; | 155 | frictionFactor.Z = FrictionTimescale.Z == BSMotor.Infinite ? 0f : (1f / FrictionTimescale.Z) * timeStep; |
105 | CurrentValue *= (Vector3.One - frictionFactor); | 156 | CurrentValue *= (Vector3.One - frictionFactor); |
106 | } | 157 | } |
107 | 158 | ||
108 | MDetailLog("{0},BSVMotor.Step,nonZero,{1},origCurr={2},origTarget={3},timeStep={4},timeScale={5},addAmnt={6},targetDecay={7},decayFact={8},fricTS={9},frictFact={10}", | 159 | MDetailLog("{0}, BSVMotor.Step,nonZero,{1},origCurr={2},origTarget={3},timeStep={4},timeScale={5},addAmnt={6},targetDecay={7},decayFact={8},fricTS={9},frictFact={10}", |
109 | BSScene.DetailLogZero, UseName, origCurrVal, origTarget, | 160 | BSScene.DetailLogZero, UseName, origCurrVal, origTarget, |
110 | timeStep, TimeScale, addAmount, | 161 | timeStep, TimeScale, addAmount, |
111 | TargetValueDecayTimeScale, decayFactor, | 162 | TargetValueDecayTimeScale, decayFactor, |
112 | FrictionTimescale, frictionFactor); | 163 | FrictionTimescale, frictionFactor); |
113 | MDetailLog("{0},BSVMotor.Step,nonZero,{1},curr={2},target={3},add={4},decay={5},frict={6},ret={7}", | 164 | MDetailLog("{0}, BSVMotor.Step,nonZero,{1},curr={2},target={3},add={4},decay={5},frict={6},ret={7}", |
114 | BSScene.DetailLogZero, UseName, CurrentValue, TargetValue, | 165 | BSScene.DetailLogZero, UseName, CurrentValue, TargetValue, |
115 | addAmount, decayFactor, frictionFactor, returnCurrent); | 166 | addAmount, decayFactor, frictionFactor, returnCurrent); |
116 | } | 167 | } |
@@ -120,7 +171,7 @@ public class BSVMotor : BSMotor | |||
120 | CurrentValue = Vector3.Zero; | 171 | CurrentValue = Vector3.Zero; |
121 | TargetValue = Vector3.Zero; | 172 | TargetValue = Vector3.Zero; |
122 | 173 | ||
123 | MDetailLog("{0},BSVMotor.Step,zero,{1},curr={2},target={3},ret={4}", | 174 | MDetailLog("{0}, BSVMotor.Step,zero,{1},curr={2},target={3},ret={4}", |
124 | BSScene.DetailLogZero, UseName, TargetValue, CurrentValue, returnCurrent); | 175 | BSScene.DetailLogZero, UseName, TargetValue, CurrentValue, returnCurrent); |
125 | 176 | ||
126 | } | 177 | } |