From d70588d555c6f867e4c70f5e0bc816c32e06479a Mon Sep 17 00:00:00 2001 From: "Alex Pooley (@zuedev)" Date: Fri, 12 Jun 2026 00:06:59 +0100 Subject: expose shader filter, fix culture bug + O(n^2) dedupe, add PingObject/SelectAll/match info --- .../dev.zue.vrcog/Editor/VRCog/PoiyomiFinder.cs | 56 ++++++++++++++++------ 1 file changed, 41 insertions(+), 15 deletions(-) (limited to 'Packages/dev.zue.vrcog') diff --git a/Packages/dev.zue.vrcog/Editor/VRCog/PoiyomiFinder.cs b/Packages/dev.zue.vrcog/Editor/VRCog/PoiyomiFinder.cs index 6a65445..198efe0 100644 --- a/Packages/dev.zue.vrcog/Editor/VRCog/PoiyomiFinder.cs +++ b/Packages/dev.zue.vrcog/Editor/VRCog/PoiyomiFinder.cs @@ -4,14 +4,24 @@ using UnityEngine; using UnityEditor; +using System; using System.Collections.Generic; +using System.Linq; public class PoiyomiFinder : EditorWindow { private GameObject targetObject; - private List results = new List(); + private string shaderFilter = "poiyomi"; + private List results = new List(); private Vector2 scrollPos; + struct MatchInfo + { + public GameObject gameObject; + public string matchedMaterial; + public string matchedShader; + } + [MenuItem("Tools/VRCog/Poiyomi Finder")] public static void ShowWindow() { @@ -20,11 +30,12 @@ public class PoiyomiFinder : EditorWindow private void OnGUI() { - GUILayout.Label("Search Hierarchy for Poiyomi Shaders", EditorStyles.boldLabel); - + GUILayout.Label("Search Hierarchy for Shaders", EditorStyles.boldLabel); + targetObject = (GameObject)EditorGUILayout.ObjectField("Target Root", targetObject, typeof(GameObject), true); + shaderFilter = EditorGUILayout.TextField("Shader Filter", shaderFilter); - if (GUILayout.Button("Find Poiyomi Materials")) + if (GUILayout.Button("Find Materials")) { FindMaterials(); } @@ -33,20 +44,31 @@ public class PoiyomiFinder : EditorWindow if (results.Count > 0) { + EditorGUILayout.BeginHorizontal(); GUILayout.Label($"Found {results.Count} objects:", EditorStyles.helpBox); + if (GUILayout.Button("Select All", GUILayout.Width(80))) + { + Selection.objects = results.Select(r => (Object)r.gameObject).ToArray(); + } + EditorGUILayout.EndHorizontal(); + scrollPos = EditorGUILayout.BeginScrollView(scrollPos); - - foreach (GameObject obj in results) + + foreach (MatchInfo info in results) { + EditorGUILayout.BeginVertical(EditorStyles.helpBox); EditorGUILayout.BeginHorizontal(); - EditorGUILayout.ObjectField(obj, typeof(GameObject), true); + EditorGUILayout.ObjectField(info.gameObject, typeof(GameObject), true); if (GUILayout.Button("Select", GUILayout.Width(60))) { - Selection.activeGameObject = obj; + Selection.activeGameObject = info.gameObject; + EditorGUIUtility.PingObject(info.gameObject); } EditorGUILayout.EndHorizontal(); + EditorGUILayout.LabelField($"mat: {info.matchedMaterial} ยท shader: {info.matchedShader}", EditorStyles.miniLabel); + EditorGUILayout.EndVertical(); } - + EditorGUILayout.EndScrollView(); } } @@ -56,7 +78,7 @@ public class PoiyomiFinder : EditorWindow results.Clear(); if (targetObject == null) return; - // Get all renderers in children + HashSet seen = new HashSet(); Renderer[] renderers = targetObject.GetComponentsInChildren(true); foreach (Renderer ren in renderers) @@ -65,14 +87,18 @@ public class PoiyomiFinder : EditorWindow { if (mat != null && mat.shader != null) { - // Check if the shader name contains "poiyomi" (case-insensitive) - if (mat.shader.name.ToLower().Contains("poiyomi")) + if (mat.shader.name.IndexOf(shaderFilter, StringComparison.OrdinalIgnoreCase) >= 0) { - if (!results.Contains(ren.gameObject)) + if (seen.Add(ren.gameObject)) { - results.Add(ren.gameObject); + results.Add(new MatchInfo + { + gameObject = ren.gameObject, + matchedMaterial = mat.name, + matchedShader = mat.shader.name + }); } - break; // Move to next renderer once found + break; } } } -- cgit v1.2.3