@@ -30,7 +30,8 @@ public interface IPresetDrawer
3030 {
3131 public string GetPresetFileName ( ) ;
3232
33- public LwguiShaderPropertyPreset . Preset GetActivePreset ( MaterialProperty inProp , LwguiShaderPropertyPreset lwguiShaderPropertyPreset ) ;
33+ public LwguiShaderPropertyPreset . Preset GetActivePreset ( MaterialProperty inProp , LwguiShaderPropertyPreset lwguiShaderPropertyPreset ) =>
34+ lwguiShaderPropertyPreset ? . TryGetPreset ( inProp ? . floatValue ?? - 1 ) ;
3435 }
3536 #endregion
3637
@@ -110,9 +111,6 @@ public virtual void GetDefaultValueDescription(Shader inShader, MaterialProperty
110111
111112 public string GetPresetFileName ( ) => _presetFileName ;
112113
113- public LwguiShaderPropertyPreset . Preset GetActivePreset ( MaterialProperty inProp , LwguiShaderPropertyPreset lwguiShaderPropertyPreset ) =>
114- PresetDrawer . GetActivePresetFromFloatProperty ( inProp , lwguiShaderPropertyPreset ) ;
115-
116114 public override void OnGUI ( Rect position , MaterialProperty prop , GUIContent label , MaterialEditor editor )
117115 {
118116 metaDatas = Helper . GetLWGUIMetadatas ( editor ) ;
@@ -128,7 +126,7 @@ public override void OnGUI(Rect position, MaterialProperty prop, GUIContent labe
128126 prop . floatValue = toggleResult ? 1.0f : 0.0f ;
129127 var keyword = Helper . GetKeywordName ( _keyword , prop . name ) ;
130128 Helper . SetShaderKeywordEnabled ( editor . targets , keyword , toggleResult ) ;
131- PresetHelper . GetPresetAsset ( _presetFileName ) ? . GetPreset ( prop . floatValue ) ? . ApplyToEditingMaterial ( editor , metaDatas . perMaterialData ) ;
129+ PresetHelper . GetPresetAsset ( _presetFileName ) ? . TryGetPreset ( prop . floatValue ) ? . ApplyToEditingMaterial ( editor , metaDatas . perMaterialData ) ;
132130 TimelineHelper . SetKeywordToggleToTimeline ( prop , editor , keyword ) ;
133131 }
134132 EditorGUI . showMixedValue = showMixedValue ;
@@ -265,9 +263,6 @@ public override void GetDefaultValueDescription(Shader inShader, MaterialPropert
265263 }
266264
267265 public string GetPresetFileName ( ) => _presetFileName ;
268-
269- public LwguiShaderPropertyPreset . Preset GetActivePreset ( MaterialProperty inProp , LwguiShaderPropertyPreset lwguiShaderPropertyPreset ) =>
270- PresetDrawer . GetActivePresetFromFloatProperty ( inProp , lwguiShaderPropertyPreset ) ;
271266
272267 public override void DrawProp ( Rect position , MaterialProperty prop , GUIContent label , MaterialEditor editor )
273268 {
@@ -279,7 +274,7 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l
279274 prop . floatValue = value ? 1.0f : 0.0f ;
280275 var keyword = Helper . GetKeywordName ( _keyWord , prop . name ) ;
281276 Helper . SetShaderKeywordEnabled ( editor . targets , keyword , value ) ;
282- PresetHelper . GetPresetAsset ( _presetFileName ) ? . GetPreset ( prop . floatValue ) ? . ApplyToEditingMaterial ( editor , metaDatas . perMaterialData ) ;
277+ PresetHelper . GetPresetAsset ( _presetFileName ) ? . TryGetPreset ( prop . floatValue ) ? . ApplyToEditingMaterial ( editor , metaDatas . perMaterialData ) ;
283278 TimelineHelper . SetKeywordToggleToTimeline ( prop , editor , keyword ) ;
284279 }
285280 EditorGUI . showMixedValue = false ;
@@ -301,30 +296,61 @@ public override void Apply(MaterialProperty prop)
301296 ///
302297 /// group: parent group name (Default: none)
303298 /// power: power of slider (Default: 1)
299+ /// presetFileName: "Shader Property Preset" asset name, it rounds up the float to choose which Preset to use.
300+ /// You can create new Preset by
301+ /// "Right Click > Create > LWGUI > Shader Property Preset" in Project window,
302+ /// *any Preset in the entire project cannot have the same name*
304303 /// Target Property Type: Range
305304 /// </summary>
306- public class SubPowerSliderDrawer : SubDrawer
305+ public class SubPowerSliderDrawer : SubDrawer , IPresetDrawer
307306 {
307+ public string presetFileName ;
308+
308309 private float _power = 1 ;
309310
310311 public SubPowerSliderDrawer ( float power ) : this ( "_" , power ) { }
312+
313+ public SubPowerSliderDrawer ( string group , float power ) : this ( group , power , string . Empty ) { }
311314
312- public SubPowerSliderDrawer ( string group , float power )
315+ public SubPowerSliderDrawer ( string group , float power , string presetFileName )
313316 {
314317 this . group = group ;
315318 this . _power = Mathf . Clamp ( power , 0 , float . MaxValue ) ;
319+ this . presetFileName = presetFileName ;
316320 }
317321
318322 protected override bool IsMatchPropType ( MaterialProperty property ) { return property . GetPropertyType ( ) == ShaderPropertyType . Range ; }
323+
324+ public override void BuildStaticMetaData ( Shader inShader , MaterialProperty inProp , MaterialProperty [ ] inProps , PropertyStaticData inoutPropertyStaticData )
325+ {
326+ base . BuildStaticMetaData ( inShader , inProp , inProps , inoutPropertyStaticData ) ;
327+ PresetDrawer . SetPresetAssetToStaticData ( inoutPropertyStaticData , presetFileName ) ;
328+ }
329+
330+ public string GetPresetFileName ( ) => presetFileName ;
319331
320332 public override void DrawProp ( Rect position , MaterialProperty prop , GUIContent label , MaterialEditor editor )
321333 {
322334 RevertableHelper . FixGUIWidthMismatch ( prop . GetPropertyType ( ) , editor ) ;
323335 EditorGUI . showMixedValue = prop . hasMixedValue ;
324336 var rect = position ;
337+ var oldValue = prop . floatValue ;
325338 ReflectionHelper . DoPowerRangeProperty ( rect , prop , label , _power ) ;
339+ if ( prop . floatValue != oldValue )
340+ {
341+ PresetHelper . GetPresetAsset ( presetFileName ) ? . TryGetPreset ( prop . floatValue ) ? . ApplyToEditingMaterial ( editor , metaDatas . perMaterialData ) ;
342+ }
326343 EditorGUI . showMixedValue = false ;
327344 }
345+
346+ public override void Apply ( MaterialProperty prop )
347+ {
348+ base . Apply ( prop ) ;
349+ if ( ! prop . hasMixedValue && VersionControlHelper . IsWriteable ( prop . targets ) )
350+ {
351+ PresetDrawer . ApplyPresetWithoutPropertyChanges ( presetFileName , prop ) ;
352+ }
353+ }
328354 }
329355
330356 /// <summary>
@@ -717,28 +743,14 @@ public static void SetPresetAssetToStaticData(PropertyStaticData inoutPropertySt
717743 inoutPropertyStaticData . propertyPresetAsset = PresetHelper . GetPresetAsset ( presetFileName ) ;
718744 }
719745
720- public static LwguiShaderPropertyPreset . Preset GetActivePresetFromFloatProperty ( MaterialProperty inProp , LwguiShaderPropertyPreset lwguiShaderPropertyPreset )
721- {
722- LwguiShaderPropertyPreset . Preset preset = null ;
723- var index = ( int ) inProp . floatValue ;
724- if ( lwguiShaderPropertyPreset && index >= 0 && index < lwguiShaderPropertyPreset . GetPresetCount ( ) )
725- {
726- preset = lwguiShaderPropertyPreset . GetPreset ( index ) ;
727- }
728- return preset ;
729- }
730-
731746 // Apply Keywords and Passes in presets without modifying other property values
732747 // Used to call in MaterialPropertyDrawer.Apply()
733748 public static void ApplyPresetWithoutPropertyChanges ( string presetFileName , MaterialProperty prop )
734749 {
735750 var presetFile = PresetHelper . GetPresetAsset ( presetFileName ) ;
736- if ( presetFile != null
737- && prop . floatValue < presetFile . GetPresetCount ( )
738- && ShowIfDecorator . GetShowIfResultToFilterDrawerApplying ( prop )
739- )
751+ if ( presetFile && ShowIfDecorator . GetShowIfResultToFilterDrawerApplying ( prop ) )
740752 {
741- presetFile . GetPreset ( prop . floatValue ) ? . ApplyKeywordsAndPassesToMaterials ( prop . targets ) ;
753+ presetFile . TryGetPreset ( prop . floatValue ) ? . ApplyKeywordsAndPassesToMaterials ( prop . targets ) ;
742754 }
743755 }
744756
@@ -752,18 +764,13 @@ public override void BuildStaticMetaData(Shader inShader, MaterialProperty inPro
752764
753765 public override void GetDefaultValueDescription ( Shader inShader , MaterialProperty inProp , MaterialProperty inDefaultProp , PerShaderData inPerShaderData , PerMaterialData inoutPerMaterialData )
754766 {
755- var index = ( int ) inDefaultProp . floatValue ;
756767 var propertyPreset = inPerShaderData . propStaticDatas [ inProp . name ] . propertyPresetAsset ;
757-
758- if ( propertyPreset && index < propertyPreset . GetPresetCount ( ) && index >= 0 )
759- inoutPerMaterialData . propDynamicDatas [ inProp . name ] . defaultValueDescription = propertyPreset . GetPreset ( index ) . presetName ;
768+ if ( propertyPreset )
769+ inoutPerMaterialData . propDynamicDatas [ inProp . name ] . defaultValueDescription = propertyPreset . TryGetPreset ( inDefaultProp . floatValue ) ? . presetName ;
760770 }
761771
762772 public string GetPresetFileName ( ) => presetFileName ;
763773
764- public LwguiShaderPropertyPreset . Preset GetActivePreset ( MaterialProperty inProp , LwguiShaderPropertyPreset lwguiShaderPropertyPreset ) =>
765- GetActivePresetFromFloatProperty ( inProp , lwguiShaderPropertyPreset ) ;
766-
767774 public override void DrawProp ( Rect position , MaterialProperty prop , GUIContent label , MaterialEditor editor )
768775 {
769776 EditorGUI . BeginChangeCheck ( ) ;
@@ -773,7 +780,7 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l
773780
774781 int index = ( int ) Mathf . Max ( 0 , prop . floatValue ) ;
775782 var presetFile = PresetHelper . GetPresetAsset ( presetFileName ) ;
776- if ( presetFile == null || presetFile . GetPresetCount ( ) == 0 )
783+ if ( ! presetFile || presetFile . GetPresetCount ( ) == 0 )
777784 {
778785 Helper . DrawShaderPropertyWithErrorLabel ( rect , prop , label , editor , $ "Invalid Preset File: { presetFileName } ") ;
779786 return ;
@@ -790,7 +797,7 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l
790797 if ( Helper . EndChangeCheck ( metaDatas , prop ) )
791798 {
792799 prop . floatValue = newIndex ;
793- presetFile . GetPreset ( newIndex ) . ApplyToEditingMaterial ( editor , metaDatas . perMaterialData ) ;
800+ presetFile . TryGetPreset ( newIndex ) ? . ApplyToEditingMaterial ( editor , metaDatas . perMaterialData ) ;
794801 }
795802 EditorGUI . showMixedValue = false ;
796803 }
@@ -799,7 +806,6 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l
799806 Helper . DrawShaderPropertyWithErrorLabel ( position , prop , label , editor , $ "Out of Index Range") ;
800807 Debug . LogError ( $ "LWGUI: { prop . name } out of Preset index range!") ;
801808 }
802-
803809 }
804810
805811 public override void Apply ( MaterialProperty prop )
0 commit comments