diff options
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/OdePlugin.cs')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 215 |
1 files changed, 134 insertions, 81 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 02b5628..acc0cee 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -131,7 +131,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
131 | 131 | ||
132 | private float waterlevel = 0f; | 132 | private float waterlevel = 0f; |
133 | private int framecount = 0; | 133 | private int framecount = 0; |
134 | private int m_returncollisions = 10; | 134 | //private int m_returncollisions = 10; |
135 | 135 | ||
136 | private IntPtr contactgroup; | 136 | private IntPtr contactgroup; |
137 | private IntPtr LandGeom = (IntPtr) 0; | 137 | private IntPtr LandGeom = (IntPtr) 0; |
@@ -151,6 +151,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
151 | private List<OdePrim> _prims = new List<OdePrim>(); | 151 | private List<OdePrim> _prims = new List<OdePrim>(); |
152 | private List<OdePrim> _activeprims = new List<OdePrim>(); | 152 | private List<OdePrim> _activeprims = new List<OdePrim>(); |
153 | private List<OdePrim> _taintedPrim = new List<OdePrim>(); | 153 | private List<OdePrim> _taintedPrim = new List<OdePrim>(); |
154 | private List<PhysicsActor> _collisionEventPrim = new List<PhysicsActor>(); | ||
154 | public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>(); | 155 | public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>(); |
155 | public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>(); | 156 | public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>(); |
156 | private d.ContactGeom[] contacts = new d.ContactGeom[80]; | 157 | private d.ContactGeom[] contacts = new d.ContactGeom[80]; |
@@ -171,16 +172,16 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
171 | //Ckrinke: Comment out until used. We declare it, initialize it, but do not use it | 172 | //Ckrinke: Comment out until used. We declare it, initialize it, but do not use it |
172 | //Ckrinke private int ms = 0; | 173 | //Ckrinke private int ms = 0; |
173 | public IntPtr world; | 174 | public IntPtr world; |
174 | private bool returncollisions = false; | 175 | //private bool returncollisions = false; |
175 | private uint obj1LocalID = 0; | 176 | private uint obj1LocalID = 0; |
176 | private uint obj2LocalID = 0; | 177 | private uint obj2LocalID = 0; |
177 | private int ctype = 0; | 178 | //private int ctype = 0; |
178 | private OdeCharacter cc1; | 179 | private OdeCharacter cc1; |
179 | private OdePrim cp1; | 180 | private OdePrim cp1; |
180 | private OdeCharacter cc2; | 181 | private OdeCharacter cc2; |
181 | private OdePrim cp2; | 182 | private OdePrim cp2; |
182 | private int cStartStop = 0; | 183 | //private int cStartStop = 0; |
183 | private string cDictKey = ""; | 184 | //private string cDictKey = ""; |
184 | 185 | ||
185 | public IntPtr space; | 186 | public IntPtr space; |
186 | 187 | ||
@@ -413,27 +414,32 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
413 | PhysicsActor p1; | 414 | PhysicsActor p1; |
414 | PhysicsActor p2; | 415 | PhysicsActor p2; |
415 | 416 | ||
417 | if (!actor_name_map.TryGetValue(g1, out p1)) | ||
418 | { | ||
419 | p1 = PANull; | ||
420 | } | ||
421 | if (!actor_name_map.TryGetValue(g2, out p2)) | ||
422 | { | ||
423 | p2 = PANull; | ||
424 | } | ||
425 | |||
426 | float max_collision_depth = 0f; | ||
427 | |||
416 | for (int i = 0; i < count; i++) | 428 | for (int i = 0; i < count; i++) |
417 | { | 429 | { |
430 | max_collision_depth = (contacts[i].depth > max_collision_depth) ? contacts[i].depth : max_collision_depth; | ||
418 | //m_log.Warn("[CCOUNT]: " + count); | 431 | //m_log.Warn("[CCOUNT]: " + count); |
419 | IntPtr joint; | 432 | IntPtr joint; |
420 | // If we're colliding with terrain, use 'TerrainContact' instead of contact. | 433 | // If we're colliding with terrain, use 'TerrainContact' instead of contact. |
421 | // allows us to have different settings | 434 | // allows us to have different settings |
422 | 435 | ||
423 | if (!actor_name_map.TryGetValue(g1, out p1)) | 436 | |
424 | { | ||
425 | p1 = PANull; | ||
426 | } | ||
427 | if (!actor_name_map.TryGetValue(g2, out p2)) | ||
428 | { | ||
429 | p2 = PANull; | ||
430 | } | ||
431 | 437 | ||
432 | // We only need to test p2 for 'jump crouch purposes' | 438 | // We only need to test p2 for 'jump crouch purposes' |
433 | p2.IsColliding = true; | 439 | p2.IsColliding = true; |
434 | 440 | ||
435 | //if ((framecount % m_returncollisions) == 0) | 441 | //if ((framecount % m_returncollisions) == 0) |
436 | //collision_accounting_events(p1, p2); | 442 | |
437 | 443 | ||
438 | 444 | ||
439 | switch (p1.PhysicsActorType) | 445 | switch (p1.PhysicsActorType) |
@@ -674,7 +680,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
674 | } | 680 | } |
675 | d.JointAttach(joint, b1, b2); | 681 | d.JointAttach(joint, b1, b2); |
676 | } | 682 | } |
677 | 683 | collision_accounting_events(p1, p2, max_collision_depth); | |
678 | if (count > 3) | 684 | if (count > 3) |
679 | { | 685 | { |
680 | // If there are more then 3 contact points, it's likely | 686 | // If there are more then 3 contact points, it's likely |
@@ -690,130 +696,134 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
690 | 696 | ||
691 | } | 697 | } |
692 | 698 | ||
693 | private void collision_accounting_events(PhysicsActor p1, PhysicsActor p2) | 699 | private void collision_accounting_events(PhysicsActor p1, PhysicsActor p2, float collisiondepth) |
694 | { | 700 | { |
695 | obj1LocalID = 0; | 701 | obj1LocalID = 0; |
696 | returncollisions = false; | 702 | //returncollisions = false; |
697 | obj2LocalID = 0; | 703 | obj2LocalID = 0; |
698 | ctype = 0; | 704 | //ctype = 0; |
699 | cStartStop = 0; | 705 | //cStartStop = 0; |
706 | if (!p2.SubscribedEvents() && !p1.SubscribedEvents()) | ||
707 | return; | ||
700 | 708 | ||
701 | switch ((ActorTypes)p2.PhysicsActorType) | 709 | switch ((ActorTypes)p2.PhysicsActorType) |
702 | { | 710 | { |
703 | case ActorTypes.Agent: | 711 | case ActorTypes.Agent: |
704 | cc2 = (OdeCharacter)p2; | 712 | cc2 = (OdeCharacter)p2; |
705 | if (cc2.m_returnCollisions) | 713 | |
706 | { | ||
707 | obj1LocalID = cc2.m_localID; | 714 | obj1LocalID = cc2.m_localID; |
708 | switch ((ActorTypes)p1.PhysicsActorType) | 715 | switch ((ActorTypes)p1.PhysicsActorType) |
709 | { | 716 | { |
710 | case ActorTypes.Agent: | 717 | case ActorTypes.Agent: |
711 | cc1 = (OdeCharacter)p1; | 718 | cc1 = (OdeCharacter)p1; |
712 | obj2LocalID = cc1.m_localID; | 719 | obj2LocalID = cc1.m_localID; |
713 | ctype = (int)CollisionCategories.Character; | 720 | cc1.AddCollisionEvent(cc2.m_localID, collisiondepth); |
721 | //ctype = (int)CollisionCategories.Character; | ||
714 | 722 | ||
715 | if (cc1.CollidingObj) | 723 | //if (cc1.CollidingObj) |
716 | cStartStop = (int)StatusIndicators.Generic; | 724 | //cStartStop = (int)StatusIndicators.Generic; |
717 | else | 725 | //else |
718 | cStartStop = (int)StatusIndicators.Start; | 726 | //cStartStop = (int)StatusIndicators.Start; |
719 | 727 | ||
720 | returncollisions = true; | 728 | //returncollisions = true; |
721 | break; | 729 | break; |
722 | case ActorTypes.Prim: | 730 | case ActorTypes.Prim: |
723 | cp1 = (OdePrim)p1; | 731 | cp1 = (OdePrim)p1; |
724 | obj2LocalID = cp1.m_localID; | 732 | obj2LocalID = cp1.m_localID; |
725 | ctype = (int)CollisionCategories.Geom; | 733 | cp1.AddCollisionEvent(cc2.m_localID, collisiondepth); |
734 | //ctype = (int)CollisionCategories.Geom; | ||
726 | 735 | ||
727 | if (cp1.CollidingObj) | 736 | //if (cp1.CollidingObj) |
728 | cStartStop = (int)StatusIndicators.Generic; | 737 | //cStartStop = (int)StatusIndicators.Generic; |
729 | else | 738 | //else |
730 | cStartStop = (int)StatusIndicators.Start; | 739 | //cStartStop = (int)StatusIndicators.Start; |
731 | 740 | ||
732 | returncollisions = true; | 741 | //returncollisions = true; |
733 | break; | 742 | break; |
734 | 743 | ||
735 | case ActorTypes.Ground: | 744 | case ActorTypes.Ground: |
736 | case ActorTypes.Unknown: | 745 | case ActorTypes.Unknown: |
737 | obj2LocalID = 0; | 746 | obj2LocalID = 0; |
738 | ctype = (int)CollisionCategories.Land; | 747 | //ctype = (int)CollisionCategories.Land; |
739 | returncollisions = true; | 748 | //returncollisions = true; |
740 | break; | 749 | break; |
741 | } | 750 | } |
742 | 751 | ||
743 | 752 | ||
744 | } | 753 | |
745 | 754 | cc2.AddCollisionEvent(obj2LocalID, collisiondepth); | |
746 | break; | 755 | break; |
747 | case ActorTypes.Prim: | 756 | case ActorTypes.Prim: |
748 | cp2 = (OdePrim)p2; | 757 | cp2 = (OdePrim)p2; |
749 | if (cp2.m_returnCollisions) | 758 | |
750 | { | ||
751 | obj1LocalID = cp2.m_localID; | 759 | obj1LocalID = cp2.m_localID; |
752 | switch ((ActorTypes)p1.PhysicsActorType) | 760 | switch ((ActorTypes)p1.PhysicsActorType) |
753 | { | 761 | { |
754 | case ActorTypes.Agent: | 762 | case ActorTypes.Agent: |
755 | cc1 = (OdeCharacter)p1; | 763 | cc1 = (OdeCharacter)p1; |
756 | obj2LocalID = cc1.m_localID; | 764 | obj2LocalID = cc1.m_localID; |
757 | ctype = (int)CollisionCategories.Character; | 765 | cc1.AddCollisionEvent(cp2.m_localID, collisiondepth); |
758 | 766 | //ctype = (int)CollisionCategories.Character; | |
759 | if (cc1.CollidingObj) | 767 | |
760 | cStartStop = (int)StatusIndicators.Generic; | 768 | //if (cc1.CollidingObj) |
761 | else | 769 | //cStartStop = (int)StatusIndicators.Generic; |
762 | cStartStop = (int)StatusIndicators.Start; | 770 | //else |
763 | returncollisions = true; | 771 | //cStartStop = (int)StatusIndicators.Start; |
772 | //returncollisions = true; | ||
764 | 773 | ||
765 | break; | 774 | break; |
766 | case ActorTypes.Prim: | 775 | case ActorTypes.Prim: |
767 | cp1 = (OdePrim)p1; | 776 | cp1 = (OdePrim)p1; |
768 | obj2LocalID = cp1.m_localID; | 777 | obj2LocalID = cp1.m_localID; |
769 | ctype = (int)CollisionCategories.Geom; | 778 | cp1.AddCollisionEvent(cp2.m_localID, collisiondepth); |
779 | //ctype = (int)CollisionCategories.Geom; | ||
770 | 780 | ||
771 | if (cp1.CollidingObj) | 781 | //if (cp1.CollidingObj) |
772 | cStartStop = (int)StatusIndicators.Generic; | 782 | //cStartStop = (int)StatusIndicators.Generic; |
773 | else | 783 | //else |
774 | cStartStop = (int)StatusIndicators.Start; | 784 | //cStartStop = (int)StatusIndicators.Start; |
775 | 785 | ||
776 | returncollisions = true; | 786 | //returncollisions = true; |
777 | break; | 787 | break; |
778 | 788 | ||
779 | case ActorTypes.Ground: | 789 | case ActorTypes.Ground: |
780 | case ActorTypes.Unknown: | 790 | case ActorTypes.Unknown: |
781 | obj2LocalID = 0; | 791 | obj2LocalID = 0; |
782 | ctype = (int)CollisionCategories.Land; | 792 | //ctype = (int)CollisionCategories.Land; |
783 | 793 | ||
784 | returncollisions = true; | 794 | //returncollisions = true; |
785 | break; | 795 | break; |
786 | } | 796 | } |
787 | } | 797 | |
788 | 798 | cp2.AddCollisionEvent(obj2LocalID, collisiondepth); | |
789 | break; | 799 | break; |
790 | } | 800 | } |
791 | if (returncollisions) | 801 | //if (returncollisions) |
792 | { | 802 | //{ |
793 | 803 | ||
794 | lock (m_storedCollisions) | 804 | //lock (m_storedCollisions) |
795 | { | 805 | //{ |
796 | cDictKey = obj1LocalID.ToString() + obj2LocalID.ToString() + cStartStop.ToString() + ctype.ToString(); | 806 | //cDictKey = obj1LocalID.ToString() + obj2LocalID.ToString() + cStartStop.ToString() + ctype.ToString(); |
797 | if (m_storedCollisions.ContainsKey(cDictKey)) | 807 | //if (m_storedCollisions.ContainsKey(cDictKey)) |
798 | { | 808 | //{ |
799 | sCollisionData objd = m_storedCollisions[cDictKey]; | 809 | //sCollisionData objd = m_storedCollisions[cDictKey]; |
800 | objd.NumberOfCollisions += 1; | 810 | //objd.NumberOfCollisions += 1; |
801 | objd.lastframe = framecount; | 811 | //objd.lastframe = framecount; |
802 | m_storedCollisions[cDictKey] = objd; | 812 | //m_storedCollisions[cDictKey] = objd; |
803 | } | 813 | //} |
804 | else | 814 | //else |
805 | { | 815 | //{ |
806 | sCollisionData objd = new sCollisionData(); | 816 | //sCollisionData objd = new sCollisionData(); |
807 | objd.ColliderLocalId = obj1LocalID; | 817 | //objd.ColliderLocalId = obj1LocalID; |
808 | objd.CollidedWithLocalId = obj2LocalID; | 818 | //objd.CollidedWithLocalId = obj2LocalID; |
809 | objd.CollisionType = ctype; | 819 | //objd.CollisionType = ctype; |
810 | objd.NumberOfCollisions = 1; | 820 | //objd.NumberOfCollisions = 1; |
811 | objd.lastframe = framecount; | 821 | //objd.lastframe = framecount; |
812 | objd.StatusIndicator = cStartStop; | 822 | //objd.StatusIndicator = cStartStop; |
813 | m_storedCollisions.Add(cDictKey, objd); | 823 | //m_storedCollisions.Add(cDictKey, objd); |
814 | } | 824 | //} |
815 | } | 825 | //} |
816 | } | 826 | // } |
817 | } | 827 | } |
818 | 828 | ||
819 | public int TriArrayCallback(IntPtr trimesh, IntPtr refObject, int[] triangleIndex, int triCount) | 829 | public int TriArrayCallback(IntPtr trimesh, IntPtr refObject, int[] triangleIndex, int triCount) |
@@ -940,6 +950,26 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
940 | // return (float)_origheightmap[(int)y * Constants.RegionSize + (int)x]; | 950 | // return (float)_origheightmap[(int)y * Constants.RegionSize + (int)x]; |
941 | // } | 951 | // } |
942 | 952 | ||
953 | public void addCollisionEventReporting(PhysicsActor obj) | ||
954 | { | ||
955 | lock(_collisionEventPrim) | ||
956 | { | ||
957 | if (!_collisionEventPrim.Contains(obj)) | ||
958 | _collisionEventPrim.Add(obj); | ||
959 | |||
960 | } | ||
961 | } | ||
962 | |||
963 | public void remCollisionEventReporting(PhysicsActor obj) | ||
964 | { | ||
965 | lock (_collisionEventPrim) | ||
966 | { | ||
967 | if (!_collisionEventPrim.Contains(obj)) | ||
968 | _collisionEventPrim.Remove(obj); | ||
969 | } | ||
970 | } | ||
971 | |||
972 | |||
943 | #region Add/Remove Entities | 973 | #region Add/Remove Entities |
944 | 974 | ||
945 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size) | 975 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size) |
@@ -1068,6 +1098,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1068 | { | 1098 | { |
1069 | lock (prim) | 1099 | lock (prim) |
1070 | { | 1100 | { |
1101 | remCollisionEventReporting(prim); | ||
1071 | lock (ode) | 1102 | lock (ode) |
1072 | { | 1103 | { |
1073 | if (prim.prim_geom != (IntPtr)0) | 1104 | if (prim.prim_geom != (IntPtr)0) |
@@ -1551,6 +1582,28 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1551 | 1582 | ||
1552 | collision_optimized(timeStep); | 1583 | collision_optimized(timeStep); |
1553 | 1584 | ||
1585 | lock (_collisionEventPrim) | ||
1586 | { | ||
1587 | foreach (PhysicsActor obj in _collisionEventPrim) | ||
1588 | { | ||
1589 | if (obj == null) | ||
1590 | continue; | ||
1591 | |||
1592 | switch ((ActorTypes)obj.PhysicsActorType) | ||
1593 | { | ||
1594 | case ActorTypes.Agent: | ||
1595 | OdeCharacter cobj = (OdeCharacter)obj; | ||
1596 | cobj.SendCollisions(); | ||
1597 | break; | ||
1598 | case ActorTypes.Prim: | ||
1599 | OdePrim pobj = (OdePrim)obj; | ||
1600 | pobj.SendCollisions(); | ||
1601 | break; | ||
1602 | } | ||
1603 | |||
1604 | } | ||
1605 | } | ||
1606 | |||
1554 | d.WorldQuickStep(world, ODE_STEPSIZE); | 1607 | d.WorldQuickStep(world, ODE_STEPSIZE); |
1555 | 1608 | ||
1556 | d.JointGroupEmpty(contactgroup); | 1609 | d.JointGroupEmpty(contactgroup); |