diff options
author | UbitUmarov | 2017-09-08 19:59:38 +0100 |
---|---|---|
committer | UbitUmarov | 2017-09-08 19:59:38 +0100 |
commit | 0ac81f6a099b80e3847b056f7be7820833000686 (patch) | |
tree | 7cffb4a6b767e3cb3f4c9b57d211d1101c2f9de0 /OpenSim/Region/PhysicsModules/ubOde | |
parent | Merge branch 'master' into httptests (diff) | |
download | opensim-SC-0ac81f6a099b80e3847b056f7be7820833000686.zip opensim-SC-0ac81f6a099b80e3847b056f7be7820833000686.tar.gz opensim-SC-0ac81f6a099b80e3847b056f7be7820833000686.tar.bz2 opensim-SC-0ac81f6a099b80e3847b056f7be7820833000686.tar.xz |
ubOde: hashSpaces aren't that nice
Diffstat (limited to 'OpenSim/Region/PhysicsModules/ubOde')
-rw-r--r-- | OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs | 3 | ||||
-rw-r--r-- | OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs | 65 | ||||
-rw-r--r-- | OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs | 227 |
3 files changed, 107 insertions, 188 deletions
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs index 0e46471..f111e87 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs | |||
@@ -751,8 +751,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
751 | 751 | ||
752 | m_parent_scene.waitForSpaceUnlock(m_parent_scene.CharsSpace); | 752 | m_parent_scene.waitForSpaceUnlock(m_parent_scene.CharsSpace); |
753 | 753 | ||
754 | collider = d.HashSpaceCreate(m_parent_scene.CharsSpace); | 754 | collider = d.SimpleSpaceCreate(m_parent_scene.CharsSpace); |
755 | d.HashSpaceSetLevels(collider, -4, 3); | ||
756 | d.SpaceSetSublevel(collider, 3); | 755 | d.SpaceSetSublevel(collider, 3); |
757 | d.SpaceSetCleanup(collider, false); | 756 | d.SpaceSetCleanup(collider, false); |
758 | d.GeomSetCategoryBits(collider, (uint)m_collisionCategories); | 757 | d.GeomSetCategoryBits(collider, (uint)m_collisionCategories); |
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs index aa208e2..e080b18 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs | |||
@@ -196,8 +196,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
196 | 196 | ||
197 | private int m_eventsubscription; | 197 | private int m_eventsubscription; |
198 | private int m_cureventsubscription; | 198 | private int m_cureventsubscription; |
199 | private CollisionEventUpdate CollisionEventsThisFrame = null; | 199 | private CollisionEventUpdate CollisionEvents = null; |
200 | private CollisionEventUpdate CollisionVDTCEventsThisFrame = null; | 200 | private CollisionEventUpdate CollisionVDTCEvents = null; |
201 | private bool SentEmptyCollisionsEvent; | 201 | private bool SentEmptyCollisionsEvent; |
202 | 202 | ||
203 | public volatile bool childPrim; | 203 | public volatile bool childPrim; |
@@ -1138,24 +1138,24 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1138 | { | 1138 | { |
1139 | m_eventsubscription = ms; | 1139 | m_eventsubscription = ms; |
1140 | m_cureventsubscription = 0; | 1140 | m_cureventsubscription = 0; |
1141 | if (CollisionEventsThisFrame == null) | 1141 | if (CollisionEvents == null) |
1142 | CollisionEventsThisFrame = new CollisionEventUpdate(); | 1142 | CollisionEvents = new CollisionEventUpdate(); |
1143 | if (CollisionVDTCEventsThisFrame == null) | 1143 | if (CollisionVDTCEvents == null) |
1144 | CollisionVDTCEventsThisFrame = new CollisionEventUpdate(); | 1144 | CollisionVDTCEvents = new CollisionEventUpdate(); |
1145 | SentEmptyCollisionsEvent = false; | 1145 | SentEmptyCollisionsEvent = false; |
1146 | } | 1146 | } |
1147 | 1147 | ||
1148 | public override void UnSubscribeEvents() | 1148 | public override void UnSubscribeEvents() |
1149 | { | 1149 | { |
1150 | if (CollisionVDTCEventsThisFrame != null) | 1150 | if (CollisionVDTCEvents != null) |
1151 | { | 1151 | { |
1152 | CollisionVDTCEventsThisFrame.Clear(); | 1152 | CollisionVDTCEvents.Clear(); |
1153 | CollisionVDTCEventsThisFrame = null; | 1153 | CollisionVDTCEvents = null; |
1154 | } | 1154 | } |
1155 | if (CollisionEventsThisFrame != null) | 1155 | if (CollisionEvents != null) |
1156 | { | 1156 | { |
1157 | CollisionEventsThisFrame.Clear(); | 1157 | CollisionEvents.Clear(); |
1158 | CollisionEventsThisFrame = null; | 1158 | CollisionEvents = null; |
1159 | } | 1159 | } |
1160 | m_eventsubscription = 0; | 1160 | m_eventsubscription = 0; |
1161 | _parent_scene.RemoveCollisionEventReporting(this); | 1161 | _parent_scene.RemoveCollisionEventReporting(this); |
@@ -1163,27 +1163,27 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1163 | 1163 | ||
1164 | public override void AddCollisionEvent(uint CollidedWith, ContactPoint contact) | 1164 | public override void AddCollisionEvent(uint CollidedWith, ContactPoint contact) |
1165 | { | 1165 | { |
1166 | if (CollisionEventsThisFrame == null) | 1166 | if (CollisionEvents == null) |
1167 | CollisionEventsThisFrame = new CollisionEventUpdate(); | 1167 | CollisionEvents = new CollisionEventUpdate(); |
1168 | 1168 | ||
1169 | CollisionEventsThisFrame.AddCollider(CollidedWith, contact); | 1169 | CollisionEvents.AddCollider(CollidedWith, contact); |
1170 | _parent_scene.AddCollisionEventReporting(this); | 1170 | _parent_scene.AddCollisionEventReporting(this); |
1171 | } | 1171 | } |
1172 | 1172 | ||
1173 | public override void AddVDTCCollisionEvent(uint CollidedWith, ContactPoint contact) | 1173 | public override void AddVDTCCollisionEvent(uint CollidedWith, ContactPoint contact) |
1174 | { | 1174 | { |
1175 | if (CollisionVDTCEventsThisFrame == null) | 1175 | if (CollisionVDTCEvents == null) |
1176 | CollisionVDTCEventsThisFrame = new CollisionEventUpdate(); | 1176 | CollisionVDTCEvents = new CollisionEventUpdate(); |
1177 | 1177 | ||
1178 | CollisionVDTCEventsThisFrame.AddCollider(CollidedWith, contact); | 1178 | CollisionVDTCEvents.AddCollider(CollidedWith, contact); |
1179 | _parent_scene.AddCollisionEventReporting(this); | 1179 | _parent_scene.AddCollisionEventReporting(this); |
1180 | } | 1180 | } |
1181 | 1181 | ||
1182 | internal void SleeperAddCollisionEvents() | 1182 | internal void SleeperAddCollisionEvents() |
1183 | { | 1183 | { |
1184 | if(CollisionEventsThisFrame != null && CollisionEventsThisFrame.m_objCollisionList.Count != 0) | 1184 | if(CollisionEvents != null && CollisionEvents.m_objCollisionList.Count != 0) |
1185 | { | 1185 | { |
1186 | foreach(KeyValuePair<uint,ContactPoint> kvp in CollisionEventsThisFrame.m_objCollisionList) | 1186 | foreach(KeyValuePair<uint,ContactPoint> kvp in CollisionEvents.m_objCollisionList) |
1187 | { | 1187 | { |
1188 | if(kvp.Key == 0) | 1188 | if(kvp.Key == 0) |
1189 | continue; | 1189 | continue; |
@@ -1196,9 +1196,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1196 | other.AddCollisionEvent(ParentActor.LocalID,cp); | 1196 | other.AddCollisionEvent(ParentActor.LocalID,cp); |
1197 | } | 1197 | } |
1198 | } | 1198 | } |
1199 | if(CollisionVDTCEventsThisFrame != null && CollisionVDTCEventsThisFrame.m_objCollisionList.Count != 0) | 1199 | if(CollisionVDTCEvents != null && CollisionVDTCEvents.m_objCollisionList.Count != 0) |
1200 | { | 1200 | { |
1201 | foreach(KeyValuePair<uint,ContactPoint> kvp in CollisionVDTCEventsThisFrame.m_objCollisionList) | 1201 | foreach(KeyValuePair<uint,ContactPoint> kvp in CollisionVDTCEvents.m_objCollisionList) |
1202 | { | 1202 | { |
1203 | OdePrim other = _parent_scene.getPrim(kvp.Key); | 1203 | OdePrim other = _parent_scene.getPrim(kvp.Key); |
1204 | if(other == null) | 1204 | if(other == null) |
@@ -1213,8 +1213,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1213 | 1213 | ||
1214 | internal void clearSleeperCollisions() | 1214 | internal void clearSleeperCollisions() |
1215 | { | 1215 | { |
1216 | if(CollisionVDTCEventsThisFrame != null && CollisionVDTCEventsThisFrame.Count >0 ) | 1216 | if(CollisionVDTCEvents != null && CollisionVDTCEvents.Count >0 ) |
1217 | CollisionVDTCEventsThisFrame.Clear(); | 1217 | CollisionVDTCEvents.Clear(); |
1218 | } | 1218 | } |
1219 | 1219 | ||
1220 | public void SendCollisions(int timestep) | 1220 | public void SendCollisions(int timestep) |
@@ -1226,14 +1226,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1226 | if (m_cureventsubscription < m_eventsubscription) | 1226 | if (m_cureventsubscription < m_eventsubscription) |
1227 | return; | 1227 | return; |
1228 | 1228 | ||
1229 | if (CollisionEventsThisFrame == null) | 1229 | if (CollisionEvents == null) |
1230 | return; | 1230 | return; |
1231 | 1231 | ||
1232 | int ncolisions = CollisionEventsThisFrame.m_objCollisionList.Count; | 1232 | int ncolisions = CollisionEvents.m_objCollisionList.Count; |
1233 | 1233 | ||
1234 | if (!SentEmptyCollisionsEvent || ncolisions > 0) | 1234 | if (!SentEmptyCollisionsEvent || ncolisions > 0) |
1235 | { | 1235 | { |
1236 | base.SendCollisionUpdate(CollisionEventsThisFrame); | 1236 | base.SendCollisionUpdate(CollisionEvents); |
1237 | m_cureventsubscription = 0; | 1237 | m_cureventsubscription = 0; |
1238 | 1238 | ||
1239 | if (ncolisions == 0) | 1239 | if (ncolisions == 0) |
@@ -1244,7 +1244,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1244 | else if(Body == IntPtr.Zero || (d.BodyIsEnabled(Body) && m_bodydisablecontrol >= 0 )) | 1244 | else if(Body == IntPtr.Zero || (d.BodyIsEnabled(Body) && m_bodydisablecontrol >= 0 )) |
1245 | { | 1245 | { |
1246 | SentEmptyCollisionsEvent = false; | 1246 | SentEmptyCollisionsEvent = false; |
1247 | CollisionEventsThisFrame.Clear(); | 1247 | CollisionEvents.Clear(); |
1248 | } | 1248 | } |
1249 | } | 1249 | } |
1250 | } | 1250 | } |
@@ -1832,7 +1832,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1832 | // should only be called for non physical prims unless they are becoming non physical | 1832 | // should only be called for non physical prims unless they are becoming non physical |
1833 | private void SetInStaticSpace(OdePrim prim) | 1833 | private void SetInStaticSpace(OdePrim prim) |
1834 | { | 1834 | { |
1835 | IntPtr targetSpace = _parent_scene.MoveGeomToStaticSpace(prim.prim_geom, prim._position, prim.m_targetSpace); | 1835 | IntPtr targetSpace = _parent_scene.MoveGeomToStaticSpace(prim.prim_geom, prim.m_targetSpace); |
1836 | prim.m_targetSpace = targetSpace; | 1836 | prim.m_targetSpace = targetSpace; |
1837 | collide_geom = IntPtr.Zero; | 1837 | collide_geom = IntPtr.Zero; |
1838 | } | 1838 | } |
@@ -2069,8 +2069,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2069 | } | 2069 | } |
2070 | else | 2070 | else |
2071 | { | 2071 | { |
2072 | m_targetSpace = d.HashSpaceCreate(_parent_scene.ActiveSpace); | 2072 | m_targetSpace = d.SimpleSpaceCreate(_parent_scene.ActiveSpace); |
2073 | d.HashSpaceSetLevels(m_targetSpace, -2, 8); | ||
2074 | d.SpaceSetSublevel(m_targetSpace, 3); | 2073 | d.SpaceSetSublevel(m_targetSpace, 3); |
2075 | d.SpaceSetCleanup(m_targetSpace, false); | 2074 | d.SpaceSetCleanup(m_targetSpace, false); |
2076 | 2075 | ||
@@ -2964,7 +2963,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2964 | d.GeomSetPosition(prim_geom, newPos.X, newPos.Y, newPos.Z); | 2963 | d.GeomSetPosition(prim_geom, newPos.X, newPos.Y, newPos.Z); |
2965 | _position = newPos; | 2964 | _position = newPos; |
2966 | 2965 | ||
2967 | m_targetSpace = _parent_scene.MoveGeomToStaticSpace(prim_geom, _position, m_targetSpace); | 2966 | m_targetSpace = _parent_scene.MoveGeomToStaticSpace(prim_geom, m_targetSpace); |
2968 | } | 2967 | } |
2969 | } | 2968 | } |
2970 | } | 2969 | } |
@@ -3103,7 +3102,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
3103 | d.GeomSetPosition(prim_geom, newPos.X, newPos.Y, newPos.Z); | 3102 | d.GeomSetPosition(prim_geom, newPos.X, newPos.Y, newPos.Z); |
3104 | _position = newPos; | 3103 | _position = newPos; |
3105 | 3104 | ||
3106 | m_targetSpace = _parent_scene.MoveGeomToStaticSpace(prim_geom, _position, m_targetSpace); | 3105 | m_targetSpace = _parent_scene.MoveGeomToStaticSpace(prim_geom, m_targetSpace); |
3107 | } | 3106 | } |
3108 | } | 3107 | } |
3109 | } | 3108 | } |
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs index 5602bd9..9867bfd 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs | |||
@@ -201,7 +201,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
201 | public float ODE_STEPSIZE = 0.020f; | 201 | public float ODE_STEPSIZE = 0.020f; |
202 | public float HalfOdeStep = 0.01f; | 202 | public float HalfOdeStep = 0.01f; |
203 | public int odetimestepMS = 20; // rounded | 203 | public int odetimestepMS = 20; // rounded |
204 | private float metersInSpace = 25.6f; | ||
205 | private float m_timeDilation = 1.0f; | 204 | private float m_timeDilation = 1.0f; |
206 | 205 | ||
207 | private double m_lastframe; | 206 | private double m_lastframe; |
@@ -284,16 +283,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
284 | public IntPtr StaticSpace; // space for the static things around | 283 | public IntPtr StaticSpace; // space for the static things around |
285 | public IntPtr GroundSpace; // space for ground | 284 | public IntPtr GroundSpace; // space for ground |
286 | 285 | ||
287 | // some speedup variables | ||
288 | private int spaceGridMaxX; | ||
289 | private int spaceGridMaxY; | ||
290 | private float spacesPerMeterX; | ||
291 | private float spacesPerMeterY; | ||
292 | |||
293 | // split static geometry collision into a grid as before | ||
294 | private IntPtr[,] staticPrimspace; | ||
295 | private IntPtr[] staticPrimspaceOffRegion; | ||
296 | |||
297 | public Object OdeLock; | 286 | public Object OdeLock; |
298 | public static Object SimulationLock; | 287 | public static Object SimulationLock; |
299 | 288 | ||
@@ -386,13 +375,23 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
386 | try | 375 | try |
387 | { | 376 | { |
388 | world = d.WorldCreate(); | 377 | world = d.WorldCreate(); |
389 | TopSpace = d.HashSpaceCreate(IntPtr.Zero); | 378 | TopSpace = d.SimpleSpaceCreate(IntPtr.Zero); |
390 | 379 | ActiveSpace = d.SimpleSpaceCreate(TopSpace); | |
391 | // now the major subspaces | 380 | CharsSpace = d.SimpleSpaceCreate(TopSpace); |
392 | ActiveSpace = d.HashSpaceCreate(TopSpace); | 381 | GroundSpace = d.SimpleSpaceCreate(TopSpace); |
393 | CharsSpace = d.HashSpaceCreate(TopSpace); | 382 | float sx = WorldExtents.X + 16; |
394 | StaticSpace = d.HashSpaceCreate(TopSpace); | 383 | float sy = WorldExtents.Y + 16; |
395 | GroundSpace = d.HashSpaceCreate(TopSpace); | 384 | d.Vector3 ex =new d.Vector3(sx, sy, 0); |
385 | d.Vector3 px =new d.Vector3(sx * 0.5f, sx * 0.5f, 0); | ||
386 | if(sx < sy) | ||
387 | sx = sy; | ||
388 | sx = (float)Math.Log(sx) * 1.442695f + 0.5f; | ||
389 | int dp = (int)sx - 2; | ||
390 | if(dp > 8) | ||
391 | dp = 8; | ||
392 | else if(dp < 4) | ||
393 | dp = 4; | ||
394 | StaticSpace = d.QuadTreeSpaceCreate(TopSpace, ref px, ref ex, dp); | ||
396 | } | 395 | } |
397 | catch | 396 | catch |
398 | { | 397 | { |
@@ -400,12 +399,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
400 | // i did! | 399 | // i did! |
401 | } | 400 | } |
402 | 401 | ||
403 | d.HashSpaceSetLevels(TopSpace, -5, 12); | ||
404 | d.HashSpaceSetLevels(ActiveSpace, -5, 10); | ||
405 | d.HashSpaceSetLevels(CharsSpace, -4, 3); | ||
406 | d.HashSpaceSetLevels(StaticSpace, -5, 12); | ||
407 | d.HashSpaceSetLevels(GroundSpace, 0, 8); | ||
408 | |||
409 | // demote to second level | 402 | // demote to second level |
410 | d.SpaceSetSublevel(ActiveSpace, 1); | 403 | d.SpaceSetSublevel(ActiveSpace, 1); |
411 | d.SpaceSetSublevel(CharsSpace, 1); | 404 | d.SpaceSetSublevel(CharsSpace, 1); |
@@ -469,8 +462,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
469 | gravityy = physicsconfig.GetFloat("world_gravityy", gravityy); | 462 | gravityy = physicsconfig.GetFloat("world_gravityy", gravityy); |
470 | gravityz = physicsconfig.GetFloat("world_gravityz", gravityz); | 463 | gravityz = physicsconfig.GetFloat("world_gravityz", gravityz); |
471 | 464 | ||
472 | metersInSpace = physicsconfig.GetFloat("meters_in_small_space", metersInSpace); | ||
473 | |||
474 | // contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer); | 465 | // contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer); |
475 | 466 | ||
476 | ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE); | 467 | ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE); |
@@ -560,76 +551,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
560 | m_materialContactsData[(int)Material.light].mu = 0.0f; | 551 | m_materialContactsData[(int)Material.light].mu = 0.0f; |
561 | m_materialContactsData[(int)Material.light].bounce = 0.0f; | 552 | m_materialContactsData[(int)Material.light].bounce = 0.0f; |
562 | 553 | ||
563 | |||
564 | spacesPerMeterX = 1.0f / metersInSpace; | ||
565 | spacesPerMeterY = spacesPerMeterX; | ||
566 | spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeterX); | ||
567 | spaceGridMaxY = (int)(WorldExtents.Y * spacesPerMeterY); | ||
568 | |||
569 | if (spaceGridMaxX > 24) | ||
570 | { | ||
571 | spaceGridMaxX = 24; | ||
572 | spacesPerMeterX = spaceGridMaxX / WorldExtents.X; | ||
573 | } | ||
574 | |||
575 | if (spaceGridMaxY > 24) | ||
576 | { | ||
577 | spaceGridMaxY = 24; | ||
578 | spacesPerMeterY = spaceGridMaxY / WorldExtents.Y; | ||
579 | } | ||
580 | |||
581 | staticPrimspace = new IntPtr[spaceGridMaxX, spaceGridMaxY]; | ||
582 | |||
583 | // create all spaces now | ||
584 | int i, j; | ||
585 | IntPtr newspace; | ||
586 | |||
587 | for (i = 0; i < spaceGridMaxX; i++) | ||
588 | for (j = 0; j < spaceGridMaxY; j++) | ||
589 | { | ||
590 | newspace = d.HashSpaceCreate(StaticSpace); | ||
591 | d.GeomSetCategoryBits(newspace, (int)CollisionCategories.Space); | ||
592 | waitForSpaceUnlock(newspace); | ||
593 | d.SpaceSetSublevel(newspace, 2); | ||
594 | d.HashSpaceSetLevels(newspace, -2, 8); | ||
595 | d.GeomSetCategoryBits(newspace, (uint)(CollisionCategories.Space | | ||
596 | CollisionCategories.Geom | | ||
597 | CollisionCategories.Land | | ||
598 | CollisionCategories.Water | | ||
599 | CollisionCategories.Phantom | | ||
600 | CollisionCategories.VolumeDtc | ||
601 | )); | ||
602 | d.GeomSetCollideBits(newspace, 0); | ||
603 | |||
604 | staticPrimspace[i, j] = newspace; | ||
605 | } | ||
606 | |||
607 | // let this now be index limit | ||
608 | spaceGridMaxX--; | ||
609 | spaceGridMaxY--; | ||
610 | |||
611 | // create 4 off world spaces (x<0,x>max,y<0,y>max) | ||
612 | staticPrimspaceOffRegion = new IntPtr[4]; | ||
613 | |||
614 | for (i = 0; i < 4; i++) | ||
615 | { | ||
616 | newspace = d.HashSpaceCreate(StaticSpace); | ||
617 | d.GeomSetCategoryBits(newspace, (int)CollisionCategories.Space); | ||
618 | waitForSpaceUnlock(newspace); | ||
619 | d.SpaceSetSublevel(newspace, 2); | ||
620 | d.HashSpaceSetLevels(newspace, -2, 8); | ||
621 | d.GeomSetCategoryBits(newspace, (uint)(CollisionCategories.Space | | ||
622 | CollisionCategories.Geom | | ||
623 | CollisionCategories.Land | | ||
624 | CollisionCategories.Water | | ||
625 | CollisionCategories.Phantom | | ||
626 | CollisionCategories.VolumeDtc | ||
627 | )); | ||
628 | d.GeomSetCollideBits(newspace, 0); | ||
629 | |||
630 | staticPrimspaceOffRegion[i] = newspace; | ||
631 | } | ||
632 | |||
633 | m_lastframe = Util.GetTimeStamp(); | 554 | m_lastframe = Util.GetTimeStamp(); |
634 | m_lastMeshExpire = m_lastframe; | 555 | m_lastMeshExpire = m_lastframe; |
635 | step_time = -1; | 556 | step_time = -1; |
@@ -758,7 +679,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
758 | // | 679 | // |
759 | */ | 680 | */ |
760 | 681 | ||
761 | |||
762 | if (d.GeomGetCategoryBits(g1) == (uint)CollisionCategories.VolumeDtc || | 682 | if (d.GeomGetCategoryBits(g1) == (uint)CollisionCategories.VolumeDtc || |
763 | d.GeomGetCategoryBits(g2) == (uint)CollisionCategories.VolumeDtc) | 683 | d.GeomGetCategoryBits(g2) == (uint)CollisionCategories.VolumeDtc) |
764 | { | 684 | { |
@@ -1307,6 +1227,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1307 | public override void RemoveAvatar(PhysicsActor actor) | 1227 | public override void RemoveAvatar(PhysicsActor actor) |
1308 | { | 1228 | { |
1309 | //m_log.Debug("[PHYSICS]:ODELOCK"); | 1229 | //m_log.Debug("[PHYSICS]:ODELOCK"); |
1230 | if (world == IntPtr.Zero) | ||
1231 | return; | ||
1232 | |||
1310 | lock (OdeLock) | 1233 | lock (OdeLock) |
1311 | { | 1234 | { |
1312 | d.AllocateODEDataForThread(0); | 1235 | d.AllocateODEDataForThread(0); |
@@ -1461,27 +1384,23 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1461 | 1384 | ||
1462 | /// <summary> | 1385 | /// <summary> |
1463 | /// Called when a static prim moves or becomes static | 1386 | /// Called when a static prim moves or becomes static |
1464 | /// Places the prim in a space one the static sub-spaces grid | 1387 | /// Places the prim in a space one the static space |
1465 | /// </summary> | 1388 | /// </summary> |
1466 | /// <param name="geom">the pointer to the geom that moved</param> | 1389 | /// <param name="geom">the pointer to the geom that moved</param> |
1467 | /// <param name="pos">the position that the geom moved to</param> | ||
1468 | /// <param name="currentspace">a pointer to the space it was in before it was moved.</param> | 1390 | /// <param name="currentspace">a pointer to the space it was in before it was moved.</param> |
1469 | /// <returns>a pointer to the new space it's in</returns> | 1391 | /// <returns>a pointer to the new space it's in</returns> |
1470 | public IntPtr MoveGeomToStaticSpace(IntPtr geom, Vector3 pos, IntPtr currentspace) | 1392 | public IntPtr MoveGeomToStaticSpace(IntPtr geom, IntPtr currentspace) |
1471 | { | 1393 | { |
1472 | // moves a prim into another static sub-space or from another space into a static sub-space | 1394 | // moves a prim into static sub-space |
1473 | 1395 | ||
1474 | // Called ODEPrim so | 1396 | // Called ODEPrim so |
1475 | // it's already in locked space. | 1397 | // it's already in locked space. |
1476 | 1398 | ||
1477 | if (geom == IntPtr.Zero) // shouldn't happen | 1399 | if (geom == IntPtr.Zero) // shouldn't happen |
1478 | return IntPtr.Zero; | 1400 | return IntPtr.Zero; |
1479 | 1401 | ||
1480 | // get the static sub-space for current position | 1402 | if (StaticSpace == currentspace) // if we are there all done |
1481 | IntPtr newspace = calculateSpaceForGeom(pos); | 1403 | return StaticSpace; |
1482 | |||
1483 | if (newspace == currentspace) // if we are there all done | ||
1484 | return newspace; | ||
1485 | 1404 | ||
1486 | // else remove it from its current space | 1405 | // else remove it from its current space |
1487 | if (currentspace != IntPtr.Zero && d.SpaceQuery(currentspace, geom)) | 1406 | if (currentspace != IntPtr.Zero && d.SpaceQuery(currentspace, geom)) |
@@ -1516,44 +1435,17 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1516 | { | 1435 | { |
1517 | d.SpaceDestroy(currentspace); | 1436 | d.SpaceDestroy(currentspace); |
1518 | } | 1437 | } |
1519 | |||
1520 | } | 1438 | } |
1521 | } | 1439 | } |
1522 | } | 1440 | } |
1523 | 1441 | ||
1524 | // put the geom in the newspace | 1442 | // put the geom in the newspace |
1525 | waitForSpaceUnlock(newspace); | 1443 | waitForSpaceUnlock(StaticSpace); |
1526 | d.SpaceAdd(newspace, geom); | 1444 | d.SpaceAdd(StaticSpace, geom); |
1527 | 1445 | ||
1528 | // let caller know this newspace | 1446 | return StaticSpace; |
1529 | return newspace; | ||
1530 | } | 1447 | } |
1531 | 1448 | ||
1532 | /// <summary> | ||
1533 | /// Calculates the space the prim should be in by its position | ||
1534 | /// </summary> | ||
1535 | /// <param name="pos"></param> | ||
1536 | /// <returns>a pointer to the space. This could be a new space or reused space.</returns> | ||
1537 | public IntPtr calculateSpaceForGeom(Vector3 pos) | ||
1538 | { | ||
1539 | int x, y; | ||
1540 | |||
1541 | if (pos.X < 0) | ||
1542 | return staticPrimspaceOffRegion[0]; | ||
1543 | |||
1544 | if (pos.Y < 0) | ||
1545 | return staticPrimspaceOffRegion[2]; | ||
1546 | |||
1547 | x = (int)(pos.X * spacesPerMeterX); | ||
1548 | if (x > spaceGridMaxX) | ||
1549 | return staticPrimspaceOffRegion[1]; | ||
1550 | |||
1551 | y = (int)(pos.Y * spacesPerMeterY); | ||
1552 | if (y > spaceGridMaxY) | ||
1553 | return staticPrimspaceOffRegion[3]; | ||
1554 | |||
1555 | return staticPrimspace[x, y]; | ||
1556 | } | ||
1557 | 1449 | ||
1558 | #endregion | 1450 | #endregion |
1559 | 1451 | ||
@@ -1642,6 +1534,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1642 | /// <returns></returns> | 1534 | /// <returns></returns> |
1643 | public override float Simulate(float reqTimeStep) | 1535 | public override float Simulate(float reqTimeStep) |
1644 | { | 1536 | { |
1537 | if (world == IntPtr.Zero) | ||
1538 | return 0; | ||
1539 | |||
1645 | double now = Util.GetTimeStamp(); | 1540 | double now = Util.GetTimeStamp(); |
1646 | double timeStep = now - m_lastframe; | 1541 | double timeStep = now - m_lastframe; |
1647 | m_lastframe = now; | 1542 | m_lastframe = now; |
@@ -1680,9 +1575,15 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1680 | double maxChangestime = (int)(reqTimeStep * 500f); // half the time | 1575 | double maxChangestime = (int)(reqTimeStep * 500f); // half the time |
1681 | double maxLoopTime = (int)(reqTimeStep * 1200f); // 1.2 the time | 1576 | double maxLoopTime = (int)(reqTimeStep * 1200f); // 1.2 the time |
1682 | 1577 | ||
1683 | // double collisionTime = 0; | 1578 | |
1684 | // double qstepTIme = 0; | 1579 | double collisionTime = 0; |
1685 | // double tmpTime = 0; | 1580 | double qstepTIme = 0; |
1581 | double tmpTime = 0; | ||
1582 | double changestot = 0; | ||
1583 | double collisonRepo = 0; | ||
1584 | double updatesTime = 0; | ||
1585 | double moveTime = 0; | ||
1586 | double rayTime = 0; | ||
1686 | 1587 | ||
1687 | d.AllocateODEDataForThread(~0U); | 1588 | d.AllocateODEDataForThread(~0U); |
1688 | 1589 | ||
@@ -1720,6 +1621,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1720 | m_global_contactcount = 0; | 1621 | m_global_contactcount = 0; |
1721 | 1622 | ||
1722 | 1623 | ||
1624 | tmpTime = Util.GetTimeStampMS(); | ||
1625 | |||
1723 | // Move characters | 1626 | // Move characters |
1724 | lock (_characters) | 1627 | lock (_characters) |
1725 | { | 1628 | { |
@@ -1747,13 +1650,17 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1747 | aprim.Move(); | 1650 | aprim.Move(); |
1748 | } | 1651 | } |
1749 | } | 1652 | } |
1653 | moveTime += Util.GetTimeStampMS() - tmpTime; | ||
1750 | 1654 | ||
1655 | tmpTime = Util.GetTimeStampMS(); | ||
1751 | m_rayCastManager.ProcessQueuedRequests(); | 1656 | m_rayCastManager.ProcessQueuedRequests(); |
1657 | rayTime += Util.GetTimeStampMS() - tmpTime; | ||
1752 | 1658 | ||
1753 | // tmpTime = Util.GetTimeStampMS(); | 1659 | tmpTime = Util.GetTimeStampMS(); |
1754 | collision_optimized(); | 1660 | collision_optimized(); |
1755 | // collisionTime += Util.GetTimeStampMS() - tmpTime; | 1661 | collisionTime += Util.GetTimeStampMS() - tmpTime; |
1756 | 1662 | ||
1663 | tmpTime = Util.GetTimeStampMS(); | ||
1757 | lock(_collisionEventPrimRemove) | 1664 | lock(_collisionEventPrimRemove) |
1758 | { | 1665 | { |
1759 | foreach (PhysicsActor obj in _collisionEventPrimRemove) | 1666 | foreach (PhysicsActor obj in _collisionEventPrimRemove) |
@@ -1792,12 +1699,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1792 | foreach(OdePrim prm in sleepers) | 1699 | foreach(OdePrim prm in sleepers) |
1793 | prm.SleeperAddCollisionEvents(); | 1700 | prm.SleeperAddCollisionEvents(); |
1794 | sleepers.Clear(); | 1701 | sleepers.Clear(); |
1702 | collisonRepo += Util.GetTimeStampMS() - tmpTime; | ||
1703 | |||
1795 | 1704 | ||
1796 | // do a ode simulation step | 1705 | // do a ode simulation step |
1797 | // tmpTime = Util.GetTimeStampMS(); | 1706 | tmpTime = Util.GetTimeStampMS(); |
1798 | d.WorldQuickStep(world, ODE_STEPSIZE); | 1707 | d.WorldQuickStep(world, ODE_STEPSIZE); |
1799 | d.JointGroupEmpty(contactgroup); | 1708 | d.JointGroupEmpty(contactgroup); |
1800 | // qstepTIme += Util.GetTimeStampMS() - tmpTime; | 1709 | qstepTIme += Util.GetTimeStampMS() - tmpTime; |
1801 | 1710 | ||
1802 | // update managed ideia of physical data and do updates to core | 1711 | // update managed ideia of physical data and do updates to core |
1803 | /* | 1712 | /* |
@@ -1815,7 +1724,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1815 | } | 1724 | } |
1816 | } | 1725 | } |
1817 | */ | 1726 | */ |
1818 | 1727 | // tmpTime = Util.GetTimeStampMS(); | |
1819 | lock (_activegroups) | 1728 | lock (_activegroups) |
1820 | { | 1729 | { |
1821 | { | 1730 | { |
@@ -1828,6 +1737,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1828 | } | 1737 | } |
1829 | } | 1738 | } |
1830 | } | 1739 | } |
1740 | // updatesTime += Util.GetTimeStampMS() - tmpTime; | ||
1831 | } | 1741 | } |
1832 | catch (Exception e) | 1742 | catch (Exception e) |
1833 | { | 1743 | { |
@@ -1835,10 +1745,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1835 | // ode.dunlock(world); | 1745 | // ode.dunlock(world); |
1836 | } | 1746 | } |
1837 | 1747 | ||
1748 | |||
1838 | step_time -= ODE_STEPSIZE; | 1749 | step_time -= ODE_STEPSIZE; |
1839 | nodeframes++; | 1750 | nodeframes++; |
1840 | 1751 | ||
1841 | looptimeMS = Util.GetTimeStampMS() - loopstartMS; | 1752 | looptimeMS = Util.GetTimeStampMS() - loopstartMS; |
1753 | |||
1842 | if (looptimeMS > maxLoopTime) | 1754 | if (looptimeMS > maxLoopTime) |
1843 | break; | 1755 | break; |
1844 | } | 1756 | } |
@@ -1855,9 +1767,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1855 | _badCharacter.Clear(); | 1767 | _badCharacter.Clear(); |
1856 | } | 1768 | } |
1857 | } | 1769 | } |
1858 | |||
1859 | // information block for in debug breakpoint only | ||
1860 | /* | 1770 | /* |
1771 | // information block for in debug breakpoint only | ||
1772 | |||
1861 | int ntopactivegeoms = d.SpaceGetNumGeoms(ActiveSpace); | 1773 | int ntopactivegeoms = d.SpaceGetNumGeoms(ActiveSpace); |
1862 | int ntopstaticgeoms = d.SpaceGetNumGeoms(StaticSpace); | 1774 | int ntopstaticgeoms = d.SpaceGetNumGeoms(StaticSpace); |
1863 | int ngroundgeoms = d.SpaceGetNumGeoms(GroundSpace); | 1775 | int ngroundgeoms = d.SpaceGetNumGeoms(GroundSpace); |
@@ -1899,14 +1811,23 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1899 | int nbodies = d.NTotalBodies; | 1811 | int nbodies = d.NTotalBodies; |
1900 | int ngeoms = d.NTotalGeoms; | 1812 | int ngeoms = d.NTotalGeoms; |
1901 | */ | 1813 | */ |
1902 | /* | 1814 | |
1815 | |||
1903 | looptimeMS /= nodeframes; | 1816 | looptimeMS /= nodeframes; |
1904 | if(looptimeMS > 0.080) | 1817 | collisionTime /= nodeframes; |
1818 | qstepTIme /= nodeframes; | ||
1819 | changestot /= nodeframes; | ||
1820 | collisonRepo /= nodeframes; | ||
1821 | updatesTime /= nodeframes; | ||
1822 | moveTime /= nodeframes; | ||
1823 | rayTime /= nodeframes; | ||
1824 | |||
1825 | if(looptimeMS > .05) | ||
1905 | { | 1826 | { |
1906 | collisionTime /= nodeframes; | 1827 | |
1907 | qstepTIme /= nodeframes; | 1828 | |
1908 | } | 1829 | } |
1909 | */ | 1830 | /* |
1910 | // Finished with all sim stepping. If requested, dump world state to file for debugging. | 1831 | // Finished with all sim stepping. If requested, dump world state to file for debugging. |
1911 | // TODO: This call to the export function is already inside lock (OdeLock) - but is an extra lock needed? | 1832 | // TODO: This call to the export function is already inside lock (OdeLock) - but is an extra lock needed? |
1912 | // TODO: This overwrites all dump files in-place. Should this be a growing logfile, or separate snapshots? | 1833 | // TODO: This overwrites all dump files in-place. Should this be a growing logfile, or separate snapshots? |
@@ -1925,7 +1846,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1925 | 1846 | ||
1926 | d.WorldExportDIF(world, fname, physics_logging_append_existing_logfile, prefix); | 1847 | d.WorldExportDIF(world, fname, physics_logging_append_existing_logfile, prefix); |
1927 | } | 1848 | } |
1928 | 1849 | */ | |
1929 | fps = (float)nodeframes * ODE_STEPSIZE / reqTimeStep; | 1850 | fps = (float)nodeframes * ODE_STEPSIZE / reqTimeStep; |
1930 | 1851 | ||
1931 | if(step_time < HalfOdeStep) | 1852 | if(step_time < HalfOdeStep) |