Files
Cielonos/Assets/Plugins/AllIn13DShader/Editor/Drawers/NormalMapCreatorDrawer.cs
SoulliesOfficial d94241f36c 场景设计
2026-01-12 03:22:16 -05:00

138 lines
3.9 KiB
C#

using System;
using UnityEditor;
using UnityEngine;
namespace AllIn13DShader
{
public class NormalMapCreatorDrawer
{
private NormalMapCreatorTool normalMapCreatorTool;
private CommonStyles commonStyles;
private Action repaintAction;
private Texture2D TargetNormalImage
{
get
{
return normalMapCreatorTool.targetNormalImage;
}
set
{
normalMapCreatorTool.targetNormalImage = value;
}
}
private float NormalStrength
{
get
{
return normalMapCreatorTool.normalStrength;
}
set
{
normalMapCreatorTool.normalStrength = value;
}
}
private int NormalSmoothing
{
get
{
return normalMapCreatorTool.normalSmoothing;
}
set
{
normalMapCreatorTool.normalSmoothing = value;
}
}
private bool InvertNormals{ get; set; }
private int IsComputingNormals
{
get
{
return normalMapCreatorTool.isComputingNormals;
}
set
{
normalMapCreatorTool.isComputingNormals = value;
}
}
public NormalMapCreatorDrawer(NormalMapCreatorTool normalMapCreatorTool, CommonStyles commonStyles, Action repaintAction)
{
this.normalMapCreatorTool = normalMapCreatorTool;
this.commonStyles = commonStyles;
this.repaintAction = repaintAction;
}
public void Draw()
{
GUILayout.Label("Normal/Distortion Map Creator", commonStyles.bigLabel);
GUILayout.Space(20);
GUILayout.Label("Select the folder where new Normal Maps will be saved when the Create Normal Map button of the asset component is pressed", EditorStyles.boldLabel);
GlobalConfiguration.instance.NormalMapSavePath = EditorUtils.DrawSelectorFolder(GlobalConfiguration.instance.NormalMapSavePath, /*AllIn13DShaderConfig.NORMAL_MAP_SAVE_PATH_DEFAULT,*/ "Normal Maps Folder");
GUILayout.Label("Assign a texture you want to create a normal map from. Choose the normal map settings and press the 'Create And Save Normal Map' button", EditorStyles.boldLabel);
TargetNormalImage = (Texture2D)EditorGUILayout.ObjectField("Target Image", TargetNormalImage, typeof(Texture2D), false, GUILayout.MaxWidth(225));
EditorGUILayout.BeginHorizontal();
{
GUILayout.Label("Normal Strength:", GUILayout.MaxWidth(150));
NormalStrength = EditorGUILayout.Slider(NormalStrength, 1f, 20f, GUILayout.MaxWidth(400));
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
{
GUILayout.Label("Normal Smoothing:", GUILayout.MaxWidth(150));
NormalSmoothing = EditorGUILayout.IntSlider(NormalSmoothing, 0, 3, GUILayout.MaxWidth(400));
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
{
GUILayout.Label("Invert Normal Direction:", GUILayout.MaxWidth(150));
InvertNormals = EditorGUILayout.Toggle(InvertNormals, GUILayout.MaxWidth(400));
}
EditorGUILayout.EndHorizontal();
if (IsComputingNormals == 0)
{
if (TargetNormalImage != null)
{
if (GUILayout.Button("Create And Save Normal Map", GUILayout.MaxWidth(CommonStyles.BUTTON_WIDTH)))
{
IsComputingNormals = 1;
return;
}
}
else
{
GUILayout.Label("Add a Target Image to use this feature", EditorStyles.boldLabel);
}
}
else
{
GUILayout.Label("Normal Map is currently being created, be patient", EditorStyles.boldLabel, GUILayout.Height(40));
repaintAction();
IsComputingNormals++;
if(IsComputingNormals > 5)
{
EditorUtils.SetTextureReadWrite(AssetDatabase.GetAssetPath(TargetNormalImage), true);
Texture2D normalMapToSave = normalMapCreatorTool.CreateNormalMap(InvertNormals);
EditorUtils.SaveTextureAsPNG(GlobalConfiguration.instance.NormalMapSavePath, "NormalMap", "Normal Map", normalMapToSave, FilterMode.Bilinear, TextureImporterType.NormalMap, TextureWrapMode.Repeat);
IsComputingNormals = 0;
}
}
GUILayout.Label("*This process will freeze the editor for some seconds, larger images will take longer", EditorStyles.boldLabel);
}
}
}