diff options
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/OdePlugin.cs')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 183 |
1 files changed, 177 insertions, 6 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 0dab05c..a50c5ae 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -24,6 +24,7 @@ | |||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | //#define USE_DRAWSTUFF | ||
27 | 28 | ||
28 | using System; | 29 | using System; |
29 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
@@ -34,6 +35,9 @@ using System.IO; | |||
34 | using log4net; | 35 | using log4net; |
35 | using Nini.Config; | 36 | using Nini.Config; |
36 | using Ode.NET; | 37 | using Ode.NET; |
38 | #if USE_DRAWSTUFF | ||
39 | using Drawstuff.NET; | ||
40 | #endif | ||
37 | using OpenSim.Framework; | 41 | using OpenSim.Framework; |
38 | using OpenSim.Region.Physics.Manager; | 42 | using OpenSim.Region.Physics.Manager; |
39 | using OpenMetaverse; | 43 | using OpenMetaverse; |
@@ -257,6 +261,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
257 | public int physics_logging_interval = 0; | 261 | public int physics_logging_interval = 0; |
258 | public bool physics_logging_append_existing_logfile = false; | 262 | public bool physics_logging_append_existing_logfile = false; |
259 | 263 | ||
264 | public d.Vector3 xyz = new d.Vector3(2.1640f, -1.3079f, 1.7600f); | ||
265 | public d.Vector3 hpr = new d.Vector3(125.5000f, -17.0000f, 0.0000f); | ||
266 | |||
260 | /// <summary> | 267 | /// <summary> |
261 | /// Initiailizes the scene | 268 | /// Initiailizes the scene |
262 | /// Sets many properties that ODE requires to be stable | 269 | /// Sets many properties that ODE requires to be stable |
@@ -280,6 +287,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
280 | //contactgroup | 287 | //contactgroup |
281 | 288 | ||
282 | d.WorldSetAutoDisableFlag(world, false); | 289 | d.WorldSetAutoDisableFlag(world, false); |
290 | #if USE_DRAWSTUFF | ||
291 | |||
292 | Thread viewthread = new Thread(new ParameterizedThreadStart(startvisualization)); | ||
293 | viewthread.Start(); | ||
294 | #endif | ||
283 | } | 295 | } |
284 | 296 | ||
285 | // zero out a heightmap array float array (single dimention [flattened])) | 297 | // zero out a heightmap array float array (single dimention [flattened])) |
@@ -290,6 +302,21 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
290 | // we can hit test less. | 302 | // we can hit test less. |
291 | } | 303 | } |
292 | 304 | ||
305 | #if USE_DRAWSTUFF | ||
306 | public void startvisualization(object o) | ||
307 | { | ||
308 | ds.Functions fn; | ||
309 | fn.version = ds.VERSION; | ||
310 | fn.start = new ds.CallbackFunction(start); | ||
311 | fn.step = new ds.CallbackFunction(step); | ||
312 | fn.command = new ds.CallbackFunction(command); | ||
313 | fn.stop = null; | ||
314 | fn.path_to_textures = "./textures"; | ||
315 | string[] args = new string[0]; | ||
316 | ds.SimulationLoop(args.Length, args, 352, 288, ref fn); | ||
317 | } | ||
318 | #endif | ||
319 | |||
293 | // Initialize the mesh plugin | 320 | // Initialize the mesh plugin |
294 | public override void Initialise(IMesher meshmerizer, IConfigSource config) | 321 | public override void Initialise(IMesher meshmerizer, IConfigSource config) |
295 | { | 322 | { |
@@ -787,6 +814,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
787 | _perloopContact.Add(contacts[i]); | 814 | _perloopContact.Add(contacts[i]); |
788 | joint = d.JointCreateContact(world, contactgroup, ref TerrainContact); | 815 | joint = d.JointCreateContact(world, contactgroup, ref TerrainContact); |
789 | } | 816 | } |
817 | //if (p2.PhysicsActorType == (int)ActorTypes.Prim) | ||
818 | //{ | ||
819 | //m_log.Debug("[PHYSICS]: prim contacting with ground"); | ||
820 | //} | ||
790 | } | 821 | } |
791 | else if (name1 == "Water" || name2 == "Water") | 822 | else if (name1 == "Water" || name2 == "Water") |
792 | { | 823 | { |
@@ -1137,7 +1168,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1137 | List<OdePrim> removeprims = null; | 1168 | List<OdePrim> removeprims = null; |
1138 | foreach (OdePrim chr in _activeprims) | 1169 | foreach (OdePrim chr in _activeprims) |
1139 | { | 1170 | { |
1140 | if (d.BodyIsEnabled(chr.Body) && (!chr.m_disabled)) | 1171 | if (chr.Body != IntPtr.Zero && d.BodyIsEnabled(chr.Body) && (!chr.m_disabled)) |
1141 | { | 1172 | { |
1142 | try | 1173 | try |
1143 | { | 1174 | { |
@@ -1243,7 +1274,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1243 | { | 1274 | { |
1244 | newPrim = new OdePrim(name, this, pos, siz, rot, mesh, pbs, isphysical, ode); | 1275 | newPrim = new OdePrim(name, this, pos, siz, rot, mesh, pbs, isphysical, ode); |
1245 | 1276 | ||
1246 | _prims.Add(newPrim); | 1277 | lock (_prims) |
1278 | _prims.Add(newPrim); | ||
1247 | } | 1279 | } |
1248 | 1280 | ||
1249 | return newPrim; | 1281 | return newPrim; |
@@ -1252,8 +1284,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1252 | public void addActivePrim(OdePrim activatePrim) | 1284 | public void addActivePrim(OdePrim activatePrim) |
1253 | { | 1285 | { |
1254 | // adds active prim.. (ones that should be iterated over in collisions_optimized | 1286 | // adds active prim.. (ones that should be iterated over in collisions_optimized |
1255 | 1287 | lock (_activeprims) | |
1256 | _activeprims.Add(activatePrim); | 1288 | { |
1289 | if (!_activeprims.Contains(activatePrim)) | ||
1290 | _activeprims.Add(activatePrim); | ||
1291 | //else | ||
1292 | // m_log.Warn("[PHYSICS]: Double Entry in _activeprims detected, potential crash immenent"); | ||
1293 | } | ||
1257 | } | 1294 | } |
1258 | 1295 | ||
1259 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 1296 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, |
@@ -1334,6 +1371,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1334 | if (prim.IsPhysical) | 1371 | if (prim.IsPhysical) |
1335 | { | 1372 | { |
1336 | prim.disableBody(); | 1373 | prim.disableBody(); |
1374 | if (prim.childPrim) | ||
1375 | { | ||
1376 | prim.childPrim = false; | ||
1377 | prim.Body = IntPtr.Zero; | ||
1378 | prim.m_disabled = true; | ||
1379 | prim.IsPhysical = false; | ||
1380 | } | ||
1381 | |||
1382 | |||
1337 | } | 1383 | } |
1338 | // we don't want to remove the main space | 1384 | // we don't want to remove the main space |
1339 | 1385 | ||
@@ -1376,6 +1422,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1376 | { | 1422 | { |
1377 | m_log.Info("[PHYSICS]: Couldn't remove prim from physics scene, it was already be removed."); | 1423 | m_log.Info("[PHYSICS]: Couldn't remove prim from physics scene, it was already be removed."); |
1378 | } | 1424 | } |
1425 | lock (_prims) | ||
1379 | _prims.Remove(prim); | 1426 | _prims.Remove(prim); |
1380 | 1427 | ||
1381 | //If there are no more geometries in the sub-space, we don't need it in the main space anymore | 1428 | //If there are no more geometries in the sub-space, we don't need it in the main space anymore |
@@ -2376,9 +2423,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2376 | { | 2423 | { |
2377 | lock (OdeLock) | 2424 | lock (OdeLock) |
2378 | { | 2425 | { |
2379 | foreach (OdePrim prm in _prims) | 2426 | lock (_prims) |
2380 | { | 2427 | { |
2381 | RemovePrim(prm); | 2428 | foreach (OdePrim prm in _prims) |
2429 | { | ||
2430 | RemovePrim(prm); | ||
2431 | } | ||
2382 | } | 2432 | } |
2383 | 2433 | ||
2384 | //foreach (OdeCharacter act in _characters) | 2434 | //foreach (OdeCharacter act in _characters) |
@@ -2411,5 +2461,126 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2411 | } | 2461 | } |
2412 | return returncolliders; | 2462 | return returncolliders; |
2413 | } | 2463 | } |
2464 | #if USE_DRAWSTUFF | ||
2465 | // Keyboard callback | ||
2466 | public void command(int cmd) | ||
2467 | { | ||
2468 | IntPtr geom; | ||
2469 | d.Mass mass; | ||
2470 | d.Vector3 sides = new d.Vector3(d.RandReal() * 0.5f + 0.1f, d.RandReal() * 0.5f + 0.1f, d.RandReal() * 0.5f + 0.1f); | ||
2471 | |||
2472 | |||
2473 | |||
2474 | Char ch = Char.ToLower((Char)cmd); | ||
2475 | switch ((Char)ch) | ||
2476 | { | ||
2477 | case 'w': | ||
2478 | Vector3 rotate = (new Vector3(1, 0, 0) * Quaternion.CreateFromEulers(hpr.Z * Utils.DEG_TO_RAD, hpr.Y * Utils.DEG_TO_RAD, hpr.X * Utils.DEG_TO_RAD)); | ||
2479 | |||
2480 | xyz.X += rotate.X; xyz.Y += rotate.Y; xyz.Z += rotate.Z; | ||
2481 | ds.SetViewpoint(ref xyz, ref hpr); | ||
2482 | break; | ||
2483 | |||
2484 | case 'a': | ||
2485 | hpr.X++; | ||
2486 | ds.SetViewpoint(ref xyz, ref hpr); | ||
2487 | break; | ||
2488 | |||
2489 | case 's': | ||
2490 | Vector3 rotate2 = (new Vector3(-1, 0, 0) * Quaternion.CreateFromEulers(hpr.Z * Utils.DEG_TO_RAD, hpr.Y * Utils.DEG_TO_RAD, hpr.X * Utils.DEG_TO_RAD)); | ||
2491 | |||
2492 | xyz.X += rotate2.X; xyz.Y += rotate2.Y; xyz.Z += rotate2.Z; | ||
2493 | ds.SetViewpoint(ref xyz, ref hpr); | ||
2494 | break; | ||
2495 | case 'd': | ||
2496 | hpr.X--; | ||
2497 | ds.SetViewpoint(ref xyz, ref hpr); | ||
2498 | break; | ||
2499 | case 'r': | ||
2500 | xyz.Z++; | ||
2501 | ds.SetViewpoint(ref xyz, ref hpr); | ||
2502 | break; | ||
2503 | case 'f': | ||
2504 | xyz.Z--; | ||
2505 | ds.SetViewpoint(ref xyz, ref hpr); | ||
2506 | break; | ||
2507 | case 'e': | ||
2508 | xyz.Y++; | ||
2509 | ds.SetViewpoint(ref xyz, ref hpr); | ||
2510 | break; | ||
2511 | case 'q': | ||
2512 | xyz.Y--; | ||
2513 | ds.SetViewpoint(ref xyz, ref hpr); | ||
2514 | break; | ||
2515 | } | ||
2516 | } | ||
2517 | |||
2518 | public void step(int pause) | ||
2519 | { | ||
2520 | |||
2521 | ds.SetColor(1.0f, 1.0f, 0.0f); | ||
2522 | ds.SetTexture(ds.Texture.Wood); | ||
2523 | lock (_prims) | ||
2524 | { | ||
2525 | foreach (OdePrim prm in _prims) | ||
2526 | { | ||
2527 | //IntPtr body = d.GeomGetBody(prm.prim_geom); | ||
2528 | if (prm.prim_geom != IntPtr.Zero) | ||
2529 | { | ||
2530 | d.Vector3 pos; | ||
2531 | d.GeomCopyPosition(prm.prim_geom, out pos); | ||
2532 | //d.BodyCopyPosition(body, out pos); | ||
2533 | |||
2534 | d.Matrix3 R; | ||
2535 | d.GeomCopyRotation(prm.prim_geom, out R); | ||
2536 | //d.BodyCopyRotation(body, out R); | ||
2537 | |||
2538 | |||
2539 | d.Vector3 sides = new d.Vector3(); | ||
2540 | sides.X = prm.Size.X; | ||
2541 | sides.Y = prm.Size.Y; | ||
2542 | sides.Z = prm.Size.Z; | ||
2543 | |||
2544 | ds.DrawBox(ref pos, ref R, ref sides); | ||
2545 | } | ||
2546 | } | ||
2547 | } | ||
2548 | ds.SetColor(1.0f, 0.0f, 0.0f); | ||
2549 | lock (_characters) | ||
2550 | { | ||
2551 | foreach (OdeCharacter chr in _characters) | ||
2552 | { | ||
2553 | if (chr.Shell != IntPtr.Zero) | ||
2554 | { | ||
2555 | IntPtr body = d.GeomGetBody(chr.Shell); | ||
2556 | |||
2557 | d.Vector3 pos; | ||
2558 | d.GeomCopyPosition(chr.Shell, out pos); | ||
2559 | //d.BodyCopyPosition(body, out pos); | ||
2560 | |||
2561 | d.Matrix3 R; | ||
2562 | d.GeomCopyRotation(chr.Shell, out R); | ||
2563 | //d.BodyCopyRotation(body, out R); | ||
2564 | |||
2565 | ds.DrawCapsule(ref pos, ref R, chr.Size.Z, 0.35f); | ||
2566 | d.Vector3 sides = new d.Vector3(); | ||
2567 | sides.X = 0.5f; | ||
2568 | sides.Y = 0.5f; | ||
2569 | sides.Z = 0.5f; | ||
2570 | |||
2571 | ds.DrawBox(ref pos, ref R, ref sides); | ||
2572 | |||
2573 | |||
2574 | } | ||
2575 | } | ||
2576 | } | ||
2577 | } | ||
2578 | |||
2579 | public void start(int unused) | ||
2580 | { | ||
2581 | |||
2582 | ds.SetViewpoint(ref xyz, ref hpr); | ||
2583 | } | ||
2584 | #endif | ||
2414 | } | 2585 | } |
2415 | } | 2586 | } |