diff options
-rw-r--r-- | OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs | 72 |
1 files changed, 42 insertions, 30 deletions
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs index ecd5474..daf6c7c 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs | |||
@@ -96,6 +96,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
96 | private float m_feetOffset = 0; | 96 | private float m_feetOffset = 0; |
97 | private float feetOff = 0; | 97 | private float feetOff = 0; |
98 | private float boneOff = 0; | 98 | private float boneOff = 0; |
99 | private float AvaAvaSizeXsq = 0.3f; | ||
100 | private float AvaAvaSizeYsq = 0.2f; | ||
99 | 101 | ||
100 | public float walkDivisor = 1.3f; | 102 | public float walkDivisor = 1.3f; |
101 | public float runDivisor = 0.8f; | 103 | public float runDivisor = 0.8f; |
@@ -136,7 +138,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
136 | public IntPtr Body = IntPtr.Zero; | 138 | public IntPtr Body = IntPtr.Zero; |
137 | private OdeScene _parent_scene; | 139 | private OdeScene _parent_scene; |
138 | private IntPtr capsule = IntPtr.Zero; | 140 | private IntPtr capsule = IntPtr.Zero; |
139 | private IntPtr bbox = IntPtr.Zero; | ||
140 | public IntPtr collider = IntPtr.Zero; | 141 | public IntPtr collider = IntPtr.Zero; |
141 | 142 | ||
142 | public IntPtr Amotor = IntPtr.Zero; | 143 | public IntPtr Amotor = IntPtr.Zero; |
@@ -709,6 +710,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
709 | 710 | ||
710 | feetOff = bot + feetsz; | 711 | feetOff = bot + feetsz; |
711 | 712 | ||
713 | AvaAvaSizeXsq = 0.4f * sx; | ||
714 | AvaAvaSizeXsq *= AvaAvaSizeXsq; | ||
715 | AvaAvaSizeYsq = 0.5f * sy; | ||
716 | AvaAvaSizeYsq *= AvaAvaSizeYsq; | ||
717 | |||
712 | _parent_scene.waitForSpaceUnlock(_parent_scene.CharsSpace); | 718 | _parent_scene.waitForSpaceUnlock(_parent_scene.CharsSpace); |
713 | 719 | ||
714 | collider = d.HashSpaceCreate(_parent_scene.CharsSpace); | 720 | collider = d.HashSpaceCreate(_parent_scene.CharsSpace); |
@@ -723,9 +729,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
723 | r = m_size.Y; | 729 | r = m_size.Y; |
724 | float l = m_size.Z - r; | 730 | float l = m_size.Z - r; |
725 | r *= 0.5f; | 731 | r *= 0.5f; |
726 | capsule = d.CreateCapsule(collider, r, l); | ||
727 | 732 | ||
728 | bbox = d.CreateBox(collider, m_size.X, m_size.Y, m_size.Z); | 733 | capsule = d.CreateCapsule(collider, r, l); |
729 | 734 | ||
730 | m_mass = m_density * m_size.X * m_size.Y * m_size.Z; // update mass | 735 | m_mass = m_density * m_size.X * m_size.Y * m_size.Z; // update mass |
731 | 736 | ||
@@ -750,8 +755,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
750 | _position.Z = npositionZ; | 755 | _position.Z = npositionZ; |
751 | 756 | ||
752 | d.BodySetMass(Body, ref ShellMass); | 757 | d.BodySetMass(Body, ref ShellMass); |
753 | |||
754 | d.GeomSetBody(bbox, Body); | ||
755 | d.GeomSetBody(capsule, Body); | 758 | d.GeomSetBody(capsule, Body); |
756 | 759 | ||
757 | // The purpose of the AMotor here is to keep the avatar's physical | 760 | // The purpose of the AMotor here is to keep the avatar's physical |
@@ -821,14 +824,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
821 | capsule = IntPtr.Zero; | 824 | capsule = IntPtr.Zero; |
822 | } | 825 | } |
823 | 826 | ||
824 | if (bbox != IntPtr.Zero) | ||
825 | { | ||
826 | _parent_scene.actor_name_map.Remove(bbox); | ||
827 | _parent_scene.waitForSpaceUnlock(collider); | ||
828 | d.GeomDestroy(bbox); | ||
829 | bbox = IntPtr.Zero; | ||
830 | } | ||
831 | |||
832 | if (collider != IntPtr.Zero) | 827 | if (collider != IntPtr.Zero) |
833 | { | 828 | { |
834 | d.SpaceDestroy(collider); | 829 | d.SpaceDestroy(collider); |
@@ -871,20 +866,44 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
871 | } | 866 | } |
872 | 867 | ||
873 | 868 | ||
874 | public bool Collide(IntPtr me, bool reverse, ref d.ContactGeom contact, ref bool feetcollision) | 869 | public bool Collide(IntPtr me,IntPtr other, bool reverse, ref d.ContactGeom contact, ref bool feetcollision) |
875 | { | 870 | { |
876 | feetcollision = false; | 871 | feetcollision = false; |
877 | 872 | ||
878 | Vector3 offset; | ||
879 | |||
880 | offset.X = contact.pos.X - _position.X; | ||
881 | offset.Y = contact.pos.Y - _position.Y; | ||
882 | |||
883 | if (me == capsule) | 873 | if (me == capsule) |
884 | { | 874 | { |
875 | Vector3 offset; | ||
876 | |||
885 | float h = contact.pos.Z - _position.Z; | 877 | float h = contact.pos.Z - _position.Z; |
886 | offset.Z = h - feetOff; | 878 | offset.Z = h - feetOff; |
887 | 879 | ||
880 | offset.X = contact.pos.X - _position.X; | ||
881 | offset.Y = contact.pos.Y - _position.Y; | ||
882 | |||
883 | d.GeomClassID gtype = d.GeomGetClass(other); | ||
884 | if (gtype == d.GeomClassID.CapsuleClass) | ||
885 | { | ||
886 | Vector3 roff = offset * Quaternion.Inverse(m_orientation2D); | ||
887 | float r = roff.X *roff.X / AvaAvaSizeXsq; | ||
888 | r += (roff.Y * roff.Y) / AvaAvaSizeYsq; | ||
889 | if (r > 1.0f) | ||
890 | return false; | ||
891 | |||
892 | float dp = 1.0f -(float)Math.Sqrt((double)r); | ||
893 | if (dp > 0.05f) | ||
894 | dp = 0.05f; | ||
895 | |||
896 | contact.depth = dp; | ||
897 | |||
898 | if (offset.Z < 0) | ||
899 | { | ||
900 | feetcollision = true; | ||
901 | if (h < boneOff) | ||
902 | IsColliding = true; | ||
903 | } | ||
904 | return true; | ||
905 | } | ||
906 | |||
888 | if (offset.Z > 0) | 907 | if (offset.Z > 0) |
889 | return true; | 908 | return true; |
890 | 909 | ||
@@ -905,11 +924,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
905 | feetcollision = true; | 924 | feetcollision = true; |
906 | if (h < boneOff) | 925 | if (h < boneOff) |
907 | IsColliding = true; | 926 | IsColliding = true; |
927 | return true; | ||
908 | } | 928 | } |
909 | else | 929 | return false; |
910 | return false; | ||
911 | |||
912 | return true; | ||
913 | } | 930 | } |
914 | 931 | ||
915 | /// <summary> | 932 | /// <summary> |
@@ -1094,8 +1111,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1094 | // Avatar to Avatar collisions | 1111 | // Avatar to Avatar collisions |
1095 | // Prim to avatar collisions | 1112 | // Prim to avatar collisions |
1096 | 1113 | ||
1097 | vec.X = -vel.X * PID_D + (_zeroPosition.X - localpos.X) * (PID_P * 2); | 1114 | vec.X = -vel.X * PID_D * 2 + (_zeroPosition.X - localpos.X) * (PID_P * 5); |
1098 | vec.Y = -vel.Y * PID_D + (_zeroPosition.Y - localpos.Y) * (PID_P * 2); | 1115 | vec.Y = -vel.Y * PID_D * 2 + (_zeroPosition.Y - localpos.Y) * (PID_P * 5); |
1099 | if (flying) | 1116 | if (flying) |
1100 | { | 1117 | { |
1101 | vec.Z += -vel.Z * PID_D + (_zeroPosition.Z - localpos.Z) * PID_P; | 1118 | vec.Z += -vel.Z * PID_D + (_zeroPosition.Z - localpos.Z) * PID_P; |
@@ -1389,10 +1406,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1389 | AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z); | 1406 | AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z); |
1390 | 1407 | ||
1391 | _parent_scene.actor_name_map[collider] = (PhysicsActor)this; | 1408 | _parent_scene.actor_name_map[collider] = (PhysicsActor)this; |
1392 | // _parent_scene.actor_name_map[feetbox] = (PhysicsActor)this; | ||
1393 | // _parent_scene.actor_name_map[midbox] = (PhysicsActor)this; | ||
1394 | // _parent_scene.actor_name_map[topbox] = (PhysicsActor)this; | ||
1395 | _parent_scene.actor_name_map[bbox] = (PhysicsActor)this; | ||
1396 | _parent_scene.actor_name_map[capsule] = (PhysicsActor)this; | 1409 | _parent_scene.actor_name_map[capsule] = (PhysicsActor)this; |
1397 | _parent_scene.AddCharacter(this); | 1410 | _parent_scene.AddCharacter(this); |
1398 | } | 1411 | } |
@@ -1449,7 +1462,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1449 | 1462 | ||
1450 | 1463 | ||
1451 | _parent_scene.actor_name_map[collider] = (PhysicsActor)this; | 1464 | _parent_scene.actor_name_map[collider] = (PhysicsActor)this; |
1452 | _parent_scene.actor_name_map[bbox] = (PhysicsActor)this; | ||
1453 | _parent_scene.actor_name_map[capsule] = (PhysicsActor)this; | 1465 | _parent_scene.actor_name_map[capsule] = (PhysicsActor)this; |
1454 | } | 1466 | } |
1455 | m_freemove = false; | 1467 | m_freemove = false; |