using System;
using UnityEngine.Rendering;
using System.Reflection;
namespace UnityEngine.ProBuilder
{
///
/// Access the built-in materials that ProBuilder uses.
///
public static class BuiltinMaterials
{
static bool s_IsInitialized;
///
/// A shader used to highlight face selections.
///
public const string faceShader = "Hidden/ProBuilder/FaceHighlight";
///
/// A shader used to highlight edge selections.
///
///
/// If the graphics device does not support geometry shaders, this shader will not be compiled.
/// Use in that case.
///
public const string lineShader = "Hidden/ProBuilder/LineBillboard";
///
/// A shader used to draw camera facing billboards from a single vertex.
///
///
/// If the graphics device does not support geometry shaders, this shader will not be compiled.
/// Use in that case.
///
public const string pointShader = "Hidden/ProBuilder/PointBillboard";
///
/// A fallback shader used to draw lines when the graphics device does not support geometry shaders.
///
///
public const string wireShader = "Hidden/ProBuilder/FaceHighlight";
///
/// A fallback shader used to draw billboards when the graphics device does not support geometry shaders.
///
///
public const string dotShader = "Hidden/ProBuilder/VertexShader";
internal static readonly Color previewColor = new Color(.5f, .9f, 1f, .56f);
static Shader s_SelectionPickerShader;
static bool s_GeometryShadersSupported;
static Material s_DefaultMaterial;
static Material s_FacePickerMaterial;
static Material s_VertexPickerMaterial;
static Material s_EdgePickerMaterial;
static Material s_UnityDefaultDiffuse;
static Material s_UnlitVertexColorMaterial;
static Material s_ShapePreviewMaterial;
static void Init()
{
if (s_IsInitialized)
return;
s_IsInitialized = true;
var geo = Shader.Find(lineShader);
s_GeometryShadersSupported = geo != null && geo.isSupported;
// ProBuilder default
if (GraphicsSettings.renderPipelineAsset != null)
{
#if UNITY_2019_1_OR_NEWER
s_DefaultMaterial = GraphicsSettings.renderPipelineAsset.defaultMaterial;
#else
s_DefaultMaterial = GraphicsSettings.renderPipelineAsset.GetDefaultMaterial();
#endif
}
else
{
s_DefaultMaterial = (Material)Resources.Load("Materials/ProBuilderDefault", typeof(Material));
if (s_DefaultMaterial == null || !s_DefaultMaterial.shader.isSupported)
s_DefaultMaterial = GetLegacyDiffuse();
}
// SelectionPicker shader
s_SelectionPickerShader = (Shader)Shader.Find("Hidden/ProBuilder/SelectionPicker");
if ((s_FacePickerMaterial = Resources.Load("Materials/FacePicker")) == null)
{
Log.Error("FacePicker material not loaded... please re-install ProBuilder to fix this error.");
s_FacePickerMaterial = new Material(Shader.Find("Hidden/ProBuilder/FacePicker"));
}
if ((s_VertexPickerMaterial = Resources.Load("Materials/VertexPicker")) == null)
{
Log.Error("VertexPicker material not loaded... please re-install ProBuilder to fix this error.");
s_VertexPickerMaterial = new Material(Shader.Find("Hidden/ProBuilder/VertexPicker"));
}
if ((s_EdgePickerMaterial = Resources.Load("Materials/EdgePicker")) == null)
{
Log.Error("EdgePicker material not loaded... please re-install ProBuilder to fix this error.");
s_EdgePickerMaterial = new Material(Shader.Find("Hidden/ProBuilder/EdgePicker"));
}
s_UnlitVertexColorMaterial = (Material)Resources.Load("Materials/UnlitVertexColor", typeof(Material));
s_ShapePreviewMaterial = new Material(s_DefaultMaterial.shader);
s_ShapePreviewMaterial.hideFlags = HideFlags.HideAndDontSave;
if (s_ShapePreviewMaterial.HasProperty("_MainTex"))
s_ShapePreviewMaterial.mainTexture = (Texture2D)Resources.Load("Textures/GridBox_Default");
if (s_ShapePreviewMaterial.HasProperty("_Color"))
s_ShapePreviewMaterial.SetColor("_Color", previewColor);
}
///
/// Return true if the current graphics device supports geometry shaders, and false if it does not.
///
public static bool geometryShadersSupported
{
get
{
Init();
return s_GeometryShadersSupported;
}
}
///
/// The default ProBuilder material.
///
///
/// When using the Scriptable Render Pipeline this returns the default material for that pipeline.
///
public static Material defaultMaterial
{
get
{
Init();
return s_DefaultMaterial;
}
}
///
/// Shader used in selection picking functions.
///
internal static Shader selectionPickerShader
{
get
{
Init();
return s_SelectionPickerShader;
}
}
///
/// Material used for face picking functions.
///
internal static Material facePickerMaterial
{
get
{
Init();
return s_FacePickerMaterial;
}
}
///
/// Material used for vertex picking functions.
///
internal static Material vertexPickerMaterial
{
get
{
Init();
return s_VertexPickerMaterial;
}
}
///
/// Material used for edge picking functions.
///
internal static Material edgePickerMaterial
{
get
{
Init();
return s_EdgePickerMaterial;
}
}
///
/// The ProBuilder "Trigger" entity type material.
///
internal static Material triggerMaterial
{
get
{
Init();
return (Material)Resources.Load("Materials/Trigger", typeof(Material));
}
}
///
/// The ProBuilder "Collider" entity type material.
///
internal static Material colliderMaterial
{
get
{
Init();
return (Material)Resources.Load("Materials/Collider", typeof(Material));
}
}
///
/// The ProBuilder "NoDraw" material. Faces with this material are hidden when the game is played.
///
[Obsolete("NoDraw is no longer supported.")]
internal static Material noDrawMaterial
{
get
{
Init();
return (Material)Resources.Load("Materials/NoDraw", typeof(Material));
}
}
///
/// Default Unity diffuse material.
///
internal static Material GetLegacyDiffuse()
{
Init();
if (s_UnityDefaultDiffuse == null)
{
var mi = typeof(Material).GetMethod("GetDefaultMaterial",
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
if (mi != null)
s_UnityDefaultDiffuse = mi.Invoke(null, null) as Material;
if (s_UnityDefaultDiffuse == null)
{
var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
s_UnityDefaultDiffuse = go.GetComponent().sharedMaterial;
UnityEngine.Object.DestroyImmediate(go);
}
}
return s_UnityDefaultDiffuse;
}
///
/// An unlit vertex color material.
///
internal static Material unlitVertexColor
{
get
{
Init();
return s_UnlitVertexColorMaterial;
}
}
internal static Material ShapePreviewMaterial
{
get
{
Init();
return s_ShapePreviewMaterial;
}
}
}
}