diff options
-rw-r--r-- | OpenSim/Region/PhysicsModules/Ode/ODECharacter.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/PhysicsModules/Ode/ODEPrim.cs | 101 |
2 files changed, 47 insertions, 56 deletions
diff --git a/OpenSim/Region/PhysicsModules/Ode/ODECharacter.cs b/OpenSim/Region/PhysicsModules/Ode/ODECharacter.cs index 8048e26..c1afe13 100644 --- a/OpenSim/Region/PhysicsModules/Ode/ODECharacter.cs +++ b/OpenSim/Region/PhysicsModules/Ode/ODECharacter.cs | |||
@@ -595,7 +595,7 @@ namespace OpenSim.Region.PhysicsModule.ODE | |||
595 | 595 | ||
596 | public override void delink() {} | 596 | public override void delink() {} |
597 | 597 | ||
598 | public override void LockAngularMotion(Vector3 axis) {} | 598 | public override void LockAngularMotion(byte axislocks) {} |
599 | 599 | ||
600 | // This code is very useful. Written by DanX0r. We're just not using it right now. | 600 | // This code is very useful. Written by DanX0r. We're just not using it right now. |
601 | // Commented out to prevent a warning. | 601 | // Commented out to prevent a warning. |
diff --git a/OpenSim/Region/PhysicsModules/Ode/ODEPrim.cs b/OpenSim/Region/PhysicsModules/Ode/ODEPrim.cs index 061beea..0a57dc9 100644 --- a/OpenSim/Region/PhysicsModules/Ode/ODEPrim.cs +++ b/OpenSim/Region/PhysicsModules/Ode/ODEPrim.cs | |||
@@ -111,10 +111,12 @@ namespace OpenSim.Region.PhysicsModule.ODE | |||
111 | private Vector3 m_taintVelocity; | 111 | private Vector3 m_taintVelocity; |
112 | private Vector3 m_taintTorque; | 112 | private Vector3 m_taintTorque; |
113 | private Quaternion m_taintrot; | 113 | private Quaternion m_taintrot; |
114 | private Vector3 m_angularlock = Vector3.One; | 114 | |
115 | private Vector3 m_taintAngularLock = Vector3.One; | ||
116 | private IntPtr Amotor = IntPtr.Zero; | 115 | private IntPtr Amotor = IntPtr.Zero; |
117 | 116 | ||
117 | private byte m_taintAngularLock = 0; | ||
118 | private byte m_angularlock = 0; | ||
119 | |||
118 | private bool m_assetFailed = false; | 120 | private bool m_assetFailed = false; |
119 | 121 | ||
120 | private Vector3 m_PIDTarget; | 122 | private Vector3 m_PIDTarget; |
@@ -452,7 +454,7 @@ namespace OpenSim.Region.PhysicsModule.ODE | |||
452 | m_disabled = false; | 454 | m_disabled = false; |
453 | 455 | ||
454 | // The body doesn't already have a finite rotation mode set here | 456 | // The body doesn't already have a finite rotation mode set here |
455 | if ((!m_angularlock.ApproxEquals(Vector3.One, 0.0f)) && _parent == null) | 457 | if (m_angularlock != 0 && _parent == null) |
456 | { | 458 | { |
457 | createAMotor(m_angularlock); | 459 | createAMotor(m_angularlock); |
458 | } | 460 | } |
@@ -1008,7 +1010,7 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1008 | if (m_taintCollidesWater != m_collidesWater) | 1010 | if (m_taintCollidesWater != m_collidesWater) |
1009 | changefloatonwater(); | 1011 | changefloatonwater(); |
1010 | 1012 | ||
1011 | if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f)) | 1013 | if (m_taintAngularLock != m_angularlock) |
1012 | changeAngularLock(); | 1014 | changeAngularLock(); |
1013 | } | 1015 | } |
1014 | 1016 | ||
@@ -1024,10 +1026,8 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1024 | //If we have a parent then we're not authorative here | 1026 | //If we have a parent then we're not authorative here |
1025 | if (_parent == null) | 1027 | if (_parent == null) |
1026 | { | 1028 | { |
1027 | if (!m_taintAngularLock.ApproxEquals(Vector3.One, 0f)) | 1029 | if (m_taintAngularLock != 0) |
1028 | { | 1030 | { |
1029 | //d.BodySetFiniteRotationMode(Body, 0); | ||
1030 | //d.BodySetFiniteRotationAxis(Body,m_taintAngularLock.X,m_taintAngularLock.Y,m_taintAngularLock.Z); | ||
1031 | createAMotor(m_taintAngularLock); | 1031 | createAMotor(m_taintAngularLock); |
1032 | } | 1032 | } |
1033 | else | 1033 | else |
@@ -1041,7 +1041,6 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1041 | } | 1041 | } |
1042 | } | 1042 | } |
1043 | 1043 | ||
1044 | // Store this for later in case we get turned into a separate body | ||
1045 | m_angularlock = m_taintAngularLock; | 1044 | m_angularlock = m_taintAngularLock; |
1046 | } | 1045 | } |
1047 | 1046 | ||
@@ -1237,7 +1236,8 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1237 | m_disabled = false; | 1236 | m_disabled = false; |
1238 | 1237 | ||
1239 | // The body doesn't already have a finite rotation mode set here | 1238 | // The body doesn't already have a finite rotation mode set here |
1240 | if ((!m_angularlock.ApproxEquals(Vector3.One, 0f)) && _parent == null) | 1239 | // or remove |
1240 | if (_parent == null) | ||
1241 | { | 1241 | { |
1242 | createAMotor(m_angularlock); | 1242 | createAMotor(m_angularlock); |
1243 | } | 1243 | } |
@@ -1707,21 +1707,6 @@ Console.WriteLine(" JointCreateFixed"); | |||
1707 | { | 1707 | { |
1708 | //Console.WriteLine("Move " + Name); | 1708 | //Console.WriteLine("Move " + Name); |
1709 | if (!d.BodyIsEnabled (Body)) d.BodyEnable (Body); // KF add 161009 | 1709 | if (!d.BodyIsEnabled (Body)) d.BodyEnable (Body); // KF add 161009 |
1710 | // NON-'VEHICLES' are dealt with here | ||
1711 | // if (d.BodyIsEnabled(Body) && !m_angularlock.ApproxEquals(Vector3.Zero, 0.003f)) | ||
1712 | // { | ||
1713 | // d.Vector3 avel2 = d.BodyGetAngularVel(Body); | ||
1714 | // /* | ||
1715 | // if (m_angularlock.X == 1) | ||
1716 | // avel2.X = 0; | ||
1717 | // if (m_angularlock.Y == 1) | ||
1718 | // avel2.Y = 0; | ||
1719 | // if (m_angularlock.Z == 1) | ||
1720 | // avel2.Z = 0; | ||
1721 | // d.BodySetAngularVel(Body, avel2.X, avel2.Y, avel2.Z); | ||
1722 | // */ | ||
1723 | // } | ||
1724 | //float PID_P = 900.0f; | ||
1725 | 1710 | ||
1726 | float m_mass = CalculateMass(); | 1711 | float m_mass = CalculateMass(); |
1727 | 1712 | ||
@@ -1950,8 +1935,8 @@ Console.WriteLine(" JointCreateFixed"); | |||
1950 | d.BodySetQuaternion(Body, ref myrot); | 1935 | d.BodySetQuaternion(Body, ref myrot); |
1951 | if (IsPhysical) | 1936 | if (IsPhysical) |
1952 | { | 1937 | { |
1953 | if (!m_angularlock.ApproxEquals(Vector3.One, 0f)) | 1938 | // create or remove locks |
1954 | createAMotor(m_angularlock); | 1939 | createAMotor(m_angularlock); |
1955 | } | 1940 | } |
1956 | } | 1941 | } |
1957 | else | 1942 | else |
@@ -2719,21 +2704,10 @@ Console.WriteLine(" JointCreateFixed"); | |||
2719 | m_taintparent = null; | 2704 | m_taintparent = null; |
2720 | } | 2705 | } |
2721 | 2706 | ||
2722 | public override void LockAngularMotion(Vector3 axis) | 2707 | public override void LockAngularMotion(byte axislocks) |
2723 | { | 2708 | { |
2724 | // reverse the zero/non zero values for ODE. | 2709 | // m_log.DebugFormat("[axislocks]: {0}", axislocks); |
2725 | if (axis.IsFinite()) | 2710 | m_taintAngularLock = axislocks; |
2726 | { | ||
2727 | axis.X = (axis.X > 0) ? 1f : 0f; | ||
2728 | axis.Y = (axis.Y > 0) ? 1f : 0f; | ||
2729 | axis.Z = (axis.Z > 0) ? 1f : 0f; | ||
2730 | m_log.DebugFormat("[axislock]: <{0},{1},{2}>", axis.X, axis.Y, axis.Z); | ||
2731 | m_taintAngularLock = axis; | ||
2732 | } | ||
2733 | else | ||
2734 | { | ||
2735 | m_log.WarnFormat("[PHYSICS]: Got NaN locking axis from Scene on Object {0}", Name); | ||
2736 | } | ||
2737 | } | 2711 | } |
2738 | 2712 | ||
2739 | internal void UpdatePositionAndVelocity() | 2713 | internal void UpdatePositionAndVelocity() |
@@ -3021,7 +2995,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
3021 | 2995 | ||
3022 | public override float APIDDamping{ set { return; } } | 2996 | public override float APIDDamping{ set { return; } } |
3023 | 2997 | ||
3024 | private void createAMotor(Vector3 axis) | 2998 | private void createAMotor(byte axislocks) |
3025 | { | 2999 | { |
3026 | if (Body == IntPtr.Zero) | 3000 | if (Body == IntPtr.Zero) |
3027 | return; | 3001 | return; |
@@ -3032,13 +3006,32 @@ Console.WriteLine(" JointCreateFixed"); | |||
3032 | Amotor = IntPtr.Zero; | 3006 | Amotor = IntPtr.Zero; |
3033 | } | 3007 | } |
3034 | 3008 | ||
3035 | float axisnum = 3; | 3009 | if(axislocks == 0) |
3036 | 3010 | return; | |
3037 | axisnum = (axisnum - (axis.X + axis.Y + axis.Z)); | ||
3038 | 3011 | ||
3039 | // PhysicsVector totalSize = new PhysicsVector(_size.X, _size.Y, _size.Z); | 3012 | int axisnum = 0; |
3013 | bool axisX = false; | ||
3014 | bool axisY = false; | ||
3015 | bool axisZ = false; | ||
3016 | if((axislocks & 0x02) != 0) | ||
3017 | { | ||
3018 | axisnum++; | ||
3019 | axisX = true; | ||
3020 | } | ||
3021 | if((axislocks & 0x04) != 0) | ||
3022 | { | ||
3023 | axisnum++; | ||
3024 | axisY = true; | ||
3025 | } | ||
3026 | if((axislocks & 0x08) != 0) | ||
3027 | { | ||
3028 | axisnum++; | ||
3029 | axisZ = true; | ||
3030 | } | ||
3040 | 3031 | ||
3041 | 3032 | if(axisnum == 0) | |
3033 | return; | ||
3034 | |||
3042 | // Inverse Inertia Matrix, set the X, Y, and/r Z inertia to 0 then invert it again. | 3035 | // Inverse Inertia Matrix, set the X, Y, and/r Z inertia to 0 then invert it again. |
3043 | d.Mass objMass; | 3036 | d.Mass objMass; |
3044 | d.MassSetZero(out objMass); | 3037 | d.MassSetZero(out objMass); |
@@ -3061,23 +3054,21 @@ Console.WriteLine(" JointCreateFixed"); | |||
3061 | 3054 | ||
3062 | mathmat = Inverse(mathmat); | 3055 | mathmat = Inverse(mathmat); |
3063 | */ | 3056 | */ |
3064 | if (axis.X == 0) | 3057 | if (axisX) |
3065 | { | 3058 | { |
3066 | mathmat.M33 = 50.0000001f; | 3059 | mathmat.M33 = 50.0000001f; |
3067 | //objMass.I.M22 = 0; | 3060 | //objMass.I.M22 = 0; |
3068 | } | 3061 | } |
3069 | if (axis.Y == 0) | 3062 | if (axisY) |
3070 | { | 3063 | { |
3071 | mathmat.M22 = 50.0000001f; | 3064 | mathmat.M22 = 50.0000001f; |
3072 | //objMass.I.M11 = 0; | 3065 | //objMass.I.M11 = 0; |
3073 | } | 3066 | } |
3074 | if (axis.Z == 0) | 3067 | if (axisZ) |
3075 | { | 3068 | { |
3076 | mathmat.M11 = 50.0000001f; | 3069 | mathmat.M11 = 50.0000001f; |
3077 | //objMass.I.M00 = 0; | 3070 | //objMass.I.M00 = 0; |
3078 | } | 3071 | } |
3079 | |||
3080 | |||
3081 | 3072 | ||
3082 | mathmat = Inverse(mathmat); | 3073 | mathmat = Inverse(mathmat); |
3083 | objMass = FromMatrix4(mathmat, ref objMass); | 3074 | objMass = FromMatrix4(mathmat, ref objMass); |
@@ -3104,25 +3095,25 @@ Console.WriteLine(" JointCreateFixed"); | |||
3104 | d.JointSetAMotorNumAxes(Amotor,(int)axisnum); | 3095 | d.JointSetAMotorNumAxes(Amotor,(int)axisnum); |
3105 | int i = 0; | 3096 | int i = 0; |
3106 | 3097 | ||
3107 | if (axis.X == 0) | 3098 | if (axisX) |
3108 | { | 3099 | { |
3109 | d.JointSetAMotorAxis(Amotor, i, 0, 1, 0, 0); | 3100 | d.JointSetAMotorAxis(Amotor, i, 0, 1, 0, 0); |
3110 | i++; | 3101 | i++; |
3111 | } | 3102 | } |
3112 | 3103 | ||
3113 | if (axis.Y == 0) | 3104 | if (axisY) |
3114 | { | 3105 | { |
3115 | d.JointSetAMotorAxis(Amotor, i, 0, 0, 1, 0); | 3106 | d.JointSetAMotorAxis(Amotor, i, 0, 0, 1, 0); |
3116 | i++; | 3107 | i++; |
3117 | } | 3108 | } |
3118 | 3109 | ||
3119 | if (axis.Z == 0) | 3110 | if (axisZ) |
3120 | { | 3111 | { |
3121 | d.JointSetAMotorAxis(Amotor, i, 0, 0, 0, 1); | 3112 | d.JointSetAMotorAxis(Amotor, i, 0, 0, 0, 1); |
3122 | i++; | 3113 | i++; |
3123 | } | 3114 | } |
3124 | 3115 | ||
3125 | for (int j = 0; j < (int)axisnum; j++) | 3116 | // for (int j = 0; j < (int)axisnum; j++) |
3126 | { | 3117 | { |
3127 | //d.JointSetAMotorAngle(Amotor, j, 0); | 3118 | //d.JointSetAMotorAngle(Amotor, j, 0); |
3128 | } | 3119 | } |