SubdivisionUtility.cs

Created Diff never expires
3 removals
76 lines
4 additions
77 lines
using System.Collections;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine;
using UnityEditor;
using UnityEditor;


namespace Torec
namespace Torec
{
{
public class SubdivisionUtility : EditorWindow
public class SubdivisionUtility : EditorWindow
{
{
public SubdivisionUtility() {
public SubdivisionUtility() {
titleContent.text = "Torec/Subdivision";
titleContent.text = "Torec/Subdivision";
}
}


Vector2 selectionScroll = Vector2.zero;
Vector2 selectionScroll = Vector2.zero;
int iterations = 1;
int iterations = 1;
CatmullClark.Options.BoundaryInterpolation boundaryInterpolation;
CatmullClark.Options.BoundaryInterpolation boundaryInterpolation;


void OnGUI() {
void OnGUI() {


EditorGUIUtility.labelWidth = 80;
EditorGUIUtility.labelWidth = 80;


Transform[] selection = Selection.transforms;
Transform[] selection = Selection.transforms;


// Selection
// Selection
EditorGUILayout.BeginHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Selection", GUILayout.Width(80));
EditorGUILayout.LabelField("Selection", GUILayout.Width(80));
selectionScroll = EditorGUILayout.BeginScrollView(selectionScroll);
selectionScroll = EditorGUILayout.BeginScrollView(selectionScroll);
foreach (Transform t in selection) {
foreach (Transform t in selection) {
EditorGUILayout.LabelField(t.name);
EditorGUILayout.LabelField(t.name);
}
}
EditorGUILayout.EndScrollView();
EditorGUILayout.EndScrollView();
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndHorizontal();


// Iterations
// Iterations
iterations = (int)EditorGUILayout.Slider("Iterations", iterations, 1, 5);
iterations = (int)EditorGUILayout.Slider("Iterations", iterations, 1, 5);


// Boundaries
// Boundaries
boundaryInterpolation = (CatmullClark.Options.BoundaryInterpolation)
boundaryInterpolation = (CatmullClark.Options.BoundaryInterpolation)
EditorGUILayout.EnumPopup("Boundaries", boundaryInterpolation);
EditorGUILayout.EnumPopup("Boundaries", boundaryInterpolation);


// Button
// Button
if (GUILayout.Button("Subdivide")) {
if (GUILayout.Button("Subdivide")) {
if (selection.Length == 0) throw new System.Exception("Nothing selected to subdivide");
if (selection.Length == 0) throw new System.Exception("Nothing selected to subdivide");
var options = new CatmullClark.Options {
var options = new CatmullClark.Options {
boundaryInterpolation = boundaryInterpolation,
boundaryInterpolation = boundaryInterpolation,
};
};
foreach (Transform t in selection) {
foreach (Transform t in selection) {
// Add Undo record
// Add Undo record
MeshFilter mf = CatmullClark.CheckMeshFilter(t.gameObject);
// メソッドの仕様変更に合わせて型を変える
Undo.RecordObject(mf, "Subdivide " + t.name);
Component c = CatmullClark.CheckMeshComponent(t.gameObject);
Undo.RecordObject(c, "Subdivide " + t.name);
// Subdivide
// Subdivide
CatmullClark.Subdivide(t.gameObject, iterations, options);
CatmullClark.Subdivide(t.gameObject, iterations, options);
}
}
if (selection.Length > 1) {
if (selection.Length > 1) {
Undo.SetCurrentGroupName(string.Format("Subdivide {0} objects", selection.Length));
Undo.SetCurrentGroupName(string.Format("Subdivide {0} objects", selection.Length));
}
}
}
}
}
}


void OnInspectorUpdate() {
void OnInspectorUpdate() {
// Permanently update list of selected objects
// Permanently update list of selected objects
// ~ 10 times per sec
// ~ 10 times per sec
Repaint();
Repaint();
}
}


[MenuItem("Torec/Subdivision")]
[MenuItem("Torec/Subdivision")]
static void ShowSubdivisionUtility() {
static void ShowSubdivisionUtility() {
if (window == null) {
if (window == null) {
window = ScriptableObject.CreateInstance<SubdivisionUtility>();
window = ScriptableObject.CreateInstance<SubdivisionUtility>();
}
}
window.ShowUtility();
window.ShowUtility();
}
}
static private SubdivisionUtility window = null;
static private SubdivisionUtility window = null;
}
}
}
}