You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
4.9 KiB
C#

4 years ago
using UnityEngine;
using UnityEngine.Rendering;
namespace FluffyGroomingTool {
public static class DefaultMaterialLoader {
public static void loadDefaultMaterial(out bool isHdrp, out bool isUrp, ref Material material, out Material windMaterial,
ref Material motionVectorMaterial, string materialPostfix, Renderer renderer) {
isHdrp = DefaultMaterialLoader.isHdrp();
isUrp = DefaultMaterialLoader.isUrp();
windMaterial = null;
#if UNITY_EDITOR
if (!isHdrp) windMaterial = errorCheckMaterial("Hidden/WindContribution");
#endif
if (isHdrp) {
if (material == null) material = createMaterial("HDRPDefaultFur" + materialPostfix, BASE_COLOR, BASE_COLOR_MAP, renderer);
motionVectorMaterial = motionVectorMaterial ? motionVectorMaterial : Resources.Load<Material>("FurMotionVector");
#if UNITY_EDITOR
windMaterial = errorCheckMaterial("Hidden/HDRPWindContribution");
#endif
}
else if (isUrp) {
if (material == null) material = createMaterial("URPDefaultFur" + materialPostfix, MAIN_COLOR, MAIN_COLOR_TEXTURE, renderer);
}
else {
motionVectorMaterial =
motionVectorMaterial ? motionVectorMaterial : errorCheckMaterial("Hidden/BuiltInMotionVectorOnly");
if (material == null) material = createMaterial("BIRPDefaultFur" + materialPostfix, MAIN_COLOR_B, MAIN_COLOR_TEXTURE_B, renderer);
}
}
public static bool isUrp() {
return GraphicsSettings.currentRenderPipeline && GraphicsSettings.currentRenderPipeline.GetType().ToString().Contains("Universal");
}
public static bool isHdrp() {
return GraphicsSettings.currentRenderPipeline &&
GraphicsSettings.currentRenderPipeline.GetType().ToString().Contains("HighDefinition");
}
private static Material errorCheckMaterial(string sharedPath) {
var shader = Shader.Find(sharedPath);
if (shader == null) {
Debug.LogError(
"Could not find the Fluffy shaders for your rendering pipeline. Please import the Shaders from unityPackage in FluffyGroomingTool/Shader/");
return null;
}
return new Material(shader);
}
private static Material createMaterial(string name, int colorName, int textureName, Renderer renderer) {
var material = Object.Instantiate(Resources.Load<Material>(name));
var sourceMaterialTexture = tryToGetSourceTexture(renderer);
if (sourceMaterialTexture != null) material.SetTexture(textureName, sourceMaterialTexture);
var sourceMaterialColor = tryToGetSourceColor(renderer);
if (sourceMaterialColor != null) material.SetColor(colorName, (Color) sourceMaterialColor);
return material;
}
private static readonly int MAIN_TEX = Shader.PropertyToID("_MainTex");
private static readonly int BASE_COLOR_MAP = Shader.PropertyToID("_BaseColorMap");
private static readonly int MAIN_COLOR_TEXTURE = Shader.PropertyToID("_MainColorTexture");
private static readonly int MAIN_COLOR_TEXTURE_B = Shader.PropertyToID("_MainColorTextureB");
private static readonly int COLOR = Shader.PropertyToID("_Color");
private static readonly int BASE_COLOR = Shader.PropertyToID("_BaseColor");
private static readonly int MAIN_COLOR = Shader.PropertyToID("_MainColor");
private static readonly int MAIN_COLOR_B = Shader.PropertyToID("_MainColorB");
private static Texture tryToGetSourceTexture(Renderer renderer) {
if (renderer == null) return null;
var material = renderer.sharedMaterial;
if (material != null) {
if (material.HasTexture(MAIN_TEX)) return material.GetTexture(MAIN_TEX);
if (material.HasTexture(BASE_COLOR_MAP)) return material.GetTexture(BASE_COLOR_MAP);
if (material.HasTexture(MAIN_COLOR_TEXTURE)) return material.GetTexture(MAIN_COLOR_TEXTURE);
if (material.HasTexture(MAIN_COLOR_TEXTURE_B)) return material.GetTexture(MAIN_COLOR_TEXTURE_B);
}
return null;
}
private static Color? tryToGetSourceColor(Renderer renderer) {
if (renderer == null) return null;
var material = renderer.sharedMaterial;
if (material != null) {
if (material.HasColor(COLOR)) return material.GetColor(COLOR);
if (material.HasColor(BASE_COLOR)) return material.GetColor(BASE_COLOR);
if (material.HasColor(MAIN_COLOR)) return material.GetColor(MAIN_COLOR);
if (material.HasColor(MAIN_COLOR_B)) return material.GetColor(MAIN_COLOR_B);
}
return null;
}
}
}