* Split space array structure into a two dimentional array instead of a single one. Once again. Should help debugging space/copy issues.

afrisby
Teravus Ovares 2007-11-19 04:15:18 +00:00
parent 72525d3015
commit aaab1448f7
1 changed files with 38 additions and 27 deletions

View File

@ -75,6 +75,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
private static float ODE_STEPSIZE = 0.004f; private static float ODE_STEPSIZE = 0.004f;
private static bool RENDER_FLAG = false; private static bool RENDER_FLAG = false;
private static float metersInSpace = 29.9f;
private IntPtr contactgroup; private IntPtr contactgroup;
private IntPtr LandGeom = (IntPtr) 0; private IntPtr LandGeom = (IntPtr) 0;
private double[] _heightmap; private double[] _heightmap;
@ -99,8 +100,8 @@ namespace OpenSim.Region.Physics.OdePlugin
public IntPtr world; public IntPtr world;
public IntPtr space; public IntPtr space;
// split static geometry collision handling into spaces of 64 meters // split static geometry collision handling into spaces of 30 meters
public IntPtr[] staticPrimspace = new IntPtr[74]; public IntPtr[,] staticPrimspace = new IntPtr[(int)(257/metersInSpace),(int)(257/metersInSpace)];
public static Object OdeLock = new Object(); public static Object OdeLock = new Object();
@ -153,9 +154,12 @@ namespace OpenSim.Region.Physics.OdePlugin
_heightmap = new double[258*258]; _heightmap = new double[258*258];
for (int i = 0; i < staticPrimspace.Length; i++) for (int i = 0; i < staticPrimspace.GetLength(0); i++)
{ {
staticPrimspace[i] = IntPtr.Zero; for (int j = 0; j < staticPrimspace.GetLength(1); j++)
{
staticPrimspace[i,j] = IntPtr.Zero;
}
} }
} }
@ -437,7 +441,8 @@ namespace OpenSim.Region.Physics.OdePlugin
d.SpaceRemove(space, ((OdePrim)prim).m_targetSpace); d.SpaceRemove(space, ((OdePrim)prim).m_targetSpace);
// free up memory used by the space. // free up memory used by the space.
d.SpaceDestroy(((OdePrim)prim).m_targetSpace); d.SpaceDestroy(((OdePrim)prim).m_targetSpace);
resetSpaceArrayItemToZero(calculateSpaceArrayItemFromPos(((OdePrim)prim).Position)); int[] xyspace = calculateSpaceArrayItemFromPos(((OdePrim)prim).Position);
resetSpaceArrayItemToZero(xyspace[0],xyspace[1]);
} }
else else
{ {
@ -456,15 +461,18 @@ namespace OpenSim.Region.Physics.OdePlugin
} }
public void resetSpaceArrayItemToZero(IntPtr space) public void resetSpaceArrayItemToZero(IntPtr space)
{ {
for (int i = 0; i < staticPrimspace.Length; i++) for (int x = 0; x < staticPrimspace.GetLength(0); x++)
{ {
if (staticPrimspace[i] == space) for (int y = 0; y < staticPrimspace.GetLength(1); y++)
staticPrimspace[i] = IntPtr.Zero; {
if (staticPrimspace[x, y] == space)
staticPrimspace[x, y] = IntPtr.Zero;
}
} }
} }
public void resetSpaceArrayItemToZero(int arrayitem) public void resetSpaceArrayItemToZero(int arrayitemX,int arrayitemY)
{ {
staticPrimspace[arrayitem] = IntPtr.Zero; staticPrimspace[arrayitemX, arrayitemY] = IntPtr.Zero;
} }
public IntPtr recalculateSpaceForGeom(IntPtr geom, PhysicsVector pos, IntPtr currentspace) public IntPtr recalculateSpaceForGeom(IntPtr geom, PhysicsVector pos, IntPtr currentspace)
@ -569,34 +577,37 @@ namespace OpenSim.Region.Physics.OdePlugin
// The routines in the Position and Size sections do the 'inserting' into the space, // The routines in the Position and Size sections do the 'inserting' into the space,
// so all we have to do is make sure that the space that we're putting the prim into // so all we have to do is make sure that the space that we're putting the prim into
// is in the 'main' space. // is in the 'main' space.
int iprimspaceArrItem = calculateSpaceArrayItemFromPos(pos); int[] iprimspaceArrItem = calculateSpaceArrayItemFromPos(pos);
IntPtr newspace = calculateSpaceForGeom(pos); IntPtr newspace = calculateSpaceForGeom(pos);
if (newspace == IntPtr.Zero) if (newspace == IntPtr.Zero)
{ {
newspace = createprimspace(iprimspaceArrItem); newspace = createprimspace(iprimspaceArrItem[0],iprimspaceArrItem[1]);
d.HashSpaceSetLevels(newspace, -4, 66); d.HashSpaceSetLevels(newspace, -4, 66);
} }
return newspace; return newspace;
} }
public IntPtr createprimspace(int iprimspaceArrItem) { public IntPtr createprimspace(int iprimspaceArrItemX, int iprimspaceArrItemY) {
// creating a new space for prim and inserting it into main space. // creating a new space for prim and inserting it into main space.
staticPrimspace[iprimspaceArrItem] = d.HashSpaceCreate(IntPtr.Zero); staticPrimspace[iprimspaceArrItemX, iprimspaceArrItemY] = d.HashSpaceCreate(IntPtr.Zero);
d.SpaceAdd(space, staticPrimspace[iprimspaceArrItem]); d.SpaceAdd(space, staticPrimspace[iprimspaceArrItemX,iprimspaceArrItemY]);
return staticPrimspace[iprimspaceArrItem]; return staticPrimspace[iprimspaceArrItemX, iprimspaceArrItemY];
} }
public IntPtr calculateSpaceForGeom(PhysicsVector pos) public IntPtr calculateSpaceForGeom(PhysicsVector pos)
{ {
IntPtr locationbasedspace = staticPrimspace[calculateSpaceArrayItemFromPos(pos)]; int[] xyspace = calculateSpaceArrayItemFromPos(pos);
IntPtr locationbasedspace = staticPrimspace[xyspace[0],xyspace[1]];
//locationbasedspace = space; //locationbasedspace = space;
return locationbasedspace; return locationbasedspace;
} }
public int calculateSpaceArrayItemFromPos(PhysicsVector pos) public int[] calculateSpaceArrayItemFromPos(PhysicsVector pos)
{ {
int returnint = ((int)((pos.X + pos.Y)/8.6f)); int[] returnint = new int[2];
returnint[0] = (int)(pos.X / metersInSpace);
returnint[1] = (int)(pos.Y / metersInSpace);
return returnint; return returnint;
} }
@ -619,11 +630,11 @@ namespace OpenSim.Region.Physics.OdePlugin
rot.z = rotation.z; rot.z = rotation.z;
int iprimspaceArrItem = calculateSpaceArrayItemFromPos(pos); int[] iprimspaceArrItem = calculateSpaceArrayItemFromPos(pos);
IntPtr targetspace = calculateSpaceForGeom(pos); IntPtr targetspace = calculateSpaceForGeom(pos);
if (targetspace == IntPtr.Zero) if (targetspace == IntPtr.Zero)
targetspace = createprimspace(iprimspaceArrItem); targetspace = createprimspace(iprimspaceArrItem[0],iprimspaceArrItem[1]);
OdePrim newPrim; OdePrim newPrim;
lock (OdeLock) lock (OdeLock)
@ -1326,14 +1337,14 @@ namespace OpenSim.Region.Physics.OdePlugin
m_lastUpdateSent = true; m_lastUpdateSent = true;
base.RequestPhysicsterseUpdate(); base.RequestPhysicsterseUpdate();
string primScenAvatarIn = _parent_scene.whichspaceamIin(_position); string primScenAvatarIn = _parent_scene.whichspaceamIin(_position);
int arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position); int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position);
if (primScenAvatarIn == "0") if (primScenAvatarIn == "0")
{ {
OpenSim.Framework.Console.MainLog.Instance.Verbose("Physics", "Avatar " + m_name + " in space with no prim. Arr:':" + arrayitem.ToString()); OpenSim.Framework.Console.MainLog.Instance.Verbose("Physics", "Avatar " + m_name + " in space with no prim. Arr:':" + arrayitem[0].ToString() + "," + arrayitem[1].ToString());
} }
else else
{ {
OpenSim.Framework.Console.MainLog.Instance.Verbose("Physics", "Avatar " + m_name + " in Prim space':" + primScenAvatarIn + ". Arr:" + arrayitem.ToString()); OpenSim.Framework.Console.MainLog.Instance.Verbose("Physics", "Avatar " + m_name + " in Prim space':" + primScenAvatarIn + ". Arr:" + arrayitem[0].ToString() + "," + arrayitem[1].ToString());
} }
} }
@ -1628,14 +1639,14 @@ namespace OpenSim.Region.Physics.OdePlugin
else else
{ {
string primScenAvatarIn = _parent_scene.whichspaceamIin(_position); string primScenAvatarIn = _parent_scene.whichspaceamIin(_position);
int arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position); int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position);
if (primScenAvatarIn == "0") if (primScenAvatarIn == "0")
{ {
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()); 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());
} }
else else
{ {
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()); 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());
} }
m_targetSpace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace); m_targetSpace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace);
d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);