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); }
public void ExitVolume(AmplifyColorVolumeBase volume) { if (enteredVolumes.Contains(volume)) { enteredVolumes.Remove(volume); } }
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)); }
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 ); } } }
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; } } }
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); } } } }
public void EnterVolume( AmplifyColorVolumeBase volume ) { if ( !enteredVolumes.Contains( volume ) ) enteredVolumes.Insert( 0, volume ); }
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(); }
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 ); }
} // 0x00861650-0x00861A00 public void EnterVolume(AmplifyColorVolumeBase volume) { } // 0x008622F0-0x00862380
} // 0x008622F0-0x00862380 public void ExitVolume(AmplifyColorVolumeBase volume) { } // 0x00862380-0x00862410
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; } } }