public VolumeEffect AddJustColorEffect(AmplifyColorEffect colorEffect) { VolumeEffect created = new VolumeEffect(colorEffect); volumes.Add(created); return(created); }
public void BlendValues(AmplifyColorEffect targetColor, VolumeEffect other, float blendAmount) { VolumeEffectFlags effectFlags = targetColor.EffectFlags; GameObject go = targetColor.gameObject; for (int comp = 0; comp < effectFlags.components.Count; comp++) { VolumeEffectComponentFlags compFlags = effectFlags.components[comp]; if (!compFlags.blendFlag) { continue; } Component c = go.GetComponent(compFlags.componentName); VolumeEffectComponent effectComp = FindEffectComponent(compFlags.componentName); VolumeEffectComponent effectCompOther = other.FindEffectComponent(compFlags.componentName); if (c == null || effectComp == null || effectCompOther == null) { continue; } for (int i = 0; i < compFlags.componentFields.Count; i++) { VolumeEffectFieldFlags fieldFlags = compFlags.componentFields[i]; if (!fieldFlags.blendFlag) { continue; } #if !UNITY_EDITOR && UNITY_METRO FieldInfo fi = c.GetType().GetRuntimeField(fieldFlags.fieldName); #else FieldInfo fi = c.GetType().GetField(fieldFlags.fieldName); #endif VolumeEffectField effectField = effectComp.FindEffectField(fieldFlags.fieldName); VolumeEffectField effectFieldOther = effectCompOther.FindEffectField(fieldFlags.fieldName); if (fi == null || effectField == null || effectFieldOther == null) { continue; } switch (fi.FieldType.FullName) { case "System.Single": fi.SetValue(c, Mathf.Lerp(effectField.valueSingle, effectFieldOther.valueSingle, blendAmount)); break; case "System.Boolean": fi.SetValue(c, effectFieldOther.valueBoolean); break; case "UnityEngine.Vector2": fi.SetValue(c, Vector2.Lerp(effectField.valueVector2, effectFieldOther.valueVector2, blendAmount)); break; case "UnityEngine.Vector3": fi.SetValue(c, Vector3.Lerp(effectField.valueVector3, effectFieldOther.valueVector3, blendAmount)); break; case "UnityEngine.Vector4": fi.SetValue(c, Vector4.Lerp(effectField.valueVector4, effectFieldOther.valueVector4, blendAmount)); break; case "UnityEngine.Color": fi.SetValue(c, Color.Lerp(effectField.valueColor, effectFieldOther.valueColor, blendAmount)); break; } } } }
public NewLineContainer(AmplifyColorEffect camera, string component, string fieldName, string fieldType, object value) { this.camera = camera; this.component = component; this.fieldName = fieldName; this.fieldType = fieldType; this.value = value; }
public void SetCamera(AmplifyColorEffect camera) { this.camera = camera; component = ""; fieldName = ""; fieldType = ""; value = null; }
private void LevelFinishedLoading(Scene scene, LoadSceneMode mode) { if (Camera.main != null) { _amplifyComponent = Camera.main.gameObject.GetComponent <AmplifyColorEffect>(); _bloomComponent = Camera.main.gameObject.GetComponent <BloomAndFlares>(); SetEffects(SaturationEnabled.Value, BloomStrength.Value); } }
public static Component[] ListAcceptableComponents(AmplifyColorEffect go) { if (go == null) { return(new Component[0]); } Component[] comps = go.GetComponents(typeof(Component)); return((comps.Where(comp => comp != null && (!((comp.GetType() + "").StartsWith("UnityEngine.") || comp.GetType() == typeof(AmplifyColorEffect))))).ToArray()); }
public void SetValues(AmplifyColorEffect targetColor) { VolumeEffectFlags effectFlags = targetColor.EffectFlags; GameObject go = targetColor.gameObject; foreach (VolumeEffectComponentFlags compFlags in effectFlags.components) { if (!compFlags.blendFlag) { continue; } Component c = go.GetComponent(compFlags.componentName); VolumeEffectComponent effectComp = FindEffectComponent(compFlags.componentName); if (c == null || effectComp == null) { continue; } foreach (VolumeEffectFieldFlags fieldFlags in compFlags.componentFields) { if (!fieldFlags.blendFlag) { continue; } #if !UNITY_EDITOR && UNITY_METRO FieldInfo fi = c.GetType().GetRuntimeField(fieldFlags.fieldName); #else FieldInfo fi = c.GetType().GetField(fieldFlags.fieldName); #endif VolumeEffectField effectField = effectComp.FindEffectField(fieldFlags.fieldName); if (fi == null || effectField == null) { continue; } switch (fi.FieldType.FullName) { case "System.Single": fi.SetValue(c, effectField.valueSingle); break; case "System.Boolean": fi.SetValue(c, effectField.valueBoolean); break; case "UnityEngine.Vector2": fi.SetValue(c, effectField.valueVector2); break; case "UnityEngine.Vector3": fi.SetValue(c, effectField.valueVector3); break; case "UnityEngine.Vector4": fi.SetValue(c, effectField.valueVector4); break; case "UnityEngine.Color": fi.SetValue(c, effectField.valueColor); break; } } } }
public static void ApplyPostProcessFiltersToCamera(Camera camera) { Camera mainCamera = Camera.main; Bloom bloom = camera.gameObject.AddComponent <Bloom>(); bloom.tweakMode = Bloom.TweakMode.Basic; bloom.screenBlendMode = Bloom.BloomScreenBlendMode.Add; bloom.hdr = Bloom.HDRBloomMode.Auto; bloom.sepBlurSpread = 2.5f; bloom.quality = Bloom.BloomQuality.High; bloom.bloomIntensity = 0.5f; bloom.bloomThreshold = 0.9f; bloom.bloomThresholdColor = new Color(1f, 1f, 1f, 1f); bloom.bloomBlurIterations = 2; bloom.hollywoodFlareBlurIterations = 2; bloom.flareRotation = 0f; bloom.lensflareMode = Bloom.LensFlareStyle.Anamorphic; bloom.hollyStretchWidth = 2.5f; bloom.lensflareIntensity = 0f; bloom.lensflareThreshold = 0.3f; bloom.lensFlareSaturation = 0.75f; bloom.flareColorA = new Color(0.4f, 0.4f, 0.8f, 0.75f); bloom.flareColorB = new Color(0.4f, 0.8f, 0.8f, 0.75f); bloom.flareColorC = new Color(0.8f, 0.4f, 0.8f, 0.75f); bloom.flareColorD = new Color(0.8f, 0.4f, 0f, 0.75f); bloom.lensFlareVignetteMask = mainCamera.GetComponent <Bloom>().lensFlareVignetteMask; bloom.lensFlareShader = Shader.Find("Hidden/LensFlareCreate"); bloom.screenBlendShader = Shader.Find("Hidden/BlendForBloom"); bloom.blurAndFlaresShader = Shader.Find("Hidden/BlurAndFlares"); bloom.brightPassFilterShader = Shader.Find("Hidden/BrightPassFilter2"); AmplifyColorEffect mainCameraColorEffect = mainCamera.GetComponent <AmplifyColorEffect>(); AmplifyColorEffect colorEffect = camera.gameObject.AddComponent <AmplifyColorEffect>(); colorEffect.Tonemapper = AmplifyColor.Tonemapping.Disabled; colorEffect.Exposure = 1f; colorEffect.LinearWhitePoint = 11.2f; colorEffect.ApplyDithering = false; colorEffect.QualityLevel = AmplifyColor.Quality.Standard; colorEffect.BlendAmount = 0.33f; colorEffect.LutTexture = mainCameraColorEffect.LutTexture; colorEffect.LutBlendTexture = mainCameraColorEffect.LutBlendTexture; colorEffect.MaskTexture = mainCameraColorEffect.MaskTexture; colorEffect.UseDepthMask = false; colorEffect.DepthMaskCurve = mainCameraColorEffect.DepthMaskCurve; colorEffect.UseVolumes = false; colorEffect.ExitVolumeBlendTime = 1f; colorEffect.TriggerVolumeProxy = mainCameraColorEffect.TriggerVolumeProxy; colorEffect.VolumeCollisionMask = mainCameraColorEffect.VolumeCollisionMask; colorEffect.EffectFlags = mainCameraColorEffect.EffectFlags; }
public void AddColorEffect(AmplifyColorEffect colorEffect) { VolumeEffect volume; if ((volume = FindVolumeEffect(colorEffect)) != null) { volume.UpdateVolume(); } else { volume = new VolumeEffect(colorEffect); volumes.Add(volume); volume.UpdateVolume(); } }
void Awake() { GameObject.DontDestroyOnLoad(this.gameObject); //Util.Settings.DisableUnitility(); glow = GameObject.FindObjectOfType <GlowEffect>(); colorAmp = GameObject.FindObjectOfType <AmplifyColorEffect>(); targetLowPass = setLowPass; currentLowPass = setLowPass; targetHighPass = defaultHighPass; currentHighPass = defaultHighPass; instance = this; samples = new float[1024]; Charlie = GameObject.FindObjectOfType <HappyHippo> (); }
void OnEnable() { if (maskCamera == null) { var go = new GameObject("Mask Camera", typeof(Camera)) { hideFlags = HideFlags.HideAndDontSave }; go.transform.parent = gameObject.transform; maskCamera = go.GetComponent <Camera>(); } referenceCamera = GetComponent <Camera>(); colorEffect = GetComponent <AmplifyColorEffect>(); colorMaskShader = Shader.Find("Hidden/RenderMask"); }
public VolumeEffect GenerateEffectData(AmplifyColorEffect go) { VolumeEffect result = new VolumeEffect(go); foreach (VolumeEffectComponentFlags compFlags in components) { if (!compFlags.blendFlag) { continue; } Component c = go.GetComponent(compFlags.componentName); if (c != null) { result.AddComponent(c, compFlags); } } return(result); }
public VolumeEffect FindVolumeEffect(AmplifyColorEffect colorEffect) { // find by reference first for (int i = 0; i < volumes.Count; i++) { if (volumes[i].gameObject == colorEffect) { return(volumes[i]); } } // in case reference fails, find by instance id (e.g. instantiated prefabs) for (int i = 0; i < volumes.Count; i++) { if (volumes[i].gameObject != null && volumes[i].gameObject.SharedInstanceID == colorEffect.SharedInstanceID) { return(volumes[i]); } } // not found return(null); }
private void OnEnable() { tonemapper = serializedObject.FindProperty("Tonemapper"); exposure = serializedObject.FindProperty("Exposure"); linearWhitePoint = serializedObject.FindProperty("LinearWhitePoint"); useDithering = serializedObject.FindProperty("ApplyDithering"); qualityLevel = serializedObject.FindProperty("QualityLevel"); blendAmount = serializedObject.FindProperty("BlendAmount"); lutTexture = serializedObject.FindProperty("LutTexture"); lutBlendTexture = serializedObject.FindProperty("LutBlendTexture"); maskTexture = serializedObject.FindProperty("MaskTexture"); useDepthMask = serializedObject.FindProperty("UseDepthMask"); depthMaskCurve = serializedObject.FindProperty("DepthMaskCurve"); useVolumes = serializedObject.FindProperty("UseVolumes"); exitVolumeBlendTime = serializedObject.FindProperty("ExitVolumeBlendTime"); triggerVolumeProxy = serializedObject.FindProperty("TriggerVolumeProxy"); volumeCollisionMask = serializedObject.FindProperty("VolumeCollisionMask"); if (!Application.isPlaying) { AmplifyColorEffect effect = target as AmplifyColorEffect; bool needsNewID = string.IsNullOrEmpty(effect.SharedInstanceID); if (!needsNewID) { needsNewID = FindClone(effect); } if (needsNewID) { effect.NewSharedInstanceID(); EditorUtility.SetDirty(target); } } }
public void OnLevelWasLoaded(int levelId) { glow = GameObject.FindObjectOfType <GlowEffect>(); Charlie = GameObject.FindObjectOfType <HappyHippo> (); colorAmp = GameObject.FindObjectOfType <AmplifyColorEffect>(); }
public NewLineContainer(AmplifyColorEffect camera) { this.camera = camera; }
public bool ReadBackBuffer(out ImageResult imageResult) { imageResult = null; if (_cameras == null) { Debug.LogError("[AmplifyColor] Camera collection is invalid."); return(false); } var camera = _cameras.SelectedCamera; if (camera == null) { Debug.LogError("[AmplifyColor] Selected camera is invalid."); return(false); } AmplifyColorEffect component = camera.GetComponent <AmplifyColorEffect>(); Tonemapping prevTonemapper = Tonemapping.Disabled; float prevExposure = 1.0f; float prevLinearWhitePoint = 11.2f; bool prevApplyDithering = false; float prevBlendAmount = 0.0f; Texture prevLUT = null; if (component != null) { prevTonemapper = component.Tonemapper; prevExposure = component.Exposure; prevLinearWhitePoint = component.LinearWhitePoint; prevApplyDithering = component.ApplyDithering; prevBlendAmount = component.BlendAmount; prevLUT = component.LutTexture; component.Tonemapper = ToolSettings.Instance.ApplyHDRControl ? component.Tonemapper : Tonemapping.Disabled; component.Exposure = ToolSettings.Instance.ApplyHDRControl ? component.Exposure : 1.0f; component.LinearWhitePoint = ToolSettings.Instance.ApplyHDRControl ? component.LinearWhitePoint : 11.2f; component.ApplyDithering = ToolSettings.Instance.ApplyHDRControl ? component.ApplyDithering : false; component.BlendAmount = ToolSettings.Instance.ApplyColorGrading ? component.BlendAmount : 0.0f; component.LutTexture = ToolSettings.Instance.ApplyColorGrading ? component.LutTexture : null; } var width = ToolSettings.Instance.Resolution.TargetWidth; var height = ToolSettings.Instance.Resolution.TargetHeight; //if (ToolSettings.Instance.Resolution.IsGameWindowSize) //{ // width = Screen.width; // height = Screen.height; //} var cameratarget = camera.targetTexture; var rt = RenderTexture.GetTemporary(width, height, 24, RenderTextureFormat.ARGB32); camera.targetTexture = rt; camera.Render(); camera.targetTexture = cameratarget; var activert = RenderTexture.active; RenderTexture.active = rt; var text = new Texture2D(width, height, TextureFormat.ARGB32, false); text.ReadPixels(new Rect(0, 0, width, height), 0, 0); text.Apply(); RenderTexture.active = activert; var colors = text.GetPixels(0, 0, width, height); Texture2D.DestroyImmediate(text); var colordata = new Color[width, height]; for (int i = height - 1; i >= 0; i--) { for (int j = 0; j < width; j++) { colordata[j, (height - 1 - i)] = colors[i * width + j]; colordata[j, (height - 1 - i)].a = 1; } } if (component != null) { component.Tonemapper = prevTonemapper; component.Exposure = prevExposure; component.LinearWhitePoint = prevLinearWhitePoint; component.ApplyDithering = prevApplyDithering; component.BlendAmount = prevBlendAmount; component.LutTexture = prevLUT; } imageResult = new ImageResult(colordata); return(true); }
void DrawVolumeEffectFields(AmplifyColorVolumeBase volume) { List <AmplifyColor.VolumeEffect> effectsToDelete = new List <AmplifyColor.VolumeEffect>(); float removeButtonSize = 16; List <NewLineContainer> volumeLines = null; if (!(newLines.TryGetValue(volume, out volumeLines))) { volumeLines = newLines[volume] = new List <NewLineContainer>(); } GUIStyle minusStyle = new GUIStyle(( GUIStyle )"OL Minus"); GUIStyle plusStyle = new GUIStyle(( GUIStyle )"OL Plus"); minusStyle.margin.top = 2; plusStyle.margin.top = 2; #region CurrentEffectFields int fieldPosition = 0; foreach (AmplifyColor.VolumeEffect effectVol in volume.EffectContainer.volumes) { if (effectVol.gameObject == null) { continue; } AmplifyColorEffect effect = effectVol.gameObject; List <AmplifyColor.VolumeEffectComponent> compsToDelete = new List <AmplifyColor.VolumeEffectComponent>(); foreach (AmplifyColor.VolumeEffectComponent comp in effectVol.components) { Component c = effect.GetComponent(comp.componentName); if (c == null) { continue; } List <AmplifyColor.VolumeEffectField> fieldsToDelete = new List <AmplifyColor.VolumeEffectField>(); List <KeyValuePair <string, int> > fieldsToAdd = new List <KeyValuePair <string, int> >(); foreach (AmplifyColor.VolumeEffectField field in comp.fields) { EditorGUILayout.BeginHorizontal(); GUILayout.Label("", GUILayout.MinWidth(minIndentWidth), GUILayout.MaxWidth(maxIndentWidth)); GUILayout.Space(0); if (GUILayout.Button("", minusStyle, GUILayout.MinWidth(18), GUILayout.MaxWidth(18), GUILayout.Height(20))) { fieldsToDelete.Add(field); } Camera selectedCamera = EditorGUILayout.ObjectField(effect.GetComponent <Camera>(), typeof(Camera), true, GUILayout.MinWidth(minColumnWidth * 1.5f), GUILayout.MaxWidth(maxColumnWidth * 1.5f)) as Camera; AmplifyColorEffect selectedEffect = (selectedCamera != null) ? selectedCamera.GetComponent <AmplifyColorEffect>() : null; if (selectedEffect != effect) { fieldsToDelete.Add(field); dirtyVolumeFlags = true; volumeLines.Add(new NewLineContainer(selectedEffect)); } Component[] compArray = AmplifyColor.VolumeEffect.ListAcceptableComponents(effectVol.gameObject); List <string> compFlagsArray = compArray.Select(s => s.GetType().Name).ToList(); compFlagsArray.Remove(comp.componentName); string[] compNamesArray = new string[] { comp.componentName }.Concat(compFlagsArray).ToArray(); int selectedComponent = 0; selectedComponent = EditorGUILayout.Popup(selectedComponent, compNamesArray, GUILayout.MinWidth(minColumnWidth), GUILayout.MaxWidth(maxColumnWidth)); if (selectedComponent != 0) { volumeLines.Add(new NewLineContainer(effect, compNamesArray[selectedComponent])); fieldsToDelete.Add(field); dirtyVolumeFlags = true; } FieldInfo[] fieldArray = AmplifyColor.VolumeEffectComponent.ListAcceptableFields(c); string[] fieldFlagsArray = fieldArray.Select(s => s.Name).ToArray(); string[] fieldNamesArray = comp.GetFieldNames(); fieldFlagsArray = fieldFlagsArray.Except(fieldNamesArray).ToArray(); List <string> names = new List <string>(); names.Add(field.fieldName); names.AddRange(fieldFlagsArray); for (int i = 0; i < names.Count; i++) { if (i == 0) { continue; } FieldInfo fi = Array.Find(fieldArray, s => (names[i] == s.Name)); if (fi != null) { names[i] += " : " + fi.FieldType.Name; } } int selectedField = 0; selectedField = EditorGUILayout.Popup(selectedField, names.ToArray(), GUILayout.MinWidth(minColumnWidth), GUILayout.MaxWidth(maxColumnWidth)); if (selectedField != 0) { fieldsToAdd.Add(new KeyValuePair <string, int>(fieldFlagsArray[selectedField - 1], fieldPosition)); fieldsToDelete.Add(field); dirtyVolumeFlags = true; } fieldPosition++; switch (field.fieldType) { case "System.Single": field.valueSingle = EditorGUILayout.FloatField(field.valueSingle, GUILayout.MinWidth(minValueWidth), GUILayout.MaxWidth(maxValueWidth)); break; case "System.Boolean": field.valueBoolean = EditorGUILayout.Toggle("", field.valueBoolean, GUILayout.MinWidth(minValueWidth), GUILayout.MaxWidth(maxValueWidth)); break; case "UnityEngine.Vector2": field.valueVector2 = EditorGUILayout.Vector2Field("", field.valueVector2, GUILayout.MinWidth(minValueWidth), GUILayout.MaxWidth(maxValueWidth), GUILayout.MaxHeight(16)); break; case "UnityEngine.Vector3": field.valueVector3 = EditorGUILayout.Vector3Field("", field.valueVector3, GUILayout.MinWidth(minValueWidth), GUILayout.MaxWidth(maxValueWidth), GUILayout.MaxHeight(16)); break; case "UnityEngine.Vector4": field.valueVector4 = DrawFixedVector4Field(field.valueVector4); break; case "UnityEngine.Color": field.valueColor = EditorGUILayout.ColorField(field.valueColor, GUILayout.MinWidth(minValueWidth), GUILayout.MaxWidth(maxValueWidth)); break; default: EditorGUILayout.LabelField(field.fieldType, GUILayout.MinWidth(minValueWidth), GUILayout.MaxWidth(maxValueWidth)); break; } // COPY TO CLIPBOARD string luid = NewLineContainer.GenerateUniqueID(effect, comp.componentName, field.fieldName); bool copied = copyLines.ContainsKey(luid); bool keep = GUILayout.Toggle(copied, "c", removeButtonStyle, GUILayout.Width(removeButtonSize), GUILayout.Height(removeButtonSize)); if (keep != copied) { if (keep) { object valueCopy = null; switch (field.fieldType) { case "System.Single": valueCopy = field.valueSingle; break; case "System.Boolean": valueCopy = field.valueBoolean; break; case "UnityEngine.Vector2": valueCopy = field.valueVector2; break; case "UnityEngine.Vector3": valueCopy = field.valueVector3; break; case "UnityEngine.Vector4": valueCopy = field.valueVector4; break; case "UnityEngine.Color": valueCopy = field.valueColor; break; } copyLines.Add(luid, new NewLineContainer(effect, comp.componentName, field.fieldName, field.fieldType, valueCopy)); } else { copyLines.Remove(luid); } //Debug.Log( "CopyComplete: " + luid + ", " + keep + ", " + volume.name ); } EditorGUILayout.EndHorizontal(); GUILayout.Space(2); } bool fieldRemoved = false; foreach (AmplifyColor.VolumeEffectField field in fieldsToDelete) { comp.RemoveEffectField(field); fieldRemoved = true; } foreach (KeyValuePair <string, int> pair in fieldsToAdd) { FieldInfo pi = c.GetType().GetField(pair.Key); if (pi != null) { comp.AddField(pi, c, pair.Value); } } if (fieldRemoved && comp.fields.Count <= 0) { compsToDelete.Add(comp); } } bool compRemoved = false; foreach (AmplifyColor.VolumeEffectComponent comp in compsToDelete) { effectVol.RemoveEffectComponent(comp); compRemoved = true; } if (compRemoved && effectVol.components.Count <= 0) { effectsToDelete.Add(effectVol); } } foreach (AmplifyColor.VolumeEffect effectVol in effectsToDelete) { volume.EffectContainer.RemoveVolumeEffect(effectVol); } #endregion CurrentEffectFields #region NewLines List <NewLineContainer> linesToDelete = new List <NewLineContainer>(); foreach (NewLineContainer line in volumeLines) { EditorGUILayout.BeginHorizontal(); GUILayout.Label("", GUILayout.MinWidth(minIndentWidth), GUILayout.MaxWidth(maxIndentWidth)); GUILayout.Space(0); if (GUILayout.Button("", minusStyle, GUILayout.MinWidth(18), GUILayout.MaxWidth(18), GUILayout.Height(20))) { linesToDelete.Add(line); } Camera selectedCamera = EditorGUILayout.ObjectField(line.camera, typeof(Camera), true, GUILayout.MinWidth(minColumnWidth * 1.5f), GUILayout.MaxWidth(maxColumnWidth * 1.5f)) as Camera; AmplifyColorEffect selectedEffect = (selectedCamera != null) ? selectedCamera.GetComponent <AmplifyColorEffect>() : null; if (selectedEffect != null && selectedEffect != line.camera) { line.SetCamera(selectedEffect); } AmplifyColor.VolumeEffect effectVol = null; if (line.camera != null) { effectVol = volume.EffectContainer.FindVolumeEffect(line.camera); } if (line.camera != null) { Component[] compArray = AmplifyColor.VolumeEffect.ListAcceptableComponents(line.camera); List <string> names = compArray.Select(s => s.GetType().Name).ToList <string>(); int popupSelected = names.IndexOf(line.component) + 1; names.Insert(0, "<Component>"); int selectedComponent = popupSelected; selectedComponent = EditorGUILayout.Popup(selectedComponent, names.ToArray(), GUILayout.MinWidth(minColumnWidth), GUILayout.MaxWidth(maxColumnWidth)); if (selectedComponent != popupSelected) { line.SetComponent(selectedComponent == 0 ? null : names[selectedComponent]); } } else { GUI.enabled = false; EditorGUILayout.Popup(0, new string[] { "<Component>" }, GUILayout.MaxWidth(maxColumnWidth)); GUI.enabled = true; } Component c = (line.camera == null) ? null : line.camera.GetComponent(line.component); AmplifyColor.VolumeEffectComponent comp = null; if (effectVol != null) { comp = effectVol.FindEffectComponent(line.component); } if (c != null) { FieldInfo[] fieldArray = AmplifyColor.VolumeEffectComponent.ListAcceptableFields(c); string[] fieldFlagsArray = fieldArray.Select(s => s.Name).ToArray(); if (comp != null) { string[] fieldNamesArray = comp.GetFieldNames(); fieldFlagsArray = fieldFlagsArray.Except(fieldNamesArray).ToArray(); } List <string> names = fieldFlagsArray.ToList(); for (int i = 0; i < names.Count; i++) { FieldInfo fi = Array.Find(fieldArray, s => (names[i] == s.Name)); if (fi != null) { names[i] += " : " + fi.FieldType.Name; } } names.Insert(0, "<Field>"); int selectedField = 0; selectedField = EditorGUILayout.Popup(selectedField, names.ToArray(), GUILayout.MinWidth(minColumnWidth), GUILayout.MaxWidth(maxColumnWidth)); if (selectedField > 0) { FieldInfo pi = c.GetType().GetField(fieldFlagsArray[selectedField - 1]); if (pi != null) { if (effectVol == null) { effectVol = volume.EffectContainer.AddJustColorEffect(line.camera); } if (comp == null) { comp = effectVol.AddComponent(c, null); } comp.AddField(pi, c); linesToDelete.Add(line); dirtyVolumeFlags = true; } } EditorGUILayout.LabelField("", GUILayout.MinWidth(minValueWidth), GUILayout.MaxWidth(maxValueWidth)); } else { GUI.enabled = false; EditorGUILayout.Popup(0, new string[] { "<Field>" }, GUILayout.MaxWidth(maxColumnWidth)); EditorGUILayout.TextField("", GUILayout.MinWidth(minValueWidth), GUILayout.MaxWidth(maxValueWidth)); GUI.enabled = true; } if (line.camera != null) { string luid = NewLineContainer.GenerateUniqueID(line.camera, line.component, line.fieldName); bool copied = copyLines.ContainsKey(luid); bool keep = GUILayout.Toggle(copied, "c", removeButtonStyle, GUILayout.Width(removeButtonSize), GUILayout.Height(removeButtonSize)); if (keep != copied) { if (keep) { copyLines.Add(luid, new NewLineContainer(line.camera, line.component, line.fieldName, line.fieldType, line.value)); } else { copyLines.Remove(luid); } //Debug.Log( "CopyIncomplete: " + luid + ", " + keep + ", " + volume.name ); } } else { GUI.enabled = false; GUILayout.Button("c", removeButtonStyle, GUILayout.Width(removeButtonSize), GUILayout.Height(removeButtonSize)); GUI.enabled = true; } EditorGUILayout.EndHorizontal(); GUILayout.Space(2); } foreach (NewLineContainer line in linesToDelete) { copyLines.Remove(line.GenerateUniqueID()); //Debug.Log( "Removed " + line.GenerateUniqueID() ); volumeLines.Remove(line); } #endregion NewLines #region AddPaste EditorGUILayout.BeginHorizontal(); GUILayout.Label("", GUILayout.MinWidth(minIndentWidth), GUILayout.MaxWidth(maxIndentWidth)); GUILayout.Space(0); bool add = GUILayout.Button("", plusStyle, GUILayout.MinWidth(18), GUILayout.MaxWidth(18), GUILayout.Height(20)); if (add || GUILayout.Button("Add New", GUILayout.MinWidth(minColumnWidth), GUILayout.MaxWidth(maxColumnWidth), GUILayout.Height(20))) { volumeLines.Add(new NewLineContainer()); } GUI.enabled = (copyLines.Count > 0); if (GUILayout.Button("Paste", GUILayout.MinWidth(minColumnWidth), GUILayout.MaxWidth(maxColumnWidth), GUILayout.Height(20))) { foreach (var pair in copyLines) { NewLineContainer line = pair.Value; Component c = (line.camera == null) ? null : line.camera.GetComponent(line.component); FieldInfo pi = (c != null) ? c.GetType().GetField(line.fieldName) : null; if (pi == null) { volumeLines.Add(new NewLineContainer(line.camera, line.component, line.fieldName, line.fieldType, line.value)); } else { AmplifyColor.VolumeEffect effectVol = volume.EffectContainer.FindVolumeEffect(line.camera); if (effectVol == null) { effectVol = volume.EffectContainer.AddJustColorEffect(line.camera); } AmplifyColor.VolumeEffectComponent comp = effectVol.FindEffectComponent(line.component); if (comp == null) { comp = effectVol.AddComponent(c, null); } AmplifyColor.VolumeEffectField field = comp.FindEffectField(line.fieldName); if (field == null) { field = comp.AddField(pi, c); } else { Debug.LogWarning("[AmplifyColor] Blend Effect field already added to Volume " + volume.name + "."); } field.UpdateValue(line.value); } } dirtyVolumeFlags = true; } GUI.enabled = true; EditorGUILayout.EndHorizontal(); GUILayout.Space(5); #endregion AddPaste }
public NewLineContainer(AmplifyColorEffect camera, string component) { this.camera = camera; this.component = component; }
public VolumeEffect(AmplifyColorEffect effect) { gameObject = effect; components = new List <VolumeEffectComponent>(); }
public static string GenerateUniqueID(AmplifyColorEffect camera, string component, string fieldName) { return(camera.GetInstanceID().ToString() + "." + component + "." + fieldName); }
private bool FindClone(AmplifyColorEffect effect) { #if UNITY_2018_3_OR_NEWER GameObject effectPrefab = PrefabUtility.GetCorrespondingObjectFromSource(effect.gameObject) as GameObject; PrefabAssetType effectPrefabType = PrefabUtility.GetPrefabAssetType(effect.gameObject); PrefabInstanceStatus effectPrefabInstanceStatus = PrefabUtility.GetPrefabInstanceStatus(effect.gameObject); bool effectIsPrefab = (effectPrefabType != PrefabAssetType.NotAPrefab && effectPrefabInstanceStatus == PrefabInstanceStatus.NotAPrefab); #else #if UNITY_2018_2_OR_NEWER GameObject effectPrefab = PrefabUtility.GetCorrespondingObjectFromSource(effect.gameObject) as GameObject; #else GameObject effectPrefab = PrefabUtility.GetPrefabParent(effect.gameObject) as GameObject; #endif PrefabType effectPrefabType = PrefabUtility.GetPrefabType(effect.gameObject); bool effectIsPrefab = (effectPrefabType != PrefabType.None && effectPrefabType != PrefabType.PrefabInstance); #endif bool effectHasPrefab = (effectPrefab != null); AmplifyColorEffect[] all = Resources.FindObjectsOfTypeAll(typeof(AmplifyColorEffect)) as AmplifyColorEffect[]; bool foundClone = false; foreach (AmplifyColorEffect other in all) { if (other == effect || other.SharedInstanceID != effect.SharedInstanceID) { // skip: same effect or already have different ids continue; } #if UNITY_2018_3_OR_NEWER GameObject otherPrefab = PrefabUtility.GetCorrespondingObjectFromSource(other.gameObject) as GameObject; PrefabAssetType otherPrefabType = PrefabUtility.GetPrefabAssetType(other.gameObject); PrefabInstanceStatus otherPrefabInstanceStatus = PrefabUtility.GetPrefabInstanceStatus(other.gameObject); bool otherIsPrefab = (otherPrefabType != PrefabAssetType.NotAPrefab && otherPrefabInstanceStatus == PrefabInstanceStatus.NotAPrefab); #else #if UNITY_2018_2_OR_NEWER GameObject otherPrefab = PrefabUtility.GetCorrespondingObjectFromSource(other.gameObject) as GameObject; #else GameObject otherPrefab = PrefabUtility.GetPrefabParent(other.gameObject) as GameObject; #endif PrefabType otherPrefabType = PrefabUtility.GetPrefabType(other.gameObject); bool otherIsPrefab = (otherPrefabType != PrefabType.None && otherPrefabType != PrefabType.PrefabInstance); #endif bool otherHasPrefab = (otherPrefab != null); if (otherIsPrefab && effectHasPrefab && effectPrefab == other.gameObject) { // skip: other is a prefab and effect's prefab is other continue; } if (effectIsPrefab && otherHasPrefab && otherPrefab == effect.gameObject) { // skip: effect is a prefab and other's prefab is effect continue; } if (!effectIsPrefab && !otherIsPrefab && effectHasPrefab && otherHasPrefab && effectPrefab == otherPrefab) { // skip: both aren't prefabs and both have the same parent prefab continue; } foundClone = true; } return(foundClone); }