/// <summary> /// Applied after UpdateDirty runs. /// </summary> internal static void Postfix(int __result, KAnimBatch __instance) { if (__result > 0) { KAnimMeshRendererPatches.UpdateMaterialProperties(__instance); } }
/// <summary> /// Applied before UpdateDirty runs. /// </summary> internal static bool Prefix(ref int __result, KAnimBatch __instance) { int updated = 0; //Metrics.DebugMetrics.LogCondition("batchDirty", __instance.needsWrite); if (__instance.needsWrite) { bool symbolDirty = false, overrideDirty = false; var controllers = __instance.controllers; var dirtySet = __instance.dirtySet; // Create the texture if it is null var tex = __instance.dataTex; if (tex == null || tex.floats.Length == 0) { __instance.Init(); tex = __instance.dataTex; } var overrideTex = __instance.symbolOverrideInfoTex; foreach (int index in dirtySet) { var converter = controllers[index]; if (converter is UnityEngine.Object obj && obj != null) { // Update the textures; they are different over 90% of the time, so // almost no gain from checking if actually dirty __instance.WriteBatchedAnimInstanceData(index, converter); symbolDirty |= __instance.WriteSymbolInstanceData(index, converter); if (converter.ApplySymbolOverrides()) { overrideTex = SetupOverride(__instance, overrideTex); overrideDirty |= __instance.WriteSymbolOverrideInfoTex(index, converter); } updated++; } } dirtySet.Clear(); __instance.needsWrite = false; // Write any dirty textures tex.LoadRawTextureData(); tex.Apply(); if (symbolDirty) { var symbolTex = __instance.symbolInstanceTex; symbolTex.LoadRawTextureData(); symbolTex.Apply(); } if (overrideDirty) { overrideTex.LoadRawTextureData(); overrideTex.Apply(); } // Update those mesh renderers too if (updated > 0 && FastTrackOptions.Instance.MeshRendererOptions != FastTrackOptions.MeshRendererSettings.None) { KAnimMeshRendererPatches.UpdateMaterialProperties(__instance); } } __result = updated; return(false); }