ArabDesert/Assets/harry_t/ht8b_editor/ht8b_editor.cs

397 lines
14 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System;
using UdonSharp;
using VRC.Udon.Common.Interfaces;
[System.Serializable]
public struct ht8b_collision_data_t
{
public bool bInit;
public float k_TABLE_WIDTH ;//= 1.054f;
public float k_TABLE_HEIGHT ;//= 0.605f;
public float k_POCKET_RADIUS ;//= 0.100f;
public float k_CUSHION_RADIUS ;//= 0.043f;
public float k_INNER_RADIUS ;//= 0.100f;
public Vector3 _cornerpocket;
public Vector3 _sidepocket;
public void init_default()
{
this.k_TABLE_WIDTH = 1.054f;
this.k_TABLE_HEIGHT = 0.605f;
this.k_CUSHION_RADIUS = 0.043f;
this.k_POCKET_RADIUS = 0.100f;
this.k_INNER_RADIUS = 0.072f;
this._cornerpocket = new Vector3( 1.087f, 0.0f, 0.627f );
this._sidepocket = new Vector3( 0.000f, 0.0f, 0.665f );
this.bInit = true;
}
}
public class ht8b_editor : MonoBehaviour
{
public ht8b_config config;
}
#if UNITY_EDITOR
[CustomEditor(typeof(ht8b_editor))]
public class ht8b_editor_inspector : Editor
{
bool bShowTable = true;
bool bShowResource = false;
bool bResourceInit = false;
bool bShowCollision = false;
bool bAllowCompile = false;
static GUIStyle styleHeader;
static GUIStyle styleError;
static GUIStyle styleWarning;
static bool gui_resource_ready = false;
table_configurator cdata_displayTarget;
private static void DrawError( string szError, GUIStyle style )
{
GUILayout.BeginVertical( "GroupBox" );
GUILayout.Label( szError, style );
GUILayout.EndVertical();
}
private static bool Material_ht8b_supports( ref Material mat )
{
bool isFullSupport = true;
if( !mat.HasProperty( "_EmissionColor" ) )
{
DrawError( $"[!] Shader '{mat.shader.name}' does not have property: _EmissionColor", styleError );
isFullSupport = false;
}
if( !mat.HasProperty( "_Color" ) )
{
DrawError( $"Shader {mat.shader.name} does not have property: _Color", styleWarning );
}
return isFullSupport;
}
private static bool Prefab_ht8b_supports( ref GameObject pf )
{
bool success = true;
if( !pf.transform.Find( ".4BALL_FILL" ) )
{
DrawError( "Prefab does not contain child object named: '.4BALL_FILL' (pocket blockers)", styleError );
success = false;
}
if( !pf.transform.Find( ".RACK" ) )
{
DrawError( "Prefab does not contain child object named: '.RACK'", styleError );
success = false;
}
if( !pf.transform.Find( ".TABLE_SURFACE" ) )
{
DrawError( "Prefab does not contain child object named: '.TABLE_SURFACE'", styleError );
success = false;
}
return success;
}
private static void Ht8bUIGroup( string szHeader )
{
GUILayout.BeginVertical( "HelpBox" );
GUILayout.Label( szHeader, styleHeader );
}
private static bool Ht8bUIGroupMitButton( string szHeader, string szButton )
{
GUILayout.BeginVertical( "HelpBox" );
GUILayout.BeginHorizontal();
GUILayout.Label( szHeader, styleHeader );
bool b = GUILayout.Button( szButton );
GUILayout.EndHorizontal();
return b;
}
private static void Ht8bUIGroupEnd()
{
GUILayout.EndVertical();
}
private static void gui_resource_init()
{
styleHeader = new GUIStyle()
{
fontSize = 14,
fontStyle = FontStyle.Bold
};
styleWarning = new GUIStyle()
{
wordWrap = true
};
styleError = new GUIStyle()
{
fontStyle = FontStyle.Bold,
wordWrap = true
};
gui_resource_ready = true;
}
private static void ui_9x9ColourGrid( Color[] colours )
{
GUILayout.BeginHorizontal();
GUILayout.Label( "Ball Colours" );
GUILayout.FlexibleSpace();
GUILayout.BeginVertical();
for( int y = 0; y < 3; y ++ )
{
GUILayout.BeginHorizontal();
for( int x = 0; x < 3; x ++ )
{
colours[ y * 3 + x ] = EditorGUILayout.ColorField( GUIContent.none, colours[ y * 3 + x ], false, false, false, GUILayout.Width( 50.0f ), GUILayout.Height( 50.0f ) );
}
GUILayout.EndHorizontal();
}
GUILayout.EndVertical();
GUILayout.EndHorizontal();
}
public static Color alpha1( Color src )
{
src.a = 1.0f;
return src;
}
public static void balls_showlimited( Transform root, uint mask )
{
GameObject[] balls = new GameObject[16];
Transform rootballs = root.Find("intl.balls");
for( int i = 0; i < 16; i ++ )
{
rootballs.GetChild(i).gameObject.SetActive( ((mask >> i) & 0x1u) != 0x0u );
}
}
public override void OnInspectorGUI()
{
if( !gui_resource_ready )
{
gui_resource_init();
}
ht8b_editor _editor = (ht8b_editor)target;
base.DrawDefaultInspector();
EditorGUI.BeginChangeCheck();
ht8b_config cfg = _editor.config;
if( cfg != null )
{
bAllowCompile = true;
Ht8bUIGroup( "Table setup" );
cfg._table_setup_prefab = (GameObject)EditorGUILayout.ObjectField( "Table artwork", cfg._table_setup_prefab, typeof(GameObject), false );
if( cfg._table_setup_prefab )
{
if( !Prefab_ht8b_supports( ref cfg._table_setup_prefab ) )
{
bAllowCompile = false;
}
}
else
{
DrawError( "Prefab needs to be set to check structure", styleError );
}
cfg._table_surface_mat = (Material)EditorGUILayout.ObjectField( "Table surface material", cfg._table_surface_mat, typeof(Material), false );
cfg._ball_mat = (Material)EditorGUILayout.ObjectField( "Ball material", cfg._ball_mat, typeof(Material), false );
if( cfg._table_surface_mat )
{
if( !Material_ht8b_supports( ref cfg._table_surface_mat ) )
{
bAllowCompile = false;
}
}
else
{
DrawError( "Material needs to be set to check shader properties", styleError );
}
Ht8bUIGroup( "Collision info" );
if( !this.cdata_displayTarget )
{
this.cdata_displayTarget = _editor.gameObject.transform.Find( "intl.balls" ).Find( "__table_refiner__" ).gameObject.GetComponent< table_configurator >();
}
this.bShowCollision = EditorGUILayout.Toggle( "Draw collision data", this.cdata_displayTarget.gameObject.activeSelf );
this.cdata_displayTarget.gameObject.SetActive( this.bShowCollision );
if( !cfg.cdata.bInit )
{
cfg.cdata.init_default();
}
cfg.cdata.k_TABLE_WIDTH = EditorGUILayout.Slider( "Width", cfg.cdata.k_TABLE_WIDTH, 0.4f, 2.4f );
cfg.cdata.k_TABLE_HEIGHT = EditorGUILayout.Slider( "Height", cfg.cdata.k_TABLE_HEIGHT, 0.4f, 2.4f );
cfg.cdata.k_POCKET_RADIUS = EditorGUILayout.Slider( "Pocket Radius", cfg.cdata.k_POCKET_RADIUS, 0.06f, 0.4f );
cfg.cdata.k_CUSHION_RADIUS = EditorGUILayout.Slider( "Cushion Radius", cfg.cdata.k_CUSHION_RADIUS, 0.01f, 0.4f );
cfg.cdata.k_INNER_RADIUS = EditorGUILayout.Slider( "Pocket Trigger Radius", cfg.cdata.k_INNER_RADIUS, 0.03f, 0.3f );
cfg.cdata._cornerpocket = EditorGUILayout.Vector3Field( "Corner pocket location", cfg.cdata._cornerpocket );
cfg.cdata._sidepocket = EditorGUILayout.Vector3Field( "Side pocket location", cfg.cdata._sidepocket );
this.cdata_displayTarget.cdata = cfg.cdata;
cfg._collision_data_prefab = (GameObject)EditorGUILayout.ObjectField( "(VFX) Collision model", cfg._collision_data_prefab, typeof(GameObject), false );
if( !cfg._collision_data_prefab )
{
DrawError( "Without a collision prefab, balls will instantly dissapear when pocketed!", styleWarning );
}
Ht8bUIGroupEnd();
Ht8bUIGroupEnd();
Ht8bUIGroup( "Global" );
cfg._colourDefault = alpha1(EditorGUILayout.ColorField( new GUIContent("Default edge light"), cfg._colourDefault, false, false, false ));
cfg._colourFoul = alpha1(EditorGUILayout.ColorField( new GUIContent("Foul colour"), cfg._colourFoul, false, false, false ));
Ht8bUIGroupEnd();
if( Ht8bUIGroupMitButton( "8 Ball", "test it" ) )
{
cfg.RenderProcedural_8ball();
AssetDatabase.Refresh();
cfg._ball_mat.SetTexture( "_MainTex", (Texture2D)AssetDatabase.LoadAssetAtPath( "Assets/harry_t/ht8b_materials/procedural/tballs_8ball.png", typeof(Texture2D) ) );
cfg._table_surface_mat.SetColor( "_EmissionColor", cfg._8ball_team_colour_0 * 1.5f );
cfg._table_surface_mat.SetColor( "_Color", cfg._8ball_fabric_colour );
balls_showlimited( _editor.gameObject.transform, 0xffffu );
_editor.transform.Find( "intl.table" ).Find( "table_artwork" ).Find(".4BALL_FILL").gameObject.SetActive( false );
}
cfg._8ball_fabric_colour = EditorGUILayout.ColorField( new GUIContent("Surface Colour"), cfg._8ball_fabric_colour, false, true, false );
cfg._8ball_team_colour_0 = alpha1(EditorGUILayout.ColorField( new GUIContent("Spots Colour"), cfg._8ball_team_colour_0, false, false, false ));
cfg._8ball_team_colour_1 = alpha1(EditorGUILayout.ColorField( new GUIContent("Stripes Colour"), cfg._8ball_team_colour_1, false, false, false ));
Ht8bUIGroupEnd();
if( Ht8bUIGroupMitButton( "9 Ball", "test it" ) )
{
cfg.RenderProcedural_9ball_4ball();
AssetDatabase.Refresh();
cfg._ball_mat.SetTexture( "_MainTex", (Texture2D)AssetDatabase.LoadAssetAtPath( "Assets/harry_t/ht8b_materials/procedural/tballs_9ball.png", typeof(Texture2D) ) );
cfg._table_surface_mat.SetColor( "_EmissionColor", cfg._colourDefault * 1.5f );
cfg._table_surface_mat.SetColor( "_Color", cfg._9ball_fabric_colour );
balls_showlimited( _editor.gameObject.transform, 0x03ffu );
_editor.transform.Find( "intl.table" ).Find( "table_artwork" ).Find(".4BALL_FILL").gameObject.SetActive( false );
}
cfg._9ball_fabric_colour = EditorGUILayout.ColorField( new GUIContent("Surface Colour"), cfg._9ball_fabric_colour, false, true, false );
ui_9x9ColourGrid( cfg._9ball_colours );
Ht8bUIGroupEnd();
if( Ht8bUIGroupMitButton( "4 Ball", "test it" ) )
{
cfg.RenderProcedural_9ball_4ball();
AssetDatabase.Refresh();
cfg._ball_mat.SetTexture( "_MainTex", (Texture2D)AssetDatabase.LoadAssetAtPath( "Assets/harry_t/ht8b_materials/procedural/tballs_9ball.png", typeof(Texture2D) ) );
cfg._table_surface_mat.SetColor( "_EmissionColor", cfg._4ball_team_colour_0 * 1.5f );
cfg._table_surface_mat.SetColor( "_Color", cfg._4ball_fabric_colour );
balls_showlimited( _editor.gameObject.transform, 0xf000u );
_editor.transform.Find( "intl.table" ).Find( "table_artwork" ).Find(".4BALL_FILL").gameObject.SetActive( true );
}
cfg._4ball_fabric_colour = EditorGUILayout.ColorField( new GUIContent("Surface Colour"), cfg._4ball_fabric_colour, false, true, false );
cfg._4ball_team_colour_0 = alpha1(EditorGUILayout.ColorField( new GUIContent("Team A Colour"), cfg._4ball_team_colour_0, false, false, false ));
cfg._4ball_team_colour_1 = alpha1(EditorGUILayout.ColorField( new GUIContent("Team B Colour"), cfg._4ball_team_colour_1, false, false, false ));
cfg._4ball_objective_colour = alpha1(EditorGUILayout.ColorField( new GUIContent("Objective colour"), cfg._4ball_objective_colour, false, false, false ));
Ht8bUIGroupEnd();
Ht8bUIGroup( "Quest / shaders" );
EQuestStuffUI switchto = quest_stuff.DrawQuestStuffGUI( ref cfg.quest_switch_data );
if( switchto != EQuestStuffUI.k_EQuestStuffUI_noaction )
{
quest_stuff.ApplyReplacement( ref cfg.quest_switch_data, switchto );
// Chain replacements switch into internal materials
quest_stuff intl_replacements = _editor.gameObject.transform.Find( "__intl_quest_toggle__" ).gameObject.GetComponent< quest_stuff >();
quest_stuff.ApplyReplacement( ref intl_replacements.data, switchto );
}
Ht8bUIGroupEnd();
bShowResource = EditorGUILayout.Foldout( bShowResource, "Texture sources", true, EditorStyles.foldout );
if( bShowResource )
{
cfg._src_ball_content = (Texture2D)EditorGUILayout.ObjectField( "8/9 Ball layout", cfg._src_ball_content, typeof(Texture2D), false );
cfg._src_ball_spinmarkers = (Texture2D)EditorGUILayout.ObjectField( "Ball spin marker", cfg._src_ball_spinmarkers, typeof(Texture2D), false );
}
if( !bAllowCompile )
{
//GUI.enabled = false;
}
if( GUILayout.Button("Compile & Apply config") )
{
Debug.Log( "Running ht8b config" );
cfg.RenderProceduralTextures();
cfg.ApplyConfig( _editor.gameObject.transform );
}
GUI.enabled = true;
if( GUI.changed )
{
EditorUtility.SetDirty( cfg );
}
}
else
{
GUILayout.Label( "No config set" );
}
if (EditorGUI.EndChangeCheck())
{
Undo.RegisterCompleteObjectUndo( cfg, "edited ht8b config" );
}
}
}
#endif