瀏覽代碼

More work on joints:
- Fixed FixedJoint and SliderJoint visualization
- Fixed serialization for all limit and drive types
- Fixed flag setting for hinge/slider/spherical joints

BearishSun 9 年之前
父節點
當前提交
a335a217a8

+ 2 - 2
Source/BansheePhysX/Source/BsPhysXHingeJoint.cpp

@@ -43,10 +43,10 @@ namespace BansheeEngine
 		PxRevoluteJointFlags flags;
 
 		if (((UINT32)desc.flag & (UINT32)Flag::Limit) != 0)
-			flags &= PxRevoluteJointFlag::eLIMIT_ENABLED;
+			flags |= PxRevoluteJointFlag::eLIMIT_ENABLED;
 
 		if (((UINT32)desc.flag & (UINT32)Flag::Drive) != 0)
-			flags &= PxRevoluteJointFlag::eDRIVE_ENABLED;
+			flags |= PxRevoluteJointFlag::eDRIVE_ENABLED;
 
 		joint->setRevoluteJointFlags(flags);
 

+ 1 - 1
Source/BansheePhysX/Source/BsPhysXSliderJoint.cpp

@@ -42,7 +42,7 @@ namespace BansheeEngine
 		PxPrismaticJointFlags flags;
 
 		if (((UINT32)desc.flag & (UINT32)Flag::Limit) != 0)
-			flags &= PxPrismaticJointFlag::eLIMIT_ENABLED;
+			flags |= PxPrismaticJointFlag::eLIMIT_ENABLED;
 
 		joint->setPrismaticJointFlags(flags);
 

+ 1 - 1
Source/BansheePhysX/Source/BsPhysXSphericalJoint.cpp

@@ -41,7 +41,7 @@ namespace BansheeEngine
 		PxSphericalJointFlags flags;
 
 		if (((UINT32)desc.flag & (UINT32)Flag::Limit) != 0)
-			flags &= PxSphericalJointFlag::eLIMIT_ENABLED;
+			flags |= PxSphericalJointFlag::eLIMIT_ENABLED;
 
 		joint->setSphericalJointFlags(flags);
 

+ 4 - 4
Source/MBansheeEditor/Inspectors/LimitInspectors.cs

@@ -136,7 +136,7 @@ namespace BansheeEditor
                 ToggleLimitFields();
             };
 
-            contactDistanceField.OnChanged += x => { limitData.contactDist = x; MarkAsModified(); };
+            contactDistanceField.OnChanged += x => { this.limitData.contactDist = x; MarkAsModified(); };
             contactDistanceField.OnFocusLost += ConfirmModify;
             contactDistanceField.OnConfirmed += ConfirmModify;
 
@@ -146,7 +146,7 @@ namespace BansheeEditor
                 ToggleLimitFields();
             };
 
-            restitutionField.OnChanged += x => { limitData.restitution = x; MarkAsModified(); };
+            restitutionField.OnChanged += x => { this.limitData.restitution = x; MarkAsModified(); };
             restitutionField.OnFocusLost += ConfirmModify;
 
             springFoldout.OnToggled += x =>
@@ -177,7 +177,7 @@ namespace BansheeEditor
 
                     GUILayoutY springContentsLayout = springLayout.AddLayoutY();
                     springGUI = new SpringGUI(limitData.spring, springContentsLayout);
-                    springGUI.OnChanged += x => { limitData.spring = x; MarkAsModified(); };
+                    springGUI.OnChanged += x => { this.limitData.spring = x; MarkAsModified(); };
                     springGUI.OnConfirmed += ConfirmModify;
                 }
             }
