aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs126
1 files changed, 64 insertions, 62 deletions
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
index b769c88..27a9f1c 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
@@ -970,78 +970,86 @@ namespace OpenSim.Region.Physics.OdePlugin
970 if (m_collisionException) 970 if (m_collisionException)
971 return false; 971 return false;
972 972
973 Vector3 offset;
974
973 if (me == bbox) // if moving fast 975 if (me == bbox) // if moving fast
974 { 976 {
975 // force a full inelastic collision 977 // force a full inelastic collision
976 m_collisionException = true; 978 m_collisionException = true;
977 979
978 Vector3 off = m_size * 0.5f; 980 offset = m_size * m_orientation;
979 off.X += contact.depth; 981
980 off.Y += contact.depth; 982 offset.X = (float)Math.Abs(offset.X) * 0.5f + contact.depth;
981 off.Z += contact.depth; 983 offset.Y = (float)Math.Abs(offset.Y) * 0.5f + contact.depth;
984 offset.Z = (float)Math.Abs(offset.Z) * 0.5f + contact.depth;
985
982 if (reverse) 986 if (reverse)
983 { 987 {
984 off.X *= -contact.normal.X; 988 offset.X *= -contact.normal.X;
985 off.Y *= -contact.normal.Y; 989 offset.Y *= -contact.normal.Y;
986 off.Z *= -contact.normal.Z; 990 offset.Z *= -contact.normal.Z;
987 } 991 }
988 else 992 else
989 { 993 {
990 off.X *= contact.normal.X; 994 offset.X *= contact.normal.X;
991 off.Y *= contact.normal.Y; 995 offset.Y *= contact.normal.Y;
992 off.Z *= contact.normal.Z; 996 offset.Z *= contact.normal.Z;
993 } 997 }
994 998
995 off.X += contact.pos.X; 999 offset.X += contact.pos.X;
996 off.Y += contact.pos.Y; 1000 offset.Y += contact.pos.Y;
997 off.Z += contact.pos.Z; 1001 offset.Z += contact.pos.Z;
998 1002
999 _position = off; 1003 _position = offset;
1000 return false; 1004 return false;
1001 } 1005 }
1002 1006
1003 if (me == topbox) // keep a box head 1007 offset.X = contact.pos.X - _position.X;
1004 return true; 1008 offset.Y = contact.pos.Y - _position.Y;
1005
1006 float t;
1007 float offx = contact.pos.X - _position.X;
1008 float offy = contact.pos.Y - _position.Y;
1009 1009
1010 if (me == midbox) 1010 if (me == topbox)
1011 { 1011 {
1012 if (Math.Abs(contact.normal.Z) > 0.95f) 1012 offset.Z = contact.pos.Z - _position.Z;
1013 {
1014 float nz = contact.normal.Z;
1015 if (!reverse)
1016 nz = -nz;
1017
1018 if (nz > 0)
1019 return true; // missed head TODO
1020 1013
1021 // missed feet collision? 1014 offset.Normalize();
1022 1015
1023 1016 if (reverse)
1024 return true; 1017 {
1018 contact.normal.X = offset.X;
1019 contact.normal.Y = offset.Y;
1020 contact.normal.Z = offset.Z;
1021 }
1022 else
1023 {
1024 contact.normal.X = -offset.X;
1025 contact.normal.Y = -offset.Y;
1026 contact.normal.Z = -offset.Z;
1025 } 1027 }
1028 return true;
1029 }
1026 1030
1027 t = offx * offx + offy * offy; 1031 if (me == midbox)
1028 t = (float)Math.Sqrt(t); 1032 {
1029 t = 1 / t; 1033 if (Math.Abs(contact.normal.Z) > 0.95f)
1030 offx *= t; 1034 offset.Z = contact.pos.Z - _position.Z;
1031 offy *= t; 1035 else
1036 offset.Z = contact.normal.Z;
1037
1038 offset.Normalize();
1032 1039
1033 if (reverse) 1040 if (reverse)
1034 { 1041 {
1035 contact.normal.X = offx; 1042 contact.normal.X = offset.X;
1036 contact.normal.Y = offy; 1043 contact.normal.Y = offset.Y;
1044 contact.normal.Z = offset.Z;
1037 } 1045 }
1038 else 1046 else
1039 { 1047 {
1040 contact.normal.X = -offx; 1048 contact.normal.X = -offset.X;
1041 contact.normal.Y = -offy; 1049 contact.normal.Y = -offset.Y;
1050 contact.normal.Z = -offset.Z;
1042 } 1051 }
1043 1052
1044 contact.normal.Z = 0;
1045 return true; 1053 return true;
1046 } 1054 }
1047 1055
@@ -1063,39 +1071,33 @@ namespace OpenSim.Region.Physics.OdePlugin
1063 return true; 1071 return true;
1064 } 1072 }
1065 1073
1074 offset.Z = h - feetOff; // distance from top of feetbox
1066 1075
1067 float offz = h - feetOff; // distance from top of feetbox 1076 if (offset.Z > 0)
1068
1069 if (offz > 0)
1070 return false; 1077 return false;
1071 1078
1072 if (offz > -0.01) 1079 if (offset.Z > -0.01)
1073 { 1080 {
1074 offx = 0; 1081 offset.X = 0;
1075 offy = 0; 1082 offset.Y = 0;
1076 offz = -1.0f; 1083 offset.Z = -1.0f;
1077 } 1084 }
1078 else 1085 else
1079 { 1086 {
1080 t = offx * offx + offy * offy + offz * offz; 1087 offset.Normalize();
1081 t = (float)Math.Sqrt(t);
1082 t = 1 / t;
1083 offx *= t;
1084 offy *= t;
1085 offz *= t;
1086 } 1088 }
1087 1089
1088 if (reverse) 1090 if (reverse)
1089 { 1091 {
1090 contact.normal.X = offx; 1092 contact.normal.X = offset.X;
1091 contact.normal.Y = offy; 1093 contact.normal.Y = offset.Y;
1092 contact.normal.Z = offz; 1094 contact.normal.Z = offset.Z;
1093 } 1095 }
1094 else 1096 else
1095 { 1097 {
1096 contact.normal.X = -offx; 1098 contact.normal.X = -offset.X;
1097 contact.normal.Y = -offy; 1099 contact.normal.Y = -offset.Y;
1098 contact.normal.Z = -offz; 1100 contact.normal.Z = -offset.Z;
1099 } 1101 }
1100 feetcollision = true; 1102 feetcollision = true;
1101 if (h < boneOff) 1103 if (h < boneOff)
@@ -1125,7 +1127,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1125 float v = _velocity.Length(); 1127 float v = _velocity.Length();
1126 if (v != 0) 1128 if (v != 0)
1127 { 1129 {
1128 v = 6.0f / v; 1130 v = 5.0f / v;
1129 _velocity = _velocity * v; 1131 _velocity = _velocity * v;
1130 d.BodySetLinearVel(Body, _velocity.X, _velocity.Y, _velocity.Z); 1132 d.BodySetLinearVel(Body, _velocity.X, _velocity.Y, _velocity.Z);
1131 } 1133 }