CustomMaterialInspector.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. // Amplify Shader Editor - Visual Shader Editing Tool
  2. // Copyright (c) Amplify Creations, Lda <info@amplify.pt>
  3. using UnityEngine;
  4. using UnityEditor;
  5. using System;
  6. using System.Reflection;
  7. namespace AmplifyShaderEditor
  8. {
  9. public static class MaterialPropertyHandlerEx
  10. {
  11. private static System.Type type = null;
  12. public static System.Type Type { get { return ( type == null ) ? type = System.Type.GetType( "UnityEditor.MaterialPropertyHandler, UnityEditor" ) : type; } }
  13. public static object GetHandler( Shader shader, string name )
  14. {
  15. return MaterialPropertyHandlerEx.Type.InvokeMember( "GetHandler", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { shader, name } );
  16. }
  17. public static void OnGUI( object obj, ref Rect position, MaterialProperty prop, GUIContent label, MaterialEditor editor )
  18. {
  19. Type.InvokeMember( "OnGUI", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, obj, new object[] { position, prop, label, editor } );
  20. }
  21. public static float GetPropertyHeight( object obj, MaterialProperty prop, string label, MaterialEditor editor )
  22. {
  23. return (float)Type.InvokeMember( "GetPropertyHeight", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, obj, new object[] { prop, label, editor } );
  24. }
  25. public static object PropertyDrawer( object obj )
  26. {
  27. return Type.InvokeMember( "propertyDrawer", BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty, null, obj, new object[] {} );
  28. }
  29. }
  30. internal class MaterialInspector : ShaderGUI
  31. {
  32. private const string CopyButtonStr = "Copy Values";
  33. private const string PasteButtonStr = "Paste Values";
  34. private const string PreviewModelPref = "ASEMI_PREVIEWMODEL";
  35. private static MaterialEditor m_instance = null;
  36. private static bool m_refreshOnUndo = false;
  37. private bool m_initialized = false;
  38. private double m_lastRenderedTime;
  39. private PreviewRenderUtility m_previewRenderUtility;
  40. private Mesh m_targetMesh;
  41. private Vector2 m_previewDir = new Vector2( 120f, -20f );
  42. private int m_selectedMesh = 0;
  43. private int m_prevSelectedMesh = 0;
  44. // Reflection Fields
  45. private FieldInfo m_previewDirDefault = null;
  46. private Type m_modelInspectorType = null;
  47. private MethodInfo m_renderMeshMethod = null;
  48. private Type m_previewGUIType = null;
  49. private MethodInfo m_dragMethod = null;
  50. private FieldInfo m_selectedField = null;
  51. private FieldInfo m_infoField = null;
  52. #if UNITY_2020_1_OR_NEWER
  53. private Type m_previewSettingsType = null;
  54. object m_previewSettingsInstance;
  55. FieldInfo previewDirInfo;
  56. FieldInfo shadedMaterialInfo;
  57. FieldInfo activeMaterialInfo;
  58. #endif
  59. public override void OnClosed( Material material )
  60. {
  61. base.OnClosed( material );
  62. CleanUp();
  63. }
  64. void CleanUp()
  65. {
  66. if( m_previewRenderUtility != null )
  67. {
  68. m_previewRenderUtility.Cleanup();
  69. m_previewRenderUtility = null;
  70. }
  71. }
  72. void UndoRedoPerformed()
  73. {
  74. m_refreshOnUndo = true;
  75. }
  76. ~MaterialInspector()
  77. {
  78. UndoUtils.UnregisterUndoRedoCallback( UndoRedoPerformed );
  79. CleanUp();
  80. }
  81. public override void OnGUI( MaterialEditor materialEditor, MaterialProperty[] properties )
  82. {
  83. IOUtils.Init();
  84. Material mat = materialEditor.target as Material;
  85. if( mat == null )
  86. return;
  87. m_instance = materialEditor;
  88. if( !m_initialized )
  89. {
  90. Init();
  91. m_initialized = true;
  92. UndoUtils.RegisterUndoRedoCallback( UndoRedoPerformed );
  93. }
  94. if( Event.current.type == EventType.Repaint &&
  95. mat.HasProperty( IOUtils.DefaultASEDirtyCheckId ) &&
  96. mat.GetInt( IOUtils.DefaultASEDirtyCheckId ) == 1 )
  97. {
  98. mat.SetInt( IOUtils.DefaultASEDirtyCheckId, 0 );
  99. UIUtils.ForceUpdateFromMaterial();
  100. //Event.current.Use();
  101. }
  102. if( materialEditor.isVisible )
  103. {
  104. GUILayout.BeginVertical();
  105. {
  106. GUILayout.Space( 3 );
  107. if( GUILayout.Button( "Open in Shader Editor" ) )
  108. {
  109. ASEPackageManagerHelper.SetupLateMaterial( mat );
  110. }
  111. GUILayout.BeginHorizontal();
  112. {
  113. if( GUILayout.Button( CopyButtonStr ) )
  114. {
  115. System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
  116. Shader shader = mat.shader;
  117. int propertyCount = UnityEditor.ShaderUtil.GetPropertyCount( shader );
  118. string allProperties = string.Empty;
  119. for( int i = 0; i < propertyCount; i++ )
  120. {
  121. UnityEditor.ShaderUtil.ShaderPropertyType type = UnityEditor.ShaderUtil.GetPropertyType( shader, i );
  122. string name = UnityEditor.ShaderUtil.GetPropertyName( shader, i );
  123. string valueStr = string.Empty;
  124. switch( type )
  125. {
  126. case UnityEditor.ShaderUtil.ShaderPropertyType.Color:
  127. {
  128. Color value = mat.GetColor( name );
  129. valueStr = value.r.ToString() + IOUtils.VECTOR_SEPARATOR +
  130. value.g.ToString() + IOUtils.VECTOR_SEPARATOR +
  131. value.b.ToString() + IOUtils.VECTOR_SEPARATOR +
  132. value.a.ToString();
  133. }
  134. break;
  135. case UnityEditor.ShaderUtil.ShaderPropertyType.Vector:
  136. {
  137. Vector4 value = mat.GetVector( name );
  138. valueStr = value.x.ToString() + IOUtils.VECTOR_SEPARATOR +
  139. value.y.ToString() + IOUtils.VECTOR_SEPARATOR +
  140. value.z.ToString() + IOUtils.VECTOR_SEPARATOR +
  141. value.w.ToString();
  142. }
  143. break;
  144. case UnityEditor.ShaderUtil.ShaderPropertyType.Float:
  145. {
  146. float value = mat.GetFloat( name );
  147. valueStr = value.ToString();
  148. }
  149. break;
  150. case UnityEditor.ShaderUtil.ShaderPropertyType.Range:
  151. {
  152. float value = mat.GetFloat( name );
  153. valueStr = value.ToString();
  154. }
  155. break;
  156. case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv:
  157. {
  158. Texture value = mat.GetTexture( name );
  159. valueStr = AssetDatabase.GetAssetPath( value );
  160. Vector2 offset = mat.GetTextureOffset( name );
  161. Vector2 scale = mat.GetTextureScale( name );
  162. valueStr += IOUtils.VECTOR_SEPARATOR + scale.x.ToString() +
  163. IOUtils.VECTOR_SEPARATOR + scale.y.ToString() +
  164. IOUtils.VECTOR_SEPARATOR + offset.x.ToString() +
  165. IOUtils.VECTOR_SEPARATOR + offset.y.ToString();
  166. }
  167. break;
  168. }
  169. allProperties += name + IOUtils.FIELD_SEPARATOR + type + IOUtils.FIELD_SEPARATOR + valueStr;
  170. if( i < ( propertyCount - 1 ) )
  171. {
  172. allProperties += IOUtils.LINE_TERMINATOR;
  173. }
  174. }
  175. EditorPrefs.SetString( IOUtils.MAT_CLIPBOARD_ID, allProperties );
  176. System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
  177. }
  178. if( GUILayout.Button( PasteButtonStr ) )
  179. {
  180. System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
  181. string propertiesStr = EditorPrefs.GetString( IOUtils.MAT_CLIPBOARD_ID, string.Empty );
  182. if( !string.IsNullOrEmpty( propertiesStr ) )
  183. {
  184. string[] propertyArr = propertiesStr.Split( IOUtils.LINE_TERMINATOR );
  185. bool validData = true;
  186. try
  187. {
  188. for( int i = 0; i < propertyArr.Length; i++ )
  189. {
  190. string[] valuesArr = propertyArr[ i ].Split( IOUtils.FIELD_SEPARATOR );
  191. if( valuesArr.Length != 3 )
  192. {
  193. Debug.LogWarning( "Material clipboard data is corrupted" );
  194. validData = false;
  195. break;
  196. }
  197. else if( mat.HasProperty( valuesArr[ 0 ] ) )
  198. {
  199. UnityEditor.ShaderUtil.ShaderPropertyType type = (UnityEditor.ShaderUtil.ShaderPropertyType)Enum.Parse( typeof( UnityEditor.ShaderUtil.ShaderPropertyType ), valuesArr[ 1 ] );
  200. switch( type )
  201. {
  202. case UnityEditor.ShaderUtil.ShaderPropertyType.Color:
  203. {
  204. string[] colorVals = valuesArr[ 2 ].Split( IOUtils.VECTOR_SEPARATOR );
  205. if( colorVals.Length != 4 )
  206. {
  207. Debug.LogWarning( "Material clipboard data is corrupted" );
  208. validData = false;
  209. break;
  210. }
  211. else
  212. {
  213. mat.SetColor( valuesArr[ 0 ], new Color( Convert.ToSingle( colorVals[ 0 ] ),
  214. Convert.ToSingle( colorVals[ 1 ] ),
  215. Convert.ToSingle( colorVals[ 2 ] ),
  216. Convert.ToSingle( colorVals[ 3 ] ) ) );
  217. }
  218. }
  219. break;
  220. case UnityEditor.ShaderUtil.ShaderPropertyType.Vector:
  221. {
  222. string[] vectorVals = valuesArr[ 2 ].Split( IOUtils.VECTOR_SEPARATOR );
  223. if( vectorVals.Length != 4 )
  224. {
  225. Debug.LogWarning( "Material clipboard data is corrupted" );
  226. validData = false;
  227. break;
  228. }
  229. else
  230. {
  231. mat.SetVector( valuesArr[ 0 ], new Vector4( Convert.ToSingle( vectorVals[ 0 ] ),
  232. Convert.ToSingle( vectorVals[ 1 ] ),
  233. Convert.ToSingle( vectorVals[ 2 ] ),
  234. Convert.ToSingle( vectorVals[ 3 ] ) ) );
  235. }
  236. }
  237. break;
  238. case UnityEditor.ShaderUtil.ShaderPropertyType.Float:
  239. {
  240. mat.SetFloat( valuesArr[ 0 ], Convert.ToSingle( valuesArr[ 2 ] ) );
  241. }
  242. break;
  243. case UnityEditor.ShaderUtil.ShaderPropertyType.Range:
  244. {
  245. mat.SetFloat( valuesArr[ 0 ], Convert.ToSingle( valuesArr[ 2 ] ) );
  246. }
  247. break;
  248. case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv:
  249. {
  250. string[] texVals = valuesArr[ 2 ].Split( IOUtils.VECTOR_SEPARATOR );
  251. if( texVals.Length != 5 )
  252. {
  253. Debug.LogWarning( "Material clipboard data is corrupted" );
  254. validData = false;
  255. break;
  256. }
  257. else
  258. {
  259. mat.SetTexture( valuesArr[ 0 ], AssetDatabase.LoadAssetAtPath<Texture>( texVals[ 0 ] ) );
  260. mat.SetTextureScale( valuesArr[ 0 ], new Vector2( Convert.ToSingle( texVals[ 1 ] ), Convert.ToSingle( texVals[ 2 ] ) ) );
  261. mat.SetTextureOffset( valuesArr[ 0 ], new Vector2( Convert.ToSingle( texVals[ 3 ] ), Convert.ToSingle( texVals[ 4 ] ) ) );
  262. }
  263. }
  264. break;
  265. }
  266. }
  267. }
  268. }
  269. catch( Exception e )
  270. {
  271. Debug.LogException( e );
  272. validData = false;
  273. }
  274. if( validData )
  275. {
  276. materialEditor.PropertiesChanged();
  277. UIUtils.CopyValuesFromMaterial( mat );
  278. }
  279. else
  280. {
  281. EditorPrefs.SetString( IOUtils.MAT_CLIPBOARD_ID, string.Empty );
  282. }
  283. }
  284. System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
  285. }
  286. }
  287. GUILayout.EndHorizontal();
  288. GUILayout.Space( 5 );
  289. }
  290. GUILayout.EndVertical();
  291. }
  292. EditorGUI.BeginChangeCheck();
  293. //base.OnGUI( materialEditor, properties );
  294. // Draw custom properties instead of calling BASE to use single line texture properties
  295. materialEditor.SetDefaultGUIWidths();
  296. if( m_infoField == null )
  297. {
  298. m_infoField = typeof( MaterialEditor ).GetField( "m_InfoMessage", BindingFlags.Instance | BindingFlags.NonPublic );
  299. }
  300. string info = m_infoField.GetValue( materialEditor ) as string;
  301. if( !string.IsNullOrEmpty( info ) )
  302. {
  303. EditorGUILayout.HelpBox( info, MessageType.Info );
  304. }
  305. else
  306. {
  307. GUIUtility.GetControlID( "EditorTextField".GetHashCode(), FocusType.Passive, new Rect( 0f, 0f, 0f, 0f ) );
  308. }
  309. for( int i = 0; i < properties.Length; i++ )
  310. {
  311. if( ( properties[ i ].flags & ( MaterialProperty.PropFlags.HideInInspector | MaterialProperty.PropFlags.PerRendererData ) ) == MaterialProperty.PropFlags.None )
  312. {
  313. // Removed no scale offset one line texture property for consistency :( sad face
  314. //if( ( properties[ i ].flags & MaterialProperty.PropFlags.NoScaleOffset ) == MaterialProperty.PropFlags.NoScaleOffset )
  315. //{
  316. // object obj = MaterialPropertyHandlerEx.GetHandler( mat.shader, properties[ i ].name );
  317. // if( obj != null )
  318. // {
  319. // float height = MaterialPropertyHandlerEx.GetPropertyHeight( obj, properties[ i ], properties[ i ].displayName, materialEditor );
  320. // //Rect rect = (Rect)materialEditor.GetType().InvokeMember( "GetPropertyRect", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, materialEditor, new object[] { properties[ i ], properties[ i ].displayName, true } );
  321. // Rect rect = EditorGUILayout.GetControlRect( true, height, EditorStyles.layerMaskField );
  322. // MaterialPropertyHandlerEx.OnGUI( obj, ref rect, properties[ i ], new GUIContent( properties[ i ].displayName ), materialEditor );
  323. // if( MaterialPropertyHandlerEx.PropertyDrawer( obj ) != null )
  324. // continue;
  325. // rect = EditorGUILayout.GetControlRect( true, height, EditorStyles.layerMaskField );
  326. // materialEditor.TexturePropertyMiniThumbnail( rect, properties[ i ], properties[ i ].displayName, string.Empty );
  327. // }
  328. // else
  329. // {
  330. // materialEditor.TexturePropertySingleLine( new GUIContent( properties[ i ].displayName ), properties[ i ] );
  331. // }
  332. //}
  333. //else
  334. //{
  335. float propertyHeight = materialEditor.GetPropertyHeight( properties[ i ], properties[ i ].displayName );
  336. Rect controlRect = EditorGUILayout.GetControlRect( true, propertyHeight, EditorStyles.layerMaskField, new GUILayoutOption[ 0 ] );
  337. materialEditor.ShaderProperty( controlRect, properties[ i ], properties[ i ].displayName );
  338. //}
  339. }
  340. }
  341. EditorGUILayout.Space();
  342. materialEditor.RenderQueueField();
  343. materialEditor.EnableInstancingField();
  344. materialEditor.DoubleSidedGIField();
  345. materialEditor.LightmapEmissionProperty();
  346. if( m_refreshOnUndo || EditorGUI.EndChangeCheck() )
  347. {
  348. m_refreshOnUndo = false;
  349. string isEmissive = mat.GetTag( "IsEmissive", false, "false" );
  350. if( isEmissive.Equals( "true" ) )
  351. {
  352. mat.globalIlluminationFlags &= (MaterialGlobalIlluminationFlags)3;
  353. }
  354. else
  355. {
  356. mat.globalIlluminationFlags |= MaterialGlobalIlluminationFlags.EmissiveIsBlack;
  357. }
  358. UIUtils.CopyValuesFromMaterial( mat );
  359. }
  360. if( materialEditor.RequiresConstantRepaint() && m_lastRenderedTime + 0.032999999821186066 < EditorApplication.timeSinceStartup )
  361. {
  362. this.m_lastRenderedTime = EditorApplication.timeSinceStartup;
  363. materialEditor.Repaint();
  364. }
  365. }
  366. private void Init()
  367. {
  368. string guid = EditorPrefs.GetString( PreviewModelPref, "" );
  369. if( !string.IsNullOrEmpty( guid ) )
  370. {
  371. m_targetMesh = AssetDatabase.LoadAssetAtPath<Mesh>( AssetDatabase.GUIDToAssetPath( guid ) );
  372. }
  373. }
  374. public override void OnMaterialPreviewSettingsGUI( MaterialEditor materialEditor )
  375. {
  376. base.OnMaterialPreviewSettingsGUI( materialEditor );
  377. if( UnityEditor.ShaderUtil.hardwareSupportsRectRenderTexture )
  378. {
  379. EditorGUI.BeginChangeCheck();
  380. m_targetMesh = (Mesh)EditorGUILayout.ObjectField( m_targetMesh, typeof( Mesh ), false, GUILayout.MaxWidth( 120 ) );
  381. if( EditorGUI.EndChangeCheck() )
  382. {
  383. if( m_targetMesh != null )
  384. {
  385. EditorPrefs.SetString( PreviewModelPref, AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_targetMesh ) ) );
  386. }
  387. else
  388. {
  389. EditorPrefs.SetString( PreviewModelPref, "" );
  390. }
  391. }
  392. if( m_selectedField == null )
  393. {
  394. m_selectedField = typeof( MaterialEditor ).GetField( "m_SelectedMesh", BindingFlags.Instance | BindingFlags.NonPublic );
  395. }
  396. if( m_previewDirDefault == null )
  397. {
  398. m_previewDirDefault = typeof( MaterialEditor ).GetField( "m_PreviewDir" , BindingFlags.Instance | BindingFlags.NonPublic );
  399. }
  400. m_selectedMesh = (int)m_selectedField.GetValue( materialEditor );
  401. if ( m_selectedMesh != m_prevSelectedMesh )
  402. {
  403. m_prevSelectedMesh = m_selectedMesh;
  404. if( m_targetMesh != null )
  405. {
  406. m_targetMesh = null;
  407. EditorPrefs.SetString( PreviewModelPref, "" );
  408. }
  409. }
  410. }
  411. if( GUILayout.Button( "R" ,GUILayout.MaxWidth(17), GUILayout.MaxHeight( 13 ) ) )
  412. {
  413. m_previewDir = new Vector2( 0 , 0 );
  414. if( m_previewDirDefault != null )
  415. m_previewDirDefault.SetValue( materialEditor , m_previewDir );
  416. }
  417. }
  418. public override void OnMaterialInteractivePreviewGUI( MaterialEditor materialEditor, Rect r, GUIStyle background )
  419. {
  420. if( Event.current.type == EventType.DragExited )
  421. {
  422. if( DragAndDrop.objectReferences.Length > 0 )
  423. {
  424. GameObject dropped = DragAndDrop.objectReferences[ 0 ] as GameObject;
  425. if( dropped != null )
  426. {
  427. m_targetMesh = AssetDatabase.LoadAssetAtPath<Mesh>( AssetDatabase.GetAssetPath( dropped ) );
  428. EditorPrefs.SetString( PreviewModelPref, AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_targetMesh ) ) );
  429. }
  430. }
  431. }
  432. if( m_targetMesh == null )
  433. {
  434. base.OnMaterialInteractivePreviewGUI( materialEditor, r, background );
  435. return;
  436. }
  437. Material mat = materialEditor.target as Material;
  438. if( m_previewRenderUtility == null )
  439. {
  440. m_previewRenderUtility = new PreviewRenderUtility();
  441. m_previewRenderUtility.cameraFieldOfView = 30f;
  442. }
  443. if( m_previewGUIType == null )
  444. {
  445. m_previewGUIType = Type.GetType( "PreviewGUI, UnityEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" );
  446. m_dragMethod = m_previewGUIType.GetMethod( "Drag2D", BindingFlags.Static | BindingFlags.Public );
  447. }
  448. m_previewDir = ( Vector2 )m_dragMethod.Invoke( m_previewGUIType, new object[] { m_previewDir, r } );
  449. if ( m_modelInspectorType == null )
  450. {
  451. m_modelInspectorType = Type.GetType( "UnityEditor.MeshPreview, UnityEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" );
  452. if ( m_modelInspectorType == null )
  453. {
  454. m_modelInspectorType = Type.GetType( "UnityEditor.ModelInspector, UnityEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" );
  455. }
  456. m_renderMeshMethod = m_modelInspectorType.GetMethod( "RenderMeshPreview", BindingFlags.Static | BindingFlags.NonPublic );
  457. }
  458. #if UNITY_2020_1_OR_NEWER
  459. m_previewDir = ( Vector2 )m_dragMethod.Invoke( m_previewGUIType, new object[] { m_previewDir, r } );
  460. if ( m_previewSettingsType == null )
  461. {
  462. m_previewSettingsType = m_modelInspectorType.GetNestedType( "PreviewSettings", BindingFlags.NonPublic );
  463. if ( m_previewSettingsType == null )
  464. {
  465. m_previewSettingsType = m_modelInspectorType.GetNestedType( "Settings", BindingFlags.NonPublic );
  466. }
  467. }
  468. if ( m_previewSettingsInstance == null )
  469. {
  470. m_previewSettingsInstance = Activator.CreateInstance( m_previewSettingsType );
  471. }
  472. if ( shadedMaterialInfo == null || activeMaterialInfo == null || previewDirInfo == null )
  473. {
  474. shadedMaterialInfo = m_previewSettingsType.GetField( "shadedPreviewMaterial", BindingFlags.Instance | BindingFlags.Public );
  475. activeMaterialInfo = m_previewSettingsType.GetField( "activeMaterial", BindingFlags.Instance | BindingFlags.Public );
  476. previewDirInfo = m_previewSettingsType.GetField( "previewDir", BindingFlags.Instance | BindingFlags.Public );
  477. }
  478. if ( shadedMaterialInfo == null || activeMaterialInfo == null || previewDirInfo == null )
  479. {
  480. shadedMaterialInfo = m_previewSettingsType.GetField( "m_ShadedPreviewMaterial", BindingFlags.Instance | BindingFlags.NonPublic );
  481. activeMaterialInfo = m_previewSettingsType.GetField( "m_ActiveMaterial", BindingFlags.Instance | BindingFlags.NonPublic );
  482. previewDirInfo = m_previewSettingsType.GetField( "m_PreviewDir", BindingFlags.Instance | BindingFlags.NonPublic );
  483. }
  484. shadedMaterialInfo.SetValue( m_previewSettingsInstance, mat );
  485. activeMaterialInfo.SetValue( m_previewSettingsInstance, mat );
  486. previewDirInfo.SetValue( m_previewSettingsInstance, m_previewDir );
  487. if ( Event.current.type == EventType.Repaint )
  488. {
  489. m_previewRenderUtility.BeginPreview( r, background );
  490. m_renderMeshMethod.Invoke( m_modelInspectorType, new object[] { m_targetMesh, m_previewRenderUtility, m_previewSettingsInstance, -1 } );
  491. m_previewRenderUtility.EndAndDrawPreview( r );
  492. }
  493. #else
  494. if( Event.current.type == EventType.Repaint )
  495. {
  496. m_previewRenderUtility.BeginPreview( r, background );
  497. m_renderMeshMethod.Invoke( m_modelInspectorType, new object[] { m_targetMesh, m_previewRenderUtility, mat, null, m_previewDir, -1 } );
  498. m_previewRenderUtility.EndAndDrawPreview( r );
  499. }
  500. #endif
  501. }
  502. public static MaterialEditor Instance { get { return m_instance; } set { m_instance = value; } }
  503. }
  504. }