Exemple #1
0
 private static void SetGrabbersInChildren(SPCRJointDynamicsController controller)
 {
     if (controller._RootTransform != null)
     {
         controller._PointGrabberTable = controller._RootTransform.GetComponentsInChildren <SPCRJointDynamicsPointGrabber>();
     }
 }
        static public void Push(SPCRJointDynamicsController ctrl)
        {
            Instance._Controllers.Add(ctrl);

            Instance._DynamicsBoneCount     += ctrl.PointTbl.Length;
            Instance._DynamicsColliderCount += ctrl._ColliderTbl.Length;
        }
        static public void Pop(SPCRJointDynamicsController ctrl)
        {
            Instance._Controllers.Remove(ctrl);

            Instance._DynamicsBoneCount     -= ctrl.PointTbl.Length;
            Instance._DynamicsColliderCount -= ctrl._ColliderTbl.Length;
        }
    void SubdivideVerticalChain(SPCRJointDynamicsController controller, int NumInsert)
    {
        var rnd              = new System.Random();
        var RootList         = new List <SPCRJointDynamicsPoint>(controller._RootPointTbl);
        var OriginalPoints   = controller._SubDivOriginalPoints;
        var InsertedPoints   = controller._SubDivInsertedPoints;
        var IsFirstSubdivide = (OriginalPoints.Count == 0);

        foreach (var rootPoint in RootList)
        {
            if (IsFirstSubdivide)
            {
                OriginalPoints.Add(rootPoint);
            }

            var parentPoint = rootPoint;

            while (parentPoint.transform.childCount > 0)
            {
                var parentTransform = parentPoint.transform;

                var points = parentTransform.GetComponentsInChildren <SPCRJointDynamicsPoint>();
                if (points.Length < 2)
                {
                    break;
                }

                var childPoint = points[1];

                if (parentPoint == childPoint)
                {
                    Debug.LogWarning("Infinite Loop!:" + parentPoint.name);
                    break;
                }

                if (IsFirstSubdivide)
                {
                    OriginalPoints.Add(childPoint);
                }

                var childTransform = childPoint.transform;

                SPCRJointDynamicsPoint newPoint = null;
                for (int i = 1; i <= NumInsert; i++)
                {
                    float weight = i / (NumInsert + 1.0f);

                    newPoint = CreateInterpolatedPoint(parentPoint, childPoint, weight, "VSubdiv_" + rnd.Next());
                    InsertedPoints.Add(newPoint);

                    newPoint.transform.SetParent(parentTransform);
                    parentTransform = newPoint.transform;
                }
                childTransform.SetParent(newPoint.transform);

                parentPoint = childPoint;
            }
        }
    }
Exemple #5
0
    private static void SearchRootPoints(SPCRJointDynamicsController controller)
    {
        if (controller._RootTransform == null)
        {
            controller._RootTransform = controller.transform;
        }
        var PointList = new List <SPCRJointDynamicsPoint>();

        SearchRootPoints(controller._RootTransform, PointList);
        controller._RootPointTable = PointList.ToArray();
    }
