aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/OdePlugin
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs88
1 files changed, 43 insertions, 45 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 0cbd4d6..305a930 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -75,6 +75,10 @@ namespace OpenSim.Region.Physics.OdePlugin
75 75
76 public class OdeScene : PhysicsScene 76 public class OdeScene : PhysicsScene
77 { 77 {
78 // TODO: this should be hard-coded in some common place
79 private const uint m_regionWidth = 256;
80 private const uint m_regionHeight = 256;
81
78 private static float ODE_STEPSIZE = 0.004f; 82 private static float ODE_STEPSIZE = 0.004f;
79 private static bool RENDER_FLAG = false; 83 private static bool RENDER_FLAG = false;
80 private static float metersInSpace = 29.9f; 84 private static float metersInSpace = 29.9f;
@@ -167,12 +171,9 @@ namespace OpenSim.Region.Physics.OdePlugin
167 171
168 } 172 }
169 173
170
171
172 public override void Initialise(IMesher meshmerizer) 174 public override void Initialise(IMesher meshmerizer)
173 { 175 {
174 mesher = meshmerizer; 176 mesher = meshmerizer;
175
176 } 177 }
177 178
178 public string whichspaceamIin(PhysicsVector pos) 179 public string whichspaceamIin(PhysicsVector pos)
@@ -196,7 +197,6 @@ namespace OpenSim.Region.Physics.OdePlugin
196 //Collide all geoms in each space.. 197 //Collide all geoms in each space..
197 //if (d.GeomIsSpace(g1)) d.SpaceCollide(g1, IntPtr.Zero, nearCallback); 198 //if (d.GeomIsSpace(g1)) d.SpaceCollide(g1, IntPtr.Zero, nearCallback);
198 //if (d.GeomIsSpace(g2)) d.SpaceCollide(g2, IntPtr.Zero, nearCallback); 199 //if (d.GeomIsSpace(g2)) d.SpaceCollide(g2, IntPtr.Zero, nearCallback);
199
200 } 200 }
201 else 201 else
202 { 202 {
@@ -206,14 +206,12 @@ namespace OpenSim.Region.Physics.OdePlugin
206 IntPtr b1 = d.GeomGetBody(g1); 206 IntPtr b1 = d.GeomGetBody(g1);
207 IntPtr b2 = d.GeomGetBody(g2); 207 IntPtr b2 = d.GeomGetBody(g2);
208 208
209
210 if (g1 == g2) 209 if (g1 == g2)
211 return; // Can't collide with yourself 210 return; // Can't collide with yourself
212 211
213 if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) 212 if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact))
214 return; 213 return;
215 214
216
217 d.GeomClassID id = d.GeomGetClass(g1); 215 d.GeomClassID id = d.GeomGetClass(g1);
218 216
219 String name1 = null; 217 String name1 = null;
@@ -230,8 +228,6 @@ namespace OpenSim.Region.Physics.OdePlugin
230 228
231 if (id == d.GeomClassID.TriMeshClass) 229 if (id == d.GeomClassID.TriMeshClass)
232 { 230 {
233
234
235 // MainLog.Instance.Verbose("near: A collision was detected between {1} and {2}", 0, name1, name2); 231 // MainLog.Instance.Verbose("near: A collision was detected between {1} and {2}", 0, name1, name2);
236 //System.Console.WriteLine("near: A collision was detected between {1} and {2}", 0, name1, name2); 232 //System.Console.WriteLine("near: A collision was detected between {1} and {2}", 0, name1, name2);
237 } 233 }
@@ -297,8 +293,6 @@ namespace OpenSim.Region.Physics.OdePlugin
297 TerrainContact.geom = contacts[i]; 293 TerrainContact.geom = contacts[i];
298 joint = d.JointCreateContact(world, contactgroup, ref TerrainContact); 294 joint = d.JointCreateContact(world, contactgroup, ref TerrainContact);
299 } 295 }
300
301
302 } 296 }
303 else 297 else
304 { 298 {
@@ -311,9 +305,7 @@ namespace OpenSim.Region.Physics.OdePlugin
311 { 305 {
312 contact.geom = contacts[i]; 306 contact.geom = contacts[i];
313 joint = d.JointCreateContact(world, contactgroup, ref contact); 307 joint = d.JointCreateContact(world, contactgroup, ref contact);
314
315 } 308 }
316
317 } 309 }
318 310
319 311
@@ -333,17 +325,12 @@ namespace OpenSim.Region.Physics.OdePlugin
333 325
334 private void collision_optimized(float timeStep) 326 private void collision_optimized(float timeStep)
335 { 327 {
336
337 foreach (OdeCharacter chr in _characters) 328 foreach (OdeCharacter chr in _characters)
338 { 329 {
339
340
341 chr.IsColliding = false; 330 chr.IsColliding = false;
342 chr.CollidingGround = false; 331 chr.CollidingGround = false;
343 chr.CollidingObj = false; 332 chr.CollidingObj = false;
344 d.SpaceCollide2(space, chr.Shell, IntPtr.Zero, nearCallback); 333 d.SpaceCollide2(space, chr.Shell, IntPtr.Zero, nearCallback);
345
346
347 } 334 }
348 // If the sim is running slow this frame, 335 // If the sim is running slow this frame,
349 // don't process collision for prim! 336 // don't process collision for prim!
@@ -422,11 +409,11 @@ namespace OpenSim.Region.Physics.OdePlugin
422 } 409 }
423 } 410 }
424 } 411 }
412
425 public void RemovePrimThreadLocked(OdePrim prim) 413 public void RemovePrimThreadLocked(OdePrim prim)
426 { 414 {
427 lock (OdeLock) 415 lock (OdeLock)
428 { 416 {
429
430 if (prim.IsPhysical) 417 if (prim.IsPhysical)
431 { 418 {
432 prim.disableBody(); 419 prim.disableBody();
@@ -479,6 +466,7 @@ namespace OpenSim.Region.Physics.OdePlugin
479 } 466 }
480 467
481 } 468 }
469
482 public void resetSpaceArrayItemToZero(IntPtr space) 470 public void resetSpaceArrayItemToZero(IntPtr space)
483 { 471 {
484 for (int x = 0; x < staticPrimspace.GetLength(0); x++) 472 for (int x = 0; x < staticPrimspace.GetLength(0); x++)
@@ -490,6 +478,7 @@ namespace OpenSim.Region.Physics.OdePlugin
490 } 478 }
491 } 479 }
492 } 480 }
481
493 public void resetSpaceArrayItemToZero(int arrayitemX,int arrayitemY) 482 public void resetSpaceArrayItemToZero(int arrayitemX,int arrayitemY)
494 { 483 {
495 staticPrimspace[arrayitemX, arrayitemY] = IntPtr.Zero; 484 staticPrimspace[arrayitemX, arrayitemY] = IntPtr.Zero;
@@ -524,6 +513,7 @@ namespace OpenSim.Region.Physics.OdePlugin
524 if (!(sGeomIsIn.Equals(null))) 513 if (!(sGeomIsIn.Equals(null)))
525 { 514 {
526 if (sGeomIsIn != (IntPtr)0) 515 if (sGeomIsIn != (IntPtr)0)
516 {
527 if (d.GeomIsSpace(currentspace)) 517 if (d.GeomIsSpace(currentspace))
528 { 518 {
529 d.SpaceRemove(sGeomIsIn, geom); 519 d.SpaceRemove(sGeomIsIn, geom);
@@ -532,6 +522,7 @@ namespace OpenSim.Region.Physics.OdePlugin
532 { 522 {
533 MainLog.Instance.Verbose("Physics", "Invalid Scene passed to 'recalculatespace':" + sGeomIsIn.ToString() + " Geom:" + geom.ToString()); 523 MainLog.Instance.Verbose("Physics", "Invalid Scene passed to 'recalculatespace':" + sGeomIsIn.ToString() + " Geom:" + geom.ToString());
534 } 524 }
525 }
535 } 526 }
536 } 527 }
537 528
@@ -586,7 +577,6 @@ namespace OpenSim.Region.Physics.OdePlugin
586 else 577 else
587 { 578 {
588 MainLog.Instance.Verbose("Physics", "Invalid Scene passed to 'recalculatespace':" + sGeomIsIn.ToString() + " Geom:" + geom.ToString()); 579 MainLog.Instance.Verbose("Physics", "Invalid Scene passed to 'recalculatespace':" + sGeomIsIn.ToString() + " Geom:" + geom.ToString());
589
590 } 580 }
591 } 581 }
592 } 582 }
@@ -625,6 +615,7 @@ namespace OpenSim.Region.Physics.OdePlugin
625 //locationbasedspace = space; 615 //locationbasedspace = space;
626 return locationbasedspace; 616 return locationbasedspace;
627 } 617 }
618
628 public int[] calculateSpaceArrayItemFromPos(PhysicsVector pos) 619 public int[] calculateSpaceArrayItemFromPos(PhysicsVector pos)
629 { 620 {
630 int[] returnint = new int[2]; 621 int[] returnint = new int[2];
@@ -682,7 +673,7 @@ namespace OpenSim.Region.Physics.OdePlugin
682 } 673 }
683 674
684 public void addActivePrim(OdePrim activatePrim) 675 public void addActivePrim(OdePrim activatePrim)
685 { 676 {
686 // adds active prim.. (ones that should be iterated over in collisions_optimized 677 // adds active prim.. (ones that should be iterated over in collisions_optimized
687 678
688 _activeprims.Add(activatePrim); 679 _activeprims.Add(activatePrim);
@@ -902,17 +893,18 @@ namespace OpenSim.Region.Physics.OdePlugin
902 get { return (false); // for now we won't be multithreaded 893 get { return (false); // for now we won't be multithreaded
903 } 894 }
904 } 895 }
896
905 public float[] ResizeTerrain512(float[] heightMap) 897 public float[] ResizeTerrain512(float[] heightMap)
906 { 898 {
907 float[] returnarr = new float[262144]; 899 float[] returnarr = new float[262144];
908 float[,] resultarr = new float[256, 256]; 900 float[,] resultarr = new float[m_regionWidth, m_regionHeight];
909 901
910 // Filling out the array into it's multi-dimentional components 902 // Filling out the array into it's multi-dimentional components
911 for (int y = 0; y < 256; y++) 903 for (int y = 0; y < m_regionHeight; y++)
912 { 904 {
913 for (int x = 0; x < 256; x++) 905 for (int x = 0; x < m_regionWidth; x++)
914 { 906 {
915 resultarr[y,x] = heightMap[y * 256 + x]; 907 resultarr[y,x] = heightMap[y * m_regionWidth + x];
916 } 908 }
917 } 909 }
918 910
@@ -976,17 +968,17 @@ namespace OpenSim.Region.Physics.OdePlugin
976 // on single loop. 968 // on single loop.
977 969
978 float[,] resultarr2 = new float[512, 512]; 970 float[,] resultarr2 = new float[512, 512];
979 for (int y = 0; y < 256; y++) 971 for (int y = 0; y < m_regionHeight; y++)
980 { 972 {
981 for (int x = 0; x < 256; x++) 973 for (int x = 0; x < m_regionWidth; x++)
982 { 974 {
983 resultarr2[y*2,x*2] = resultarr[y,x]; 975 resultarr2[y*2,x*2] = resultarr[y,x];
984 976
985 if (y < 256) 977 if (y < m_regionHeight)
986 { 978 {
987 if (y + 1 < 256) 979 if (y + 1 < m_regionHeight)
988 { 980 {
989 if (x + 1 < 256) 981 if (x + 1 < m_regionWidth)
990 { 982 {
991 resultarr2[(y * 2) + 1, x * 2] = ((resultarr[y, x] + resultarr[y + 1, x] + resultarr[y, x+1] + resultarr[y+1, x+1])/4); 983 resultarr2[(y * 2) + 1, x * 2] = ((resultarr[y, x] + resultarr[y + 1, x] + resultarr[y, x+1] + resultarr[y+1, x+1])/4);
992 } 984 }
@@ -1000,11 +992,11 @@ namespace OpenSim.Region.Physics.OdePlugin
1000 resultarr2[(y * 2) + 1, x * 2] = resultarr[y, x]; 992 resultarr2[(y * 2) + 1, x * 2] = resultarr[y, x];
1001 } 993 }
1002 } 994 }
1003 if (x < 256) 995 if (x < m_regionWidth)
1004 { 996 {
1005 if (x + 1 < 256) 997 if (x + 1 < m_regionWidth)
1006 { 998 {
1007 if (y + 1 < 256) 999 if (y + 1 < m_regionHeight)
1008 { 1000 {
1009 resultarr2[y * 2, (x * 2) + 1] = ((resultarr[y, x] + resultarr[y + 1, x] + resultarr[y, x + 1] + resultarr[y + 1, x + 1]) / 4); 1001 resultarr2[y * 2, (x * 2) + 1] = ((resultarr[y, x] + resultarr[y + 1, x] + resultarr[y, x + 1] + resultarr[y + 1, x + 1]) / 4);
1010 } 1002 }
@@ -1018,9 +1010,9 @@ namespace OpenSim.Region.Physics.OdePlugin
1018 resultarr2[y * 2, (x * 2) + 1] = resultarr[y, x]; 1010 resultarr2[y * 2, (x * 2) + 1] = resultarr[y, x];
1019 } 1011 }
1020 } 1012 }
1021 if (x < 256 && y < 256) 1013 if (x < m_regionWidth && y < m_regionHeight)
1022 { 1014 {
1023 if ((x + 1 < 256) && (y + 1 < 256)) 1015 if ((x + 1 < m_regionWidth) && (y + 1 < m_regionHeight))
1024 { 1016 {
1025 resultarr2[(y * 2) + 1, (x * 2) + 1] = ((resultarr[y, x] + resultarr[y + 1, x] + resultarr[y, x + 1] + resultarr[y + 1, x + 1]) / 4); 1017 resultarr2[(y * 2) + 1, (x * 2) + 1] = ((resultarr[y, x] + resultarr[y + 1, x] + resultarr[y, x + 1] + resultarr[y + 1, x + 1]) / 4);
1026 } 1018 }
@@ -1052,21 +1044,26 @@ namespace OpenSim.Region.Physics.OdePlugin
1052 // dbm (danx0r) -- heightmap x,y must be swapped for Ode (should fix ODE, but for now...) 1044 // dbm (danx0r) -- heightmap x,y must be swapped for Ode (should fix ODE, but for now...)
1053 // also, creating a buffer zone of one extra sample all around 1045 // also, creating a buffer zone of one extra sample all around
1054 1046
1047 const uint heightmapWidth = m_regionWidth + 2;
1048 const uint heightmapHeight = m_regionHeight + 2;
1049 const uint heightmapWidthSamples = 2 * m_regionWidth + 2;
1050 const uint heightmapHeightSamples = 2 * m_regionHeight + 2;
1051 const float scale = 1.0f;
1052 const float offset = 0.0f;
1053 const float thickness = 2.0f;
1054 const int wrap = 0;
1055
1055 //Double resolution 1056 //Double resolution
1056 heightMap = ResizeTerrain512(heightMap); 1057 heightMap = ResizeTerrain512(heightMap);
1057 for (int x = 0; x < 514; x++) 1058 for (int x = 0; x < heightmapWidthSamples; x++)
1058 { 1059 {
1059 for (int y = 0; y < 514; y++) 1060 for (int y = 0; y < heightmapHeightSamples; y++)
1060 { 1061 {
1061 int xx = x - 1; 1062 int xx = Util.Clip(x - 1, 0, 511);
1062 if (xx < 0) xx = 0; 1063 int yy = Util.Clip(y - 1, 0, 511);
1063 if (xx > 511) xx = 511;
1064 int yy = y - 1;
1065 if (yy < 0) yy = 0;
1066 if (yy > 511) yy = 511;
1067 1064
1068 double val = (double) heightMap[yy*512 + xx]; 1065 double val = (double) heightMap[yy*512 + xx];
1069 _heightmap[x*514 + y] = val; 1066 _heightmap[x*heightmapHeightSamples + y] = val;
1070 } 1067 }
1071 } 1068 }
1072 1069
@@ -1077,8 +1074,9 @@ namespace OpenSim.Region.Physics.OdePlugin
1077 d.SpaceRemove(space, LandGeom); 1074 d.SpaceRemove(space, LandGeom);
1078 } 1075 }
1079 IntPtr HeightmapData = d.GeomHeightfieldDataCreate(); 1076 IntPtr HeightmapData = d.GeomHeightfieldDataCreate();
1080 d.GeomHeightfieldDataBuildDouble(HeightmapData, _heightmap, 0, 258, 258, 514, 514, 1.0f, 0.0f, 2.0f, 0); 1077 d.GeomHeightfieldDataBuildDouble(HeightmapData, _heightmap, 0, heightmapWidth, heightmapHeight,
1081 d.GeomHeightfieldDataSetBounds(HeightmapData, 256, 256); 1078 (int) heightmapWidthSamples, (int) heightmapHeightSamples, scale, offset, thickness, wrap);
1079 d.GeomHeightfieldDataSetBounds(HeightmapData, m_regionWidth, m_regionHeight);
1082 LandGeom = d.CreateHeightfield(space, HeightmapData, 1); 1080 LandGeom = d.CreateHeightfield(space, HeightmapData, 1);
1083 geom_name_map[LandGeom] = "Terrain"; 1081 geom_name_map[LandGeom] = "Terrain";
1084 1082