diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs | 130 |
1 files changed, 121 insertions, 9 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs index 72d039b..0152233 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs | |||
@@ -422,9 +422,22 @@ public class BSShapeMesh : BSShape | |||
422 | outMesh = foundDesc; | 422 | outMesh = foundDesc; |
423 | return ret; | 423 | return ret; |
424 | } | 424 | } |
425 | |||
426 | public delegate BulletShape CreateShapeCall(BulletWorld world, int indicesCount, int[] indices, int verticesCount, float[] vertices ); | ||
425 | private BulletShape CreatePhysicalMesh(BSScene physicsScene, BSPhysObject prim, System.UInt64 newMeshKey, | 427 | private BulletShape CreatePhysicalMesh(BSScene physicsScene, BSPhysObject prim, System.UInt64 newMeshKey, |
426 | PrimitiveBaseShape pbs, OMV.Vector3 size, float lod) | 428 | PrimitiveBaseShape pbs, OMV.Vector3 size, float lod) |
427 | { | 429 | { |
430 | return BSShapeMesh.CreatePhysicalMeshShape(physicsScene, prim, newMeshKey, pbs, size, lod, | ||
431 | (w, iC, i, vC, v) => physicsScene.PE.CreateMeshShape(w, iC, i, vC, v) ); | ||
432 | } | ||
433 | |||
434 | // Code that uses the mesher to create the index/vertices info for a trimesh shape. | ||
435 | // This is used by the passed 'makeShape' call to create the Bullet mesh shape. | ||
436 | // The actual build call is passed so this logic can be used by several of the shapes that use a | ||
437 | // simple mesh as their base shape. | ||
438 | public static BulletShape CreatePhysicalMeshShape(BSScene physicsScene, BSPhysObject prim, System.UInt64 newMeshKey, | ||
439 | PrimitiveBaseShape pbs, OMV.Vector3 size, float lod, CreateShapeCall makeShape) | ||
440 | { | ||
428 | BulletShape newShape = new BulletShape(); | 441 | BulletShape newShape = new BulletShape(); |
429 | 442 | ||
430 | IMesh meshData = physicsScene.mesher.CreateMesh(prim.PhysObjectName, pbs, size, lod, | 443 | IMesh meshData = physicsScene.mesher.CreateMesh(prim.PhysObjectName, pbs, size, lod, |
@@ -482,8 +495,7 @@ public class BSShapeMesh : BSShape | |||
482 | 495 | ||
483 | if (realIndicesIndex != 0) | 496 | if (realIndicesIndex != 0) |
484 | { | 497 | { |
485 | newShape = physicsScene.PE.CreateMeshShape(physicsScene.World, | 498 | newShape = makeShape(physicsScene.World, realIndicesIndex, indices, verticesAsFloats.Length / 3, verticesAsFloats); |
486 | realIndicesIndex, indices, verticesAsFloats.Length / 3, verticesAsFloats); | ||
487 | } | 499 | } |
488 | else | 500 | else |
489 | { | 501 | { |
@@ -803,6 +815,7 @@ public class BSShapeCompound : BSShape | |||
803 | // Called at taint-time. | 815 | // Called at taint-time. |
804 | private void DereferenceAnonCollisionShape(BSScene physicsScene, BulletShape pShape) | 816 | private void DereferenceAnonCollisionShape(BSScene physicsScene, BulletShape pShape) |
805 | { | 817 | { |
818 | // TODO: figure a better way to go through all the shape types and find a possible instance. | ||
806 | BSShapeMesh meshDesc; | 819 | BSShapeMesh meshDesc; |
807 | if (BSShapeMesh.TryGetMeshByPtr(pShape, out meshDesc)) | 820 | if (BSShapeMesh.TryGetMeshByPtr(pShape, out meshDesc)) |
808 | { | 821 | { |
@@ -824,17 +837,25 @@ public class BSShapeCompound : BSShape | |||
824 | } | 837 | } |
825 | else | 838 | else |
826 | { | 839 | { |
827 | if (physicsScene.PE.IsCompound(pShape)) | 840 | BSShapeGImpact gImpactDesc; |
841 | if (BSShapeGImpact.TryGetGImpactByPtr(pShape, out gImpactDesc)) | ||
828 | { | 842 | { |
829 | BSShapeCompound recursiveCompound = new BSShapeCompound(pShape); | 843 | gImpactDesc.Dereference(physicsScene); |
830 | recursiveCompound.Dereference(physicsScene); | ||
831 | } | 844 | } |
832 | else | 845 | else |
833 | { | 846 | { |
834 | if (physicsScene.PE.IsNativeShape(pShape)) | 847 | if (physicsScene.PE.IsCompound(pShape)) |
848 | { | ||
849 | BSShapeCompound recursiveCompound = new BSShapeCompound(pShape); | ||
850 | recursiveCompound.Dereference(physicsScene); | ||
851 | } | ||
852 | else | ||
835 | { | 853 | { |
836 | BSShapeNative nativeShape = new BSShapeNative(pShape); | 854 | if (physicsScene.PE.IsNativeShape(pShape)) |
837 | nativeShape.Dereference(physicsScene); | 855 | { |
856 | BSShapeNative nativeShape = new BSShapeNative(pShape); | ||
857 | nativeShape.Dereference(physicsScene); | ||
858 | } | ||
838 | } | 859 | } |
839 | } | 860 | } |
840 | } | 861 | } |
@@ -857,7 +878,7 @@ public class BSShapeConvexHull : BSShape | |||
857 | float lod; | 878 | float lod; |
858 | System.UInt64 newMeshKey = BSShape.ComputeShapeKey(prim.Size, prim.BaseShape, out lod); | 879 | System.UInt64 newMeshKey = BSShape.ComputeShapeKey(prim.Size, prim.BaseShape, out lod); |
859 | 880 | ||
860 | physicsScene.DetailLog("{0},BSShapeMesh,getReference,newKey={1},size={2},lod={3}", | 881 | physicsScene.DetailLog("{0},BSShapeConvexHull,getReference,newKey={1},size={2},lod={3}", |
861 | prim.LocalID, newMeshKey.ToString("X"), prim.Size, lod); | 882 | prim.LocalID, newMeshKey.ToString("X"), prim.Size, lod); |
862 | 883 | ||
863 | BSShapeConvexHull retConvexHull = null; | 884 | BSShapeConvexHull retConvexHull = null; |
@@ -937,6 +958,97 @@ public class BSShapeConvexHull : BSShape | |||
937 | return ret; | 958 | return ret; |
938 | } | 959 | } |
939 | } | 960 | } |
961 | // ============================================================================================================ | ||
962 | public class BSShapeGImpact : BSShape | ||
963 | { | ||
964 | private static string LogHeader = "[BULLETSIM SHAPE GIMPACT]"; | ||
965 | public static Dictionary<System.UInt64, BSShapeGImpact> GImpacts = new Dictionary<System.UInt64, BSShapeGImpact>(); | ||
966 | |||
967 | public BSShapeGImpact(BulletShape pShape) : base(pShape) | ||
968 | { | ||
969 | } | ||
970 | public static BSShape GetReference(BSScene physicsScene, bool forceRebuild, BSPhysObject prim) | ||
971 | { | ||
972 | float lod; | ||
973 | System.UInt64 newMeshKey = BSShape.ComputeShapeKey(prim.Size, prim.BaseShape, out lod); | ||
974 | |||
975 | physicsScene.DetailLog("{0},BSShapeGImpact,getReference,newKey={1},size={2},lod={3}", | ||
976 | prim.LocalID, newMeshKey.ToString("X"), prim.Size, lod); | ||
977 | |||
978 | BSShapeGImpact retGImpact = null; | ||
979 | lock (GImpacts) | ||
980 | { | ||
981 | if (GImpacts.TryGetValue(newMeshKey, out retGImpact)) | ||
982 | { | ||
983 | // The mesh has already been created. Return a new reference to same. | ||
984 | retGImpact.IncrementReference(); | ||
985 | } | ||
986 | else | ||
987 | { | ||
988 | retGImpact = new BSShapeGImpact(new BulletShape()); | ||
989 | BulletShape newShape = retGImpact.CreatePhysicalGImpact(physicsScene, prim, newMeshKey, prim.BaseShape, prim.Size, lod); | ||
990 | |||
991 | // Check to see if mesh was created (might require an asset). | ||
992 | newShape = VerifyMeshCreated(physicsScene, newShape, prim); | ||
993 | if (!newShape.isNativeShape || prim.PrimAssetState == BSPhysObject.PrimAssetCondition.Failed) | ||
994 | { | ||
995 | // If a mesh was what was created, remember the built shape for later sharing. | ||
996 | // Also note that if meshing failed we put it in the mesh list as there is nothing else to do about the mesh. | ||
997 | GImpacts.Add(newMeshKey, retGImpact); | ||
998 | } | ||
999 | |||
1000 | retGImpact.physShapeInfo = newShape; | ||
1001 | } | ||
1002 | } | ||
1003 | return retGImpact; | ||
1004 | } | ||
1005 | |||
1006 | private BulletShape CreatePhysicalGImpact(BSScene physicsScene, BSPhysObject prim, System.UInt64 newMeshKey, | ||
1007 | PrimitiveBaseShape pbs, OMV.Vector3 size, float lod) | ||
1008 | { | ||
1009 | return BSShapeMesh.CreatePhysicalMeshShape(physicsScene, prim, newMeshKey, pbs, size, lod, | ||
1010 | (w, iC, i, vC, v) => physicsScene.PE.CreateGImpactShape(w, iC, i, vC, v) ); | ||
1011 | } | ||
1012 | |||
1013 | public override BSShape GetReference(BSScene physicsScene, BSPhysObject prim) | ||
1014 | { | ||
1015 | // Calling this reference means we want another handle to an existing shape | ||
1016 | // (usually linksets) so return this copy. | ||
1017 | IncrementReference(); | ||
1018 | return this; | ||
1019 | } | ||
1020 | // Dereferencing a compound shape releases the hold on all the child shapes. | ||
1021 | public override void Dereference(BSScene physicsScene) | ||
1022 | { | ||
1023 | lock (GImpacts) | ||
1024 | { | ||
1025 | this.DecrementReference(); | ||
1026 | physicsScene.DetailLog("{0},BSShapeGImpact.Dereference,shape={1}", BSScene.DetailLogZero, this); | ||
1027 | // TODO: schedule aging and destruction of unused meshes. | ||
1028 | } | ||
1029 | } | ||
1030 | // Loop through all the known hulls and return the description based on the physical address. | ||
1031 | public static bool TryGetGImpactByPtr(BulletShape pShape, out BSShapeGImpact outHull) | ||
1032 | { | ||
1033 | bool ret = false; | ||
1034 | BSShapeGImpact foundDesc = null; | ||
1035 | lock (GImpacts) | ||
1036 | { | ||
1037 | foreach (BSShapeGImpact sh in GImpacts.Values) | ||
1038 | { | ||
1039 | if (sh.physShapeInfo.ReferenceSame(pShape)) | ||
1040 | { | ||
1041 | foundDesc = sh; | ||
1042 | ret = true; | ||
1043 | break; | ||
1044 | } | ||
1045 | |||
1046 | } | ||
1047 | } | ||
1048 | outHull = foundDesc; | ||
1049 | return ret; | ||
1050 | } | ||
1051 | } | ||
940 | 1052 | ||
941 | // ============================================================================================================ | 1053 | // ============================================================================================================ |
942 | public class BSShapeAvatar : BSShape | 1054 | public class BSShapeAvatar : BSShape |