mirror of
https://github.com/bdunderscore/modular-avatar.git
synced 2025-02-08 06:42:47 +08:00
Add validation for menu icons. (#130)
This commit is contained in:
parent
118c2bd961
commit
19a6923051
@ -5,6 +5,7 @@ using UnityEngine;
|
|||||||
using VRC.SDK3.Avatars.Components;
|
using VRC.SDK3.Avatars.Components;
|
||||||
using VRC.SDK3.Avatars.ScriptableObjects;
|
using VRC.SDK3.Avatars.ScriptableObjects;
|
||||||
using static nadena.dev.modular_avatar.core.editor.Localization;
|
using static nadena.dev.modular_avatar.core.editor.Localization;
|
||||||
|
using static nadena.dev.modular_avatar.core.editor.Util;
|
||||||
|
|
||||||
namespace nadena.dev.modular_avatar.core.editor
|
namespace nadena.dev.modular_avatar.core.editor
|
||||||
{
|
{
|
||||||
@ -120,11 +121,24 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
_devFoldout = EditorGUILayout.Foldout(_devFoldout, G("menuinstall.devoptions"));
|
_devFoldout = EditorGUILayout.Foldout(_devFoldout, G("menuinstall.devoptions"));
|
||||||
if (_devFoldout)
|
if (_devFoldout)
|
||||||
{
|
{
|
||||||
|
SerializedProperty menuToAppendProperty = serializedObject.FindProperty(nameof(ModularAvatarMenuInstaller.menuToAppend));
|
||||||
|
switch (ValidateExpressionMenuIcon((VRCExpressionsMenu)menuToAppendProperty.objectReferenceValue))
|
||||||
|
{
|
||||||
|
case ValidateExpressionMenuIconResult.Success:
|
||||||
|
break;
|
||||||
|
case ValidateExpressionMenuIconResult.TooLarge:
|
||||||
|
EditorGUILayout.HelpBox(S("menuinstall.menu_icon_too_large"), MessageType.Error);
|
||||||
|
break;
|
||||||
|
case ValidateExpressionMenuIconResult.Uncompressed:
|
||||||
|
EditorGUILayout.HelpBox(S("menuinstall.menu_icon_uncompressed"), MessageType.Error);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
}
|
||||||
|
|
||||||
EditorGUI.indentLevel++;
|
EditorGUI.indentLevel++;
|
||||||
EditorGUILayout.PropertyField(
|
EditorGUILayout.PropertyField(
|
||||||
serializedObject.FindProperty(nameof(ModularAvatarMenuInstaller.menuToAppend)),
|
menuToAppendProperty, new GUIContent(G("menuinstall.srcmenu")));
|
||||||
new GUIContent(G("menuinstall.srcmenu"))
|
|
||||||
);
|
|
||||||
EditorGUI.indentLevel--;
|
EditorGUI.indentLevel--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,5 +204,31 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
{
|
{
|
||||||
return _avatarMenus == null || _avatarMenus.Contains(menu);
|
return _avatarMenus == null || _avatarMenus.Contains(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ValidateExpressionMenuIconResult ValidateExpressionMenuIcon(VRCExpressionsMenu menu)
|
||||||
|
{
|
||||||
|
if (menu == null) return ValidateExpressionMenuIconResult.Success;
|
||||||
|
|
||||||
|
foreach (VRCExpressionsMenu.Control control in menu.controls)
|
||||||
|
{
|
||||||
|
// Control
|
||||||
|
ValidateExpressionMenuIconResult result = Util.ValidateExpressionMenuIcon(control.icon);
|
||||||
|
if (result != ValidateExpressionMenuIconResult.Success) return result;
|
||||||
|
|
||||||
|
// Labels
|
||||||
|
foreach (VRCExpressionsMenu.Control.Label label in control.labels)
|
||||||
|
{
|
||||||
|
ValidateExpressionMenuIconResult labelResult = Util.ValidateExpressionMenuIcon(label.icon);
|
||||||
|
if (labelResult != ValidateExpressionMenuIconResult.Success) return labelResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubMenu
|
||||||
|
if (control.type != VRCExpressionsMenu.Control.ControlType.SubMenu) continue;
|
||||||
|
ValidateExpressionMenuIconResult subMenuResult = ValidateExpressionMenuIcon(control.subMenu);
|
||||||
|
if (subMenuResult != ValidateExpressionMenuIconResult.Success) return subMenuResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ValidateExpressionMenuIconResult.Success;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -9,6 +9,8 @@
|
|||||||
"menuinstall.showcontents": "Show menu contents",
|
"menuinstall.showcontents": "Show menu contents",
|
||||||
"menuinstall.showcontents.notselected": "No menu selected",
|
"menuinstall.showcontents.notselected": "No menu selected",
|
||||||
"menuinstall.devoptions": "Prefab Developer Options",
|
"menuinstall.devoptions": "Prefab Developer Options",
|
||||||
|
"menuinstall.menu_icon_too_large" : "The icon set in the menu is too large than 256 pixels.",
|
||||||
|
"menuinstall.menu_icon_uncompressed" : "The icon set in the menu is not set for compression.",
|
||||||
"menuinstall.srcmenu": "Menu to Install",
|
"menuinstall.srcmenu": "Menu to Install",
|
||||||
"params.autodetect_header": " Autodetected Parameters ",
|
"params.autodetect_header": " Autodetected Parameters ",
|
||||||
"params.internal": "Internal",
|
"params.internal": "Internal",
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
"menuinstall.showcontents": "メニュー内容を表示",
|
"menuinstall.showcontents": "メニュー内容を表示",
|
||||||
"menuinstall.showcontents.notselected": "メニューが選択されていません",
|
"menuinstall.showcontents.notselected": "メニューが選択されていません",
|
||||||
"menuinstall.devoptions": "プレハブ開発者向け設定",
|
"menuinstall.devoptions": "プレハブ開発者向け設定",
|
||||||
|
"menuinstall.menu_icon_too_large" : "メニューに設定されているアイコンが256ピクセルより大きすぎます。",
|
||||||
|
"menuinstall.menu_icon_uncompressed" : "メニューに設定されているアイコンが圧縮設定されていません。",
|
||||||
"menuinstall.srcmenu": "インストールされるメニュー",
|
"menuinstall.srcmenu": "インストールされるメニュー",
|
||||||
"params.autodetect_header": " 自動検出されたパラメーター ",
|
"params.autodetect_header": " 自動検出されたパラメーター ",
|
||||||
"params.internal": "内部値",
|
"params.internal": "内部値",
|
||||||
|
@ -27,6 +27,7 @@ using System.Reflection;
|
|||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using UnityEditor.Animations;
|
using UnityEditor.Animations;
|
||||||
|
using UnityEngine;
|
||||||
using VRC.SDKBase.Editor.BuildPipeline;
|
using VRC.SDKBase.Editor.BuildPipeline;
|
||||||
using Object = UnityEngine.Object;
|
using Object = UnityEngine.Object;
|
||||||
|
|
||||||
@ -138,5 +139,33 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
|
|
||||||
return avatarValidation;
|
return avatarValidation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private const int MAX_EXPRESSION_TEXTURE_SIZE = 256;
|
||||||
|
|
||||||
|
public enum ValidateExpressionMenuIconResult
|
||||||
|
{
|
||||||
|
Success,
|
||||||
|
TooLarge,
|
||||||
|
Uncompressed
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ValidateExpressionMenuIconResult ValidateExpressionMenuIcon(Texture2D icon)
|
||||||
|
{
|
||||||
|
string path = AssetDatabase.GetAssetPath(icon);
|
||||||
|
TextureImporter importer = AssetImporter.GetAtPath(path) as TextureImporter;
|
||||||
|
if (importer == null) return ValidateExpressionMenuIconResult.Success;
|
||||||
|
TextureImporterPlatformSettings settings = importer.GetDefaultPlatformTextureSettings();
|
||||||
|
|
||||||
|
// Max texture size;
|
||||||
|
if ((icon.width > MAX_EXPRESSION_TEXTURE_SIZE || icon.height > MAX_EXPRESSION_TEXTURE_SIZE) &&
|
||||||
|
settings.maxTextureSize > MAX_EXPRESSION_TEXTURE_SIZE) return ValidateExpressionMenuIconResult.TooLarge;
|
||||||
|
|
||||||
|
// Compression
|
||||||
|
if (settings.textureCompression == TextureImporterCompression.Uncompressed) return ValidateExpressionMenuIconResult.Uncompressed;
|
||||||
|
return ValidateExpressionMenuIconResult.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user