Exemplo n.º 1
0
        public VolumeEffect AddJustColorEffect(AmplifyColorEffect colorEffect)
        {
            VolumeEffect created = new VolumeEffect(colorEffect);

            volumes.Add(created);
            return(created);
        }
Exemplo n.º 2
0
        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;
                    }
                }
            }
        }
Exemplo n.º 3
0
 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;
 }
Exemplo n.º 4
0
 public void SetCamera(AmplifyColorEffect camera)
 {
     this.camera = camera;
     component   = "";
     fieldName   = "";
     fieldType   = "";
     value       = null;
 }
Exemplo n.º 5
0
        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);
            }
        }
Exemplo n.º 6
0
        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());
        }
Exemplo n.º 7
0
        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;
                    }
                }
            }
        }
Exemplo n.º 8
0
        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;
        }
Exemplo n.º 9
0
        public void AddColorEffect(AmplifyColorEffect colorEffect)
        {
            VolumeEffect volume;

            if ((volume = FindVolumeEffect(colorEffect)) != null)
            {
                volume.UpdateVolume();
            }
            else
            {
                volume = new VolumeEffect(colorEffect);
                volumes.Add(volume);
                volume.UpdateVolume();
            }
        }
Exemplo n.º 10
0
    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> ();
    }
Exemplo n.º 11
0
    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");
    }
Exemplo n.º 12
0
        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);
        }
Exemplo n.º 13
0
        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);
        }
Exemplo n.º 14
0
    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);
            }
        }
    }
Exemplo n.º 15
0
 public void OnLevelWasLoaded(int levelId)
 {
     glow     = GameObject.FindObjectOfType <GlowEffect>();
     Charlie  = GameObject.FindObjectOfType <HappyHippo> ();
     colorAmp = GameObject.FindObjectOfType <AmplifyColorEffect>();
 }
Exemplo n.º 16
0
 public NewLineContainer(AmplifyColorEffect camera)
 {
     this.camera = camera;
 }
Exemplo n.º 17
0
        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);
        }
Exemplo n.º 18
0
        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
        }
Exemplo n.º 19
0
 public NewLineContainer(AmplifyColorEffect camera, string component)
 {
     this.camera    = camera;
     this.component = component;
 }
Exemplo n.º 20
0
 public VolumeEffect(AmplifyColorEffect effect)
 {
     gameObject = effect;
     components = new List <VolumeEffectComponent>();
 }
Exemplo n.º 21
0
 public static string GenerateUniqueID(AmplifyColorEffect camera, string component, string fieldName)
 {
     return(camera.GetInstanceID().ToString() + "." + component + "." + fieldName);
 }
Exemplo n.º 22
0
    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);
    }