void DrawLut(AmplifyColorVolumeBase volume)
 {
     GUILayout.Space(0);
     volume.LutTexture = ( Texture2D )EditorGUILayout.ObjectField(volume.LutTexture, typeof(Texture2D), false, GUILayout.Width(lutWidth), GUILayout.Height(lutWidth));
     GUILayout.FlexibleSpace();
     GUILayout.Space(5);
 }
Example #2
0
 public void ExitVolume(AmplifyColorVolumeBase volume)
 {
     if (enteredVolumes.Contains(volume))
     {
         enteredVolumes.Remove(volume);
     }
 }
Example #3
0
 public void EnterVolume(AmplifyColorVolumeBase volume)
 {
     if (!enteredVolumes.Contains(volume))
     {
         enteredVolumes.Insert(0, volume);
     }
 }
        bool GetFoldout(AmplifyColorVolumeBase volume)
        {
            string key = GetEditorPrefsKey(volume);

            if (!EditorPrefs.HasKey(key))
            {
                EditorPrefs.SetBool(key, false);
            }
            return(EditorPrefs.GetBool(key));
        }
Example #5
0
 public static void UpdateCamFlags(AmplifyColorBase[] effects, AmplifyColorVolumeBase[] volumes)
 {
     for (int i = 0; i < effects.Length; i++)
     {
         AmplifyColorBase amplifyColorBase = effects[i];
         amplifyColorBase.EffectFlags = new VolumeEffectFlags();
         for (int j = 0; j < volumes.Length; j++)
         {
             AmplifyColorVolumeBase amplifyColorVolumeBase = volumes[j];
             VolumeEffect           volumeEffect           = amplifyColorVolumeBase.EffectContainer.GetVolumeEffect(amplifyColorBase);
             if (volumeEffect != null)
             {
                 amplifyColorBase.EffectFlags.UpdateFlags(volumeEffect);
             }
         }
     }
 }
        void DrawVolumeEffects(AmplifyColorVolumeBase volume)
        {
            GUIStyle layerTitleStyle = new GUIStyle(EditorStyles.miniBoldLabel);

            layerTitleStyle.alignment = TextAnchor.MiddleLeft;
            layerTitleStyle.margin    = new RectOffset(0, 0, 0, 0);

            GUIStyle foldoutTitleStyle = new GUIStyle(EditorStyles.foldout);

            foldoutTitleStyle.fontSize = 10;

            GUILayout.BeginHorizontal();
            GUILayout.Space(10);
            GUILayout.Label("", GUILayout.MinWidth(iconMinWidth), GUILayout.MaxWidth(iconMaxWidth - 10));
            GUILayout.Space(2);

            GUILayout.BeginVertical();
            GUILayout.Space(0);

            GUILayout.BeginHorizontal();
            bool foldout = SetFoldout(volume, EditorGUILayout.Foldout(GetFoldout(volume), "Blend Effects", foldoutTitleStyle));

            GUILayout.EndHorizontal();

            GUILayout.Space(3);

            if (foldout)
            {
                DrawVolumeEffectFields(volume);
            }

            GUILayout.EndVertical();

            GUILayout.Space(0);
            GUILayout.EndHorizontal();
        }
	void DrawVolumeProperties( AmplifyColorVolumeBase volume )
	{
		GameObject obj = volume.gameObject;

		GUILayout.BeginHorizontal();
		GUILayout.Space( 10 );

		volumeIcon = ( volumeIcon == null ) ? Resources.Load( "volume-icon", typeof( Texture2D ) ) as Texture2D : volumeIcon;
		GUILayout.Label( volumeIcon, GUILayout.MinWidth( iconMinWidth ), GUILayout.MaxWidth( iconMaxWidth ) );

		GUILayout.Space( 0 );

		bool active = obj.activeInHierarchy;
		bool keep = EditorGUILayout.Toggle( active, GUILayout.MinWidth( activeMinWidth ), GUILayout.MaxWidth( activeMaxWidth ) );
		if ( keep != active )
			obj.SetActive( keep );

		GUILayout.Space( 6 );

		volume.ShowInSceneView = EditorGUILayout.Toggle( volume.ShowInSceneView, GUILayout.MinWidth( visibleMinWidth ), GUILayout.MaxWidth( visibleMaxWidth ) );

		GUILayout.Space( 6 );

		GUI.skin.textField.fontSize = 10;
		GUI.skin.textField.alignment = TextAnchor.UpperCenter;
		if ( GUILayout.Button( ( Selection.activeObject == obj ) ? "●" : "", EditorStyles.textField, GUILayout.Width( 16 ), GUILayout.Height( 16 ) ) )
			Selection.activeObject = ( Selection.activeObject == obj ) ? null : obj;

		GUILayout.Space( 0 );

		GUI.skin.textField.fontSize = 11;
		GUI.skin.textField.alignment = TextAnchor.MiddleLeft;

		string instId = obj.GetInstanceID().ToString();
		GUI.SetNextControlName( instId );

		if ( editObject != obj )
			EditorGUILayout.TextField( obj.name, GUILayout.MinWidth( nameMinWidth ), GUILayout.MaxWidth( nameMaxWidth ) );
		else
			editName = EditorGUILayout.TextField( editName, GUILayout.MinWidth( nameMinWidth ), GUILayout.MaxWidth( nameMaxWidth ) );

		if ( GUI.GetNameOfFocusedControl() == instId )
		{
			if ( editObject != obj )
			{
				editName = obj.name;
				editObject = obj;
			}
		}
		if ( Event.current.type == EventType.KeyUp && Event.current.keyCode == KeyCode.Return && editObject == obj )
		{
			obj.name = editName;
			editName = "";
			editObject = null;
			Repaint();
		}

		GUILayout.Space( 3 );

		EditorGUIUtility.labelWidth = 5;
		volume.EnterBlendTime = EditorGUILayout.FloatField( " ", volume.EnterBlendTime, GUILayout.MinWidth( blendMinWidth ), GUILayout.MaxWidth( blendMaxWidth ) );

		GUILayout.Space( 3 );

		volume.Exposure = EditorGUILayout.FloatField( " ", volume.Exposure, GUILayout.MinWidth( exposureMinWidth ), GUILayout.MaxWidth( exposureMaxWidth ) );

		GUILayout.Space( 3 );

		volume.Priority = EditorGUILayout.IntField( " ", volume.Priority, GUILayout.MinWidth( priorityMinWidth ), GUILayout.MaxWidth( priorityMaxWidth ) );

		GUILayout.EndHorizontal();
	}
    private void UpdateVolumes()
    {
        if (this.volumesBlending)
        {
            this.currentVolumeEffects.BlendValues(this, this.blendVolumeEffects, this.effectVolumesBlendAdjusted);
        }
        if (this.volumesBlending)
        {
            this.Exposure = Mathf.Lerp(this.currentExposure, this.blendExposure, this.effectVolumesBlendAdjusted);
        }
        Transform transform = (this.TriggerVolumeProxy == null) ? base.transform : this.TriggerVolumeProxy;

        if (this.actualTriggerProxy.transform.parent != transform)
        {
            this.actualTriggerProxy.Reference        = transform;
            this.actualTriggerProxy.gameObject.layer = transform.gameObject.layer;
        }
        AmplifyColorVolumeBase amplifyColorVolumeBase = null;
        int num = int.MinValue;

        for (int i = 0; i < this.enteredVolumes.Count; i++)
        {
            AmplifyColorVolumeBase amplifyColorVolumeBase2 = this.enteredVolumes[i];
            if (amplifyColorVolumeBase2.Priority > num)
            {
                amplifyColorVolumeBase = amplifyColorVolumeBase2;
                num = amplifyColorVolumeBase2.Priority;
            }
        }
        if (amplifyColorVolumeBase != this.currentVolumeLut)
        {
            this.currentVolumeLut = amplifyColorVolumeBase;
            Texture texture = (amplifyColorVolumeBase == null) ? this.worldLUT : amplifyColorVolumeBase.LutTexture;
            float   num2    = (amplifyColorVolumeBase == null) ? this.ExitVolumeBlendTime : amplifyColorVolumeBase.EnterBlendTime;
            if (this.volumesBlending && !this.blendingFromMidBlend && texture == this.LutTexture)
            {
                this.LutTexture                   = this.volumesLutBlendTexture;
                this.volumesLutBlendTexture       = texture;
                this.volumesBlendingTimeCountdown = num2 * ((this.volumesBlendingTime - this.volumesBlendingTimeCountdown) / this.volumesBlendingTime);
                this.volumesBlendingTime          = num2;
                this.currentVolumeEffects         = VolumeEffect.BlendValuesToVolumeEffect(this.EffectFlags, this.currentVolumeEffects, this.blendVolumeEffects, this.effectVolumesBlendAdjusted);
                this.currentExposure              = Mathf.Lerp(this.currentExposure, this.blendExposure, this.effectVolumesBlendAdjusted);
                this.effectVolumesBlendAdjust     = 1f - this.volumesBlendAmount;
                this.volumesBlendAmount           = 1f - this.volumesBlendAmount;
            }
            else
            {
                if (this.volumesBlending)
                {
                    this.materialBlendCache.SetFloat("_LerpAmount", this.volumesBlendAmount);
                    if (this.blendingFromMidBlend)
                    {
                        Graphics.Blit(this.midBlendLUT, this.blendCacheLut);
                        this.materialBlendCache.SetTexture("_RgbTex", this.blendCacheLut);
                    }
                    else
                    {
                        this.materialBlendCache.SetTexture("_RgbTex", this.LutTexture);
                    }
                    this.materialBlendCache.SetTexture("_LerpRgbTex", (this.volumesLutBlendTexture != null) ? this.volumesLutBlendTexture : this.defaultLut);
                    Graphics.Blit(this.midBlendLUT, this.midBlendLUT, this.materialBlendCache);
                    this.blendCacheLut.DiscardContents();
                    this.currentVolumeEffects     = VolumeEffect.BlendValuesToVolumeEffect(this.EffectFlags, this.currentVolumeEffects, this.blendVolumeEffects, this.effectVolumesBlendAdjusted);
                    this.currentExposure          = Mathf.Lerp(this.currentExposure, this.blendExposure, this.effectVolumesBlendAdjusted);
                    this.effectVolumesBlendAdjust = 0f;
                    this.blendingFromMidBlend     = true;
                }
                this.VolumesBlendTo(texture, num2);
            }
            this.blendVolumeEffects = ((amplifyColorVolumeBase == null) ? this.worldVolumeEffects : amplifyColorVolumeBase.EffectContainer.FindVolumeEffect(this));
            this.blendExposure      = ((amplifyColorVolumeBase == null) ? this.worldExposure : amplifyColorVolumeBase.Exposure);
            if (this.blendVolumeEffects == null)
            {
                this.blendVolumeEffects = this.worldVolumeEffects;
            }
        }
    }
	public static void UpdateCamFlags( AmplifyColorBase[] effects, AmplifyColorVolumeBase[] volumes )
	{
		foreach ( AmplifyColorBase effect in effects )
		{
			effect.EffectFlags = new VolumeEffectFlags();
			foreach ( AmplifyColorVolumeBase volume in volumes )
			{
				VolumeEffect effectVolume = volume.EffectContainer.GetVolumeEffect( effect );
				if ( effectVolume != null )
					effect.EffectFlags.UpdateFlags( effectVolume );
			}
		}
	}
