Skip to content

Commit bed79c3

Browse files
author
Karl Henkel
committed
add the ability to reset shape builder parameters
1 parent 6d04730 commit bed79c3

File tree

2 files changed

+79
-21
lines changed

2 files changed

+79
-21
lines changed

Editor/EditorCore/ProBuilderSettingsProvider.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,17 @@ static class ProBuilderSettingsProvider
1313
static SettingsProvider CreateSettingsProvider()
1414
{
1515
var provider = new UserSettingsProvider(k_PreferencesPath,
16-
ProBuilderSettings.instance,
17-
new[] { typeof(ProBuilderSettingsProvider).Assembly });
16+
ProBuilderSettings.instance,
17+
new[] { typeof(ProBuilderSettingsProvider).Assembly });
1818

1919
ProBuilderSettings.instance.afterSettingsSaved += () =>
20-
{
21-
if (ProBuilderEditor.instance != null)
22-
ProBuilderEditor.ReloadSettings();
23-
};
20+
{
21+
if(ProBuilderEditor.instance != null)
22+
ProBuilderEditor.ReloadSettings();
23+
};
2424

2525
return provider;
2626
}
27-
2827
#else
2928

3029
[NonSerialized]

Editor/EditorCore/ShapeEditor.cs

Lines changed: 73 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Linq;
3+
using System.Reflection;
34
using UnityEditor.Experimental.SceneManagement;
45
using UnityEngine;
56
using UnityEngine.ProBuilder;
@@ -18,6 +19,11 @@ namespace UnityEditor.ProBuilder
1819
/// </summary>
1920
sealed class ShapeEditor : ConfigurableWindow
2021
{
22+
static class Styles
23+
{
24+
public static readonly GUIStyle options = "PaneOptions";
25+
}
26+
2127
abstract class ShapeBuilder
2228
{
2329
public virtual string name
@@ -28,6 +34,22 @@ public virtual string name
2834
public abstract void OnGUI();
2935

3036
public abstract ProBuilderMesh Build(bool isPreview = false);
37+
38+
public void ResetParameters()
39+
{
40+
var members = GetType().GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
41+
42+
foreach (var fi in members)
43+
{
44+
if(fi.GetValue(this) is IUserSetting setting)
45+
setting.Reset();
46+
// if(fi.FieldType.BaseType?.GetGenericTypeDefinition() == typeof(UserSetting<>))
47+
// {
48+
// var setting = fi.GetValue(this) as IUserSetting;
49+
// Debug.Log($"Name: {fi.Name}\nType: {fi.FieldType}\nValue {fi.GetValue(this)}");
50+
// }
51+
}
52+
}
3153
}
3254

3355
public static void MenuOpenShapeCreator()
@@ -71,7 +93,7 @@ void OnEnable()
7193
m_ShapeTypes = s_ShapeBuilders.Select(x => x.name).ToArray();
7294
// Delaying the call til end of frame fixes an issue where entering play mode would cause the preview object
7395
// to not appear in the Hierarchy until the Shape Editor is interacted with.
74-
EditorApplication.delayCall += () => SetPreviewMesh(s_ShapeBuilders[s_CurrentIndex].Build());
96+
EditorApplication.delayCall += () => SetPreviewMesh(GetActiveShapeBuilder().Build());
7597
EditorApplication.playModeStateChanged += PlayModeStateChanged;
7698
}
7799

@@ -86,7 +108,7 @@ void OnDisable()
86108
void PlayModeStateChanged(PlayModeStateChange state)
87109
{
88110
if(state == PlayModeStateChange.EnteredEditMode)
89-
SetPreviewMesh(s_ShapeBuilders[s_CurrentIndex].Build());
111+
SetPreviewMesh(GetActiveShapeBuilder().Build());
90112
}
91113

92114
void PrefabStageOpened(PrefabStage stage)
@@ -126,11 +148,16 @@ void OnGUI()
126148

127149
s_CurrentIndex.value = EditorGUILayout.Popup(s_CurrentIndex, m_ShapeTypes);
128150

