mirror of
https://github.com/BlackMATov/unity-flash-tools.git
synced 2025-12-15 12:29:49 +07:00
custom attributes wip
This commit is contained in:
@@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 92c4c08c8d0f648efa0a3f602e3e8710
|
||||
folderAsset: yes
|
||||
timeCreated: 1472012226
|
||||
licenseType: Free
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,60 +0,0 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace FlashTools.Internal.SwfEditorTools {
|
||||
[CustomPropertyDrawer(typeof(SwfPowerOfTwoIfAttribute))]
|
||||
public class SwfPowerOfTwoIfDrawer : PropertyDrawer {
|
||||
|
||||
SerializedProperty FindBoolProperty(SerializedProperty property, string bool_prop) {
|
||||
var prop = property.Copy();
|
||||
while ( prop.NextVisible(false) ) {
|
||||
if ( prop.propertyType == SerializedPropertyType.Boolean && prop.name == bool_prop ) {
|
||||
return prop;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
void PropertyToPowerOfTwo(SerializedProperty property) {
|
||||
if ( property.propertyType == SerializedPropertyType.Integer ) {
|
||||
if ( !Mathf.IsPowerOfTwo(property.intValue) ) {
|
||||
property.intValue = Mathf.ClosestPowerOfTwo(property.intValue);
|
||||
property.serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int[] GenPowerOfTwoValues(int min, int max) {
|
||||
var values = new List<int>();
|
||||
if ( !Mathf.IsPowerOfTwo(min) ) {
|
||||
min = Mathf.NextPowerOfTwo(min);
|
||||
}
|
||||
while ( min <= max ) {
|
||||
values.Add(min);
|
||||
min = Mathf.NextPowerOfTwo(min + 1);
|
||||
}
|
||||
return values.ToArray();
|
||||
}
|
||||
|
||||
public override void OnGUI(
|
||||
Rect position, SerializedProperty property, GUIContent label)
|
||||
{
|
||||
if ( property.propertyType == SerializedPropertyType.Integer ) {
|
||||
var attr = attribute as SwfPowerOfTwoIfAttribute;
|
||||
var bool_prop = FindBoolProperty(property, attr.BoolProp);
|
||||
if ( bool_prop != null && bool_prop.boolValue ) {
|
||||
PropertyToPowerOfTwo(property);
|
||||
var values = GenPowerOfTwoValues(attr.Min, attr.Max);
|
||||
var vnames = values.Select(p => new GUIContent(p.ToString())).ToArray();
|
||||
EditorGUI.IntPopup(position, property, vnames, values, label);
|
||||
} else {
|
||||
EditorGUI.PropertyField(position, property, label);
|
||||
}
|
||||
} else {
|
||||
EditorGUI.LabelField(position, label.text, "Use SwfPowerOfTwoIf with integer attribute.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace FlashTools.Internal.SwfEditorTools {
|
||||
[CustomPropertyDrawer(typeof(SwfSortingLayerAttribute))]
|
||||
public class SwfSortingLayerDrawer : PropertyDrawer {
|
||||
|
||||
List<GUIContent> GetAllSortingLayers() {
|
||||
var result = new List<GUIContent>();
|
||||
var tag_manager_so = new SerializedObject(
|
||||
AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
|
||||
var layers = tag_manager_so.FindProperty("m_SortingLayers");
|
||||
if ( layers != null && layers.isArray ) {
|
||||
for ( var i = 0; i < layers.arraySize; ++i ) {
|
||||
var layer_prop = layers.GetArrayElementAtIndex(i);
|
||||
var layer_name_prop = layer_prop.FindPropertyRelative("name");
|
||||
if ( !string.IsNullOrEmpty(layer_name_prop.stringValue) ) {
|
||||
result.Add(new GUIContent(layer_name_prop.stringValue));
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public override void OnGUI(
|
||||
Rect position, SerializedProperty property, GUIContent label)
|
||||
{
|
||||
var all_sorting_layers = GetAllSortingLayers();
|
||||
if ( property.propertyType == SerializedPropertyType.String ) {
|
||||
var new_sorting_layer = EditorGUI.Popup(
|
||||
position,
|
||||
label,
|
||||
all_sorting_layers.FindIndex(p => p.text == property.stringValue),
|
||||
all_sorting_layers.ToArray());
|
||||
property.stringValue = all_sorting_layers[new_sorting_layer].text;
|
||||
} else {
|
||||
EditorGUI.LabelField(position, label.text, "Use SwfSortingLayer with string attribute.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 75cfccb798f0a434492af628d750c4a4
|
||||
timeCreated: 1472012246
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
142
Assets/FlashTools/Scripts/Internal/Editor/SwfPropertyDrawers.cs
Normal file
142
Assets/FlashTools/Scripts/Internal/Editor/SwfPropertyDrawers.cs
Normal file
@@ -0,0 +1,142 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace FlashTools.Internal.SwfEditorTools {
|
||||
|
||||
//
|
||||
// SwfSortingLayerDrawer
|
||||
//
|
||||
|
||||
[CustomPropertyDrawer(typeof(SwfSortingLayerAttribute))]
|
||||
public class SwfSortingLayerDrawer : PropertyDrawer {
|
||||
|
||||
const string DefaultLayerName = "Default";
|
||||
|
||||
static List<string> GetAllSortingLayers() {
|
||||
var result = new List<string>();
|
||||
var tag_assets = AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset");
|
||||
if ( tag_assets.Length > 0 ) {
|
||||
var tag_manager = new SerializedObject(tag_assets[0]);
|
||||
var layers = tag_manager.FindProperty("m_SortingLayers");
|
||||
if ( layers != null && layers.isArray ) {
|
||||
for ( var i = 0; i < layers.arraySize; ++i ) {
|
||||
var layer_prop = layers.GetArrayElementAtIndex(i);
|
||||
var layer_prop_name = layer_prop != null
|
||||
? layer_prop.FindPropertyRelative("name")
|
||||
: null;
|
||||
var layer_name = layer_prop_name != null && layer_prop_name.propertyType == SerializedPropertyType.String
|
||||
? layer_prop_name.stringValue
|
||||
: string.Empty;
|
||||
if ( !string.IsNullOrEmpty(layer_name) ) {
|
||||
result.Add(layer_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( !result.Contains(DefaultLayerName) ) {
|
||||
result.Add(DefaultLayerName);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static void ValidateProperty(SerializedProperty property) {
|
||||
if ( property.propertyType == SerializedPropertyType.String ) {
|
||||
var all_sorting_layers = GetAllSortingLayers();
|
||||
if ( !all_sorting_layers.Contains(property.stringValue) ) {
|
||||
property.stringValue = DefaultLayerName;
|
||||
property.serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnGUI(
|
||||
Rect position, SerializedProperty property, GUIContent label)
|
||||
{
|
||||
var all_sorting_layers = GetAllSortingLayers();
|
||||
if ( property.propertyType == SerializedPropertyType.String ) {
|
||||
ValidateProperty(property);
|
||||
var old_sorting_layer = property.stringValue;
|
||||
var sorting_layer_index = EditorGUI.Popup(
|
||||
position,
|
||||
label,
|
||||
all_sorting_layers.FindIndex(p => p == property.stringValue),
|
||||
all_sorting_layers.Select(p => new GUIContent(p)).ToArray());
|
||||
property.stringValue = all_sorting_layers[sorting_layer_index];
|
||||
if ( old_sorting_layer != property.stringValue ) {
|
||||
property.serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
} else {
|
||||
EditorGUI.LabelField(position, label.text, "Use SwfSortingLayer with string attribute.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// SwfPowerOfTwoIfDrawer
|
||||
//
|
||||
|
||||
[CustomPropertyDrawer(typeof(SwfPowerOfTwoIfAttribute))]
|
||||
public class SwfPowerOfTwoIfDrawer : PropertyDrawer {
|
||||
|
||||
static SerializedProperty FindNextBoolProperty(SerializedProperty property, string next_prop) {
|
||||
var prop = property.Copy();
|
||||
while ( prop.NextVisible(false) ) {
|
||||
if ( prop.name == next_prop && prop.propertyType == SerializedPropertyType.Boolean ) {
|
||||
return prop;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static int GetPowerOfTwo(int value) {
|
||||
return Mathf.RoundToInt(Mathf.Pow(2, value));
|
||||
}
|
||||
|
||||
int[] GenPowerOfTwoValues(int min_pow2, int max_pow2) {
|
||||
var values = new List<int>();
|
||||
while ( min_pow2 <= max_pow2 ) {
|
||||
values.Add(GetPowerOfTwo(min_pow2));
|
||||
++min_pow2;
|
||||
}
|
||||
return values.ToArray();
|
||||
}
|
||||
|
||||
static void ValidateProperty(SerializedProperty property, bool need_pow2, int min_pow2, int max_pow2) {
|
||||
if ( property.propertyType == SerializedPropertyType.Integer ) {
|
||||
var old_value = property.intValue;
|
||||
if ( need_pow2 && !Mathf.IsPowerOfTwo(property.intValue) ) {
|
||||
property.intValue = Mathf.ClosestPowerOfTwo(property.intValue);
|
||||
}
|
||||
property.intValue = Mathf.Clamp(
|
||||
property.intValue,
|
||||
GetPowerOfTwo(min_pow2),
|
||||
GetPowerOfTwo(max_pow2));
|
||||
if ( old_value != property.intValue ) {
|
||||
property.serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnGUI(
|
||||
Rect position, SerializedProperty property, GUIContent label)
|
||||
{
|
||||
if ( property.propertyType == SerializedPropertyType.Integer ) {
|
||||
var attr = attribute as SwfPowerOfTwoIfAttribute;
|
||||
var bool_prop = FindNextBoolProperty(property, attr.BoolProp);
|
||||
var need_pow2 = (bool_prop != null && bool_prop.boolValue);
|
||||
ValidateProperty(property, need_pow2, attr.MinPow2, attr.MaxPow2);
|
||||
if ( need_pow2 ) {
|
||||
var values = GenPowerOfTwoValues(attr.MinPow2, attr.MaxPow2);
|
||||
var vnames = values.Select(p => new GUIContent(p.ToString())).ToArray();
|
||||
EditorGUI.IntPopup(position, property, vnames, values, label);
|
||||
} else {
|
||||
EditorGUI.PropertyField(position, property, label);
|
||||
}
|
||||
} else {
|
||||
EditorGUI.LabelField(position, label.text, "Use SwfPowerOfTwoIf with integer attribute.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,7 @@ namespace FlashTools.Internal {
|
||||
|
||||
[System.Serializable]
|
||||
public struct Settings {
|
||||
[SwfPowerOfTwoIfAttribute("AtlasPowerOfTwo", 32, 8192)]
|
||||
[SwfPowerOfTwoIfAttribute(5, 13, "AtlasPowerOfTwo")]
|
||||
public int MaxAtlasSize;
|
||||
public int AtlasPadding;
|
||||
public int PixelsPerUnit;
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace FlashTools.Internal {
|
||||
public class SwfPowerOfTwoIfAttribute : PropertyAttribute {
|
||||
public string BoolProp;
|
||||
public int Min;
|
||||
public int Max;
|
||||
public SwfPowerOfTwoIfAttribute(string bool_prop, int min, int max) {
|
||||
BoolProp = bool_prop;
|
||||
Min = min;
|
||||
Max = max;
|
||||
}
|
||||
}
|
||||
}
|
||||
17
Assets/FlashTools/Scripts/Internal/SwfPropertyAttributes.cs
Normal file
17
Assets/FlashTools/Scripts/Internal/SwfPropertyAttributes.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace FlashTools.Internal {
|
||||
public class SwfSortingLayerAttribute : PropertyAttribute {
|
||||
}
|
||||
|
||||
public class SwfPowerOfTwoIfAttribute : PropertyAttribute {
|
||||
public int MinPow2;
|
||||
public int MaxPow2;
|
||||
public string BoolProp;
|
||||
public SwfPowerOfTwoIfAttribute(int min_pow2, int max_pow2, string prop) {
|
||||
MinPow2 = min_pow2;
|
||||
MaxPow2 = max_pow2;
|
||||
BoolProp = prop;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace FlashTools.Internal {
|
||||
public class SwfSortingLayerAttribute : PropertyAttribute {
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a33d7ac8d525c4e8fbe3084eacab4f07
|
||||
timeCreated: 1472011819
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -38,9 +38,12 @@ TagManager:
|
||||
-
|
||||
-
|
||||
m_SortingLayers:
|
||||
- name: SortingDown
|
||||
uniqueID: 811819031
|
||||
locked: 0
|
||||
- name: Default
|
||||
uniqueID: 0
|
||||
locked: 0
|
||||
- name: jvjhv
|
||||
uniqueID: 811819031
|
||||
- name: SortingUp
|
||||
uniqueID: 756447657
|
||||
locked: 0
|
||||
|
||||
Reference in New Issue
Block a user