private static void SaveIntoBinary(SPCRJointDynamicsControllerSave spcrJointDynamicsSave)
        {
#if UNITY_EDITOR
            var filePath = EditorUtility.SaveFilePanel("Save Joint Dynamics Configuration", Application.dataPath,
                                                       "SPCRJointConfigutation",
                                                       "SPCR");

            if (string.IsNullOrEmpty(filePath))
            {
                return;
            }
            try
            {
                Stream          stream     = File.Open(filePath, FileMode.Create);
                BinaryFormatter bformatter = new BinaryFormatter();
                bformatter.Serialize(stream, spcrJointDynamicsSave);
                stream.Close();
            }
            catch (System.Exception e)
            {
                Debug.LogError("ファイル保存失敗:" + e.Message);
            }
#endif//UNITY_EDITOR
        }
        private static SPCRJointDynamicsControllerSave LoadBinary()
        {
            SPCRJointDynamicsControllerSave spcrJointDynamicsSave = null;

#if UNITY_EDITOR
            string filePath = EditorUtility.OpenFilePanel("Open Joint Dynamics Configuration", Application.dataPath, "SPCR");
            if (!File.Exists(filePath))
            {
                return(null);
            }
            try
            {
                Stream          stream     = File.Open(filePath, FileMode.Open);
                BinaryFormatter bformatter = new BinaryFormatter();
                spcrJointDynamicsSave = (SPCRJointDynamicsControllerSave)bformatter.Deserialize(stream);
                stream.Close();
            }
            catch (System.Exception e)
            {
                Debug.LogError("ファイルの読み込み失敗:" + e.Message);
            }
#endif//UNITY_EDITOR
            return(spcrJointDynamicsSave);
        }
        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();
        }
        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);
        }