public static void OnSceneTreeComponent(SceneExplorerState state, ReferenceChain refChain, Component component) { if (!SceneExplorerCommon.SceneTreeCheckDepth(refChain)) { return; } if (component == null) { SceneExplorerCommon.OnSceneTreeMessage(refChain, "null"); return; } GUILayout.BeginHorizontal(); GUILayout.Space(ModTools.Instance.config.sceneExplorerTreeIdentSpacing * refChain.Ident); if (Util.ComponentIsEnabled(component)) { GUI.contentColor = ModTools.Instance.config.enabledComponentColor; } else { GUI.contentColor = ModTools.Instance.config.disabledComponentColor; } if (state.currentRefChain == null || !state.currentRefChain.Equals(refChain.Add(component))) { if (GUILayout.Button(">", GUILayout.ExpandWidth(false))) { state.currentRefChain = refChain.Add(component); state.currentRefChain.IdentOffset = -(refChain.Length + 1); } } else { GUI.contentColor = ModTools.Instance.config.selectedComponentColor; if (GUILayout.Button("<", GUILayout.ExpandWidth(false))) { state.currentRefChain = null; } } GUILayout.Label(component.GetType().ToString()); GUI.contentColor = Color.white; GUILayout.EndHorizontal(); }
public static void OnSceneTreeReflectUnityEngineTransform(ReferenceChain refChain, Transform transform) { if (!SceneExplorerCommon.SceneTreeCheckDepth(refChain)) { return; } if (transform == null) { SceneExplorerCommon.OnSceneTreeMessage(refChain, "null"); return; } var position = transform.position; OnSceneTreeReflectUnityEngineVector3(refChain.Add("position"), "position", ref position); transform.position = position; var localPosition = transform.localPosition; OnSceneTreeReflectUnityEngineVector3(refChain.Add("localPosition"), "localPosition", ref localPosition); transform.localPosition = localPosition; var localEulerAngles = transform.localEulerAngles; OnSceneTreeReflectUnityEngineVector3(refChain.Add("localEulerAngles"), "localEulerAngles", ref localEulerAngles); transform.localEulerAngles = localEulerAngles; var rotation = transform.rotation; OnSceneTreeReflectUnityEngineQuaternion(refChain.Add("rotation"), "rotation", ref rotation); transform.rotation = rotation; var localRotation = transform.localRotation; OnSceneTreeReflectUnityEngineQuaternion(refChain.Add("localRotation"), "localRotation", ref localRotation); transform.localRotation = localRotation; var localScale = transform.localScale; OnSceneTreeReflectUnityEngineVector3(refChain.Add("localScale"), "localScale", ref localScale); transform.localScale = localScale; }
public static void OnSceneReflectUnityEngineMaterial(SceneExplorerState state, ReferenceChain refChain, Material material) { if (!SceneExplorerCommon.SceneTreeCheckDepth(refChain)) { return; } if (material == null) { SceneExplorerCommon.OnSceneTreeMessage(refChain, "null"); return; } ReferenceChain oldRefChain = refChain; foreach (var prop in textureProps) { if (!material.HasProperty(prop)) { continue; } var value = material.GetTexture(prop); if (value == null) { continue; } refChain = oldRefChain.Add(prop); var type = value.GetType(); GUILayout.BeginHorizontal(); GUILayout.Space(ModTools.Instance.config.sceneExplorerTreeIdentSpacing * (refChain.Ident + 1)); GUIExpander.ExpanderControls(state, refChain, type); GUI.contentColor = ModTools.Instance.config.typeColor; GUILayout.Label(type.ToString() + " "); GUI.contentColor = ModTools.Instance.config.nameColor; GUILayout.Label(prop); GUI.contentColor = Color.white; GUILayout.Label(" = "); GUI.contentColor = ModTools.Instance.config.valueColor; GUILayout.Label(value.ToString()); GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); GUIButtons.SetupButtons(type, value, refChain); object paste; var doPaste = GUIButtons.SetupPasteButon(type, out paste); GUILayout.EndHorizontal(); if (!TypeUtil.IsSpecialType(type) && state.expandedObjects.ContainsKey(refChain)) { GUIReflect.OnSceneTreeReflect(state, refChain, value); } if (doPaste) { material.SetTexture(prop, (Texture)paste); } } foreach (string prop in colorProps) { if (!material.HasProperty(prop)) { continue; } Color value = material.GetColor(prop); refChain = oldRefChain.Add(prop); var type = value.GetType(); GUILayout.BeginHorizontal(); GUILayout.Space(ModTools.Instance.config.sceneExplorerTreeIdentSpacing * (refChain.Ident + 1)); GUIExpander.ExpanderControls(state, refChain, type); GUI.contentColor = ModTools.Instance.config.typeColor; GUILayout.Label(type.ToString() + " "); GUI.contentColor = ModTools.Instance.config.nameColor; GUILayout.Label(prop); GUI.contentColor = Color.white; GUILayout.Label(" = "); var f = value; GUI.contentColor = ModTools.Instance.config.valueColor; var propertyCopy = prop; GUIControls.ColorField(refChain.ToString(), "", ref f, 0.0f, null, true, true, color => { material.SetColor(propertyCopy, color); }); if (f != value) { material.SetColor(prop, f); } GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); GUIButtons.SetupButtons(type, value, refChain); object paste; var doPaste = GUIButtons.SetupPasteButon(type, out paste); GUILayout.EndHorizontal(); if (!TypeUtil.IsSpecialType(type) && state.expandedObjects.ContainsKey(refChain)) { GUIReflect.OnSceneTreeReflect(state, refChain, value); } if (doPaste) { material.SetColor(prop, (Color)paste); } } GUIReflect.OnSceneTreeReflect(state, refChain, material, true); }
public static void OnSceneTreeReflect(SceneExplorerState state, ReferenceChain refChain, System.Object obj, bool rawReflection = false) { if (!SceneExplorerCommon.SceneTreeCheckDepth(refChain)) { return; } if (obj == null) { SceneExplorerCommon.OnSceneTreeMessage(refChain, "null"); return; } Type type = obj.GetType(); if (!rawReflection) { if (state.preventCircularReferences.ContainsKey(obj.GetHashCode())) { SceneExplorerCommon.OnSceneTreeMessage(refChain, "Circular reference detected"); return; } state.preventCircularReferences.Add(obj.GetHashCode(), true); if (type == typeof(UnityEngine.Transform)) { GUITransform.OnSceneTreeReflectUnityEngineTransform(refChain, (UnityEngine.Transform)obj); return; } if (TypeUtil.IsList(obj)) { GUIList.OnSceneTreeReflectIList(state, refChain, obj); return; } if (TypeUtil.IsCollection(obj)) { GUICollection.OnSceneTreeReflectICollection(state, refChain, obj); return; } if (TypeUtil.IsEnumerable(obj)) { GUIEnumerable.OnSceneTreeReflectIEnumerable(state, refChain, obj); return; } if (type == typeof(Material)) { GUIMaterial.OnSceneReflectUnityEngineMaterial(state, refChain, (UnityEngine.Material)obj); return; } if (type == typeof(Mesh)) { if (!((Mesh)obj).isReadable) { SceneExplorerCommon.OnSceneTreeMessage(refChain, "Mesh is not readable"); return; } } } var members = TypeUtil.GetAllMembers(type, ModTools.Instance.config.sceneExplorerShowInheritedMembers); if (ModTools.Instance.config.sceneExplorerSortAlphabetically) { Array.Sort(members, (info, info1) => string.Compare(info.Name, info1.Name, StringComparison.Ordinal)); } foreach (MemberInfo member in members) { if (member.MemberType == MemberTypes.Field && ModTools.Instance.config.sceneExplorerShowFields) { var field = (FieldInfo)member; try { GUIField.OnSceneTreeReflectField(state, refChain.Add(field), obj, field); } catch (Exception ex) { SceneExplorerCommon.OnSceneTreeMessage(refChain, $"Exception when fetching field \"{field.Name}\" - {ex.Message}\n{ex.StackTrace}"); } } else if (member.MemberType == MemberTypes.Property && ModTools.Instance.config.sceneExplorerShowProperties) { var property = (PropertyInfo)member; try { GUIProperty.OnSceneTreeReflectProperty(state, refChain.Add(property), obj, property); } catch (Exception ex) { SceneExplorerCommon.OnSceneTreeMessage(refChain, $"Exception when fetching property \"{property.Name}\" - {ex.Message}\n{ex.StackTrace}"); } } else if (member.MemberType == MemberTypes.Method && ModTools.Instance.config.sceneExplorerShowMethods) { var method = (MethodInfo)member; try { GUIMethod.OnSceneTreeReflectMethod(refChain.Add(method), obj, method); } catch (Exception ex) { SceneExplorerCommon.OnSceneTreeMessage(refChain, $"Exception when fetching method \"{method.Name}\" - {ex.Message}"); } } } }
public static void OnSceneTreeReflect(SceneExplorerState state, ReferenceChain refChain, object obj, bool rawReflection, TypeUtil.SmartType smartType = TypeUtil.SmartType.Undefined, string filter = "") { if (!SceneExplorerCommon.SceneTreeCheckDepth(refChain)) { return; } if (obj == null) { SceneExplorerCommon.OnSceneTreeMessage(refChain, "null"); return; } var type = obj.GetType(); if (!rawReflection) { if (!type.IsValueType && state.PreventCircularReferences.Contains(obj)) { try { GUI.contentColor = Color.yellow; SceneExplorerCommon.OnSceneTreeMessage(refChain, "Circular reference detected"); } finally { GUI.contentColor = Color.white; } return; } state.PreventCircularReferences.Add(obj); if (type == typeof(Transform)) { GUITransform.OnSceneTreeReflectUnityEngineTransform(refChain, (Transform)obj); return; } if (TypeUtil.IsList(obj)) { GUIList.OnSceneTreeReflectIList(state, refChain, obj, smartType); return; } if (TypeUtil.IsCollection(obj)) { GUICollection.OnSceneTreeReflectICollection(state, refChain, obj, smartType); return; } if (TypeUtil.IsEnumerable(obj)) { GUIEnumerable.OnSceneTreeReflectIEnumerable(state, refChain, obj, smartType); return; } if (type == typeof(Material)) { GUIMaterial.OnSceneReflectUnityEngineMaterial(state, refChain, (Material)obj); return; } if (type == typeof(Mesh) && !((Mesh)obj).isReadable) { SceneExplorerCommon.OnSceneTreeMessage(refChain, "Mesh is not readable"); return; } } var members = TypeUtil.GetAllMembers(type, MainWindow.Instance.Config.ShowInheritedMembers); if (MainWindow.Instance.Config.SortItemsAlphabetically) { Array.Sort(members, (x, y) => string.CompareOrdinal(x.ReflectionInfo.Name, y.ReflectionInfo.Name)); } var matchingMembers = 0; foreach (var member in members) { var filterMatchFrom = -1; if (!filter.IsNullOrEmpty() && (filterMatchFrom = member.ReflectionInfo.Name.IndexOf(filter, StringComparison.OrdinalIgnoreCase)) < 0) { continue; } matchingMembers++; switch (member.ReflectionInfo.MemberType) { case MemberTypes.Field when MainWindow.Instance.Config.ShowFields: { var field = (FieldInfo)member.ReflectionInfo; if (field.IsLiteral && !field.IsInitOnly && !MainWindow.Instance.Config.ShowConsts) { continue; } try { GUIField.OnSceneTreeReflectField(state, refChain.Add(field), obj, field, TypeUtil.OverrideSmartType(member.DetectedType, field.Name, obj), filterMatchFrom, filter.Length); } catch (Exception ex) { SceneExplorerCommon.OnSceneTreeMessage(refChain, $"Exception when fetching field \"{field.Name}\" - {ex.Message}\n{ex.StackTrace}"); } break; } case MemberTypes.Property when MainWindow.Instance.Config.ShowProperties: { var property = (PropertyInfo)member.ReflectionInfo; if (property.GetIndexParameters().Length > 0) { continue; // TODO: add support for indexers } try { GUIProperty.OnSceneTreeReflectProperty(state, refChain.Add(property), obj, property, TypeUtil.OverrideSmartType(member.DetectedType, property.Name, obj), filterMatchFrom, filter.Length); } catch (Exception ex) { SceneExplorerCommon.OnSceneTreeMessage(refChain, $"Exception when fetching property \"{property.Name}\" - {ex.Message}\n{ex.StackTrace}"); } break; } case MemberTypes.Method when MainWindow.Instance.Config.ShowMethods: { var method = (MethodInfo)member.ReflectionInfo; try { GUIMethod.OnSceneTreeReflectMethod(refChain.Add(method), obj, method, filterMatchFrom, filter.Length); } catch (Exception ex) { SceneExplorerCommon.OnSceneTreeMessage(refChain, $"Exception when fetching method \"{method.Name}\" - {ex.Message}"); } break; } } } if (filter.IsNullOrEmpty() || members.Length <= 0 || matchingMembers != 0) { return; } GUI.contentColor = Color.yellow; SceneExplorerCommon.OnSceneTreeMessage(refChain, "No members matching the search term found!"); GUI.contentColor = Color.white; }
public static void OnSceneTreeRecursive(GameObject modToolsGo, SceneExplorerState state, ReferenceChain refChain, GameObject obj) { #if !DEBUG if (obj == modToolsGo) { return; } #endif if (!SceneExplorerCommon.SceneTreeCheckDepth(refChain)) { return; } if (obj == null) { SceneExplorerCommon.OnSceneTreeMessage(refChain, "null"); return; } if (state.ExpandedGameObjects.Contains(refChain.UniqueId)) { try { GUILayout.BeginHorizontal(); SceneExplorerCommon.InsertIndent(refChain.Indentation); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { state.ExpandedGameObjects.Remove(refChain.UniqueId); } var currentlySelected = state.CurrentRefChain?.IsSameChain(refChain) == true; GUI.contentColor = currentlySelected ? MainWindow.Instance.Config.SelectedComponentColor : obj.activeInHierarchy ? MainWindow.Instance.Config.GameObjectColor : MainWindow.Instance.Config.DisabledComponentColor; GUILayout.Label(obj.name); GUI.contentColor = Color.white; if (currentlySelected) { if (GUILayout.Button("<", GUILayout.ExpandWidth(false))) { state.CurrentRefChain = null; } } else { if (GUILayout.Button(">", GUILayout.ExpandWidth(false))) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(refChain, false); } } GUILayout.EndHorizontal(); var gameObjects = new GameObject[obj.transform.childCount]; for (var i = 0; i < obj.transform.childCount; i++) { gameObjects[i] = obj.transform.GetChild(i).gameObject; } if (MainWindow.Instance.Config.SortItemsAlphabetically) { Array.Sort(gameObjects, (x, y) => string.CompareOrdinal(x?.name, y?.name)); } foreach (var gameObject in gameObjects) { OnSceneTreeRecursive(modToolsGo, state, refChain.Add(gameObject), gameObject); } var components = obj.GetComponents(typeof(Component)); if (MainWindow.Instance.Config.SortItemsAlphabetically) { Array.Sort(components, (x, y) => string.CompareOrdinal(x.GetType().ToString(), y.GetType().ToString())); } foreach (var component in components) { GUIComponent.OnSceneTreeComponent(state, refChain.Add(component), component); } } catch (Exception) { state.ExpandedGameObjects.Remove(refChain.UniqueId); throw; } } else { GUILayout.BeginHorizontal(); SceneExplorerCommon.InsertIndent(refChain.Indentation); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { state.ExpandedGameObjects.Add(refChain.UniqueId); } var currentlySelected = state.CurrentRefChain?.IsSameChain(refChain) == true; GUI.contentColor = currentlySelected ? MainWindow.Instance.Config.SelectedComponentColor : obj.activeInHierarchy ? MainWindow.Instance.Config.GameObjectColor : MainWindow.Instance.Config.DisabledComponentColor; GUILayout.Label(obj.name); GUI.contentColor = Color.white; GUILayout.EndHorizontal(); } }
public static void OnSceneReflectUnityEngineMaterial( SceneExplorerState state, ReferenceChain refChain, Material material) { Debug.Log($"OnSceneReflectUnityEngineMaterial(): " + System.Environment.StackTrace); if (!SceneExplorerCommon.SceneTreeCheckDepth(refChain)) { return; } if (material == null) { SceneExplorerCommon.OnSceneTreeMessage(refChain, "null"); return; } GUILayout.BeginHorizontal(); GUI.contentColor = Color.white; GUILayout.Label("Special Properties:"); GUILayout.EndHorizontal(); foreach (var prop in ShaderUtil.GetTextureProperties()) { if (!material.HasProperty(prop)) { continue; } var value = material.GetTexture(prop); if (value == null) { continue; } var newRefChain = refChain.Add(prop); var type = value.GetType(); GUILayout.BeginHorizontal(GUIWindow.HighlightStyle); SceneExplorerCommon.InsertIndent(newRefChain.Indentation + 1); GUIExpander.ExpanderControls(state, newRefChain, type); GUI.contentColor = MainWindow.Instance.Config.TypeColor; GUILayout.Label(type.ToString() + " "); GUI.contentColor = MainWindow.Instance.Config.NameColor; GUILayout.Label(prop); GUI.contentColor = Color.white; GUILayout.Label(" = "); GUI.contentColor = MainWindow.Instance.Config.ValueColor; GUILayout.Label(value.ToString()); GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); GUIButtons.SetupCommonButtons(newRefChain, value, valueIndex: 0); var doPaste = GUIButtons.SetupPasteButon(type, value, out var paste); if (value != null) { GUIButtons.SetupJumpButton(value, newRefChain); } GUILayout.EndHorizontal(); if (!TypeUtil.IsSpecialType(type) && state.ExpandedObjects.Contains(newRefChain.UniqueId)) { GUIReflect.OnSceneTreeReflect(state, newRefChain, value, false); } if (doPaste) { material.SetTexture(prop, (Texture)paste); } } foreach (var prop in ShaderUtil.GetColorProperties()) { if (!material.HasProperty(prop)) { continue; } var value = material.GetColor(prop); var newRefChain = refChain.Add(prop); var type = value.GetType(); GUILayout.BeginHorizontal(); SceneExplorerCommon.InsertIndent(newRefChain.Indentation + 1); GUIExpander.ExpanderControls(state, newRefChain, type); GUI.contentColor = MainWindow.Instance.Config.TypeColor; GUILayout.Label(type.ToString() + " "); GUI.contentColor = MainWindow.Instance.Config.NameColor; GUILayout.Label(prop); GUI.contentColor = Color.white; GUILayout.Label(" = "); GUI.contentColor = MainWindow.Instance.Config.ValueColor; var newColor = GUIControls.CustomValueField(newRefChain.UniqueId, string.Empty, GUIControls.PresentColor, value); if (newColor != value) { material.SetColor(prop, newColor); } GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); GUIButtons.SetupCommonButtons(newRefChain, value, valueIndex: 0); var doPaste = GUIButtons.SetupPasteButon(type, value, out var paste); GUIButtons.SetupJumpButton(value, newRefChain); GUILayout.EndHorizontal(); if (!TypeUtil.IsSpecialType(type) && state.ExpandedObjects.Contains(newRefChain.UniqueId)) { GUIReflect.OnSceneTreeReflect(state, newRefChain, value, false); } if (doPaste) { material.SetColor(prop, (Color)paste); } } foreach (var prop in ShaderUtil.GetFloatProperties()) { if (!material.HasProperty(prop)) { continue; } var value = material.GetFloat(prop); var newRefChain = refChain.Add(prop); var type = value.GetType(); GUILayout.BeginHorizontal(); SceneExplorerCommon.InsertIndent(newRefChain.Indentation + 1); GUIExpander.ExpanderControls(state, newRefChain, type); GUI.contentColor = MainWindow.Instance.Config.TypeColor; GUILayout.Label(type.ToString() + " "); GUI.contentColor = MainWindow.Instance.Config.NameColor; GUILayout.Label(prop); GUI.contentColor = Color.white; GUILayout.Label(" = "); GUI.contentColor = MainWindow.Instance.Config.ValueColor; var newValue = GUIControls.NumericValueField(newRefChain.UniqueId, string.Empty, value); if (newValue != value) { material.SetFloat(prop, newValue); } GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); GUIButtons.SetupCommonButtons(newRefChain, value, 0); var doPaste = GUIButtons.SetupPasteButon(type, value, out var paste); GUIButtons.SetupJumpButton(value, newRefChain); GUILayout.EndHorizontal(); if (!TypeUtil.IsSpecialType(type) && state.ExpandedObjects.Contains(newRefChain.UniqueId)) { GUIReflect.OnSceneTreeReflect(state, newRefChain, value, false); } if (doPaste) { material.SetColor(prop, (Color)paste); } } foreach (var prop in ShaderUtil.GetVectorProperties()) { if (!material.HasProperty(prop)) { continue; } var value = material.GetVector(prop); var newRefChain = refChain.Add(prop); var type = value.GetType(); GUILayout.BeginHorizontal(); SceneExplorerCommon.InsertIndent(newRefChain.Indentation + 1); GUIExpander.ExpanderControls(state, newRefChain, type); GUI.contentColor = MainWindow.Instance.Config.TypeColor; GUILayout.Label(type.ToString() + " "); GUI.contentColor = MainWindow.Instance.Config.NameColor; GUILayout.Label(prop); GUI.contentColor = Color.white; GUILayout.Label(" = "); GUI.contentColor = MainWindow.Instance.Config.ValueColor; var newValue = GUIControls.PresentVector4(newRefChain.UniqueId, value); if (newValue != value) { material.SetVector(prop, newValue); } GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); GUIButtons.SetupCommonButtons(newRefChain, value, valueIndex: 0); var doPaste = GUIButtons.SetupPasteButon(type, value, out var paste); GUIButtons.SetupJumpButton(value, newRefChain); GUILayout.EndHorizontal(); if (!TypeUtil.IsSpecialType(type) && state.ExpandedObjects.Contains(newRefChain.UniqueId)) { GUIReflect.OnSceneTreeReflect(state, newRefChain, value, false); } if (doPaste) { material.SetColor(prop, (Color)paste); } } var shaderKeywords = material.shaderKeywords; if (shaderKeywords != null && shaderKeywords.Length > 0) { var valueTyoe = shaderKeywords.GetType(); GUILayout.BeginHorizontal(); SceneExplorerCommon.InsertIndent(refChain.Indentation + 2); GUI.contentColor = MainWindow.Instance.Config.TypeColor; GUILayout.Label(valueTyoe.ToString() + " "); GUI.contentColor = MainWindow.Instance.Config.NameColor; GUILayout.Label("Shader keywords "); GUI.contentColor = Color.white; GUILayout.Label(" = "); GUI.contentColor = MainWindow.Instance.Config.ValueColor; GUILayout.Label(string.Join(", ", shaderKeywords)); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } GUIReflect.OnSceneTreeReflect(state, refChain, material, true); }
public static void OnSceneTreeRecursive(GameObject modToolsGo, SceneExplorerState state, ReferenceChain refChain, GameObject obj) { if (obj == modToolsGo && !ModTools.DEBUG_MODTOOLS) { return; } if (!SceneExplorerCommon.SceneTreeCheckDepth(refChain)) { return; } if (obj == null) { SceneExplorerCommon.OnSceneTreeMessage(refChain, "null"); return; } if (obj.name == "_ModToolsInternal" && !ModTools.DEBUG_MODTOOLS) { return; } if (state.expandedGameObjects.ContainsKey(refChain)) { try { GUILayout.BeginHorizontal(); GUILayout.Space(ModTools.Instance.config.sceneExplorerTreeIdentSpacing * refChain.Ident); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { state.expandedGameObjects.Remove(refChain); } GUI.contentColor = ModTools.Instance.config.gameObjectColor; GUILayout.Label(obj.name); GUI.contentColor = Color.white; GUILayout.EndHorizontal(); var components = obj.GetComponents(typeof(Component)); if (ModTools.Instance.config.sceneExplorerSortAlphabetically) { Array.Sort(components, (component, component1) => component.GetType().ToString().CompareTo(component1.GetType().ToString())); } foreach (var component in components) { GUIComponent.OnSceneTreeComponent(state, refChain.Add(component), component); } for (int i = 0; i < obj.transform.childCount; i++) { OnSceneTreeRecursive(modToolsGo, state, refChain.Add(obj.transform.GetChild(i)), obj.transform.GetChild(i).gameObject); } } catch (Exception) { state.expandedGameObjects.Remove(refChain); throw; } } else { GUILayout.BeginHorizontal(); GUILayout.Space(ModTools.Instance.config.sceneExplorerTreeIdentSpacing * refChain.Ident); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { state.expandedGameObjects.Add(refChain, true); } GUI.contentColor = ModTools.Instance.config.gameObjectColor; GUILayout.Label(obj.name); GUI.contentColor = Color.white; GUILayout.EndHorizontal(); } }
public static void OnSceneReflectUnityEngineMaterial(SceneExplorerState state, ReferenceChain refChain, Material material) { if (!SceneExplorerCommon.SceneTreeCheckDepth(refChain)) { return; } if (material == null) { SceneExplorerCommon.OnSceneTreeMessage(refChain, "null"); return; } ReferenceChain oldRefChain = refChain; foreach (var prop in textureProps) { if (!material.HasProperty(prop)) { continue; } var value = material.GetTexture(prop); if (value == null) { continue; } refChain = oldRefChain.Add(prop); var type = value.GetType(); GUILayout.BeginHorizontal(); GUILayout.Space(ModTools.Instance.config.sceneExplorerTreeIdentSpacing * (refChain.Ident + 1)); GUIExpander.ExpanderControls(state, refChain, type); GUI.contentColor = ModTools.Instance.config.typeColor; GUILayout.Label(type.ToString() + " "); GUI.contentColor = ModTools.Instance.config.nameColor; GUILayout.Label(prop); GUI.contentColor = Color.white; GUILayout.Label(" = "); GUI.contentColor = ModTools.Instance.config.valueColor; GUILayout.Label(value.ToString()); GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); GUIButtons.SetupButtons(type, value, refChain); object paste; var doPaste = GUIButtons.SetupPasteButon(type, out paste); GUILayout.EndHorizontal(); if (!TypeUtil.IsSpecialType(type) && state.expandedObjects.ContainsKey(refChain)) { GUIReflect.OnSceneTreeReflect(state, refChain, value); } if (doPaste) { material.SetTexture(prop, (Texture)paste); } } foreach (string prop in colorProps) { if (!material.HasProperty(prop)) { continue; } Color value = material.GetColor(prop); refChain = oldRefChain.Add(prop); var type = value.GetType(); GUILayout.BeginHorizontal(); GUILayout.Space(ModTools.Instance.config.sceneExplorerTreeIdentSpacing * (refChain.Ident + 1)); GUIExpander.ExpanderControls(state, refChain, type); GUI.contentColor = ModTools.Instance.config.typeColor; GUILayout.Label(type.ToString() + " "); GUI.contentColor = ModTools.Instance.config.nameColor; GUILayout.Label(prop); GUI.contentColor = Color.white; GUILayout.Label(" = "); var f = value; GUI.contentColor = ModTools.Instance.config.valueColor; var propertyCopy = prop; GUIControls.ColorField(refChain.ToString(), "", ref f, 0.0f, null, true, true, color => { material.SetColor(propertyCopy, color); }); if (f != value) { material.SetColor(prop, f); } GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); GUIButtons.SetupButtons(type, value, refChain); object paste; var doPaste = GUIButtons.SetupPasteButon(type, out paste); GUILayout.EndHorizontal(); if (!TypeUtil.IsSpecialType(type) && state.expandedObjects.ContainsKey(refChain)) { GUIReflect.OnSceneTreeReflect(state, refChain, value); } if (doPaste) { material.SetColor(prop, (Color)paste); } } // GUILayout.BeginHorizontal(); // GUILayout.Space(ModTools.Instance.config.sceneExplorerTreeIdentSpacing * (refChain.Ident + 1)); // GUI.contentColor = ModTools.Instance.config.typeColor; // // GUILayout.Label("Shader:"); // // GUI.contentColor = ModTools.Instance.config.nameColor; // // var shaders = Resources.FindObjectsOfTypeAll<Shader>(); // Array.Sort(shaders, (a, b) => string.Compare(a.name, b.name, StringComparison.Ordinal)); // var availableShaders = shaders.Select(s => s.name).ToArray(); // var currentShader = material.shader; // var selectedShader = Array.IndexOf(shaders, currentShader); // // var newSelectedShader = GUIComboBox.Box(selectedShader, availableShaders, "SceneExplorerShadersComboBox"); // if (newSelectedShader != selectedShader) // { // material.shader = shaders[newSelectedShader]; // } // GUILayout.FlexibleSpace(); // GUILayout.EndHorizontal(); GUIReflect.OnSceneTreeReflect(state, refChain, material, true); }