BITFALL/Assets/GSpawn - Level Designer/Scripts/Level Design/Object Spawn/ScatterBrushObjectSpawnSett...

122 lines
7.3 KiB
C#

#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;
using System;
namespace GSpawn
{
public enum ScatterBrushOverlapPrecision
{
BoundsVSBounds = 0,
BoundsVSGeometry
}
[Flags]
public enum ScatterBrushObjectSpawnSurfaceTypes
{
None = 0,
Grid = 1,
Meshes = 2,
Terrains = 4,
All = ~0
}
public class ScatterBrushObjectSpawnSettings : PluginSettings<ScatterBrushObjectSpawnSettings>
{
[SerializeField]
private float _brushRadius = defaultBrushRadius;
[SerializeField]
private int _maxNumObjects = defaultMaxNumObjects;
[SerializeField]
private float _minDragDistance = defaultMinDragDistance;
[SerializeField]
private ScatterBrushObjectSpawnSurfaceTypes _surfaceTypes = defaultSurfaceTypes;
[SerializeField]
private int _surfaceLayers = defaultSurfaceLayers;
[SerializeField]
private string _scatterBrushPrefabProfileName = defaultScatterBrushPrefabProfileName;
[SerializeField]
private ScatterBrushOverlapPrecision _overlapTestPrecision = defaultOverlapTestPrecision;
public float brushRadius { get { return _brushRadius; } set { UndoEx.record(this); _brushRadius = Mathf.Max(0.1f, value); EditorUtility.SetDirty(this); } }
public int maxNumObjects { get { return _maxNumObjects; } set { UndoEx.record(this); _maxNumObjects = Math.Max(1, value); EditorUtility.SetDirty(this); } }
public float minDragDistance { get { return _minDragDistance; } set { UndoEx.record(this); _minDragDistance = Mathf.Max(1e-4f, value); EditorUtility.SetDirty(this); } }
public ScatterBrushObjectSpawnSurfaceTypes surfaceTypes { get { return _surfaceTypes; } set { UndoEx.record(this); _surfaceTypes = value; EditorUtility.SetDirty(this); } }
public bool allowsGridSurface { get { return (surfaceTypes & ScatterBrushObjectSpawnSurfaceTypes.Grid) != 0; } }
public bool allowsMeshSurface { get { return (surfaceTypes & ScatterBrushObjectSpawnSurfaceTypes.Meshes) != 0; } }
public bool allowsTerrainSurface { get { return (surfaceTypes & ScatterBrushObjectSpawnSurfaceTypes.Terrains) != 0; } }
public int surfaceLayers { get { return _surfaceLayers; } set { UndoEx.record(this); _surfaceLayers = value; EditorUtility.SetDirty(this); } }
public ScatterBrushPrefabProfile scatterBrushPrefabProfile
{
get
{
var profile = ScatterBrushPrefabProfileDb.instance.findProfile(_scatterBrushPrefabProfileName);
if (profile == null) profile = ScatterBrushPrefabProfileDb.instance.defaultProfile;
return profile;
}
}
public ScatterBrushOverlapPrecision overlapTestPrecision { get { return _overlapTestPrecision; } set { UndoEx.record(this); _overlapTestPrecision = value; EditorUtility.SetDirty(this); } }
public static float defaultBrushRadius { get { return 10; } }
public static int defaultMaxNumObjects { get { return 100; } }
public static float defaultMinDragDistance { get { return 1.0f; } }
public static ScatterBrushObjectSpawnSurfaceTypes defaultSurfaceTypes { get { return ScatterBrushObjectSpawnSurfaceTypes.All; } }
public static int defaultSurfaceLayers { get { return ~0; } }
public static string defaultScatterBrushPrefabProfileName { get { return ScatterBrushPrefabProfileDb.defaultProfileName; } }
public static ScatterBrushOverlapPrecision defaultOverlapTestPrecision { get { return ScatterBrushOverlapPrecision.BoundsVSBounds; } }
public void buildUI(VisualElement parent)
{
const float labelWidth = 140.0f;
IMGUIContainer imGUIContainer = UI.createIMGUIContainer(parent);
imGUIContainer.onGUIHandler = () =>
{
string newName = EditorUIEx.profileNameSelectionField<ScatterBrushPrefabProfileDb, ScatterBrushPrefabProfile>
(ScatterBrushPrefabProfileDb.instance, "Scatter brush profile", labelWidth, _scatterBrushPrefabProfileName);
if (newName != _scatterBrushPrefabProfileName)
{
UndoEx.record(this);
_scatterBrushPrefabProfileName = newName;
EditorUtility.SetDirty(this);
}
};
var floatField = UI.createFloatField("_brushRadius", serializedObject, "Brush radius", "The paint brush radius.", 0.1f, parent);
floatField.setFieldLabelWidth(labelWidth);
var intField = UI.createIntegerField("_maxNumObjects", serializedObject, "Max num objects", "The maximum number of objects that can be spawned inside the brush during a single drag step.", 1, parent);
intField.setFieldLabelWidth(labelWidth);
floatField = UI.createFloatField("_minDragDistance", serializedObject, "~Min drag distance", "An approximate value that indicates the minimum drag distance that must be traversed by the mouse cursor before new objects are spawned.", 1e-4f, parent);
floatField.setFieldLabelWidth(labelWidth);
var enumFlagsField = UI.createEnumFlagsField(typeof(ScatterBrushObjectSpawnSurfaceTypes), "_surfaceTypes", serializedObject, "Surface types", "Allows you to specify the types of entities that can be used as surfaces on which the paint brush can sit.", parent);
enumFlagsField.setFieldLabelWidth(labelWidth);
var layerMaskField = UI.createLayerMaskField(surfaceLayers, "_surfaceLayers", serializedObject, "Surface layers", "Only objects belonging to any of these layers can be used as a surface for the paint brush.", parent);
layerMaskField.setFieldLabelWidth(labelWidth);
var overlapPrecisField = UI.createEnumField(typeof(ScatterBrushOverlapPrecision), "_overlapTestPrecision", serializedObject, "Overlap test precision",
"The precision mode used when testing for overlaps with scene objects.", parent);
overlapPrecisField.setChildLabelWidth(labelWidth);
UI.createUseDefaultsButton(() => useDefaults(), parent);
}
public override void useDefaults()
{
brushRadius = defaultBrushRadius;
maxNumObjects = defaultMaxNumObjects;
minDragDistance = defaultMinDragDistance;
surfaceTypes = defaultSurfaceTypes;
surfaceLayers = defaultSurfaceLayers;
_scatterBrushPrefabProfileName = defaultScatterBrushPrefabProfileName;
overlapTestPrecision = defaultOverlapTestPrecision;
EditorUtility.SetDirty(this);
}
}
}
#endif