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(); } }