Skip to content

Commit 18ff9c4

Browse files
authored
Merge pull request #103 from OpenCommissioning/development
Development
2 parents 7721402 + 5f0cb33 commit 18ff9c4

3 files changed

Lines changed: 105 additions & 25 deletions

File tree

Editor/Scripts/MaterialUtils.cs

Lines changed: 64 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ namespace OC.Editor
88
{
99
public class MaterialUtils : EditorWindow
1010
{
11+
private const string PREFS_MATERIAL_LAST = "PREFS_MaterialUtils_MATERIAL_LAST";
12+
1113
private ObjectField _objectField;
1214
private ObjectField _materialField;
1315
private GameObject _target;
1416
private Material _material;
1517

16-
17-
[MenuItem("Open Commissioning/Material Utils")]
18+
[MenuItem("Open Commissioning/Tools/Material Utils")]
1819
public static void ShowMaterialManager()
1920
{
2021
var window = GetWindow<MaterialUtils>();
@@ -38,22 +39,45 @@ private void CreateGUI()
3839
rootVisualElement.Add(_objectField);
3940
rootVisualElement.Add(_materialField);
4041

41-
rootVisualElement.Add(new Button(ApplyMaterial)
42+
rootVisualElement.Add(new Button(OnButtonClick)
4243
{
4344
text = "Set for all"
4445
});
4546

46-
_objectField.RegisterCallback<ChangeEvent<Object>>((evt) =>
47+
_objectField.RegisterCallback<ChangeEvent<Object>>(evt =>
4748
{
4849
_target = (GameObject)evt.newValue;
4950
});
5051

51-
_materialField.RegisterCallback<ChangeEvent<Object>>((evt) =>
52+
_materialField.RegisterCallback<ChangeEvent<Object>>(evt =>
5253
{
5354
_material = (Material)evt.newValue;
5455
});
5556

5657
OnSelectionChange();
58+
59+
_materialField.SetValueWithoutNotify(LoadMaterialFromPrefs());
60+
}
61+
62+
private void OnDisable()
63+
{
64+
SafeMaterialPrefs(_material);
65+
}
66+
67+
private Material LoadMaterialFromPrefs()
68+
{
69+
var id = PlayerPrefs.GetString(PREFS_MATERIAL_LAST);
70+
return string.IsNullOrEmpty(id) ? null : AssetDatabase.LoadAssetAtPath<Material>(id);
71+
}
72+
73+
private void SafeMaterialPrefs(Material material)
74+
{
75+
if (material == null) return;
76+
var path = AssetDatabase.GetAssetPath(material);
77+
if (string.IsNullOrEmpty(path)) return;
78+
79+
PlayerPrefs.SetString(PREFS_MATERIAL_LAST, path);
80+
PlayerPrefs.Save();
5781
}
5882

5983
private void OnSelectionChange()
@@ -65,31 +89,51 @@ private void OnSelectionChange()
6589
}
6690
}
6791

68-
private void ApplyMaterial()
92+
private void OnButtonClick() => ApplyMaterial(_target, _material);
93+
94+
private void ApplyMaterial(GameObject root, Material material)
6995
{
70-
if (_target == null) return;
71-
if (_material == null) return;
96+
if (root == null) return;
97+
if (material == null) return;
7298
var counter = 0;
7399

74-
var renderes = _target.GetComponentsInChildren<Renderer>();
75-
foreach (var renderer in renderes)
100+
var renderers = _target.GetComponentsInChildren<Renderer>(includeInactive: false);
101+
if (renderers == null || renderers.Length == 0) return;
102+
103+
Undo.SetCurrentGroupName("Assign Material To Children");
104+
var group = Undo.GetCurrentGroup();
105+
106+
foreach (var renderer in renderers)
76107
{
77-
Material[] materials = new Material[renderer.materials.Length];
78-
if (renderer.materials.Length > 1)
108+
if (renderer == null) continue;
109+
Undo.RecordObject(renderer, "Assign Material To Children");
110+
111+
var sharedMaterials = new Material[renderer.sharedMaterials.Length];
112+
113+
switch (sharedMaterials.Length)
79114
{
80-
for (var i = 0; i < materials.Length; i++)
115+
case 0:
116+
continue;
117+
case 1:
118+
renderer.sharedMaterial = _material;
119+
counter++;
120+
break;
121+
case > 1:
81122
{
82-
materials[i] = _material;
83-
}
123+
for (var i = 0; i < sharedMaterials.Length; i++)
124+
{
125+
sharedMaterials[i] = _material;
126+
}
84127

85-
renderer.materials = materials;
86-
counter++;
128+
renderer.sharedMaterials = sharedMaterials;
129+
counter++;
130+
break;
131+
}
87132
}
88-
89-
renderer.material = _material;
90133
}
91134

92-
Debug.Log($"Materials Utils: {counter} materials are changed");
135+
Undo.CollapseUndoOperations(group);
136+
Debug.Log($"Material Utils: {counter} materials are changed");
93137
}
94138
}
95139
}

