diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 13 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | 55 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs | 12 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs | 12 | ||||
-rw-r--r-- | OpenSim/Region/Physics/Manager/PhysicsActor.cs | 35 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 31 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 47 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 215 | ||||
-rw-r--r-- | OpenSim/Region/Physics/POSPlugin/POSPlugin.cs | 24 | ||||
-rw-r--r-- | OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs | 25 |
10 files changed, 366 insertions, 103 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 378199c..edce960 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -1659,7 +1659,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1659 | Ray NewRay = new Ray(AXOrigin, AXdirection); | 1659 | Ray NewRay = new Ray(AXOrigin, AXdirection); |
1660 | 1660 | ||
1661 | // Ray Trace against target here | 1661 | // Ray Trace against target here |
1662 | EntityIntersection ei = target.TestIntersectionOBB(NewRay, new Quaternion(1, 0, 0, 0), frontFacesOnly, CopyCenters); | 1662 | EntityIntersection ei = target.TestIntersectionOBB(NewRay, new Quaternion(1, 0, 0, 0), frontFacesOnly, false); |
1663 | 1663 | ||
1664 | // Un-comment out the following line to Get Raytrace results printed to the console. | 1664 | // Un-comment out the following line to Get Raytrace results printed to the console. |
1665 | // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); | 1665 | // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); |
@@ -1676,16 +1676,17 @@ namespace OpenSim.Region.Environment.Scenes | |||
1676 | ScaleOffset = Math.Abs(ScaleOffset); | 1676 | ScaleOffset = Math.Abs(ScaleOffset); |
1677 | LLVector3 intersectionpoint = new LLVector3(ei.ipoint.x, ei.ipoint.y, ei.ipoint.z); | 1677 | LLVector3 intersectionpoint = new LLVector3(ei.ipoint.x, ei.ipoint.y, ei.ipoint.z); |
1678 | LLVector3 normal = new LLVector3(ei.normal.x, ei.normal.y, ei.normal.z); | 1678 | LLVector3 normal = new LLVector3(ei.normal.x, ei.normal.y, ei.normal.z); |
1679 | 1679 | LLVector3 offset = (normal * (ScaleOffset / 2f)); | |
1680 | pos = (intersectionpoint + offset); | ||
1680 | 1681 | ||
1681 | if (CopyCenters) | 1682 | if (CopyCenters) |
1682 | { | 1683 | { |
1683 | // now we cast a ray from inside the prim(absolute position) to one of it's faces along the face normal. | 1684 | // now we cast a ray from inside the prim(absolute position) to one of it's faces along the face normal. |
1684 | LLVector3 direction2 = LLVector3.Norm(intersectionpoint - target2.AbsolutePosition); | 1685 | LLVector3 direction2 = LLVector3.Norm(pos - target2.AbsolutePosition); |
1685 | Vector3 AXOrigin2 = new Vector3(target2.AbsolutePosition.X, target2.AbsolutePosition.Y, target2.AbsolutePosition.Z); | 1686 | Vector3 AXOrigin2 = new Vector3(target2.AbsolutePosition.X, target2.AbsolutePosition.Y, target2.AbsolutePosition.Z); |
1686 | Vector3 AXdirection2 = ei.AAfaceNormal; | 1687 | Vector3 AXdirection2 = new Vector3(direction2.X, direction2.Y, direction2.Z); //ei.AAfaceNormal; |
1687 | Ray NewRay2 = new Ray(AXOrigin2, AXdirection2); | 1688 | Ray NewRay2 = new Ray(AXOrigin2, AXdirection2); |
1688 | EntityIntersection ei2 = target.TestIntersectionOBB(NewRay2, new Quaternion(1, 0, 0, 0), true, CopyCenters); | 1689 | EntityIntersection ei2 = target.TestIntersectionOBB(NewRay2, new Quaternion(1, 0, 0, 0), false, CopyCenters); |
1689 | if (ei2.HitTF) | 1690 | if (ei2.HitTF) |
1690 | { | 1691 | { |
1691 | //m_log.Info("[RAYTRACERESULTS]: Hit:" + ei2.HitTF.ToString() + " Point: " + ei2.ipoint.ToString() + " Normal: " + ei2.normal.ToString()); | 1692 | //m_log.Info("[RAYTRACERESULTS]: Hit:" + ei2.HitTF.ToString() + " Point: " + ei2.ipoint.ToString() + " Normal: " + ei2.normal.ToString()); |
@@ -1697,7 +1698,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1697 | } | 1698 | } |
1698 | 1699 | ||
1699 | // Set the position to the intersection point | 1700 | // Set the position to the intersection point |
1700 | LLVector3 offset = (normal * (ScaleOffset / 2f)); | 1701 | offset = (normal * (ScaleOffset / 2f)); |
1701 | pos = (intersectionpoint + offset); | 1702 | pos = (intersectionpoint + offset); |
1702 | 1703 | ||
1703 | // stick in offset format from the original prim | 1704 | // stick in offset format from the original prim |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 35eabbd..9b4f9af 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | |||
@@ -1329,7 +1329,15 @@ namespace OpenSim.Region.Environment.Scenes | |||
1329 | AmBa = FaceA[i] - FaceB[i]; | 1329 | AmBa = FaceA[i] - FaceB[i]; |
1330 | AmBb = FaceB[i] - FaceC[i]; | 1330 | AmBb = FaceB[i] - FaceC[i]; |
1331 | d = normals[i].Dot(FaceB[i]); | 1331 | d = normals[i].Dot(FaceB[i]); |
1332 | c = iray.Direction.Dot(normals[i]); | 1332 | |
1333 | if (faceCenters) | ||
1334 | { | ||
1335 | c = normals[i].Dot(normals[i]); | ||
1336 | } | ||
1337 | else | ||
1338 | { | ||
1339 | c = iray.Direction.Dot(normals[i]); | ||
1340 | } | ||
1333 | if (c == 0) | 1341 | if (c == 0) |
1334 | continue; | 1342 | continue; |
1335 | 1343 | ||
@@ -1339,12 +1347,15 @@ namespace OpenSim.Region.Environment.Scenes | |||
1339 | continue; | 1347 | continue; |
1340 | 1348 | ||
1341 | // If the normal is pointing outside the object | 1349 | // If the normal is pointing outside the object |
1350 | |||
1351 | |||
1352 | |||
1342 | if (iray.Direction.Dot(normals[i]) < 0 || !frontFacesOnly) | 1353 | if (iray.Direction.Dot(normals[i]) < 0 || !frontFacesOnly) |
1343 | { | 1354 | { |
1344 | 1355 | ||
1345 | if (faceCenters) | 1356 | if (faceCenters) |
1346 | { | 1357 | { //(FaceA[i] + FaceB[i] + FaceC[1] + FaceD[i]) / 4f; |
1347 | q = (FaceA[i] + FaceB[i] + FaceC[1] + FaceD[i]) / 4f; //iray.Origin + a * normals[i]; | 1358 | q = iray.Origin + a * normals[i]; |
1348 | } | 1359 | } |
1349 | else | 1360 | else |
1350 | { | 1361 | { |
@@ -1364,8 +1375,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
1364 | returnresult.distance = distance2; | 1375 | returnresult.distance = distance2; |
1365 | returnresult.HitTF = true; | 1376 | returnresult.HitTF = true; |
1366 | returnresult.ipoint = q; | 1377 | returnresult.ipoint = q; |
1367 | //m_log.Info("[FACE]:" + i.ToString()); | 1378 | m_log.Info("[FACE]:" + i.ToString()); |
1368 | //m_log.Info("[POINT]: " + q.ToString()); | 1379 | m_log.Info("[POINT]: " + q.ToString()); |
1380 | m_log.Info("[DIST]: " + distance2.ToString()); | ||
1369 | returnresult.normal = normals[i]; | 1381 | returnresult.normal = normals[i]; |
1370 | returnresult.AAfaceNormal = AAfacenormals[i]; | 1382 | returnresult.AAfaceNormal = AAfacenormals[i]; |
1371 | 1383 | ||
@@ -2680,6 +2692,20 @@ namespace OpenSim.Region.Environment.Scenes | |||
2680 | ) | 2692 | ) |
2681 | { | 2693 | { |
2682 | // subscribe to physics updates. | 2694 | // subscribe to physics updates. |
2695 | if (PhysActor != null) | ||
2696 | { | ||
2697 | PhysActor.OnCollisionUpdate += PhysicsCollision; | ||
2698 | PhysActor.SubscribeEvents(1000); | ||
2699 | |||
2700 | } | ||
2701 | } | ||
2702 | else | ||
2703 | { | ||
2704 | if (PhysActor != null) | ||
2705 | { | ||
2706 | PhysActor.UnSubscribeEvents(); | ||
2707 | PhysActor.OnCollisionUpdate -= PhysicsCollision; | ||
2708 | } | ||
2683 | } | 2709 | } |
2684 | 2710 | ||
2685 | LocalFlags=(LLObject.ObjectFlags)objectflagupdate; | 2711 | LocalFlags=(LLObject.ObjectFlags)objectflagupdate; |
@@ -2689,5 +2715,24 @@ namespace OpenSim.Region.Environment.Scenes | |||
2689 | else | 2715 | else |
2690 | ScheduleFullUpdate(); | 2716 | ScheduleFullUpdate(); |
2691 | } | 2717 | } |
2718 | public void PhysicsCollision(EventArgs e) | ||
2719 | { | ||
2720 | |||
2721 | return; | ||
2722 | |||
2723 | // | ||
2724 | //if (e == null) | ||
2725 | //{ | ||
2726 | // return; | ||
2727 | //} | ||
2728 | //CollisionEventUpdate a = (CollisionEventUpdate)e; | ||
2729 | //Dictionary<uint, float> collissionswith = a.m_objCollisionList; | ||
2730 | //foreach (uint localid in collissionswith.Keys) | ||
2731 | //{ | ||
2732 | // m_log.Debug("[OBJECT]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString()); | ||
2733 | //} | ||
2734 | |||
2735 | } | ||
2692 | } | 2736 | } |
2737 | |||
2693 | } | 2738 | } |
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs index 08fdd80..0d54dad 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs | |||
@@ -398,5 +398,17 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
398 | public override PhysicsVector PIDTarget { set { return; } } | 398 | public override PhysicsVector PIDTarget { set { return; } } |
399 | public override bool PIDActive { set { return; } } | 399 | public override bool PIDActive { set { return; } } |
400 | public override float PIDTau { set { return; } } | 400 | public override float PIDTau { set { return; } } |
401 | public override void SubscribeEvents(int ms) | ||
402 | { | ||
403 | |||
404 | } | ||
405 | public override void UnSubscribeEvents() | ||
406 | { | ||
407 | |||
408 | } | ||
409 | public override bool SubscribedEvents() | ||
410 | { | ||
411 | return false; | ||
412 | } | ||
401 | } | 413 | } |
402 | } | 414 | } |
diff --git a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs index f3b3a20..9bd5f08 100644 --- a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs +++ b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs | |||
@@ -996,6 +996,18 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
996 | public override PhysicsVector PIDTarget { set { return; } } | 996 | public override PhysicsVector PIDTarget { set { return; } } |
997 | public override bool PIDActive { set { return; } } | 997 | public override bool PIDActive { set { return; } } |
998 | public override float PIDTau { set { return; } } | 998 | public override float PIDTau { set { return; } } |
999 | public override void SubscribeEvents(int ms) | ||
1000 | { | ||
1001 | |||
1002 | } | ||
1003 | public override void UnSubscribeEvents() | ||
1004 | { | ||
1005 | |||
1006 | } | ||
1007 | public override bool SubscribedEvents() | ||
1008 | { | ||
1009 | return false; | ||
1010 | } | ||
999 | } | 1011 | } |
1000 | 1012 | ||
1001 | /// <summary> | 1013 | /// <summary> |
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs index f48f129..046c285 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs | |||
@@ -51,9 +51,9 @@ namespace OpenSim.Region.Physics.Manager | |||
51 | public int m_colliderType; | 51 | public int m_colliderType; |
52 | public int m_GenericStartEnd; | 52 | public int m_GenericStartEnd; |
53 | //public uint m_LocalID; | 53 | //public uint m_LocalID; |
54 | public List<uint> m_objCollisionList; | 54 | public Dictionary<uint,float> m_objCollisionList = new Dictionary<uint,float>(); |
55 | 55 | ||
56 | public CollisionEventUpdate(uint localID, int colliderType, int GenericStartEnd, List<uint> objCollisionList) | 56 | public CollisionEventUpdate(uint localID, int colliderType, int GenericStartEnd, Dictionary<uint, float> objCollisionList) |
57 | { | 57 | { |
58 | m_colliderType = colliderType; | 58 | m_colliderType = colliderType; |
59 | m_GenericStartEnd = GenericStartEnd; | 59 | m_GenericStartEnd = GenericStartEnd; |
@@ -64,7 +64,8 @@ namespace OpenSim.Region.Physics.Manager | |||
64 | { | 64 | { |
65 | m_colliderType = (int) ActorTypes.Unknown; | 65 | m_colliderType = (int) ActorTypes.Unknown; |
66 | m_GenericStartEnd = 1; | 66 | m_GenericStartEnd = 1; |
67 | m_objCollisionList = null; | 67 | // m_objCollisionList = null; |
68 | m_objCollisionList = new Dictionary<uint, float>(); | ||
68 | } | 69 | } |
69 | 70 | ||
70 | public int collidertype | 71 | public int collidertype |
@@ -79,9 +80,17 @@ namespace OpenSim.Region.Physics.Manager | |||
79 | set { m_GenericStartEnd = value; } | 80 | set { m_GenericStartEnd = value; } |
80 | } | 81 | } |
81 | 82 | ||
82 | public void addCollider(uint localID) | 83 | public void addCollider(uint localID, float depth) |
83 | { | 84 | { |
84 | m_objCollisionList.Add(localID); | 85 | if (!m_objCollisionList.ContainsKey(localID)) |
86 | { | ||
87 | m_objCollisionList.Add(localID, depth); | ||
88 | } | ||
89 | else | ||
90 | { | ||
91 | if (m_objCollisionList[localID] < depth) | ||
92 | m_objCollisionList[localID] = depth; | ||
93 | } | ||
85 | } | 94 | } |
86 | } | 95 | } |
87 | 96 | ||
@@ -189,6 +198,9 @@ namespace OpenSim.Region.Physics.Manager | |||
189 | 198 | ||
190 | public abstract void AddForce(PhysicsVector force); | 199 | public abstract void AddForce(PhysicsVector force); |
191 | public abstract void SetMomentum(PhysicsVector momentum); | 200 | public abstract void SetMomentum(PhysicsVector momentum); |
201 | public abstract void SubscribeEvents(int ms); | ||
202 | public abstract void UnSubscribeEvents(); | ||
203 | public abstract bool SubscribedEvents(); | ||
192 | } | 204 | } |
193 | 205 | ||
194 | public class NullPhysicsActor : PhysicsActor | 206 | public class NullPhysicsActor : PhysicsActor |
@@ -370,5 +382,18 @@ namespace OpenSim.Region.Physics.Manager | |||
370 | public override void SetMomentum(PhysicsVector momentum) | 382 | public override void SetMomentum(PhysicsVector momentum) |
371 | { | 383 | { |
372 | } | 384 | } |
385 | |||
386 | public override void SubscribeEvents(int ms) | ||
387 | { | ||
388 | |||
389 | } | ||
390 | public override void UnSubscribeEvents() | ||
391 | { | ||
392 | |||
393 | } | ||
394 | public override bool SubscribedEvents() | ||
395 | { | ||
396 | return false; | ||
397 | } | ||
373 | } | 398 | } |
374 | } | 399 | } |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 9f6b14e..39f94cb 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |||
@@ -112,6 +112,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
112 | public d.Mass ShellMass; | 112 | public d.Mass ShellMass; |
113 | public bool collidelock = false; | 113 | public bool collidelock = false; |
114 | 114 | ||
115 | public int m_eventsubscription = 0; | ||
116 | private CollisionEventUpdate CollisionEventsThisFrame = null; | ||
117 | |||
115 | public OdeCharacter(String avName, OdeScene parent_scene, PhysicsVector pos, CollisionLocker dode, PhysicsVector size) | 118 | public OdeCharacter(String avName, OdeScene parent_scene, PhysicsVector pos, CollisionLocker dode, PhysicsVector size) |
116 | { | 119 | { |
117 | ode = dode; | 120 | ode = dode; |
@@ -863,5 +866,33 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
863 | public override PhysicsVector PIDTarget { set { return; } } | 866 | public override PhysicsVector PIDTarget { set { return; } } |
864 | public override bool PIDActive { set { return; } } | 867 | public override bool PIDActive { set { return; } } |
865 | public override float PIDTau { set { return; } } | 868 | public override float PIDTau { set { return; } } |
869 | public override void SubscribeEvents(int ms) | ||
870 | { | ||
871 | m_eventsubscription = ms; | ||
872 | } | ||
873 | public override void UnSubscribeEvents() | ||
874 | { | ||
875 | m_eventsubscription = 0; | ||
876 | } | ||
877 | public void AddCollisionEvent(uint CollidedWith, float depth) | ||
878 | { | ||
879 | if (m_eventsubscription > 0) | ||
880 | CollisionEventsThisFrame.addCollider(CollidedWith,depth); | ||
881 | } | ||
882 | |||
883 | public void SendCollisions() | ||
884 | { | ||
885 | if (m_eventsubscription > 0) | ||
886 | { | ||
887 | base.SendCollisionUpdate(CollisionEventsThisFrame); | ||
888 | CollisionEventsThisFrame = new CollisionEventUpdate(); | ||
889 | } | ||
890 | } | ||
891 | public override bool SubscribedEvents() | ||
892 | { | ||
893 | if (m_eventsubscription > 0) | ||
894 | return true; | ||
895 | return false; | ||
896 | } | ||
866 | } | 897 | } |
867 | } | 898 | } |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 58dbd63..4e1696d 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -136,8 +136,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
136 | private PhysicsVector _target_velocity; | 136 | private PhysicsVector _target_velocity; |
137 | public d.Mass pMass; | 137 | public d.Mass pMass; |
138 | 138 | ||
139 | public int m_eventsubscription = 0; | ||
140 | private CollisionEventUpdate CollisionEventsThisFrame = null; | ||
141 | |||
139 | private IntPtr m_linkJoint = (IntPtr)0; | 142 | private IntPtr m_linkJoint = (IntPtr)0; |
140 | 143 | ||
144 | |||
141 | public OdePrim(String primName, OdeScene parent_scene, PhysicsVector pos, PhysicsVector size, | 145 | public OdePrim(String primName, OdeScene parent_scene, PhysicsVector pos, PhysicsVector size, |
142 | Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode) | 146 | Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode) |
143 | { | 147 | { |
@@ -201,12 +205,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
201 | 205 | ||
202 | } | 206 | } |
203 | 207 | ||
204 | /// <summary> | ||
205 | /// Nasty, however without this you get | ||
206 | /// 'invalid operation for locked space' when things are really loaded down | ||
207 | /// </summary> | ||
208 | /// <param name="space"></param> | ||
209 | |||
210 | public override int PhysicsActorType | 208 | public override int PhysicsActorType |
211 | { | 209 | { |
212 | get { return (int) ActorTypes.Prim; } | 210 | get { return (int) ActorTypes.Prim; } |
@@ -2229,5 +2227,42 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2229 | d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f); | 2227 | d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f); |
2230 | d.JointSetAMotorParam(Amotor, (int)dParam.FMax, m_tensor); | 2228 | d.JointSetAMotorParam(Amotor, (int)dParam.FMax, m_tensor); |
2231 | } | 2229 | } |
2230 | public override void SubscribeEvents(int ms) | ||
2231 | { | ||
2232 | m_eventsubscription = ms; | ||
2233 | _parent_scene.addCollisionEventReporting(this); | ||
2234 | } | ||
2235 | public override void UnSubscribeEvents() | ||
2236 | { | ||
2237 | _parent_scene.remCollisionEventReporting(this); | ||
2238 | m_eventsubscription = 0; | ||
2239 | } | ||
2240 | public void AddCollisionEvent(uint CollidedWith, float depth) | ||
2241 | { | ||
2242 | if (CollisionEventsThisFrame == null) | ||
2243 | CollisionEventsThisFrame = new CollisionEventUpdate(); | ||
2244 | CollisionEventsThisFrame.addCollider(CollidedWith,depth); | ||
2245 | } | ||
2246 | |||
2247 | public void SendCollisions() | ||
2248 | { | ||
2249 | if (CollisionEventsThisFrame == null) | ||
2250 | return; | ||
2251 | |||
2252 | //if (CollisionEventsThisFrame.m_objCollisionList == null) | ||
2253 | // return; | ||
2254 | |||
2255 | if (CollisionEventsThisFrame.m_objCollisionList.Count > 0) | ||
2256 | { | ||
2257 | base.SendCollisionUpdate(CollisionEventsThisFrame); | ||
2258 | CollisionEventsThisFrame = new CollisionEventUpdate(); | ||
2259 | } | ||
2260 | } | ||
2261 | public override bool SubscribedEvents() | ||
2262 | { | ||
2263 | if (m_eventsubscription > 0) | ||
2264 | return true; | ||
2265 | return false; | ||
2266 | } | ||
2232 | } | 2267 | } |
2233 | } | 2268 | } |
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); |
diff --git a/OpenSim/Region/Physics/POSPlugin/POSPlugin.cs b/OpenSim/Region/Physics/POSPlugin/POSPlugin.cs index b7f38d4..836e620 100644 --- a/OpenSim/Region/Physics/POSPlugin/POSPlugin.cs +++ b/OpenSim/Region/Physics/POSPlugin/POSPlugin.cs | |||
@@ -527,6 +527,18 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
527 | public override PhysicsVector PIDTarget { set { return; } } | 527 | public override PhysicsVector PIDTarget { set { return; } } |
528 | public override bool PIDActive { set { return; } } | 528 | public override bool PIDActive { set { return; } } |
529 | public override float PIDTau { set { return; } } | 529 | public override float PIDTau { set { return; } } |
530 | public override void SubscribeEvents(int ms) | ||
531 | { | ||
532 | |||
533 | } | ||
534 | public override void UnSubscribeEvents() | ||
535 | { | ||
536 | |||
537 | } | ||
538 | public override bool SubscribedEvents() | ||
539 | { | ||
540 | return false; | ||
541 | } | ||
530 | } | 542 | } |
531 | 543 | ||
532 | public class POSPrim : PhysicsActor | 544 | public class POSPrim : PhysicsActor |
@@ -728,5 +740,17 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
728 | public override PhysicsVector PIDTarget { set { return; } } | 740 | public override PhysicsVector PIDTarget { set { return; } } |
729 | public override bool PIDActive { set { return; } } | 741 | public override bool PIDActive { set { return; } } |
730 | public override float PIDTau { set { return; } } | 742 | public override float PIDTau { set { return; } } |
743 | public override void SubscribeEvents(int ms) | ||
744 | { | ||
745 | |||
746 | } | ||
747 | public override void UnSubscribeEvents() | ||
748 | { | ||
749 | |||
750 | } | ||
751 | public override bool SubscribedEvents() | ||
752 | { | ||
753 | return false; | ||
754 | } | ||
731 | } | 755 | } |
732 | } | 756 | } |
diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs index 2d40134..49fe1b5 100644 --- a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs +++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs | |||
@@ -441,6 +441,18 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
441 | public override PhysicsVector PIDTarget { set { return; } } | 441 | public override PhysicsVector PIDTarget { set { return; } } |
442 | public override bool PIDActive { set { return; } } | 442 | public override bool PIDActive { set { return; } } |
443 | public override float PIDTau { set { return; } } | 443 | public override float PIDTau { set { return; } } |
444 | public override void SubscribeEvents(int ms) | ||
445 | { | ||
446 | |||
447 | } | ||
448 | public override void UnSubscribeEvents() | ||
449 | { | ||
450 | |||
451 | } | ||
452 | public override bool SubscribedEvents() | ||
453 | { | ||
454 | return false; | ||
455 | } | ||
444 | } | 456 | } |
445 | 457 | ||
446 | 458 | ||
@@ -666,5 +678,18 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
666 | public override PhysicsVector PIDTarget { set { return; } } | 678 | public override PhysicsVector PIDTarget { set { return; } } |
667 | public override bool PIDActive { set { return; } } | 679 | public override bool PIDActive { set { return; } } |
668 | public override float PIDTau { set { return; } } | 680 | public override float PIDTau { set { return; } } |
681 | |||
682 | public override void SubscribeEvents(int ms) | ||
683 | { | ||
684 | |||
685 | } | ||
686 | public override void UnSubscribeEvents() | ||
687 | { | ||
688 | |||
689 | } | ||
690 | public override bool SubscribedEvents() | ||
691 | { | ||
692 | return false; | ||
693 | } | ||
669 | } | 694 | } |
670 | } | 695 | } |