Skip to content

Commit 5286646

Browse files
committed
feat(component): LODGeneratorHelper uses LODGeneratorPreset
LODGeneratorHelper has two new properties, A LODGeneratorPreset obj ref and a "customization" toggle. If customization is enabled (default), the helper drives all properties itself. If customization is disabled, properties are driven by a specified preset. If no preset is specified, defaults matching previous behavior are used.
1 parent ff23b32 commit 5286646

File tree

2 files changed

+124
-8
lines changed

2 files changed

+124
-8
lines changed

Editor/LODGeneratorHelperEditor.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ namespace UnityMeshSimplifier.Editor
3535
[CustomEditor(typeof(LODGeneratorHelper))]
3636
internal sealed class LODGeneratorHelperEditor : UnityEditor.Editor
3737
{
38+
private const string LodGeneratorPresetFieldName = "lodGeneratorPreset";
39+
private const string CustomizeSettingsFieldName = "customizeSettings";
3840
private const string FadeModeFieldName = "fadeMode";
3941
private const string AnimateCrossFadingFieldName = "animateCrossFading";
4042
private const string AutoCollectRenderersFieldName = "autoCollectRenderers";
@@ -54,6 +56,8 @@ internal sealed class LODGeneratorHelperEditor : UnityEditor.Editor
5456
private const float RendererButtonWidth = 60f;
5557
private const float RemoveRendererButtonSize = 20f;
5658

59+
private SerializedProperty lodGeneratorPresetProperty = null;
60+
private SerializedProperty customizeSettingsProperty = null;
5761
private SerializedProperty fadeModeProperty = null;
5862
private SerializedProperty animateCrossFadingProperty = null;
5963
private SerializedProperty autoCollectRenderersProperty = null;
@@ -82,6 +86,8 @@ internal sealed class LODGeneratorHelperEditor : UnityEditor.Editor
8286

8387
private void OnEnable()
8488
{
89+
lodGeneratorPresetProperty = serializedObject.FindProperty(LodGeneratorPresetFieldName);
90+
customizeSettingsProperty = serializedObject.FindProperty(CustomizeSettingsFieldName);
8591
fadeModeProperty = serializedObject.FindProperty(FadeModeFieldName);
8692
animateCrossFadingProperty = serializedObject.FindProperty(AnimateCrossFadingFieldName);
8793
autoCollectRenderersProperty = serializedObject.FindProperty(AutoCollectRenderersFieldName);
@@ -128,6 +134,9 @@ private void DrawGeneratedView()
128134

129135
private void DrawNotGeneratedView()
130136
{
137+
EditorGUILayout.ObjectField(lodGeneratorPresetProperty, typeof(LODGeneratorPreset));
138+
EditorGUILayout.PropertyField(customizeSettingsProperty);
139+
131140
EditorGUILayout.PropertyField(fadeModeProperty);
132141
var fadeMode = (LODFadeMode)fadeModeProperty.intValue;
133142

@@ -631,7 +640,7 @@ where go.transform.IsChildOf(ourTransform)
631640

632641
if (prefabGameObjects.Any())
633642
{
634-
EditorUtility.DisplayDialog("Invalid GameObjects", "Some objects are not children of the LODGenerator GameObject," +
643+
EditorUtility.DisplayDialog("Invalid GameObjects", "Some objects are not children of the LODGenerator GameObject," +
635644
" as well as being part of a prefab. They will not be added.", "OK");
636645
}
637646
#endif

Runtime/Components/LODGeneratorHelper.cs

Lines changed: 114 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ namespace UnityMeshSimplifier
3535
public sealed class LODGeneratorHelper : MonoBehaviour
3636
{
3737
#region Fields
38+
[SerializeField, Tooltip("The LOD Generator preset to use.")]
39+
private LODGeneratorPreset lodGeneratorPreset = null;
40+
41+
[SerializeField, Tooltip("Whether to enable customization of preset-derived generation settings.")]
42+
private bool customizeSettings = true;
43+
3844
[SerializeField, Tooltip("The fade mode used by the created LOD group.")]
3945
private LODFadeMode fadeMode = LODFadeMode.None;
4046
[SerializeField, Tooltip("If the cross-fading should be animated by time.")]
@@ -57,13 +63,41 @@ public sealed class LODGeneratorHelper : MonoBehaviour
5763
#endregion
5864

5965
#region Properties
66+
/// <summary>
67+
/// Gets or sets a LOD generator preset. Presets can be used to drive simplification options and levels in a sharable way.
68+
/// </summary>
69+
public LODGeneratorPreset LodGeneratorPreset
70+
{
71+
get { return lodGeneratorPreset; }
72+
set { lodGeneratorPreset = value; }
73+
}
74+
75+
/// <summary>
76+
/// Gets or sets if the simplification options and levels should be customizable, versus driven by the specified preset.
77+
/// </summary>
78+
public bool CustomizeSettings
79+
{
80+
get { return customizeSettings; }
81+
set { customizeSettings = value; }
82+
}
83+
6084
/// <summary>
6185
/// Gets or sets the fade mode used by the created LOD group.
6286
/// </summary>
6387
public LODFadeMode FadeMode
6488
{
6589
get { return fadeMode; }
66-
set { fadeMode = value; }
90+
set
91+
{
92+
if (!customizeSettings)
93+
{
94+
fadeMode = value;
95+
}
96+
else
97+
{
98+
WarnDisabledCustomization();
99+
}
100+
}
67101
}
68102

69103
/// <summary>
@@ -73,7 +107,17 @@ public LODFadeMode FadeMode
73107
public bool AnimateCrossFading
74108
{
75109
get { return animateCrossFading; }
76-
set { animateCrossFading = value; }
110+
set
111+
{
112+
if (!customizeSettings)
113+
{
114+
animateCrossFading = value;
115+
}
116+
else
117+
{
118+
WarnDisabledCustomization();
119+
}
120+
}
77121
}
78122

79123
/// <summary>
@@ -91,7 +135,17 @@ public bool AutoCollectRenderers
91135
public SimplificationOptions SimplificationOptions
92136
{
93137
get { return simplificationOptions; }
94-
set { simplificationOptions = value; }
138+
set
139+
{
140+
if (!customizeSettings)
141+
{
142+
simplificationOptions = value;
143+
}
144+
else
145+
{
146+
WarnDisabledCustomization();
147+
}
148+
}
95149
}
96150

97151
/// <summary>
@@ -110,7 +164,17 @@ public string SaveAssetsPath
110164
public LODLevel[] Levels
111165
{
112166
get { return levels; }
113-
set { levels = value; }
167+
set
168+
{
169+
if (!customizeSettings)
170+
{
171+
levels = value;
172+
}
173+
else
174+
{
175+
WarnDisabledCustomization();
176+
}
177+
}
114178
}
115179

116180
/// <summary>
@@ -124,14 +188,57 @@ public bool IsGenerated
124188

125189
#region Unity Events
126190
private void Reset()
191+
{
192+
autoCollectRenderers = true;
193+
ResetPresetDerivedSettings();
194+
}
195+
196+
private void OnValidate()
197+
{
198+
if (!customizeSettings)
199+
{
200+
UpdateSettingsFromPreset();
201+
}
202+
}
203+
#endregion
204+
205+
private void WarnDisabledCustomization()
206+
{
207+
Debug.LogWarning($"Attempted to set a preset-driven property on a {typeof(LODGeneratorHelper)} while customization is disabled. Enable customization first.");
208+
}
209+
210+
private void ResetPresetDerivedSettings()
127211
{
128212
fadeMode = LODFadeMode.None;
129213
animateCrossFading = false;
130-
autoCollectRenderers = true;
131214
simplificationOptions = SimplificationOptions.Default;
132-
133215
levels = LODLevel.GetDefaultLevels();
134216
}
135-
#endregion
217+
218+
private void UpdateSettingsFromPreset()
219+
{
220+
// Retain copy of levels so any specified renderers can survive reset
221+
LODLevel[] previousLevels = (LODLevel[])levels.Clone();
222+
223+
// Copy settings from preset, or use defaults if no preset specified
224+
if (lodGeneratorPreset != null)
225+
{
226+
fadeMode = lodGeneratorPreset.FadeMode;
227+
animateCrossFading = lodGeneratorPreset.AnimateCrossFading;
228+
simplificationOptions = lodGeneratorPreset.SimplificationOptions;
229+
levels = (LODLevel[])lodGeneratorPreset.Levels.Clone();
230+
}
231+
else
232+
{
233+
ResetPresetDerivedSettings();
234+
}
235+
236+
// Copy specified renderers over
237+
int rendererCopyCount = Mathf.Min(levels.Length, previousLevels.Length);
238+
for(int idx = 0; idx < rendererCopyCount; idx++)
239+
{
240+
levels[idx].Renderers = (Renderer[])previousLevels[idx].Renderers.Clone();
241+
}
242+
}
136243
}
137244
}

0 commit comments

Comments
 (0)