2022-03-26 10:06:54 -07:00
|
|
|
|
using UnityEngine;
|
2022-02-17 17:31:38 -08:00
|
|
|
|
|
2022-03-02 19:46:33 -08:00
|
|
|
|
namespace QSB.PlayerBodySetup.Remote;
|
|
|
|
|
|
|
|
|
|
public static class ShaderReplacer
|
2022-02-17 17:31:38 -08:00
|
|
|
|
{
|
2022-03-02 19:46:33 -08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// the materials on the prefabs have the exact same name as the ones in game.
|
|
|
|
|
/// if we just use Shader.Find, we can get the in-game ones instead of the prefab ones,
|
|
|
|
|
/// and replace the prefab ones with the in-game ones.
|
|
|
|
|
/// i am amazed that this works, and i hope it isn't super brittle.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static void ReplaceShaders(GameObject prefab)
|
2022-02-17 17:31:38 -08:00
|
|
|
|
{
|
2022-03-02 19:46:33 -08:00
|
|
|
|
foreach (var renderer in prefab.GetComponentsInChildren<Renderer>(true))
|
2022-02-17 17:31:38 -08:00
|
|
|
|
{
|
2022-03-02 19:46:33 -08:00
|
|
|
|
foreach (var material in renderer.sharedMaterials)
|
2022-02-17 17:37:56 -08:00
|
|
|
|
{
|
2022-03-02 19:46:33 -08:00
|
|
|
|
if (material == null)
|
2022-02-17 17:37:56 -08:00
|
|
|
|
{
|
2022-03-02 19:46:33 -08:00
|
|
|
|
continue;
|
2022-02-27 04:40:44 -08:00
|
|
|
|
}
|
2022-03-02 19:46:33 -08:00
|
|
|
|
|
2022-03-26 14:17:40 +00:00
|
|
|
|
var replacementShader = Shader.Find(material.shader.name);
|
|
|
|
|
if (replacementShader == null)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-10 18:56:58 -08:00
|
|
|
|
// preserve override tag and render queue (for Standard shader)
|
|
|
|
|
// keywords and properties are already preserved
|
2022-12-02 13:44:37 -08:00
|
|
|
|
if (material.renderQueue != material.shader.renderQueue)
|
|
|
|
|
{
|
|
|
|
|
var renderType = material.GetTag("RenderType", false);
|
|
|
|
|
var renderQueue = material.renderQueue;
|
|
|
|
|
material.shader = replacementShader;
|
|
|
|
|
material.SetOverrideTag("RenderType", renderType);
|
|
|
|
|
material.renderQueue = renderQueue;
|
|
|
|
|
}
|
2022-12-02 14:04:09 -08:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
material.shader = replacementShader;
|
|
|
|
|
}
|
2022-02-17 17:37:56 -08:00
|
|
|
|
}
|
2022-02-17 17:31:38 -08:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-03-26 10:06:54 -07:00
|
|
|
|
}
|