Example #10
0
    private void UpdateVolumes()
    {
        if (this.volumesBlending)
        {
            this.currentVolumeEffects.BlendValues(this, this.blendVolumeEffects, this.effectVolumesBlendAdjusted);
        }
        Transform transform = (!(this.TriggerVolumeProxy == null)) ? this.TriggerVolumeProxy : base.transform;

        if (this.actualTriggerProxy.transform.parent != transform)
        {
            this.actualTriggerProxy.Reference        = transform;
            this.actualTriggerProxy.gameObject.layer = transform.gameObject.layer;
        }
        AmplifyColorVolumeBase amplifyColorVolumeBase = null;
        int num = -2147483648;

        foreach (AmplifyColorVolumeBase current in this.enteredVolumes)
        {
            if (current.Priority > num)
            {
                amplifyColorVolumeBase = current;
                num = current.Priority;
            }
        }
        if (amplifyColorVolumeBase != this.currentVolumeLut)
        {
            this.currentVolumeLut = amplifyColorVolumeBase;
            Texture texture = (!(amplifyColorVolumeBase == null)) ? amplifyColorVolumeBase.LutTexture : this.worldLUT;
            float   num2    = (!(amplifyColorVolumeBase == null)) ? amplifyColorVolumeBase.EnterBlendTime : this.ExitVolumeBlendTime;
            if (this.volumesBlending && !this.blendingFromMidBlend && texture == this.LutTexture)
            {
                this.LutTexture                   = this.volumesLutBlendTexture;
                this.volumesLutBlendTexture       = texture;
                this.volumesBlendingTimeCountdown = num2 * ((this.volumesBlendingTime - this.volumesBlendingTimeCountdown) / this.volumesBlendingTime);
                this.volumesBlendingTime          = num2;
                this.currentVolumeEffects         = VolumeEffect.BlendValuesToVolumeEffect(this.EffectFlags, this.currentVolumeEffects, this.blendVolumeEffects, this.effectVolumesBlendAdjusted);
                this.effectVolumesBlendAdjust     = 1f - this.volumesBlendAmount;
                this.volumesBlendAmount           = 1f - this.volumesBlendAmount;
            }
            else
            {
                if (this.volumesBlending)
                {
                    this.materialBlendCache.SetFloat("_lerpAmount", this.volumesBlendAmount);
                    if (this.blendingFromMidBlend)
                    {
                        Graphics.Blit(this.midBlendLUT, this.blendCacheLut);
                        this.materialBlendCache.SetTexture("_RgbTex", this.blendCacheLut);
                    }
                    else
                    {
                        this.materialBlendCache.SetTexture("_RgbTex", this.LutTexture);
                    }
                    this.materialBlendCache.SetTexture("_LerpRgbTex", (!(this.volumesLutBlendTexture != null)) ? this.defaultLut : this.volumesLutBlendTexture);
                    Graphics.Blit(this.midBlendLUT, this.midBlendLUT, this.materialBlendCache);
                    this.blendCacheLut.DiscardContents();
                    this.currentVolumeEffects     = VolumeEffect.BlendValuesToVolumeEffect(this.EffectFlags, this.currentVolumeEffects, this.blendVolumeEffects, this.effectVolumesBlendAdjusted);
                    this.effectVolumesBlendAdjust = 0f;
                    this.blendingFromMidBlend     = true;
                }
                this.VolumesBlendTo(texture, num2);
            }
            this.blendVolumeEffects = ((!(amplifyColorVolumeBase == null)) ? amplifyColorVolumeBase.EffectContainer.GetVolumeEffect(this) : this.worldVolumeEffects);
            if (this.blendVolumeEffects == null)
            {
                this.blendVolumeEffects = this.worldVolumeEffects;
            }
        }
    }