Runtime/Scripts/Common/Utils.cs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,10 @@ public static bool TryBoundBoxColliderSize(GameObject gameObject, out BoxCollide
114114
boxCollider = gameObject.GetComponent<BoxCollider>();
115115
if (boxCollider == null)
116116
{
117-
throw new NullReferenceException("BoxCollider is null");
117+
#if UNITY_EDITOR
118+
boxCollider = UnityEditor.Undo.AddComponent<BoxCollider>(gameObject);
119+
#endif
120+
if (boxCollider == null) throw new NullReferenceException("BoxCollider is null");
118121
}
119122
#if UNITY_EDITOR
120123
UnityEditor.Undo.RecordObject(boxCollider, "Set Box Collider Bound Size");
@@ -123,6 +126,8 @@ public static bool TryBoundBoxColliderSize(GameObject gameObject, out BoxCollide
123126
boxCollider.center = bounds.center;
124127
boxCollider.size = bounds.size;
125128

129+
Debug.Log($"BoxCollider size for {gameObject.name} is {boxCollider.size}", gameObject);
130+
126131
#if UNITY_EDITOR
127132

128133
UnityEditor.EditorUtility.SetDirty(gameObject);
@@ -145,15 +150,23 @@ public static bool TryBoundBoxColliderSize(GameObject gameObject, out BoxCollide
145150
public static Bounds GetLocalBoundsForChildrenMeshes(GameObject gameObject)
146151
{
147152
var transform = gameObject.transform;
148-
var localBounds = new Bounds(Vector3.zero, Vector3.zero);
149153
var filters = gameObject.GetComponentsInChildren<MeshFilter>();
154+
var localBounds = new List<Bounds>();
155+
150156
foreach (var meshFilter in filters)
151157
{
152158
var matrix = transform.localToWorldMatrix.inverse * meshFilter.transform.localToWorldMatrix;
153159
var axisAlignedBounds = GeometryUtility.CalculateBounds(meshFilter.sharedMesh.vertices, matrix);
154-
localBounds.Encapsulate(axisAlignedBounds);
160+
localBounds.Add(axisAlignedBounds);
161+
}
162+
163+
var result = localBounds[0];
164+
for (var i = 1; i < localBounds.Count; i++)
165+
{
166+
result.Encapsulate(localBounds[i]);
155167
}
156-
return localBounds;
168+
169+
return result;
157170
}
158171
}
159172
}

Runtime/Scripts/MaterialFlow/GripperBase.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ public abstract class GripperBase : Detector, IPayloadBuffer, ICustomInspector
1313
{
1414
public IPropertyReadOnly<bool> IsActive => _isActive;
1515
public IPropertyReadOnly<bool> IsPicked => _isPicked;
16-
1716
public IReadOnlyList<Payload> Buffer => _buffer;
1817

1918
[SerializeField]
@@ -68,6 +67,30 @@ private void Start()
6867
_initColliderCenter = _collider.center;
6968
}
7069

70+
public void Pick(bool pick)
71+
{
72+
if (pick)
73+
{
74+
Pick();
75+
}
76+
else
77+
{
78+
Place();
79+
}
80+
}
81+
82+
public void Place(bool place)
83+
{
84+
if (place)
85+
{
86+
Place();
87+
}
88+
else
89+
{
90+
Pick();
91+
}
92+
}
93+
7194
public void Pick()
7295
{
7396
if (_isActive.Value) return;

0 commit comments

Comments
 (0)