diff --git a/Patch_FacialAnimation/1.5/Patches/FacialAnimationPatch.xml b/Patch_FacialAnimation/1.5/Patches/FacialAnimationPatch.xml new file mode 100644 index 00000000..4d0c0061 --- /dev/null +++ b/Patch_FacialAnimation/1.5/Patches/FacialAnimationPatch.xml @@ -0,0 +1,13 @@ + + + + + + + /Defs/FacialAnimation.FaceAnimationDef[defName="AttackMelee"]/targetJobs + +
  • AM_InAnimation
  • +
  • AM_GrapplePawn
  • +
    +
    +
    \ No newline at end of file diff --git a/Source/AlienRacesPatch/AlienRacesPatch.csproj b/Source/AlienRacesPatch/AlienRacesPatch.csproj index 1fcf78e4..36d97e45 100644 --- a/Source/AlienRacesPatch/AlienRacesPatch.csproj +++ b/Source/AlienRacesPatch/AlienRacesPatch.csproj @@ -1,7 +1,5 @@  - - net48 Library diff --git a/Source/AnimationMod/AnimRenderer.cs b/Source/AnimationMod/AnimRenderer.cs index 7e171b43..87c40965 100644 --- a/Source/AnimationMod/AnimRenderer.cs +++ b/Source/AnimationMod/AnimRenderer.cs @@ -182,9 +182,7 @@ private static void DrawSingle(AnimRenderer renderer, float? dt, Action eventOutput, bool cullDraw, Action labelDraw = null) { - Core.Log("Start draw 2"); if (IsDestroyed) return; @@ -736,8 +733,6 @@ public void Draw(float? atTime, float dt, Action eventO if (item != null) item.MirrorHorizontal = MirrorHorizontal; - Core.Log("A"); - if (eventOutput != null) Seek(atTime, dt, e => eventOutput(this, e)); else @@ -757,17 +752,11 @@ public void Draw(float? atTime, float dt, Action eventO path.Draw(time); timer2.GetElapsedMilliseconds(out SweepMS); - Core.Log("B"); - - foreach (var snap in snapshots) { if (!ShouldDraw(snap)) continue; - Core.Log($"Start {snap.PartName}"); - - var tex = ResolveTexture(snap); if (tex == null) continue; @@ -803,8 +792,6 @@ public void Draw(float? atTime, float dt, Action eventO bool useMPB = forceMPB || ov.UseMPB; var color = snap.FinalColor; - Core.Log($" - {snap.PartName} draw..."); - int passes = 1; for (int i = 0; i < passes; i++) { @@ -846,15 +833,11 @@ public void Draw(float? atTime, float dt, Action eventO var finalMpb = useMPB ? pb : null; - Core.Log("Pre render..."); AnimationRendererWorker?.PreRenderPart(snap, ov, ref mesh, ref matrix, ref mat, ref finalMpb); - Core.Log("Post-Pre render..."); Graphics.DrawMesh(mesh, matrix, mat, 0, Camera, 0, finalMpb); } } - Core.Log("Done"); - DrawPawns(labelDraw); timer.GetElapsedMilliseconds(out DrawMS); @@ -991,9 +974,11 @@ protected void DrawPawns(Action labelDraw = null) Patch_PawnUtility_IsInvisible.IsRendering = true; Patch_PawnRenderer_DrawInvisibleShadow.Suppress = suppressShadow; // In 1.4 shadow rendering is baked into RenderPawnAt and may need to be prevented. + PrePawnSpecialRender?.Invoke(pawn, this); pawn.Drawer.renderer.RenderPawnAt(pos, dir, true); // This direction here is not the final one. + PostPawnSpecialRender?.Invoke(pawn, this); Patch_PawnRenderer_DrawInvisibleShadow.Suppress = false; Patch_PawnUtility_IsInvisible.IsRendering = false; } diff --git a/Source/AnimationMod/AnimationMod.csproj b/Source/AnimationMod/AnimationMod.csproj index 34dc7493..a8c3c8e3 100644 --- a/Source/AnimationMod/AnimationMod.csproj +++ b/Source/AnimationMod/AnimationMod.csproj @@ -1,7 +1,5 @@  - - net472 diff --git a/Source/AnimationMod/Patches/Patch_PawnRenderer_DrawEquipmentAiming.cs b/Source/AnimationMod/Patches/Patch_PawnRenderer_DrawEquipmentAiming.cs index f9031aaf..0ce9295d 100644 --- a/Source/AnimationMod/Patches/Patch_PawnRenderer_DrawEquipmentAiming.cs +++ b/Source/AnimationMod/Patches/Patch_PawnRenderer_DrawEquipmentAiming.cs @@ -8,21 +8,20 @@ namespace AM.Patches; /// /// Used to override drawing melee weapons. /// -[HarmonyPatch(typeof(PawnRenderUtility), nameof(PawnRenderUtility.DrawEquipmentAndApparelExtras))] +[HarmonyPatch(typeof(PawnRenderUtility), nameof(PawnRenderUtility.DrawEquipmentAiming))] public static class Patch_PawnRenderer_DrawEquipment { [HarmonyPriority(Priority.First)] [HarmonyBefore("com.yayo.yayoAni")] - private static bool Prefix(Pawn pawn) - { - return WorkerMethod(pawn); - } - - public static bool WorkerMethod(Pawn pawn) + private static bool Prefix(Thing eq) { if (!Core.Settings.AnimateAtIdle) return true; + var pawn = eq.TryGetComp()?.Holder; + if (pawn == null) + return true; + var comp = pawn.GetComp(); if (comp == null) return true; // Why would this ever be the case? Better safe than sorry though. diff --git a/Source/AnimationMod/Patches/Patch_PawnRenderer_RenderPawnAt.cs b/Source/AnimationMod/Patches/Patch_PawnRenderer_RenderPawnAt.cs index ec2ac8f6..eafb1a0b 100644 --- a/Source/AnimationMod/Patches/Patch_PawnRenderer_RenderPawnAt.cs +++ b/Source/AnimationMod/Patches/Patch_PawnRenderer_RenderPawnAt.cs @@ -7,14 +7,18 @@ namespace AM.Patches; /// /// Simply prevents the regular RenderPawnAt method from running while a pawn in being animated. /// This disables the regular rendering whenever a pawn in being animated. +/// Additionally, modifies PawnRenderer.results to make sure that the RenderPawnInternal method gets called every frame +/// while in an animation. /// [HarmonyPatch(typeof(PawnRenderer), nameof(PawnRenderer.RenderPawnAt))] public static class Patch_PawnRenderer_RenderPawnAt { public static bool AllowNext; + private static PawnRenderer.PreRenderResults? storedResultsTemp; + [HarmonyPriority(Priority.First)] - public static bool Prefix(Pawn ___pawn) + public static bool Prefix(Pawn ___pawn, ref PawnRenderer.PreRenderResults ___results) { var anim = PatchMaster.GetAnimator(___pawn); @@ -29,7 +33,25 @@ public static bool Prefix(Pawn ___pawn) JobDriver_GrapplePawn.DrawEnsnaringRope(___pawn, job); } + if (AllowNext) + { + storedResultsTemp = ___results; + ___results.showBody = true; + ___results.useCached = false; + ___results.valid = true; + } + AllowNext = false; return true; } + + [HarmonyPriority(Priority.First)] + public static void Postfix(ref PawnRenderer.PreRenderResults ___results) + { + if (storedResultsTemp != null) + { + ___results = storedResultsTemp.Value; + storedResultsTemp = null; + } + } } \ No newline at end of file diff --git a/Source/AnimationMod/Patches/Patch_PawnRenderer_RenderPawnInternal.cs b/Source/AnimationMod/Patches/Patch_PawnRenderer_RenderPawnInternal.cs index df7d3e62..6d5e1d48 100644 --- a/Source/AnimationMod/Patches/Patch_PawnRenderer_RenderPawnInternal.cs +++ b/Source/AnimationMod/Patches/Patch_PawnRenderer_RenderPawnInternal.cs @@ -32,8 +32,18 @@ public enum DrawMode [HarmonyPriority(Priority.Last)] // As late as possible. We want to be the last to modify results. [HarmonyAfter("com.yayo.yayoAni")] // Go away. [HarmonyBefore("rimworld.Nals.FacialAnimation")] // Must go before facial animation otherwise the face gets fucky. - private static bool Prefix(Pawn ___pawn, ref PawnDrawParms parms) + private static bool Prefix(PawnRenderer __instance, Pawn ___pawn, ref PawnDrawParms parms) { + //parms.matrix + + __instance.renderTree.ParallelPreDraw(parms); + + return true; + + // Do not modify when the result will be stored in cache. + if (parms.Cache) + return true; + float angle = parms.matrix.rotation.eulerAngles.y; float oldAngle = angle; @@ -42,6 +52,19 @@ private static bool Prefix(Pawn ___pawn, ref PawnDrawParms parms) ref Rot4 bodyFacing = ref parms.facing; ref PawnRenderFlags flags = ref parms.flags; + if (AllowNext) + { + //parms.matrix *= Matrix4x4.Scale(0.5f * Vector3.one); + //__instance.renderTree.SetDirty(); + //__instance.EnsureGraphicsInitialized(); + //parms.coveredInFoam = true; + AllowNext = false; + return true; + } + + + return false; + bool result = ModifyRenderData(___pawn, ref bodyFacing, ref angle, ref flags, ref renderBody); if (renderBody) @@ -52,7 +75,7 @@ private static bool Prefix(Pawn ___pawn, ref PawnDrawParms parms) float delta = oldAngle - angle; if (Math.Abs(delta) > 0.001f) { - parms.matrix *= Matrix4x4.Rotate(Quaternion.Euler(0, delta, 0)); + parms.matrix *= Matrix4x4.Rotate(Quaternion.Euler(45, delta, 0)); } return result; @@ -74,25 +97,29 @@ public static bool ModifyRenderData(Pawn ___pawn, ref Rot4 bodyFacing, ref float { if (!DoNotModify) { - var part = NextDrawMode == DrawMode.HeadOnly ? anim.GetPawnHead(___pawn) : anim.GetPawnBody(___pawn); - var snapshot = anim.GetSnapshot(part); - angle = snapshot.GetWorldRotation(); - - bodyFacing = NextDrawMode == DrawMode.HeadOnly ? HeadRotation : snapshot.GetWorldDirection(); - - switch (NextDrawMode) - { - case DrawMode.BodyOnly: - // Render head stump, do not render head gear. - flags |= PawnRenderFlags.HeadStump; - flags &= ~PawnRenderFlags.Headgear; - break; - - case DrawMode.HeadOnly: - // Do not render body. - renderBody = false; - break; - } + //var part = NextDrawMode == DrawMode.HeadOnly ? anim.GetPawnHead(___pawn) : anim.GetPawnBody(___pawn); + //var snapshot = anim.GetSnapshot(part); + //angle = snapshot.GetWorldRotation(); + + angle = 5; + bodyFacing = Rot4.East; + renderBody = false; + + //bodyFacing = NextDrawMode == DrawMode.HeadOnly ? HeadRotation : snapshot.GetWorldDirection(); + + //switch (NextDrawMode) + //{ + // case DrawMode.BodyOnly: + // // Render head stump, do not render head gear. + // flags |= PawnRenderFlags.HeadStump; + // flags &= ~PawnRenderFlags.Headgear; + // break; + + // case DrawMode.HeadOnly: + // // Do not render body. + // renderBody = false; + // break; + //} } if (!AllowNext) @@ -106,7 +133,7 @@ public static bool ModifyRenderData(Pawn ___pawn, ref Rot4 bodyFacing, ref float private static bool RenderStandaloneHeadMode(ref Rot4 bodyFacing, ref PawnRenderFlags flags, ref float angle, ref bool renderBody) { // Add headgear, remove head stump. - flags |= PawnRenderFlags.Headgear; + flags |= PawnRenderFlags.Headgear | PawnRenderFlags.DrawNow; flags &= ~PawnRenderFlags.HeadStump; angle = StandaloneHeadRotation; @@ -114,4 +141,4 @@ private static bool RenderStandaloneHeadMode(ref Rot4 bodyFacing, ref PawnRender renderBody = false; return true; } -} \ No newline at end of file +} diff --git a/Source/AnimationMod/Patches/Patch_PawnUtility_IsInvisible.cs b/Source/AnimationMod/Patches/Patch_PawnUtility_IsInvisible.cs index b646d8f8..2e0c0c27 100644 --- a/Source/AnimationMod/Patches/Patch_PawnUtility_IsInvisible.cs +++ b/Source/AnimationMod/Patches/Patch_PawnUtility_IsInvisible.cs @@ -4,9 +4,6 @@ namespace AM.Patches; -/* - * Note: this changed in RW 1.5, the method that needs patching has changed. - */ /// /// Make pawns be considered invisible during animations. diff --git a/Source/CAI5000Patch/CAI5000Patch.csproj b/Source/CAI5000Patch/CAI5000Patch.csproj index f81dd55e..562a1483 100644 --- a/Source/CAI5000Patch/CAI5000Patch.csproj +++ b/Source/CAI5000Patch/CAI5000Patch.csproj @@ -1,7 +1,5 @@  - - net472 Library diff --git a/Source/CombatExtendedPatch/CombatExtendedPatch.csproj b/Source/CombatExtendedPatch/CombatExtendedPatch.csproj index 3494c348..d49ea916 100644 --- a/Source/CombatExtendedPatch/CombatExtendedPatch.csproj +++ b/Source/CombatExtendedPatch/CombatExtendedPatch.csproj @@ -1,7 +1,5 @@ - - net472 Library diff --git a/Source/GlobalCommon.targets b/Source/Directory.Build.props similarity index 100% rename from Source/GlobalCommon.targets rename to Source/Directory.Build.props diff --git a/Source/LightsaberPatch/LightsaberPatch.csproj b/Source/LightsaberPatch/LightsaberPatch.csproj index eeef3846..bbf91bc2 100644 --- a/Source/LightsaberPatch/LightsaberPatch.csproj +++ b/Source/LightsaberPatch/LightsaberPatch.csproj @@ -1,7 +1,5 @@  - - net480 Library diff --git a/Source/PerformanceOptimizerPatch/PerformanceOptimizerPatch.csproj b/Source/PerformanceOptimizerPatch/PerformanceOptimizerPatch.csproj index 67ae2da0..ba34e89c 100644 --- a/Source/PerformanceOptimizerPatch/PerformanceOptimizerPatch.csproj +++ b/Source/PerformanceOptimizerPatch/PerformanceOptimizerPatch.csproj @@ -1,7 +1,5 @@  - - net472 Library diff --git a/Source/TacticowlPatch/TacticowlPatch.csproj b/Source/TacticowlPatch/TacticowlPatch.csproj index 1200f0bd..77e71ccf 100644 --- a/Source/TacticowlPatch/TacticowlPatch.csproj +++ b/Source/TacticowlPatch/TacticowlPatch.csproj @@ -1,7 +1,5 @@  - - net472 Library