diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs | 430 |
1 files changed, 355 insertions, 75 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs b/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs index f6b4359..17ebed2 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs | |||
@@ -81,11 +81,11 @@ private sealed class BulletBodyXNA : BulletBody | |||
81 | private sealed class BulletShapeXNA : BulletShape | 81 | private sealed class BulletShapeXNA : BulletShape |
82 | { | 82 | { |
83 | public CollisionShape shape; | 83 | public CollisionShape shape; |
84 | public BulletShapeXNA(CollisionShape xx, BSPhysicsShapeType typ) | 84 | public BulletShapeXNA(CollisionShape xx, BSPhysicsShapeType typ) |
85 | : base() | 85 | : base() |
86 | { | 86 | { |
87 | shape = xx; | 87 | shape = xx; |
88 | type = typ; | 88 | shapeType = typ; |
89 | } | 89 | } |
90 | public override bool HasPhysicalShape | 90 | public override bool HasPhysicalShape |
91 | { | 91 | { |
@@ -97,7 +97,7 @@ private sealed class BulletShapeXNA : BulletShape | |||
97 | } | 97 | } |
98 | public override BulletShape Clone() | 98 | public override BulletShape Clone() |
99 | { | 99 | { |
100 | return new BulletShapeXNA(shape, type); | 100 | return new BulletShapeXNA(shape, shapeType); |
101 | } | 101 | } |
102 | public override bool ReferenceSame(BulletShape other) | 102 | public override bool ReferenceSame(BulletShape other) |
103 | { | 103 | { |
@@ -137,8 +137,8 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
137 | internal int LastEntityProperty = 0; | 137 | internal int LastEntityProperty = 0; |
138 | 138 | ||
139 | internal EntityProperties[] UpdatedObjects; | 139 | internal EntityProperties[] UpdatedObjects; |
140 | internal Dictionary<uint, GhostObject> specialCollisionObjects; | 140 | internal Dictionary<uint, GhostObject> specialCollisionObjects; |
141 | 141 | ||
142 | private static int m_collisionsThisFrame; | 142 | private static int m_collisionsThisFrame; |
143 | private BSScene PhysicsScene { get; set; } | 143 | private BSScene PhysicsScene { get; set; } |
144 | 144 | ||
@@ -151,7 +151,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
151 | } | 151 | } |
152 | 152 | ||
153 | /// <summary> | 153 | /// <summary> |
154 | /// | 154 | /// |
155 | /// </summary> | 155 | /// </summary> |
156 | /// <param name="p"></param> | 156 | /// <param name="p"></param> |
157 | /// <param name="p_2"></param> | 157 | /// <param name="p_2"></param> |
@@ -169,12 +169,25 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
169 | return true; | 169 | return true; |
170 | } | 170 | } |
171 | 171 | ||
172 | public override bool ClearCollisionProxyCache(BulletWorld pWorld, BulletBody pBody) | ||
173 | { | ||
174 | DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; | ||
175 | RigidBody body = ((BulletBodyXNA)pBody).rigidBody; | ||
176 | CollisionObject collisionObject = ((BulletBodyXNA)pBody).body; | ||
177 | if (body != null && collisionObject != null && collisionObject.GetBroadphaseHandle() != null) | ||
178 | { | ||
179 | world.RemoveCollisionObject(collisionObject); | ||
180 | world.AddCollisionObject(collisionObject); | ||
181 | } | ||
182 | return true; | ||
183 | } | ||
184 | |||
172 | public override bool AddConstraintToWorld(BulletWorld pWorld, BulletConstraint pConstraint, bool pDisableCollisionsBetweenLinkedObjects) | 185 | public override bool AddConstraintToWorld(BulletWorld pWorld, BulletConstraint pConstraint, bool pDisableCollisionsBetweenLinkedObjects) |
173 | { | 186 | { |
174 | DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; | 187 | DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; |
175 | TypedConstraint constraint = (pConstraint as BulletConstraintXNA).constrain; | 188 | TypedConstraint constraint = (pConstraint as BulletConstraintXNA).constrain; |
176 | world.AddConstraint(constraint, pDisableCollisionsBetweenLinkedObjects); | 189 | world.AddConstraint(constraint, pDisableCollisionsBetweenLinkedObjects); |
177 | 190 | ||
178 | return true; | 191 | return true; |
179 | 192 | ||
180 | } | 193 | } |
@@ -300,7 +313,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
300 | public override bool GetForceUpdateAllAabbs(BulletWorld pWorld) { | 313 | public override bool GetForceUpdateAllAabbs(BulletWorld pWorld) { |
301 | DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; | 314 | DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; |
302 | return world.GetForceUpdateAllAabbs(); | 315 | return world.GetForceUpdateAllAabbs(); |
303 | 316 | ||
304 | } | 317 | } |
305 | public override void SetForceUpdateAllAabbs(BulletWorld pWorld, bool pForce) | 318 | public override void SetForceUpdateAllAabbs(BulletWorld pWorld, bool pForce) |
306 | { | 319 | { |
@@ -404,7 +417,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
404 | IndexedMatrix mat = IndexedMatrix.CreateFromQuaternion(vquaternion); | 417 | IndexedMatrix mat = IndexedMatrix.CreateFromQuaternion(vquaternion); |
405 | mat._origin = vposition; | 418 | mat._origin = vposition; |
406 | collisionObject.SetWorldTransform(mat); | 419 | collisionObject.SetWorldTransform(mat); |
407 | 420 | ||
408 | } | 421 | } |
409 | 422 | ||
410 | public override Vector3 GetPosition(BulletBody pCollisionObject) | 423 | public override Vector3 GetPosition(BulletBody pCollisionObject) |
@@ -457,7 +470,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
457 | { | 470 | { |
458 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; | 471 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; |
459 | collisionObject.Activate(pforceactivation); | 472 | collisionObject.Activate(pforceactivation); |
460 | 473 | ||
461 | } | 474 | } |
462 | 475 | ||
463 | public override Quaternion GetOrientation(BulletBody pCollisionObject) | 476 | public override Quaternion GetOrientation(BulletBody pCollisionObject) |
@@ -486,7 +499,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
486 | { | 499 | { |
487 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; | 500 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; |
488 | return collisionObject.GetCcdSweptSphereRadius(); | 501 | return collisionObject.GetCcdSweptSphereRadius(); |
489 | 502 | ||
490 | } | 503 | } |
491 | 504 | ||
492 | public override IntPtr GetUserPointer(BulletBody pCollisionObject) | 505 | public override IntPtr GetUserPointer(BulletBody pCollisionObject) |
@@ -559,8 +572,8 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
559 | } | 572 | } |
560 | 573 | ||
561 | 574 | ||
562 | public override BulletConstraint Create6DofConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2, | 575 | public override BulletConstraint Create6DofConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2, |
563 | Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot, | 576 | Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot, |
564 | bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies) | 577 | bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies) |
565 | 578 | ||
566 | { | 579 | { |
@@ -604,7 +617,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
604 | } | 617 | } |
605 | 618 | ||
606 | /// <summary> | 619 | /// <summary> |
607 | /// | 620 | /// |
608 | /// </summary> | 621 | /// </summary> |
609 | /// <param name="pWorld"></param> | 622 | /// <param name="pWorld"></param> |
610 | /// <param name="pBody1"></param> | 623 | /// <param name="pBody1"></param> |
@@ -752,6 +765,214 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
752 | constraint.SetBreakingImpulseThreshold(threshold); | 765 | constraint.SetBreakingImpulseThreshold(threshold); |
753 | return true; | 766 | return true; |
754 | } | 767 | } |
768 | public override bool HingeSetLimits(BulletConstraint pConstraint, float low, float high, float softness, float bias, float relaxation) | ||
769 | { | ||
770 | HingeConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as HingeConstraint; | ||
771 | if (softness == HINGE_NOT_SPECIFIED) | ||
772 | constraint.SetLimit(low, high); | ||
773 | else | ||
774 | constraint.SetLimit(low, high, softness, bias, relaxation); | ||
775 | return true; | ||
776 | } | ||
777 | public override bool SpringEnable(BulletConstraint pConstraint, int index, float numericTrueFalse) | ||
778 | { | ||
779 | Generic6DofSpringConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofSpringConstraint; | ||
780 | constraint.EnableSpring(index, (numericTrueFalse == 0f ? false : true)); | ||
781 | return true; | ||
782 | } | ||
783 | |||
784 | public override bool SpringSetEquilibriumPoint(BulletConstraint pConstraint, int index, float equilibriumPoint) | ||
785 | { | ||
786 | Generic6DofSpringConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofSpringConstraint; | ||
787 | if (index == SPRING_NOT_SPECIFIED) | ||
788 | { | ||
789 | constraint.SetEquilibriumPoint(); | ||
790 | } | ||
791 | else | ||
792 | { | ||
793 | if (equilibriumPoint == SPRING_NOT_SPECIFIED) | ||
794 | constraint.SetEquilibriumPoint(index); | ||
795 | else | ||
796 | constraint.SetEquilibriumPoint(index, equilibriumPoint); | ||
797 | } | ||
798 | return true; | ||
799 | } | ||
800 | |||
801 | public override bool SpringSetStiffness(BulletConstraint pConstraint, int index, float stiffness) | ||
802 | { | ||
803 | Generic6DofSpringConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofSpringConstraint; | ||
804 | constraint.SetStiffness(index, stiffness); | ||
805 | return true; | ||
806 | } | ||
807 | |||
808 | public override bool SpringSetDamping(BulletConstraint pConstraint, int index, float damping) | ||
809 | { | ||
810 | Generic6DofSpringConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofSpringConstraint; | ||
811 | constraint.SetDamping(index, damping); | ||
812 | return true; | ||
813 | } | ||
814 | |||
815 | public override bool SliderSetLimits(BulletConstraint pConstraint, int lowerUpper, int linAng, float val) | ||
816 | { | ||
817 | SliderConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as SliderConstraint; | ||
818 | switch (lowerUpper) | ||
819 | { | ||
820 | case SLIDER_LOWER_LIMIT: | ||
821 | switch (linAng) | ||
822 | { | ||
823 | case SLIDER_LINEAR: | ||
824 | constraint.SetLowerLinLimit(val); | ||
825 | break; | ||
826 | case SLIDER_ANGULAR: | ||
827 | constraint.SetLowerAngLimit(val); | ||
828 | break; | ||
829 | } | ||
830 | break; | ||
831 | case SLIDER_UPPER_LIMIT: | ||
832 | switch (linAng) | ||
833 | { | ||
834 | case SLIDER_LINEAR: | ||
835 | constraint.SetUpperLinLimit(val); | ||
836 | break; | ||
837 | case SLIDER_ANGULAR: | ||
838 | constraint.SetUpperAngLimit(val); | ||
839 | break; | ||
840 | } | ||
841 | break; | ||
842 | } | ||
843 | return true; | ||
844 | } | ||
845 | public override bool SliderSet(BulletConstraint pConstraint, int softRestDamp, int dirLimOrtho, int linAng, float val) | ||
846 | { | ||
847 | SliderConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as SliderConstraint; | ||
848 | switch (softRestDamp) | ||
849 | { | ||
850 | case SLIDER_SET_SOFTNESS: | ||
851 | switch (dirLimOrtho) | ||
852 | { | ||
853 | case SLIDER_SET_DIRECTION: | ||
854 | switch (linAng) | ||
855 | { | ||
856 | case SLIDER_LINEAR: constraint.SetSoftnessDirLin(val); break; | ||
857 | case SLIDER_ANGULAR: constraint.SetSoftnessDirAng(val); break; | ||
858 | } | ||
859 | break; | ||
860 | case SLIDER_SET_LIMIT: | ||
861 | switch (linAng) | ||
862 | { | ||
863 | case SLIDER_LINEAR: constraint.SetSoftnessLimLin(val); break; | ||
864 | case SLIDER_ANGULAR: constraint.SetSoftnessLimAng(val); break; | ||
865 | } | ||
866 | break; | ||
867 | case SLIDER_SET_ORTHO: | ||
868 | switch (linAng) | ||
869 | { | ||
870 | case SLIDER_LINEAR: constraint.SetSoftnessOrthoLin(val); break; | ||
871 | case SLIDER_ANGULAR: constraint.SetSoftnessOrthoAng(val); break; | ||
872 | } | ||
873 | break; | ||
874 | } | ||
875 | break; | ||
876 | case SLIDER_SET_RESTITUTION: | ||
877 | switch (dirLimOrtho) | ||
878 | { | ||
879 | case SLIDER_SET_DIRECTION: | ||
880 | switch (linAng) | ||
881 | { | ||
882 | case SLIDER_LINEAR: constraint.SetRestitutionDirLin(val); break; | ||
883 | case SLIDER_ANGULAR: constraint.SetRestitutionDirAng(val); break; | ||
884 | } | ||
885 | break; | ||
886 | case SLIDER_SET_LIMIT: | ||
887 | switch (linAng) | ||
888 | { | ||
889 | case SLIDER_LINEAR: constraint.SetRestitutionLimLin(val); break; | ||
890 | case SLIDER_ANGULAR: constraint.SetRestitutionLimAng(val); break; | ||
891 | } | ||
892 | break; | ||
893 | case SLIDER_SET_ORTHO: | ||
894 | switch (linAng) | ||
895 | { | ||
896 | case SLIDER_LINEAR: constraint.SetRestitutionOrthoLin(val); break; | ||
897 | case SLIDER_ANGULAR: constraint.SetRestitutionOrthoAng(val); break; | ||
898 | } | ||
899 | break; | ||
900 | } | ||
901 | break; | ||
902 | case SLIDER_SET_DAMPING: | ||
903 | switch (dirLimOrtho) | ||
904 | { | ||
905 | case SLIDER_SET_DIRECTION: | ||
906 | switch (linAng) | ||
907 | { | ||
908 | case SLIDER_LINEAR: constraint.SetDampingDirLin(val); break; | ||
909 | case SLIDER_ANGULAR: constraint.SetDampingDirAng(val); break; | ||
910 | } | ||
911 | break; | ||
912 | case SLIDER_SET_LIMIT: | ||
913 | switch (linAng) | ||
914 | { | ||
915 | case SLIDER_LINEAR: constraint.SetDampingLimLin(val); break; | ||
916 | case SLIDER_ANGULAR: constraint.SetDampingLimAng(val); break; | ||
917 | } | ||
918 | break; | ||
919 | case SLIDER_SET_ORTHO: | ||
920 | switch (linAng) | ||
921 | { | ||
922 | case SLIDER_LINEAR: constraint.SetDampingOrthoLin(val); break; | ||
923 | case SLIDER_ANGULAR: constraint.SetDampingOrthoAng(val); break; | ||
924 | } | ||
925 | break; | ||
926 | } | ||
927 | break; | ||
928 | } | ||
929 | return true; | ||
930 | } | ||
931 | public override bool SliderMotorEnable(BulletConstraint pConstraint, int linAng, float numericTrueFalse) | ||
932 | { | ||
933 | SliderConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as SliderConstraint; | ||
934 | switch (linAng) | ||
935 | { | ||
936 | case SLIDER_LINEAR: | ||
937 | constraint.SetPoweredLinMotor(numericTrueFalse == 0.0 ? false : true); | ||
938 | break; | ||
939 | case SLIDER_ANGULAR: | ||
940 | constraint.SetPoweredAngMotor(numericTrueFalse == 0.0 ? false : true); | ||
941 | break; | ||
942 | } | ||
943 | return true; | ||
944 | } | ||
945 | public override bool SliderMotor(BulletConstraint pConstraint, int forceVel, int linAng, float val) | ||
946 | { | ||
947 | SliderConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as SliderConstraint; | ||
948 | switch (forceVel) | ||
949 | { | ||
950 | case SLIDER_MOTOR_VELOCITY: | ||
951 | switch (linAng) | ||
952 | { | ||
953 | case SLIDER_LINEAR: | ||
954 | constraint.SetTargetLinMotorVelocity(val); | ||
955 | break; | ||
956 | case SLIDER_ANGULAR: | ||
957 | constraint.SetTargetAngMotorVelocity(val); | ||
958 | break; | ||
959 | } | ||
960 | break; | ||
961 | case SLIDER_MAX_MOTOR_FORCE: | ||
962 | switch (linAng) | ||
963 | { | ||
964 | case SLIDER_LINEAR: | ||
965 | constraint.SetMaxLinMotorForce(val); | ||
966 | break; | ||
967 | case SLIDER_ANGULAR: | ||
968 | constraint.SetMaxAngMotorForce(val); | ||
969 | break; | ||
970 | } | ||
971 | break; | ||
972 | } | ||
973 | return true; | ||
974 | } | ||
975 | |||
755 | //BulletSimAPI.SetAngularDamping(Prim.PhysBody.ptr, angularDamping); | 976 | //BulletSimAPI.SetAngularDamping(Prim.PhysBody.ptr, angularDamping); |
756 | public override void SetAngularDamping(BulletBody pBody, float angularDamping) | 977 | public override void SetAngularDamping(BulletBody pBody, float angularDamping) |
757 | { | 978 | { |
@@ -824,7 +1045,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
824 | { | 1045 | { |
825 | RigidBody body = (pBody as BulletBodyXNA).rigidBody; | 1046 | RigidBody body = (pBody as BulletBodyXNA).rigidBody; |
826 | float angularDamping = body.GetAngularDamping(); | 1047 | float angularDamping = body.GetAngularDamping(); |
827 | body.SetDamping(lin_damping, angularDamping); | 1048 | body.SetDamping(lin_damping, angularDamping); |
828 | } | 1049 | } |
829 | 1050 | ||
830 | public override float GetLinearDamping(BulletBody pBody) | 1051 | public override float GetLinearDamping(BulletBody pBody) |
@@ -907,7 +1128,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
907 | RigidBody bo = co as RigidBody; | 1128 | RigidBody bo = co as RigidBody; |
908 | if (bo == null) | 1129 | if (bo == null) |
909 | { | 1130 | { |
910 | 1131 | ||
911 | if (world.IsInWorld(co)) | 1132 | if (world.IsInWorld(co)) |
912 | { | 1133 | { |
913 | world.RemoveCollisionObject(co); | 1134 | world.RemoveCollisionObject(co); |
@@ -915,7 +1136,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
915 | } | 1136 | } |
916 | else | 1137 | else |
917 | { | 1138 | { |
918 | 1139 | ||
919 | if (world.IsInWorld(bo)) | 1140 | if (world.IsInWorld(bo)) |
920 | { | 1141 | { |
921 | world.RemoveRigidBody(bo); | 1142 | world.RemoveRigidBody(bo); |
@@ -947,7 +1168,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
947 | 1168 | ||
948 | // TODO: Turn this from a reference copy to a Value Copy. | 1169 | // TODO: Turn this from a reference copy to a Value Copy. |
949 | BulletShapeXNA shape2 = new BulletShapeXNA(shape1, BSShapeTypeFromBroadPhaseNativeType(shape1.GetShapeType())); | 1170 | BulletShapeXNA shape2 = new BulletShapeXNA(shape1, BSShapeTypeFromBroadPhaseNativeType(shape1.GetShapeType())); |
950 | 1171 | ||
951 | return shape2; | 1172 | return shape2; |
952 | } | 1173 | } |
953 | 1174 | ||
@@ -957,7 +1178,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
957 | return false; | 1178 | return false; |
958 | } | 1179 | } |
959 | //(sim.ptr, shape.ptr, prim.LocalID, prim.RawPosition, prim.RawOrientation); | 1180 | //(sim.ptr, shape.ptr, prim.LocalID, prim.RawPosition, prim.RawOrientation); |
960 | 1181 | ||
961 | public override BulletBody CreateBodyFromShape(BulletWorld pWorld, BulletShape pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation) | 1182 | public override BulletBody CreateBodyFromShape(BulletWorld pWorld, BulletShape pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation) |
962 | { | 1183 | { |
963 | CollisionWorld world = (pWorld as BulletWorldXNA).world; | 1184 | CollisionWorld world = (pWorld as BulletWorldXNA).world; |
@@ -993,11 +1214,11 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
993 | m_startWorldTransform = IndexedMatrix.Identity; | 1214 | m_startWorldTransform = IndexedMatrix.Identity; |
994 | */ | 1215 | */ |
995 | body.SetUserPointer(pLocalID); | 1216 | body.SetUserPointer(pLocalID); |
996 | 1217 | ||
997 | return new BulletBodyXNA(pLocalID, body); | 1218 | return new BulletBodyXNA(pLocalID, body); |
998 | } | 1219 | } |
999 | 1220 | ||
1000 | 1221 | ||
1001 | public override BulletBody CreateBodyWithDefaultMotionState( BulletShape pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation) | 1222 | public override BulletBody CreateBodyWithDefaultMotionState( BulletShape pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation) |
1002 | { | 1223 | { |
1003 | 1224 | ||
@@ -1025,7 +1246,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1025 | public override Vector3 GetAnisotripicFriction(BulletConstraint pconstrain) | 1246 | public override Vector3 GetAnisotripicFriction(BulletConstraint pconstrain) |
1026 | { | 1247 | { |
1027 | 1248 | ||
1028 | /* TODO */ | 1249 | /* TODO */ |
1029 | return Vector3.Zero; | 1250 | return Vector3.Zero; |
1030 | } | 1251 | } |
1031 | public override Vector3 SetAnisotripicFriction(BulletConstraint pconstrain, Vector3 frict) { /* TODO */ return Vector3.Zero; } | 1252 | public override Vector3 SetAnisotripicFriction(BulletConstraint pconstrain, Vector3 frict) { /* TODO */ return Vector3.Zero; } |
@@ -1035,7 +1256,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1035 | { | 1256 | { |
1036 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; | 1257 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; |
1037 | return collisionObject.IsStaticObject(); | 1258 | return collisionObject.IsStaticObject(); |
1038 | 1259 | ||
1039 | } | 1260 | } |
1040 | public override bool IsKinematicObject(BulletBody pCollisionObject) | 1261 | public override bool IsKinematicObject(BulletBody pCollisionObject) |
1041 | { | 1262 | { |
@@ -1098,10 +1319,10 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1098 | return new BulletWorldXNA(1, PhysicsScene, BSAPIXNA.Initialize2(worldExtent, configparms, maxCollisions, ref collisionArray, maxUpdates, ref updateArray, null)); | 1319 | return new BulletWorldXNA(1, PhysicsScene, BSAPIXNA.Initialize2(worldExtent, configparms, maxCollisions, ref collisionArray, maxUpdates, ref updateArray, null)); |
1099 | } | 1320 | } |
1100 | 1321 | ||
1101 | private static DiscreteDynamicsWorld Initialize2(Vector3 worldExtent, | 1322 | private static DiscreteDynamicsWorld Initialize2(Vector3 worldExtent, |
1102 | ConfigurationParameters[] o, | 1323 | ConfigurationParameters[] o, |
1103 | int mMaxCollisionsPerFrame, ref CollisionDesc[] collisionArray, | 1324 | int mMaxCollisionsPerFrame, ref CollisionDesc[] collisionArray, |
1104 | int mMaxUpdatesPerFrame, ref EntityProperties[] updateArray, | 1325 | int mMaxUpdatesPerFrame, ref EntityProperties[] updateArray, |
1105 | object mDebugLogCallbackHandle) | 1326 | object mDebugLogCallbackHandle) |
1106 | { | 1327 | { |
1107 | CollisionWorld.WorldData.ParamData p = new CollisionWorld.WorldData.ParamData(); | 1328 | CollisionWorld.WorldData.ParamData p = new CollisionWorld.WorldData.ParamData(); |
@@ -1138,9 +1359,9 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1138 | p.avatarCapsuleDepth = BSParam.AvatarCapsuleDepth; | 1359 | p.avatarCapsuleDepth = BSParam.AvatarCapsuleDepth; |
1139 | p.avatarCapsuleHeight = BSParam.AvatarCapsuleHeight; | 1360 | p.avatarCapsuleHeight = BSParam.AvatarCapsuleHeight; |
1140 | p.avatarContactProcessingThreshold = BSParam.AvatarContactProcessingThreshold; | 1361 | p.avatarContactProcessingThreshold = BSParam.AvatarContactProcessingThreshold; |
1141 | 1362 | ||
1142 | p.vehicleAngularDamping = BSParam.VehicleAngularDamping; | 1363 | p.vehicleAngularDamping = BSParam.VehicleAngularDamping; |
1143 | 1364 | ||
1144 | p.maxPersistantManifoldPoolSize = o[0].maxPersistantManifoldPoolSize; | 1365 | p.maxPersistantManifoldPoolSize = o[0].maxPersistantManifoldPoolSize; |
1145 | p.maxCollisionAlgorithmPoolSize = o[0].maxCollisionAlgorithmPoolSize; | 1366 | p.maxCollisionAlgorithmPoolSize = o[0].maxCollisionAlgorithmPoolSize; |
1146 | p.shouldDisableContactPoolDynamicAllocation = o[0].shouldDisableContactPoolDynamicAllocation; | 1367 | p.shouldDisableContactPoolDynamicAllocation = o[0].shouldDisableContactPoolDynamicAllocation; |
@@ -1160,7 +1381,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1160 | p.linkConstraintSolverIterations = BSParam.LinkConstraintSolverIterations; | 1381 | p.linkConstraintSolverIterations = BSParam.LinkConstraintSolverIterations; |
1161 | p.physicsLoggingFrames = o[0].physicsLoggingFrames; | 1382 | p.physicsLoggingFrames = o[0].physicsLoggingFrames; |
1162 | DefaultCollisionConstructionInfo ccci = new DefaultCollisionConstructionInfo(); | 1383 | DefaultCollisionConstructionInfo ccci = new DefaultCollisionConstructionInfo(); |
1163 | 1384 | ||
1164 | DefaultCollisionConfiguration cci = new DefaultCollisionConfiguration(); | 1385 | DefaultCollisionConfiguration cci = new DefaultCollisionConfiguration(); |
1165 | CollisionDispatcher m_dispatcher = new CollisionDispatcher(cci); | 1386 | CollisionDispatcher m_dispatcher = new CollisionDispatcher(cci); |
1166 | 1387 | ||
@@ -1221,6 +1442,50 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1221 | //BSParam.TerrainImplementation = 0; | 1442 | //BSParam.TerrainImplementation = 0; |
1222 | world.SetGravity(new IndexedVector3(0,0,p.gravity)); | 1443 | world.SetGravity(new IndexedVector3(0,0,p.gravity)); |
1223 | 1444 | ||
1445 | // Turn off Pooling since globals and pooling are bad for threading. | ||
1446 | BulletGlobals.VoronoiSimplexSolverPool.SetPoolingEnabled(false); | ||
1447 | BulletGlobals.SubSimplexConvexCastPool.SetPoolingEnabled(false); | ||
1448 | BulletGlobals.ManifoldPointPool.SetPoolingEnabled(false); | ||
1449 | BulletGlobals.CastResultPool.SetPoolingEnabled(false); | ||
1450 | BulletGlobals.SphereShapePool.SetPoolingEnabled(false); | ||
1451 | BulletGlobals.DbvtNodePool.SetPoolingEnabled(false); | ||
1452 | BulletGlobals.SingleRayCallbackPool.SetPoolingEnabled(false); | ||
1453 | BulletGlobals.SubSimplexClosestResultPool.SetPoolingEnabled(false); | ||
1454 | BulletGlobals.GjkPairDetectorPool.SetPoolingEnabled(false); | ||
1455 | BulletGlobals.DbvtTreeColliderPool.SetPoolingEnabled(false); | ||
1456 | BulletGlobals.SingleSweepCallbackPool.SetPoolingEnabled(false); | ||
1457 | BulletGlobals.BroadphaseRayTesterPool.SetPoolingEnabled(false); | ||
1458 | BulletGlobals.ClosestNotMeConvexResultCallbackPool.SetPoolingEnabled(false); | ||
1459 | BulletGlobals.GjkEpaPenetrationDepthSolverPool.SetPoolingEnabled(false); | ||
1460 | BulletGlobals.ContinuousConvexCollisionPool.SetPoolingEnabled(false); | ||
1461 | BulletGlobals.DbvtStackDataBlockPool.SetPoolingEnabled(false); | ||
1462 | |||
1463 | BulletGlobals.BoxBoxCollisionAlgorithmPool.SetPoolingEnabled(false); | ||
1464 | BulletGlobals.CompoundCollisionAlgorithmPool.SetPoolingEnabled(false); | ||
1465 | BulletGlobals.ConvexConcaveCollisionAlgorithmPool.SetPoolingEnabled(false); | ||
1466 | BulletGlobals.ConvexConvexAlgorithmPool.SetPoolingEnabled(false); | ||
1467 | BulletGlobals.ConvexPlaneAlgorithmPool.SetPoolingEnabled(false); | ||
1468 | BulletGlobals.SphereBoxCollisionAlgorithmPool.SetPoolingEnabled(false); | ||
1469 | BulletGlobals.SphereSphereCollisionAlgorithmPool.SetPoolingEnabled(false); | ||
1470 | BulletGlobals.SphereTriangleCollisionAlgorithmPool.SetPoolingEnabled(false); | ||
1471 | BulletGlobals.GImpactCollisionAlgorithmPool.SetPoolingEnabled(false); | ||
1472 | BulletGlobals.GjkEpaSolver2MinkowskiDiffPool.SetPoolingEnabled(false); | ||
1473 | BulletGlobals.PersistentManifoldPool.SetPoolingEnabled(false); | ||
1474 | BulletGlobals.ManifoldResultPool.SetPoolingEnabled(false); | ||
1475 | BulletGlobals.GJKPool.SetPoolingEnabled(false); | ||
1476 | BulletGlobals.GIM_ShapeRetrieverPool.SetPoolingEnabled(false); | ||
1477 | BulletGlobals.TriangleShapePool.SetPoolingEnabled(false); | ||
1478 | BulletGlobals.SphereTriangleDetectorPool.SetPoolingEnabled(false); | ||
1479 | BulletGlobals.CompoundLeafCallbackPool.SetPoolingEnabled(false); | ||
1480 | BulletGlobals.GjkConvexCastPool.SetPoolingEnabled(false); | ||
1481 | BulletGlobals.LocalTriangleSphereCastCallbackPool.SetPoolingEnabled(false); | ||
1482 | BulletGlobals.BridgeTriangleRaycastCallbackPool.SetPoolingEnabled(false); | ||
1483 | BulletGlobals.BridgeTriangleConcaveRaycastCallbackPool.SetPoolingEnabled(false); | ||
1484 | BulletGlobals.BridgeTriangleConvexcastCallbackPool.SetPoolingEnabled(false); | ||
1485 | BulletGlobals.MyNodeOverlapCallbackPool.SetPoolingEnabled(false); | ||
1486 | BulletGlobals.ClosestRayResultCallbackPool.SetPoolingEnabled(false); | ||
1487 | BulletGlobals.DebugDrawcallbackPool.SetPoolingEnabled(false); | ||
1488 | |||
1224 | return world; | 1489 | return world; |
1225 | } | 1490 | } |
1226 | //m_constraint.ptr, ConstraintParams.BT_CONSTRAINT_STOP_CFM, cfm, ConstraintParamAxis.AXIS_ALL | 1491 | //m_constraint.ptr, ConstraintParams.BT_CONSTRAINT_STOP_CFM, cfm, ConstraintParamAxis.AXIS_ALL |
@@ -1263,7 +1528,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1263 | } | 1528 | } |
1264 | } | 1529 | } |
1265 | return ret; | 1530 | return ret; |
1266 | 1531 | ||
1267 | } | 1532 | } |
1268 | 1533 | ||
1269 | public override float GetAngularMotionDisc(BulletShape pShape) | 1534 | public override float GetAngularMotionDisc(BulletShape pShape) |
@@ -1353,10 +1618,10 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1353 | CollisionShape shape = (pShape as BulletShapeXNA).shape; | 1618 | CollisionShape shape = (pShape as BulletShapeXNA).shape; |
1354 | gObj.SetCollisionShape(shape); | 1619 | gObj.SetCollisionShape(shape); |
1355 | gObj.SetUserPointer(pLocalID); | 1620 | gObj.SetUserPointer(pLocalID); |
1356 | 1621 | ||
1357 | if (specialCollisionObjects.ContainsKey(pLocalID)) | 1622 | if (specialCollisionObjects.ContainsKey(pLocalID)) |
1358 | specialCollisionObjects[pLocalID] = gObj; | 1623 | specialCollisionObjects[pLocalID] = gObj; |
1359 | else | 1624 | else |
1360 | specialCollisionObjects.Add(pLocalID, gObj); | 1625 | specialCollisionObjects.Add(pLocalID, gObj); |
1361 | 1626 | ||
1362 | // TODO: Add to Special CollisionObjects! | 1627 | // TODO: Add to Special CollisionObjects! |
@@ -1447,8 +1712,8 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1447 | return new BulletShapeXNA(ret, BSShapeTypeFromBroadPhaseNativeType(ret.GetShapeType())); | 1712 | return new BulletShapeXNA(ret, BSShapeTypeFromBroadPhaseNativeType(ret.GetShapeType())); |
1448 | } | 1713 | } |
1449 | 1714 | ||
1450 | public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx) { | 1715 | public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx) { |
1451 | 1716 | ||
1452 | if (cShape == null) | 1717 | if (cShape == null) |
1453 | return null; | 1718 | return null; |
1454 | CompoundShape compoundShape = (cShape as BulletShapeXNA).shape as CompoundShape; | 1719 | CompoundShape compoundShape = (cShape as BulletShapeXNA).shape as CompoundShape; |
@@ -1456,7 +1721,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1456 | BulletShape retShape = new BulletShapeXNA(shape, BSShapeTypeFromBroadPhaseNativeType(shape.GetShapeType())); | 1721 | BulletShape retShape = new BulletShapeXNA(shape, BSShapeTypeFromBroadPhaseNativeType(shape.GetShapeType())); |
1457 | 1722 | ||
1458 | 1723 | ||
1459 | return retShape; | 1724 | return retShape; |
1460 | } | 1725 | } |
1461 | 1726 | ||
1462 | public BSPhysicsShapeType BSShapeTypeFromBroadPhaseNativeType(BroadphaseNativeTypes pin) | 1727 | public BSPhysicsShapeType BSShapeTypeFromBroadPhaseNativeType(BroadphaseNativeTypes pin) |
@@ -1475,7 +1740,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1475 | ret = BSPhysicsShapeType.SHAPE_UNKNOWN; | 1740 | ret = BSPhysicsShapeType.SHAPE_UNKNOWN; |
1476 | break; | 1741 | break; |
1477 | case BroadphaseNativeTypes.CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE: | 1742 | case BroadphaseNativeTypes.CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE: |
1478 | ret = BSPhysicsShapeType.SHAPE_MESH; | 1743 | ret = BSPhysicsShapeType.SHAPE_CONVEXHULL; |
1479 | break; | 1744 | break; |
1480 | case BroadphaseNativeTypes.CONVEX_HULL_SHAPE_PROXYTYPE: | 1745 | case BroadphaseNativeTypes.CONVEX_HULL_SHAPE_PROXYTYPE: |
1481 | ret = BSPhysicsShapeType.SHAPE_HULL; | 1746 | ret = BSPhysicsShapeType.SHAPE_HULL; |
@@ -1503,7 +1768,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1503 | ret = BSPhysicsShapeType.SHAPE_CONE; | 1768 | ret = BSPhysicsShapeType.SHAPE_CONE; |
1504 | break; | 1769 | break; |
1505 | case BroadphaseNativeTypes.CONVEX_SHAPE_PROXYTYPE: | 1770 | case BroadphaseNativeTypes.CONVEX_SHAPE_PROXYTYPE: |
1506 | ret = BSPhysicsShapeType.SHAPE_UNKNOWN; | 1771 | ret = BSPhysicsShapeType.SHAPE_CONVEXHULL; |
1507 | break; | 1772 | break; |
1508 | case BroadphaseNativeTypes.CYLINDER_SHAPE_PROXYTYPE: | 1773 | case BroadphaseNativeTypes.CYLINDER_SHAPE_PROXYTYPE: |
1509 | ret = BSPhysicsShapeType.SHAPE_CYLINDER; | 1774 | ret = BSPhysicsShapeType.SHAPE_CYLINDER; |
@@ -1547,7 +1812,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1547 | break; | 1812 | break; |
1548 | ///Used for GIMPACT Trimesh integration | 1813 | ///Used for GIMPACT Trimesh integration |
1549 | case BroadphaseNativeTypes.GIMPACT_SHAPE_PROXYTYPE: | 1814 | case BroadphaseNativeTypes.GIMPACT_SHAPE_PROXYTYPE: |
1550 | ret = BSPhysicsShapeType.SHAPE_MESH; | 1815 | ret = BSPhysicsShapeType.SHAPE_GIMPACT; |
1551 | break; | 1816 | break; |
1552 | ///Multimaterial mesh | 1817 | ///Multimaterial mesh |
1553 | case BroadphaseNativeTypes.MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE: | 1818 | case BroadphaseNativeTypes.MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE: |
@@ -1598,8 +1863,8 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1598 | return new BulletShapeXNA(m_planeshape, BSPhysicsShapeType.SHAPE_GROUNDPLANE); | 1863 | return new BulletShapeXNA(m_planeshape, BSPhysicsShapeType.SHAPE_GROUNDPLANE); |
1599 | } | 1864 | } |
1600 | 1865 | ||
1601 | public override BulletConstraint Create6DofSpringConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2, | 1866 | public override BulletConstraint Create6DofSpringConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2, |
1602 | Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot, | 1867 | Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot, |
1603 | bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies) | 1868 | bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies) |
1604 | 1869 | ||
1605 | { | 1870 | { |
@@ -1745,7 +2010,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1745 | { | 2010 | { |
1746 | DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; | 2011 | DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; |
1747 | CompoundShape compoundshape = new CompoundShape(false); | 2012 | CompoundShape compoundshape = new CompoundShape(false); |
1748 | 2013 | ||
1749 | compoundshape.SetMargin(world.WorldSettings.Params.collisionMargin); | 2014 | compoundshape.SetMargin(world.WorldSettings.Params.collisionMargin); |
1750 | int ii = 1; | 2015 | int ii = 1; |
1751 | 2016 | ||
@@ -1761,7 +2026,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1761 | int ender = ((ii + 4) + (vertexCount*3)); | 2026 | int ender = ((ii + 4) + (vertexCount*3)); |
1762 | for (int iii = ii + 4; iii < ender; iii+=3) | 2027 | for (int iii = ii + 4; iii < ender; iii+=3) |
1763 | { | 2028 | { |
1764 | 2029 | ||
1765 | virts.Add(new IndexedVector3(pConvHulls[iii], pConvHulls[iii + 1], pConvHulls[iii +2])); | 2030 | virts.Add(new IndexedVector3(pConvHulls[iii], pConvHulls[iii + 1], pConvHulls[iii +2])); |
1766 | } | 2031 | } |
1767 | ConvexHullShape convexShape = new ConvexHullShape(virts, vertexCount); | 2032 | ConvexHullShape convexShape = new ConvexHullShape(virts, vertexCount); |
@@ -1769,7 +2034,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1769 | compoundshape.AddChildShape(ref childTrans, convexShape); | 2034 | compoundshape.AddChildShape(ref childTrans, convexShape); |
1770 | ii += (vertexCount*3 + 4); | 2035 | ii += (vertexCount*3 + 4); |
1771 | } | 2036 | } |
1772 | 2037 | ||
1773 | return new BulletShapeXNA(compoundshape, BSPhysicsShapeType.SHAPE_HULL); | 2038 | return new BulletShapeXNA(compoundshape, BSPhysicsShapeType.SHAPE_HULL); |
1774 | } | 2039 | } |
1775 | 2040 | ||
@@ -1778,16 +2043,26 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1778 | /* TODO */ return null; | 2043 | /* TODO */ return null; |
1779 | } | 2044 | } |
1780 | 2045 | ||
2046 | public override BulletShape BuildConvexHullShapeFromMesh(BulletWorld world, BulletShape meshShape) | ||
2047 | { | ||
2048 | /* TODO */ return null; | ||
2049 | } | ||
2050 | |||
2051 | public override BulletShape CreateConvexHullShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats) | ||
2052 | { | ||
2053 | /* TODO */ return null; | ||
2054 | } | ||
2055 | |||
1781 | public override BulletShape CreateMeshShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats) | 2056 | public override BulletShape CreateMeshShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats) |
1782 | { | 2057 | { |
1783 | //DumpRaw(indices,verticesAsFloats,pIndicesCount,pVerticesCount); | 2058 | //DumpRaw(indices,verticesAsFloats,pIndicesCount,pVerticesCount); |
1784 | 2059 | ||
1785 | for (int iter = 0; iter < pVerticesCount; iter++) | 2060 | for (int iter = 0; iter < pVerticesCount; iter++) |
1786 | { | 2061 | { |
1787 | if (verticesAsFloats[iter] > 0 && verticesAsFloats[iter] < 0.0001) verticesAsFloats[iter] = 0; | 2062 | if (verticesAsFloats[iter] > 0 && verticesAsFloats[iter] < 0.0001) verticesAsFloats[iter] = 0; |
1788 | if (verticesAsFloats[iter] < 0 && verticesAsFloats[iter] > -0.0001) verticesAsFloats[iter] = 0; | 2063 | if (verticesAsFloats[iter] < 0 && verticesAsFloats[iter] > -0.0001) verticesAsFloats[iter] = 0; |
1789 | } | 2064 | } |
1790 | 2065 | ||
1791 | ObjectArray<int> indicesarr = new ObjectArray<int>(indices); | 2066 | ObjectArray<int> indicesarr = new ObjectArray<int>(indices); |
1792 | ObjectArray<float> vertices = new ObjectArray<float>(verticesAsFloats); | 2067 | ObjectArray<float> vertices = new ObjectArray<float>(verticesAsFloats); |
1793 | DumpRaw(indicesarr,vertices,pIndicesCount,pVerticesCount); | 2068 | DumpRaw(indicesarr,vertices,pIndicesCount,pVerticesCount); |
@@ -1801,7 +2076,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1801 | mesh.m_vertexStride = 3; | 2076 | mesh.m_vertexStride = 3; |
1802 | mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; | 2077 | mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; |
1803 | mesh.m_triangleIndexStride = 3; | 2078 | mesh.m_triangleIndexStride = 3; |
1804 | 2079 | ||
1805 | TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); | 2080 | TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); |
1806 | tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); | 2081 | tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); |
1807 | BvhTriangleMeshShape meshShape = new BvhTriangleMeshShape(tribuilder, true,true); | 2082 | BvhTriangleMeshShape meshShape = new BvhTriangleMeshShape(tribuilder, true,true); |
@@ -1810,9 +2085,14 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1810 | return new BulletShapeXNA(meshShape, BSPhysicsShapeType.SHAPE_MESH); | 2085 | return new BulletShapeXNA(meshShape, BSPhysicsShapeType.SHAPE_MESH); |
1811 | 2086 | ||
1812 | } | 2087 | } |
2088 | public override BulletShape CreateGImpactShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats) | ||
2089 | { | ||
2090 | // TODO: | ||
2091 | return null; | ||
2092 | } | ||
1813 | public static void DumpRaw(ObjectArray<int>indices, ObjectArray<float> vertices, int pIndicesCount,int pVerticesCount ) | 2093 | public static void DumpRaw(ObjectArray<int>indices, ObjectArray<float> vertices, int pIndicesCount,int pVerticesCount ) |
1814 | { | 2094 | { |
1815 | 2095 | ||
1816 | String fileName = "objTest3.raw"; | 2096 | String fileName = "objTest3.raw"; |
1817 | String completePath = System.IO.Path.Combine(Util.configDir(), fileName); | 2097 | String completePath = System.IO.Path.Combine(Util.configDir(), fileName); |
1818 | StreamWriter sw = new StreamWriter(completePath); | 2098 | StreamWriter sw = new StreamWriter(completePath); |
@@ -1838,7 +2118,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1838 | string s = vertices[indices[i * 3]].ToString("0.0000"); | 2118 | string s = vertices[indices[i * 3]].ToString("0.0000"); |
1839 | s += " " + vertices[indices[i * 3 + 1]].ToString("0.0000"); | 2119 | s += " " + vertices[indices[i * 3 + 1]].ToString("0.0000"); |
1840 | s += " " + vertices[indices[i * 3 + 2]].ToString("0.0000"); | 2120 | s += " " + vertices[indices[i * 3 + 2]].ToString("0.0000"); |
1841 | 2121 | ||
1842 | sw.Write(s + "\n"); | 2122 | sw.Write(s + "\n"); |
1843 | } | 2123 | } |
1844 | 2124 | ||
@@ -1860,7 +2140,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1860 | mesh.m_vertexStride = 3; | 2140 | mesh.m_vertexStride = 3; |
1861 | mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; | 2141 | mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; |
1862 | mesh.m_triangleIndexStride = 3; | 2142 | mesh.m_triangleIndexStride = 3; |
1863 | 2143 | ||
1864 | TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); | 2144 | TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); |
1865 | tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); | 2145 | tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); |
1866 | 2146 | ||
@@ -1891,7 +2171,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1891 | sw.Close(); | 2171 | sw.Close(); |
1892 | } | 2172 | } |
1893 | 2173 | ||
1894 | public override BulletShape CreateTerrainShape(uint id, Vector3 size, float minHeight, float maxHeight, float[] heightMap, | 2174 | public override BulletShape CreateTerrainShape(uint id, Vector3 size, float minHeight, float maxHeight, float[] heightMap, |
1895 | float scaleFactor, float collisionMargin) | 2175 | float scaleFactor, float collisionMargin) |
1896 | { | 2176 | { |
1897 | const int upAxis = 2; | 2177 | const int upAxis = 2; |
@@ -1899,7 +2179,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1899 | heightMap, scaleFactor, | 2179 | heightMap, scaleFactor, |
1900 | minHeight, maxHeight, upAxis, | 2180 | minHeight, maxHeight, upAxis, |
1901 | false); | 2181 | false); |
1902 | terrainShape.SetMargin(collisionMargin + 0.5f); | 2182 | terrainShape.SetMargin(collisionMargin); |
1903 | terrainShape.SetUseDiamondSubdivision(true); | 2183 | terrainShape.SetUseDiamondSubdivision(true); |
1904 | terrainShape.SetUserPointer(id); | 2184 | terrainShape.SetUserPointer(id); |
1905 | return new BulletShapeXNA(terrainShape, BSPhysicsShapeType.SHAPE_TERRAIN); | 2185 | return new BulletShapeXNA(terrainShape, BSPhysicsShapeType.SHAPE_TERRAIN); |
@@ -1933,14 +2213,14 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1933 | /* TODO */ | 2213 | /* TODO */ |
1934 | updatedEntityCount = 0; | 2214 | updatedEntityCount = 0; |
1935 | collidersCount = 0; | 2215 | collidersCount = 0; |
1936 | 2216 | ||
1937 | 2217 | ||
1938 | int ret = PhysicsStep2(world,timeStep,maxSubSteps,fixedTimeStep,out updatedEntityCount,out world.physicsScene.m_updateArray, out collidersCount, out world.physicsScene.m_collisionArray); | 2218 | int ret = PhysicsStep2(world,timeStep,maxSubSteps,fixedTimeStep,out updatedEntityCount,out world.physicsScene.m_updateArray, out collidersCount, out world.physicsScene.m_collisionArray); |
1939 | 2219 | ||
1940 | return ret; | 2220 | return ret; |
1941 | } | 2221 | } |
1942 | 2222 | ||
1943 | private int PhysicsStep2(BulletWorld pWorld, float timeStep, int m_maxSubSteps, float m_fixedTimeStep, | 2223 | private int PhysicsStep2(BulletWorld pWorld, float timeStep, int m_maxSubSteps, float m_fixedTimeStep, |
1944 | out int updatedEntityCount, out EntityProperties[] updatedEntities, | 2224 | out int updatedEntityCount, out EntityProperties[] updatedEntities, |
1945 | out int collidersCount, out CollisionDesc[] colliders) | 2225 | out int collidersCount, out CollisionDesc[] colliders) |
1946 | { | 2226 | { |
@@ -1949,24 +2229,24 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1949 | return epic; | 2229 | return epic; |
1950 | } | 2230 | } |
1951 | 2231 | ||
1952 | private int PhysicsStepint(BulletWorld pWorld,float timeStep, int m_maxSubSteps, float m_fixedTimeStep, out int updatedEntityCount, | 2232 | private int PhysicsStepint(BulletWorld pWorld,float timeStep, int m_maxSubSteps, float m_fixedTimeStep, out int updatedEntityCount, |
1953 | out EntityProperties[] updatedEntities, out int collidersCount, out CollisionDesc[] colliders, int maxCollisions, int maxUpdates) | 2233 | out EntityProperties[] updatedEntities, out int collidersCount, out CollisionDesc[] colliders, int maxCollisions, int maxUpdates) |
1954 | { | 2234 | { |
1955 | int numSimSteps = 0; | 2235 | int numSimSteps = 0; |
1956 | Array.Clear(UpdatedObjects, 0, UpdatedObjects.Length); | 2236 | Array.Clear(UpdatedObjects, 0, UpdatedObjects.Length); |
1957 | Array.Clear(UpdatedCollisions, 0, UpdatedCollisions.Length); | 2237 | Array.Clear(UpdatedCollisions, 0, UpdatedCollisions.Length); |
1958 | LastEntityProperty=0; | 2238 | LastEntityProperty=0; |
1959 | 2239 | ||
1960 | 2240 | ||
1961 | 2241 | ||
1962 | 2242 | ||
1963 | 2243 | ||
1964 | 2244 | ||
1965 | LastCollisionDesc=0; | 2245 | LastCollisionDesc=0; |
1966 | 2246 | ||
1967 | updatedEntityCount = 0; | 2247 | updatedEntityCount = 0; |
1968 | collidersCount = 0; | 2248 | collidersCount = 0; |
1969 | 2249 | ||
1970 | 2250 | ||
1971 | if (pWorld is BulletWorldXNA) | 2251 | if (pWorld is BulletWorldXNA) |
1972 | { | 2252 | { |
@@ -2023,7 +2303,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
2023 | 2303 | ||
2024 | collidersCount = LastCollisionDesc; | 2304 | collidersCount = LastCollisionDesc; |
2025 | colliders = UpdatedCollisions; | 2305 | colliders = UpdatedCollisions; |
2026 | 2306 | ||
2027 | 2307 | ||
2028 | } | 2308 | } |
2029 | else | 2309 | else |
@@ -2031,15 +2311,15 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
2031 | //if (updatedEntities is null) | 2311 | //if (updatedEntities is null) |
2032 | //updatedEntities = new List<BulletXNA.EntityProperties>(); | 2312 | //updatedEntities = new List<BulletXNA.EntityProperties>(); |
2033 | //updatedEntityCount = 0; | 2313 | //updatedEntityCount = 0; |
2034 | 2314 | ||
2035 | 2315 | ||
2036 | //collidersCount = 0; | 2316 | //collidersCount = 0; |
2037 | 2317 | ||
2038 | updatedEntities = new EntityProperties[0]; | 2318 | updatedEntities = new EntityProperties[0]; |
2039 | 2319 | ||
2040 | 2320 | ||
2041 | colliders = new CollisionDesc[0]; | 2321 | colliders = new CollisionDesc[0]; |
2042 | 2322 | ||
2043 | } | 2323 | } |
2044 | return numSimSteps; | 2324 | return numSimSteps; |
2045 | } | 2325 | } |
@@ -2047,7 +2327,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
2047 | { | 2327 | { |
2048 | IOverlappingPairCache cache = obj.GetOverlappingPairCache(); | 2328 | IOverlappingPairCache cache = obj.GetOverlappingPairCache(); |
2049 | ObjectArray<BroadphasePair> pairs = cache.GetOverlappingPairArray(); | 2329 | ObjectArray<BroadphasePair> pairs = cache.GetOverlappingPairArray(); |
2050 | 2330 | ||
2051 | DiscreteDynamicsWorld world = (PhysicsScene.World as BulletWorldXNA).world; | 2331 | DiscreteDynamicsWorld world = (PhysicsScene.World as BulletWorldXNA).world; |
2052 | PersistentManifoldArray manifoldArray = new PersistentManifoldArray(); | 2332 | PersistentManifoldArray manifoldArray = new PersistentManifoldArray(); |
2053 | BroadphasePair collisionPair; | 2333 | BroadphasePair collisionPair; |
@@ -2059,7 +2339,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
2059 | ManifoldPoint pt; | 2339 | ManifoldPoint pt; |
2060 | 2340 | ||
2061 | int numPairs = pairs.Count; | 2341 | int numPairs = pairs.Count; |
2062 | 2342 | ||
2063 | for (int i = 0; i < numPairs; i++) | 2343 | for (int i = 0; i < numPairs; i++) |
2064 | { | 2344 | { |
2065 | manifoldArray.Clear(); | 2345 | manifoldArray.Clear(); |
@@ -2068,7 +2348,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
2068 | collisionPair = world.GetPairCache().FindPair(pairs[i].m_pProxy0, pairs[i].m_pProxy1); | 2348 | collisionPair = world.GetPairCache().FindPair(pairs[i].m_pProxy0, pairs[i].m_pProxy1); |
2069 | if (collisionPair == null) | 2349 | if (collisionPair == null) |
2070 | continue; | 2350 | continue; |
2071 | 2351 | ||
2072 | collisionPair.m_algorithm.GetAllContactManifolds(manifoldArray); | 2352 | collisionPair.m_algorithm.GetAllContactManifolds(manifoldArray); |
2073 | for (int j = 0; j < manifoldArray.Count; j++) | 2353 | for (int j = 0; j < manifoldArray.Count; j++) |
2074 | { | 2354 | { |
@@ -2091,7 +2371,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
2091 | } | 2371 | } |
2092 | private static void RecordCollision(BSAPIXNA world, CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm, float penetration) | 2372 | private static void RecordCollision(BSAPIXNA world, CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm, float penetration) |
2093 | { | 2373 | { |
2094 | 2374 | ||
2095 | IndexedVector3 contactNormal = norm; | 2375 | IndexedVector3 contactNormal = norm; |
2096 | if ((objA.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0 && | 2376 | if ((objA.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0 && |
2097 | (objB.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0) | 2377 | (objB.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0) |
@@ -2161,11 +2441,11 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
2161 | if (NotMe is BulletBodyXNA && NotMe.HasPhysicalBody) | 2441 | if (NotMe is BulletBodyXNA && NotMe.HasPhysicalBody) |
2162 | { | 2442 | { |
2163 | CollisionObject AvoidBody = (NotMe as BulletBodyXNA).body; | 2443 | CollisionObject AvoidBody = (NotMe as BulletBodyXNA).body; |
2164 | 2444 | ||
2165 | IndexedVector3 rOrigin = new IndexedVector3(_RayOrigin.X, _RayOrigin.Y, _RayOrigin.Z); | 2445 | IndexedVector3 rOrigin = new IndexedVector3(_RayOrigin.X, _RayOrigin.Y, _RayOrigin.Z); |
2166 | IndexedVector3 rEnd = new IndexedVector3(_RayOrigin.X, _RayOrigin.Y, _RayOrigin.Z - pRayHeight); | 2446 | IndexedVector3 rEnd = new IndexedVector3(_RayOrigin.X, _RayOrigin.Y, _RayOrigin.Z - pRayHeight); |
2167 | using ( | 2447 | using ( |
2168 | ClosestNotMeRayResultCallback rayCallback = | 2448 | ClosestNotMeRayResultCallback rayCallback = |
2169 | new ClosestNotMeRayResultCallback(rOrigin, rEnd, AvoidBody) | 2449 | new ClosestNotMeRayResultCallback(rOrigin, rEnd, AvoidBody) |
2170 | ) | 2450 | ) |
2171 | { | 2451 | { |
@@ -2181,9 +2461,9 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
2181 | return false; | 2461 | return false; |
2182 | } | 2462 | } |
2183 | } | 2463 | } |
2184 | |||
2185 | 2464 | ||
2186 | 2465 | ||
2466 | |||
2187 | 2467 | ||
2188 | public class SimMotionState : DefaultMotionState | 2468 | public class SimMotionState : DefaultMotionState |
2189 | { | 2469 | { |
@@ -2276,12 +2556,12 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
2276 | m_lastProperties = m_properties; | 2556 | m_lastProperties = m_properties; |
2277 | if (m_world.LastEntityProperty < m_world.UpdatedObjects.Length) | 2557 | if (m_world.LastEntityProperty < m_world.UpdatedObjects.Length) |
2278 | m_world.UpdatedObjects[m_world.LastEntityProperty++]=(m_properties); | 2558 | m_world.UpdatedObjects[m_world.LastEntityProperty++]=(m_properties); |
2279 | 2559 | ||
2280 | //(*m_updatesThisFrame)[m_properties.ID] = &m_properties; | 2560 | //(*m_updatesThisFrame)[m_properties.ID] = &m_properties; |
2281 | } | 2561 | } |
2282 | 2562 | ||
2283 | 2563 | ||
2284 | 2564 | ||
2285 | 2565 | ||
2286 | } | 2566 | } |
2287 | public override void SetRigidBody(RigidBody body) | 2567 | public override void SetRigidBody(RigidBody body) |
@@ -2304,7 +2584,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
2304 | (((v1.Z - nEpsilon) < v2.Z) && (v2.Z < (v1.Z + nEpsilon))) && | 2584 | (((v1.Z - nEpsilon) < v2.Z) && (v2.Z < (v1.Z + nEpsilon))) && |
2305 | (((v1.W - nEpsilon) < v2.W) && (v2.W < (v1.W + nEpsilon))); | 2585 | (((v1.W - nEpsilon) < v2.W) && (v2.W < (v1.W + nEpsilon))); |
2306 | } | 2586 | } |
2307 | 2587 | ||
2308 | } | 2588 | } |
2309 | } | 2589 | } |
2310 | 2590 | ||