diff options
Diffstat (limited to 'OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs')
-rw-r--r-- | OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 82 |
1 files changed, 74 insertions, 8 deletions
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index bfcfd21..d5968fc 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | |||
@@ -1006,16 +1006,82 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1006 | else | 1006 | else |
1007 | 1007 | ||
1008 | { | 1008 | { |
1009 | if (dop1foot && (p1.Position.Z - curContact.pos.Z) > (p1.Size.Z - avCapRadius) * 0.5f) | ||
1010 | p1.IsColliding = true; | ||
1011 | if (dop2foot && (p2.Position.Z - curContact.pos.Z) > (p2.Size.Z - avCapRadius) * 0.5f) | ||
1012 | p2.IsColliding = true; | ||
1013 | 1009 | ||
1014 | if (AvanormOverride && curContact.depth > 0.3f) | 1010 | if (AvanormOverride) |
1015 | { | 1011 | { |
1016 | curContact.normal.X = normoverride.X; | 1012 | if (curContact.depth > 0.3f) |
1017 | curContact.normal.Y = normoverride.Y; | 1013 | { |
1018 | curContact.normal.Z = normoverride.Z; | 1014 | if (dop1foot && (p1.Position.Z - curContact.pos.Z) > (p1.Size.Z - avCapRadius) * 0.5f) |
1015 | p1.IsColliding = true; | ||
1016 | if (dop2foot && (p2.Position.Z - curContact.pos.Z) > (p2.Size.Z - avCapRadius) * 0.5f) | ||
1017 | p2.IsColliding = true; | ||
1018 | curContact.normal.X = normoverride.X; | ||
1019 | curContact.normal.Y = normoverride.Y; | ||
1020 | curContact.normal.Z = normoverride.Z; | ||
1021 | } | ||
1022 | |||
1023 | else | ||
1024 | { | ||
1025 | if (dop1foot) | ||
1026 | { | ||
1027 | float sz = p1.Size.Z; | ||
1028 | Vector3 vtmp = p1.Position; | ||
1029 | float ppos = curContact.pos.Z - vtmp.Z + (sz - avCapRadius) * 0.5f; | ||
1030 | if (ppos > 0f) | ||
1031 | { | ||
1032 | if (!p1.Flying) | ||
1033 | { | ||
1034 | d.AABB aabb; | ||
1035 | d.GeomGetAABB(g2, out aabb); | ||
1036 | float tmp = vtmp.Z - sz * .25f; | ||
1037 | |||
1038 | if (aabb.MaxZ < tmp) | ||
1039 | { | ||
1040 | vtmp.X = curContact.pos.X - vtmp.X; | ||
1041 | vtmp.Y = curContact.pos.Y - vtmp.Y; | ||
1042 | vtmp.Z = -0.2f; | ||
1043 | vtmp.Normalize(); | ||
1044 | curContact.normal.X = vtmp.X; | ||
1045 | curContact.normal.Y = vtmp.Y; | ||
1046 | curContact.normal.Z = vtmp.Z; | ||
1047 | } | ||
1048 | } | ||
1049 | } | ||
1050 | else | ||
1051 | p1.IsColliding = true; | ||
1052 | |||
1053 | } | ||
1054 | |||
1055 | if (dop2foot) | ||
1056 | { | ||
1057 | float sz = p2.Size.Z; | ||
1058 | Vector3 vtmp = p2.Position; | ||
1059 | float ppos = curContact.pos.Z - vtmp.Z + (sz - avCapRadius) * 0.5f; | ||
1060 | if (ppos > 0f) | ||
1061 | { | ||
1062 | if (!p2.Flying) | ||
1063 | { | ||
1064 | d.AABB aabb; | ||
1065 | d.GeomGetAABB(g1, out aabb); | ||
1066 | float tmp = vtmp.Z - sz * .25f; | ||
1067 | |||
1068 | if (aabb.MaxZ < tmp) | ||
1069 | { | ||
1070 | vtmp.X = curContact.pos.X - vtmp.X; | ||
1071 | vtmp.Y = curContact.pos.Y - vtmp.Y; | ||
1072 | vtmp.Z = -0.2f; | ||
1073 | vtmp.Normalize(); | ||
1074 | curContact.normal.X = vtmp.X; | ||
1075 | curContact.normal.Y = vtmp.Y; | ||
1076 | curContact.normal.Z = vtmp.Z; | ||
1077 | } | ||
1078 | } | ||
1079 | } | ||
1080 | else | ||
1081 | p2.IsColliding = true; | ||
1082 | |||
1083 | } | ||
1084 | } | ||
1019 | } | 1085 | } |
1020 | 1086 | ||
1021 | Joint = CreateContacJoint(ref curContact, mu, bounce, cfm, erpscale, dscale); | 1087 | Joint = CreateContacJoint(ref curContact, mu, bounce, cfm, erpscale, dscale); |