diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 76 |
1 files changed, 54 insertions, 22 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 7eca7ed..472a10b 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -89,6 +89,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
89 | private d.ContactGeom[] contacts = new d.ContactGeom[30]; | 89 | private d.ContactGeom[] contacts = new d.ContactGeom[30]; |
90 | private d.Contact contact; | 90 | private d.Contact contact; |
91 | private d.Contact TerrainContact; | 91 | private d.Contact TerrainContact; |
92 | private d.Contact AvatarMovementprimContact; | ||
93 | private d.Contact AvatarMovementTerrainContact; | ||
92 | 94 | ||
93 | private int m_physicsiterations = 10; | 95 | private int m_physicsiterations = 10; |
94 | private float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag | 96 | private float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag |
@@ -116,11 +118,20 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
116 | 118 | ||
117 | contact.surface.mu = 250.0f; | 119 | contact.surface.mu = 250.0f; |
118 | contact.surface.bounce = 0.2f; | 120 | contact.surface.bounce = 0.2f; |
121 | |||
119 | TerrainContact.surface.mode |= d.ContactFlags.SoftERP; | 122 | TerrainContact.surface.mode |= d.ContactFlags.SoftERP; |
120 | TerrainContact.surface.mu = 250.0f; | 123 | TerrainContact.surface.mu = 250.0f; |
121 | TerrainContact.surface.bounce = 0.1f; | 124 | TerrainContact.surface.bounce = 0.1f; |
122 | TerrainContact.surface.soft_erp = 0.1025f; | 125 | TerrainContact.surface.soft_erp = 0.1025f; |
123 | 126 | ||
127 | AvatarMovementprimContact.surface.mu = 150.0f; | ||
128 | AvatarMovementprimContact.surface.bounce = 0.2f; | ||
129 | |||
130 | AvatarMovementTerrainContact.surface.mode |= d.ContactFlags.SoftERP; | ||
131 | AvatarMovementTerrainContact.surface.mu = 150.0f; | ||
132 | AvatarMovementTerrainContact.surface.bounce = 0.1f; | ||
133 | AvatarMovementTerrainContact.surface.soft_erp = 0.1025f; | ||
134 | |||
124 | lock (OdeLock) | 135 | lock (OdeLock) |
125 | { | 136 | { |
126 | world = d.WorldCreate(); | 137 | world = d.WorldCreate(); |
@@ -195,23 +206,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
195 | IntPtr joint; | 206 | IntPtr joint; |
196 | // If we're colliding with terrain, use 'TerrainContact' instead of contact. | 207 | // If we're colliding with terrain, use 'TerrainContact' instead of contact. |
197 | // allows us to have different settings | 208 | // allows us to have different settings |
198 | if (name1 == "Terrain" || name2 == "Terrain") | ||
199 | { | ||
200 | |||
201 | TerrainContact.geom = contacts[i]; | ||
202 | joint = d.JointCreateContact(world, contactgroup, ref TerrainContact); | ||
203 | |||
204 | } | ||
205 | else | ||
206 | { | ||
207 | contact.geom = contacts[i]; | ||
208 | joint = d.JointCreateContact(world, contactgroup, ref contact); | ||
209 | } | ||
210 | |||
211 | |||
212 | d.JointAttach(joint, b1, b2); | ||
213 | |||
214 | |||
215 | PhysicsActor p1; | 209 | PhysicsActor p1; |
216 | PhysicsActor p2; | 210 | PhysicsActor p2; |
217 | 211 | ||
@@ -226,6 +220,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
226 | 220 | ||
227 | // We only need to test p2 for 'jump crouch purposes' | 221 | // We only need to test p2 for 'jump crouch purposes' |
228 | p2.IsColliding = true; | 222 | p2.IsColliding = true; |
223 | |||
229 | switch(p1.PhysicsActorType) { | 224 | switch(p1.PhysicsActorType) { |
230 | case (int)ActorTypes.Agent: | 225 | case (int)ActorTypes.Agent: |
231 | p2.CollidingObj = true; | 226 | p2.CollidingObj = true; |
@@ -237,6 +232,43 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
237 | p2.CollidingGround = true; | 232 | p2.CollidingGround = true; |
238 | break; | 233 | break; |
239 | } | 234 | } |
235 | |||
236 | if (name1 == "Terrain" || name2 == "Terrain") | ||
237 | { | ||
238 | if ((p2.PhysicsActorType == (int)ActorTypes.Agent) && (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) | ||
239 | { | ||
240 | AvatarMovementTerrainContact.geom = contacts[i]; | ||
241 | joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementTerrainContact); | ||
242 | } | ||
243 | else | ||
244 | { | ||
245 | TerrainContact.geom = contacts[i]; | ||
246 | joint = d.JointCreateContact(world, contactgroup, ref TerrainContact); | ||
247 | } | ||
248 | |||
249 | |||
250 | } | ||
251 | else | ||
252 | { | ||
253 | if ((p2.PhysicsActorType == (int)ActorTypes.Agent) && (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) | ||
254 | { | ||
255 | AvatarMovementprimContact.geom = contacts[i]; | ||
256 | joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementprimContact); | ||
257 | } | ||
258 | else | ||
259 | { | ||
260 | contact.geom = contacts[i]; | ||
261 | joint = d.JointCreateContact(world, contactgroup, ref contact); | ||
262 | |||
263 | } | ||
264 | |||
265 | } | ||
266 | |||
267 | |||
268 | d.JointAttach(joint, b1, b2); | ||
269 | |||
270 | |||
271 | |||
240 | if (count > 3) | 272 | if (count > 3) |
241 | { | 273 | { |
242 | p2.ThrottleUpdates = true; | 274 | p2.ThrottleUpdates = true; |
@@ -652,7 +684,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
652 | private PhysicsVector _target_velocity; | 684 | private PhysicsVector _target_velocity; |
653 | private PhysicsVector _acceleration; | 685 | private PhysicsVector _acceleration; |
654 | private PhysicsVector m_rotationalVelocity; | 686 | private PhysicsVector m_rotationalVelocity; |
655 | private static float PID_D = 4000.0f; | 687 | private static float PID_D = 3020.0f; |
656 | private static float PID_P = 7000.0f; | 688 | private static float PID_P = 7000.0f; |
657 | private static float POSTURE_SERVO = 10000.0f; | 689 | private static float POSTURE_SERVO = 10000.0f; |
658 | public static float CAPSULE_RADIUS = 0.5f; | 690 | public static float CAPSULE_RADIUS = 0.5f; |
@@ -955,11 +987,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
955 | 987 | ||
956 | if (!m_alwaysRun) | 988 | if (!m_alwaysRun) |
957 | { | 989 | { |
958 | movementdivisor = 10.5f; | 990 | movementdivisor = 1.3f; |
959 | } | 991 | } |
960 | else | 992 | else |
961 | { | 993 | { |
962 | movementdivisor = 0.2079f; | 994 | movementdivisor = 0.8f; |
963 | 995 | ||
964 | } | 996 | } |
965 | 997 | ||
@@ -987,8 +1019,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
987 | if (m_iscolliding || flying) | 1019 | if (m_iscolliding || flying) |
988 | { | 1020 | { |
989 | 1021 | ||
990 | vec.X = ((_target_velocity.X - vel.X)/movementdivisor) * PID_D; | 1022 | vec.X = ((_target_velocity.X/movementdivisor) - vel.X) * PID_D; |
991 | vec.Y = ((_target_velocity.Y - vel.Y)/movementdivisor) * PID_D; | 1023 | vec.Y = ((_target_velocity.Y/movementdivisor) - vel.Y) * PID_D; |
992 | } | 1024 | } |
993 | if (m_iscolliding && !flying && _target_velocity.Z > 0.0f) | 1025 | if (m_iscolliding && !flying && _target_velocity.Z > 0.0f) |
994 | { | 1026 | { |