Exemple #6
0
 void UpdateToggle(string Label, SPCRJointDynamicsController Source, ref bool Value, bool Reverse = false)
 {
     if (Reverse)
     {
         Value = !EditorGUILayout.Toggle(Label, !Value);
     }
     else
     {
         Value = EditorGUILayout.Toggle(Label, Value);
     }
 }
 void SearchRootPoints(SPCRJointDynamicsController controller)
 {
     if (controller._RootTransform != null)
     {
         var PointList = new List <SPCRJointDynamicsPoint>();
         for (int i = 0; i < controller._RootTransform.transform.childCount; ++i)
         {
             var child = controller._RootTransform.transform.GetChild(i);
             var point = child.GetComponent <SPCRJointDynamicsPoint>();
             if (point != null)
             {
                 PointList.Add(point);
             }
         }
         controller._RootPointTbl = PointList.ToArray();
     }
 }
    void SortConstraintsHorizontalRoot(SPCRJointDynamicsController controller, UpdateJointConnectionType Type)
    {
        switch (Type)
        {
        case UpdateJointConnectionType.Default:
        {
        }
        break;

        case UpdateJointConnectionType.SortNearPointXYZ:
        {
            var SourcePoints = new List <SPCRJointDynamicsPoint>();
            var EdgeA        = controller._RootPointTbl[0];
            for (int i = 1; i < controller._RootPointTbl.Length; ++i)
            {
                SourcePoints.Add(controller._RootPointTbl[i]);
            }
            var SortedPoints = new List <SPCRJointDynamicsPoint>();
            SortedPoints.Add(EdgeA);
            while (SourcePoints.Count > 0)
            {
                SortedPoints.Add(GetNearestPoint(
                                     SortedPoints[SortedPoints.Count - 1].transform.position,
                                     ref SourcePoints,
                                     false));
            }
            controller._RootPointTbl = SortedPoints.ToArray();
        }
        break;

        case UpdateJointConnectionType.SortNearPointXZ:
        {
            var SourcePoints = new List <SPCRJointDynamicsPoint>();
            var EdgeA        = controller._RootPointTbl[0];
            for (int i = 1; i < controller._RootPointTbl.Length; ++i)
            {
                SourcePoints.Add(controller._RootPointTbl[i]);
            }
            var SortedPoints = new List <SPCRJointDynamicsPoint>();
            SortedPoints.Add(EdgeA);
            while (SourcePoints.Count > 0)
            {
                SortedPoints.Add(GetNearestPoint(
                                     SortedPoints[SortedPoints.Count - 1].transform.position,
                                     ref SourcePoints,
                                     true));
            }
            controller._RootPointTbl = SortedPoints.ToArray();
        }
        break;

        case UpdateJointConnectionType.SortNearPointXYZ_FixedBeginEnd:
        {
            var SourcePoints = new List <SPCRJointDynamicsPoint>();
            var EdgeA        = controller._RootPointTbl[0];
            var EdgeB        = controller._RootPointTbl[controller._RootPointTbl.Length - 1];
            for (int i = 1; i < controller._RootPointTbl.Length - 1; ++i)
            {
                SourcePoints.Add(controller._RootPointTbl[i]);
            }
            var SortedPoints = new List <SPCRJointDynamicsPoint>();
            SortedPoints.Add(EdgeA);
            while (SourcePoints.Count > 0)
            {
                SortedPoints.Add(GetNearestPoint(
                                     SortedPoints[SortedPoints.Count - 1].transform.position,
                                     ref SourcePoints,
                                     false));
            }
            SortedPoints.Add(EdgeB);
            controller._RootPointTbl = SortedPoints.ToArray();
        }
        break;

        case UpdateJointConnectionType.SortNearPointXZ_FixedBeginEnd:
        {
            var SourcePoints = new List <SPCRJointDynamicsPoint>();
            var EdgeA        = controller._RootPointTbl[0];
            var EdgeB        = controller._RootPointTbl[controller._RootPointTbl.Length - 1];
            for (int i = 1; i < controller._RootPointTbl.Length - 1; ++i)
            {
                SourcePoints.Add(controller._RootPointTbl[i]);
            }
            var SortedPoints = new List <SPCRJointDynamicsPoint>();
            SortedPoints.Add(EdgeA);
            while (SourcePoints.Count > 0)
            {
                SortedPoints.Add(GetNearestPoint(
                                     SortedPoints[SortedPoints.Count - 1].transform.position,
                                     ref SourcePoints,
                                     true));
            }
            SortedPoints.Add(EdgeB);
            controller._RootPointTbl = SortedPoints.ToArray();
        }
        break;
        }
    }
 void UpdateCurve(string Label, SPCRJointDynamicsController Source, ref AnimationCurve Value)
 {
     Value = EditorGUILayout.CurveField(Label, Value);
 }
        public static void Load(SPCRJointDynamicsController SPCRJointDynamicsContoller)
        {
            SPCRJointDynamicsControllerSave spcrJointDynamicsSave = LoadBinary();

            if (spcrJointDynamicsSave == null)
            {
                return;
            }

            if (string.IsNullOrEmpty(SPCRJointDynamicsContoller.Name))
            {
                SPCRJointDynamicsContoller.Name = spcrJointDynamicsSave.name;
            }

            GameObject RootGameObject = GameObject.Find(spcrJointDynamicsSave.rootTransformName);

            if (RootGameObject != null)
            {
                SPCRJointDynamicsContoller._RootTransform = RootGameObject.transform;
            }

            globalUniqueIdList = GetGlobalUniqueIdComponentList();

            if (spcrJointDynamicsSave.spcrChildJointDynamicsPointList != null)
            {
                for (int i = 0; i < spcrJointDynamicsSave.spcrChildJointDynamicsPointList.Length; i++)
                {
                    SPCRJointDynamicsPoint point      = (SPCRJointDynamicsPoint)globalUniqueIdList.Find(obj => obj.GetType() == typeof(SPCRJointDynamicsPoint) && ((SPCRJointDynamicsPoint)obj).UniqueGUIID.Equals(spcrJointDynamicsSave.spcrChildJointDynamicsPointList[i].RefUniqueID));
                    SPCRJointDynamicsPoint ChildPoint = (SPCRJointDynamicsPoint)globalUniqueIdList.Find(obj => obj.GetType() == typeof(SPCRJointDynamicsPoint) && ((SPCRJointDynamicsPoint)obj).UniqueGUIID.Equals(spcrJointDynamicsSave.spcrChildJointDynamicsPointList[i].refChildID));
                    if (point != null)
                    {
                        point._Mass                   = spcrJointDynamicsSave.spcrChildJointDynamicsPointList[i].mass;
                        point._RefChildPoint          = ChildPoint;
                        point._IsFixed                = spcrJointDynamicsSave.spcrChildJointDynamicsPointList[i].IsFixed;
                        point._BoneAxis               = spcrJointDynamicsSave.spcrChildJointDynamicsPointList[i].BoneAxis.ToUnityVector3();
                        point._Depth                  = spcrJointDynamicsSave.spcrChildJointDynamicsPointList[i].Depth;
                        point._Index                  = spcrJointDynamicsSave.spcrChildJointDynamicsPointList[i].Index;
                        point._UseForSurfaceCollision = spcrJointDynamicsSave.spcrChildJointDynamicsPointList[i].UseForSurfaceCollision;
                    }
                }
            }

            if (spcrJointDynamicsSave.spcrChildJointDynamicsColliderList != null)
            {
                List <SPCRJointDynamicsCollider> colliderTable = new List <SPCRJointDynamicsCollider>();
                for (int i = 0; i < spcrJointDynamicsSave.spcrChildJointDynamicsColliderList.Length; i++)
                {
                    SPCRJointDynamicsCollider point = (SPCRJointDynamicsCollider)globalUniqueIdList.Find(obj => obj.GetType() == typeof(SPCRJointDynamicsCollider) && ((SPCRJointDynamicsCollider)obj).UniqueGUIID.Equals(spcrJointDynamicsSave.spcrChildJointDynamicsColliderList[i].RefUniqueId));
                    if (point == null)
                    {
                        point = CreateNewCollider(spcrJointDynamicsSave.spcrChildJointDynamicsColliderList[i]);
                    }
                    point.RadiusRaw             = spcrJointDynamicsSave.spcrChildJointDynamicsColliderList[i].Radius;
                    point.HeightRaw             = spcrJointDynamicsSave.spcrChildJointDynamicsColliderList[i].Height;
                    point.FrictionRaw           = spcrJointDynamicsSave.spcrChildJointDynamicsColliderList[i].Friction;
                    point._SurfaceColliderForce = spcrJointDynamicsSave.spcrChildJointDynamicsColliderList[i].ForceType;

                    if (!colliderTable.Contains(point))
                    {
                        colliderTable.Add(point);
                    }
                }
                if (colliderTable.Count > 0)
                {
                    SPCRJointDynamicsContoller._ColliderTbl = colliderTable.ToArray();
                }
            }

            if (spcrJointDynamicsSave.spcrChildJointDynamicsPointGtabberList != null)
            {
                List <SPCRJointDynamicsPointGrabber> grabberList = new List <SPCRJointDynamicsPointGrabber>();
                for (int i = 0; i < spcrJointDynamicsSave.spcrChildJointDynamicsPointGtabberList.Length; i++)
                {
                    SPCRJointDynamicsPointGrabber point = (SPCRJointDynamicsPointGrabber)globalUniqueIdList.Find(obj => obj.GetType() == typeof(SPCRJointDynamicsPointGrabber) && ((SPCRJointDynamicsPointGrabber)obj).UniqueGUIID.Equals(spcrJointDynamicsSave.spcrChildJointDynamicsPointGtabberList[i].RefUniqueGUIID));
                    if (point == null)
                    {
                        point = CreateNewGrabber(spcrJointDynamicsSave.spcrChildJointDynamicsPointGtabberList[i]);
                    }
                    point.IsEnabled = spcrJointDynamicsSave.spcrChildJointDynamicsPointGtabberList[i].IsEnabled;
                    point.RadiusRaw = spcrJointDynamicsSave.spcrChildJointDynamicsPointGtabberList[i].Radius;
                    point.Force     = spcrJointDynamicsSave.spcrChildJointDynamicsPointGtabberList[i].Force;

                    grabberList.Add(point);
                }
                if (grabberList.Count > 0)
                {
                    SPCRJointDynamicsContoller._PointGrabberTbl = grabberList.ToArray();
                }
            }

            if (spcrJointDynamicsSave.RootPointTbl != null)
            {
                List <SPCRJointDynamicsPoint> pointList = new List <SPCRJointDynamicsPoint>();
                for (int i = 0; i < spcrJointDynamicsSave.RootPointTbl.Length; i++)
                {
                    SPCRJointDynamicsPoint point = (SPCRJointDynamicsPoint)globalUniqueIdList.Find(obj => obj.GetType() == typeof(SPCRJointDynamicsPoint) && ((SPCRJointDynamicsPoint)obj).UniqueGUIID.Equals(spcrJointDynamicsSave.RootPointTbl[i]));
                    if (point == null)
                    {
                        continue;
                    }
                    pointList.Add(point);
                }
                if (pointList.Count > 0)
                {
                    SPCRJointDynamicsContoller._RootPointTbl = pointList.ToArray();
                }
            }
            else
            {
                SPCRJointDynamicsContoller._RootPointTbl = new SPCRJointDynamicsPoint[0];
            }

            SPCRJointDynamicsContoller._Relaxation = spcrJointDynamicsSave.Relaxation;
            SPCRJointDynamicsContoller._SubSteps   = spcrJointDynamicsSave.SubSteps;

            //@SPCRJointDynamicsContoller._IsEnablePointCollision = spcrJointDynamicsSave.IsEnablePointCollision;
            //@SPCRJointDynamicsContoller._DetailHitDivideMax = spcrJointDynamicsSave.DetailHitDivideMax;

            SPCRJointDynamicsContoller._IsCancelResetPhysics     = spcrJointDynamicsSave.IsCancelResetPhysics;
            SPCRJointDynamicsContoller._IsEnableSurfaceCollision = spcrJointDynamicsSave.IsEnableSurfaceCollision;
            SPCRJointDynamicsContoller._SurfaceCollisionDivision = spcrJointDynamicsSave.SurfaceCollisionDivision;

            SPCRJointDynamicsContoller._MassScaleCurve    = GetAnimCurve(spcrJointDynamicsSave.MassScaleCurve);
            SPCRJointDynamicsContoller._GravityScaleCurve = GetAnimCurve(spcrJointDynamicsSave.GravityScaleCurve);
            SPCRJointDynamicsContoller._ResistanceCurve   = GetAnimCurve(spcrJointDynamicsSave.ResistanceCurve);
            SPCRJointDynamicsContoller._HardnessCurve     = GetAnimCurve(spcrJointDynamicsSave.HardnessCurve);
            SPCRJointDynamicsContoller._FrictionCurve     = GetAnimCurve(spcrJointDynamicsSave.FrictionCurve);

            SPCRJointDynamicsContoller._AllShrinkScaleCurve  = GetAnimCurve(spcrJointDynamicsSave.AllShrinkScaleCurve);
            SPCRJointDynamicsContoller._AllStretchScaleCurve = GetAnimCurve(spcrJointDynamicsSave.AllStretchScaleCurve);
            SPCRJointDynamicsContoller._StructuralShrinkVerticalScaleCurve    = GetAnimCurve(spcrJointDynamicsSave.StructuralShrinkVerticalScaleCurve);
            SPCRJointDynamicsContoller._StructuralStretchVerticalScaleCurve   = GetAnimCurve(spcrJointDynamicsSave.StructuralStretchVerticalScaleCurve);
            SPCRJointDynamicsContoller._StructuralShrinkHorizontalScaleCurve  = GetAnimCurve(spcrJointDynamicsSave.StructuralShrinkHorizontalScaleCurve);
            SPCRJointDynamicsContoller._StructuralStretchHorizontalScaleCurve = GetAnimCurve(spcrJointDynamicsSave.StructuralStretchHorizontalScaleCurve);
            SPCRJointDynamicsContoller._ShearShrinkScaleCurve              = GetAnimCurve(spcrJointDynamicsSave.ShearShrinkScaleCurve);
            SPCRJointDynamicsContoller._ShearStretchScaleCurve             = GetAnimCurve(spcrJointDynamicsSave.ShearStretchScaleCurve);
            SPCRJointDynamicsContoller._BendingShrinkVerticalScaleCurve    = GetAnimCurve(spcrJointDynamicsSave.BendingShrinkVerticalScaleCurve);
            SPCRJointDynamicsContoller._BendingStretchVerticalScaleCurve   = GetAnimCurve(spcrJointDynamicsSave.BendingStretchVerticalScaleCurve);
            SPCRJointDynamicsContoller._BendingShrinkHorizontalScaleCurve  = GetAnimCurve(spcrJointDynamicsSave.BendingShrinkHorizontalScaleCurve);
            SPCRJointDynamicsContoller._BendingStretchHorizontalScaleCurve = GetAnimCurve(spcrJointDynamicsSave.BendingStretchHorizontalScaleCurve);

            SPCRJointDynamicsContoller._Gravity   = spcrJointDynamicsSave.Gravity.ToUnityVector3();
            SPCRJointDynamicsContoller._WindForce = spcrJointDynamicsSave.WindForce.ToUnityVector3();

            SPCRJointDynamicsContoller._RootSlideLimit  = spcrJointDynamicsSave.RootSlideLimit;
            SPCRJointDynamicsContoller._RootRotateLimit = spcrJointDynamicsSave.RootRotateLimit;

            SPCRJointDynamicsContoller._StructuralShrinkVertical    = spcrJointDynamicsSave.StructuralShrinkVertical;
            SPCRJointDynamicsContoller._StructuralStretchVertical   = spcrJointDynamicsSave.StructuralStretchVertical;
            SPCRJointDynamicsContoller._StructuralShrinkHorizontal  = spcrJointDynamicsSave.StructuralShrinkHorizontal;
            SPCRJointDynamicsContoller._StructuralStretchHorizontal = spcrJointDynamicsSave.StructuralStretchHorizontal;
            SPCRJointDynamicsContoller._ShearShrink              = spcrJointDynamicsSave.ShearShrink;
            SPCRJointDynamicsContoller._ShearStretch             = spcrJointDynamicsSave.ShearStretch;
            SPCRJointDynamicsContoller._BendingShrinkVertical    = spcrJointDynamicsSave.BendingShrinkVertical;
            SPCRJointDynamicsContoller._BendingStretchVertical   = spcrJointDynamicsSave.BendingStretchVertical;
            SPCRJointDynamicsContoller._BendingShrinkHorizontal  = spcrJointDynamicsSave.BendingShrinkHorizontal;
            SPCRJointDynamicsContoller._BendingStretchHorizontal = spcrJointDynamicsSave.BendingStretchHorizontal;

            SPCRJointDynamicsContoller._IsAllStructuralShrinkVertical    = spcrJointDynamicsSave.IsAllStructuralShrinkVertical;
            SPCRJointDynamicsContoller._IsAllStructuralStretchVertical   = spcrJointDynamicsSave.IsAllStructuralStretchVertical;
            SPCRJointDynamicsContoller._IsAllStructuralShrinkHorizontal  = spcrJointDynamicsSave.IsAllStructuralShrinkHorizontal;
            SPCRJointDynamicsContoller._IsAllStructuralStretchHorizontal = spcrJointDynamicsSave.IsAllStructuralStretchHorizontal;
            SPCRJointDynamicsContoller._IsAllShearShrink              = spcrJointDynamicsSave.IsAllShearShrink;
            SPCRJointDynamicsContoller._IsAllShearStretch             = spcrJointDynamicsSave.IsAllShearStretch;
            SPCRJointDynamicsContoller._IsAllBendingShrinkVertical    = spcrJointDynamicsSave.IsAllBendingShrinkVertical;
            SPCRJointDynamicsContoller._IsAllBendingStretchVertical   = spcrJointDynamicsSave.IsAllBendingStretchVertical;
            SPCRJointDynamicsContoller._IsAllBendingShrinkHorizontal  = spcrJointDynamicsSave.IsAllBendingShrinkHorizontal;
            SPCRJointDynamicsContoller._IsAllBendingStretchHorizontal = spcrJointDynamicsSave.IsAllBendingStretchHorizontal;

            SPCRJointDynamicsContoller._IsCollideStructuralVertical   = spcrJointDynamicsSave.IsCollideStructuralVertical;
            SPCRJointDynamicsContoller._IsCollideStructuralHorizontal = spcrJointDynamicsSave.IsCollideStructuralHorizontal;
            SPCRJointDynamicsContoller._IsCollideShear = spcrJointDynamicsSave.IsCollideShear;

            SPCRJointDynamicsContoller._IsLoopRootPoints              = spcrJointDynamicsSave.IsLoopRootPoints;
            SPCRJointDynamicsContoller._IsComputeStructuralVertical   = spcrJointDynamicsSave.IsComputeStructuralVertical;
            SPCRJointDynamicsContoller._IsComputeStructuralHorizontal = spcrJointDynamicsSave.IsComputeStructuralHorizontal;
            SPCRJointDynamicsContoller._IsComputeShear             = spcrJointDynamicsSave.IsComputeShear;
            SPCRJointDynamicsContoller._IsComputeBendingVertical   = spcrJointDynamicsSave.IsComputeBendingVertical;
            SPCRJointDynamicsContoller._IsComputeBendingHorizontal = spcrJointDynamicsSave.IsComputeBendingHorizontal;

            SPCRJointDynamicsContoller._IsDebugDraw_StructuralVertical   = spcrJointDynamicsSave.IsDebugDraw_StructuralVertical;
            SPCRJointDynamicsContoller._IsDebugDraw_StructuralHorizontal = spcrJointDynamicsSave.IsDebugDraw_StructuralHorizontal;
            SPCRJointDynamicsContoller._IsDebugDraw_Shear                 = spcrJointDynamicsSave.IsDebugDraw_Shear;
            SPCRJointDynamicsContoller._IsDebugDraw_BendingVertical       = spcrJointDynamicsSave.IsDebugDraw_BendingVertical;
            SPCRJointDynamicsContoller._IsDebugDraw_BendingHorizontal     = spcrJointDynamicsSave.IsDebugDraw_BendingHorizontal;
            SPCRJointDynamicsContoller._IsDebugDraw_SurfaceFace           = spcrJointDynamicsSave.IsDebugDraw_SurfaceFace;
            SPCRJointDynamicsContoller._Debug_SurfaceNormalLength         = spcrJointDynamicsSave.Debug_SurfaceNoramlLength;
            SPCRJointDynamicsContoller._IsDebugDraw_RuntimeColliderBounds = spcrJointDynamicsSave.IsDebugDraw_RuntimeColliderBounds;

            if (spcrJointDynamicsSave.ConstraintTable != null)
            {
                SPCRJointDynamicsContoller.ConstraintTable = new SPCRJointDynamicsJob.Constraint[spcrJointDynamicsSave.ConstraintTable.Length][];
                for (int i = 0; i < spcrJointDynamicsSave.ConstraintTable.Length; i++)
                {
                    SPCRJointDynamicsContoller.ConstraintTable[i] = new SPCRJointDynamicsJob.Constraint[spcrJointDynamicsSave.ConstraintTable[i].Length];
                    for (int j = 0; j < spcrJointDynamicsSave.ConstraintTable[i].Length; j++)
                    {
                        SPCRJointDynamicsContoller.ConstraintTable[i][j] = spcrJointDynamicsSave.ConstraintTable[i][j].ConvertToJobConstraint();
                    }
                }
            }

            SPCRJointDynamicsContoller.MaxPointDepth = spcrJointDynamicsSave.MaxPointDepth;

            SPCRJointDynamicsContoller._UseLimitAngles  = spcrJointDynamicsSave.UseLimitAngles;
            SPCRJointDynamicsContoller._LimitAngle      = spcrJointDynamicsSave.LimitAngle;
            SPCRJointDynamicsContoller._LimitFromRoot   = spcrJointDynamicsSave.LimitFromRoot;
            SPCRJointDynamicsContoller._LimitPowerCurve = GetAnimCurve(spcrJointDynamicsSave.LimitPowerCurve);

            globalUniqueIdList.Clear();
        }
    void CreationSubdivisionJoint(SPCRJointDynamicsController Controller, int HDivCount, int VDivCount)
    {
        var VCurve = new List <CurveData>();
        var HCurve = new List <CurveData>();

        var RootTbl = Controller._RootPointTbl;

#if UNITY_2018_3_OR_NEWER
        PrefabUtility.UnpackPrefabInstance(Controller.gameObject, PrefabUnpackMode.Completely, InteractionMode.AutomatedAction);
#else//UNITY_2018_3_OR_NEWER
        PrefabUtility.DisconnectPrefabInstance(Controller.gameObject);
#endif//UNITY_2018_3_OR_NEWER

        for (int i = 0; i < RootTbl.Length; ++i)
        {
            float Length = 0.0f;
            var   Curve  = new CurveData();
            var   Point  = RootTbl[i];
            while (Point != null)
            {
                Curve.Keys.Add(new CurveKey()
                {
                    Length = Length,
                    Value  = Point.transform.position,
                });
                var NextPoint = Controller.GetChildJointDynamicsPoint(Point);
                if (NextPoint != null)
                {
                    Length += (NextPoint.transform.position - Point.transform.position).magnitude;
                }
                Point = NextPoint;
            }
            Curve.CreateSpileData(Length, false);
            VCurve.Add(Curve);
        }

        for (int v = 0; v <= VDivCount; ++v)
        {
            float Rate     = (float)v / (float)VDivCount;
            var   Curve    = new CurveData();
            var   OldPoint = VCurve[0].ComputeLinear(Rate);
            float Length   = 0.0f;
            for (int i = 0; i < VCurve.Count; ++i)
            {
                var NewPoint = VCurve[i].ComputeLinear(Rate);
                Length += (NewPoint - OldPoint).magnitude;
                Curve.Keys.Add(new CurveKey()
                {
                    Length = Length,
                    Value  = NewPoint,
                });
                OldPoint = NewPoint;
            }
            Curve.CreateSpileData(Length, true);
            HCurve.Add(Curve);
        }

        var RootPointList = new List <SPCRJointDynamicsPoint>();
        for (int h = 0; h < HDivCount; ++h)
        {
            float Rate   = (float)h / (float)HDivCount;
            var   parent = Controller._RootTransform;
            for (int i = 0; i < HCurve.Count; ++i)
            {
                var Position = HCurve[i].ComputeSpline(Rate);
                var go       = new GameObject(h.ToString("D3") + "_" + i.ToString("D3"));
                var pt       = go.AddComponent <SPCRJointDynamicsPoint>();
                go.transform.SetParent(parent);
                go.transform.position = Position;
                if (i == 0)
                {
                    RootPointList.Add(pt);
                }
                parent = go.transform;
            }
        }

        for (int i = 0; i < RootTbl.Length; ++i)
        {
            SetTransformScaleZero(RootTbl[i].transform);
        }

        Controller._RootPointTbl = RootPointList.ToArray();
        Controller.UpdateJointConnection();

        GenerateMeshFromBoneConstraints(Controller);
    }
    void RemoveInsertedPoints(SPCRJointDynamicsController controller)
    {
        var OriginalPoints = controller._SubDivOriginalPoints;
        var InsertedPoints = controller._SubDivInsertedPoints;

        if (OriginalPoints.Count == 0)
        {
            return;
        }

        controller.DeleteJointConnection();

        var originalPoints = new Dictionary <int, SPCRJointDynamicsPoint>(OriginalPoints.Count);

        foreach (var op in OriginalPoints)
        {
            int key = op.GetInstanceID();
            if (!originalPoints.ContainsKey(key))
            {
                originalPoints.Add(key, op);
            }
        }

        var rootList = new List <SPCRJointDynamicsPoint>();

        foreach (var root in controller._RootPointTbl)
        {
            if (!originalPoints.ContainsKey(root.GetInstanceID()))
            {
                continue;
            }

            rootList.Add(root);

            var parentPoint = root;
            var chainPoint  = root;
            while (chainPoint != null)
            {
                var children = chainPoint.GetComponentsInChildren <SPCRJointDynamicsPoint>();
                if (children.Length < 2)
                {
                    break;
                }
                var childPoint = children[1];
                if (originalPoints.ContainsKey(childPoint.GetInstanceID()))
                {
                    childPoint.transform.SetParent(parentPoint.transform);
                    parentPoint = childPoint;
                }
                chainPoint = childPoint;
            }
        }

        foreach (var point in InsertedPoints)
        {
            point._RefChildPoint = null;
            point.transform.SetParent(null);
        }

        foreach (var point in InsertedPoints)
        {
            DestroyImmediate(point.gameObject);
        }

        controller._RootPointTbl = rootList.ToArray();
        controller._SubDivOriginalPoints.Clear();
        controller._SubDivInsertedPoints.Clear();
    }
 void UpdateToggle(string Label, SPCRJointDynamicsController Source, ref bool Value)
 {
     Value = EditorGUILayout.Toggle(Label, Value);
 }
