diff options
Diffstat (limited to '')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs | 121 |
1 files changed, 75 insertions, 46 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs index f1c3b5c..2eb1440 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs | |||
@@ -23,11 +23,6 @@ | |||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | ||
27 | * The quotations from http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial | ||
28 | * are Copyright (c) 2009 Linden Research, Inc and are used under their license | ||
29 | * of Creative Commons Attribution-Share Alike 3.0 | ||
30 | * (http://creativecommons.org/licenses/by-sa/3.0/). | ||
31 | */ | 26 | */ |
32 | 27 | ||
33 | using System; | 28 | using System; |
@@ -44,14 +39,14 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
44 | { | 39 | { |
45 | public class BSPrimDisplaced : BSPrim | 40 | public class BSPrimDisplaced : BSPrim |
46 | { | 41 | { |
47 | // The purpose of this module is to do any mapping between what the simulator thinks | 42 | // The purpose of this subclass is to do any mapping between what the simulator thinks |
48 | // the prim position and orientation is and what the physical position/orientation. | 43 | // the prim position and orientation is and what the physical position/orientation. |
49 | // This difference happens because Bullet assumes the center-of-mass is the <0,0,0> | 44 | // This difference happens because Bullet assumes the center-of-mass is the <0,0,0> |
50 | // of the prim/linkset. The simulator tracks the location of the prim/linkset by | 45 | // of the prim/linkset. The simulator, on the other hand, tracks the location of |
51 | // the location of the root prim. So, if center-of-mass is anywhere but the origin | 46 | // the prim/linkset by the location of the root prim. So, if center-of-mass is anywhere |
52 | // of the root prim, the physical origin is displaced from the simulator origin. | 47 | // but the origin of the root prim, the physical origin is displaced from the simulator origin. |
53 | // | 48 | // |
54 | // This routine works by capturing the Force* setting of position/orientation/... and | 49 | // This routine works by capturing ForcePosition and |
55 | // adjusting the simulator values (being set) into the physical values. | 50 | // adjusting the simulator values (being set) into the physical values. |
56 | // The conversion is also done in the opposite direction (physical origin -> simulator origin). | 51 | // The conversion is also done in the opposite direction (physical origin -> simulator origin). |
57 | // | 52 | // |
@@ -59,8 +54,8 @@ public class BSPrimDisplaced : BSPrim | |||
59 | // are converted into simulator origin values before being passed to the base | 54 | // are converted into simulator origin values before being passed to the base |
60 | // class. | 55 | // class. |
61 | 56 | ||
57 | // PositionDisplacement is the vehicle relative distance from the root prim position to the center-of-mass. | ||
62 | public virtual OMV.Vector3 PositionDisplacement { get; set; } | 58 | public virtual OMV.Vector3 PositionDisplacement { get; set; } |
63 | public virtual OMV.Quaternion OrientationDisplacement { get; set; } | ||
64 | 59 | ||
65 | public BSPrimDisplaced(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, | 60 | public BSPrimDisplaced(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, |
66 | OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical) | 61 | OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical) |
@@ -69,68 +64,96 @@ public class BSPrimDisplaced : BSPrim | |||
69 | ClearDisplacement(); | 64 | ClearDisplacement(); |
70 | } | 65 | } |
71 | 66 | ||
67 | // Clears any center-of-mass displacement introduced by linksets, etc. | ||
68 | // Does not clear the displacement set by the user. | ||
72 | public void ClearDisplacement() | 69 | public void ClearDisplacement() |
73 | { | 70 | { |
74 | PositionDisplacement = OMV.Vector3.Zero; | 71 | if (UserSetCenterOfMassDisplacement.HasValue) |
75 | OrientationDisplacement = OMV.Quaternion.Identity; | 72 | PositionDisplacement = (OMV.Vector3)UserSetCenterOfMassDisplacement; |
73 | else | ||
74 | PositionDisplacement = OMV.Vector3.Zero; | ||
76 | } | 75 | } |
77 | 76 | ||
78 | // Set this sets and computes the displacement from the passed prim to the center-of-mass. | 77 | // Set this sets and computes the displacement from the passed prim to the center-of-mass. |
79 | // A user set value for center-of-mass overrides whatever might be passed in here. | 78 | // A user set value for center-of-mass overrides whatever might be passed in here. |
80 | // The displacement is in local coordinates (relative to root prim in linkset oriented coordinates). | 79 | // The displacement is in local coordinates (relative to root prim in linkset oriented coordinates). |
81 | public virtual void SetEffectiveCenterOfMassW(Vector3 centerOfMassDisplacement) | 80 | // Returns the relative offset from the root position to the center-of-mass. |
81 | // Called at taint time. | ||
82 | public virtual Vector3 SetEffectiveCenterOfMassDisplacement(Vector3 centerOfMassDisplacement) | ||
82 | { | 83 | { |
84 | PhysScene.AssertInTaintTime("BSPrimDisplaced.SetEffectiveCenterOfMassDisplacement"); | ||
83 | Vector3 comDisp; | 85 | Vector3 comDisp; |
84 | if (UserSetCenterOfMass.HasValue) | 86 | if (UserSetCenterOfMassDisplacement.HasValue) |
85 | comDisp = (OMV.Vector3)UserSetCenterOfMass; | 87 | comDisp = (OMV.Vector3)UserSetCenterOfMassDisplacement; |
86 | else | 88 | else |
87 | comDisp = centerOfMassDisplacement; | 89 | comDisp = centerOfMassDisplacement; |
88 | 90 | ||
89 | if (comDisp == Vector3.Zero) | 91 | // Eliminate any jitter caused be very slight differences in masses and positions |
90 | { | 92 | if (comDisp.ApproxEquals(Vector3.Zero, 0.01f) ) |
91 | // If there is no diplacement. Things get reset. | 93 | comDisp = Vector3.Zero; |
92 | PositionDisplacement = OMV.Vector3.Zero; | 94 | |
93 | OrientationDisplacement = OMV.Quaternion.Identity; | 95 | DetailLog("{0},BSPrimDisplaced.SetEffectiveCenterOfMassDisplacement,userSet={1},comDisp={2}", |
94 | } | 96 | LocalID, UserSetCenterOfMassDisplacement.HasValue, comDisp); |
95 | else | 97 | if ( !comDisp.ApproxEquals(PositionDisplacement, 0.01f) ) |
96 | { | 98 | { |
97 | // Remember the displacement from root as well as the origional rotation of the | 99 | // Displacement setting is changing. |
98 | // new center-of-mass. | 100 | // The relationship between the physical object and simulated object must be aligned. |
99 | PositionDisplacement = comDisp; | 101 | PositionDisplacement = comDisp; |
100 | OrientationDisplacement = OMV.Quaternion.Identity; | 102 | this.ForcePosition = RawPosition; |
101 | } | 103 | } |
104 | |||
105 | return PositionDisplacement; | ||
102 | } | 106 | } |
103 | 107 | ||
108 | // 'ForcePosition' is the one way to set the physical position of the body in the physics engine. | ||
109 | // Displace the simulator idea of position (center of root prim) to the physical position. | ||
104 | public override Vector3 ForcePosition | 110 | public override Vector3 ForcePosition |
105 | { | 111 | { |
106 | get { return base.ForcePosition; } | 112 | get { |
113 | OMV.Vector3 physPosition = PhysScene.PE.GetPosition(PhysBody); | ||
114 | if (PositionDisplacement != OMV.Vector3.Zero) | ||
115 | { | ||
116 | // If there is some displacement, return the physical position (center-of-mass) | ||
117 | // location minus the displacement to give the center of the root prim. | ||
118 | OMV.Vector3 displacement = PositionDisplacement * ForceOrientation; | ||
119 | DetailLog("{0},BSPrimDisplaced.ForcePosition,get,physPos={1},disp={2},simPos={3}", | ||
120 | LocalID, physPosition, displacement, physPosition - displacement); | ||
121 | physPosition -= displacement; | ||
122 | } | ||
123 | RawPosition = physPosition; | ||
124 | return physPosition; | ||
125 | } | ||
107 | set | 126 | set |
108 | { | 127 | { |
109 | if (PositionDisplacement != OMV.Vector3.Zero) | 128 | if (PositionDisplacement != OMV.Vector3.Zero) |
110 | base.ForcePosition = value - (PositionDisplacement * RawOrientation); | 129 | { |
130 | // This value is the simulator's idea of where the prim is: the center of the root prim | ||
131 | RawPosition = value; | ||
132 | |||
133 | // Move the passed root prim postion to the center-of-mass position and set in the physics engine. | ||
134 | OMV.Vector3 displacement = PositionDisplacement * RawOrientation; | ||
135 | OMV.Vector3 displacedPos = RawPosition + displacement; | ||
136 | DetailLog("{0},BSPrimDisplaced.ForcePosition,set,simPos={1},disp={2},physPos={3}", | ||
137 | LocalID, RawPosition, displacement, displacedPos); | ||
138 | if (PhysBody.HasPhysicalBody) | ||
139 | { | ||
140 | PhysScene.PE.SetTranslation(PhysBody, displacedPos, RawOrientation); | ||
141 | ActivateIfPhysical(false); | ||
142 | } | ||
143 | } | ||
111 | else | 144 | else |
145 | { | ||
112 | base.ForcePosition = value; | 146 | base.ForcePosition = value; |
147 | } | ||
113 | } | 148 | } |
114 | } | 149 | } |
115 | 150 | ||
116 | public override Quaternion ForceOrientation | 151 | // These are also overridden by BSPrimLinkable if the prim can be part of a linkset |
117 | { | ||
118 | get { return base.ForceOrientation; } | ||
119 | set | ||
120 | { | ||
121 | base.ForceOrientation = value; | ||
122 | } | ||
123 | } | ||
124 | |||
125 | // TODO: decide if this is the right place for these variables. | ||
126 | // Somehow incorporate the optional settability by the user. | ||
127 | // Is this used? | ||
128 | public override OMV.Vector3 CenterOfMass | 152 | public override OMV.Vector3 CenterOfMass |
129 | { | 153 | { |
130 | get { return RawPosition; } | 154 | get { return RawPosition; } |
131 | } | 155 | } |
132 | 156 | ||
133 | // Is this used? | ||
134 | public override OMV.Vector3 GeometricCenter | 157 | public override OMV.Vector3 GeometricCenter |
135 | { | 158 | { |
136 | get { return RawPosition; } | 159 | get { return RawPosition; } |
@@ -139,12 +162,18 @@ public class BSPrimDisplaced : BSPrim | |||
139 | public override void UpdateProperties(EntityProperties entprop) | 162 | public override void UpdateProperties(EntityProperties entprop) |
140 | { | 163 | { |
141 | // Undo any center-of-mass displacement that might have been done. | 164 | // Undo any center-of-mass displacement that might have been done. |
142 | if (PositionDisplacement != OMV.Vector3.Zero || OrientationDisplacement != OMV.Quaternion.Identity) | 165 | if (PositionDisplacement != OMV.Vector3.Zero) |
143 | { | 166 | { |
144 | // Correct for any rotation around the center-of-mass | 167 | // The origional shape was offset from 'zero' by PositionDisplacement. |
145 | // TODO!!! | 168 | // These physical location must be back converted to be centered around the displaced |
146 | entprop.Position = entprop.Position + (PositionDisplacement * entprop.Rotation); | 169 | // root shape. |
147 | // entprop.Rotation = something; | 170 | |
171 | // Move the returned center-of-mass location to the root prim location. | ||
172 | OMV.Vector3 displacement = PositionDisplacement * entprop.Rotation; | ||
173 | OMV.Vector3 displacedPos = entprop.Position - displacement; | ||
174 | DetailLog("{0},BSPrimDisplaced.UpdateProperties,physPos={1},disp={2},simPos={3}", | ||
175 | LocalID, entprop.Position, displacement, displacedPos); | ||
176 | entprop.Position = displacedPos; | ||
148 | } | 177 | } |
149 | 178 | ||
150 | base.UpdateProperties(entprop); | 179 | base.UpdateProperties(entprop); |