@@ -248,7 +248,7 @@ namespace BansheeEditor
         ///                          </param>
         public LimitLinearGUI(LimitLinear limit, GUILayout layout, SerializableProperties properties)
         {
-            this.limitData = limit.Data;
+            limitData = limit.Data;
 
             limitExtentField.OnChanged += x => { limitData.extent = x; MarkAsModified(); };
             limitExtentField.OnFocusLost += ConfirmModify;

+ 31 - 27
Source/MBansheeEditor/Windows/Scene/Gizmos/JointGizmos.cs

@@ -47,15 +47,23 @@ namespace BansheeEditor
         [DrawGizmo(DrawGizmoFlags.Selected | DrawGizmoFlags.ParentSelected)]
         private static void DrawFixedJoint(FixedJoint joint)
         {
-            Vector3 anchorA = GetAnchor(joint, JointBody.Target);
-            Vector3 anchorB = GetAnchor(joint, JointBody.Anchor);
+            Vector3 target = GetAnchor(joint, JointBody.Target);
+            Vector3 anchor = GetAnchor(joint, JointBody.Anchor);
+            Vector3 center = target;
+
+            Rigidbody rigidbody = joint.GetRigidbody(JointBody.Target);
+            if (rigidbody != null)
+                center = rigidbody.SceneObject.Position;
 
             Gizmos.Color = Color.White;
-            Gizmos.DrawSphere(anchorA, 0.05f);
-            Gizmos.DrawSphere(anchorB, 0.05f);
+            Gizmos.DrawSphere(center, 0.05f);
+
+            Gizmos.Color = Color.Yellow;
+            Gizmos.DrawSphere(target, 0.05f);
+            Gizmos.DrawSphere(anchor, 0.05f);
 
             Gizmos.Color = Color.Green;
-            Gizmos.DrawLine(anchorA, anchorB);
+            Gizmos.DrawLine(target, center);
         }
 
         /// <summary>
@@ -111,38 +119,34 @@ namespace BansheeEditor
         [DrawGizmo(DrawGizmoFlags.Selected | DrawGizmoFlags.ParentSelected)]
         private static void DrawSliderJoint(SliderJoint joint)
         {
-            Vector3 anchorA = GetAnchor(joint, JointBody.Target);
-            Vector3 anchorB = GetAnchor(joint, JointBody.Anchor);
-
-            Gizmos.Color = Color.White;
-            Gizmos.DrawSphere(anchorA, 0.05f);
-            Gizmos.DrawSphere(anchorB, 0.05f);
-
-            Gizmos.Color = Color.Red;
-            Vector3 diff = anchorB - anchorA;
-
-            float length = diff.Length;
-            Vector3 normal = diff.Normalized;
-
-            float min = 0.0f;
-            float max = length;
+            Vector3 anchor = GetAnchor(joint, JointBody.Anchor);
+            Vector3 target = GetAnchor(joint, JointBody.Target);
+            Vector3 normal = -joint.SceneObject.Right;
 
             if (joint.EnableLimit)
             {
                 LimitLinearRange limit = joint.Limit;
 
-                max = MathEx.Min(10000.0f, limit.Upper);
-                min = MathEx.Clamp(limit.Lower, 0.0f, max);
+                float max = MathEx.Min(10000.0f, limit.Upper);
+                float min = MathEx.Clamp(limit.Lower, 0.0f, max);
                 max = MathEx.Max(max, min);
 
-                Gizmos.DrawLine(anchorA, anchorA + normal * min);
+                Gizmos.Color = Color.Red;
+                Gizmos.DrawLine(anchor, anchor + normal*min);
 
-                if (length > max)
-                    Gizmos.DrawLine(anchorA + normal * max, anchorA + normal * length);
+                Gizmos.Color = Color.Green;
+                Gizmos.DrawLine(anchor + normal*min, anchor + normal*max);
+            }
+            else
+            {
+                Gizmos.Color = Color.Green;
+
+                float length = 100.0f;
+                Gizmos.DrawLine(anchor, anchor + normal * length);
             }
 
-            Gizmos.Color = Color.Green;
-            Gizmos.DrawLine(anchorA + normal * min, anchorA + normal * MathEx.Min(max, length));
+            Gizmos.Color = Color.Yellow;
+            Gizmos.DrawSphere(target, 0.05f);
         }
 
         /// <summary>

+ 12 - 2
Source/MBansheeEngine/Physics/Joint.cs

@@ -754,6 +754,7 @@ namespace BansheeEngine
     [SerializeObject]
     public class LimitCommon
     {
+        [SerializeField]
         private LimitCommonData data;
 
         /// <summary>
@@ -835,6 +836,7 @@ namespace BansheeEngine
     [SerializeObject]
     public class LimitLinearRange : LimitCommon
     {
+        [SerializeField]
         private LimitLinearRangeData data;
 
         /// <summary>
@@ -952,6 +954,7 @@ namespace BansheeEngine
     [SerializeObject]
     public class LimitLinear : LimitCommon
     {
+        [SerializeField]
         private LimitLinearData data;
 
         /// <summary>
@@ -1058,6 +1061,7 @@ namespace BansheeEngine
     [SerializeObject]
     public class LimitAngularRange : LimitCommon
 	{
+        [SerializeField]
         private LimitAngularRangeData data;
 
         /// <summary>
@@ -1174,6 +1178,7 @@ namespace BansheeEngine
     [SerializeObject]
     public class LimitConeRange : LimitCommon
     {
+        [SerializeField]
         private LimitConeRangeData data;
 
         /// <summary>
@@ -1290,7 +1295,7 @@ namespace BansheeEngine
     /// <summary>
     /// Contains data used by HingeJointDrive.
     /// </summary>
-    [StructLayout(LayoutKind.Sequential)]
+    [StructLayout(LayoutKind.Sequential), SerializeObject]
     public struct HingeJointDriveData // Note: Must match C++ struct HingeJoint::Drive
     {
         /// <summary>
@@ -1317,7 +1322,7 @@ namespace BansheeEngine
     /// <summary>
     /// Contains data used by D6JointDrive.
     /// </summary>
-    [StructLayout(LayoutKind.Sequential)]
+    [StructLayout(LayoutKind.Sequential), SerializeObject]
     public struct D6JointDriveData // Note: Must match C++ struct D6Joint::Drive
     {
         /// <summary>
@@ -1344,6 +1349,7 @@ namespace BansheeEngine
     /// <summary>
     /// Contains data used by LimitCommon.
     /// </summary>
+    [SerializeObject]
     public struct LimitCommonData
     {
         /// <summary>
@@ -1365,6 +1371,7 @@ namespace BansheeEngine
     /// <summary>
     /// Contains data used by LimitLinearRange.
     /// </summary>
+    [SerializeObject]
     public struct LimitLinearRangeData
     {
         /// <summary>
@@ -1380,6 +1387,7 @@ namespace BansheeEngine
     /// <summary>
     /// Contains data used by LimitLinear.
     /// </summary>
+    [SerializeObject]
     public struct LimitLinearData
     {
         /// <summary>
@@ -1391,6 +1399,7 @@ namespace BansheeEngine
     /// <summary>
     /// Contains data used by LimitAngularRange.
     /// </summary>
+    [SerializeObject]
     public struct LimitAngularRangeData
     {
         /// <summary>
@@ -1406,6 +1415,7 @@ namespace BansheeEngine
     /// <summary>
     /// Contains data used by LimitConeRange.
     /// </summary>
+    [SerializeObject]
     public struct LimitConeRangeData
     {
         /// <summary>