Exemple #14
0
    private static void SortConstraintsHorizontalRoot(SPCRJointDynamicsController controller, UpdateJointConnectionType Type)
    {
        switch (Type)
        {
        case UpdateJointConnectionType.Default: {
        }
        break;

        case UpdateJointConnectionType.SortNearPointXYZ: {
            var SourcePoints = new List <SPCRJointDynamicsPoint>();
            for (int i = 1; i < controller._RootPointTable.Length; ++i)
            {
                SourcePoints.Add(controller._RootPointTable[i]);
            }
            var SortedPoints = new List <SPCRJointDynamicsPoint> {
                controller._RootPointTable[0]
            };
            while (SourcePoints.Count > 0)
            {
                SortedPoints.Add(PopNearestPoint(
                                     SortedPoints[SortedPoints.Count - 1].transform.position,
                                     SourcePoints,
                                     false));
            }
            controller._RootPointTable = SortedPoints.ToArray();
        }
        break;

        case UpdateJointConnectionType.SortNearPointXZ: {
            var SourcePoints = new List <SPCRJointDynamicsPoint>();
            for (int i = 1; i < controller._RootPointTable.Length; ++i)
            {
                SourcePoints.Add(controller._RootPointTable[i]);
            }
            var SortedPoints = new List <SPCRJointDynamicsPoint> {
                controller._RootPointTable[0]
            };
            while (SourcePoints.Count > 0)
            {
                SortedPoints.Add(PopNearestPoint(
                                     SortedPoints[SortedPoints.Count - 1].transform.position,
                                     SourcePoints,
                                     true));
            }
            controller._RootPointTable = SortedPoints.ToArray();
        }
        break;

        case UpdateJointConnectionType.SortNearPointXYZ_FixedBothEnds: {
            var SourcePoints = new List <SPCRJointDynamicsPoint>();
            var EdgeB        = controller._RootPointTable[controller._RootPointTable.Length - 1];
            for (int i = 1; i < controller._RootPointTable.Length - 1; ++i)
            {
                SourcePoints.Add(controller._RootPointTable[i]);
            }
            var SortedPoints = new List <SPCRJointDynamicsPoint> {
                controller._RootPointTable[0]
            };
            while (SourcePoints.Count > 0)
            {
                SortedPoints.Add(PopNearestPoint(
                                     SortedPoints[SortedPoints.Count - 1].transform.position,
                                     SourcePoints,
                                     false));
            }
            SortedPoints.Add(EdgeB);
            controller._RootPointTable = SortedPoints.ToArray();
        }
        break;

        case UpdateJointConnectionType.SortNearPointXZ_FixedBothEnds: {
            var SourcePoints = new List <SPCRJointDynamicsPoint>();
            var EdgeB        = controller._RootPointTable[controller._RootPointTable.Length - 1];
            for (int i = 1; i < controller._RootPointTable.Length - 1; ++i)
            {
                SourcePoints.Add(controller._RootPointTable[i]);
            }
            var SortedPoints = new List <SPCRJointDynamicsPoint> {
                controller._RootPointTable[0]
            };
            while (SourcePoints.Count > 0)
            {
                SortedPoints.Add(PopNearestPoint(
                                     SortedPoints[SortedPoints.Count - 1].transform.position,
                                     SourcePoints,
                                     true));
            }
            SortedPoints.Add(EdgeB);
            controller._RootPointTable = SortedPoints.ToArray();
        }
        break;
        }
    }
