diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs | 60 |
1 files changed, 45 insertions, 15 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs index a11bca0..35d5a08 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs | |||
@@ -59,6 +59,7 @@ public class BSPrimDisplaced : BSPrim | |||
59 | // are converted into simulator origin values before being passed to the base | 59 | // are converted into simulator origin values before being passed to the base |
60 | // class. | 60 | // class. |
61 | 61 | ||
62 | // PositionDisplacement is the vehicle relative distance from the root prim position to the center-of-mass. | ||
62 | public virtual OMV.Vector3 PositionDisplacement { get; set; } | 63 | public virtual OMV.Vector3 PositionDisplacement { get; set; } |
63 | 64 | ||
64 | public BSPrimDisplaced(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, | 65 | public BSPrimDisplaced(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, |
@@ -72,49 +73,77 @@ public class BSPrimDisplaced : BSPrim | |||
72 | // Does not clear the displacement set by the user. | 73 | // Does not clear the displacement set by the user. |
73 | public void ClearDisplacement() | 74 | public void ClearDisplacement() |
74 | { | 75 | { |
75 | SetEffectiveCenterOfMassDisplacement(OMV.Vector3.Zero); | 76 | if (UserSetCenterOfMassDisplacement.HasValue) |
77 | PositionDisplacement = (OMV.Vector3)UserSetCenterOfMassDisplacement; | ||
78 | else | ||
79 | PositionDisplacement = OMV.Vector3.Zero; | ||
76 | } | 80 | } |
77 | 81 | ||
78 | // Set this sets and computes the displacement from the passed prim to the center-of-mass. | 82 | // 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. | 83 | // 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). | 84 | // The displacement is in local coordinates (relative to root prim in linkset oriented coordinates). |
85 | // Returns the relative offset from the root position to the center-of-mass. | ||
81 | // Called at taint time. | 86 | // Called at taint time. |
82 | public virtual void SetEffectiveCenterOfMassDisplacement(Vector3 centerOfMassDisplacement) | 87 | public virtual Vector3 SetEffectiveCenterOfMassDisplacement(Vector3 centerOfMassDisplacement) |
83 | { | 88 | { |
89 | PhysScene.AssertInTaintTime("BSPrimDisplaced.SetEffectiveCenterOfMassDisplacement"); | ||
84 | Vector3 comDisp; | 90 | Vector3 comDisp; |
85 | if (UserSetCenterOfMassDisplacement.HasValue) | 91 | if (UserSetCenterOfMassDisplacement.HasValue) |
86 | comDisp = (OMV.Vector3)UserSetCenterOfMassDisplacement; | 92 | comDisp = (OMV.Vector3)UserSetCenterOfMassDisplacement; |
87 | else | 93 | else |
88 | comDisp = centerOfMassDisplacement; | 94 | comDisp = centerOfMassDisplacement; |
89 | 95 | ||
96 | // Eliminate any jitter caused be very slight differences in masses and positions | ||
90 | if (comDisp.ApproxEquals(Vector3.Zero, 0.01f) ) | 97 | if (comDisp.ApproxEquals(Vector3.Zero, 0.01f) ) |
91 | comDisp = Vector3.Zero; | 98 | comDisp = Vector3.Zero; |
92 | 99 | ||
93 | DetailLog("{0},BSPrimDisplaced.SetEffectiveCenterOfMassDisplacement,userSet={1},comDisp={2}", | 100 | DetailLog("{0},BSPrimDisplaced.SetEffectiveCenterOfMassDisplacement,userSet={1},comDisp={2}", |
94 | LocalID, UserSetCenterOfMassDisplacement.HasValue, comDisp); | 101 | LocalID, UserSetCenterOfMassDisplacement.HasValue, comDisp); |
95 | if ( comDisp != PositionDisplacement ) | 102 | if ( !comDisp.ApproxEquals(PositionDisplacement, 0.01f) ) |
96 | { | 103 | { |
97 | // Displacement setting is changing. | 104 | // Displacement setting is changing. |
98 | // The relationship between the physical object and simulated object must be aligned. | 105 | // The relationship between the physical object and simulated object must be aligned. |
99 | PositionDisplacement = comDisp; | 106 | PositionDisplacement = comDisp; |
100 | this.ForcePosition = RawPosition; | 107 | this.ForcePosition = RawPosition; |
101 | } | 108 | } |
109 | |||
110 | return PositionDisplacement; | ||
102 | } | 111 | } |
103 | 112 | ||
113 | // 'ForcePosition' is the one way to set the physical position of the body in the physics engine. | ||
114 | // Displace the simulator idea of position (center of root prim) to the physical position. | ||
104 | public override Vector3 ForcePosition | 115 | public override Vector3 ForcePosition |
105 | { | 116 | { |
106 | get { return base.ForcePosition; } | 117 | get { |
118 | OMV.Vector3 physPosition = base.ForcePosition; | ||
119 | if (PositionDisplacement != OMV.Vector3.Zero) | ||
120 | { | ||
121 | // If there is some displacement, return the physical position (center-of-mass) | ||
122 | // location minus the displacement to give the center of the root prim. | ||
123 | OMV.Vector3 displacement = PositionDisplacement * ForceOrientation; | ||
124 | DetailLog("{0},BSPrimDisplaced.ForcePosition,get,physPos={1},disp={2},simPos={3}", | ||
125 | LocalID, physPosition, displacement, physPosition - displacement); | ||
126 | physPosition -= displacement; | ||
127 | } | ||
128 | return physPosition; | ||
129 | } | ||
107 | set | 130 | set |
108 | { | 131 | { |
109 | if (PositionDisplacement != OMV.Vector3.Zero) | 132 | if (PositionDisplacement != OMV.Vector3.Zero) |
110 | { | 133 | { |
111 | // The displacement is always relative to the vehicle so, when setting position, | 134 | // This value is the simulator's idea of where the prim is: the center of the root prim |
112 | // the caller means to set the position of the root prim. | 135 | RawPosition = value; |
113 | // This offsets the setting value to the center-of-mass and sends that to the | 136 | |
114 | // physics engine. | 137 | // Move the passed root prim postion to the center-of-mass position and set in the physics engine. |
115 | OMV.Vector3 displacedPos = value - (PositionDisplacement * RawOrientation); | 138 | OMV.Vector3 displacement = PositionDisplacement * RawOrientation; |
116 | DetailLog("{0},BSPrimDisplaced.ForcePosition,val={1},disp={2},newPos={3}", LocalID, value, PositionDisplacement, displacedPos); | 139 | OMV.Vector3 displacedPos = RawPosition + displacement; |
117 | base.ForcePosition = displacedPos; | 140 | DetailLog("{0},BSPrimDisplaced.ForcePosition,set,simPos={1},disp={2},physPos={3}", |
141 | LocalID, RawPosition, displacement, displacedPos); | ||
142 | if (PhysBody.HasPhysicalBody) | ||
143 | { | ||
144 | PhysScene.PE.SetTranslation(PhysBody, displacedPos, RawOrientation); | ||
145 | ActivateIfPhysical(false); | ||
146 | } | ||
118 | } | 147 | } |
119 | else | 148 | else |
120 | { | 149 | { |
@@ -143,10 +172,11 @@ public class BSPrimDisplaced : BSPrim | |||
143 | // These physical location must be back converted to be centered around the displaced | 172 | // These physical location must be back converted to be centered around the displaced |
144 | // root shape. | 173 | // root shape. |
145 | 174 | ||
146 | // The root position is the reported position displaced by the rotated displacement. | 175 | // Move the returned center-of-mass location to the root prim location. |
147 | OMV.Vector3 displacedPos = entprop.Position + (PositionDisplacement * entprop.Rotation); | 176 | OMV.Vector3 displacement = PositionDisplacement * entprop.Rotation; |
148 | DetailLog("{0},BSPrimDisplaced.UpdateProperties,physPos={1},disp={2},newPos={3}", | 177 | OMV.Vector3 displacedPos = entprop.Position - displacement; |
149 | LocalID, entprop.Position, PositionDisplacement, displacedPos); | 178 | DetailLog("{0},BSPrimDisplaced.UpdateProperties,physPos={1},disp={2},simPos={3}", |
179 | LocalID, entprop.Position, displacement, displacedPos); | ||
150 | entprop.Position = displacedPos; | 180 | entprop.Position = displacedPos; |
151 | } | 181 | } |
152 | 182 | ||