protected override void OnClickPreviewButton() { ChromaSDKAnimation1D animation = GetAnimation(); EditorUtility.SetDirty(animation); var frames = animation.Frames; //copy Unload(); if (ChromaConnectionManager.Instance.Connected) { if (_mCurrentFrame >= 0 && _mCurrentFrame < frames.Count) { ChromaDevice1DEnum device = animation.Device; EffectArray1dInput colors = frames[_mCurrentFrame]; EffectResponseId effect = ChromaUtils.CreateEffectCustom1D(device, colors); if (null != effect && effect.Result == 0) { ChromaUtils.SetEffect(effect.Id); ChromaUtils.RemoveEffect(effect.Id); } } } }
/// <summary> /// Load the effects before playing /// </summary> public void Load() { //Debug.Log("Load:"); if (_mIsLoaded) { //Debug.LogError("Animation has already been loaded!"); return; } if (ChromaConnectionManager.Instance.Connected) { for (int i = 0; i < Frames.Count; ++i) { EffectArray1dInput frame = Frames[i]; EffectResponseId effect = ChromaUtils.CreateEffectCustom1D(Device, frame); /* * // app can check the effect list for null or non-zero result * if (null == effect || * effect.Result != 0) * { * Debug.LogError("Failed to create effect!"); * } */ _mEffects.Add(effect); } _mIsLoaded = true; } }
private void OnClickAddButton() { ChromaSDKAnimation1D animation = GetAnimation(); EditorUtility.SetDirty(animation); var frames = animation.Frames; //copy Unload(); if (_mCurrentFrame < 0 || _mCurrentFrame >= frames.Count) { _mCurrentFrame = 0; } EffectArray1dInput frame = ChromaUtils.CreateColors1D(animation.Device); if (_mCurrentFrame == frames.Count || (_mCurrentFrame + 1) == frames.Count) { frames.Add(frame); _mCurrentFrame = frames.Count - 1; } else { ++_mCurrentFrame; frames.Insert(_mCurrentFrame, frame); } animation.Frames = frames; animation.RefreshCurve(); }
public static EffectArray1dInput CreateColors1D(ChromaDevice1DEnum device) { int maxLeds = ChromaUtils.GetMaxLeds(device); EffectArray1dInput effectArray1dInput = new EffectArray1dInput(); for (int i = 0; i < maxLeds; i++) { effectArray1dInput.Add(new int?(0)); } return(effectArray1dInput); }
public static EffectArray1dInput CreateRandomColors1D(ChromaDevice1DEnum device) { int maxLeds = GetMaxLeds(device); var elements = new EffectArray1dInput(); for (int i = 0; i < maxLeds; ++i) { elements.Add(_sRandom.Next(16777215)); } return(elements); }
private void OnClickInsertButton() { ChromaSDKAnimation1D animation = GetAnimation(); EditorUtility.SetDirty(animation); var frames = animation.Frames; //copy Unload(); if (_mCurrentFrame < 0 || _mCurrentFrame >= frames.Count) { _mCurrentFrame = 0; } EffectArray1dInput oldFrame; if (frames.Count > 0) { oldFrame = frames[_mCurrentFrame]; } else { oldFrame = ChromaUtils.CreateColors1D(animation.Device); } EffectArray1dInput frame = ChromaUtils.CreateColors1D(animation.Device); if (frames.Count == 0) { frames.Add(frame); _mCurrentFrame = frames.Count - 1; } else { frames.Insert(_mCurrentFrame, frame); } // copy colors if (_mCurrentFrame >= 0 && _mCurrentFrame < frames.Count) { ChromaDevice1DEnum device = animation.Device; int maxLeds = ChromaUtils.GetMaxLeds(device); for (int i = 0; i < maxLeds; ++i) { frame[i] = oldFrame[i]; } } animation.Frames = frames; animation.RefreshCurve(); }
public void Load() { if (this._mIsLoaded) { Debug.LogError("Animation has already been loaded!"); return; } if (ChromaConnectionManager.Instance.Connected) { for (int i = 0; i < this.Frames.Count; i++) { EffectArray1dInput input = this.Frames[i]; EffectResponseId item = ChromaUtils.CreateEffectCustom1D(this.Device, input); this._mEffects.Add(item); } this._mIsLoaded = true; } }
private void OnClickCopyButton() { ChromaSDKAnimation1D animation = GetAnimation(); EditorUtility.SetDirty(animation); var frames = animation.Frames; //copy if (_mCurrentFrame >= 0 && _mCurrentFrame < frames.Count) { ChromaDevice1DEnum device = animation.Device; int maxLeds = ChromaUtils.GetMaxLeds(device); var frame = frames[_mCurrentFrame]; _mColors = ChromaUtils.CreateColors1D(device); if (frame.Count == maxLeds) { for (int i = 0; i < maxLeds; ++i) { _mColors[i] = frame[i]; } } } }
private static EffectResponseId CreateEffectCustom1D(ChromaApi api, ChromaDevice1DEnum device, EffectArray1dInput input) { if (api == null) { Debug.LogError("CreateEffectCustom1D: Parameter api is null!"); return(null); } if (input == null) { Debug.LogError("CreateEffectCustom1D: Parameter input is null!"); return(null); } int maxLeds = ChromaUtils.GetMaxLeds(device); if (maxLeds != input.Count) { Debug.LogError(string.Format("CreateEffectCustom1D Array size mismatch element: %d==%d!", maxLeds, input.Count)); } try { switch (device) { case ChromaDevice1DEnum.ChromaLink: return(api.PostChromaLinkCustom(input)); case ChromaDevice1DEnum.Headset: return(api.PostHeadsetCustom(input)); case ChromaDevice1DEnum.Mousepad: return(api.PostMousepadCustom(input)); } } catch (Exception) { } return(null); }
public static EffectResponseId CreateEffectCustom1D(ChromaDevice1DEnum device, EffectArray1dInput input) { if (ChromaConnectionManager.Instance.Connected) { ChromaApi apiChromaInstance = ChromaConnectionManager.Instance.ApiChromaInstance; return(ChromaUtils.CreateEffectCustom1D(apiChromaInstance, device, input)); } return(null); }
private void CaptureFrame() { if (_mAnimation && _mRenderTexture && _mRenderCamera) { if (_mAnimation is ChromaSDKAnimation1D) { ChromaSDKAnimation1D animation = (ChromaSDKAnimation1D)_mAnimation; animation.Unload(); int maxLeds = ChromaUtils.GetMaxLeds(animation.Device); _mTempTexture = new Texture2D(RENDER_TEXTURE_SIZE, RENDER_TEXTURE_SIZE, TextureFormat.RGB24, false); RenderTexture.active = _mRenderTexture; _mRenderCamera.Render(); DisplayRenderTexture(0, maxLeds, 1); _mTempTexture.ReadPixels(new Rect(0, 0, _mTempTexture.width, _mTempTexture.height), 0, 0, false); _mTempTexture.Apply(); TextureScale.Bilinear(_mTempTexture, maxLeds, 1); _mTempTexture.Apply(); RenderTexture.active = null; Color[] pixels = _mTempTexture.GetPixels(); List <EffectArray1dInput> frames = animation.Frames; EffectArray1dInput frame = ChromaUtils.CreateColors1D(animation.Device); int index = 0; if (frame.Count > 0) { for (int i = 0; i < maxLeds; ++i) { Color color = pixels[index]; frame[i] = ChromaUtils.ToBGR(color); ++index; } } #if !SHOW_TEMP_TEXTURE DestroyImmediate(_mTempTexture); #endif frames.Add(frame); animation.Frames = frames; ChromaSDKAnimationBaseEditor.GoToLastFrame(); } else if (_mAnimation is ChromaSDKAnimation2D) { ChromaSDKAnimation2D animation = (ChromaSDKAnimation2D)_mAnimation; animation.Unload(); int maxRow = ChromaUtils.GetMaxRow(animation.Device); int maxColumn = ChromaUtils.GetMaxColumn(animation.Device); _mTempTexture = new Texture2D(RENDER_TEXTURE_SIZE, RENDER_TEXTURE_SIZE, TextureFormat.RGB24, false); RenderTexture.active = _mRenderTexture; _mRenderCamera.Render(); DisplayRenderTexture(0, maxColumn, maxRow); _mTempTexture.ReadPixels(new Rect(0, 0, _mTempTexture.width, _mTempTexture.height), 0, 0, false); _mTempTexture.Apply(); TextureScale.Bilinear(_mTempTexture, maxColumn, maxRow); _mTempTexture.Apply(); RenderTexture.active = null; Color[] pixels = _mTempTexture.GetPixels(); List <EffectArray2dInput> frames = animation.Frames; EffectArray2dInput frame = ChromaUtils.CreateColors2D(animation.Device); int index = 0; for (int i = maxRow - 1; i >= 0; --i) { List <int> row = frame[i]; for (int j = 0; j < maxColumn; ++j) { Color color = pixels[index]; row[j] = ChromaUtils.ToBGR(color); ++index; } } #if !SHOW_TEMP_TEXTURE DestroyImmediate(_mTempTexture); #endif frames.Add(frame); animation.Frames = frames; ChromaSDKAnimationBaseEditor.GoToLastFrame(); } } }
private void OnClickExportButton() { ChromaSDKAnimation1D animation = GetAnimation(); if (animation) { string initialFileName = string.Format("{0}.chroma", animation.name); string path = EditorUtility.SaveFilePanel("Save Chroma", GetChromaFolder(), initialFileName, GetChromaExtensions()); if (!string.IsNullOrEmpty(path)) { EditorPrefs.SetString(KEY_FOLDER_CHROMA, Path.GetDirectoryName(path)); using (FileStream fs = File.Open(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite)) { using (BinaryWriter bw = new BinaryWriter(fs)) { //version bw.Write((int)ANIMATION_VERSION); //device type bw.Write((byte)ChromaDeviceTypeEnum.Type_1D); //device bw.Write((byte)animation.Device); List <EffectArray1dInput> frames = animation.Frames; //frame count bw.Write(frames.Count); //frames for (int index = 0; index < frames.Count; ++index) { EffectArray1dInput frame = frames[index]; //duration float duration = 0.0f; if (index < frames.Count && index < animation.Curve.keys.Length) { if (index == 0) { duration = animation.Curve.keys[index].time; } else { duration = animation.Curve.keys[index].time - animation.Curve.keys[index - 1].time; } } bw.Write((float)duration); // colors int maxLeds = ChromaUtils.GetMaxLeds(animation.Device); for (int i = 0; i < maxLeds; ++i) { int color = (int)frame[i]; bw.Write((int)color); } } bw.Flush(); AssetDatabase.Refresh(); } } } } }
private void OnClickImportButton() { ChromaSDKAnimation1D animation = GetAnimation(); if (animation) { //string initialPath = string.Format("{0}/{1}.chroma", GetChromaFolder(), animation.name); string path = EditorUtility.OpenFilePanel("Open Chroma", GetChromaFolder(), GetChromaExtensions()); if (!string.IsNullOrEmpty(path)) { EditorPrefs.SetString(KEY_FOLDER_CHROMA, Path.GetDirectoryName(path)); using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (BinaryReader br = new BinaryReader(fs)) { //version int version = br.ReadInt32(); if (version != ANIMATION_VERSION) { Debug.LogError("Unexpected file version!"); return; } //device type if (br.ReadByte() != (byte)ChromaDeviceTypeEnum.Type_1D) { Debug.LogError("Unexpected device type!"); return; } //device switch ((ChromaDevice1DEnum)br.ReadByte()) { case ChromaDevice1DEnum.ChromaLink: animation.Device = ChromaDevice1DEnum.ChromaLink; break; case ChromaDevice1DEnum.Headset: animation.Device = ChromaDevice1DEnum.Headset; break; case ChromaDevice1DEnum.Mousepad: animation.Device = ChromaDevice1DEnum.Mousepad; break; default: Debug.LogError("Unexpected device!"); return; } List <EffectArray1dInput> frames = new List <EffectArray1dInput>(); // reset curve while (animation.Curve.keys.Length > 0) { animation.Curve.RemoveKey(0); } //frame count int frameCount = br.ReadInt32(); float time = 0f; //frames for (int index = 0; index < frameCount; ++index) { EffectArray1dInput frame = new EffectArray1dInput(); //duration float duration = br.ReadSingle(); time += duration; animation.Curve.AddKey(time, 0f); // colors int maxLeds = ChromaUtils.GetMaxLeds(animation.Device); for (int i = 0; i < maxLeds; ++i) { int color = br.ReadInt32(); frame.Add(color); } frames.Add(frame); } animation.Frames = frames; } } } } }
public override void OnInspectorGUI() { if (!EditorApplication.isCompiling) { base.OnInspectorGUI(); // backup original color Color oldBackgroundColor = GUI.backgroundColor; ChromaSDKAnimation1D animation = GetAnimation(); if (_mLastTarget != animation) { _mLastTarget = animation; _mDevice = animation.Device; } var frames = animation.Frames; //copy if (frames.Count == 0) { OnClickAddButton(); } // Device GUILayout.BeginHorizontal(GUILayout.Width(Screen.width - LAYOUT_PADDING)); GUILayout.Label("Device:"); _mDevice = (ChromaDevice1DEnum)EditorGUILayout.EnumPopup(_mDevice, GUILayout.Width(150)); if (GUILayout.Button("Set", GUILayout.Width(100))) { OnClickSetDevice(); } GUILayout.FlexibleSpace(); GUILayout.Label(ChromaUtils.VERSION); GUILayout.EndHorizontal(); bool connected = ChromaConnectionManager.Instance.Connected; GUI.enabled = connected; GUILayout.BeginHorizontal(GUILayout.Width(Screen.width - LAYOUT_PADDING)); if (GUILayout.Button("Play")) { OnClickPlayButton(); } if (GUILayout.Button("Stop")) { OnClickStopButton(); } GUI.enabled = connected && !animation.IsLoaded(); if (GUILayout.Button("Load")) { OnClickLoadButton(); } GUI.enabled = connected && animation.IsLoaded(); if (GUILayout.Button("Unload")) { OnClickUnloadButton(); } GUI.enabled = true; if (GUILayout.Button("Preview")) { OnClickPreviewButton(); } GUILayout.EndHorizontal(); // Import GUILayout.BeginHorizontal(GUILayout.Width(Screen.width - LAYOUT_PADDING)); GUILayout.FlexibleSpace(); if (GUILayout.Button("Import")) { OnClickImportButton(); } if (GUILayout.Button("Export")) { OnClickExportButton(); } if (GUILayout.Button("Import Image")) { OnClickImportImageButton(); } if (GUILayout.Button("Import Animation")) { OnClickImportAnimationButton(); } if (GUILayout.Button("Reverse Animation")) { OnClickReverseAnimationButton(); } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); // Apply GUILayout.BeginHorizontal(GUILayout.Width(Screen.width - LAYOUT_PADDING)); if (GUILayout.Button("Clear")) { OnClickClearButton(); } if (GUILayout.Button("Fill")) { OnClickFillButton(); } if (GUILayout.Button("Random")) { OnClickRandomButton(); } if (GUILayout.Button("Copy")) { OnClickCopyButton(); } if (GUILayout.Button("Paste")) { OnClickPasteButton(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUILayout.Width(Screen.width - LAYOUT_PADDING)); if (GUILayout.Button("Contrast")) { OnClickContrastButton(); } if (GUILayout.Button("Saturate")) { OnClickSaturateButton(); } if (GUILayout.Button("Desaturate")) { OnClickDesaturateButton(); } if (GUILayout.Button("Darken")) { OnClickDarkenButton(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUILayout.Width(Screen.width - LAYOUT_PADDING)); if (GUILayout.Button("Shift Left")) { OnClickShiftButton(-1); } if (GUILayout.Button("Shift Right")) { OnClickShiftButton(1); } GUILayout.EndHorizontal(); int maxLeds = ChromaUtils.GetMaxLeds(animation.Device); GUILayout.Label(string.Format("1 x {0}", maxLeds)); // Preview Texture2D oldTexture = GUI.skin.button.normal.background; SetupBlankTexture(); if (_mCurrentFrame < frames.Count) { GUILayout.BeginHorizontal(GUILayout.Width(Screen.width - LAYOUT_PADDING)); EffectArray1dInput frame = frames[_mCurrentFrame]; for (int i = 0; i < frame.Count; ++i) { int color = (int)frame[i]; GUI.backgroundColor = ChromaUtils.ToRGB(color); // use a box instead of button so it looks better GUILayout.Box("", GUILayout.Width(12)); Rect rect = GUILayoutUtility.GetLastRect(); // use the box location to use a button to catch the click event GUI.skin.button.normal.background = _sTextureClear; if (GUI.Button(rect, "")) { OnClickColor(i); } GUI.skin.button.normal.background = oldTexture; } GUILayout.EndHorizontal(); } GUI.SetNextControlName(""); // restore original color GUI.backgroundColor = oldBackgroundColor; // show separator EditorGUILayout.LabelField("", GUI.skin.horizontalSlider); // preset colors GUILayout.BeginHorizontal(GUILayout.Width(Screen.width - LAYOUT_PADDING)); const float k = 0.5f; Color[] palette = { Color.red, Color.red *k, ORANGE, ORANGE *k, Color.yellow, Color.yellow *k, Color.green, Color.green *k, Color.blue, Color.blue *k, Color.cyan, Color.cyan *k, PURPLE, PURPLE *k, Color.white, Color.gray, Color.black, }; foreach (Color color in palette) { Color newColor = color; newColor.a = 1f; GUI.backgroundColor = newColor; // use a box instead of button so it looks better GUILayout.Box("", GUILayout.Width(12)); Rect rect = GUILayoutUtility.GetLastRect(); // use the box location to use a button to catch the click event GUI.skin.button.normal.background = _sTextureClear; if (GUI.Button(rect, "")) { _mColor = newColor; } GUI.skin.button.normal.background = oldTexture; } GUILayout.EndHorizontal(); // restore original color GUI.backgroundColor = oldBackgroundColor; // Set the color _mColor = EditorGUILayout.ColorField("Brush color", _mColor); GUILayout.BeginHorizontal(GUILayout.Width(Screen.width - LAYOUT_PADDING)); GUI.SetNextControlName(CONTROL_OVERRIDE); GUILayout.Label("Override Time (ALL frames)"); _mOverrideFrameTime = EditorGUILayout.FloatField(_mOverrideFrameTime, GUILayout.Width(100)); GUI.SetNextControlName(string.Empty); if (GUILayout.Button("Override", GUILayout.Width(100))) { OnClickOverrideButton(); } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); EditorGUILayout.LabelField("Frame:", string.Format("{0} of {1}", _mCurrentFrame + 1, null == frames ? 0 : frames.Count)); float duration = 0.0f; if (_mCurrentFrame < frames.Count && _mCurrentFrame < animation.Curve.keys.Length) { if (_mCurrentFrame == 0) { duration = animation.Curve.keys[_mCurrentFrame].time; } else { duration = animation.Curve.keys[_mCurrentFrame].time - animation.Curve.keys[_mCurrentFrame - 1].time; } } GUI.SetNextControlName(CONTROL_DURATION); GUILayout.BeginHorizontal(GUILayout.Width(Screen.width - LAYOUT_PADDING)); float newDuration = EditorGUILayout.FloatField("Duration:", duration); if (duration != newDuration && newDuration > 0f) { if (_mCurrentFrame < frames.Count && _mCurrentFrame < animation.Curve.keys.Length) { float time; if (_mCurrentFrame == 0) { time = newDuration; } else { time = animation.Curve.keys[_mCurrentFrame - 1].time + newDuration; } animation.Curve.RemoveKey(_mCurrentFrame); animation.Curve.AddKey(time, 0f); } } GUILayout.Label("seconds(s)"); GUILayout.EndHorizontal(); GUI.SetNextControlName(string.Empty); GUILayout.BeginHorizontal(GUILayout.Width(Screen.width - LAYOUT_PADDING)); if (GUILayout.Button("First")) { OnClickFirstButton(); } if (GUILayout.Button("Previous")) { OnClickPreviousButton(); } if (GUILayout.Button("Next")) { OnClickNextButton(); } if (GUILayout.Button("Last")) { OnClickLastButton(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUILayout.Width(Screen.width - LAYOUT_PADDING)); if (GUILayout.Button("Add")) { OnClickAddButton(); } if (GUILayout.Button("Insert")) { OnClickInsertButton(); } if (GUILayout.Button("Delete")) { OnClickDeleteButton(); } if (GUILayout.Button("Reset")) { OnClickResetButton(); } GUILayout.EndHorizontal(); // Custom Curve animation.Curve = EditorGUILayout.CurveField("Edit Curve:", animation.Curve); //Debug.Log(GUI.GetNameOfFocusedControl()); if (string.IsNullOrEmpty(GUI.GetNameOfFocusedControl())) { Event e = Event.current; if (e.type == EventType.keyUp) { if (e.keyCode == KeyCode.Delete) { OnClickClearButton(); Repaint(); } else if (e.keyCode == KeyCode.C && e.modifiers == EventModifiers.Control) { OnClickCopyButton(); } else if (e.keyCode == KeyCode.V && e.modifiers == EventModifiers.Control) { OnClickPasteButton(); Repaint(); } else if (e.keyCode == KeyCode.P) { OnClickPlayButton(); } else if (e.keyCode == KeyCode.LeftArrow) { OnClickPreviousButton(); Repaint(); } else if (e.keyCode == KeyCode.RightArrow) { OnClickNextButton(); Repaint(); } else if (e.keyCode == KeyCode.Plus || e.keyCode == KeyCode.KeypadPlus) { OnClickAddButton(); Repaint(); } else if (e.keyCode == KeyCode.Minus || e.keyCode == KeyCode.KeypadMinus) { OnClickDeleteButton(); Repaint(); } } } } Repaint(); }