Example #11
0
    private void Update()
    {
        if (blending)
        {
            BlendAmount            = (blendingTime - blendingTimeCountdown) / blendingTime;
            blendingTimeCountdown -= Time.smoothDeltaTime;

            if (BlendAmount >= 1.0f)
            {
                LutTexture      = LutBlendTexture;
                BlendAmount     = 0.0f;
                blending        = false;
                LutBlendTexture = null;

                if (blendingFromMidBlend)
                {
                    if (midBlendLUT != null)
                    {
                        midBlendLUT.DiscardContents();
                    }

                                #if UNITY_4
                    if (use3d)
                    {
                        ReleaseLutMidBlendTexture3d();
                    }
                                #endif
                }

                blendingFromMidBlend = false;

                if (onFinishBlend != null)
                {
                    onFinishBlend();
                }
            }
        }
        else
        {
            BlendAmount = Mathf.Clamp01(BlendAmount);
        }

        if (UseVolumes)
        {
            Transform  proxy        = (TriggerVolumeProxy == null) ? camera.transform : TriggerVolumeProxy;
            Collider[] hitColliders = Physics.OverlapSphere(proxy.position, 0.01f, VolumeCollisionMask);

            AmplifyColorVolumeBase foundVolume = null;
            foreach (Collider c in hitColliders)
            {
                AmplifyColorVolumeBase colliderVolume = c.GetComponent <AmplifyColorVolumeBase>();
                if (colliderVolume != null)
                {
                    foundVolume = colliderVolume;
                    break;
                }
            }

            if (foundVolume != currentVolumeLut)
            {
                currentVolumeLut = foundVolume;
                Texture2D blendTex  = (foundVolume == null ? worldLUT : foundVolume.LutTexture);
                float     blendTime = (foundVolume == null ? ExitVolumeBlendTime : foundVolume.EnterBlendTime);

                if (IsBlending && !blendingFromMidBlend && blendTex == LutTexture)
                {
                    // Going back to previous volume optimization
                    LutTexture            = LutBlendTexture;
                    LutBlendTexture       = blendTex;
                    blendingTimeCountdown = blendTime * ((blendingTime - blendingTimeCountdown) / blendingTime);
                    blendingTime          = blendTime;
                    BlendAmount           = 1 - BlendAmount;
                }
                else
                {
                    if (IsBlending)
                    {
                                        #if UNITY_4
                        if (use3d)
                        {
                            BlendAmount = Mathf.Clamp01(BlendAmount);
                            materialBlendCache.SetFloat("_lerpAmount", BlendAmount);

                            if (blendingFromMidBlend)
                            {
                                materialBlendCache.SetTexture("_RgbTex", midBlendLUT);
                            }
                            else
                            {
                                materialBlendCache.SetTexture("_RgbTex", LutTexture);
                            }

                            materialBlendCache.SetTexture("_LerpRgbTex", (LutBlendTexture != null) ? LutBlendTexture : normalLut);
                            Graphics.Blit(LutTexture, midBlendLUT, materialBlendCache);

                            Texture2D tempTex = new Texture2D(midBlendLUT.width, midBlendLUT.height, TextureFormat.RGB24, false, true)
                            {
                                hideFlags = HideFlags.HideAndDontSave
                            };
                            tempTex.wrapMode   = TextureWrapMode.Clamp;
                            tempTex.anisoLevel = 0;

                            RenderTexture.active = midBlendLUT;
                            tempTex.ReadPixels(new Rect(0, 0, midBlendLUT.width, midBlendLUT.height), 0, 0);
                            tempTex.Apply();
                            midBlendLUT.DiscardContents();
                            ReleaseLutMidBlendTexture3d();
                            midBlendLUT3d = ConvertLutTo3D(tempTex);
                            DestroyImmediate(tempTex);
                        }
                        else
                        {
                                        #endif
                        materialBlendCache.SetFloat("_lerpAmount", BlendAmount);
                        if (blendingFromMidBlend)
                        {
                            materialBlendCache.SetTexture("_RgbTex", midBlendLUT);
                        }
                        else
                        {
                            materialBlendCache.SetTexture("_RgbTex", LutTexture);
                        }
                        materialBlendCache.SetTexture("_LerpRgbTex", (LutBlendTexture != null) ? LutBlendTexture : normalLut);
                        Graphics.Blit(LutTexture, midBlendLUT, materialBlendCache);
                                        #if UNITY_4
                        midBlendLUT.MarkRestoreExpected();
                    }
                                        #endif
                        blendingFromMidBlend = true;
                    }
                    BlendTo(blendTex, blendTime, null);
                }
            }
        }
    }
