diff options
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/OdePlugin.cs')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 110 |
1 files changed, 93 insertions, 17 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 98c5995..c93b96f 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -89,6 +89,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
89 | private d.ContactGeom[] contacts = new d.ContactGeom[30]; | 89 | private d.ContactGeom[] contacts = new d.ContactGeom[30]; |
90 | private d.Contact contact; | 90 | private d.Contact contact; |
91 | private d.Contact TerrainContact; | 91 | private d.Contact TerrainContact; |
92 | |||
92 | private int m_physicsiterations = 10; | 93 | private int m_physicsiterations = 10; |
93 | private float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag | 94 | private float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag |
94 | private PhysicsActor PANull = new NullPhysicsActor(); | 95 | private PhysicsActor PANull = new NullPhysicsActor(); |
@@ -208,11 +209,16 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
208 | } | 209 | } |
209 | 210 | ||
210 | 211 | ||
211 | d.JointAttach(joint, b1, b2); | 212 | d.JointAttach(joint, b1, b2); |
212 | 213 | ||
213 | 214 | ||
215 | PhysicsActor p1; | ||
214 | PhysicsActor p2; | 216 | PhysicsActor p2; |
215 | 217 | ||
218 | if (!actor_name_map.TryGetValue(g2, out p1)) | ||
219 | { | ||
220 | p1 = PANull; | ||
221 | } | ||
216 | if (!actor_name_map.TryGetValue(g2, out p2)) | 222 | if (!actor_name_map.TryGetValue(g2, out p2)) |
217 | { | 223 | { |
218 | p2 = PANull; | 224 | p2 = PANull; |
@@ -220,6 +226,17 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
220 | 226 | ||
221 | // We only need to test p2 for 'jump crouch purposes' | 227 | // We only need to test p2 for 'jump crouch purposes' |
222 | p2.IsColliding = true; | 228 | p2.IsColliding = true; |
229 | switch(p1.PhysicsActorType) { | ||
230 | case (int)ActorTypes.Agent: | ||
231 | p2.CollidingObj = true; | ||
232 | break; | ||
233 | case (int)ActorTypes.Prim: | ||
234 | p2.CollidingObj = true; | ||
235 | break; | ||
236 | case (int)ActorTypes.Unknown: | ||
237 | p2.CollidingGround = true; | ||
238 | break; | ||
239 | } | ||
223 | if (count > 3) | 240 | if (count > 3) |
224 | { | 241 | { |
225 | p2.ThrottleUpdates = true; | 242 | p2.ThrottleUpdates = true; |
@@ -237,6 +254,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
237 | 254 | ||
238 | 255 | ||
239 | chr.IsColliding = false; | 256 | chr.IsColliding = false; |
257 | chr.CollidingGround = false; | ||
258 | chr.CollidingObj = false; | ||
240 | d.SpaceCollide2(space, chr.Shell, IntPtr.Zero, nearCallback); | 259 | d.SpaceCollide2(space, chr.Shell, IntPtr.Zero, nearCallback); |
241 | foreach (OdeCharacter ch2 in _characters) | 260 | foreach (OdeCharacter ch2 in _characters) |
242 | /// should be a separate space -- lots of avatars will be N**2 slow | 261 | /// should be a separate space -- lots of avatars will be N**2 slow |
@@ -308,11 +327,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
308 | p = (OdePrim) prim; | 327 | p = (OdePrim) prim; |
309 | p.disableBody(); | 328 | p.disableBody(); |
310 | } | 329 | } |
311 | if (!((OdePrim)prim).prim_geom.Equals(null)) | 330 | |
312 | { | 331 | d.GeomDestroy(((OdePrim)prim).prim_geom); |
313 | if (((OdePrim)prim).prim_geom != (IntPtr) 0) | 332 | |
314 | d.GeomDestroy(((OdePrim)prim).prim_geom); | ||
315 | } | ||
316 | _prims.Remove((OdePrim)prim); | 333 | _prims.Remove((OdePrim)prim); |
317 | 334 | ||
318 | } | 335 | } |
@@ -642,8 +659,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
642 | public static float CAPSULE_LENGTH = 0.79f; | 659 | public static float CAPSULE_LENGTH = 0.79f; |
643 | private bool flying = false; | 660 | private bool flying = false; |
644 | private bool m_iscolliding = false; | 661 | private bool m_iscolliding = false; |
662 | private bool m_wascolliding = false; | ||
645 | 663 | ||
646 | private bool[] m_colliderarr = new bool[10]; | 664 | private bool[] m_colliderarr = new bool[11]; |
647 | 665 | ||
648 | private bool jumping = false; | 666 | private bool jumping = false; |
649 | //private float gravityAccel; | 667 | //private float gravityAccel; |
@@ -661,7 +679,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
661 | _acceleration = new PhysicsVector(); | 679 | _acceleration = new PhysicsVector(); |
662 | _parent_scene = parent_scene; | 680 | _parent_scene = parent_scene; |
663 | 681 | ||
664 | for (int i = 0; i < 10; i++) | 682 | for (int i = 0; i < 11; i++) |
665 | { | 683 | { |
666 | m_colliderarr[i] = false; | 684 | m_colliderarr[i] = false; |
667 | } | 685 | } |
@@ -679,7 +697,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
679 | parent_scene.geom_name_map[Shell] = avName; | 697 | parent_scene.geom_name_map[Shell] = avName; |
680 | parent_scene.actor_name_map[Shell] = (PhysicsActor)this; | 698 | parent_scene.actor_name_map[Shell] = (PhysicsActor)this; |
681 | } | 699 | } |
682 | 700 | public override int PhysicsActorType | |
701 | { | ||
702 | get { return (int)ActorTypes.Agent; } | ||
703 | set { return; } | ||
704 | } | ||
683 | public override bool IsPhysical | 705 | public override bool IsPhysical |
684 | { | 706 | { |
685 | get { return false; } | 707 | get { return false; } |
@@ -705,16 +727,16 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
705 | int truecount=0; | 727 | int truecount=0; |
706 | int falsecount=0; | 728 | int falsecount=0; |
707 | 729 | ||
708 | if (m_colliderarr.Length >= 6) | 730 | if (m_colliderarr.Length >= 10) |
709 | { | 731 | { |
710 | for (i = 0; i < 6; i++) | 732 | for (i = 0; i < 10; i++) |
711 | { | 733 | { |
712 | m_colliderarr[i] = m_colliderarr[i + 1]; | 734 | m_colliderarr[i] = m_colliderarr[i + 1]; |
713 | } | 735 | } |
714 | } | 736 | } |
715 | m_colliderarr[6] = value; | 737 | m_colliderarr[10] = value; |
716 | 738 | ||
717 | for (i = 0; i < 7; i++) | 739 | for (i = 0; i < 11; i++) |
718 | { | 740 | { |
719 | if (m_colliderarr[i]) | 741 | if (m_colliderarr[i]) |
720 | { | 742 | { |
@@ -728,7 +750,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
728 | 750 | ||
729 | // Equal truecounts and false counts means we're colliding with something. | 751 | // Equal truecounts and false counts means we're colliding with something. |
730 | 752 | ||
731 | if (falsecount > truecount) | 753 | if (falsecount > 1.2 * truecount) |
732 | { | 754 | { |
733 | m_iscolliding = false; | 755 | m_iscolliding = false; |
734 | } | 756 | } |
@@ -736,9 +758,25 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
736 | { | 758 | { |
737 | m_iscolliding = true; | 759 | m_iscolliding = true; |
738 | } | 760 | } |
761 | if (m_wascolliding != m_iscolliding) | ||
762 | { | ||
763 | base.SendCollisionUpdate(new CollisionEventUpdate()); | ||
764 | } | ||
765 | m_wascolliding = m_iscolliding; | ||
739 | } | 766 | } |
740 | } | 767 | } |
741 | public override PhysicsVector Position | 768 | public override bool CollidingGround |
769 | { | ||
770 | get { return false; } | ||
771 | set { return; } | ||
772 | } | ||
773 | public override bool CollidingObj | ||
774 | { | ||
775 | get { return false; } | ||
776 | set { return; } | ||
777 | } | ||
778 | |||
779 | public override PhysicsVector Position | ||
742 | { | 780 | { |
743 | get { return _position; } | 781 | get { return _position; } |
744 | set | 782 | set |
@@ -869,8 +907,30 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
869 | { | 907 | { |
870 | d.Vector3 pos = d.BodyGetPosition(Body); | 908 | d.Vector3 pos = d.BodyGetPosition(Body); |
871 | vec.Z = (_target_velocity.Z - vel.Z) * PID_D + (_zeroPosition.Z - pos.Z) * PID_P; | 909 | vec.Z = (_target_velocity.Z - vel.Z) * PID_D + (_zeroPosition.Z - pos.Z) * PID_P; |
910 | if (_target_velocity.X > 0) | ||
911 | { | ||
912 | vec.X = ((_target_velocity.X - vel.X) / 1.2f) * PID_D; | ||
913 | } | ||
914 | if (_target_velocity.Y > 0) | ||
915 | { | ||
916 | vec.Y = ((_target_velocity.Y - vel.Y) / 1.2f) * PID_D; | ||
917 | } | ||
918 | } | ||
919 | else if (!m_iscolliding && !flying) | ||
920 | { | ||
921 | d.Vector3 pos = d.BodyGetPosition(Body); | ||
922 | if (_target_velocity.X > 0) | ||
923 | { | ||
924 | vec.X = ((_target_velocity.X - vel.X)/1.2f) * PID_D; | ||
925 | } | ||
926 | if (_target_velocity.Y > 0) | ||
927 | { | ||
928 | vec.Y = ((_target_velocity.Y - vel.Y)/1.2f) * PID_D; | ||
929 | } | ||
930 | |||
872 | } | 931 | } |
873 | 932 | ||
933 | |||
874 | if (flying) | 934 | if (flying) |
875 | { | 935 | { |
876 | vec.Z = (_target_velocity.Z - vel.Z)*PID_D; | 936 | vec.Z = (_target_velocity.Z - vel.Z)*PID_D; |
@@ -1012,6 +1072,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1012 | // don't do .add() here; old geoms get recycled with the same hash | 1072 | // don't do .add() here; old geoms get recycled with the same hash |
1013 | } | 1073 | } |
1014 | } | 1074 | } |
1075 | public override int PhysicsActorType | ||
1076 | { | ||
1077 | get { return (int)ActorTypes.Prim; } | ||
1078 | set { return; } | ||
1079 | } | ||
1015 | public void enableBody() | 1080 | public void enableBody() |
1016 | { | 1081 | { |
1017 | // Sets the geom to a body | 1082 | // Sets the geom to a body |
@@ -1028,6 +1093,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1028 | d.GeomSetBody(prim_geom, Body); | 1093 | d.GeomSetBody(prim_geom, Body); |
1029 | d.BodySetAutoDisableFlag(Body, true); | 1094 | d.BodySetAutoDisableFlag(Body, true); |
1030 | d.BodySetAutoDisableSteps(Body,20); | 1095 | d.BodySetAutoDisableSteps(Body,20); |
1096 | |||
1031 | _parent_scene.addActivePrim(this); | 1097 | _parent_scene.addActivePrim(this); |
1032 | } | 1098 | } |
1033 | public void setMass() | 1099 | public void setMass() |
@@ -1122,6 +1188,16 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1122 | get { return iscolliding; } | 1188 | get { return iscolliding; } |
1123 | set { iscolliding = value; } | 1189 | set { iscolliding = value; } |
1124 | } | 1190 | } |
1191 | public override bool CollidingGround | ||
1192 | { | ||
1193 | get { return false; } | ||
1194 | set { return; } | ||
1195 | } | ||
1196 | public override bool CollidingObj | ||
1197 | { | ||
1198 | get { return false; } | ||
1199 | set { return; } | ||
1200 | } | ||
1125 | public override bool ThrottleUpdates | 1201 | public override bool ThrottleUpdates |
1126 | { | 1202 | { |
1127 | get { return m_throttleUpdates; } | 1203 | get { return m_throttleUpdates; } |