46 lines
1.6 KiB
C#
46 lines
1.6 KiB
C#
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace VRC.SDK3.Editor
|
|
{
|
|
[InitializeOnLoad]
|
|
internal static class VRCUndoPostProcessor
|
|
{
|
|
private const string ShaderField = "m_Shader";
|
|
private const string FallbackTag = "VRCFallback";
|
|
|
|
static VRCUndoPostProcessor()
|
|
{
|
|
Undo.postprocessModifications += HandleUndoPostProcess;
|
|
}
|
|
|
|
private static UndoPropertyModification[] HandleUndoPostProcess(UndoPropertyModification[] modifications)
|
|
{
|
|
foreach (UndoPropertyModification modification in modifications)
|
|
{
|
|
PropertyModification propertyMod = modification.currentValue;
|
|
if (propertyMod.propertyPath == ShaderField)
|
|
{
|
|
Shader oldShader = modification.previousValue.objectReference as Shader;
|
|
Shader newShader = propertyMod.objectReference as Shader;
|
|
|
|
// Is the shader changing?
|
|
if (oldShader != newShader)
|
|
{
|
|
Material mat = propertyMod.target as Material;
|
|
if (mat == null)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
// Clear VRCFallback as the shader changes. This attempts to avoid override tags set by community
|
|
// tooling "bleeding over" into shaders they don't control when the user swaps over directly.
|
|
mat.SetOverrideTag(FallbackTag, string.Empty);
|
|
}
|
|
}
|
|
}
|
|
|
|
return modifications;
|
|
}
|
|
}
|
|
} |