diff options
| author | yum <yum.food.vr@gmail.com> | 2025-02-01 19:15:58 -0800 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2025-02-01 19:15:58 -0800 |
| commit | fb26b02a20ef751cdd1832abc925b5e57bb2234b (patch) | |
| tree | 265f343a4b57e6345468ff5c37902fdd66a3764e /Editor | |
| parent | 4bd9c2ba494013f292ddc14d793bc2b362aff365 (diff) | |
Implement surface stable fractal dithering
Diffstat (limited to 'Editor')
| -rw-r--r-- | Editor/stack_2d_noise_to_3d.cs | 120 | ||||
| -rw-r--r-- | Editor/tooner.cs | 28 |
2 files changed, 148 insertions, 0 deletions
diff --git a/Editor/stack_2d_noise_to_3d.cs b/Editor/stack_2d_noise_to_3d.cs new file mode 100644 index 0000000..adc2773 --- /dev/null +++ b/Editor/stack_2d_noise_to_3d.cs @@ -0,0 +1,120 @@ +using UnityEngine;
+using UnityEditor;
+using System.Collections.Generic;
+
+public class ImageSequenceToTexture3D : EditorWindow
+{
+ private List<Texture2D> sourceImages = new List<Texture2D>();
+ private string textureName = "Texture3DFromSequence";
+ private FilterMode filterMode = FilterMode.Bilinear;
+ private TextureWrapMode wrapMode = TextureWrapMode.Repeat;
+
+ [MenuItem("Tools/yum_food/Image Sequence to Texture3D")]
+ public static void ShowWindow()
+ {
+ GetWindow<ImageSequenceToTexture3D>("Image Sequence to Texture3D");
+ }
+
+ private void OnGUI()
+ {
+ GUILayout.Label("Image Sequence to Texture3D Converter", EditorStyles.boldLabel);
+ EditorGUILayout.HelpBox("Add images in the order they should appear in the Z-axis", MessageType.Info);
+
+ // Image sequence management
+ EditorGUILayout.LabelField("Source Images", EditorStyles.boldLabel);
+ for (int i = 0; i < sourceImages.Count; i++)
+ {
+ EditorGUILayout.BeginHorizontal();
+ sourceImages[i] = (Texture2D)EditorGUILayout.ObjectField($"Slice {i}", sourceImages[i], typeof(Texture2D), false);
+ if (GUILayout.Button("Remove", GUILayout.Width(60)))
+ {
+ sourceImages.RemoveAt(i);
+ GUILayout.EndHorizontal();
+ break;
+ }
+ EditorGUILayout.EndHorizontal();
+ }
+
+ if (GUILayout.Button("Add Image Slot"))
+ {
+ sourceImages.Add(null);
+ }
+
+ textureName = EditorGUILayout.TextField("Texture Name", textureName);
+ filterMode = (FilterMode)EditorGUILayout.EnumPopup("Filter Mode", filterMode);
+ wrapMode = (TextureWrapMode)EditorGUILayout.EnumPopup("Wrap Mode", wrapMode);
+
+ if (GUILayout.Button("Generate 3D Texture"))
+ {
+ if (ValidateInputs())
+ {
+ Generate3DTexture();
+ }
+ }
+ }
+
+ private bool ValidateInputs()
+ {
+ if (sourceImages.Count == 0)
+ {
+ EditorUtility.DisplayDialog("Error", "Please add at least one image.", "OK");
+ return false;
+ }
+
+ if (sourceImages.Contains(null))
+ {
+ EditorUtility.DisplayDialog("Error", "Please assign all image slots.", "OK");
+ return false;
+ }
+
+ // Verify all images have the same dimensions
+ int width = sourceImages[0].width;
+ int height = sourceImages[0].height;
+
+ for (int i = 1; i < sourceImages.Count; i++)
+ {
+ if (sourceImages[i].width != width || sourceImages[i].height != height)
+ {
+ EditorUtility.DisplayDialog("Error",
+ $"All images must have the same dimensions. Expected {width}x{height}, but image {i} is {sourceImages[i].width}x{sourceImages[i].height}",
+ "OK");
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private void Generate3DTexture()
+ {
+ int width = sourceImages[0].width;
+ int height = sourceImages[0].height;
+ int depth = sourceImages.Count;
+
+ // Create the 3D texture
+ Texture3D texture3D = new Texture3D(width, height, depth, TextureFormat.RGBA32, false);
+ texture3D.filterMode = filterMode;
+ texture3D.wrapMode = wrapMode;
+
+ // Prepare the color array
+ Color[] colors = new Color[width * height * depth];
+
+ // Copy the pixel data from each source image
+ for (int z = 0; z < depth; z++)
+ {
+ Color[] imageColors = sourceImages[z].GetPixels();
+ System.Array.Copy(imageColors, 0, colors, z * width * height, width * height);
+ }
+
+ texture3D.SetPixels(colors);
+ texture3D.Apply();
+
+ // Save the texture asset
+ string path = $"Assets/{textureName}.asset";
+ AssetDatabase.CreateAsset(texture3D, path);
+ AssetDatabase.SaveAssets();
+ AssetDatabase.Refresh();
+
+ EditorUtility.DisplayDialog("Success", $"3D texture generated and saved at {path}", "OK");
+ }
+}
diff --git a/Editor/tooner.cs b/Editor/tooner.cs index fab06e0..c7d89d4 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -3236,6 +3236,33 @@ public class ToonerGUI : ShaderGUI { EditorGUI.indentLevel -= 1; } + void DoSurfaceStableFractalDithering() { + MaterialProperty bc; + + bc = FindProperty("_Surface_Stable_Fractal_Dithering_Enable_Static"); + bool enabled = (bc.floatValue != 0.0); + EditorGUI.BeginChangeCheck(); + enabled = Toggle("Stable fractal dithering", enabled); + EditorGUI.EndChangeCheck(); + bc.floatValue = enabled ? 1.0f : 0.0f; + SetKeyword("_SURFACE_STABLE_FRACTAL_DITHERING", enabled); + + if (!enabled) { + return; + } + + EditorGUI.indentLevel += 1; + + bc = FindProperty("_Surface_Stable_Fractal_Dithering_Noise"); + TexturePropertySingleLine(MakeLabel(bc, "Noise"), bc); + bc = FindProperty("_Surface_Stable_Fractal_Dithering_Scale"); + FloatProperty(bc, "Scale"); + bc = FindProperty("_Surface_Stable_Fractal_Dithering_Max_Fwidth"); + FloatProperty(bc, "Max fwidth"); + + EditorGUI.indentLevel -= 1; + } + void DoGimmicks() { show_ui.Add(AddCollapsibleMenu("Gimmicks", "_Gimmicks")); EditorGUI.indentLevel += 1; @@ -3269,6 +3296,7 @@ public class ToonerGUI : ShaderGUI { DoGeoScroll(); DoGimmickEpilepsyMode(); DoLens00(); + DoSurfaceStableFractalDithering(); EditorGUI.indentLevel -= 1; show_ui.RemoveAt(show_ui.Count - 1); |
