diff options
author | chai <chaifix@163.com> | 2021-04-21 21:52:56 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-04-21 21:52:56 +0800 |
commit | 6d0c9a214dc0fda264e8588fa02aaa19b0b2cc5f (patch) | |
tree | 6a853a0b0cfb5818c864c3794cb58075876c07b0 /Assets/ProFlares/Editor/ProFlareInspector.cs |
+init
Diffstat (limited to 'Assets/ProFlares/Editor/ProFlareInspector.cs')
-rw-r--r-- | Assets/ProFlares/Editor/ProFlareInspector.cs | 1390 |
1 files changed, 1390 insertions, 0 deletions
diff --git a/Assets/ProFlares/Editor/ProFlareInspector.cs b/Assets/ProFlares/Editor/ProFlareInspector.cs new file mode 100644 index 0000000..91de6ac --- /dev/null +++ b/Assets/ProFlares/Editor/ProFlareInspector.cs @@ -0,0 +1,1390 @@ + +/// ProFlares - v1.08 - Copyright 2014-2015 All rights reserved - ProFlares.com + + +/// <summary> +/// ProFlareInspector.cs +/// Custom inspector for the ProFlare +/// </summary> + +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.Collections.Generic; + +[CanEditMultipleObjects] +[CustomEditor(typeof(ProFlare))] +public class ProFlareInspector : Editor { + + ProFlare _flare; + + GUIStyle title; + + GUIStyle thinButton; + + GUIStyle thinButtonRed; + + GUIStyle dropDownButton; + + GUIStyle enumStyleButton; + + private static Texture2D visibility_On; + + private static Texture2D visibility_Off; + + bool listeningForGuiChanges; + + bool guiChanged = false; + + int selectionCount = 0; + + private void CheckUndo() + { +#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5_0 + + Event e = Event.current; + + if ( e.type == EventType.MouseDown && e.button == 0 || e.type == EventType.KeyUp && ( e.keyCode == KeyCode.Tab ) ) { + //Debug.Log("record1"); + Undo.RecordObject(target,"ProFlare Undo"); + + listeningForGuiChanges = true; + guiChanged = false; + } + + if ( listeningForGuiChanges && guiChanged ) { + //Debug.Log("record2"); + + Undo.RecordObject(target,"ProFlare Undo"); + listeningForGuiChanges = false; + //TODO - Undo Not Refreshing Flare Batches. + //for(int i = 0; i < _flare.FlareBatches.Length; i++){} + } +#else + Event e = Event.current; + + if ( e.type == EventType.MouseDown && e.button == 0 || e.type == EventType.KeyUp && ( e.keyCode == KeyCode.Tab ) ) { + Undo.SetSnapshotTarget( _flare, "ProFlare Undo" ); + Undo.CreateSnapshot(); + Undo.ClearSnapshotTarget(); + listeningForGuiChanges = true; + guiChanged = false; + } + + if ( listeningForGuiChanges && guiChanged ) { + Undo.SetSnapshotTarget( _flare, "ProFlare Undo" ); + Undo.RegisterSnapshot(); + Undo.ClearSnapshotTarget(); + listeningForGuiChanges = false; + //TODO - Undo Not Refreshing Flare Batches. + //for(int i = 0; i < _flare.FlareBatches.Length; i++){} + } +#endif + } + + public List<ProFlare> Flares = new List<ProFlare>(); + + public override void OnInspectorGUI () { + + selectionCount = 0; + + Flares.Clear(); + + foreach(GameObject go in Selection.gameObjects){ + + ProFlare selectedFlare = go.GetComponent<ProFlare>(); + if(selectedFlare){ + Flares.Add(selectedFlare); + selectionCount++; + } + } + + if(selectionCount > 1){ + EditorGUILayout.HelpBox("Multiple Flares selected.", MessageType.Warning,false); + //EditorGUI.showMixedValue = true; + } + + _flare = target as ProFlare; + + CheckUndo(); + +#if UNITY_4_3 + EditorGUI.BeginChangeCheck(); +#endif + + FlareEditorHelper.DrawGuiDivider(); + + bool error = false; + + title = FlareEditorHelper.TitleStyle(); + thinButton = FlareEditorHelper.ThinButtonStyle(); + enumStyleButton = FlareEditorHelper.EnumStyleButton(); + thinButtonRed = FlareEditorHelper.ThinButtonRedStyle(); + + EditorGUILayout.LabelField("Flare Setup :",title); + + GUILayout.Space(10f); + + dropDownButton = FlareEditorHelper.DropDownButtonStyle(); + + + if(selectionCount <= 1) + { + EditorGUILayout.BeginHorizontal(); + if((!_flare.EditingAtlas)&&(_flare._Atlas != null)) + GUI.enabled = false; + + ProFlareAtlas _Atlas = EditorGUILayout.ObjectField("Flare Atlas", _flare._Atlas, typeof(ProFlareAtlas), false) as ProFlareAtlas; + + GUI.enabled = true; + + if(_flare._Atlas) + if(GUILayout.Button("EDIT",GUILayout.Width(60))){ + _flare.EditingAtlas = _flare.EditingAtlas ? false : true; + } + + EditorGUILayout.EndHorizontal(); + + if((_flare.EditingAtlas)&&(_flare._Atlas != null)){ + + EditorGUILayout.HelpBox("Changing atlas can cause data loss if elements do NOT exist in the new atlas.", MessageType.Warning,false); + } + + GUI.enabled = true; + + if(_flare._Atlas != _Atlas){ + + _flare._Atlas = _Atlas; + + + ProFlareBatch[] flareBatchs = GameObject.FindObjectsOfType(typeof(ProFlareBatch)) as ProFlareBatch[]; + + int matchCount = 0; + foreach(ProFlareBatch flareBatch in flareBatchs){ + if(flareBatch._atlas == _Atlas){ + matchCount++; + } + } + _flare.FlareBatches = new ProFlareBatch[matchCount]; + int count = 0; + foreach(ProFlareBatch flareBatch in flareBatchs){ + if(flareBatch._atlas == _Atlas){ + _flare.FlareBatches[count] = flareBatch; + _flare.FlareBatches[count].dirty = true; + count++; + } + } + if(count != 0){ + if(_flare.Elements.Count == 0){ + ProFlareElement element = new ProFlareElement(); + element.flare = _flare; + element.SpriteName = _flare._Atlas.elementsList[0].name; + element.flareAtlas = _flare._Atlas; + element.position = -1; + element.Scale = 1; + _flare.Elements.Add(element); + } + } + } + + + bool missing = false; + for(int i = 0; i < _flare.FlareBatches.Length; i++){ + + if(_flare.FlareBatches[i] == null) + missing = true; + } + if(missing){ + + ProFlareBatch[] flareBatchs = GameObject.FindObjectsOfType(typeof(ProFlareBatch)) as ProFlareBatch[]; + + int matchCount = 0; + foreach(ProFlareBatch flareBatch in flareBatchs){ + if(flareBatch._atlas == _Atlas){ + matchCount++; + } + } + _flare.FlareBatches = new ProFlareBatch[matchCount]; + int count = 0; + foreach(ProFlareBatch flareBatch in flareBatchs){ + if(flareBatch._atlas == _Atlas){ + _flare.FlareBatches[count] = flareBatch; + _flare.FlareBatches[count].dirty = true; + count++; + } + } + } + + EditorGUILayout.LabelField("Rendered by : "); + if(_flare.FlareBatches.Length != 0) + for(int i = 0; i < _flare.FlareBatches.Length; i++){ + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(" "+_flare.FlareBatches[i].gameObject.name); + if(GUILayout.Button("Select",GUILayout.Width(60))){ + Selection.activeGameObject = _flare.FlareBatches[i].gameObject; + } + EditorGUILayout.EndHorizontal(); + } + + if(error){ + EditorGUILayout.HelpBox("Fix Errors before continuing.", MessageType.Error); + } + } + FlareEditorHelper.DrawGuiDivider(); + + EditorGUILayout.LabelField("Global Settings :",title); + GUILayout.Space(10f); + + Rect r = EditorGUILayout.BeginVertical("box"); + { + Rect r2 = r; + r2.height = 20; + + if (GUI.Button(r2, GUIContent.none,dropDownButton)) + _flare.EditGlobals = _flare.EditGlobals ? false : true; + + GUILayout.Label("General"); + + if(_flare.EditGlobals){ + + GUILayout.Space(5f); + + //Scale + float _flareGlobalScale = EditorGUILayout.Slider("Scale",_flare.GlobalScale,0f,2000f); + + if(_flareGlobalScale != _flare.GlobalScale){ + + _flare.GlobalScale = _flareGlobalScale; + + foreach(ProFlare flare in Flares){ + flare.GlobalScale = _flare.GlobalScale; + } + } + + _flare.MultiplyScaleByTransformScale = EditorGUILayout.Toggle("Multiply Scale By Transform Scale",_flare.MultiplyScaleByTransformScale); + + float _flareGlobalBrightness = EditorGUILayout.Slider("Brightness",_flare.GlobalBrightness,0f,1f); + + if(_flareGlobalBrightness != _flare.GlobalBrightness){ + _flare.GlobalBrightness = _flareGlobalBrightness; + _flare.GlobalTintColor.a = _flare.GlobalBrightness; + + foreach(ProFlare flare in Flares){ + flare.GlobalBrightness = _flareGlobalBrightness; + flare.GlobalTintColor.a = _flare.GlobalBrightness; + } + } + + Color _flareGlobalTintColor = EditorGUILayout.ColorField("Tint",_flare.GlobalTintColor); + + if(_flareGlobalTintColor != _flare.GlobalTintColor){ + _flare.GlobalTintColor = _flareGlobalTintColor; + _flare.GlobalBrightness = _flare.GlobalTintColor.a; + + foreach(ProFlare flare in Flares){ + flare.GlobalTintColor = _flareGlobalTintColor; + flare.GlobalBrightness = _flare.GlobalTintColor.a; + } + } + + FlareEditorHelper.DrawGuiInBoxDivider(); + + //Angle Falloff Options + if(selectionCount <= 1){ + GUILayout.BeginHorizontal(); + { + _flare.UseAngleLimit = EditorGUILayout.Toggle("Use Angle Falloff",_flare.UseAngleLimit); + GUI.enabled = _flare.UseAngleLimit; + _flare.maxAngle = Mathf.Clamp(EditorGUILayout.FloatField("Max Angle",_flare.maxAngle),0,360); + } + GUILayout.EndHorizontal(); + + _flare.UseAngleScale = EditorGUILayout.Toggle(" Affect Scale",_flare.UseAngleScale); + + _flare.UseAngleBrightness = EditorGUILayout.Toggle(" Affect Brightness",_flare.UseAngleBrightness); + + GUILayout.BeginHorizontal(); + { + _flare.UseAngleCurve = EditorGUILayout.Toggle(" Use Curve",_flare.UseAngleCurve); + GUI.enabled = _flare.UseAngleCurve; + _flare.AngleCurve = EditorGUILayout.CurveField(_flare.AngleCurve); + if(GUILayout.Button("Reset",GUILayout.MaxWidth(50))){ _flare.AngleCurve = new AnimationCurve(new Keyframe(0, 0f), new Keyframe(1, 1.0f));} + GUI.enabled = true; + } + GUILayout.EndHorizontal(); + GUI.enabled = true; + + FlareEditorHelper.DrawGuiInBoxDivider(); + //Max Distance Options - + GUILayout.BeginHorizontal(); + { + _flare.useMaxDistance = EditorGUILayout.Toggle("Use Distance Falloff",_flare.useMaxDistance); + GUI.enabled = _flare.useMaxDistance; + _flare.GlobalMaxDistance = EditorGUILayout.FloatField(" Max Distance",_flare.GlobalMaxDistance); + } + GUILayout.EndHorizontal(); + _flare.useDistanceScale = EditorGUILayout.Toggle(" Affect Scale",_flare.useDistanceScale); + _flare.useDistanceFade = EditorGUILayout.Toggle(" Affect Brightness",_flare.useDistanceFade); + + + GUI.enabled = true; + FlareEditorHelper.DrawGuiInBoxDivider(); + _flare.OffScreenFadeDist = EditorGUILayout.FloatField("Off Screen Fade Distance",_flare.OffScreenFadeDist); + FlareEditorHelper.DrawGuiInBoxDivider(); + + _flare.neverCull = EditorGUILayout.Toggle("Never Cull Flare",_flare.neverCull); + } + } + } + + EditorGUILayout.EndVertical(); + + + if(selectionCount <= 1) + { + r = EditorGUILayout.BeginVertical("box"); + Rect r2 = r; + r2.height = 20; + + + if (GUI.Button(r2, GUIContent.none,dropDownButton)) + _flare.EditDynamicTriggering = _flare.EditDynamicTriggering ? false : true; + + + GUILayout.Label("Dynamics Triggering"); + + if(_flare.EditDynamicTriggering){GUILayout.Space(5f); + + _flare.useDynamicEdgeBoost = EditorGUILayout.Toggle("Use Dynamic Edge Boost",_flare.useDynamicEdgeBoost); + GUI.enabled = _flare.useDynamicEdgeBoost; + _flare.DynamicEdgeBoost = EditorGUILayout.FloatField(" Dynamic Edge Scale",_flare.DynamicEdgeBoost); + _flare.DynamicEdgeBrightness = EditorGUILayout.FloatField(" Dynamic Edge Brightness",_flare.DynamicEdgeBrightness); + _flare.DynamicEdgeRange = EditorGUILayout.FloatField(" Dynamic Edge Range",_flare.DynamicEdgeRange); + _flare.DynamicEdgeBias = EditorGUILayout.FloatField(" Dynamic Edge Bias",_flare.DynamicEdgeBias); + + GUILayout.BeginHorizontal(); + { + _flare.DynamicEdgeCurve = EditorGUILayout.CurveField(" Dynamic Edge Curve", _flare.DynamicEdgeCurve); + if(GUILayout.Button("Reset",GUILayout.MaxWidth(50))) _flare.DynamicEdgeCurve = new AnimationCurve(new Keyframe(0, 0f), new Keyframe(0.5f, 1), new Keyframe(1, 0f)); + } + GUILayout.EndHorizontal(); + GUI.enabled = true; + FlareEditorHelper.DrawGuiInBoxDivider(); + + _flare.useDynamicCenterBoost = EditorGUILayout.Toggle("Use Dynamic Center Boost",_flare.useDynamicCenterBoost); + + GUI.enabled = _flare.useDynamicCenterBoost; + _flare.DynamicCenterRange = EditorGUILayout.FloatField(" Dynamic Center Range",_flare.DynamicCenterRange); + _flare.DynamicCenterBoost = EditorGUILayout.FloatField(" Dynamic Center Scale",_flare.DynamicCenterBoost); + _flare.DynamicCenterBrightness = EditorGUILayout.FloatField(" Dynamic Center Brightness",_flare.DynamicCenterBrightness); + + GUI.enabled = true; + } + + EditorGUILayout.EndVertical(); + } + + + if(selectionCount <= 1) + { + r = EditorGUILayout.BeginVertical("box"); + Rect r2 = r; + r2.height = 20; + + + if (GUI.Button(r2, GUIContent.none,dropDownButton)) + _flare.EditOcclusion = _flare.EditOcclusion ? false : true; + + + GUILayout.Label("Occlusion"); + + if(_flare.EditOcclusion){GUILayout.Space(5f); + _flare.RaycastPhysics = EditorGUILayout.Toggle("Raycast Against Physics",_flare.RaycastPhysics); + GUI.enabled = _flare.RaycastPhysics; + _flare.mask = LayerMaskField(_flare.mask); + + FlareEditorHelper.DrawGuiInBoxDivider(); + EditorGUILayout.LabelField("Debug Info :"); + EditorGUILayout.Toggle(" Flare Occluded",_flare.Occluded); + EditorGUILayout.ObjectField(" Occluding GameObject", _flare.OccludingObject, typeof(GameObject), true); + GUI.enabled = true; + } + EditorGUILayout.EndVertical(); + } + + if(selectionCount <= 1) + { + r = EditorGUILayout.BeginVertical("box"); + Rect r2 = r; + r2.height = 20; + + + if (GUI.Button(r2, GUIContent.none,dropDownButton)) + _flare.IoSetting = _flare.IoSetting ? false : true; + + + GUILayout.Label("Import/Export"); + + if(_flare.IoSetting){GUILayout.Space(5f); + + if(_flare._Atlas != null){ + TextAsset ta = EditorGUILayout.ObjectField("Flare JSON Import, Drag/Drop Here", null, typeof(TextAsset), false) as TextAsset; + + if (ta != null) + { + FlareJson.LoadFlareData(_flare, ta); + Updated = true; + } + + if(GUILayout.Button("Export Flare Json Data")){ + ProFlareExporter.ExportFlare(_flare); + } + }else{ + + GUILayout.Label("Connect Flare Atlast Before Import Or Exporting Flare."); + + + } + } + EditorGUILayout.EndVertical(); + } + + + + FlareEditorHelper.DrawGuiDivider(); + + EditorGUILayout.LabelField("Element Settings :",title); + GUILayout.Space(10f); + + if(selectionCount > 1){ + EditorGUILayout.HelpBox("Editing flare elements is not supported in while multiple flares selected.", MessageType.Warning,false); + }else{ + if(_flare._Atlas != null) + for(int i = 0; i < _flare.Elements.Count;i++) + ElementEditor(_flare.Elements[i],(i+1)); + + + if(_flare._Atlas != null) + if(GUILayout.Button("ADD NEW",thinButton)){ + ProFlareElement element = new ProFlareElement(); + + element.flare = _flare; + element.SpriteName = _flare._Atlas.elementsList[0].name; + element.flareAtlas = _flare._Atlas; + element.position = -1; + element.Scale = 1; + + for(int i = 0; i < _flare.FlareBatches.Length; i++){ + _flare.FlareBatches[i].dirty = true; + } + //_flare._FlareBatch.dirty = true; + _flare.Elements.Add(element); + } + } + FlareEditorHelper.DrawGuiDivider(); + + if (GUI.changed||Updated) + { + //Debug.Log("dirty:"); + Updated = false; + guiChanged = true; + EditorUtility.SetDirty (target); + + if(selectionCount > 1) + foreach(GameObject go in Selection.gameObjects){ + + ProFlare selectedFlare = go.GetComponent<ProFlare>(); + if(selectedFlare) + EditorUtility.SetDirty(selectedFlare); + } + } + } + + public bool Updated = false; + + + void ElementEditor(ProFlareElement element,int count){ + + ProFlareElement.Type elementType; + + EditorGUILayout.BeginHorizontal(); + { + // + if(GUILayout.Button(" ",thinButton,GUILayout.MaxWidth(35))){ + + } + if(GUILayout.Button(" ",thinButton,GUILayout.MaxWidth(32))) + element.Visible = element.Visible ? false : true; + + + Rect rect2 = GUILayoutUtility.GetLastRect(); + + int extra = 0; +#if UNITY_4_3 + extra = 15; +#endif + + Rect outerRect = new Rect(35+extra,rect2.yMin-4,32,32); + Rect final = new Rect(0,0,1,1); + + + if( visibility_On == null) { + visibility_On = Resources.Load("visibility-On") as Texture2D; + } + if( visibility_Off == null) { + visibility_Off = Resources.Load("visibility-Off") as Texture2D; + } + + if(element.Visible) + GUI.DrawTextureWithTexCoords(outerRect,visibility_On, final, true); + else + GUI.DrawTextureWithTexCoords(outerRect,visibility_Off, final, true); + + _flare._Atlas.UpdateElementNameList(); + + int id = EditorGUILayout.Popup(element.elementTextureID, _flare._Atlas.elementNameList,enumStyleButton,GUILayout.MaxWidth(200)); + + + if(element.elementTextureID != id){ + + Debug.Log("Changing Sprite " + element.flareAtlas.elementsList[id].name); + + element.elementTextureID = id; + element.SpriteName = element.flareAtlas.elementsList[id].name; + + for(int f = 0; f < element.flare.FlareBatches.Length; f++){ + element.flare.FlareBatches[f].dirty = true; + } + } + + + elementType = (ProFlareElement.Type)EditorGUILayout.EnumPopup(element.type,enumStyleButton,GUILayout.MaxWidth(100)); + + if(GUILayout.Button("EDIT",thinButton,GUILayout.MaxWidth(80))){ + if(element.Editing) + element.Editing = false; + else{ + + element.ElementSetting = false; + element.OffsetSetting = false; + element.ColorSetting = false; + element.ScaleSetting = false; + element.RotationSetting = false; + element.OverrideSetting = false; + + element.Editing = true; + } + } + + if(GUILayout.Button("CLONE",thinButton)){ + element.Editing = false; + _flare.Elements.Add(CloneElement(element)); + //_flare._FlareBatch.dirty = true; + for(int i = 0; i < _flare.FlareBatches.Length; i++){ + _flare.FlareBatches[i].dirty = true; + } + } + + + if(GUILayout.Button("REMOVE",thinButtonRed)){ + for(int i = 0; i < _flare.FlareBatches.Length; i++){ + _flare.FlareBatches[i].dirty = true; + } +// element.flare._FlareBatch.dirty = true; + element.flare.Elements.Remove(element); + return; + } + } + EditorGUILayout.EndHorizontal(); + //Preview Texture Renderer + { + int extra = 0; + #if UNITY_4_3 + extra = 15; + #endif + + Rect rect2 = GUILayoutUtility.GetLastRect(); + + Rect outerRect = new Rect(10+extra,rect2.yMin+1,22,22); + + if(_flare._Atlas) + if(_flare._Atlas.texture) + if((element.elementTextureID < _flare._Atlas.elementsList.Count)) + GUI.DrawTextureWithTexCoords(outerRect, _flare._Atlas.texture, _flare._Atlas.elementsList[element.elementTextureID].UV, false); + } + + { + if((element.colorTexture == null)||element.colorTextureDirty){ + if(element.useColorRange) + element.colorTexture = CreateGradientTex(element,element.SubElementColor_Start,element.SubElementColor_End); + else + element.colorTexture = CreateGradientTex(element,element.ElementTint,element.ElementTint); + } + + int extra = 0; + #if UNITY_4_3 + extra = 15; + #endif + + Rect rect2 = GUILayoutUtility.GetLastRect(); + Rect outerRect = new Rect(3+extra,rect2.yMin+1,6,22); + Rect UV = new Rect(0,0,1,1); + + GUI.DrawTextureWithTexCoords(outerRect, element.colorTexture, UV, false); + + } + + if(element.type != elementType){ + element.type = elementType; + + + switch(elementType){ + case(ProFlareElement.Type.Single): + break; + case(ProFlareElement.Type.Multi): + + if(element.subElements.Count == 0) + { + for(int i = 0; i < 5; i++){ + SubElement sub = new SubElement(); + sub.random = Random.Range(0f,1f); + sub.random2 = Random.Range(0f,1f); + sub.RandomColorSeedR = Random.Range(-1f,1f); + sub.RandomColorSeedG = Random.Range(-1f,1f); + sub.RandomColorSeedB = Random.Range(-1f,1f); + element.subElements.Add(sub); + } + element.useRangeOffset = true; + element.Editing = true; + } + break; + } + + for(int f = 0; f < element.flare.FlareBatches.Length; f++){ + element.flare.FlareBatches[f].dirty = true; + } + } + + if(element.Editing ){ + QuickEdit(element,count); + + if(element.type == ProFlareElement.Type.Multi) + ElementOptions(element,count); + + OffsetOptions(element,count); + ColorOptions(element,count); + ScaleOptions(element,count); + RotationOptions(element,count); + OverrideOptions(element,count); + } + } + + void QuickEdit(ProFlareElement element,int count){ + + EditorGUILayout.BeginVertical("box"); + + EditorGUILayout.BeginHorizontal(); + { + GUILayout.Label("Quick Edit -",GUILayout.MaxWidth(80)); + + element.Scale = EditorGUILayout.Slider(element.Scale,0f,5f,GUILayout.MaxWidth(180)); + GUILayout.FlexibleSpace(); + if(!element.useColorRange){ + element.ElementTint = EditorGUILayout.ColorField(element.ElementTint,GUILayout.MaxWidth(60)); + + if(GUI.changed) + element.colorTextureDirty = true; + + // byte TintA = (byte)EditorGUILayout.Slider(element.Tint.a,0f,1f,GUILayout.MaxWidth(180)); + + // if(TintA != element.Tint.a){ + // element.Tint.a = TintA; + // } + + float TintA = EditorGUILayout.Slider(element.ElementTint.a,0f,1f,GUILayout.MaxWidth(180)); + + if(TintA != element.ElementTint.a){ + element.ElementTint.a = TintA; + } + + }else{ + element.SubElementColor_Start = EditorGUILayout.ColorField(element.SubElementColor_Start,GUILayout.MaxWidth(60)); + element.SubElementColor_End = EditorGUILayout.ColorField(element.SubElementColor_End,GUILayout.MaxWidth(60)); + + if(GUI.changed) + element.colorTextureDirty = true; + + for(int i = 0; i < element.subElements.Count; i++){ + element.subElements[i].color = Color.Lerp(element.SubElementColor_Start,element.SubElementColor_End,element.subElements[i].random); + } + } + } + + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.EndVertical(); + } + + void ElementOptions(ProFlareElement element,int count){ + + Rect r = EditorGUILayout.BeginVertical("box"); + Rect r2 = r; + + r2.height = 20; + + if (GUI.Button(r2, GUIContent.none,dropDownButton)) + element.ElementSetting = element.ElementSetting ? false : true; + + GUILayout.Label("Multi Element Options"); + + if(!element.ElementSetting){ + EditorGUILayout.EndVertical(); + return; + } + + GUILayout.Space(5f); + + if(element.type == ProFlareElement.Type.Multi){ + + EditorGUILayout.BeginHorizontal(); + { + + EditorGUILayout.LabelField("Sub Elements Count : "+element.subElements.Count); + + if(GUILayout.Button("+")){ + SubElement sub = new SubElement(); + + sub.random = Random.Range(0f,1f); + sub.random2 = Random.Range(0f,1f); + + sub.RandomScaleSeed = Random.Range(-1f,1f); + sub.RandomColorSeedR = Random.Range(-1f,1f); + sub.RandomColorSeedG = Random.Range(-1f,1f); + sub.RandomColorSeedB = Random.Range(-1f,1f); + sub.RandomColorSeedA = Random.Range(-1f,1f); + + element.subElements.Add(sub); + + for(int f = 0; f < element.flare.FlareBatches.Length; f++){ + element.flare.FlareBatches[f].dirty = true; + } + } + if(GUILayout.Button("-")){ + //SubElement sub = new SubElement(); + if(element.subElements.Count > 0){ + element.subElements.Remove(element.subElements[element.subElements.Count-1]); + + + for(int f = 0; f < element.flare.FlareBatches.Length; f++){ + element.flare.FlareBatches[f].dirty = true; + } + } + } + + if(GUILayout.Button("Update Random Seed")){ + for(int i = 0; i < element.subElements.Count; i++){ + Updated = true; + element.subElements[i].random = Random.Range(0f,1f); + element.subElements[i].random2 = Random.Range(0f,1f); + element.subElements[i].RandomScaleSeed = Random.Range(-1f,1f); + element.subElements[i].RandomColorSeedR = Random.Range(-1f,1f); + element.subElements[i].RandomColorSeedG = Random.Range(-1f,1f); + element.subElements[i].RandomColorSeedB = Random.Range(-1f,1f); + element.subElements[i].RandomColorSeedA = Random.Range(-1f,1f); + } + } + } + EditorGUILayout.EndHorizontal(); + } + EditorGUILayout.EndVertical(); + } + + + void ColorOptions(ProFlareElement element,int count){ + + Rect r = EditorGUILayout.BeginVertical("box"); + Rect r2 = r; + r2.height = 20; + + + if (GUI.Button(r2, GUIContent.none,dropDownButton)) + element.ColorSetting = element.ColorSetting ? false : true; + + + GUILayout.Label("Color Options"); + { + + if(element.ColorSetting){ + GUILayout.Space(5f); + if(element.type == ProFlareElement.Type.Single){ + element.ElementTint = EditorGUILayout.ColorField("Tint",element.ElementTint); + + }else{ + + EditorGUILayout.BeginHorizontal(); + { + + element.useColorRange = EditorGUILayout.Toggle("Use Color Tint Range",element.useColorRange); + + if(!element.useColorRange){ + element.ElementTint = EditorGUILayout.ColorField("Tint",element.ElementTint); + }else{ + element.SubElementColor_Start = EditorGUILayout.ColorField(element.SubElementColor_Start); + element.SubElementColor_End = EditorGUILayout.ColorField(element.SubElementColor_End); + } + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.LabelField("Color Random"); + element.RandomColorAmount.x = EditorGUILayout.Slider(" R",element.RandomColorAmount.x,0f,1f); + element.RandomColorAmount.y = EditorGUILayout.Slider(" G",element.RandomColorAmount.y,0f,1f); + element.RandomColorAmount.z = EditorGUILayout.Slider(" B",element.RandomColorAmount.z,0f,1f); + element.RandomColorAmount.w = EditorGUILayout.Slider(" Brightness",element.RandomColorAmount.w,0f,1f); + } + } + + if(element.type == ProFlareElement.Type.Single){ + + }else{ + if(!element.useColorRange){ + + for(int i = 0; i < element.subElements.Count; i++){ + Color col = element.ElementTint; + + col.r = Mathf.Clamp01( col.r+(element.RandomColorAmount.x*element.subElements[i].RandomColorSeedR)); + col.g = Mathf.Clamp01( col.g+(element.RandomColorAmount.y*element.subElements[i].RandomColorSeedG)); + col.b = Mathf.Clamp01( col.b+(element.RandomColorAmount.z*element.subElements[i].RandomColorSeedB)); + col.a = Mathf.Clamp01( col.a+(element.RandomColorAmount.w*element.subElements[i].RandomColorSeedA)); + + element.subElements[i].color = col; + } + }else{ + + for(int i = 0; i < element.subElements.Count; i++){ + Color col = Color.Lerp(element.SubElementColor_Start,element.SubElementColor_End,element.subElements[i].random); + + col.r = Mathf.Clamp01(col.r+(element.RandomColorAmount.x*element.subElements[i].RandomColorSeedR)); + col.g = Mathf.Clamp01(col.g+(element.RandomColorAmount.y*element.subElements[i].RandomColorSeedG)); + col.b = Mathf.Clamp01(col.b+(element.RandomColorAmount.z*element.subElements[i].RandomColorSeedB)); + col.a = Mathf.Clamp01(col.a+(element.RandomColorAmount.w*element.subElements[i].RandomColorSeedA)); + + element.subElements[i].color = col; + } + + } + } + } + EditorGUILayout.EndVertical(); + } + + void OffsetOptions(ProFlareElement element,int count){ + + Rect r = EditorGUILayout.BeginVertical("box"); + Rect r2 = r; + r2.height = 20; + + + if (GUI.Button(r2, GUIContent.none,dropDownButton)) + element.OffsetSetting = element.OffsetSetting ? false : true; + + + GUILayout.Label("Offset Options"); + + { + if(element.OffsetSetting){ + GUILayout.Space(5f); + if(element.type == ProFlareElement.Type.Single){ + element.position = EditorGUILayout.Slider("OffSet",element.position,-1.5f,2.5f); + + }else{ + + EditorGUILayout.BeginHorizontal(); + { + + element.useRangeOffset = EditorGUILayout.Toggle("Use offset range",element.useRangeOffset); + + if(element.useRangeOffset){ + + float minTemp = element.SubElementPositionRange_Min; + float maxTemp = element.SubElementPositionRange_Max; + + + EditorGUILayout.MinMaxSlider(ref element.SubElementPositionRange_Min ,ref element.SubElementPositionRange_Max,-4.5f,4.5f); + + if((minTemp != element.SubElementPositionRange_Min)||(maxTemp != element.SubElementPositionRange_Max)||Updated){ + + } + + for(int i = 0; i < element.subElements.Count; i++){ + element.subElements[i].position = Mathf.Lerp(element.SubElementPositionRange_Min,element.SubElementPositionRange_Max,element.subElements[i].random); + element.subElements[i].scale = Mathf.Lerp(-100f,100f,element.subElements[i].random2); + Updated = true; + } + + EditorGUILayout.FloatField(element.SubElementPositionRange_Min,GUILayout.MaxWidth(30)); + + EditorGUILayout.FloatField(element.SubElementPositionRange_Max,GUILayout.MaxWidth(30)); + + }else{ + element.position = EditorGUILayout.Slider(element.position,-1.5f,2.5f); + } + } + EditorGUILayout.EndHorizontal(); + } + + + EditorGUILayout.LabelField("Anamorphic"); + float x = EditorGUILayout.Slider("Vertical ",element.Anamorphic.x,0f,1f); + float y = EditorGUILayout.Slider("Horizontal ",element.Anamorphic.y,0f,1f); + element.Anamorphic = new Vector2(x,y); + + + element.OffsetPostion = EditorGUILayout.Vector2Field("Position Offset", element.OffsetPostion); + + } + + if(element.type == ProFlareElement.Type.Single){ + + } + if(element.type == ProFlareElement.Type.Multi){ + for(int i = 0; i < element.subElements.Count; i++){ + element.subElements[i].position = Mathf.Lerp(element.SubElementPositionRange_Min,element.SubElementPositionRange_Max,element.subElements[i].random); + element.subElements[i].scale = Mathf.Lerp(-100f,100f,element.subElements[i].random2); + } + } + + }EditorGUILayout.EndVertical(); + } + + + void ScaleOptions(ProFlareElement element,int count){ + + Rect r = EditorGUILayout.BeginVertical("box"); + Rect r2 = r; + r2.height = 20; + + + if (GUI.Button(r2, GUIContent.none,dropDownButton)) + element.ScaleSetting = element.ScaleSetting ? false : true; + + + GUILayout.Label("Scale Options"); + + { + if(element.ScaleSetting){ + + GUILayout.Space(5f); + + EditorGUILayout.BeginHorizontal(); + { + EditorGUILayout.LabelField("Scale"); + element.Scale = EditorGUILayout.Slider(element.Scale,0f,5f); + } + EditorGUILayout.EndHorizontal(); + + //EditorGUILayout.BeginHorizontal(); + { + EditorGUILayout.LabelField("Aspect",GUILayout.MinWidth(120)); + element.size.x = Mathf.Max(0f, EditorGUILayout.FloatField(" X", element.size.x)); + element.size.y = Mathf.Max(0f, EditorGUILayout.FloatField(" Y",element.size.y)); + } + //EditorGUILayout.EndHorizontal(); + + + + + if(element.type == ProFlareElement.Type.Multi){ + + element.ScaleRandom = EditorGUILayout.Slider("Random Scale",element.ScaleRandom,0,1f); + + EditorGUILayout.BeginHorizontal(); + { + + element.useScaleCurve = EditorGUILayout.Toggle("Use Scale Range",element.useScaleCurve,GUILayout.MaxWidth(180)); + + GUI.enabled = element.useScaleCurve; + + if(element.useScaleCurve) + Updated = true; + + if(element.type == ProFlareElement.Type.Multi){ + element.ScaleCurve = EditorGUILayout.CurveField(element.ScaleCurve); + } + + if(GUILayout.Button("Reset",GUILayout.MaxWidth(50))){ + element.ScaleCurve = new AnimationCurve(new Keyframe(0, 0.1f), new Keyframe(0.5f, 1.0f), new Keyframe(1.0f, 0.1f)); + } + + GUI.enabled = true; + } + EditorGUILayout.EndHorizontal(); + } + } + } + + if(element.type == ProFlareElement.Type.Multi){ + for(int i = 0; i < element.subElements.Count; i++){ + if(element.useScaleCurve) + element.subElements[i].scale = (1+element.subElements[i].RandomScaleSeed*(element.ScaleRandom))*element.ScaleCurve.Evaluate(element.subElements[i].random); + else + element.subElements[i].scale = (1+element.subElements[i].RandomScaleSeed*(element.ScaleRandom)); + } + } + + EditorGUILayout.EndVertical(); + } + + void RotationOptions(ProFlareElement element,int count){ + + Rect r = EditorGUILayout.BeginVertical("box"); + Rect r2 = r; + r2.height = 20; + + + if (GUI.Button(r2, GUIContent.none,dropDownButton)) + element.RotationSetting = element.RotationSetting ? false : true; + + + GUILayout.Label("Rotation Options"); + { + + if(element.RotationSetting){ + GUILayout.Space(5f); + + element.angle = EditorGUILayout.FloatField("Angle",element.angle); + + if(element.type == ProFlareElement.Type.Multi){ + element.useStarRotation = EditorGUILayout.Toggle("Use Star Rotation",element.useStarRotation); + element.useRandomAngle = EditorGUILayout.Toggle("Use Random Rotation",element.useRandomAngle); + + + if(element.useStarRotation){ + for(int i = 0; i < element.subElements.Count; i++){ + element.subElements[i].angle = (180f/element.subElements.Count)*i; + Updated = true; + } + }else{ + for(int i = 0; i < element.subElements.Count; i++){ + element.subElements[i].angle = 0; + Updated = true; + } + } + + if(element.useRandomAngle){ + + float minTemp = element.SubElementAngleRange_Min; + float maxTemp = element.SubElementAngleRange_Max; + + EditorGUILayout.BeginHorizontal(); + { + + EditorGUILayout.MinMaxSlider(ref element.SubElementAngleRange_Min ,ref element.SubElementAngleRange_Max,-180f,180f); + + EditorGUILayout.FloatField(element.SubElementAngleRange_Min); + + EditorGUILayout.FloatField(element.SubElementAngleRange_Max); + + if((minTemp != element.SubElementAngleRange_Min)||(maxTemp != element.SubElementAngleRange_Max)||Updated){ + for(int i = 0; i < element.subElements.Count; i++){ + + element.subElements[i].angle = element.subElements[i].angle+Mathf.Lerp(-element.SubElementAngleRange_Min,element.SubElementAngleRange_Max,element.subElements[i].random2); + Updated = true; + } + + } + + } + EditorGUILayout.EndHorizontal(); + + } + } + element.rotateToFlare = EditorGUILayout.Toggle("Rotate To Flare",element.rotateToFlare); + element.rotationSpeed = EditorGUILayout.FloatField("Movement Based Rotation",element.rotationSpeed); + element.rotationOverTime = EditorGUILayout.FloatField("Rotation Overtime Speed",element.rotationOverTime); + } + } + EditorGUILayout.EndVertical(); + } + + void OverrideOptions(ProFlareElement element,int count){ + + + Rect r = EditorGUILayout.BeginVertical("box"); + Rect r2 = r; + r2.height = 20; + + + if (GUI.Button(r2, GUIContent.none,dropDownButton)) + element.OverrideSetting = element.OverrideSetting ? false : true; + + + GUILayout.Label("Override Options"); + { + + if(element.OverrideSetting){ + GUILayout.Space(5f); + GUI.enabled = element.flare.useDynamicEdgeBoost; + EditorGUILayout.BeginHorizontal(); + { + element.OverrideDynamicEdgeBoost = EditorGUILayout.Toggle("Dynamic Edge Scale",element.OverrideDynamicEdgeBoost); + GUILayout.FlexibleSpace(); + if(element.OverrideDynamicEdgeBoost) + element.DynamicEdgeBoostOverride = EditorGUILayout.FloatField(" ",element.DynamicEdgeBoostOverride); + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal();{ + element.OverrideDynamicEdgeBrightness = EditorGUILayout.Toggle("Dynamic Edge Brightness",element.OverrideDynamicEdgeBrightness); + + if(element.OverrideDynamicEdgeBrightness) + element.DynamicEdgeBrightnessOverride = EditorGUILayout.FloatField(" ",element.DynamicEdgeBrightnessOverride); + } + EditorGUILayout.EndHorizontal(); + + GUI.enabled = true; + GUI.enabled = element.flare.useDynamicCenterBoost; + + EditorGUILayout.BeginHorizontal(); + { + element.OverrideDynamicCenterBoost = EditorGUILayout.Toggle("Dynamic Center Scale",element.OverrideDynamicCenterBoost); + + if(element.OverrideDynamicCenterBoost) + element.DynamicCenterBoostOverride = EditorGUILayout.FloatField(" ",element.DynamicCenterBoostOverride); + } + EditorGUILayout.EndHorizontal(); + + + EditorGUILayout.BeginHorizontal(); + { + element.OverrideDynamicCenterBrightness = EditorGUILayout.Toggle("Dynamic Center Brightness",element.OverrideDynamicCenterBrightness); + + if(element.OverrideDynamicCenterBrightness) + element.DynamicCenterBrightnessOverride = EditorGUILayout.FloatField(" ",element.DynamicCenterBrightnessOverride); + } + EditorGUILayout.EndHorizontal(); + + GUI.enabled = true; + } + + } + EditorGUILayout.EndVertical(); + } + + Texture2D CreateGradientTex (ProFlareElement element, Color c0, Color c1) + { + if(element.colorTexture != null){ + DestroyImmediate(element.colorTexture); + element.colorTexture = null; + } + + element.colorTexture = new Texture2D(1, 16); + element.colorTexture.name = "[ProFlare] Gradient Texture"; + element.colorTexture.hideFlags = HideFlags.DontSave; + + + for (int i = 0; i < 16; ++i) + { + float f = i*(1f/16f); + element.colorTexture.SetPixel(0, i, Color.Lerp(c0, c1, f)); + } + + element.colorTexture.Apply(); + element.colorTexture.filterMode = FilterMode.Bilinear; + return element.colorTexture; + } + + + public int LayerMaskField (LayerMask selected) { + + ArrayList layers = new ArrayList (); + + ArrayList layerNumbers = new ArrayList (); + + string name = ""; + + for (int i=0;i<32;i++) { + + string layerName = LayerMask.LayerToName (i); + + if (layerName != "") { + + if (selected == (selected | (1 << i))) { + + layers.Add ("✓ "+layerName); + + name += layerName+", "; + } else { + layers.Add (" "+layerName); + } + layerNumbers.Add (i); + } + } + + bool preChange = GUI.changed; + + GUI.changed = false; + + int[] LayerNumbers = layerNumbers.ToArray (typeof(int)) as int[]; + + int newSelected = EditorGUILayout.Popup ("Layer Mask",-1,layers.ToArray(typeof(string)) as string[],EditorStyles.layerMaskField); + + if (GUI.changed) { + + if (selected == (selected | (1 << LayerNumbers[newSelected]))) { + + selected &= ~(1 << LayerNumbers[newSelected]); + + Debug.Log ("Set Layer "+LayerMask.LayerToName (LayerNumbers[newSelected]) + " To False "+selected.value); + + } else { + + Debug.Log ("Set Layer "+LayerMask.LayerToName (LayerNumbers[newSelected]) + " To True "+selected.value); + + selected = selected | (1 << LayerNumbers[newSelected]); + + } + + } else { + + GUI.changed = preChange; + + } + return selected; + } + + ProFlareElement CloneElement(ProFlareElement element){ + + ProFlareElement _element = new ProFlareElement(); + + _element.Editing = true; + + _element.Visible = element.Visible; + + _element.elementTextureID = element.elementTextureID; + + _element.SpriteName = element.SpriteName; + + _element.flare = element.flare; + + _element.flareAtlas = element.flareAtlas; + + _element.Brightness = element.Brightness; + _element.Scale = element.Scale; + _element.ScaleRandom = element.ScaleRandom; + _element.ScaleFinal = element.ScaleFinal; + + _element.RandomColorAmount = element.RandomColorAmount; + + //Element OffSet Properties + _element.position = element.position; + + _element.useRangeOffset = element.useRangeOffset; + + _element.SubElementPositionRange_Min = element.SubElementPositionRange_Min; + _element.SubElementPositionRange_Max = element.SubElementPositionRange_Max; + + _element.SubElementAngleRange_Min = element.SubElementAngleRange_Min; + _element.SubElementAngleRange_Max = element.SubElementAngleRange_Max; + + + _element.OffsetPosition = element.OffsetPosition; + + _element.Anamorphic = element.Anamorphic; + + _element.OffsetPostion = element.OffsetPostion; + + _element.angle = element.angle; + _element.FinalAngle = element.FinalAngle; + _element.useRandomAngle = element.useRandomAngle; + _element.useStarRotation = element.useStarRotation; + _element.AngleRandom_Min = element.AngleRandom_Min; + _element.AngleRandom_Max = element.AngleRandom_Max; + _element.OrientToSource = element.OrientToSource; + _element.rotateToFlare = element.rotateToFlare; + _element.rotationSpeed = element.rotationSpeed; + _element.rotationOverTime = element.rotationOverTime; + + _element.useColorRange = element.useColorRange; + + _element.ElementFinalColor = element.ElementFinalColor; + + _element.ElementTint = element.ElementTint; + + _element.SubElementColor_Start = element.SubElementColor_Start; + _element.SubElementColor_End = element.SubElementColor_End; + + _element.useScaleCurve = element.useScaleCurve; + _element.ScaleCurve = new AnimationCurve(element.ScaleCurve.keys); + + + _element.OverrideDynamicEdgeBoost = element.OverrideDynamicEdgeBoost; + _element.DynamicEdgeBoostOverride = element.DynamicEdgeBoostOverride; + + _element.OverrideDynamicCenterBoost = element.OverrideDynamicCenterBoost; + _element.DynamicCenterBoostOverride = element.DynamicCenterBoostOverride; + + _element.OverrideDynamicEdgeBrightness = element.OverrideDynamicEdgeBrightness; + _element.DynamicEdgeBrightnessOverride = element.DynamicEdgeBrightnessOverride; + + _element.OverrideDynamicCenterBrightness = element.OverrideDynamicCenterBrightness; + _element.DynamicCenterBrightnessOverride = element.DynamicCenterBrightnessOverride; + + _element.size = element.size; + + for(int i = 0; i < element.subElements.Count; i++){ + + SubElement Sub = new SubElement(); + + Sub.color = element.subElements[i].color; + Sub.position = element.subElements[i].position; + Sub.offset = element.subElements[i].offset; + Sub.angle = element.subElements[i].angle; + Sub.scale = element.subElements[i].scale; + Sub.random = element.subElements[i].random; + Sub.random2= element.subElements[i].random2; + + + Sub.RandomScaleSeed = element.subElements[i].RandomScaleSeed; + Sub.RandomColorSeedR = element.subElements[i].RandomColorSeedR; + Sub.RandomColorSeedG = element.subElements[i].RandomColorSeedG; + Sub.RandomColorSeedB = element.subElements[i].RandomColorSeedB; + Sub.RandomColorSeedA = element.subElements[i].RandomColorSeedA; + + _element.subElements.Add(Sub); + } + + _element.type = element.type; + + return _element; + + } + + void OnSceneGUI () { + _flare = target as ProFlare; + if(!_flare.UseAngleLimit) + return; + + Handles.color = new Color(1f,1f,1f,0.2f); + + Handles.DrawSolidArc(_flare.transform.position, + _flare.transform.up, + _flare.transform.forward, + _flare.maxAngle/2, + 5); + + Handles.DrawSolidArc(_flare.transform.position, + _flare.transform.up, + _flare.transform.forward, + -_flare.maxAngle/2, + 5); + + Handles.color = Color.white; + + Handles.ScaleValueHandle(_flare.maxAngle, + _flare.transform.position + _flare.transform.forward*5, + _flare.transform.rotation, + 1, + Handles.ConeCap, + 2); + } +} |