Files
FlaxEngine/Source/Editor/Surface/SurfaceStyle.cs
2022-05-01 20:42:05 +02:00

239 lines
8.1 KiB
C#

// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved.
using System;
using FlaxEditor.Scripting;
using FlaxEngine;
namespace FlaxEditor.Surface
{
/// <summary>
/// Describes GUI style used by the surface.
/// </summary>
[HideInEditor]
public class SurfaceStyle
{
/// <summary>
/// Description with the colors used by the surface.
/// </summary>
public struct ColorsData
{
/// <summary>
/// The connecting nodes color.
/// </summary>
public Color Connecting;
/// <summary>
/// The connecting nodes color (for valid connection).
/// </summary>
public Color ConnectingValid;
/// <summary>
/// The connecting nodes color (for invalid connection).
/// </summary>
public Color ConnectingInvalid;
/// <summary>
/// The impulse boxes color.
/// </summary>
public Color Impulse;
/// <summary>
/// The boolean boxes color.
/// </summary>
public Color Bool;
/// <summary>
/// The integer boxes color.
/// </summary>
public Color Integer;
/// <summary>
/// The floating point boxes color.
/// </summary>
public Color Float;
/// <summary>
/// The vector boxes color.
/// </summary>
public Color Vector;
/// <summary>
/// The string boxes color.
/// </summary>
public Color String;
/// <summary>
/// The object boxes color.
/// </summary>
public Color Object;
/// <summary>
/// The rotation boxes color.
/// </summary>
public Color Rotation;
/// <summary>
/// The transform boxes color.
/// </summary>
public Color Transform;
/// <summary>
/// The enum boxes color.
/// </summary>
public Color Enum;
/// <summary>
/// The bounding box color.
/// </summary>
public Color Bounds;
/// <summary>
/// The structures color.
/// </summary>
public Color Structures;
/// <summary>
/// The default boxes color.
/// </summary>
public Color Default;
}
/// <summary>
/// Descriptions for icons used by the surface.
/// </summary>
public struct IconsData
{
/// <summary>
/// Icon for boxes without connections.
/// </summary>
public SpriteHandle BoxOpen;
/// <summary>
/// Icon for boxes with connections.
/// </summary>
public SpriteHandle BoxClose;
/// <summary>
/// Icon for impulse boxes without connections.
/// </summary>
public SpriteHandle ArrowOpen;
/// <summary>
/// Icon for impulse boxes with connections.
/// </summary>
public SpriteHandle ArrowClose;
}
/// <summary>
/// The colors.
/// </summary>
public ColorsData Colors;
/// <summary>
/// The icons.
/// </summary>
public IconsData Icons;
/// <summary>
/// The background image (tiled).
/// </summary>
public Texture Background;
/// <summary>
/// Gets the color for the connection.
/// </summary>
/// <param name="type">The connection type.</param>
/// <param name="hint">The connection hint.</param>
/// <param name="color">The color.</param>
public void GetConnectionColor(ScriptType type, ConnectionsHint hint, out Color color)
{
if (type == ScriptType.Null)
color = Colors.Default;
else if (type.IsPointer || type.IsReference)
{
// Find underlying type without `*` or `&`
var typeName = type.TypeName;
type = TypeUtils.GetType(typeName.Substring(0, typeName.Length - 1));
GetConnectionColor(type, hint, out color);
}
else if (type.IsArray)
GetConnectionColor(type.GetElementType(), hint, out color);
else if (type.Type == typeof(void))
color = Colors.Impulse;
else if (type.Type == typeof(bool))
color = Colors.Bool;
else if (type.Type == typeof(byte) || type.Type == typeof(sbyte) || type.Type == typeof(char) || type.Type == typeof(short) || type.Type == typeof(ushort) || type.Type == typeof(int) || type.Type == typeof(uint) || type.Type == typeof(long) || type.Type == typeof(ulong))
color = Colors.Integer;
else if (type.Type == typeof(float) || type.Type == typeof(double) || hint == ConnectionsHint.Scalar)
color = Colors.Float;
else if (type.Type == typeof(Vector2) || type.Type == typeof(Vector3) || type.Type == typeof(Vector4) || type.Type == typeof(Color))
color = Colors.Vector;
else if (type.Type == typeof(string))
color = Colors.String;
else if (type.Type == typeof(Quaternion))
color = Colors.Rotation;
else if (type.Type == typeof(Transform))
color = Colors.Transform;
else if (type.Type == typeof(BoundingBox) || type.Type == typeof(BoundingSphere) || type.Type == typeof(BoundingFrustum))
color = Colors.Bounds;
else if (type.IsEnum || hint == ConnectionsHint.Enum)
color = Colors.Enum;
else if (type.IsValueType)
color = Colors.Structures;
else if (ScriptType.FlaxObject.IsAssignableFrom(type) || type.IsInterface)
color = Colors.Object;
else if (hint == ConnectionsHint.Vector)
color = Colors.Vector;
else
color = Colors.Default;
}
/// <summary>
/// Function used to create style for the given surface type. Can be overriden to provide some customization via user plugin.
/// </summary>
public static Func<Editor, SurfaceStyle> CreateStyleHandler = CreateDefault;
/// <summary>
/// Creates the default style.
/// </summary>
/// <param name="editor">The editor.</param>
/// <returns>Created style.</returns>
public static SurfaceStyle CreateDefault(Editor editor)
{
return new SurfaceStyle
{
Colors =
{
// Connecting nodes
Connecting = Color.White,
ConnectingValid = new Color(11, 252, 11),
ConnectingInvalid = new Color(252, 12, 11),
// Boxes
Impulse = new Color(252, 255, 255),
Bool = new Color(237, 28, 36),
Integer = new Color(181, 230, 29),
Float = new Color(146, 208, 80),
Vector = new Color(255, 251, 1),
String = new Color(163, 73, 164),
Object = new Color(0, 162, 232),
Rotation = new Color(153, 217, 234),
Transform = new Color(255, 127, 39),
Enum = new Color(20, 151, 20),
Bounds = new Color(34, 117, 76),
Structures = new Color(228, 138, 185),
Default = new Color(200, 200, 200),
},
Icons =
{
BoxOpen = editor.Icons.VisjectBoxOpen32,
BoxClose = editor.Icons.VisjectBoxClosed32,
ArrowOpen = editor.Icons.VisjectArrowOpen32,
ArrowClose = editor.Icons.VisjectArrowClosed32,
},
Background = editor.UI.VisjectSurfaceBackground,
};
}
}
}