private void OnClickFirstButton()
    {
        ChromaSDKAnimation2D animation = GetAnimation();

        _mCurrentFrame = 0;
        animation.RefreshCurve();
    }
    private void OnClickAddButton()
    {
        ChromaSDKAnimation2D animation = GetAnimation();

        EditorUtility.SetDirty(animation);
        var frames = animation.Frames; //copy

        Unload();

        if (_mCurrentFrame < 0 ||
            _mCurrentFrame >= frames.Count)
        {
            _mCurrentFrame = 0;
        }
        EffectArray2dInput oldFrame;

        if (frames.Count > 0)
        {
            oldFrame = frames[_mCurrentFrame];
        }
        else
        {
            oldFrame = ChromaUtils.CreateColors2D(animation.Device);
        }
        EffectArray2dInput frame = ChromaUtils.CreateColors2D(animation.Device);

        if (_mCurrentFrame == frames.Count ||
            (_mCurrentFrame + 1) == frames.Count)
        {
            frames.Add(frame);
            _mCurrentFrame = frames.Count - 1;
        }
        else
        {
            ++_mCurrentFrame;
            frames.Insert(_mCurrentFrame, frame);
        }
        // copy colors
        if (_mCurrentFrame >= 0 &&
            _mCurrentFrame < frames.Count)
        {
            ChromaDevice2DEnum device = animation.Device;
            int maxRow    = ChromaUtils.GetMaxRow(device);
            int maxColumn = ChromaUtils.GetMaxColumn(device);
            for (int i = 0; i < maxRow; ++i)
            {
                var row = frame[i];
                for (int j = 0; j < maxColumn; ++j)
                {
                    row[j] = oldFrame[i][j];
                }
            }
        }
        animation.Frames = frames;
        animation.RefreshCurve();
    }
    private void OnClickLastButton()
    {
        ChromaSDKAnimation2D animation = GetAnimation();

        _mCurrentFrame = 0;
        if (animation.Frames.Count > 0)
        {
            _mCurrentFrame = animation.Frames.Count - 1;
        }
        animation.RefreshCurve();
    }
    private void OnClickReverseAnimationButton()
    {
        ChromaSDKAnimation2D animation = GetAnimation();

        EditorUtility.SetDirty(animation);
        var frames = animation.Frames; //copy

        Unload();
        frames.Reverse();
        animation.Frames = frames;
        animation.RefreshCurve();
    }
    private void OnClickResetButton()
    {
        ChromaSDKAnimation2D animation = GetAnimation();

        EditorUtility.SetDirty(animation);
        Unload();

        _mCurrentFrame = 0;

        animation.ClearFrames();
        animation.RefreshCurve();
    }
    private void OnClickSetDevice()
    {
        ChromaSDKAnimation2D animation = GetAnimation();

        EditorUtility.SetDirty(animation);
        Unload();

        if (animation.Device != _mDevice)
        {
            animation.Device = _mDevice;
            animation.ClearFrames();
            animation.RefreshCurve();
        }
    }
    private void AutoOverrideTime()
    {
        if (_mAnimation)
        {
            if (_mAnimation is ChromaSDKAnimation1D)
            {
                ChromaSDKAnimation1D animation = _mAnimation as ChromaSDKAnimation1D;
                var   frames    = animation.Frames; //copy
                float frameTime = _mInterval;
                float time      = 0.0f;
                //clear old keys
                while (animation.Curve.keys.Length > 0)
                {
                    animation.Curve.RemoveKey(0);
                }
                //add keys on new interval
                for (int i = 0; i < frames.Count; ++i)
                {
                    time += frameTime;
                    animation.Curve.AddKey(time, 0f);
                }
                animation.RefreshCurve();
            }
            else if (_mAnimation is ChromaSDKAnimation2D)
            {
                ChromaSDKAnimation2D animation = _mAnimation as ChromaSDKAnimation2D;

                var   frames    = animation.Frames; //copy
                float frameTime = _mInterval;
                float time      = 0.0f;
                //clear old keys
                while (animation.Curve.keys.Length > 0)
                {
                    animation.Curve.RemoveKey(0);
                }
                //add keys on new interval
                for (int i = 0; i < frames.Count; ++i)
                {
                    time += frameTime;
                    animation.Curve.AddKey(time, 0f);
                }
                animation.RefreshCurve();
            }
        }
    }
    private void OnClickNextButton()
    {
        ChromaSDKAnimation2D animation = GetAnimation();

        EditorUtility.SetDirty(animation);
        var frames = animation.Frames; //copy

        if (_mCurrentFrame < 0 ||
            _mCurrentFrame >= frames.Count)
        {
            _mCurrentFrame = 0;
        }
        if ((_mCurrentFrame + 1) < frames.Count)
        {
            ++_mCurrentFrame;
        }
        animation.RefreshCurve();
    }
 private void ResetAnimation()
 {
     if (_mAnimation)
     {
         if (_mAnimation is ChromaSDKAnimation1D)
         {
             ChromaSDKAnimation1D animation = _mAnimation as ChromaSDKAnimation1D;
             animation.ClearFrames();
             animation.RefreshCurve();
         }
         else if (_mAnimation is ChromaSDKAnimation2D)
         {
             ChromaSDKAnimation2D animation = _mAnimation as ChromaSDKAnimation2D;
             animation.ClearFrames();
             animation.RefreshCurve();
         }
         ChromaSDKAnimationBaseEditor.GoToFirstFrame();
     }
 }
    private void OnClickOverrideButton()
    {
        ChromaSDKAnimation2D animation = GetAnimation();

        EditorUtility.SetDirty(animation);
        var   frames    = animation.Frames; //copy
        float frameTime = _mOverrideFrameTime;
        float time      = 0.0f;

        //clear old keys
        while (animation.Curve.keys.Length > 0)
        {
            animation.Curve.RemoveKey(0);
        }
        //add keys on new interval
        for (int i = 0; i < frames.Count; ++i)
        {
            time += frameTime;
            animation.Curve.AddKey(time, 0f);
        }
        animation.RefreshCurve();
    }
 private void DeleteFrame()
 {
     if (_mAnimation)
     {
         if (_mAnimation is ChromaSDKAnimation1D)
         {
             ChromaSDKAnimation1D      animation = _mAnimation as ChromaSDKAnimation1D;
             List <EffectArray1dInput> frames    = animation.Frames;
             if (frames.Count > 1)
             {
                 frames.RemoveAt(0);
             }
             else
             {
                 frames[0] = ChromaUtils.CreateColors1D(animation.Device);
             }
             animation.Frames = frames;
             animation.RefreshCurve();
         }
         else if (_mAnimation is ChromaSDKAnimation2D)
         {
             ChromaSDKAnimation2D      animation = _mAnimation as ChromaSDKAnimation2D;
             List <EffectArray2dInput> frames    = animation.Frames;
             if (frames.Count > 1)
             {
                 frames.RemoveAt(0);
             }
             else
             {
                 frames[0] = ChromaUtils.CreateColors2D(animation.Device);
             }
             animation.Frames = frames;
             animation.RefreshCurve();
         }
         ChromaSDKAnimationBaseEditor.GoToFirstFrame();
     }
 }
    private void OnClickDeleteButton()
    {
        ChromaSDKAnimation2D animation = GetAnimation();

        EditorUtility.SetDirty(animation);
        var frames = animation.Frames; //copy

        Unload();

        if (_mCurrentFrame < 0 ||
            _mCurrentFrame >= frames.Count)
        {
            _mCurrentFrame = 0;
        }
        if (frames.Count == 1)
        {
            // reset frame
            frames[0] = ChromaUtils.CreateColors2D(animation.Device);

            // reset curve
            while (animation.Curve.keys.Length > 0)
            {
                animation.Curve.RemoveKey(0);
            }
        }
        else if (frames.Count > 0)
        {
            frames.RemoveAt(_mCurrentFrame);
            if (_mCurrentFrame == frames.Count)
            {
                _mCurrentFrame = frames.Count - 1;
            }
        }
        animation.Frames = frames;
        animation.RefreshCurve();
    }