BITFALL/Assets/Plugins/FImpossible Creations/Plugins - Level Design/PGG/Editor/ShapeDesignerWindow.cs

401 lines
15 KiB
C#

using UnityEngine;
using UnityEditor;
using FIMSpace.FEditor;
using UnityEditor.Callbacks;
using FIMSpace.Generating.Checker;
namespace FIMSpace.Generating
{
public partial class ShapeDesignerWindow : EditorWindow
{
public static ShapeDesignerWindow Get;
GenerationShape tempPreset;
GenerationShape projectPreset;
GenerationShape selectedPreset;
SerializedObject so_preset;
Vector2 mainScroll = Vector2.zero;
bool repaint = true;
public int seed = 0;
public float PreviewSize = 1f;
bool drawGenPreviewSetts = true;
CheckerField checker;
#region Opening window
[MenuItem("Window/FImpossible Creations/Level Design/Legacy/Shape Designer (Will be removed in next versions)", false, 171)]
static void Init()
{
ShapeDesignerWindow window = (ShapeDesignerWindow)GetWindow(typeof(ShapeDesignerWindow));
window.titleContent = new GUIContent("Generation Shape", Resources.Load<Texture>("SPR_GenShape"));
window.Show();
if (window.tempPreset == null) window.tempPreset = CreateInstance<GenerationShape>();
Get = window;
}
[OnOpenAssetAttribute(1)]
public static bool OpenBuildPlanScriptableFile(int instanceID, int line)
{
Object obj = EditorUtility.InstanceIDToObject(instanceID);
if (obj as GenerationShape != null)
{
Init();
Get.projectPreset = obj as GenerationShape;
return true;
}
return false;
}
#endregion
void OnGUI()
{
if (Get == null) Init();
mainScroll = EditorGUILayout.BeginScrollView(mainScroll);
EditorGUILayout.HelpBox("NOT SUPPORTED BY 'Building Plan Generator' component! But you can use FacilityGenerator instead", MessageType.None);
EditorGUILayout.HelpBox("In future versions there will be much more options for shape generating", MessageType.None);
#region Preparations and headers
Color bgC = GUI.backgroundColor;
Get = this;
if (projectPreset == null) selectedPreset = tempPreset;
else selectedPreset = projectPreset;
if (selectedPreset != null) so_preset = new SerializedObject(selectedPreset);
GUILayout.Space(6);
EditorGUILayout.LabelField("Controll shape of target generated areas", FGUI_Resources.HeaderStyle);
GUILayout.Space(2);
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
EditorGUILayout.BeginHorizontal();
FGUI_Inspector.FoldHeaderStart(ref drawGenPreviewSetts, new GUIContent(" Preview Settings"), FGUI_Resources.FoldStyle, null);
#region Center camera buttons
// Center Button
SceneView view = SceneView.lastActiveSceneView;
if (view != null)
if (view.camera != null)
{
float referenceScale = 8f;
if (projectPreset != null) referenceScale = PreviewSize * 3f;
if (Vector3.Distance(view.camera.transform.position, new Vector3(0, referenceScale, -referenceScale)) > referenceScale)
{
GUILayout.FlexibleSpace();
if (GUILayout.Button(new GUIContent(" Center", EditorGUIUtility.IconContent("Camera Icon").image), FGUI_Resources.ButtonStyle, GUILayout.Height(19)))
{
FieldDesignWindow.FrameCenter(referenceScale);
}
}
float angleDiff = Quaternion.Angle(view.camera.transform.rotation, Quaternion.identity);
if (angleDiff > 125)
{
if (GUILayout.Button(new GUIContent(EditorGUIUtility.IconContent("RotateTool").image), FGUI_Resources.ButtonStyle, GUILayout.Width(22), GUILayout.Height(19)))
{
FieldDesignWindow.FrameCenter(referenceScale, true);
}
}
}
#endregion
EditorGUILayout.EndHorizontal();
EditorGUI.BeginChangeCheck();
if (drawGenPreviewSetts)
{
GUILayout.Space(3);
PreviewSize = EditorGUILayout.FloatField("Preview Scale", PreviewSize);
GUILayout.Space(5);
}
if (EditorGUI.EndChangeCheck()) repaint = true;
EditorGUILayout.EndVertical();
#endregion
GUILayout.Space(5);
EditorGUILayout.BeginHorizontal();
EditorGUIUtility.labelWidth = 60;
projectPreset = (GenerationShape)EditorGUILayout.ObjectField("Preset:", projectPreset, typeof(GenerationShape), false);
if (projectPreset == null)
{
if (GUILayout.Button("Export Current", GUILayout.Width(94))) projectPreset = (GenerationShape)FGenerators.GenerateScriptable(Instantiate(selectedPreset), "Shape_");
}
else
if (GUILayout.Button("Export Copy", GUILayout.Width(94))) projectPreset = (GenerationShape)FGenerators.GenerateScriptable(Instantiate(selectedPreset), projectPreset.name);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
seed = EditorGUILayout.IntField("Seed: ", seed);
if (seed == 0) EditorGUILayout.LabelField("(Random)", EditorStyles.centeredGreyMiniLabel, GUILayout.Width(50));
EditorGUILayout.EndHorizontal();
EditorGUIUtility.labelWidth = 0;
EditorGUI.BeginChangeCheck();
#region Drawing preset inspector
GUILayout.Space(9);
so_preset.Update();
SerializedProperty sp_setup = so_preset.FindProperty("Setup");
if (sp_setup != null)
{
#region Drawing Inspector GUI for Generation Mode
var s = selectedPreset.Setup;
EditorGUILayout.BeginVertical(FGUI_Resources.BGInBoxStyle);
SerializedProperty sp_i = sp_setup.Copy();
sp_i.Next(true);
EditorGUILayout.PropertyField(sp_i);
if (selectedPreset.Setup.GenerationMode == GenerationShape.EGenerationMode.StaticSizeRectangle)
{
SerializedProperty sp = sp_setup.FindPropertyRelative("RectSetup");
if (s.RectSetup.Width.IsZero) { s.RectSetup.Width = new MinMax(5, 5); s.RectSetup.Height = new MinMax(3, 3); s.RectSetup.StartPos = new Vector2Int(0, 0); }
selectedPreset.Setup.RectSetup.Width.Min = EditorGUILayout.IntField("Width:", selectedPreset.Setup.RectSetup.Width.Min);
if (selectedPreset.Setup.RectSetup.Width.Min < 1) selectedPreset.Setup.RectSetup.Width.Min = 1;
selectedPreset.Setup.RectSetup.Height.Min = EditorGUILayout.IntField("Height:", selectedPreset.Setup.RectSetup.Height.Min);
if (selectedPreset.Setup.RectSetup.Height.Min < 1) selectedPreset.Setup.RectSetup.Height.Min = 1;
}
if (selectedPreset.Setup.GenerationMode == GenerationShape.EGenerationMode.RandomRectangle)
{
if (s.RectSetup.Width.IsZero) { s.RectSetup.Width = new MinMax(4, 5); s.RectSetup.Height = new MinMax(2, 3); s.RectSetup.StartPos = new Vector2Int(0, 0); }
SerializedProperty sp = sp_setup.FindPropertyRelative("RectSetup");
sp.Next(true);
sp.NextVisible(false); EditorGUILayout.PropertyField(sp);
sp.NextVisible(false); EditorGUILayout.PropertyField(sp);
}
#region Backup
//else if (selectedPreset.Setup.GenerationMode == GenerationShape.EGenerationMode.MultipleRectangles)
//{
// for (int i = 0; i < s.Rects.Count; i++)
// {
// var r = s.Rects[i];
// if (r.Width.IsZero)
// {
// r.Width = new MinMax(4, 5);
// r.Height = new MinMax(2, 3);
// r.StartPos = new Vector2Int(0, 0);
// s.Rects[i] = r;
// }
// }
// SerializedProperty sp = sp_setup.FindPropertyRelative("Rects");
// EditorGUILayout.PropertyField(sp);
//}
#endregion
else if (selectedPreset.Setup.GenerationMode == GenerationShape.EGenerationMode.RandomTunnels)
{
SerializedProperty sp = sp_setup.FindPropertyRelative("BranchLength");
EditorGUILayout.PropertyField(sp);
sp.NextVisible(false); EditorGUILayout.PropertyField(sp);
sp.NextVisible(false); EditorGUILayout.PropertyField(sp);
}
EditorGUILayout.EndVertical();
#endregion
}
else
{
EditorGUILayout.HelpBox("No Preset!", MessageType.Warning);
}
GUILayout.Space(9);
#endregion
if (EditorGUI.EndChangeCheck()) repaint = true;
if (selectedPreset.Setup.GenerationMode == GenerationShape.EGenerationMode.ManualRectangles)
{
DrawManualRectanglesGUI();
if ( selectedPreset.Setup.CellSets.Count > 1)
{
EditorGUILayout.HelpBox("Generators will randomly choose one of prepared shapes with random seed", MessageType.None);
}
}
GUILayout.Space(3);
if (GUILayout.Button("Generate Preview"))
{
repaint = true;
}
GUILayout.Space(3);
EditorGUILayout.EndScrollView();
#region Ending, applying and restoring
if (so_preset != null) so_preset.ApplyModifiedProperties();
if (FGenerators.CheckIfIsNull(checker)) repaint = true;
if (selectedPreset != null)
if (selectedPreset.Setup != null)
if (repaint)
{
if (selectedPreset.Setup.GenerationMode == GenerationShape.EGenerationMode.ManualRectangles)
{
if (selectedPreset.Setup != null)
{
if (selectedManualShape >= selectedPreset.Setup.CellSets.Count) selectedManualShape = 0;
checker = selectedPreset.Setup.CellSets[selectedManualShape].GetChecker();
}
}
else
checker = selectedPreset.GetChecker(null);
checker.UseBounds = false;
SceneView.RepaintAll();
repaint = false;
}
#endregion
}
#region Base preparation for Scene GUI Draw
public Matrix4x4 gridMatrix = Matrix4x4.identity;
void OnSceneGUI(SceneView sceneView)
{
//if (SceneView.currentDrawingSceneView == null) return;
//if (SceneView.currentDrawingSceneView.camera == null) return;
//Handles.SetCamera(SceneView.currentDrawingSceneView.camera);
//Handles.BeginGUI();
//DrawGuidesGUI();
//DrawShape();
//Handles.EndGUI();
//Handles.BeginGUI();
//Handles.SetCamera(SceneView.currentDrawingSceneView.camera);
//Handles.matrix = gridMatrix;
//if (grid != null) DrawHandles(SceneView.currentDrawingSceneView.camera);
//Handles.matrix = Matrix4x4.identity;
//Handles.EndGUI();
}
void OnFocus()
{
//#if UNITY_2019_1_OR_NEWER
// SceneView.duringSceneGui -= this.OnSceneGUI;
// SceneView.duringSceneGui += this.OnSceneGUI;
//#else
// SceneView.onSceneGUIDelegate -= this.OnSceneGUI;
// SceneView.onSceneGUIDelegate += this.OnSceneGUI;
//#endif
FGeneratorsGizmosDrawer.AddEvent(OnDrawGizmos);
}
void OnDestroy()
{
//#if UNITY_2019_1_OR_NEWER
// SceneView.duringSceneGui -= this.OnSceneGUI;
//#else
// SceneView.onSceneGUIDelegate -= this.OnSceneGUI;
//#endif
if (FGeneratorsGizmosDrawer.Instance)
{
FGenerators.DestroyObject(FGeneratorsGizmosDrawer.Instance.gameObject);
}
}
#endregion
void OnDrawGizmos()
{
DrawGuidesGUI();
DrawShape();
}
void DrawGuidesGUI()
{
Color prehC = Handles.color;
Vector3 cellSize = Vector3.one * PreviewSize;
int pSz = Mathf.RoundToInt(PreviewSize);
// Draw grid helper axis
Vector3Int min = new Vector3Int(-pSz, 0, 0);
if (FGenerators.CheckIfExist_NOTNULL(checker))
{
min = new Vector3Int(checker.GetBoundsMin().x * pSz, 0, checker.GetBoundsMin().y * pSz);
}
Handles.color = new Color(0f, 0f, 1f, 0.5f);
Vector3 leftSide = new Vector3((min.x - 0.5f) * (cellSize.x), 0, (min.z + 0.25f) * (cellSize.z));
leftSide += cellSize.x * Vector3.left * 0.3f;
Handles.Label(leftSide + cellSize.x * Vector3.left * 0.3f + Vector3.back * cellSize.x * 0.2f, new GUIContent("Forward"), EditorStyles.centeredGreyMiniLabel);
FEditor.FGUI_Handles.DrawArrow(leftSide, Quaternion.identity, cellSize.x * 0.5f);
Handles.color = new Color(1f, .4f, .4f, 0.5f);
Vector3 rightSide = new Vector3((min.x + 0.25f) * (cellSize.x), 0, (min.z - 0.5f) * (cellSize.z));
rightSide += cellSize.z * Vector3.back * 0.3f;
Handles.Label(rightSide + cellSize.z * Vector3.back * 0.3f, new GUIContent("Right"), EditorStyles.centeredGreyMiniLabel);
FEditor.FGUI_Handles.DrawArrow(rightSide, Quaternion.Euler(0, 90, 0), cellSize.x * 0.5f);
Handles.color = prehC;
}
void DrawShape()
{
if (FGenerators.CheckIfIsNull(checker)) return;
Color preC = Gizmos.color;
Gizmos.color = new Color(1f, 1f, 1f, 0.5f);
checker.DrawGizmos(PreviewSize * 1f, false, 0.9f);
Gizmos.color = preC;
}
}
}