diff options
author | Melanie | 2013-07-18 10:08:10 +0100 |
---|---|---|
committer | Melanie | 2013-07-18 10:08:10 +0100 |
commit | 7830cc995471120892a24a39e86283774fa07c4c (patch) | |
tree | d3f46b4f3ce95bb8572511c6f12c9f8ca86922c8 /OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs | |
parent | Merge branch 'master' into careminster (diff) | |
parent | Document obscure Groups config related to the user level required for creatin... (diff) | |
download | opensim-SC-7830cc995471120892a24a39e86283774fa07c4c.zip opensim-SC-7830cc995471120892a24a39e86283774fa07c4c.tar.gz opensim-SC-7830cc995471120892a24a39e86283774fa07c4c.tar.bz2 opensim-SC-7830cc995471120892a24a39e86283774fa07c4c.tar.xz |
Merge branch 'master' into careminster
Conflicts:
OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs
OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs
OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
OpenSim/Region/Framework/Scenes/Scene.cs
OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
OpenSim/Region/Framework/Scenes/ScenePresence.cs
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs
OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
OpenSim/Services/HypergridService/UserAgentService.cs
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs | 115 |
1 files changed, 66 insertions, 49 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs index f5ee671..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,50 +64,82 @@ 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 SetEffectiveCenterOfMassDisplacement(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 (UserSetCenterOfMassDisplacement.HasValue) | 86 | if (UserSetCenterOfMassDisplacement.HasValue) |
85 | comDisp = (OMV.Vector3)UserSetCenterOfMassDisplacement; | 87 | comDisp = (OMV.Vector3)UserSetCenterOfMassDisplacement; |
86 | else | 88 | else |
87 | comDisp = centerOfMassDisplacement; | 89 | comDisp = centerOfMassDisplacement; |
88 | 90 | ||
91 | // Eliminate any jitter caused be very slight differences in masses and positions | ||
92 | if (comDisp.ApproxEquals(Vector3.Zero, 0.01f) ) | ||
93 | comDisp = Vector3.Zero; | ||
94 | |||
89 | DetailLog("{0},BSPrimDisplaced.SetEffectiveCenterOfMassDisplacement,userSet={1},comDisp={2}", | 95 | DetailLog("{0},BSPrimDisplaced.SetEffectiveCenterOfMassDisplacement,userSet={1},comDisp={2}", |
90 | LocalID, UserSetCenterOfMassDisplacement.HasValue, comDisp); | 96 | LocalID, UserSetCenterOfMassDisplacement.HasValue, comDisp); |
91 | if (comDisp == Vector3.Zero) | 97 | if ( !comDisp.ApproxEquals(PositionDisplacement, 0.01f) ) |
92 | { | 98 | { |
93 | // If there is no diplacement. Things get reset. | 99 | // Displacement setting is changing. |
94 | PositionDisplacement = OMV.Vector3.Zero; | 100 | // The relationship between the physical object and simulated object must be aligned. |
95 | OrientationDisplacement = OMV.Quaternion.Identity; | ||
96 | } | ||
97 | else | ||
98 | { | ||
99 | // Remember the displacement from root as well as the origional rotation of the | ||
100 | // new center-of-mass. | ||
101 | PositionDisplacement = comDisp; | 101 | PositionDisplacement = comDisp; |
102 | OrientationDisplacement = OMV.Quaternion.Identity; | 102 | this.ForcePosition = RawPosition; |
103 | } | 103 | } |
104 | |||
105 | return PositionDisplacement; | ||
104 | } | 106 | } |
105 | 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. | ||
106 | public override Vector3 ForcePosition | 110 | public override Vector3 ForcePosition |
107 | { | 111 | { |
108 | 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 | } | ||
109 | set | 126 | set |
110 | { | 127 | { |
111 | if (PositionDisplacement != OMV.Vector3.Zero) | 128 | if (PositionDisplacement != OMV.Vector3.Zero) |
112 | { | 129 | { |
113 | OMV.Vector3 displacedPos = value - (PositionDisplacement * RawOrientation); | 130 | // This value is the simulator's idea of where the prim is: the center of the root prim |
114 | DetailLog("{0},BSPrimDisplaced.ForcePosition,val={1},disp={2},newPos={3}", LocalID, value, PositionDisplacement, displacedPos); | 131 | RawPosition = value; |
115 | base.ForcePosition = displacedPos; | 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 | } | ||
116 | } | 143 | } |
117 | else | 144 | else |
118 | { | 145 | { |
@@ -121,25 +148,12 @@ public class BSPrimDisplaced : BSPrim | |||
121 | } | 148 | } |
122 | } | 149 | } |
123 | 150 | ||
124 | public override Quaternion ForceOrientation | 151 | // These are also overridden by BSPrimLinkable if the prim can be part of a linkset |
125 | { | ||
126 | get { return base.ForceOrientation; } | ||
127 | set | ||
128 | { | ||
129 | // TODO: | ||
130 | base.ForceOrientation = value; | ||
131 | } | ||
132 | } | ||
133 | |||
134 | // TODO: decide if this is the right place for these variables. | ||
135 | // Somehow incorporate the optional settability by the user. | ||
136 | // Is this used? | ||
137 | public override OMV.Vector3 CenterOfMass | 152 | public override OMV.Vector3 CenterOfMass |
138 | { | 153 | { |
139 | get { return RawPosition; } | 154 | get { return RawPosition; } |
140 | } | 155 | } |
141 | 156 | ||
142 | // Is this used? | ||
143 | public override OMV.Vector3 GeometricCenter | 157 | public override OMV.Vector3 GeometricCenter |
144 | { | 158 | { |
145 | get { return RawPosition; } | 159 | get { return RawPosition; } |
@@ -148,15 +162,18 @@ public class BSPrimDisplaced : BSPrim | |||
148 | public override void UpdateProperties(EntityProperties entprop) | 162 | public override void UpdateProperties(EntityProperties entprop) |
149 | { | 163 | { |
150 | // Undo any center-of-mass displacement that might have been done. | 164 | // Undo any center-of-mass displacement that might have been done. |
151 | if (PositionDisplacement != OMV.Vector3.Zero || OrientationDisplacement != OMV.Quaternion.Identity) | 165 | if (PositionDisplacement != OMV.Vector3.Zero) |
152 | { | 166 | { |
153 | // Correct for any rotation around the center-of-mass | 167 | // The origional shape was offset from 'zero' by PositionDisplacement. |
154 | // TODO!!! | 168 | // These physical location must be back converted to be centered around the displaced |
155 | 169 | // root shape. | |
156 | OMV.Vector3 displacedPos = entprop.Position + (PositionDisplacement * entprop.Rotation); | 170 | |
157 | DetailLog("{0},BSPrimDisplaced.ForcePosition,physPos={1},disp={2},newPos={3}", LocalID, entprop.Position, PositionDisplacement, displacedPos); | 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); | ||
158 | entprop.Position = displacedPos; | 176 | entprop.Position = displacedPos; |
159 | // entprop.Rotation = something; | ||
160 | } | 177 | } |
161 | 178 | ||
162 | base.UpdateProperties(entprop); | 179 | base.UpdateProperties(entprop); |