diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs index d189f1d..7d0f84a 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs | |||
@@ -93,7 +93,7 @@ public class BSShapeCollection : IDisposable | |||
93 | // sure the body is of the right type. | 93 | // sure the body is of the right type. |
94 | // Return 'true' if either the body or the shape changed. | 94 | // Return 'true' if either the body or the shape changed. |
95 | // Called at taint-time!! | 95 | // Called at taint-time!! |
96 | public bool GetBodyAndShape(bool forceRebuild, BulletSim sim, BSPrim prim, | 96 | public bool GetBodyAndShape(bool forceRebuild, BulletSim sim, BSPhysObject prim, |
97 | ShapeData shapeData, PrimitiveBaseShape pbs, | 97 | ShapeData shapeData, PrimitiveBaseShape pbs, |
98 | ShapeDestructionCallback shapeCallback, BodyDestructionCallback bodyCallback) | 98 | ShapeDestructionCallback shapeCallback, BodyDestructionCallback bodyCallback) |
99 | { | 99 | { |
@@ -351,19 +351,30 @@ public class BSShapeCollection : IDisposable | |||
351 | 351 | ||
352 | // Create the geometry information in Bullet for later use. | 352 | // Create the geometry information in Bullet for later use. |
353 | // The objects needs a hull if it's physical otherwise a mesh is enough. | 353 | // The objects needs a hull if it's physical otherwise a mesh is enough. |
354 | // No locking here because this is done when we know physics is not simulating. | 354 | // if 'forceRebuild' is true, the geometry is unconditionally rebuilt. For meshes and hulls, |
355 | // if 'forceRebuild' is true, the geometry is rebuilt. Otherwise a previously built version is used. | 355 | // shared geometries will be used. If the parameters of the existing shape are the same |
356 | // as this request, the shape is not rebuilt. | ||
357 | // Info in prim.BSShape is updated to the new shape. | ||
356 | // Returns 'true' if the geometry was rebuilt. | 358 | // Returns 'true' if the geometry was rebuilt. |
357 | // Called at taint-time! | 359 | // Called at taint-time! |
358 | private bool CreateGeom(bool forceRebuild, BSPrim prim, ShapeData shapeData, | 360 | private bool CreateGeom(bool forceRebuild, BSPhysObject prim, ShapeData shapeData, |
359 | PrimitiveBaseShape pbs, ShapeDestructionCallback shapeCallback) | 361 | PrimitiveBaseShape pbs, ShapeDestructionCallback shapeCallback) |
360 | { | 362 | { |
361 | bool ret = false; | 363 | bool ret = false; |
362 | bool haveShape = false; | 364 | bool haveShape = false; |
363 | bool nativeShapePossible = true; | 365 | bool nativeShapePossible = true; |
364 | 366 | ||
367 | if (shapeData.Type == ShapeData.PhysicsShapeType.SHAPE_AVATAR) | ||
368 | { | ||
369 | // an avatar capsule is close to a native shape (it is not shared) | ||
370 | ret = GetReferenceToNativeShape(prim, shapeData, ShapeData.PhysicsShapeType.SHAPE_AVATAR, | ||
371 | ShapeData.FixedShapeKey.KEY_CAPSULE, shapeCallback); | ||
372 | haveShape = true; | ||
373 | } | ||
365 | // If the prim attributes are simple, this could be a simple Bullet native shape | 374 | // If the prim attributes are simple, this could be a simple Bullet native shape |
366 | if (nativeShapePossible | 375 | if (!haveShape |
376 | && pbs != null | ||
377 | && nativeShapePossible | ||
367 | && ((pbs.SculptEntry && !PhysicsScene.ShouldMeshSculptedPrim) | 378 | && ((pbs.SculptEntry && !PhysicsScene.ShouldMeshSculptedPrim) |
368 | || (pbs.ProfileBegin == 0 && pbs.ProfileEnd == 0 | 379 | || (pbs.ProfileBegin == 0 && pbs.ProfileEnd == 0 |
369 | && pbs.ProfileHollow == 0 | 380 | && pbs.ProfileHollow == 0 |
@@ -406,7 +417,7 @@ public class BSShapeCollection : IDisposable | |||
406 | // If a simple shape is not happening, create a mesh and possibly a hull. | 417 | // If a simple shape is not happening, create a mesh and possibly a hull. |
407 | // Note that if it's a native shape, the check for physical/non-physical is not | 418 | // Note that if it's a native shape, the check for physical/non-physical is not |
408 | // made. Native shapes are best used in either case. | 419 | // made. Native shapes are best used in either case. |
409 | if (!haveShape) | 420 | if (!haveShape && pbs != null) |
410 | { | 421 | { |
411 | if (prim.IsPhysical && PhysicsScene.ShouldUseHullsForPhysicalObjects) | 422 | if (prim.IsPhysical && PhysicsScene.ShouldUseHullsForPhysicalObjects) |
412 | { | 423 | { |
@@ -425,8 +436,9 @@ public class BSShapeCollection : IDisposable | |||
425 | return ret; | 436 | return ret; |
426 | } | 437 | } |
427 | 438 | ||
428 | // Creates a native shape and assignes it to prim.BSShape | 439 | // Creates a native shape and assignes it to prim.BSShape. |
429 | private bool GetReferenceToNativeShape( BSPrim prim, ShapeData shapeData, | 440 | // "Native" shapes are never shared. they are created here and destroyed in DereferenceShape(). |
441 | private bool GetReferenceToNativeShape(BSPhysObject prim, ShapeData shapeData, | ||
430 | ShapeData.PhysicsShapeType shapeType, ShapeData.FixedShapeKey shapeKey, | 442 | ShapeData.PhysicsShapeType shapeType, ShapeData.FixedShapeKey shapeKey, |
431 | ShapeDestructionCallback shapeCallback) | 443 | ShapeDestructionCallback shapeCallback) |
432 | { | 444 | { |
@@ -440,10 +452,19 @@ public class BSShapeCollection : IDisposable | |||
440 | // release any previous shape | 452 | // release any previous shape |
441 | DereferenceShape(prim.BSShape, true, shapeCallback); | 453 | DereferenceShape(prim.BSShape, true, shapeCallback); |
442 | 454 | ||
443 | // Native shapes are always built independently. | 455 | if (shapeType == ShapeData.PhysicsShapeType.SHAPE_AVATAR) |
444 | newShape = new BulletShape(BulletSimAPI.BuildNativeShape2(PhysicsScene.World.ptr, shapeData), shapeType); | 456 | { |
445 | newShape.shapeKey = (System.UInt64)shapeKey; | 457 | newShape = new BulletShape(BulletSimAPI.BuildCapsuleShape2(PhysicsScene.World.ptr, shapeData), shapeType); |
446 | newShape.isNativeShape = true; | 458 | newShape.shapeKey = (System.UInt64)shapeKey; |
459 | newShape.isNativeShape = true; | ||
460 | } | ||
461 | else | ||
462 | { | ||
463 | // Native shapes are always built independently. | ||
464 | newShape = new BulletShape(BulletSimAPI.BuildNativeShape2(PhysicsScene.World.ptr, shapeData), shapeType); | ||
465 | newShape.shapeKey = (System.UInt64)shapeKey; | ||
466 | newShape.isNativeShape = true; | ||
467 | } | ||
447 | 468 | ||
448 | // Don't need to do a 'ReferenceShape()' here because native shapes are not tracked. | 469 | // Don't need to do a 'ReferenceShape()' here because native shapes are not tracked. |
449 | // DetailLog("{0},BSShapeCollection.AddNativeShapeToPrim,create,newshape={1}", shapeData.ID, newShape); | 470 | // DetailLog("{0},BSShapeCollection.AddNativeShapeToPrim,create,newshape={1}", shapeData.ID, newShape); |
@@ -456,7 +477,7 @@ public class BSShapeCollection : IDisposable | |||
456 | // Dereferences previous shape in BSShape and adds a reference for this new shape. | 477 | // Dereferences previous shape in BSShape and adds a reference for this new shape. |
457 | // Returns 'true' of a mesh was actually built. Otherwise . | 478 | // Returns 'true' of a mesh was actually built. Otherwise . |
458 | // Called at taint-time! | 479 | // Called at taint-time! |
459 | private bool GetReferenceToMesh(BSPrim prim, ShapeData shapeData, PrimitiveBaseShape pbs, | 480 | private bool GetReferenceToMesh(BSPhysObject prim, ShapeData shapeData, PrimitiveBaseShape pbs, |
460 | ShapeDestructionCallback shapeCallback) | 481 | ShapeDestructionCallback shapeCallback) |
461 | { | 482 | { |
462 | BulletShape newShape = new BulletShape(IntPtr.Zero); | 483 | BulletShape newShape = new BulletShape(IntPtr.Zero); |
@@ -526,7 +547,7 @@ public class BSShapeCollection : IDisposable | |||
526 | 547 | ||
527 | // See that hull shape exists in the physical world and update prim.BSShape. | 548 | // See that hull shape exists in the physical world and update prim.BSShape. |
528 | // We could be creating the hull because scale changed or whatever. | 549 | // We could be creating the hull because scale changed or whatever. |
529 | private bool GetReferenceToHull(BSPrim prim, ShapeData shapeData, PrimitiveBaseShape pbs, | 550 | private bool GetReferenceToHull(BSPhysObject prim, ShapeData shapeData, PrimitiveBaseShape pbs, |
530 | ShapeDestructionCallback shapeCallback) | 551 | ShapeDestructionCallback shapeCallback) |
531 | { | 552 | { |
532 | BulletShape newShape; | 553 | BulletShape newShape; |
@@ -694,7 +715,7 @@ public class BSShapeCollection : IDisposable | |||
694 | // Updates prim.BSBody with the information about the new body if one is created. | 715 | // Updates prim.BSBody with the information about the new body if one is created. |
695 | // Returns 'true' if an object was actually created. | 716 | // Returns 'true' if an object was actually created. |
696 | // Called at taint-time. | 717 | // Called at taint-time. |
697 | private bool CreateBody(bool forceRebuild, BSPrim prim, BulletSim sim, BulletShape shape, | 718 | private bool CreateBody(bool forceRebuild, BSPhysObject prim, BulletSim sim, BulletShape shape, |
698 | ShapeData shapeData, BodyDestructionCallback bodyCallback) | 719 | ShapeData shapeData, BodyDestructionCallback bodyCallback) |
699 | { | 720 | { |
700 | bool ret = false; | 721 | bool ret = false; |