public void NotSync2SyncStatus()
        {
            if (_syncStatus != SYNC_STATUS.NotSync)
            {
                return;
            }


            _syncStatus = SYNC_STATUS.Sync;

            //공통 Curve를 만들자
            _syncCurve_Prev._nextLinkedCurveKey = _syncCurve_Next;
            _syncCurve_Next._prevLinkedCurveKey = _syncCurve_Prev;

            _syncCurve_Prev._keyIndex = 0;
            _syncCurve_Next._keyIndex = 1;

            _syncCurve_Prev._nextIndex = 1;
            _syncCurve_Next._prevIndex = 0;

            //이전
            //_syncCurve_Prev._nextCurveResult.Link(_syncCurve_Prev, _syncCurve_Next, true, true);
            //_syncCurve_Next._prevCurveResult.Link(_syncCurve_Prev, _syncCurve_Next, false, true);

            //변경 19.5.20 : MakeCurve를 항상 수행
            _syncCurve_Prev._nextCurveResult.Link(_syncCurve_Prev, _syncCurve_Next, true);
            _syncCurve_Next._prevCurveResult.Link(_syncCurve_Prev, _syncCurve_Next, false);

            //Smooth 상태로 리셋한다.
            SyncCurveResult.ResetSmoothSetting();

            //동기화를 한다.
            SetChanged();
            ApplySync(true, false);
        }
        public void Clear()
        {
            _syncStatus = SYNC_STATUS.NoKeyframes;

            if (_keyframes == null)
            {
                _keyframes = new List <apAnimKeyframe>();
            }
            _keyframes.Clear();

            if (_curveSets == null)
            {
                _curveSets = new List <CurveSet>();
            }
            _curveSets.Clear();

            if (_prevKey2CurveSet == null)
            {
                _prevKey2CurveSet = new Dictionary <apAnimKeyframe, CurveSet>();
            }
            if (_nextKey2CurveSet == null)
            {
                _nextKey2CurveSet = new Dictionary <apAnimKeyframe, CurveSet>();
            }
            _prevKey2CurveSet.Clear();
            _nextKey2CurveSet.Clear();

            _isAnyChangedRequest = false;

            _syncCurve_Prev.Init();
            _syncCurve_Next.Init();

            _syncCurve_Prev._keyIndex = 0;
            _syncCurve_Next._keyIndex = 1;

            _syncCurve_Prev._nextIndex = 1;
            _syncCurve_Next._prevIndex = 0;

            //이전
            //_syncCurve_Prev._nextCurveResult.Link(_syncCurve_Prev, _syncCurve_Next, true, true);
            //_syncCurve_Next._prevCurveResult.Link(_syncCurve_Prev, _syncCurve_Next, false, true);

            //변경 19.5.20 : MakeCurve를 항상 하는 걸로 변경
            _syncCurve_Prev._nextCurveResult.Link(_syncCurve_Prev, _syncCurve_Next, true);
            _syncCurve_Next._prevCurveResult.Link(_syncCurve_Prev, _syncCurve_Next, false);

            _syncCurve_Prev.Refresh();
            _syncCurve_Next.Refresh();
        }
        // Functions
        //----------------------------------------------------
        public void SetKeyframes(List <apAnimKeyframe> keyframes)
        {
            Clear();

            //키프레임들을 하나씩 돌면서 CurveSet에 넣자.
            //중복을 막기 위해서 Key2CurveSet 확인
            if (keyframes == null || keyframes.Count == 0)
            {
                return;
            }

            apAnimKeyframe srcKeyframe = null;
            apAnimKeyframe prevKey     = null;
            apAnimKeyframe nextKey     = null;

            for (int iKey = 0; iKey < keyframes.Count; iKey++)
            {
                srcKeyframe = keyframes[iKey];

                _keyframes.Add(srcKeyframe);

                prevKey = srcKeyframe._prevLinkedKeyframe;
                nextKey = srcKeyframe._nextLinkedKeyframe;

                srcKeyframe._curveKey.Refresh();

                if (prevKey != null && srcKeyframe != prevKey)
                {
                    //Prev -> Src
                    if (!_prevKey2CurveSet.ContainsKey(prevKey) && !_nextKey2CurveSet.ContainsKey(srcKeyframe))
                    {
                        //아직 등록되지 않은 키프레임들
                        CurveSet newSet = new CurveSet(prevKey, srcKeyframe);
                        _curveSets.Add(newSet);

                        _prevKey2CurveSet.Add(prevKey, newSet);
                        _nextKey2CurveSet.Add(srcKeyframe, newSet);
                    }
                }

                if (nextKey != null && srcKeyframe != nextKey)
                {
                    //Src -> Next
                    if (!_prevKey2CurveSet.ContainsKey(srcKeyframe) && !_nextKey2CurveSet.ContainsKey(nextKey))
                    {
                        //아직 등록되지 않은 키프레임들
                        CurveSet newSet = new CurveSet(srcKeyframe, nextKey);
                        _curveSets.Add(newSet);

                        _prevKey2CurveSet.Add(srcKeyframe, newSet);
                        _nextKey2CurveSet.Add(nextKey, newSet);
                    }
                }
            }

            if (_curveSets.Count <= 1)
            {
                Clear();
                return;
            }

            //일단 동기화가 안됨
            _syncStatus = SYNC_STATUS.NotSync;

            //커브값이 같은지 체크하자
            CurveSet firstSet = _curveSets[0]; //<<첫번째것과 비교하자

            bool isAllSame = true;             //<<모두 동일한 커브를 가졌는가

            CurveSet curSet = null;

            for (int i = 1; i < _curveSets.Count; i++)
            {
                curSet = _curveSets[i];
                if (!curSet.IsSame(firstSet))
                {
                    //하나라도 다르다면
                    isAllSame = false;
                    break;
                }
            }

            if (isAllSame)
            {
                //오잉 모두 같았다.
                //공통 Curve를 만든다.
                _syncStatus = SYNC_STATUS.Sync;

                //공통 Curve를 만들자
                _syncCurve_Prev._nextLinkedCurveKey = _syncCurve_Next;
                _syncCurve_Next._prevLinkedCurveKey = _syncCurve_Prev;

                _syncCurve_Prev._keyIndex = 0;
                _syncCurve_Next._keyIndex = 1;

                _syncCurve_Prev._nextIndex = 1;
                _syncCurve_Next._prevIndex = 0;

                apAnimCurve prevCurve = firstSet._prevKeyframe._curveKey;
                apAnimCurve nextCurve = firstSet._nextKeyframe._curveKey;

                _syncCurve_Prev._nextSmoothX     = prevCurve._nextSmoothX;
                _syncCurve_Prev._nextSmoothY     = prevCurve._nextSmoothY;
                _syncCurve_Prev._nextTangentType = prevCurve._nextTangentType;

                _syncCurve_Next._prevSmoothX     = nextCurve._prevSmoothX;
                _syncCurve_Next._prevSmoothY     = nextCurve._prevSmoothY;
                _syncCurve_Next._prevTangentType = nextCurve._prevTangentType;

                //이전
                //_syncCurve_Prev._nextCurveResult.Link(_syncCurve_Prev, _syncCurve_Next, true, true);
                //_syncCurve_Next._prevCurveResult.Link(_syncCurve_Prev, _syncCurve_Next, false, true);

                //변경 19.5.20 : MakeCurve를 항상 수행
                _syncCurve_Prev._nextCurveResult.Link(_syncCurve_Prev, _syncCurve_Next, true);
                _syncCurve_Next._prevCurveResult.Link(_syncCurve_Prev, _syncCurve_Next, false);

                _syncCurve_Prev.Refresh();
                _syncCurve_Next.Refresh();

                _syncCurve_Prev._nextCurveResult.MakeCurve();
                _syncCurve_Next._prevCurveResult.MakeCurve();
            }
            else
            {
                //몇개가 다르다.
                _syncStatus = SYNC_STATUS.NotSync;

                _syncCurve_Prev.Refresh();
                _syncCurve_Next.Refresh();
            }
        }