aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs65
1 files changed, 38 insertions, 27 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index bac45eb..9d5b6e7 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -75,6 +75,7 @@ namespace OpenSim.Region.Physics.OdePlugin
75 { 75 {
76 private static float ODE_STEPSIZE = 0.004f; 76 private static float ODE_STEPSIZE = 0.004f;
77 private static bool RENDER_FLAG = false; 77 private static bool RENDER_FLAG = false;
78 private static float metersInSpace = 29.9f;
78 private IntPtr contactgroup; 79 private IntPtr contactgroup;
79 private IntPtr LandGeom = (IntPtr) 0; 80 private IntPtr LandGeom = (IntPtr) 0;
80 private double[] _heightmap; 81 private double[] _heightmap;
@@ -99,8 +100,8 @@ namespace OpenSim.Region.Physics.OdePlugin
99 public IntPtr world; 100 public IntPtr world;
100 101
101 public IntPtr space; 102 public IntPtr space;
102 // split static geometry collision handling into spaces of 64 meters 103 // split static geometry collision handling into spaces of 30 meters
103 public IntPtr[] staticPrimspace = new IntPtr[74]; 104 public IntPtr[,] staticPrimspace = new IntPtr[(int)(257/metersInSpace),(int)(257/metersInSpace)];
104 105
105 public static Object OdeLock = new Object(); 106 public static Object OdeLock = new Object();
106 107
@@ -153,9 +154,12 @@ namespace OpenSim.Region.Physics.OdePlugin
153 154
154 _heightmap = new double[258*258]; 155 _heightmap = new double[258*258];
155 156
156 for (int i = 0; i < staticPrimspace.Length; i++) 157 for (int i = 0; i < staticPrimspace.GetLength(0); i++)
157 { 158 {
158 staticPrimspace[i] = IntPtr.Zero; 159 for (int j = 0; j < staticPrimspace.GetLength(1); j++)
160 {
161 staticPrimspace[i,j] = IntPtr.Zero;
162 }
159 } 163 }
160 164
161 } 165 }
@@ -437,7 +441,8 @@ namespace OpenSim.Region.Physics.OdePlugin
437 d.SpaceRemove(space, ((OdePrim)prim).m_targetSpace); 441 d.SpaceRemove(space, ((OdePrim)prim).m_targetSpace);
438 // free up memory used by the space. 442 // free up memory used by the space.
439 d.SpaceDestroy(((OdePrim)prim).m_targetSpace); 443 d.SpaceDestroy(((OdePrim)prim).m_targetSpace);
440 resetSpaceArrayItemToZero(calculateSpaceArrayItemFromPos(((OdePrim)prim).Position)); 444 int[] xyspace = calculateSpaceArrayItemFromPos(((OdePrim)prim).Position);
445 resetSpaceArrayItemToZero(xyspace[0],xyspace[1]);
441 } 446 }
442 else 447 else
443 { 448 {
@@ -456,15 +461,18 @@ namespace OpenSim.Region.Physics.OdePlugin
456 } 461 }
457 public void resetSpaceArrayItemToZero(IntPtr space) 462 public void resetSpaceArrayItemToZero(IntPtr space)
458 { 463 {
459 for (int i = 0; i < staticPrimspace.Length; i++) 464 for (int x = 0; x < staticPrimspace.GetLength(0); x++)
460 { 465 {
461 if (staticPrimspace[i] == space) 466 for (int y = 0; y < staticPrimspace.GetLength(1); y++)
462 staticPrimspace[i] = IntPtr.Zero; 467 {
468 if (staticPrimspace[x, y] == space)
469 staticPrimspace[x, y] = IntPtr.Zero;
470 }
463 } 471 }
464 } 472 }
465 public void resetSpaceArrayItemToZero(int arrayitem) 473 public void resetSpaceArrayItemToZero(int arrayitemX,int arrayitemY)
466 { 474 {
467 staticPrimspace[arrayitem] = IntPtr.Zero; 475 staticPrimspace[arrayitemX, arrayitemY] = IntPtr.Zero;
468 } 476 }
469 477
470 public IntPtr recalculateSpaceForGeom(IntPtr geom, PhysicsVector pos, IntPtr currentspace) 478 public IntPtr recalculateSpaceForGeom(IntPtr geom, PhysicsVector pos, IntPtr currentspace)
@@ -569,34 +577,37 @@ namespace OpenSim.Region.Physics.OdePlugin
569 // The routines in the Position and Size sections do the 'inserting' into the space, 577 // The routines in the Position and Size sections do the 'inserting' into the space,
570 // so all we have to do is make sure that the space that we're putting the prim into 578 // so all we have to do is make sure that the space that we're putting the prim into
571 // is in the 'main' space. 579 // is in the 'main' space.
572 int iprimspaceArrItem = calculateSpaceArrayItemFromPos(pos); 580 int[] iprimspaceArrItem = calculateSpaceArrayItemFromPos(pos);
573 IntPtr newspace = calculateSpaceForGeom(pos); 581 IntPtr newspace = calculateSpaceForGeom(pos);
574 582
575 if (newspace == IntPtr.Zero) 583 if (newspace == IntPtr.Zero)
576 { 584 {
577 newspace = createprimspace(iprimspaceArrItem); 585 newspace = createprimspace(iprimspaceArrItem[0],iprimspaceArrItem[1]);
578 d.HashSpaceSetLevels(newspace, -4, 66); 586 d.HashSpaceSetLevels(newspace, -4, 66);
579 } 587 }
580 588
581 return newspace; 589 return newspace;
582 } 590 }
583 591
584 public IntPtr createprimspace(int iprimspaceArrItem) { 592 public IntPtr createprimspace(int iprimspaceArrItemX, int iprimspaceArrItemY) {
585 // creating a new space for prim and inserting it into main space. 593 // creating a new space for prim and inserting it into main space.
586 staticPrimspace[iprimspaceArrItem] = d.HashSpaceCreate(IntPtr.Zero); 594 staticPrimspace[iprimspaceArrItemX, iprimspaceArrItemY] = d.HashSpaceCreate(IntPtr.Zero);
587 d.SpaceAdd(space, staticPrimspace[iprimspaceArrItem]); 595 d.SpaceAdd(space, staticPrimspace[iprimspaceArrItemX,iprimspaceArrItemY]);
588 return staticPrimspace[iprimspaceArrItem]; 596 return staticPrimspace[iprimspaceArrItemX, iprimspaceArrItemY];
589 } 597 }
590 598
591 public IntPtr calculateSpaceForGeom(PhysicsVector pos) 599 public IntPtr calculateSpaceForGeom(PhysicsVector pos)
592 { 600 {
593 IntPtr locationbasedspace = staticPrimspace[calculateSpaceArrayItemFromPos(pos)]; 601 int[] xyspace = calculateSpaceArrayItemFromPos(pos);
602 IntPtr locationbasedspace = staticPrimspace[xyspace[0],xyspace[1]];
594 //locationbasedspace = space; 603 //locationbasedspace = space;
595 return locationbasedspace; 604 return locationbasedspace;
596 } 605 }
597 public int calculateSpaceArrayItemFromPos(PhysicsVector pos) 606 public int[] calculateSpaceArrayItemFromPos(PhysicsVector pos)
598 { 607 {
599 int returnint = ((int)((pos.X + pos.Y)/8.6f)); 608 int[] returnint = new int[2];
609 returnint[0] = (int)(pos.X / metersInSpace);
610 returnint[1] = (int)(pos.Y / metersInSpace);
600 return returnint; 611 return returnint;
601 } 612 }
602 613
@@ -619,11 +630,11 @@ namespace OpenSim.Region.Physics.OdePlugin
619 rot.z = rotation.z; 630 rot.z = rotation.z;
620 631
621 632
622 int iprimspaceArrItem = calculateSpaceArrayItemFromPos(pos); 633 int[] iprimspaceArrItem = calculateSpaceArrayItemFromPos(pos);
623 IntPtr targetspace = calculateSpaceForGeom(pos); 634 IntPtr targetspace = calculateSpaceForGeom(pos);
624 635
625 if (targetspace == IntPtr.Zero) 636 if (targetspace == IntPtr.Zero)
626 targetspace = createprimspace(iprimspaceArrItem); 637 targetspace = createprimspace(iprimspaceArrItem[0],iprimspaceArrItem[1]);
627 638
628 OdePrim newPrim; 639 OdePrim newPrim;
629 lock (OdeLock) 640 lock (OdeLock)
@@ -1326,14 +1337,14 @@ namespace OpenSim.Region.Physics.OdePlugin
1326 m_lastUpdateSent = true; 1337 m_lastUpdateSent = true;
1327 base.RequestPhysicsterseUpdate(); 1338 base.RequestPhysicsterseUpdate();
1328 string primScenAvatarIn = _parent_scene.whichspaceamIin(_position); 1339 string primScenAvatarIn = _parent_scene.whichspaceamIin(_position);
1329 int arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position); 1340 int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position);
1330 if (primScenAvatarIn == "0") 1341 if (primScenAvatarIn == "0")
1331 { 1342 {
1332 OpenSim.Framework.Console.MainLog.Instance.Verbose("Physics", "Avatar " + m_name + " in space with no prim. Arr:':" + arrayitem.ToString()); 1343 OpenSim.Framework.Console.MainLog.Instance.Verbose("Physics", "Avatar " + m_name + " in space with no prim. Arr:':" + arrayitem[0].ToString() + "," + arrayitem[1].ToString());
1333 } 1344 }
1334 else 1345 else
1335 { 1346 {
1336 OpenSim.Framework.Console.MainLog.Instance.Verbose("Physics", "Avatar " + m_name + " in Prim space':" + primScenAvatarIn + ". Arr:" + arrayitem.ToString()); 1347 OpenSim.Framework.Console.MainLog.Instance.Verbose("Physics", "Avatar " + m_name + " in Prim space':" + primScenAvatarIn + ". Arr:" + arrayitem[0].ToString() + "," + arrayitem[1].ToString());
1337 } 1348 }
1338 1349
1339 } 1350 }
@@ -1628,14 +1639,14 @@ namespace OpenSim.Region.Physics.OdePlugin
1628 else 1639 else
1629 { 1640 {
1630 string primScenAvatarIn = _parent_scene.whichspaceamIin(_position); 1641 string primScenAvatarIn = _parent_scene.whichspaceamIin(_position);
1631 int arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position); 1642 int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position);
1632 if (primScenAvatarIn == "0") 1643 if (primScenAvatarIn == "0")
1633 { 1644 {
1634 OpenSim.Framework.Console.MainLog.Instance.Verbose("Physics", "Prim " + m_primName + " in space with no prim: " + primScenAvatarIn + ". Expected to be at: " + m_targetSpace.ToString() + " . Arr:': " + arrayitem.ToString()); 1645 OpenSim.Framework.Console.MainLog.Instance.Verbose("Physics", "Prim " + m_primName + " in space with no prim: " + primScenAvatarIn + ". Expected to be at: " + m_targetSpace.ToString() + " . Arr:': " + arrayitem[0].ToString() + "," + arrayitem[1].ToString());
1635 } 1646 }
1636 else 1647 else
1637 { 1648 {
1638 OpenSim.Framework.Console.MainLog.Instance.Verbose("Physics", "Prim " + m_primName + " in Prim space with prim: " + primScenAvatarIn + ". Expected to be at: " + m_targetSpace.ToString() + ". Arr:" + arrayitem.ToString()); 1649 OpenSim.Framework.Console.MainLog.Instance.Verbose("Physics", "Prim " + m_primName + " in Prim space with prim: " + primScenAvatarIn + ". Expected to be at: " + m_targetSpace.ToString() + ". Arr:" + arrayitem[0].ToString() + "," + arrayitem[1].ToString());
1639 } 1650 }
1640 m_targetSpace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace); 1651 m_targetSpace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace);
1641 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); 1652 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);