diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSParam.cs | 3 | ||||
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs | 55 |
2 files changed, 54 insertions, 4 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs index 9a9e527..5cff668 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs | |||
@@ -90,6 +90,7 @@ public static class BSParam | |||
90 | public static bool ShouldUseBulletHACD { get; set; } | 90 | public static bool ShouldUseBulletHACD { get; set; } |
91 | public static bool ShouldUseSingleConvexHullForPrims { get; set; } | 91 | public static bool ShouldUseSingleConvexHullForPrims { get; set; } |
92 | public static bool ShouldUseGImpactShapeForPrims { get; set; } | 92 | public static bool ShouldUseGImpactShapeForPrims { get; set; } |
93 | public static bool ShouldUseAssetHulls { get; set; } | ||
93 | 94 | ||
94 | public static float TerrainImplementation { get; set; } | 95 | public static float TerrainImplementation { get; set; } |
95 | public static int TerrainMeshMagnification { get; private set; } | 96 | public static int TerrainMeshMagnification { get; private set; } |
@@ -372,6 +373,8 @@ public static class BSParam | |||
372 | true ), | 373 | true ), |
373 | new ParameterDefn<bool>("ShouldUseGImpactShapeForPrims", "If true, use a GImpact shape for prims with cuts and twists", | 374 | new ParameterDefn<bool>("ShouldUseGImpactShapeForPrims", "If true, use a GImpact shape for prims with cuts and twists", |
374 | false ), | 375 | false ), |
376 | new ParameterDefn<bool>("UseAssetHulls", "If true, use hull if specified in the mesh asset info", | ||
377 | false ), | ||
375 | 378 | ||
376 | new ParameterDefn<int>("CrossingFailuresBeforeOutOfBounds", "How forgiving we are about getting into adjactent regions", | 379 | new ParameterDefn<int>("CrossingFailuresBeforeOutOfBounds", "How forgiving we are about getting into adjactent regions", |
377 | 5 ), | 380 | 5 ), |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs index 0152233..b7f7e6c 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs | |||
@@ -31,6 +31,7 @@ using System.Text; | |||
31 | 31 | ||
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Region.Physics.Manager; | 33 | using OpenSim.Region.Physics.Manager; |
34 | using OpenSim.Region.Physics.Meshing; | ||
34 | using OpenSim.Region.Physics.ConvexDecompositionDotNet; | 35 | using OpenSim.Region.Physics.ConvexDecompositionDotNet; |
35 | 36 | ||
36 | using OMV = OpenMetaverse; | 37 | using OMV = OpenMetaverse; |
@@ -573,9 +574,56 @@ public class BSShapeHull : BSShape | |||
573 | PrimitiveBaseShape pbs, OMV.Vector3 size, float lod) | 574 | PrimitiveBaseShape pbs, OMV.Vector3 size, float lod) |
574 | { | 575 | { |
575 | BulletShape newShape = new BulletShape(); | 576 | BulletShape newShape = new BulletShape(); |
576 | IntPtr hullPtr = IntPtr.Zero; | 577 | newShape.shapeKey = newHullKey; |
577 | 578 | ||
578 | if (BSParam.ShouldUseBulletHACD) | 579 | // Pass true for physicalness as this prevents the creation of bounding box which is not needed |
580 | IMesh meshData = physicsScene.mesher.CreateMesh(prim.PhysObjectName, pbs, size, lod, true /* isPhysical */, false /* shouldCache */); | ||
581 | |||
582 | // If there is hull data in the mesh asset, build the hull from that | ||
583 | if (meshData != null && BSParam.ShouldUseAssetHulls) | ||
584 | { | ||
585 | Meshmerizer realMesher = physicsScene.mesher as Meshmerizer; | ||
586 | if (realMesher != null) | ||
587 | { | ||
588 | List<List<OMV.Vector3>> allHulls = realMesher.GetConvexHulls(size); | ||
589 | if (allHulls != null) | ||
590 | { | ||
591 | int hullCount = allHulls.Count; | ||
592 | int totalVertices = 1; // include one for the count of the hulls | ||
593 | // Using the structure described for HACD hulls, create the memory sturcture | ||
594 | // to pass the hull data to the creater. | ||
595 | foreach (List<OMV.Vector3> hullVerts in allHulls) | ||
596 | { | ||
597 | totalVertices += 4; // add four for the vertex count and centroid | ||
598 | totalVertices += hullVerts.Count * 3; // one vertex is three dimensions | ||
599 | } | ||
600 | float[] convHulls = new float[totalVertices]; | ||
601 | |||
602 | convHulls[0] = (float)hullCount; | ||
603 | int jj = 1; | ||
604 | foreach (List<OMV.Vector3> hullVerts in allHulls) | ||
605 | { | ||
606 | convHulls[jj + 0] = hullVerts.Count; | ||
607 | convHulls[jj + 1] = 0f; // centroid x,y,z | ||
608 | convHulls[jj + 2] = 0f; | ||
609 | convHulls[jj + 3] = 0f; | ||
610 | jj += 4; | ||
611 | foreach (OMV.Vector3 oneVert in hullVerts) | ||
612 | { | ||
613 | convHulls[jj + 0] = oneVert.X; | ||
614 | convHulls[jj + 1] = oneVert.Y; | ||
615 | convHulls[jj + 2] = oneVert.Z; | ||
616 | jj += 3; | ||
617 | } | ||
618 | } | ||
619 | |||
620 | // create the hull data structure in Bullet | ||
621 | newShape = physicsScene.PE.CreateHullShape(physicsScene.World, hullCount, convHulls); | ||
622 | } | ||
623 | } | ||
624 | } | ||
625 | // If no hull specified in the asset and we should use Bullet's HACD approximation... | ||
626 | if (!newShape.HasPhysicalShape && BSParam.ShouldUseBulletHACD) | ||
579 | { | 627 | { |
580 | // Build the hull shape from an existing mesh shape. | 628 | // Build the hull shape from an existing mesh shape. |
581 | // The mesh should have already been created in Bullet. | 629 | // The mesh should have already been created in Bullet. |
@@ -604,11 +652,10 @@ public class BSShapeHull : BSShape | |||
604 | } | 652 | } |
605 | physicsScene.DetailLog("{0},BSShapeHull.CreatePhysicalHull,shouldUseBulletHACD,exit,hasBody={1}", prim.LocalID, newShape.HasPhysicalShape); | 653 | physicsScene.DetailLog("{0},BSShapeHull.CreatePhysicalHull,shouldUseBulletHACD,exit,hasBody={1}", prim.LocalID, newShape.HasPhysicalShape); |
606 | } | 654 | } |
655 | // If no hull specified, use our HACD hull approximation. | ||
607 | if (!newShape.HasPhysicalShape) | 656 | if (!newShape.HasPhysicalShape) |
608 | { | 657 | { |
609 | // Build a new hull in the physical world using the C# HACD algorigthm. | 658 | // Build a new hull in the physical world using the C# HACD algorigthm. |
610 | // Pass true for physicalness as this prevents the creation of bounding box which is not needed | ||
611 | IMesh meshData = physicsScene.mesher.CreateMesh(prim.PhysObjectName, pbs, size, lod, true /* isPhysical */, false /* shouldCache */); | ||
612 | if (meshData != null) | 659 | if (meshData != null) |
613 | { | 660 | { |
614 | if (prim.PrimAssetState == BSPhysObject.PrimAssetCondition.Fetched) | 661 | if (prim.PrimAssetState == BSPhysObject.PrimAssetCondition.Fetched) |