Exemple #15
0
 private static void UpdateJointConnection(SPCRJointDynamicsController controller)
 {
     controller.UpdateJointConnection();
     SceneView.RepaintAll();
 }
    void SubdivideHorizontalChain(SPCRJointDynamicsController controller, int NumInsert)
    {
        var rnd              = new System.Random();
        var RootList         = new List <SPCRJointDynamicsPoint>(controller._RootPointTbl);
        var OriginalPoints   = controller._SubDivOriginalPoints;
        var InsertedPoints   = controller._SubDivInsertedPoints;
        var IsFirstSubdivide = (OriginalPoints.Count == 0);

        int Count = RootList.Count;
        int Start = controller._IsLoopRootPoints ? Count : (Count - 1);

        for (int iroot = Start; iroot > 0; iroot--)
        {
            var root0 = RootList[iroot % Count];
            var root1 = RootList[iroot - 1];

            for (int iin = 1; iin <= NumInsert; iin++)
            {
                var point0          = root0;
                var point1          = root1;
                var parentTransform = root0.transform.parent;

                float weight = iin / (NumInsert + 1.0f);
                SPCRJointDynamicsPoint newRoot = null;

                while (point0 != null && point1 != null)
                {
                    if (IsFirstSubdivide && iin == 1)
                    {
                        if (!controller._IsLoopRootPoints && iroot == Start)
                        {
                            OriginalPoints.Add(point0);
                        }
                        OriginalPoints.Add(point1);
                    }

                    var newPoint = CreateInterpolatedPoint(point0, point1, weight, "HSubdiv_" + rnd.Next());
                    InsertedPoints.Add(newPoint);

                    var newTransform = newPoint.transform;
                    newTransform.SetParent(parentTransform);
                    parentTransform = newTransform;

                    SPCRJointDynamicsPoint[] points;

                    points = point0.transform.GetComponentsInChildren <SPCRJointDynamicsPoint>();
                    point0 = (points.Length > 1) ? points[1] : null;

                    points = point1.transform.GetComponentsInChildren <SPCRJointDynamicsPoint>();
                    point1 = (points.Length > 1) ? points[1] : null;

                    if (newRoot == null)
                    {
                        newRoot = newPoint;
                        RootList.Insert(iroot, newRoot);
                    }
                }
            }
        }
        controller._RootPointTbl = RootList.ToArray();
    }
 void UpdateIntSlider(string Label, SPCRJointDynamicsController Source, ref int Value, int Min, int Max)
 {
     Value = EditorGUILayout.IntSlider(Label, Value, Min, Max);
 }
 void PurgeSubdivideOriginalInfo(SPCRJointDynamicsController controller)
 {
     controller._SubDivOriginalPoints.Clear();
     controller._SubDivInsertedPoints.Clear();
 }
 void UpdateSlider(string Label, SPCRJointDynamicsController Source, ref float Value, float Min, float Max)
 {
     Value = EditorGUILayout.Slider(Label, Value, Min, Max);
 }
    void GenerateMeshFromBoneConstraints(SPCRJointDynamicsController Controller)
    {
        var vertices    = new List <Vector3>();
        var boneWeights = new List <BoneWeight>();
        var bindposes   = new List <Matrix4x4>();

        var AllBones        = new List <Transform>();
        var HorizontalBones = new List <List <Transform> >();

        for (int i = 0; i <= Controller._RootPointTbl.Length; ++i)
        {
            var verticalBones = new List <Transform>();
            var child         = Controller._RootPointTbl[i % Controller._RootPointTbl.Length];
            while (child != null)
            {
                vertices.Add(child.transform.position);
                boneWeights.Add(new BoneWeight()
                {
                    boneIndex0 = AllBones.Count,
                    weight0    = 1.0f,
                });
                bindposes.Add(child.transform.worldToLocalMatrix);
                AllBones.Add(child.transform);
                verticalBones.Add(child.transform);
                child = Controller.GetChildJointDynamicsPoint(child);
            }
            HorizontalBones.Add(verticalBones);
        }

        var uvs = new List <Vector2>();

        for (int h = 0; h < HorizontalBones.Count; ++h)
        {
            for (int v = 0; v < HorizontalBones[h].Count; ++v)
            {
                uvs.Add(new Vector2(
                            (float)h / (float)(HorizontalBones.Count - 1),
                            (float)v / (float)(HorizontalBones[h].Count - 1)));
            }
        }

        int index           = 0;
        var triangles       = new List <int>();
        var HorizontalCount = HorizontalBones.Count;

        for (int h = 0; h < HorizontalCount - 1; ++h)
        {
            var Vertical0Count = HorizontalBones[h].Count;
            var Vertical1Count = HorizontalBones[h + 1].Count;
            if (Vertical0Count == Vertical1Count)
            {
                for (int v = 0; v < Vertical0Count - 1; ++v)
                {
                    var top0 = index;
                    var top1 = index + Vertical0Count;
                    var x0y0 = top0 + v;
                    var x1y0 = top0 + v + 1;
                    var x0y1 = top1 + v;
                    var x1y1 = top1 + v + 1;
                    triangles.Add(x0y0);
                    triangles.Add(x1y0);
                    triangles.Add(x1y1);
                    triangles.Add(x1y1);
                    triangles.Add(x0y1);
                    triangles.Add(x0y0);
                }
            }
            index += Vertical0Count;
        }

        var mesh = new Mesh();

        mesh.indexFormat = vertices.Count > 65535 ? IndexFormat.UInt32 : IndexFormat.UInt16;
        mesh.vertices    = vertices.ToArray();
        mesh.uv          = uvs.ToArray();
        mesh.boneWeights = boneWeights.ToArray();
        mesh.bindposes   = bindposes.ToArray();
        mesh.triangles   = triangles.ToArray();
        RecalculateNormals(mesh);

        var renderers = Controller.gameObject.GetComponentsInChildren <SkinnedMeshRenderer>();

        if (renderers.Length != 0)
        {
            var Path    = AssetDatabase.GetAssetPath(renderers[renderers.Length - 1].sharedMesh);
            var DirName = System.IO.Path.GetDirectoryName(Path);
            AssetDatabase.CreateAsset(mesh, DirName + "/" + Controller.gameObject.name + "_" + Controller.Name + ".asset");
            AssetDatabase.Refresh();
        }

        var skinMesh = Controller.gameObject.GetComponent <SkinnedMeshRenderer>();

        if (skinMesh == null)
        {
            skinMesh = Controller.gameObject.AddComponent <SkinnedMeshRenderer>();
        }
        skinMesh.bones      = AllBones.ToArray();
        skinMesh.sharedMesh = mesh;
        skinMesh.rootBone   = Controller._RootTransform;
        var meshFilter = Controller.gameObject.GetComponent <MeshFilter>();

        if (meshFilter == null)
        {
            meshFilter = Controller.gameObject.AddComponent <MeshFilter>();
        }
        meshFilter.mesh = mesh;
    }
 void UpdateFloat(string Label, SPCRJointDynamicsController Source, ref float Value)
 {
     Value = EditorGUILayout.FloatField(Label, Value);
 }
 void UpdateVector3(string Label, SPCRJointDynamicsController Source, ref Vector3 Value)
 {
     Value = EditorGUILayout.Vector3Field(Label, Value);
 }
        public static void Save(SPCRJointDynamicsController SPCRJointDynamicsContoller)
        {
            SPCRJointDynamicsControllerSave spcrJointDynamicsSave = new SPCRJointDynamicsControllerSave();

            spcrJointDynamicsSave.name = SPCRJointDynamicsContoller.Name;
            spcrJointDynamicsSave.rootTransformName = SPCRJointDynamicsContoller._RootTransform.name;

            spcrJointDynamicsSave.spcrChildJointDynamicsPointList = new SPCRJointDynamicsPointSave[SPCRJointDynamicsContoller.PointTbl.Length];
            for (int i = 0; i < SPCRJointDynamicsContoller.PointTbl.Length; i++)
            {
                spcrJointDynamicsSave.spcrChildJointDynamicsPointList[i] = new SPCRJointDynamicsPointSave(SPCRJointDynamicsContoller.PointTbl[i]);
            }

            spcrJointDynamicsSave.spcrChildJointDynamicsColliderList = new SPCRJointDynamicsColliderSave[SPCRJointDynamicsContoller._ColliderTbl.Length];
            for (int i = 0; i < SPCRJointDynamicsContoller._ColliderTbl.Length; i++)
            {
                spcrJointDynamicsSave.spcrChildJointDynamicsColliderList[i] = new SPCRJointDynamicsColliderSave(SPCRJointDynamicsContoller._ColliderTbl[i]);
            }
            UpdateIDIfSameUniqueId(ref spcrJointDynamicsSave.spcrChildJointDynamicsColliderList);

            spcrJointDynamicsSave.spcrChildJointDynamicsPointGtabberList = new SPCRJointDynamicsPointGrabberSave[SPCRJointDynamicsContoller._PointGrabberTbl.Length];
            for (int i = 0; i < SPCRJointDynamicsContoller._PointGrabberTbl.Length; i++)
            {
                spcrJointDynamicsSave.spcrChildJointDynamicsPointGtabberList[i] = new SPCRJointDynamicsPointGrabberSave(SPCRJointDynamicsContoller._PointGrabberTbl[i]);
            }
            UpdateIDIfSameUniqueId(ref spcrJointDynamicsSave.spcrChildJointDynamicsPointGtabberList);

            if (SPCRJointDynamicsContoller._RootPointTbl != null && SPCRJointDynamicsContoller._RootPointTbl.Length > 0)
            {
                spcrJointDynamicsSave.RootPointTbl = new string[SPCRJointDynamicsContoller._RootPointTbl.Length];
                for (int i = 0; i < SPCRJointDynamicsContoller._RootPointTbl.Length; i++)
                {
                    spcrJointDynamicsSave.RootPointTbl[i] = SPCRJointDynamicsContoller._RootPointTbl[i].UniqueGUIID;
                }
            }

            spcrJointDynamicsSave.Relaxation = SPCRJointDynamicsContoller._Relaxation;
            spcrJointDynamicsSave.SubSteps   = SPCRJointDynamicsContoller._SubSteps;

            //@spcrJointDynamicsSave.IsEnablePointCollision = SPCRJointDynamicsContoller._IsEnablePointCollision;
            //@spcrJointDynamicsSave.DetailHitDivideMax = SPCRJointDynamicsContoller._DetailHitDivideMax;

            spcrJointDynamicsSave.IsCancelResetPhysics = SPCRJointDynamicsContoller._IsCancelResetPhysics;

            spcrJointDynamicsSave.IsEnableSurfaceCollision = SPCRJointDynamicsContoller._IsEnableSurfaceCollision;
            spcrJointDynamicsSave.SurfaceCollisionDivision = SPCRJointDynamicsContoller._SurfaceCollisionDivision;

            spcrJointDynamicsSave.MassScaleCurve    = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._MassScaleCurve);
            spcrJointDynamicsSave.GravityScaleCurve = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._GravityScaleCurve);
            spcrJointDynamicsSave.ResistanceCurve   = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._ResistanceCurve);
            spcrJointDynamicsSave.HardnessCurve     = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._HardnessCurve);
            spcrJointDynamicsSave.FrictionCurve     = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._FrictionCurve);

            spcrJointDynamicsSave.AllShrinkScaleCurve  = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._AllShrinkScaleCurve);
            spcrJointDynamicsSave.AllStretchScaleCurve = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._AllStretchScaleCurve);
            spcrJointDynamicsSave.StructuralShrinkVerticalScaleCurve    = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._StructuralShrinkVerticalScaleCurve);
            spcrJointDynamicsSave.StructuralStretchVerticalScaleCurve   = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._StructuralStretchVerticalScaleCurve);
            spcrJointDynamicsSave.StructuralShrinkHorizontalScaleCurve  = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._StructuralShrinkHorizontalScaleCurve);
            spcrJointDynamicsSave.StructuralStretchHorizontalScaleCurve = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._StructuralStretchHorizontalScaleCurve);
            spcrJointDynamicsSave.ShearShrinkScaleCurve              = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._ShearShrinkScaleCurve);
            spcrJointDynamicsSave.ShearStretchScaleCurve             = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._ShearStretchScaleCurve);
            spcrJointDynamicsSave.BendingShrinkVerticalScaleCurve    = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._BendingShrinkVerticalScaleCurve);
            spcrJointDynamicsSave.BendingStretchVerticalScaleCurve   = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._BendingStretchVerticalScaleCurve);
            spcrJointDynamicsSave.BendingShrinkHorizontalScaleCurve  = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._BendingShrinkHorizontalScaleCurve);
            spcrJointDynamicsSave.BendingStretchHorizontalScaleCurve = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._BendingStretchHorizontalScaleCurve);

            spcrJointDynamicsSave.Gravity   = new SPCRvec3(SPCRJointDynamicsContoller._Gravity);
            spcrJointDynamicsSave.WindForce = new SPCRvec3(SPCRJointDynamicsContoller._WindForce);

            spcrJointDynamicsSave.RootSlideLimit  = SPCRJointDynamicsContoller._RootSlideLimit;
            spcrJointDynamicsSave.RootRotateLimit = SPCRJointDynamicsContoller._RootRotateLimit;

            spcrJointDynamicsSave.StructuralShrinkVertical    = SPCRJointDynamicsContoller._StructuralShrinkVertical;
            spcrJointDynamicsSave.StructuralStretchVertical   = SPCRJointDynamicsContoller._StructuralStretchVertical;
            spcrJointDynamicsSave.StructuralShrinkHorizontal  = SPCRJointDynamicsContoller._StructuralShrinkHorizontal;
            spcrJointDynamicsSave.StructuralStretchHorizontal = SPCRJointDynamicsContoller._StructuralStretchHorizontal;
            spcrJointDynamicsSave.ShearShrink              = SPCRJointDynamicsContoller._ShearShrink;
            spcrJointDynamicsSave.ShearStretch             = SPCRJointDynamicsContoller._ShearStretch;
            spcrJointDynamicsSave.BendingShrinkVertical    = SPCRJointDynamicsContoller._BendingShrinkVertical;
            spcrJointDynamicsSave.BendingStretchVertical   = SPCRJointDynamicsContoller._BendingStretchVertical;
            spcrJointDynamicsSave.BendingShrinkHorizontal  = SPCRJointDynamicsContoller._BendingShrinkHorizontal;
            spcrJointDynamicsSave.BendingStretchHorizontal = SPCRJointDynamicsContoller._BendingStretchHorizontal;

            spcrJointDynamicsSave.IsAllStructuralShrinkVertical    = SPCRJointDynamicsContoller._IsAllStructuralShrinkVertical;
            spcrJointDynamicsSave.IsAllStructuralStretchVertical   = SPCRJointDynamicsContoller._IsAllStructuralStretchVertical;
            spcrJointDynamicsSave.IsAllStructuralShrinkHorizontal  = SPCRJointDynamicsContoller._IsAllStructuralShrinkHorizontal;
            spcrJointDynamicsSave.IsAllStructuralStretchHorizontal = SPCRJointDynamicsContoller._IsAllStructuralStretchHorizontal;
            spcrJointDynamicsSave.IsAllShearShrink              = SPCRJointDynamicsContoller._IsAllShearShrink;
            spcrJointDynamicsSave.IsAllShearStretch             = SPCRJointDynamicsContoller._IsAllShearStretch;
            spcrJointDynamicsSave.IsAllBendingShrinkVertical    = SPCRJointDynamicsContoller._IsAllBendingShrinkVertical;
            spcrJointDynamicsSave.IsAllBendingStretchVertical   = SPCRJointDynamicsContoller._IsAllBendingStretchVertical;
            spcrJointDynamicsSave.IsAllBendingShrinkHorizontal  = SPCRJointDynamicsContoller._IsAllBendingShrinkHorizontal;
            spcrJointDynamicsSave.IsAllBendingStretchHorizontal = SPCRJointDynamicsContoller._IsAllBendingStretchHorizontal;

            spcrJointDynamicsSave.IsCollideStructuralVertical   = SPCRJointDynamicsContoller._IsCollideStructuralVertical;
            spcrJointDynamicsSave.IsCollideStructuralHorizontal = SPCRJointDynamicsContoller._IsCollideStructuralHorizontal;
            spcrJointDynamicsSave.IsCollideShear = SPCRJointDynamicsContoller._IsCollideShear;

            spcrJointDynamicsSave.PointTblIDs = new string[SPCRJointDynamicsContoller.PointTbl.Length];

            spcrJointDynamicsSave.IsLoopRootPoints              = SPCRJointDynamicsContoller._IsLoopRootPoints;
            spcrJointDynamicsSave.IsComputeStructuralVertical   = SPCRJointDynamicsContoller._IsComputeStructuralVertical;
            spcrJointDynamicsSave.IsComputeStructuralHorizontal = SPCRJointDynamicsContoller._IsComputeStructuralHorizontal;
            spcrJointDynamicsSave.IsComputeShear             = SPCRJointDynamicsContoller._IsComputeShear;
            spcrJointDynamicsSave.IsComputeBendingVertical   = SPCRJointDynamicsContoller._IsComputeBendingVertical;
            spcrJointDynamicsSave.IsComputeBendingHorizontal = SPCRJointDynamicsContoller._IsComputeBendingHorizontal;

            spcrJointDynamicsSave.IsDebugDraw_StructuralVertical   = SPCRJointDynamicsContoller._IsDebugDraw_StructuralVertical;
            spcrJointDynamicsSave.IsDebugDraw_StructuralHorizontal = SPCRJointDynamicsContoller._IsDebugDraw_StructuralHorizontal;
            spcrJointDynamicsSave.IsDebugDraw_Shear                 = SPCRJointDynamicsContoller._IsDebugDraw_Shear;
            spcrJointDynamicsSave.IsDebugDraw_BendingVertical       = SPCRJointDynamicsContoller._IsDebugDraw_BendingVertical;
            spcrJointDynamicsSave.IsDebugDraw_BendingHorizontal     = SPCRJointDynamicsContoller._IsDebugDraw_BendingHorizontal;
            spcrJointDynamicsSave.IsDebugDraw_SurfaceFace           = SPCRJointDynamicsContoller._IsDebugDraw_SurfaceFace;
            spcrJointDynamicsSave.Debug_SurfaceNoramlLength         = SPCRJointDynamicsContoller._Debug_SurfaceNormalLength;
            spcrJointDynamicsSave.IsDebugDraw_RuntimeColliderBounds = SPCRJointDynamicsContoller._IsDebugDraw_RuntimeColliderBounds;

            if (SPCRJointDynamicsContoller.ConstraintTable != null)
            {
                spcrJointDynamicsSave.ConstraintTable = new SPCRConstraintSave[SPCRJointDynamicsContoller.ConstraintTable.Length][];
                for (int i = 0; i < SPCRJointDynamicsContoller.ConstraintTable.Length; i++)
                {
                    spcrJointDynamicsSave.ConstraintTable[i] = new SPCRConstraintSave[SPCRJointDynamicsContoller.ConstraintTable[i].Length];
                    for (int j = 0; j < SPCRJointDynamicsContoller.ConstraintTable[i].Length; j++)
                    {
                        spcrJointDynamicsSave.ConstraintTable[i][j] = new SPCRConstraintSave(SPCRJointDynamicsContoller.ConstraintTable[i][j]);
                    }
                }
            }

            spcrJointDynamicsSave.UseLimitAngles  = SPCRJointDynamicsContoller._UseLimitAngles;
            spcrJointDynamicsSave.LimitAngle      = SPCRJointDynamicsContoller._LimitAngle;
            spcrJointDynamicsSave.LimitFromRoot   = SPCRJointDynamicsContoller._LimitFromRoot;
            spcrJointDynamicsSave.LimitPowerCurve = GetSPCRAnimaCurveKeyFrames(SPCRJointDynamicsContoller._LimitPowerCurve);


            spcrJointDynamicsSave.MaxPointDepth = SPCRJointDynamicsContoller.MaxPointDepth;

            SaveIntoBinary(spcrJointDynamicsSave);
        }