diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 104 | ||||
-rw-r--r-- | OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs | 4 | ||||
-rw-r--r-- | OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs | 34 |
3 files changed, 96 insertions, 46 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 2e16663..2384143 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -329,7 +329,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
329 | private byte[] m_TextureAnimation; | 329 | private byte[] m_TextureAnimation; |
330 | private byte m_clickAction; | 330 | private byte m_clickAction; |
331 | private Color m_color = Color.Black; | 331 | private Color m_color = Color.Black; |
332 | private readonly List<uint> m_lastColliders = new List<uint>(); | 332 | private List<uint> m_lastColliders = new List<uint>(); |
333 | private bool m_lastLandCollide; | ||
333 | private int m_linkNum; | 334 | private int m_linkNum; |
334 | 335 | ||
335 | private int m_scriptAccessPin; | 336 | private int m_scriptAccessPin; |
@@ -2789,12 +2790,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2789 | { | 2790 | { |
2790 | ColliderArgs colliderArgs = new ColliderArgs(); | 2791 | ColliderArgs colliderArgs = new ColliderArgs(); |
2791 | List<DetectedObject> colliding = new List<DetectedObject>(); | 2792 | List<DetectedObject> colliding = new List<DetectedObject>(); |
2793 | Scene parentScene = ParentGroup.Scene; | ||
2792 | foreach (uint localId in colliders) | 2794 | foreach (uint localId in colliders) |
2793 | { | 2795 | { |
2794 | if (localId == 0) | 2796 | if (localId == 0) |
2795 | continue; | 2797 | continue; |
2796 | 2798 | ||
2797 | SceneObjectPart obj = ParentGroup.Scene.GetSceneObjectPart(localId); | 2799 | SceneObjectPart obj = parentScene.GetSceneObjectPart(localId); |
2798 | if (obj != null) | 2800 | if (obj != null) |
2799 | { | 2801 | { |
2800 | if (!dest.CollisionFilteredOut(obj.UUID, obj.Name)) | 2802 | if (!dest.CollisionFilteredOut(obj.UUID, obj.Name)) |
@@ -2802,7 +2804,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2802 | } | 2804 | } |
2803 | else | 2805 | else |
2804 | { | 2806 | { |
2805 | ScenePresence av = ParentGroup.Scene.GetScenePresence(localId); | 2807 | ScenePresence av = parentScene.GetScenePresence(localId); |
2806 | if (av != null && (!av.IsChildAgent)) | 2808 | if (av != null && (!av.IsChildAgent)) |
2807 | { | 2809 | { |
2808 | if (!dest.CollisionFilteredOut(av.UUID, av.Name)) | 2810 | if (!dest.CollisionFilteredOut(av.UUID, av.Name)) |
@@ -2879,6 +2881,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2879 | return; | 2881 | return; |
2880 | 2882 | ||
2881 | // this a thread from physics ( heartbeat ) | 2883 | // this a thread from physics ( heartbeat ) |
2884 | bool thisHitLand = false; | ||
2885 | bool startLand = false; | ||
2886 | bool endedLand = false; | ||
2882 | 2887 | ||
2883 | CollisionEventUpdate a = (CollisionEventUpdate)e; | 2888 | CollisionEventUpdate a = (CollisionEventUpdate)e; |
2884 | Dictionary<uint, ContactPoint> collissionswith = a.m_objCollisionList; | 2889 | Dictionary<uint, ContactPoint> collissionswith = a.m_objCollisionList; |
@@ -2888,13 +2893,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
2888 | 2893 | ||
2889 | if (collissionswith.Count == 0) | 2894 | if (collissionswith.Count == 0) |
2890 | { | 2895 | { |
2891 | if (m_lastColliders.Count == 0) | 2896 | if (m_lastColliders.Count == 0 && !m_lastLandCollide) |
2892 | return; // nothing to do | 2897 | return; // nothing to do |
2893 | 2898 | ||
2899 | endedLand = m_lastLandCollide; | ||
2900 | m_lastLandCollide = false; | ||
2901 | |||
2894 | foreach (uint localID in m_lastColliders) | 2902 | foreach (uint localID in m_lastColliders) |
2895 | { | 2903 | { |
2896 | endedColliders.Add(localID); | 2904 | endedColliders.Add(localID); |
2897 | } | 2905 | } |
2906 | |||
2898 | m_lastColliders.Clear(); | 2907 | m_lastColliders.Clear(); |
2899 | } | 2908 | } |
2900 | else | 2909 | else |
@@ -2910,19 +2919,39 @@ namespace OpenSim.Region.Framework.Scenes | |||
2910 | 2919 | ||
2911 | foreach (uint id in collissionswith.Keys) | 2920 | foreach (uint id in collissionswith.Keys) |
2912 | { | 2921 | { |
2913 | thisHitColliders.Add(id); | 2922 | if(id == 0) |
2914 | if (!m_lastColliders.Contains(id)) | ||
2915 | { | 2923 | { |
2916 | startedColliders.Add(id); | 2924 | thisHitLand = true; |
2917 | 2925 | if (!m_lastLandCollide) | |
2918 | curcontact = collissionswith[id]; | 2926 | { |
2919 | if (Math.Abs(curcontact.RelativeSpeed) > 0.2) | 2927 | startLand = true; |
2928 | curcontact = collissionswith[id]; | ||
2929 | if (Math.Abs(curcontact.RelativeSpeed) > 0.2) | ||
2930 | { | ||
2931 | soundinfo = new CollisionForSoundInfo(); | ||
2932 | soundinfo.colliderID = id; | ||
2933 | soundinfo.position = curcontact.Position; | ||
2934 | soundinfo.relativeVel = curcontact.RelativeSpeed; | ||
2935 | soundinfolist.Add(soundinfo); | ||
2936 | } | ||
2937 | } | ||
2938 | } | ||
2939 | else | ||
2940 | { | ||
2941 | thisHitColliders.Add(id); | ||
2942 | if (!m_lastColliders.Contains(id)) | ||
2920 | { | 2943 | { |
2921 | soundinfo = new CollisionForSoundInfo(); | 2944 | startedColliders.Add(id); |
2922 | soundinfo.colliderID = id; | 2945 | |
2923 | soundinfo.position = curcontact.Position; | 2946 | curcontact = collissionswith[id]; |
2924 | soundinfo.relativeVel = curcontact.RelativeSpeed; | 2947 | if (Math.Abs(curcontact.RelativeSpeed) > 0.2) |
2925 | soundinfolist.Add(soundinfo); | 2948 | { |
2949 | soundinfo = new CollisionForSoundInfo(); | ||
2950 | soundinfo.colliderID = id; | ||
2951 | soundinfo.position = curcontact.Position; | ||
2952 | soundinfo.relativeVel = curcontact.RelativeSpeed; | ||
2953 | soundinfolist.Add(soundinfo); | ||
2954 | } | ||
2926 | } | 2955 | } |
2927 | } | 2956 | } |
2928 | } | 2957 | } |
@@ -2931,9 +2960,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
2931 | { | 2960 | { |
2932 | foreach (uint id in collissionswith.Keys) | 2961 | foreach (uint id in collissionswith.Keys) |
2933 | { | 2962 | { |
2934 | thisHitColliders.Add(id); | 2963 | if(id == 0) |
2935 | if (!m_lastColliders.Contains(id)) | 2964 | { |
2936 | startedColliders.Add(id); | 2965 | thisHitLand = true; |
2966 | if (!m_lastLandCollide) | ||
2967 | startLand = true; | ||
2968 | } | ||
2969 | else | ||
2970 | { | ||
2971 | thisHitColliders.Add(id); | ||
2972 | if (!m_lastColliders.Contains(id)) | ||
2973 | startedColliders.Add(id); | ||
2974 | } | ||
2937 | } | 2975 | } |
2938 | } | 2976 | } |
2939 | 2977 | ||
@@ -2952,22 +2990,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
2952 | foreach (uint localID in endedColliders) | 2990 | foreach (uint localID in endedColliders) |
2953 | m_lastColliders.Remove(localID); | 2991 | m_lastColliders.Remove(localID); |
2954 | 2992 | ||
2993 | if(m_lastLandCollide && !thisHitLand) | ||
2994 | endedLand = true; | ||
2995 | |||
2996 | m_lastLandCollide = thisHitLand; | ||
2997 | |||
2955 | // play sounds. | 2998 | // play sounds. |
2956 | if (soundinfolist.Count > 0) | 2999 | if (soundinfolist.Count > 0) |
2957 | CollisionSounds.PartCollisionSound(this, soundinfolist); | 3000 | CollisionSounds.PartCollisionSound(this, soundinfolist); |
2958 | } | 3001 | } |
3002 | |||
3003 | EventManager eventmanager = ParentGroup.Scene.EventManager; | ||
2959 | 3004 | ||
2960 | SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart); | 3005 | SendCollisionEvent(scriptEvents.collision_start, startedColliders, eventmanager.TriggerScriptCollidingStart); |
2961 | if (!VolumeDetectActive) | 3006 | if (!VolumeDetectActive) |
2962 | SendCollisionEvent(scriptEvents.collision , m_lastColliders , ParentGroup.Scene.EventManager.TriggerScriptColliding); | 3007 | SendCollisionEvent(scriptEvents.collision , m_lastColliders , eventmanager.TriggerScriptColliding); |
2963 | SendCollisionEvent(scriptEvents.collision_end , endedColliders , ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd); | 3008 | SendCollisionEvent(scriptEvents.collision_end , endedColliders , eventmanager.TriggerScriptCollidingEnd); |
2964 | 3009 | ||
2965 | if (startedColliders.Contains(0)) | 3010 | if (!VolumeDetectActive) |
2966 | SendLandCollisionEvent(scriptEvents.land_collision_start, ParentGroup.Scene.EventManager.TriggerScriptLandCollidingStart); | 3011 | { |
2967 | if (m_lastColliders.Contains(0)) | 3012 | if (startLand) |
2968 | SendLandCollisionEvent(scriptEvents.land_collision, ParentGroup.Scene.EventManager.TriggerScriptLandColliding); | 3013 | SendLandCollisionEvent(scriptEvents.land_collision_start, eventmanager.TriggerScriptLandCollidingStart); |
2969 | if (endedColliders.Contains(0)) | 3014 | if (m_lastLandCollide) |
2970 | SendLandCollisionEvent(scriptEvents.land_collision_end, ParentGroup.Scene.EventManager.TriggerScriptLandCollidingEnd); | 3015 | SendLandCollisionEvent(scriptEvents.land_collision, eventmanager.TriggerScriptLandColliding); |
3016 | if (endedLand) | ||
3017 | SendLandCollisionEvent(scriptEvents.land_collision_end, eventmanager.TriggerScriptLandCollidingEnd); | ||
3018 | } | ||
2971 | } | 3019 | } |
2972 | 3020 | ||
2973 | // The Collision sounds code calls this | 3021 | // The Collision sounds code calls this |
@@ -2986,7 +3034,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2986 | volume = 0; | 3034 | volume = 0; |
2987 | 3035 | ||
2988 | int now = Util.EnvironmentTickCount(); | 3036 | int now = Util.EnvironmentTickCount(); |
2989 | if(Util.EnvironmentTickCountSubtract(now,LastColSoundSentTime) <200) | 3037 | if(Util.EnvironmentTickCountSubtract(now, LastColSoundSentTime) < 200) |
2990 | return; | 3038 | return; |
2991 | 3039 | ||
2992 | LastColSoundSentTime = now; | 3040 | LastColSoundSentTime = now; |
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs index 005caee..44e722c 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs | |||
@@ -1240,7 +1240,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1240 | SentEmptyCollisionsEvent = true; | 1240 | SentEmptyCollisionsEvent = true; |
1241 | // _parent_scene.RemoveCollisionEventReporting(this); | 1241 | // _parent_scene.RemoveCollisionEventReporting(this); |
1242 | } | 1242 | } |
1243 | else if(Body == IntPtr.Zero || d.BodyIsEnabled(Body)) | 1243 | else if(Body == IntPtr.Zero || (d.BodyIsEnabled(Body) && m_bodydisablecontrol >= 0 )) |
1244 | { | 1244 | { |
1245 | SentEmptyCollisionsEvent = false; | 1245 | SentEmptyCollisionsEvent = false; |
1246 | CollisionEventsThisFrame.Clear(); | 1246 | CollisionEventsThisFrame.Clear(); |
@@ -3595,7 +3595,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
3595 | _zeroFlag = true; | 3595 | _zeroFlag = true; |
3596 | d.BodySetAutoDisableSteps(Body, 1); | 3596 | d.BodySetAutoDisableSteps(Body, 1); |
3597 | d.BodyEnable(Body); | 3597 | d.BodyEnable(Body); |
3598 | m_bodydisablecontrol = -4; | 3598 | m_bodydisablecontrol = -3; |
3599 | } | 3599 | } |
3600 | 3600 | ||
3601 | if(m_bodydisablecontrol < 0) | 3601 | if(m_bodydisablecontrol < 0) |
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs index 5758e0a..004ee7f 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs | |||
@@ -203,8 +203,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
203 | private float metersInSpace = 25.6f; | 203 | private float metersInSpace = 25.6f; |
204 | private float m_timeDilation = 1.0f; | 204 | private float m_timeDilation = 1.0f; |
205 | 205 | ||
206 | private DateTime m_lastframe; | 206 | private double m_lastframe; |
207 | private DateTime m_lastMeshExpire; | 207 | private double m_lastMeshExpire; |
208 | 208 | ||
209 | public float gravityx = 0f; | 209 | public float gravityx = 0f; |
210 | public float gravityy = 0f; | 210 | public float gravityy = 0f; |
@@ -629,8 +629,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
629 | staticPrimspaceOffRegion[i] = newspace; | 629 | staticPrimspaceOffRegion[i] = newspace; |
630 | } | 630 | } |
631 | 631 | ||
632 | m_lastframe = DateTime.UtcNow; | 632 | m_lastframe = Util.GetTimeStamp(); |
633 | m_lastMeshExpire = m_lastframe; | 633 | m_lastMeshExpire = m_lastframe; |
634 | step_time = -1; | ||
634 | } | 635 | } |
635 | 636 | ||
636 | internal void waitForSpaceUnlock(IntPtr space) | 637 | internal void waitForSpaceUnlock(IntPtr space) |
@@ -1625,6 +1626,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1625 | } | 1626 | } |
1626 | m_log.InfoFormat("[ubOde] {0} prim actors loaded",_prims.Count); | 1627 | m_log.InfoFormat("[ubOde] {0} prim actors loaded",_prims.Count); |
1627 | } | 1628 | } |
1629 | m_lastframe = Util.GetTimeStamp() + 0.5; | ||
1630 | step_time = -0.5f; | ||
1628 | } | 1631 | } |
1629 | 1632 | ||
1630 | /// <summary> | 1633 | /// <summary> |
@@ -1638,13 +1641,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1638 | /// <returns></returns> | 1641 | /// <returns></returns> |
1639 | public override float Simulate(float reqTimeStep) | 1642 | public override float Simulate(float reqTimeStep) |
1640 | { | 1643 | { |
1641 | DateTime now = DateTime.UtcNow; | 1644 | double now = Util.GetTimeStamp(); |
1642 | TimeSpan timedif = now - m_lastframe; | 1645 | double timeStep = now - m_lastframe; |
1643 | float timeStep = (float)timedif.TotalSeconds; | ||
1644 | m_lastframe = now; | 1646 | m_lastframe = now; |
1645 | 1647 | ||
1646 | // acumulate time so we can reduce error | 1648 | // acumulate time so we can reduce error |
1647 | step_time += timeStep; | 1649 | step_time += (float)timeStep; |
1648 | 1650 | ||
1649 | if (step_time < HalfOdeStep) | 1651 | if (step_time < HalfOdeStep) |
1650 | return 0; | 1652 | return 0; |
@@ -1853,14 +1855,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1853 | } | 1855 | } |
1854 | } | 1856 | } |
1855 | 1857 | ||
1856 | timedif = now - m_lastMeshExpire; | ||
1857 | |||
1858 | if (timedif.Seconds > 10) | ||
1859 | { | ||
1860 | mesher.ExpireReleaseMeshs(); | ||
1861 | m_lastMeshExpire = now; | ||
1862 | } | ||
1863 | |||
1864 | // information block for in debug breakpoint only | 1858 | // information block for in debug breakpoint only |
1865 | /* | 1859 | /* |
1866 | int ntopactivegeoms = d.SpaceGetNumGeoms(ActiveSpace); | 1860 | int ntopactivegeoms = d.SpaceGetNumGeoms(ActiveSpace); |
@@ -1940,7 +1934,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1940 | // if we lag too much skip frames | 1934 | // if we lag too much skip frames |
1941 | m_timeDilation = 0.0f; | 1935 | m_timeDilation = 0.0f; |
1942 | step_time = 0; | 1936 | step_time = 0; |
1943 | m_lastframe = DateTime.UtcNow; // skip also the time lost | 1937 | m_lastframe = Util.GetTimeStamp(); // skip also the time lost |
1944 | } | 1938 | } |
1945 | else | 1939 | else |
1946 | { | 1940 | { |
@@ -1948,6 +1942,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1948 | if (m_timeDilation > 1) | 1942 | if (m_timeDilation > 1) |
1949 | m_timeDilation = 1; | 1943 | m_timeDilation = 1; |
1950 | } | 1944 | } |
1945 | |||
1946 | if (m_timeDilation == 1 && now - m_lastMeshExpire > 30) | ||
1947 | { | ||
1948 | mesher.ExpireReleaseMeshs(); | ||
1949 | m_lastMeshExpire = now; | ||
1950 | } | ||
1951 | |||
1952 | |||
1951 | } | 1953 | } |
1952 | 1954 | ||
1953 | return fps; | 1955 | return fps; |