Example #12
0
	public void EnterVolume( AmplifyColorVolumeBase volume )
	{
		if ( !enteredVolumes.Contains( volume ) )
			enteredVolumes.Insert( 0, volume );			
	}
Example #13
0
	public void ExitVolume( AmplifyColorVolumeBase volume )
	{
		if ( enteredVolumes.Contains( volume ) )
			enteredVolumes.Remove( volume );		
	}
 static string GetEditorPrefsKey(AmplifyColorVolumeBase volume)
 {
     return("AmplifyColor.VolumeEditor.Foldout." + volume.GetHashCode());
 }
	bool GetFoldout( AmplifyColorVolumeBase volume )
	{
		string key = GetEditorPrefsKey( volume );
		if ( !EditorPrefs.HasKey( key ) )
			EditorPrefs.SetBool( key, false );
		return EditorPrefs.GetBool( key );
	}
	bool SetFoldout( AmplifyColorVolumeBase volume, bool state )
	{
		EditorPrefs.SetBool( GetEditorPrefsKey( volume ), state );
		return state;
	}
	static string GetEditorPrefsKey( AmplifyColorVolumeBase volume )
	{
		return "AmplifyColor.VolumeEditor.Foldout." + volume.GetHashCode();
	}
Example #18
0
	private void UpdateVolumes()
	{
		if ( volumesBlending )
			currentVolumeEffects.BlendValues( this, blendVolumeEffects, effectVolumesBlendAdjusted );

		Transform reference = ( TriggerVolumeProxy == null ) ? transform : TriggerVolumeProxy;

		if ( actualTriggerProxy.transform.parent != reference )
		{
			actualTriggerProxy.Reference = reference;
			actualTriggerProxy.gameObject.layer = reference.gameObject.layer;
		}
	
		AmplifyColorVolumeBase foundVolume = null;
		int maxPriority = int.MinValue;

		// Find volume with higher priority
		foreach ( AmplifyColorVolumeBase vol in enteredVolumes )
		{
			if ( vol.Priority > maxPriority )
			{
				foundVolume = vol;
				maxPriority = vol.Priority;
			}
		}			

		// Trigger blend on volume transition
		if ( foundVolume != currentVolumeLut )
		{
			currentVolumeLut = foundVolume;
			Texture2D blendTex = ( foundVolume == null ? worldLUT : foundVolume.LutTexture );
			float blendTime = ( foundVolume == null ? ExitVolumeBlendTime : foundVolume.EnterBlendTime );

			if ( volumesBlending && !blendingFromMidBlend && blendTex == LutTexture )
			{
				// Going back to previous volume optimization
				LutTexture = volumesLutBlendTexture;
				volumesLutBlendTexture = blendTex;
				volumesBlendingTimeCountdown = blendTime * ( ( volumesBlendingTime - volumesBlendingTimeCountdown ) / volumesBlendingTime );
				volumesBlendingTime = blendTime;
				currentVolumeEffects = VolumeEffect.BlendValuesToVolumeEffect( EffectFlags, currentVolumeEffects, blendVolumeEffects, effectVolumesBlendAdjusted );
				effectVolumesBlendAdjust = 1 - volumesBlendAmount;
				volumesBlendAmount = 1 - volumesBlendAmount;
			}
			else
			{
				if ( volumesBlending )
				{
					materialBlendCache.SetFloat( "_lerpAmount", volumesBlendAmount );

					if ( blendingFromMidBlend )
					{
						Graphics.Blit( midBlendLUT, blendCacheLut );
						materialBlendCache.SetTexture( "_RgbTex", blendCacheLut );
					}
					else
						materialBlendCache.SetTexture( "_RgbTex", LutTexture );

					materialBlendCache.SetTexture( "_LerpRgbTex", ( volumesLutBlendTexture != null ) ? volumesLutBlendTexture : normalLut );

					Graphics.Blit( midBlendLUT, midBlendLUT, materialBlendCache );

					blendCacheLut.DiscardContents();
				#if UNITY_4
					midBlendLUT.MarkRestoreExpected();
				#endif

					currentVolumeEffects = VolumeEffect.BlendValuesToVolumeEffect( EffectFlags, currentVolumeEffects, blendVolumeEffects, effectVolumesBlendAdjusted );
					effectVolumesBlendAdjust = 0.0f;
					blendingFromMidBlend = true;
				}
				VolumesBlendTo( blendTex, blendTime );
			}

			blendVolumeEffects = ( foundVolume == null ? worldVolumeEffects : foundVolume.EffectContainer.GetVolumeEffect( this ) );
			if ( blendVolumeEffects == null )
				blendVolumeEffects = worldVolumeEffects;
		}
	}
 bool SetFoldout(AmplifyColorVolumeBase volume, bool state)
 {
     EditorPrefs.SetBool(GetEditorPrefsKey(volume), state);
     return(state);
 }
	void DrawVolumeEffects( AmplifyColorVolumeBase volume )
	{
		GUIStyle layerTitleStyle = new GUIStyle( EditorStyles.miniBoldLabel );
		layerTitleStyle.alignment = TextAnchor.MiddleLeft;
		layerTitleStyle.margin = new RectOffset( 0, 0, 0, 0 );

		GUIStyle foldoutTitleStyle = new GUIStyle( EditorStyles.foldout );
		foldoutTitleStyle.fontSize = 10;

		GUILayout.BeginHorizontal();
		GUILayout.Space( 10 );
		GUILayout.Label( "", GUILayout.MinWidth( iconMinWidth ), GUILayout.MaxWidth( iconMaxWidth - 10 ) );
		GUILayout.Space( 2 );

		GUILayout.BeginVertical();
		GUILayout.Space( 0 );

		GUILayout.BeginHorizontal();
		bool foldout = SetFoldout( volume, EditorGUILayout.Foldout( GetFoldout( volume ), "Blend Effects", foldoutTitleStyle ) );
		GUILayout.EndHorizontal();

		GUILayout.Space( 3 );

		if ( foldout )
			DrawVolumeEffectFields( volume );

		GUILayout.EndVertical();

		GUILayout.Space( 0 );
		GUILayout.EndHorizontal();
	}
        void DrawVolumeProperties(AmplifyColorVolumeBase volume)
        {
            GameObject obj = volume.gameObject;

            GUILayout.BeginHorizontal();
            GUILayout.Space(10);

            volumeIcon = (volumeIcon == null) ? Resources.Load("volume-icon", typeof(Texture2D)) as Texture2D : volumeIcon;
            GUILayout.Label("", GUILayout.MinWidth(iconMinWidth), GUILayout.MaxWidth(iconMaxWidth));
            GUILayout.Space(-iconMinWidth * 2);
            GUILayout.Label(volumeIcon, GUILayout.Width(20), GUILayout.Height(20));
            GUILayout.Space(16);

            GUILayout.Space(0);

            bool active = obj.activeInHierarchy;
            bool keep   = EditorGUILayout.Toggle(active, GUILayout.MinWidth(activeMinWidth), GUILayout.MaxWidth(activeMaxWidth));

            if (keep != active)
            {
                obj.SetActive(keep);
            }

            GUILayout.Space(6);

            volume.ShowInSceneView = EditorGUILayout.Toggle(volume.ShowInSceneView, GUILayout.MinWidth(visibleMinWidth), GUILayout.MaxWidth(visibleMaxWidth));

            GUILayout.Space(6);

            GUI.skin.textField.fontSize  = 10;
            GUI.skin.textField.alignment = TextAnchor.UpperCenter;
            if (GUILayout.Button((Selection.activeObject == obj) ? "●" : "", EditorStyles.textField, GUILayout.Width(16), GUILayout.Height(16)))
            {
                Selection.activeObject = (Selection.activeObject == obj) ? null : obj;
            }

            GUILayout.Space(0);

            GUI.skin.textField.fontSize  = 11;
            GUI.skin.textField.alignment = TextAnchor.MiddleLeft;

            string instId = obj.GetInstanceID().ToString();

            GUI.SetNextControlName(instId);

            if (editObject != obj)
            {
                EditorGUILayout.TextField(obj.name, GUILayout.MinWidth(nameMinWidth), GUILayout.MaxWidth(nameMaxWidth));
            }
            else
            {
                editName = EditorGUILayout.TextField(editName, GUILayout.MinWidth(nameMinWidth), GUILayout.MaxWidth(nameMaxWidth));
            }

            if (GUI.GetNameOfFocusedControl() == instId)
            {
                if (editObject != obj)
                {
                    editName   = obj.name;
                    editObject = obj;
                }
            }
            if (Event.current.type == EventType.KeyUp && Event.current.keyCode == KeyCode.Return && editObject == obj)
            {
                obj.name   = editName;
                editName   = "";
                editObject = null;
                Repaint();
            }

            GUILayout.Space(3);

            EditorGUIUtility.labelWidth = 5;
            volume.EnterBlendTime       = EditorGUILayout.FloatField(" ", volume.EnterBlendTime, GUILayout.MinWidth(blendMinWidth), GUILayout.MaxWidth(blendMaxWidth));

            GUILayout.Space(3);

            volume.Exposure = EditorGUILayout.FloatField(" ", volume.Exposure, GUILayout.MinWidth(exposureMinWidth), GUILayout.MaxWidth(exposureMaxWidth));

            GUILayout.Space(3);

            volume.Priority = EditorGUILayout.IntField(" ", volume.Priority, GUILayout.MinWidth(priorityMinWidth), GUILayout.MaxWidth(priorityMaxWidth));

            GUILayout.EndHorizontal();
        }
	void DrawVolumeEffectFields( AmplifyColorVolumeBase volume )
	{
		List<VolumeEffect> effectsToDelete = new List<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 ( VolumeEffect effectVol in volume.EffectContainer.volumes )
		{
			if ( effectVol.gameObject == null )
				continue;

			AmplifyColorBase effect = effectVol.gameObject;
			List<VolumeEffectComponent> compsToDelete = new List<VolumeEffectComponent>();

			foreach ( VolumeEffectComponent comp in effectVol.components )
			{
				Component c = effect.GetComponent( comp.componentName );
				if ( c == null )
					continue;

				List<VolumeEffectField> fieldsToDelete = new List<VolumeEffectField>();
				List<KeyValuePair<string,int>> fieldsToAdd = new List<KeyValuePair<string,int>>();

				foreach ( 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;
					AmplifyColorBase selectedEffect = ( selectedCamera != null ) ? selectedCamera.GetComponent<AmplifyColorBase>() : null;
					if ( selectedEffect != effect )
					{
						fieldsToDelete.Add( field );
						dirtyVolumeFlags = true;
						volumeLines.Add( new NewLineContainer( selectedEffect ) );
					}

					Component[] compArray = 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 = 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 ( 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 ( VolumeEffectComponent comp in compsToDelete )
			{
				effectVol.RemoveEffectComponent( comp );
				compRemoved = true;
			}

			if ( compRemoved && effectVol.components.Count <= 0 )
				effectsToDelete.Add( effectVol );
		}

		foreach ( 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;
			AmplifyColorBase selectedEffect = ( selectedCamera != null ) ? selectedCamera.GetComponent<AmplifyColorBase>() : null;
			if ( selectedEffect != null && selectedEffect != line.camera )
				line.SetCamera( selectedEffect );

			VolumeEffect effectVol = null;
			if ( line.camera != null )
				effectVol = volume.EffectContainer.FindVolumeEffect( line.camera );

			if ( line.camera != null )
			{
				Component[] compArray = 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 );

			VolumeEffectComponent comp = null;
			if ( effectVol != null )
				comp = effectVol.FindEffectComponent( line.component );

			if ( c != null )
			{
				FieldInfo[] fieldArray = 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
				{
					VolumeEffect effectVol = volume.EffectContainer.FindVolumeEffect( line.camera );
					if ( effectVol == null )
						effectVol = volume.EffectContainer.AddJustColorEffect( line.camera );

					VolumeEffectComponent comp = effectVol.FindEffectComponent( line.component );
					if ( comp == null )
						comp = effectVol.AddComponent( c, null );

					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
	}
        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;
                }

                AmplifyColorBase 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;
                        AmplifyColorBase selectedEffect = (selectedCamera != null) ? selectedCamera.GetComponent <AmplifyColorBase>() : 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;
                AmplifyColorBase selectedEffect = (selectedCamera != null) ? selectedCamera.GetComponent <AmplifyColorBase>() : 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
        }
	void DrawLut( AmplifyColorVolumeBase volume )
	{
		GUILayout.Space( 0 );
		volume.LutTexture = ( Texture2D ) EditorGUILayout.ObjectField( volume.LutTexture, typeof( Texture2D ), false, GUILayout.Width( lutWidth ), GUILayout.Height( lutWidth ) );
		GUILayout.FlexibleSpace();
		GUILayout.Space( 5 );
	}
Example #25
0
    }                            // 0x00861650-0x00861A00

    public void EnterVolume(AmplifyColorVolumeBase volume)
    {
    }                                                             // 0x008622F0-0x00862380
Example #26
0
    }                                                             // 0x008622F0-0x00862380

    public void ExitVolume(AmplifyColorVolumeBase volume)
    {
    }                                                            // 0x00862380-0x00862410
Example #27
0
    private void UpdateVolumes()
    {
        if (volumesBlending)
        {
            currentVolumeEffects.BlendValues(this, blendVolumeEffects, effectVolumesBlendAdjusted);
        }

        Transform reference = (TriggerVolumeProxy == null) ? transform : TriggerVolumeProxy;

        if (actualTriggerProxy.transform.parent != reference)
        {
            actualTriggerProxy.Reference        = reference;
            actualTriggerProxy.gameObject.layer = reference.gameObject.layer;
        }

        AmplifyColorVolumeBase foundVolume = null;
        int maxPriority = int.MinValue;

        // Find volume with higher priority
        foreach (AmplifyColorVolumeBase vol in enteredVolumes)
        {
            if (vol.Priority > maxPriority)
            {
                foundVolume = vol;
                maxPriority = vol.Priority;
            }
        }

        // Trigger blend on volume transition
        if (foundVolume != currentVolumeLut)
        {
            currentVolumeLut = foundVolume;
            Texture blendTex  = (foundVolume == null ? worldLUT : foundVolume.LutTexture);
            float   blendTime = (foundVolume == null ? ExitVolumeBlendTime : foundVolume.EnterBlendTime);

            if (volumesBlending && !blendingFromMidBlend && blendTex == LutTexture)
            {
                // Going back to previous volume optimization
                LutTexture                   = volumesLutBlendTexture;
                volumesLutBlendTexture       = blendTex;
                volumesBlendingTimeCountdown = blendTime * ((volumesBlendingTime - volumesBlendingTimeCountdown) / volumesBlendingTime);
                volumesBlendingTime          = blendTime;
                currentVolumeEffects         = VolumeEffect.BlendValuesToVolumeEffect(EffectFlags, currentVolumeEffects, blendVolumeEffects, effectVolumesBlendAdjusted);
                effectVolumesBlendAdjust     = 1 - volumesBlendAmount;
                volumesBlendAmount           = 1 - volumesBlendAmount;
            }
            else
            {
                if (volumesBlending)
                {
                    materialBlendCache.SetFloat("_lerpAmount", volumesBlendAmount);

                    if (blendingFromMidBlend)
                    {
                        Graphics.Blit(midBlendLUT, blendCacheLut);
                        materialBlendCache.SetTexture("_RgbTex", blendCacheLut);
                    }
                    else
                    {
                        materialBlendCache.SetTexture("_RgbTex", LutTexture);
                    }

                    materialBlendCache.SetTexture("_LerpRgbTex", (volumesLutBlendTexture != null) ? volumesLutBlendTexture : defaultLut);

                    Graphics.Blit(midBlendLUT, midBlendLUT, materialBlendCache);

                    blendCacheLut.DiscardContents();
                                #if UNITY_4
                    midBlendLUT.MarkRestoreExpected();
                                #endif

                    currentVolumeEffects     = VolumeEffect.BlendValuesToVolumeEffect(EffectFlags, currentVolumeEffects, blendVolumeEffects, effectVolumesBlendAdjusted);
                    effectVolumesBlendAdjust = 0.0f;
                    blendingFromMidBlend     = true;
                }
                VolumesBlendTo(blendTex, blendTime);
            }

            blendVolumeEffects = (foundVolume == null ? worldVolumeEffects : foundVolume.EffectContainer.GetVolumeEffect(this));
            if (blendVolumeEffects == null)
            {
                blendVolumeEffects = worldVolumeEffects;
            }
        }
    }
Example #28
0
 private void UpdateVolumes()
 {
     if (this.volumesBlending)
     {
         this.currentVolumeEffects.BlendValues(this, this.blendVolumeEffects, this.effectVolumesBlendAdjusted);
     }
     Transform transform = (!(this.TriggerVolumeProxy == null)) ? this.TriggerVolumeProxy : base.transform;
     if (this.actualTriggerProxy.transform.parent != transform)
     {
         this.actualTriggerProxy.Reference = transform;
         this.actualTriggerProxy.gameObject.layer = transform.gameObject.layer;
     }
     AmplifyColorVolumeBase amplifyColorVolumeBase = null;
     int num = -2147483648;
     foreach (AmplifyColorVolumeBase current in this.enteredVolumes)
     {
         if (current.Priority > num)
         {
             amplifyColorVolumeBase = current;
             num = current.Priority;
         }
     }
     if (amplifyColorVolumeBase != this.currentVolumeLut)
     {
         this.currentVolumeLut = amplifyColorVolumeBase;
         Texture texture = (!(amplifyColorVolumeBase == null)) ? amplifyColorVolumeBase.LutTexture : this.worldLUT;
         float num2 = (!(amplifyColorVolumeBase == null)) ? amplifyColorVolumeBase.EnterBlendTime : this.ExitVolumeBlendTime;
         if (this.volumesBlending && !this.blendingFromMidBlend && texture == this.LutTexture)
         {
             this.LutTexture = this.volumesLutBlendTexture;
             this.volumesLutBlendTexture = texture;
             this.volumesBlendingTimeCountdown = num2 * ((this.volumesBlendingTime - this.volumesBlendingTimeCountdown) / this.volumesBlendingTime);
             this.volumesBlendingTime = num2;
             this.currentVolumeEffects = VolumeEffect.BlendValuesToVolumeEffect(this.EffectFlags, this.currentVolumeEffects, this.blendVolumeEffects, this.effectVolumesBlendAdjusted);
             this.effectVolumesBlendAdjust = 1f - this.volumesBlendAmount;
             this.volumesBlendAmount = 1f - this.volumesBlendAmount;
         }
         else
         {
             if (this.volumesBlending)
             {
                 this.materialBlendCache.SetFloat("_lerpAmount", this.volumesBlendAmount);
                 if (this.blendingFromMidBlend)
                 {
                     Graphics.Blit(this.midBlendLUT, this.blendCacheLut);
                     this.materialBlendCache.SetTexture("_RgbTex", this.blendCacheLut);
                 }
                 else
                 {
                     this.materialBlendCache.SetTexture("_RgbTex", this.LutTexture);
                 }
                 this.materialBlendCache.SetTexture("_LerpRgbTex", (!(this.volumesLutBlendTexture != null)) ? this.defaultLut : this.volumesLutBlendTexture);
                 Graphics.Blit(this.midBlendLUT, this.midBlendLUT, this.materialBlendCache);
                 this.blendCacheLut.DiscardContents();
                 this.currentVolumeEffects = VolumeEffect.BlendValuesToVolumeEffect(this.EffectFlags, this.currentVolumeEffects, this.blendVolumeEffects, this.effectVolumesBlendAdjusted);
                 this.effectVolumesBlendAdjust = 0f;
                 this.blendingFromMidBlend = true;
             }
             this.VolumesBlendTo(texture, num2);
         }
         this.blendVolumeEffects = ((!(amplifyColorVolumeBase == null)) ? amplifyColorVolumeBase.EffectContainer.GetVolumeEffect(this) : this.worldVolumeEffects);
         if (this.blendVolumeEffects == null)
         {
             this.blendVolumeEffects = this.worldVolumeEffects;
         }
     }
 }