mirror of
https://gitgud.io/c0ffeeeeeeee/rimworld-animations.git
synced 2024-08-15 00:43:45 +00:00
Merge branch 'is-animating-optimization' into 'master'
Lower perfomance impact when not animating See merge request c0ffeeeeeeee/rimworld-animations!15
This commit is contained in:
commit
33ebba94a7
15 changed files with 62 additions and 117 deletions
|
@ -1,9 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using RimWorld;
|
||||
using rjw;
|
||||
using UnityEngine;
|
||||
|
@ -13,6 +9,15 @@ using Verse.Sound;
|
|||
namespace Rimworld_Animations {
|
||||
public class CompBodyAnimator : ThingComp
|
||||
{
|
||||
/// <summary>
|
||||
/// Cache of the currently animated pawns for the very fast isAnimating checks
|
||||
/// </summary>
|
||||
private static readonly HashSet<Pawn> animatingPawns = new HashSet<Pawn>();
|
||||
/// <summary>
|
||||
/// Check if the <paramref name="pawn"/> is currently animated by this comp
|
||||
/// </summary>
|
||||
public static bool IsAnimating(Pawn pawn) => animatingPawns.Contains(pawn);
|
||||
|
||||
public Pawn pawn => base.parent as Pawn;
|
||||
public PawnGraphicSet Graphics;
|
||||
|
||||
|
@ -27,9 +32,11 @@ namespace Rimworld_Animations {
|
|||
|
||||
if (value == true) {
|
||||
SexUtility.DrawNude(pawn);
|
||||
animatingPawns.Add(pawn);
|
||||
} else {
|
||||
pawn.Drawer.renderer.graphics.ResolveAllGraphics();
|
||||
actorsInCurrentAnimation = null;
|
||||
animatingPawns.Remove(pawn);
|
||||
}
|
||||
|
||||
PortraitsCache.SetDirty(pawn);
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using RimWorld;
|
||||
using RimWorld;
|
||||
using UnityEngine;
|
||||
using Verse;
|
||||
using Rimworld_Animations;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
|
||||
|
@ -17,9 +14,9 @@ namespace Rimworld_Animations {
|
|||
|
||||
if (!flags.FlagSet(PawnRenderFlags.Portrait) && layer == PawnOverlayDrawer.OverlayLayer.Head)
|
||||
{
|
||||
CompBodyAnimator pawnAnimator = pawn.TryGetComp<CompBodyAnimator>();
|
||||
if (pawnAnimator != null && pawnAnimator.isAnimating && pawn.Drawer.renderer.graphics.headGraphic != null)
|
||||
if (CompBodyAnimator.IsAnimating(pawn) && pawn.Drawer.renderer.graphics.headGraphic != null)
|
||||
{
|
||||
CompBodyAnimator pawnAnimator = pawn.TryGetComp<CompBodyAnimator>();
|
||||
pawnRot = pawnAnimator.headFacing;
|
||||
quat = Quaternion.AngleAxis(angle: pawnAnimator.headAngle, axis: Vector3.up);
|
||||
float y = drawLoc.y;
|
||||
|
|
|
@ -1,8 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections.Generic;
|
||||
using Verse;
|
||||
using RimWorld;
|
||||
using UnityEngine;
|
||||
|
@ -25,14 +21,13 @@ namespace Rimworld_Animations {
|
|||
listingStandard.GapLine();
|
||||
|
||||
|
||||
if (Find.Selector.SingleSelectedThing is Pawn) {
|
||||
if (Find.Selector.SingleSelectedThing is Pawn curPawn) {
|
||||
|
||||
Pawn curPawn = Find.Selector.SingleSelectedThing as Pawn;
|
||||
if (CompBodyAnimator.IsAnimating(curPawn)) {
|
||||
|
||||
if (curPawn.TryGetComp<CompBodyAnimator>().isAnimating) {
|
||||
|
||||
AnimationDef def = curPawn.TryGetComp<CompBodyAnimator>().CurrentAnimation;
|
||||
int ActorIndex = curPawn.TryGetComp<CompBodyAnimator>().ActorIndex;
|
||||
CompBodyAnimator compBodyAnimator = curPawn.TryGetComp<CompBodyAnimator>();
|
||||
AnimationDef def = compBodyAnimator.CurrentAnimation;
|
||||
int ActorIndex = compBodyAnimator.ActorIndex;
|
||||
float offsetX = 0, offsetZ = 0, rotation = 0;
|
||||
|
||||
string bodyTypeDef = (curPawn.story?.bodyType != null) ? curPawn.story.bodyType.ToString() : "";
|
||||
|
@ -57,8 +52,6 @@ namespace Rimworld_Animations {
|
|||
listingStandard.Label("Warning--You generally don't want to change human offsets, only alien offsets");
|
||||
}
|
||||
|
||||
bool mirrored = curPawn.TryGetComp<CompBodyAnimator>().Mirror;
|
||||
|
||||
float.TryParse(listingStandard.TextEntryLabeled("X Offset: ", offsetX.ToString()), out offsetX);
|
||||
offsetX = listingStandard.Slider(offsetX, -2, 2);
|
||||
|
||||
|
|
|
@ -23,17 +23,16 @@ namespace Rimworld_Animations {
|
|||
}
|
||||
}))();
|
||||
}
|
||||
catch (TypeLoadException ex) {
|
||||
catch (TypeLoadException) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static bool Prefix(ref Pawn ___pawn, ref Rot4 headFacing, ref Vector3 headOrigin, ref Quaternion quaternion, ref bool portrait) {
|
||||
public static bool Prefix(Pawn ___pawn, ref Rot4 headFacing, ref Vector3 headOrigin, ref Quaternion quaternion, bool portrait) {
|
||||
|
||||
CompBodyAnimator bodyAnim = ___pawn.TryGetComp<CompBodyAnimator>();
|
||||
|
||||
if (bodyAnim != null && bodyAnim.isAnimating && !portrait) {
|
||||
if (!portrait && CompBodyAnimator.IsAnimating(___pawn)) {
|
||||
|
||||
CompBodyAnimator bodyAnim = ___pawn.TryGetComp<CompBodyAnimator>();
|
||||
headFacing = bodyAnim.headFacing;
|
||||
headOrigin = new Vector3(bodyAnim.getPawnHeadPosition().x, headOrigin.y, bodyAnim.getPawnHeadPosition().z);
|
||||
quaternion = Quaternion.AngleAxis(bodyAnim.headAngle, Vector3.up);
|
||||
|
|
|
@ -1,11 +1,5 @@
|
|||
using HarmonyLib;
|
||||
using rjw;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Verse;
|
||||
|
||||
namespace Rimworld_Animations
|
||||
{
|
||||
|
@ -14,7 +8,7 @@ namespace Rimworld_Animations
|
|||
{
|
||||
public static bool Prefix(JobDriver_Sex __instance)
|
||||
{
|
||||
if (__instance.pawn.TryGetComp<CompBodyAnimator>().isAnimating)
|
||||
if (CompBodyAnimator.IsAnimating(__instance.pawn))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -1,13 +1,9 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using HarmonyLib;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using rjw;
|
||||
using System.Reflection.Emit;
|
||||
using Verse.AI;
|
||||
|
||||
namespace Rimworld_Animations
|
||||
|
@ -27,11 +23,7 @@ namespace Rimworld_Animations
|
|||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(JobDriver_JoinInBed), "MakeNewToils")]
|
||||
|
@ -66,19 +58,13 @@ namespace Rimworld_Animations
|
|||
|
||||
toils[3].AddPreTickAction(() =>
|
||||
{
|
||||
if (!__instance.Partner.TryGetComp<CompBodyAnimator>().isAnimating)
|
||||
if (!CompBodyAnimator.IsAnimating(__instance.Partner))
|
||||
{
|
||||
__instance.pawn.TryGetComp<CompBodyAnimator>().isAnimating = false;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
__result = toils.AsEnumerable();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using HarmonyLib;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
|
@ -158,10 +156,12 @@ namespace Rimworld_Animations {
|
|||
|
||||
public static void Postfix(ref JobDriver_SexBaseInitiator __instance) {
|
||||
|
||||
if ((__instance.Target as Pawn)?.jobs?.curDriver is JobDriver_SexBaseReciever) {
|
||||
if (__instance.pawn.TryGetComp<CompBodyAnimator>().isAnimating) {
|
||||
Pawn reciever = __instance.Target as Pawn;
|
||||
|
||||
List<Pawn> parteners = ((__instance.Target as Pawn)?.jobs.curDriver as JobDriver_SexBaseReciever).parteners;
|
||||
if (reciever?.jobs?.curDriver is JobDriver_SexBaseReciever recieverJobDriver) {
|
||||
if (CompBodyAnimator.IsAnimating(__instance.pawn)) {
|
||||
|
||||
List<Pawn> parteners = recieverJobDriver.parteners;
|
||||
|
||||
for (int i = 0; i < parteners.Count; i++) {
|
||||
|
||||
|
@ -173,13 +173,13 @@ namespace Rimworld_Animations {
|
|||
|
||||
__instance.Target.TryGetComp<CompBodyAnimator>().isAnimating = false;
|
||||
|
||||
if (xxx.is_human((__instance.Target as Pawn))) {
|
||||
(__instance.Target as Pawn)?.Drawer.renderer.graphics.ResolveApparelGraphics();
|
||||
PortraitsCache.SetDirty((__instance.Target as Pawn));
|
||||
if (xxx.is_human(reciever)) {
|
||||
reciever?.Drawer.renderer.graphics.ResolveApparelGraphics();
|
||||
PortraitsCache.SetDirty(reciever);
|
||||
}
|
||||
}
|
||||
|
||||
((__instance.Target as Pawn)?.jobs.curDriver as JobDriver_SexBaseReciever).parteners.Remove(__instance.pawn);
|
||||
recieverJobDriver?.parteners.Remove(__instance.pawn);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
using HarmonyLib;
|
||||
/*using HarmonyLib;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
@ -19,4 +19,4 @@ namespace Rimworld_Animations
|
|||
}
|
||||
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
|
|
@ -5,7 +5,6 @@ using HarmonyLib;
|
|||
using RimWorld;
|
||||
using Verse;
|
||||
using UnityEngine;
|
||||
using System.Reflection;
|
||||
using System.Reflection.Emit;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
|
@ -31,12 +30,10 @@ namespace Rimworld_Animations {
|
|||
|
||||
PawnGraphicSet graphics = __instance.graphics;
|
||||
Pawn pawn = graphics.pawn;
|
||||
CompBodyAnimator bodyAnim = pawn.TryGetComp<CompBodyAnimator>();
|
||||
|
||||
|
||||
if (bodyAnim != null && bodyAnim.isAnimating && pawn.Map == Find.CurrentMap)
|
||||
if (CompBodyAnimator.IsAnimating(pawn) && pawn.Map == Find.CurrentMap)
|
||||
{
|
||||
bodyAnim.animatePawnBody(ref rootLoc, ref angle, ref bodyFacing);
|
||||
pawn.TryGetComp<CompBodyAnimator>().animatePawnBody(ref rootLoc, ref angle, ref bodyFacing);
|
||||
|
||||
}
|
||||
|
||||
|
@ -75,7 +72,7 @@ namespace Rimworld_Animations {
|
|||
else
|
||||
{
|
||||
yield return ins[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,29 +1,23 @@
|
|||
using HarmonyLib;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Verse;
|
||||
|
||||
namespace Rimworld_Animations {
|
||||
[HarmonyPatch(typeof(Thing), "Rotation", MethodType.Getter)]
|
||||
[HarmonyPatch(typeof(Thing), nameof(Thing.Rotation), MethodType.Getter)]
|
||||
public static class HarmonyPatch_PawnRotation {
|
||||
|
||||
public static bool Prefix(Thing __instance, ref Rot4 __result) {
|
||||
|
||||
if(!(__instance is Pawn) || (__instance as Pawn)?.TryGetComp<CompBodyAnimator>() == null || !(__instance as Pawn).TryGetComp<CompBodyAnimator>().isAnimating) {
|
||||
if (!(__instance is Pawn pawn)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!CompBodyAnimator.IsAnimating(pawn)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Pawn pawn = (__instance as Pawn);
|
||||
__result = pawn.TryGetComp<CompBodyAnimator>().bodyFacing;
|
||||
|
||||
return false;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,9 +1,4 @@
|
|||
using HarmonyLib;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using Verse;
|
||||
|
||||
|
@ -13,10 +8,9 @@ namespace Rimworld_Animations {
|
|||
public static class HarmonyPatch_Pawn_DrawTracker {
|
||||
public static bool Prefix(ref Pawn ___pawn, ref Vector3 __result) {
|
||||
|
||||
CompBodyAnimator bodyAnim = ___pawn.TryGetComp<CompBodyAnimator>();
|
||||
|
||||
if (bodyAnim != null && bodyAnim.isAnimating) {
|
||||
__result = ___pawn.TryGetComp<CompBodyAnimator>().anchor + ___pawn.TryGetComp<CompBodyAnimator>().deltaPos;
|
||||
if (CompBodyAnimator.IsAnimating(___pawn)) {
|
||||
CompBodyAnimator bodyAnim = ___pawn.TryGetComp<CompBodyAnimator>();
|
||||
__result = bodyAnim.anchor + bodyAnim.deltaPos;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -1,9 +1,4 @@
|
|||
using HarmonyLib;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Verse;
|
||||
|
||||
namespace Rimworld_Animations
|
||||
|
@ -13,8 +8,7 @@ namespace Rimworld_Animations
|
|||
{
|
||||
public static bool Prefix(ref Pawn ___pawn)
|
||||
{
|
||||
|
||||
if (___pawn.TryGetComp<CompBodyAnimator>() != null && ___pawn.TryGetComp<CompBodyAnimator>().isAnimating)
|
||||
if (CompBodyAnimator.IsAnimating(___pawn))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -1,12 +1,6 @@
|
|||
using HarmonyLib;
|
||||
using RimWorld;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection.Emit;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using Verse;
|
||||
|
||||
namespace Rimworld_Animations
|
||||
|
@ -16,18 +10,16 @@ namespace Rimworld_Animations
|
|||
{
|
||||
static bool ClearCache(Pawn pawn)
|
||||
{
|
||||
return pawn.IsInvisible() || (pawn.TryGetComp<CompBodyAnimator>() != null && pawn.TryGetComp<CompBodyAnimator>().isAnimating);
|
||||
return pawn.IsInvisible() || CompBodyAnimator.IsAnimating(pawn);
|
||||
}
|
||||
|
||||
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
|
||||
{
|
||||
var list = instructions.ToList();
|
||||
|
||||
foreach (CodeInstruction i in instructions)
|
||||
{
|
||||
if (i.OperandIs(AccessTools.Method(typeof(PawnUtility), "IsInvisible")))
|
||||
if (i.Calls(AccessTools.Method(typeof(PawnUtility), nameof(PawnUtility.IsInvisible))))
|
||||
{
|
||||
yield return new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(PawnRenderer_RenderPawnAt_Patch), "ClearCache"));
|
||||
yield return CodeInstruction.Call(typeof(PawnRenderer_RenderPawnAt_Patch), nameof(ClearCache));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -169,11 +169,10 @@ namespace Rimworld_Animations {
|
|||
return;
|
||||
}
|
||||
|
||||
CompBodyAnimator pawnAnimator = pawn.TryGetComp<CompBodyAnimator>();
|
||||
|
||||
if (pawnAnimator == null || !pawnAnimator.isAnimating) {
|
||||
if (!CompBodyAnimator.IsAnimating(pawn)) {
|
||||
GenDraw.DrawMeshNowOrLater(mesh, loc, quaternion, material, drawNow);
|
||||
} else {
|
||||
CompBodyAnimator pawnAnimator = pawn.TryGetComp<CompBodyAnimator>();
|
||||
Vector3 pawnHeadPosition = pawnAnimator.getPawnHeadPosition();
|
||||
pawnHeadPosition.y = loc.y;
|
||||
GenDraw.DrawMeshNowOrLater(MeshPool.humanlikeHeadSet.MeshAt(pawnAnimator.headFacing), pawnHeadPosition, Quaternion.AngleAxis(pawnAnimator.headAngle, Vector3.up), material, true);
|
||||
|
@ -184,14 +183,13 @@ namespace Rimworld_Animations {
|
|||
{
|
||||
if (flags.FlagSet(PawnRenderFlags.Portrait)) return;
|
||||
|
||||
CompBodyAnimator anim = pawn.TryGetComp<CompBodyAnimator>();
|
||||
if (anim.isAnimating)
|
||||
if (CompBodyAnimator.IsAnimating(pawn))
|
||||
{
|
||||
CompBodyAnimator anim = pawn.TryGetComp<CompBodyAnimator>();
|
||||
bodyFacing = anim.headFacing;
|
||||
angle = anim.headAngle;
|
||||
quat = Quaternion.AngleAxis(anim.headAngle, Vector3.up);
|
||||
pos = anim.getPawnHeadOffset();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -202,12 +200,12 @@ namespace Rimworld_Animations {
|
|||
return;
|
||||
}
|
||||
|
||||
CompBodyAnimator pawnAnimator = pawn.TryGetComp<CompBodyAnimator>();
|
||||
|
||||
if (pawnAnimator == null || !pawnAnimator.isAnimating || portrait) {
|
||||
if (!CompBodyAnimator.IsAnimating(pawn) || portrait) {
|
||||
GenDraw.DrawMeshNowOrLater(mesh, loc, quaternion, material, portrait);
|
||||
}
|
||||
else {
|
||||
CompBodyAnimator pawnAnimator = pawn.TryGetComp<CompBodyAnimator>();
|
||||
Vector3 pawnHeadPosition = pawnAnimator.getPawnHeadPosition();
|
||||
pawnHeadPosition.x *= bodySizeFactor;
|
||||
pawnHeadPosition.x *= bodySizeFactor;
|
||||
|
|
|
@ -51,7 +51,7 @@ namespace Rimworld_Animations {
|
|||
public static bool Prefix_AnimateHeadAddons(PawnRenderFlags renderFlags, Vector3 vector, Vector3 headOffset, Pawn pawn, Quaternion quat, Rot4 rotation)
|
||||
{
|
||||
|
||||
if (renderFlags.FlagSet(PawnRenderFlags.Portrait) || pawn.TryGetComp<CompBodyAnimator>() == null || !pawn.TryGetComp<CompBodyAnimator>().isAnimating) return true;
|
||||
if (renderFlags.FlagSet(PawnRenderFlags.Portrait) || !CompBodyAnimator.IsAnimating(pawn)) return true;
|
||||
if (!(pawn.def is ThingDef_AlienRace alienProps) || renderFlags.FlagSet(PawnRenderFlags.Invisible)) return false;
|
||||
|
||||
List<AlienPartGenerator.BodyAddon> addons = alienProps.alienRace.generalSettings.alienPartGenerator.bodyAddons;
|
||||
|
|
Loading…
Reference in a new issue