From fb5dcccf904fd55567c949655f47b8e0121b9ede Mon Sep 17 00:00:00 2001 From: c0ffee Date: Wed, 15 Sep 2021 20:44:29 -0700 Subject: [PATCH] fixes for rotations --- 1.3/Assemblies/Rimworld-Animations.dll | Bin 54784 -> 54272 bytes 1.3/Source/AnimationUtility.cs | 1 + 1.3/Source/Comps/CompBodyAnimator.cs | 3 +- .../OtherModPatches/HarmonyPatch_AlienRace.cs | 192 ++++++++++++++++-- 4 files changed, 178 insertions(+), 18 deletions(-) diff --git a/1.3/Assemblies/Rimworld-Animations.dll b/1.3/Assemblies/Rimworld-Animations.dll index 0eb25a61c527ad740ad1848e2b63ebaff48433e2..ebe84c735779a367c515b8900d729d4178b0465f 100644 GIT binary patch delta 18328 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 diff --git a/1.3/Source/AnimationUtility.cs b/1.3/Source/AnimationUtility.cs index c235c89..9b9d58d 100644 --- a/1.3/Source/AnimationUtility.cs +++ b/1.3/Source/AnimationUtility.cs @@ -172,6 +172,7 @@ namespace Rimworld_Animations { angle = anim.headAngle; quat = Quaternion.AngleAxis(anim.headAngle, Vector3.up); pos = anim.getPawnHeadOffset(); + } } diff --git a/1.3/Source/Comps/CompBodyAnimator.cs b/1.3/Source/Comps/CompBodyAnimator.cs index 68958da..52d60f0 100644 --- a/1.3/Source/Comps/CompBodyAnimator.cs +++ b/1.3/Source/Comps/CompBodyAnimator.cs @@ -374,6 +374,7 @@ namespace Rimworld_Animations { //don't go past 360 or less than 0 + if (bodyAngle < 0) bodyAngle = 360 - ((-1f*bodyAngle) % 360); if (bodyAngle > 360) bodyAngle %= 360; @@ -382,7 +383,7 @@ namespace Rimworld_Animations { if (headAngle > 360) headAngle %= 360; if (genitalAngle < 0) genitalAngle = 360 - ((-1f * genitalAngle) % 360); - if (genitalAngle > 360) genitalAngle %= 360; + if (genitalAngle > 360) genitalAngle %= 360; bodyFacing = mirror ? new Rot4((int)clip.BodyFacing.Evaluate(clipPercent)).Opposite : new Rot4((int)clip.BodyFacing.Evaluate(clipPercent)); diff --git a/1.3/Source/Patches/OtherModPatches/HarmonyPatch_AlienRace.cs b/1.3/Source/Patches/OtherModPatches/HarmonyPatch_AlienRace.cs index 6f4ae4e..4144952 100644 --- a/1.3/Source/Patches/OtherModPatches/HarmonyPatch_AlienRace.cs +++ b/1.3/Source/Patches/OtherModPatches/HarmonyPatch_AlienRace.cs @@ -12,26 +12,179 @@ using AlienRace; namespace Rimworld_Animations { + + [StaticConstructorOnStartup] + public static class HarmonyPatch_AlienRace + { + static HarmonyPatch_AlienRace() + { + (new Harmony("rjw")).Patch(AccessTools.Method(AccessTools.TypeByName("AlienRace.HarmonyPatches"), "DrawAddons"), + prefix: new HarmonyMethod(AccessTools.Method(typeof(HarmonyPatch_AlienRace), "Prefix_AnimateHeadAddons"))); + } + + + public static bool Prefix_AnimateHeadAddons(PawnRenderFlags renderFlags, Vector3 vector, Vector3 headOffset, Pawn pawn, Quaternion quat, Rot4 rotation) + { + + if (renderFlags.FlagSet(PawnRenderFlags.Portrait) || pawn.TryGetComp() == null || !pawn.TryGetComp().isAnimating) return true; + if (!(pawn.def is ThingDef_AlienRace alienProps) || renderFlags.FlagSet(PawnRenderFlags.Invisible)) return false; + + List addons = alienProps.alienRace.generalSettings.alienPartGenerator.bodyAddons; + AlienPartGenerator.AlienComp comp = pawn.GetComp(); + CompBodyAnimator pawnAnimator = pawn.TryGetComp(); + + for (int i = 0; i < addons.Count; i++) + { + AlienPartGenerator.BodyAddon ba = addons[index: i]; + + if (!ba.CanDrawAddon(pawn: pawn)) continue; + + bool forceDrawForBody = false; + if (alienProps.defName.Contains("Orassan") && ba.path.ToLower().Contains("tail")) + { + forceDrawForBody = true; + } + AlienPartGenerator.RotationOffset offset = ba.defaultOffsets.GetOffset(ba.drawnInBed || ba.alignWithHead ? pawnAnimator.headFacing : pawnAnimator.bodyFacing); + Vector3 a = (offset != null) ? offset.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, comp.crownType) : Vector3.zero; + AlienPartGenerator.RotationOffset offset2 = ba.offsets.GetOffset(ba.drawnInBed || ba.alignWithHead ? pawnAnimator.headFacing : pawnAnimator.bodyFacing); + Vector3 vector2 = a + ((offset2 != null) ? offset2.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, comp.crownType) : Vector3.zero); + vector2.y = (ba.inFrontOfBody ? (0.3f + vector2.y) : (-0.3f - vector2.y)); + float num = ba.angle; + if (rotation == Rot4.North) + { + if (ba.layerInvert) + { + vector2.y = 0f - vector2.y; + } + num = 0f; + } + if (rotation == Rot4.East) + { + num = 0f - num; + vector2.x = 0f - vector2.x; + } + Graphic addonGraphic = comp.addonGraphics[i]; + + + + + if ((ba.drawnInBed && !forceDrawForBody) || ba.alignWithHead) + { + + Quaternion addonRotation = Quaternion.AngleAxis(pawnAnimator.headAngle < 0 ? 360 - (360 % pawnAnimator.headAngle) : pawnAnimator.headAngle, Vector3.up); + + /* + * + * genital rotation is borked + if (AnimationSettings.controlGenitalRotation && pawnAnimator.controlGenitalAngle && ba?.hediffGraphics != null && ba.hediffGraphics.Count != 0 && ba.hediffGraphics[0]?.path != null && (ba.hediffGraphics[0].path.Contains("Penis") || ba.hediffGraphics[0].path.Contains("penis"))) + { + addonRotation = Quaternion.AngleAxis(angle: pawnAnimator.genitalAngle < 0 ? 360 - (360 % pawnAnimator.genitalAngle) : pawnAnimator.genitalAngle, axis: Vector3.up); + } + + */ + GenDraw.DrawMeshNowOrLater(mesh: addonGraphic.MeshAt(rot: pawnAnimator.headFacing), loc: vector + (ba.alignWithHead ? headOffset : Vector3.zero) + vector2.RotatedBy(angle: Mathf.Acos(f: Quaternion.Dot(a: Quaternion.identity, b: addonRotation)) * 2f * 57.29578f), + quat: Quaternion.AngleAxis(angle: num, axis: Vector3.up) * addonRotation, mat: addonGraphic.MatAt(rot: pawnAnimator.headFacing), renderFlags.FlagSet(PawnRenderFlags.DrawNow)); + + + } + + else + { + Quaternion addonRotation = Quaternion.AngleAxis(pawnAnimator.bodyAngle, Vector3.up); + if (AnimationSettings.controlGenitalRotation && pawnAnimator.controlGenitalAngle && ba?.hediffGraphics != null && ba.hediffGraphics.Count != 0 && ba.hediffGraphics[0]?.path != null && (ba.hediffGraphics[0].path.Contains("Penis") || ba.hediffGraphics[0].path.Contains("penis"))) + { + addonRotation = Quaternion.AngleAxis(angle: pawnAnimator.genitalAngle, axis: Vector3.up); + } + + GenDraw.DrawMeshNowOrLater(mesh: addonGraphic.MeshAt(rot: rotation), loc: vector + (ba.alignWithHead ? headOffset : Vector3.zero) + vector2.RotatedBy(angle: Mathf.Acos(f: Quaternion.Dot(a: Quaternion.identity, b: addonRotation)) * 2f * 57.29578f), + quat: Quaternion.AngleAxis(angle: num, axis: Vector3.up) * addonRotation, mat: addonGraphic.MatAt(rot: rotation), renderFlags.FlagSet(PawnRenderFlags.DrawNow)); + + } + + + } + + return false; + } + } + + /* + [HarmonyPatch(typeof(AlienRace.HarmonyPatches), "DrawAddons")] public static class HarmonyPatch_AlienRace { - public static void RenderHeadAddonInAnimation(Mesh mesh, Vector3 loc, Quaternion quat, Material mat, bool drawNow, Graphic graphic, AlienPartGenerator.BodyAddon bodyAddon, Vector3 v, float num, Vector3 headOffset, Pawn pawn, PawnRenderFlags renderFlags) + public static void RenderHeadAddonInAnimation(Mesh mesh, Vector3 loc, Quaternion quat, Material mat, bool drawNow, Graphic graphic, AlienPartGenerator.BodyAddon bodyAddon, Vector3 v, Vector3 headOffset, Pawn pawn, PawnRenderFlags renderFlags, Vector3 vector, Rot4 rotation) { CompBodyAnimator pawnAnimator = pawn.TryGetComp(); + AlienPartGenerator.AlienComp comp = pawn.GetComp(); + + if (pawnAnimator != null && pawnAnimator.isAnimating) + { + + if((bodyAddon.drawnInBed || bodyAddon.alignWithHead)) + { + + AlienPartGenerator.RotationOffset offset = bodyAddon.defaultOffsets.GetOffset(rotation); + Vector3 a = (offset != null) ? offset.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, comp.crownType) : Vector3.zero; + AlienPartGenerator.RotationOffset offset2 = bodyAddon.offsets.GetOffset(rotation); + Vector3 vector2 = a + ((offset2 != null) ? offset2.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, comp.crownType) : Vector3.zero); + vector2.y = (bodyAddon.inFrontOfBody ? (0.3f + vector2.y) : (-0.3f - vector2.y)); + float num = bodyAddon.angle; + if (rotation == Rot4.North) + { + if (bodyAddon.layerInvert) + { + vector2.y = -vector2.y; + } + num = 0f; + } + if (rotation == Rot4.East) + { + num = -num; + vector2.x = -vector2.x; + } + + vector = vector + Quaternion.AngleAxis(pawnAnimator.bodyAngle, Vector3.up) * pawn.Drawer.renderer.BaseHeadOffsetAt(pawnAnimator.bodyFacing) - pawnAnimator.getPawnHeadOffset(); //convert vector into pseudo body pos for head + quat = Quaternion.AngleAxis(pawnAnimator.headAngle, Vector3.up); + loc = vector + (bodyAddon.alignWithHead ? headOffset : Vector3.zero) + vector2.RotatedBy(Mathf.Acos(Quaternion.Dot(Quaternion.identity, quat)) * 2f * 57.29578f); + mat = graphic.MatAt(rot: pawnAnimator.headFacing); + } + else + { + + AlienPartGenerator.RotationOffset offset = bodyAddon.defaultOffsets.GetOffset(rotation); + Vector3 a = (offset != null) ? offset.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, comp.crownType) : Vector3.zero; + AlienPartGenerator.RotationOffset offset2 = bodyAddon.offsets.GetOffset(rotation); + Vector3 vector2 = a + ((offset2 != null) ? offset2.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, comp.crownType) : Vector3.zero); + vector2.y = (bodyAddon.inFrontOfBody ? (0.3f + vector2.y) : (-0.3f - vector2.y)); + float num = bodyAddon.angle; + if (rotation == Rot4.North) + { + if (bodyAddon.layerInvert) + { + vector2.y = -vector2.y; + } + num = 0f; + } + if (rotation == Rot4.East) + { + num = -num; + vector2.x = -vector2.x; + } + quat = Quaternion.AngleAxis(pawnAnimator.bodyAngle, Vector3.up); + loc = vector + (bodyAddon.alignWithHead ? headOffset : Vector3.zero) + vector2.RotatedBy(Mathf.Acos(Quaternion.Dot(Quaternion.identity, quat)) * 2f * 57.29578f); + + } + + } + GenDraw.DrawMeshNowOrLater(mesh, loc, quat, mat, drawNow); + + /* if (pawnAnimator != null && !renderFlags.FlagSet(PawnRenderFlags.Portrait) && pawnAnimator.isAnimating && (bodyAddon.drawnInBed || bodyAddon.alignWithHead)) { - Quaternion headQuatInAnimation = Quaternion.AngleAxis(pawnAnimator.headAngle, Vector3.up); - Rot4 headRotInAnimation = pawnAnimator.headFacing; - Vector3 headPositionInAnimation = pawnAnimator.getPawnHeadPosition(); - - headPositionInAnimation.y = loc.y; - - - Vector3 orassanv = Vector3.zero; - bool orassan = false; - + if ((pawn.def as ThingDef_AlienRace).defName == "Alien_Orassan") { orassan = true; @@ -89,18 +242,20 @@ namespace Rimworld_Animations { - - GenDraw.DrawMeshNowOrLater(mesh: graphic.MeshAt(rot: headRotInAnimation), loc: headPositionInAnimation + orassanv + (bodyAddon.alignWithHead && !orassan ? headOffset : Vector3.zero),// + v.RotatedBy(Mathf.Acos(Quaternion.Dot(Quaternion.identity, quat)) * 2f * 57.29578f), + + GenDraw.DrawMeshNowOrLater(mesh: graphic.MeshAt(rot: headRotInAnimation), loc: loc + orassanv + (bodyAddon.alignWithHead ? headOffset : Vector3.zero),// + v.RotatedBy(Mathf.Acos(Quaternion.Dot(Quaternion.identity, quat)) * 2f * 57.29578f), quat: Quaternion.AngleAxis(angle: num, axis: Vector3.up) * headQuatInAnimation, mat: graphic.MatAt(rot: pawnAnimator.headFacing), drawNow: drawNow);; } else { - GenDraw.DrawMeshNowOrLater(mesh, loc, quat, mat, drawNow); + } - } + + } + public static IEnumerable Transpiler(IEnumerable instructions) { @@ -117,10 +272,11 @@ namespace Rimworld_Animations { yield return new CodeInstruction(OpCodes.Ldloc, (object)7); //graphic yield return new CodeInstruction(OpCodes.Ldloc, (object)4); //bodyAddon yield return new CodeInstruction(OpCodes.Ldloc, (object)5); //offsetVector/AddonOffset (v) - yield return new CodeInstruction(OpCodes.Ldloc, (object)6); //num yield return new CodeInstruction(OpCodes.Ldarg, (object)2); //headOffset yield return new CodeInstruction(OpCodes.Ldarg, (object)3); //pawn yield return new CodeInstruction(OpCodes.Ldarg, (object)0); //renderflags + yield return new CodeInstruction(OpCodes.Ldarg, (object)1); //vector + yield return new CodeInstruction(OpCodes.Ldarg, (object)5); //rotation yield return new CodeInstruction(OpCodes.Call, AccessTools.DeclaredMethod(typeof(HarmonyPatch_AlienRace), "RenderHeadAddonInAnimation")); @@ -149,7 +305,7 @@ namespace Rimworld_Animations { if (anim != null && !renderFlags.FlagSet(PawnRenderFlags.Portrait) && anim.isAnimating) { - quat = Quaternion.AngleAxis(anim.bodyAngle, Vector3.up); + //quat = Quaternion.AngleAxis(anim.bodyAngle, Vector3.up); } return true; @@ -170,6 +326,8 @@ namespace Rimworld_Animations { return true; } } + */ + }