151+
GUILayout.BeginHorizontal();
129152
GUILayout.Label("Shape Settings", EditorStyles.boldLabel);
153+
GUILayout.FlexibleSpace();
154+
if (GUILayout.Button(GUIContent.none, Styles.options))
155+
ShapeBuilderOptions(GetActiveShapeBuilder());
156+
GUILayout.EndHorizontal();
130157

131158
m_Scroll = EditorGUILayout.BeginScrollView(m_Scroll);
132159

133-
var shape = s_ShapeBuilders[s_CurrentIndex];
160+
var shape = GetActiveShapeBuilder();
134161

135162
shape.OnGUI();
136163

@@ -154,8 +181,10 @@ void CreateSelectedShape(bool forceCloseWindow = false)
154181
ApplyPreviewTransform(res);
155182
DestroyPreviewObject(true);
156183

157-
if (forceCloseWindow || s_CloseWindowAfterCreateShape)
184+
if(forceCloseWindow || s_CloseWindowAfterCreateShape)
158185
Close();
186+
else
187+
ResetPreviewAfterShapeCreation(res);
159188
}
160189

161190
/// <summary>
@@ -170,6 +199,21 @@ public static ProBuilderMesh CreateActiveShape()
170199
return res;
171200
}
172201

202+
// Reinitialize the shape preview and move it to the right a bit so that it is visible
203+
void ResetPreviewAfterShapeCreation(ProBuilderMesh lastInstantiatedMesh)
204+
{
205+
RebuildPreview();
206+
207+
if(lastInstantiatedMesh != null)
208+
{
209+
var src = lastInstantiatedMesh.transform;
210+
var dst = m_PreviewObject.transform;
211+
dst.position = src.position + Vector3.right;
212+
dst.localRotation = src.localRotation;
213+
dst.localScale = src.localScale;
214+
}
215+
}
216+
173217
void DestroyPreviewObject(bool immediate)
174218
{
175219
if (immediate)
@@ -178,6 +222,27 @@ void DestroyPreviewObject(bool immediate)
178222
EditorApplication.delayCall += DestroyPreviewObjectInternal;
179223
}
180224

225+
void ShapeBuilderOptions(ShapeBuilder builder)
226+
{
227+
var menu = new GenericMenu();
228+
menu.AddItem(new GUIContent("Reset", "Reset the selected Shape parameters."), false, () =>
229+
{
230+
builder.ResetParameters();
231+
RebuildPreview();
232+
});
233+
menu.ShowAsContext();
234+
}
235+
236+
static ShapeBuilder GetActiveShapeBuilder()
237+
{
238+
return s_ShapeBuilders[PMath.Clamp(s_CurrentIndex, 0, s_ShapeBuilders.Length - 1)];
239+
}
240+
241+
public void RebuildPreview()
242+
{
243+
SetPreviewMesh(GetActiveShapeBuilder().Build());
244+
}
245+
181246
void DestroyPreviewObjectInternal()
182247
{
183248
if (m_PreviewObject != null)
@@ -239,20 +304,14 @@ void SetPreviewMesh(ProBuilderMesh mesh)
239304

240305
void ApplyPreviewTransform(ProBuilderMesh mesh)
241306
{
242-
var position = Vector3.zero;
243-
var scale = Vector3.one;
244-
var rotation = Quaternion.identity;
245307
var previous = m_PreviewObject != null;
246308

247309
if (previous)
248310
{
249-
position = m_PreviewObject.transform.position;
250-
rotation = m_PreviewObject.transform.localRotation;
251-
scale = m_PreviewObject.transform.localScale;
252-
253-
mesh.transform.position = position;
254-
mesh.transform.localRotation = rotation;
255-
mesh.transform.localScale = scale;
311+
var trs = mesh.transform;
312+
trs.position = m_PreviewObject.transform.position;
313+
trs.localRotation = m_PreviewObject.transform.localRotation;
314+
trs.localScale = m_PreviewObject.transform.localScale;
256315
}
257316
else
258317
{

0 commit comments

Comments
 (0)