diff options
author | Melanie | 2013-06-23 01:59:57 +0100 |
---|---|---|
committer | Melanie | 2013-06-23 01:59:57 +0100 |
commit | f70357eaa355b8c152f3d793d0fceafa14df5fd4 (patch) | |
tree | ffda32c340bd7f6d69652e9d9a959c7396f42a2f /OpenSim/Region/Physics | |
parent | Merge branch 'avination-current' into careminster (diff) | |
parent | Merge branch 'master' of melanie@opensimulator.org:/var/git/opensim (diff) | |
download | opensim-SC-f70357eaa355b8c152f3d793d0fceafa14df5fd4.zip opensim-SC-f70357eaa355b8c152f3d793d0fceafa14df5fd4.tar.gz opensim-SC-f70357eaa355b8c152f3d793d0fceafa14df5fd4.tar.bz2 opensim-SC-f70357eaa355b8c152f3d793d0fceafa14df5fd4.tar.xz |
Merge branch 'master' into careminster
Conflicts:
OpenSim/Framework/Monitoring/BaseStatsCollector.cs
OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs
OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
Diffstat (limited to 'OpenSim/Region/Physics')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs | 44 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | 66 | ||||
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSParam.cs | 3 |
3 files changed, 92 insertions, 21 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs index ac8c30c..928b350 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs | |||
@@ -43,8 +43,14 @@ public class BSActorAvatarMove : BSActor | |||
43 | // Set to true if we think we're going up stairs. | 43 | // Set to true if we think we're going up stairs. |
44 | // This state is remembered because collisions will turn on and off as we go up stairs. | 44 | // This state is remembered because collisions will turn on and off as we go up stairs. |
45 | int m_walkingUpStairs; | 45 | int m_walkingUpStairs; |
46 | // The amount the step up is applying. Used to smooth stair walking. | ||
46 | float m_lastStepUp; | 47 | float m_lastStepUp; |
47 | 48 | ||
49 | // Jumping happens over several frames. If use applies up force while colliding, start the | ||
50 | // jump and allow the jump to continue for this number of frames. | ||
51 | int m_jumpFrames = 0; | ||
52 | float m_jumpVelocity = 0f; | ||
53 | |||
48 | public BSActorAvatarMove(BSScene physicsScene, BSPhysObject pObj, string actorName) | 54 | public BSActorAvatarMove(BSScene physicsScene, BSPhysObject pObj, string actorName) |
49 | : base(physicsScene, pObj, actorName) | 55 | : base(physicsScene, pObj, actorName) |
50 | { | 56 | { |
@@ -206,17 +212,45 @@ public class BSActorAvatarMove : BSActor | |||
206 | 212 | ||
207 | if (m_controllingPrim.Friction != BSParam.AvatarFriction) | 213 | if (m_controllingPrim.Friction != BSParam.AvatarFriction) |
208 | { | 214 | { |
209 | // Probably starting up walking. Set friction to moving friction. | 215 | // Probably starting to walk. Set friction to moving friction. |
210 | m_controllingPrim.Friction = BSParam.AvatarFriction; | 216 | m_controllingPrim.Friction = BSParam.AvatarFriction; |
211 | m_physicsScene.PE.SetFriction(m_controllingPrim.PhysBody, m_controllingPrim.Friction); | 217 | m_physicsScene.PE.SetFriction(m_controllingPrim.PhysBody, m_controllingPrim.Friction); |
212 | } | 218 | } |
213 | 219 | ||
214 | // If falling, we keep the world's downward vector no matter what the other axis specify. | ||
215 | // The check for RawVelocity.Z < 0 makes jumping work (temporary upward force). | ||
216 | if (!m_controllingPrim.Flying && !m_controllingPrim.IsColliding) | 220 | if (!m_controllingPrim.Flying && !m_controllingPrim.IsColliding) |
217 | { | 221 | { |
218 | if (m_controllingPrim.RawVelocity.Z < 0) | 222 | stepVelocity.Z = m_controllingPrim.RawVelocity.Z; |
223 | } | ||
224 | |||
225 | |||
226 | // Colliding and not flying with an upward force. The avatar must be trying to jump. | ||
227 | if (!m_controllingPrim.Flying && m_controllingPrim.IsColliding && stepVelocity.Z > 0) | ||
228 | { | ||
229 | // We allow the upward force to happen for this many frames. | ||
230 | m_jumpFrames = BSParam.AvatarJumpFrames; | ||
231 | m_jumpVelocity = stepVelocity.Z; | ||
232 | } | ||
233 | |||
234 | // The case where the avatar is not colliding and is not flying is special. | ||
235 | // The avatar is either falling or jumping and the user can be applying force to the avatar | ||
236 | // (force in some direction or force up or down). | ||
237 | // If the avatar has negative Z velocity and is not colliding, presume we're falling and keep the velocity. | ||
238 | // If the user is trying to apply upward force but we're not colliding, assume the avatar | ||
239 | // is trying to jump and don't apply the upward force if not touching the ground any more. | ||
240 | if (!m_controllingPrim.Flying && !m_controllingPrim.IsColliding) | ||
241 | { | ||
242 | // If upward velocity is being applied, this must be a jump and only allow that to go on so long | ||
243 | if (m_jumpFrames > 0) | ||
244 | { | ||
245 | // Since not touching the ground, only apply upward force for so long. | ||
246 | m_jumpFrames--; | ||
247 | stepVelocity.Z = m_jumpVelocity; | ||
248 | } | ||
249 | else | ||
250 | { | ||
251 | // Since we're not affected by anything, whatever vertical motion the avatar has, continue that. | ||
219 | stepVelocity.Z = m_controllingPrim.RawVelocity.Z; | 252 | stepVelocity.Z = m_controllingPrim.RawVelocity.Z; |
253 | } | ||
220 | // DetailLog("{0},BSCharacter.MoveMotor,taint,overrideStepZWithWorldZ,stepVel={1}", LocalID, stepVelocity); | 254 | // DetailLog("{0},BSCharacter.MoveMotor,taint,overrideStepZWithWorldZ,stepVel={1}", LocalID, stepVelocity); |
221 | } | 255 | } |
222 | 256 | ||
@@ -241,7 +275,7 @@ public class BSActorAvatarMove : BSActor | |||
241 | m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,IsColliding={1},flying={2},targSpeed={3},collisions={4},avHeight={5}", | 275 | m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,IsColliding={1},flying={2},targSpeed={3},collisions={4},avHeight={5}", |
242 | m_controllingPrim.LocalID, m_controllingPrim.IsColliding, m_controllingPrim.Flying, | 276 | m_controllingPrim.LocalID, m_controllingPrim.IsColliding, m_controllingPrim.Flying, |
243 | m_controllingPrim.TargetVelocitySpeed, m_controllingPrim.CollisionsLastTick.Count, m_controllingPrim.Size.Z); | 277 | m_controllingPrim.TargetVelocitySpeed, m_controllingPrim.CollisionsLastTick.Count, m_controllingPrim.Size.Z); |
244 | // This test is done if moving forward, not flying and is colliding with something. | 278 | |
245 | // Check for stairs climbing if colliding, not flying and moving forward | 279 | // Check for stairs climbing if colliding, not flying and moving forward |
246 | if ( m_controllingPrim.IsColliding | 280 | if ( m_controllingPrim.IsColliding |
247 | && !m_controllingPrim.Flying | 281 | && !m_controllingPrim.Flying |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index 311cf4f..07e87d1 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -209,7 +209,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
209 | m_VhoverTimescale = Math.Max(pValue, 0.01f); | 209 | m_VhoverTimescale = Math.Max(pValue, 0.01f); |
210 | break; | 210 | break; |
211 | case Vehicle.LINEAR_DEFLECTION_EFFICIENCY: | 211 | case Vehicle.LINEAR_DEFLECTION_EFFICIENCY: |
212 | m_linearDeflectionEfficiency = Math.Max(pValue, 0.01f); | 212 | m_linearDeflectionEfficiency = ClampInRange(0f, pValue, 1f); |
213 | break; | 213 | break; |
214 | case Vehicle.LINEAR_DEFLECTION_TIMESCALE: | 214 | case Vehicle.LINEAR_DEFLECTION_TIMESCALE: |
215 | m_linearDeflectionTimescale = Math.Max(pValue, 0.01f); | 215 | m_linearDeflectionTimescale = Math.Max(pValue, 0.01f); |
@@ -707,7 +707,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
707 | private Vector3 m_knownRotationalVelocity; | 707 | private Vector3 m_knownRotationalVelocity; |
708 | private Vector3 m_knownRotationalForce; | 708 | private Vector3 m_knownRotationalForce; |
709 | private Vector3 m_knownRotationalImpulse; | 709 | private Vector3 m_knownRotationalImpulse; |
710 | private Vector3 m_knownForwardVelocity; // vehicle relative forward speed | ||
711 | 710 | ||
712 | private const int m_knownChangedPosition = 1 << 0; | 711 | private const int m_knownChangedPosition = 1 << 0; |
713 | private const int m_knownChangedVelocity = 1 << 1; | 712 | private const int m_knownChangedVelocity = 1 << 1; |
@@ -719,7 +718,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
719 | private const int m_knownChangedRotationalImpulse = 1 << 7; | 718 | private const int m_knownChangedRotationalImpulse = 1 << 7; |
720 | private const int m_knownChangedTerrainHeight = 1 << 8; | 719 | private const int m_knownChangedTerrainHeight = 1 << 8; |
721 | private const int m_knownChangedWaterLevel = 1 << 9; | 720 | private const int m_knownChangedWaterLevel = 1 << 9; |
722 | private const int m_knownChangedForwardVelocity = 1 <<10; | ||
723 | 721 | ||
724 | public void ForgetKnownVehicleProperties() | 722 | public void ForgetKnownVehicleProperties() |
725 | { | 723 | { |
@@ -923,12 +921,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
923 | { | 921 | { |
924 | get | 922 | get |
925 | { | 923 | { |
926 | if ((m_knownHas & m_knownChangedForwardVelocity) == 0) | 924 | return VehicleVelocity * Quaternion.Inverse(Quaternion.Normalize(VehicleOrientation)); |
927 | { | ||
928 | m_knownForwardVelocity = VehicleVelocity * Quaternion.Inverse(Quaternion.Normalize(VehicleOrientation)); | ||
929 | m_knownHas |= m_knownChangedForwardVelocity; | ||
930 | } | ||
931 | return m_knownForwardVelocity; | ||
932 | } | 925 | } |
933 | } | 926 | } |
934 | private float VehicleForwardSpeed | 927 | private float VehicleForwardSpeed |
@@ -981,6 +974,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
981 | { | 974 | { |
982 | ComputeLinearVelocity(pTimestep); | 975 | ComputeLinearVelocity(pTimestep); |
983 | 976 | ||
977 | ComputeLinearDeflection(pTimestep); | ||
978 | |||
984 | ComputeLinearTerrainHeightCorrection(pTimestep); | 979 | ComputeLinearTerrainHeightCorrection(pTimestep); |
985 | 980 | ||
986 | ComputeLinearHover(pTimestep); | 981 | ComputeLinearHover(pTimestep); |
@@ -1026,12 +1021,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1026 | { | 1021 | { |
1027 | // Step the motor from the current value. Get the correction needed this step. | 1022 | // Step the motor from the current value. Get the correction needed this step. |
1028 | Vector3 origVelW = VehicleVelocity; // DEBUG | 1023 | Vector3 origVelW = VehicleVelocity; // DEBUG |
1029 | Vector3 currentVelV = VehicleVelocity * Quaternion.Inverse(VehicleOrientation); | 1024 | Vector3 currentVelV = VehicleForwardVelocity; |
1030 | Vector3 linearMotorCorrectionV = m_linearMotor.Step(pTimestep, currentVelV); | 1025 | Vector3 linearMotorCorrectionV = m_linearMotor.Step(pTimestep, currentVelV); |
1031 | 1026 | ||
1032 | // Friction reduces vehicle motion | 1027 | // Friction reduces vehicle motion based on absolute speed. Slow vehicle down by friction. |
1033 | Vector3 frictionFactorW = ComputeFrictionFactor(m_linearFrictionTimescale, pTimestep); | 1028 | Vector3 frictionFactorV = ComputeFrictionFactor(m_linearFrictionTimescale, pTimestep); |
1034 | linearMotorCorrectionV -= (currentVelV * frictionFactorW); | 1029 | linearMotorCorrectionV -= (currentVelV * frictionFactorV); |
1035 | 1030 | ||
1036 | // Motor is vehicle coordinates. Rotate it to world coordinates | 1031 | // Motor is vehicle coordinates. Rotate it to world coordinates |
1037 | Vector3 linearMotorVelocityW = linearMotorCorrectionV * VehicleOrientation; | 1032 | Vector3 linearMotorVelocityW = linearMotorCorrectionV * VehicleOrientation; |
@@ -1046,11 +1041,38 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1046 | // Add this correction to the velocity to make it faster/slower. | 1041 | // Add this correction to the velocity to make it faster/slower. |
1047 | VehicleVelocity += linearMotorVelocityW; | 1042 | VehicleVelocity += linearMotorVelocityW; |
1048 | 1043 | ||
1049 | |||
1050 | |||
1051 | VDetailLog("{0}, MoveLinear,velocity,origVelW={1},velV={2},correctV={3},correctW={4},newVelW={5},fricFact={6}", | 1044 | VDetailLog("{0}, MoveLinear,velocity,origVelW={1},velV={2},correctV={3},correctW={4},newVelW={5},fricFact={6}", |
1052 | ControllingPrim.LocalID, origVelW, currentVelV, linearMotorCorrectionV, | 1045 | ControllingPrim.LocalID, origVelW, currentVelV, linearMotorCorrectionV, |
1053 | linearMotorVelocityW, VehicleVelocity, frictionFactorW); | 1046 | linearMotorVelocityW, VehicleVelocity, frictionFactorV); |
1047 | } | ||
1048 | |||
1049 | //Given a Deflection Effiency and a Velocity, Returns a Velocity that is Partially Deflected onto the X Axis | ||
1050 | //Clamped so that a DeflectionTimescale of less then 1 does not increase force over original velocity | ||
1051 | private void ComputeLinearDeflection(float pTimestep) | ||
1052 | { | ||
1053 | Vector3 linearDeflectionV = Vector3.Zero; | ||
1054 | Vector3 velocityV = VehicleForwardVelocity; | ||
1055 | |||
1056 | // Velocity in Y and Z dimensions is movement to the side or turning. | ||
1057 | // Compute deflection factor from the to the side and rotational velocity | ||
1058 | linearDeflectionV.Y = SortedClampInRange(0, (velocityV.Y * m_linearDeflectionEfficiency) / m_linearDeflectionTimescale, velocityV.Y); | ||
1059 | linearDeflectionV.Z = SortedClampInRange(0, (velocityV.Z * m_linearDeflectionEfficiency) / m_linearDeflectionTimescale, velocityV.Z); | ||
1060 | |||
1061 | // Velocity to the side and around is corrected and moved into the forward direction | ||
1062 | linearDeflectionV.X += Math.Abs(linearDeflectionV.Y); | ||
1063 | linearDeflectionV.X += Math.Abs(linearDeflectionV.Z); | ||
1064 | |||
1065 | // Scale the deflection to the fractional simulation time | ||
1066 | linearDeflectionV *= pTimestep; | ||
1067 | |||
1068 | // Subtract the sideways and rotational velocity deflection factors while adding the correction forward | ||
1069 | linearDeflectionV *= new Vector3(1,-1,-1); | ||
1070 | |||
1071 | // Correciont is vehicle relative. Convert to world coordinates and add to the velocity | ||
1072 | VehicleVelocity += linearDeflectionV * VehicleOrientation; | ||
1073 | |||
1074 | VDetailLog("{0}, MoveLinear,LinearDeflection,linDefEff={1},linDefTS={2},linDeflectionV={3}", | ||
1075 | ControllingPrim.LocalID, m_linearDeflectionEfficiency, m_linearDeflectionTimescale, linearDeflectionV); | ||
1054 | } | 1076 | } |
1055 | 1077 | ||
1056 | public void ComputeLinearTerrainHeightCorrection(float pTimestep) | 1078 | public void ComputeLinearTerrainHeightCorrection(float pTimestep) |
@@ -1652,6 +1674,18 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1652 | return frictionFactor; | 1674 | return frictionFactor; |
1653 | } | 1675 | } |
1654 | 1676 | ||
1677 | private float SortedClampInRange(float clampa, float val, float clampb) | ||
1678 | { | ||
1679 | if (clampa > clampb) | ||
1680 | { | ||
1681 | float temp = clampa; | ||
1682 | clampa = clampb; | ||
1683 | clampb = temp; | ||
1684 | } | ||
1685 | return ClampInRange(clampa, val, clampb); | ||
1686 | |||
1687 | } | ||
1688 | |||
1655 | private float ClampInRange(float low, float val, float high) | 1689 | private float ClampInRange(float low, float val, float high) |
1656 | { | 1690 | { |
1657 | return Math.Max(low, Math.Min(val, high)); | 1691 | return Math.Max(low, Math.Min(val, high)); |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs index aad1108..6437b04 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs | |||
@@ -134,6 +134,7 @@ public static class BSParam | |||
134 | public static float AvatarHeightMidFudge { get; private set; } | 134 | public static float AvatarHeightMidFudge { get; private set; } |
135 | public static float AvatarHeightHighFudge { get; private set; } | 135 | public static float AvatarHeightHighFudge { get; private set; } |
136 | public static float AvatarContactProcessingThreshold { get; private set; } | 136 | public static float AvatarContactProcessingThreshold { get; private set; } |
137 | public static int AvatarJumpFrames { get; private set; } | ||
137 | public static float AvatarBelowGroundUpCorrectionMeters { get; private set; } | 138 | public static float AvatarBelowGroundUpCorrectionMeters { get; private set; } |
138 | public static float AvatarStepHeight { get; private set; } | 139 | public static float AvatarStepHeight { get; private set; } |
139 | public static float AvatarStepApproachFactor { get; private set; } | 140 | public static float AvatarStepApproachFactor { get; private set; } |
@@ -567,6 +568,8 @@ public static class BSParam | |||
567 | 0.1f ), | 568 | 0.1f ), |
568 | new ParameterDefn<float>("AvatarBelowGroundUpCorrectionMeters", "Meters to move avatar up if it seems to be below ground", | 569 | new ParameterDefn<float>("AvatarBelowGroundUpCorrectionMeters", "Meters to move avatar up if it seems to be below ground", |
569 | 1.0f ), | 570 | 1.0f ), |
571 | new ParameterDefn<int>("AvatarJumpFrames", "Number of frames to allow jump forces. Changes jump height.", | ||
572 | 4 ), | ||
570 | new ParameterDefn<float>("AvatarStepHeight", "Height of a step obstacle to consider step correction", | 573 | new ParameterDefn<float>("AvatarStepHeight", "Height of a step obstacle to consider step correction", |
571 | 0.6f ) , | 574 | 0.6f ) , |
572 | new ParameterDefn<float>("AvatarStepApproachFactor", "Factor to control angle of approach to step (0=straight on)", | 575 | new ParameterDefn<float>("AvatarStepApproachFactor", "Factor to control angle of approach to step (0=straight on)", |