From f22f5ac33e1bb2b16e4c5886b194d960a03ca48c Mon Sep 17 00:00:00 2001 From: Platinum Date: Sat, 30 May 2020 14:10:22 -0700 Subject: [PATCH] rotation, quick reset, better handling of offset values --- 1.1/Assemblies/Rimworld-Animations.dll | Bin 52736 -> 53248 bytes Source/Actors/Actor.cs | 2 + Source/Comps/CompBodyAnimator.cs | 44 +++++++++++++----- .../MainTabWindow_OffsetConfigure.cs | 36 ++++++++++++-- Source/Patches/HarmonyPatch_PawnRenderer.cs | 5 -- .../Patches/HarmonyPatch_Pawn_DrawTracker.cs | 5 -- 6 files changed, 66 insertions(+), 26 deletions(-) diff --git a/1.1/Assemblies/Rimworld-Animations.dll b/1.1/Assemblies/Rimworld-Animations.dll index 3aa8e1ce7407a9f8a65cec3b92a8b8330a5ae138..de4b830ec1c31b37d6e64f90a50ec144a77e188b 100644 GIT binary patch literal 53248 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𝔇QuxA+|5G08 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 J$p?1?{srm`y|w@V literal 52736 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 diff --git a/Source/Actors/Actor.cs b/Source/Actors/Actor.cs index d836d24..eebe5ad 100644 --- a/Source/Actors/Actor.cs +++ b/Source/Actors/Actor.cs @@ -21,9 +21,11 @@ namespace Rimworld_Animations { public Vector3 offset = new Vector2(0, 0); public Dictionary offsetsByDefName = new Dictionary(); + public Dictionary rotationByDefName = new Dictionary(); public void ExposeData() { Scribe_Collections.Look(ref offsetsByDefName, "OffsetsSetInOptions", LookMode.Value, LookMode.Value); + Scribe_Collections.Look(ref rotationByDefName, "RotationOffsetsFromOptions", LookMode.Value, LookMode.Value); } } } diff --git a/Source/Comps/CompBodyAnimator.cs b/Source/Comps/CompBodyAnimator.cs index aff1dbe..e18113f 100644 --- a/Source/Comps/CompBodyAnimator.cs +++ b/Source/Comps/CompBodyAnimator.cs @@ -52,6 +52,12 @@ namespace Rimworld_Animations { private AnimationStage stage => anim.animationStages[curStage]; private PawnAnimationClip clip => (PawnAnimationClip)stage.animationClips[actor]; + public bool Mirror { + get { + return mirror; + } + } + public void setAnchor(IntVec3 pos) { anchor = pos.ToVector3Shifted(); @@ -172,6 +178,9 @@ namespace Rimworld_Animations { bodyFacing = this.bodyFacing; headFacing = this.headFacing; + + + } public void tickGraphics(PawnGraphicSet graphics) { @@ -251,21 +260,39 @@ namespace Rimworld_Animations { public void calculateDrawValues() { deltaPos = new Vector3(clip.BodyOffsetX.Evaluate(clipPercent) * (mirror ? -1 : 1), clip.layer.AltitudeFor(), clip.BodyOffsetZ.Evaluate(clipPercent)); + + if (CurrentAnimation?.actors[ActorIndex]?.offsetsByDefName != null && CurrentAnimation.actors[ActorIndex].offsetsByDefName.ContainsKey(pawn.def.defName)) { + deltaPos.x += CurrentAnimation.actors[ActorIndex].offsetsByDefName[pawn.def.defName].x * (mirror ? -1 : 1); + deltaPos.z += CurrentAnimation.actors[ActorIndex].offsetsByDefName[pawn.def.defName].y; + } + + bodyAngle = (clip.BodyAngle.Evaluate(clipPercent) + (quiver || shiver ? ((Rand.Value * AnimationSettings.shiverIntensity) - (AnimationSettings.shiverIntensity / 2f)) : 0f)) * (mirror ? -1 : 1); + headAngle = clip.HeadAngle.Evaluate(clipPercent) * (mirror ? -1 : 1); + + if (controlGenitalAngle) { + genitalAngle = clip.GenitalAngle.Evaluate(clipPercent) * (mirror ? -1 : 1); + } + + if (CurrentAnimation?.actors[ActorIndex]?.rotationByDefName != null && CurrentAnimation.actors[ActorIndex].rotationByDefName.ContainsKey(pawn.def.defName)) { + float offsetRotation = CurrentAnimation.actors[ActorIndex].rotationByDefName[pawn.def.defName] * (Mirror ? -1 : 1); + genitalAngle += offsetRotation; + bodyAngle += offsetRotation; + headAngle += offsetRotation; + } + //don't go past 360 or less than 0 if (bodyAngle < 0) bodyAngle = 360 - ((-1f*bodyAngle) % 360); if (bodyAngle > 360) bodyAngle %= 360; - headAngle = clip.HeadAngle.Evaluate(clipPercent) * (mirror ? -1 : 1); + if (headAngle < 0) headAngle = 360 - ((-1f * headAngle) % 360); if (headAngle > 360) headAngle %= 360; - if (controlGenitalAngle) { - genitalAngle = clip.GenitalAngle.Evaluate(clipPercent) * (mirror ? -1 : 1); - if (genitalAngle < 0) genitalAngle = 360 - ((-1f * genitalAngle) % 360); - if (genitalAngle > 360) genitalAngle %= 360; - } + if (genitalAngle < 0) genitalAngle = 360 - ((-1f * genitalAngle) % 360); + if (genitalAngle > 360) genitalAngle %= 360; + bodyFacing = mirror ? new Rot4((int)clip.BodyFacing.Evaluate(clipPercent)).Opposite : new Rot4((int)clip.BodyFacing.Evaluate(clipPercent)); @@ -286,11 +313,6 @@ namespace Rimworld_Animations { Vector3 headPos = anchor + deltaPos + Quaternion.AngleAxis(bodyAngle, Vector3.up) * (pawn.Drawer.renderer.BaseHeadOffsetAt(headFacing) + headBob); - if (CurrentAnimation?.actors[ActorIndex]?.offsetsByDefName != null && CurrentAnimation.actors[ActorIndex].offsetsByDefName.ContainsKey(pawn.def.defName)) { - headPos.x += CurrentAnimation.actors[ActorIndex].offsetsByDefName[pawn.def.defName].x; - headPos.z += CurrentAnimation.actors[ActorIndex].offsetsByDefName[pawn.def.defName].y; - } - return headPos; } diff --git a/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs b/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs index f90e66e..9516e3a 100644 --- a/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs +++ b/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs @@ -11,7 +11,7 @@ namespace Rimworld_Animations { class MainTabWindow_OffsetConfigure : MainTabWindow { - public override Vector2 RequestedTabSize => new Vector2(505, 300); + public override Vector2 RequestedTabSize => new Vector2(505, 340); public override void DoWindowContents(Rect inRect) { Rect position = new Rect(inRect.x, inRect.y, inRect.width, inRect.height); @@ -20,7 +20,10 @@ namespace Rimworld_Animations { Listing_Standard listingStandard = new Listing_Standard(); listingStandard.Begin(position); - listingStandard.Label("Offset Controller"); + listingStandard.Label("Offset Manager"); + + listingStandard.GapLine(); + if (Find.Selector.SingleSelectedThing is Pawn) { @@ -30,7 +33,7 @@ namespace Rimworld_Animations { Actor curActor = curPawn.TryGetComp().CurrentAnimation.actors[curPawn.TryGetComp().ActorIndex]; - float offsetX = 0, offsetZ = 0; + float offsetX = 0, offsetZ = 0, rotation = 0; if (curActor.offsetsByDefName.ContainsKey(curPawn.def.defName)) { offsetX = curActor.offsetsByDefName[curPawn.def.defName].x; @@ -39,9 +42,15 @@ namespace Rimworld_Animations { curActor.offsetsByDefName.Add(curPawn.def.defName, new Vector2(0, 0)); } - listingStandard.GapLine(); + if (curActor.rotationByDefName.ContainsKey(curPawn.def.defName)) { + rotation = curActor.rotationByDefName[curPawn.def.defName]; + } + else { + curActor.rotationByDefName.Add(curPawn.def.defName, 180); + } - listingStandard.Label("Offset for race " + curPawn.def.defName + " in actor position " + curPawn.TryGetComp().ActorIndex); + + listingStandard.Label("Offset for race " + curPawn.def.defName + " in actor position " + curPawn.TryGetComp().ActorIndex + (curPawn.TryGetComp().Mirror ? " mirrored" : "")); if(curPawn.def.defName == "Human") { listingStandard.Label("Warning--You generally don't want to change human offsets, only alien offsets"); @@ -54,13 +63,30 @@ namespace Rimworld_Animations { listingStandard.Label("Z Offset: " + offsetZ); offsetZ = listingStandard.Slider(offsetZ, -10, 10); + listingStandard.Label("Rotation: " + rotation); + rotation = listingStandard.Slider(rotation, -180, 180); + + if(listingStandard.ButtonText("Reset All")) { + offsetX = 0; + offsetZ = 0; + rotation = 0; + } + if (offsetX != curActor.offsetsByDefName[curPawn.def.defName].x || offsetZ != curActor.offsetsByDefName[curPawn.def.defName].y) { curActor.offsetsByDefName[curPawn.def.defName] = new Vector2(offsetX, offsetZ); } + + if(rotation != curActor.rotationByDefName[curPawn.def.defName]) { + curActor.rotationByDefName[curPawn.def.defName] = rotation; + } + } } + else { + listingStandard.Label("Select a pawn currently in an animation to change their offsets"); + } listingStandard.End(); diff --git a/Source/Patches/HarmonyPatch_PawnRenderer.cs b/Source/Patches/HarmonyPatch_PawnRenderer.cs index a6865bc..8bad2f2 100644 --- a/Source/Patches/HarmonyPatch_PawnRenderer.cs +++ b/Source/Patches/HarmonyPatch_PawnRenderer.cs @@ -44,11 +44,6 @@ namespace Rimworld_Animations { bodyAnim.tickGraphics(graphics); bodyAnim.animatePawn(ref rootLoc, ref angle, ref bodyFacing, ref headFacing); - if(bodyAnim.CurrentAnimation?.actors[bodyAnim.ActorIndex]?.offsetsByDefName != null && bodyAnim.CurrentAnimation.actors[bodyAnim.ActorIndex].offsetsByDefName.ContainsKey(pawn.def.defName)) { - rootLoc.x += bodyAnim.CurrentAnimation.actors[bodyAnim.ActorIndex].offsetsByDefName[pawn.def.defName].x; - rootLoc.z += bodyAnim.CurrentAnimation.actors[bodyAnim.ActorIndex].offsetsByDefName[pawn.def.defName].y; - } - } } diff --git a/Source/Patches/HarmonyPatch_Pawn_DrawTracker.cs b/Source/Patches/HarmonyPatch_Pawn_DrawTracker.cs index 45a5886..5cdcfce 100644 --- a/Source/Patches/HarmonyPatch_Pawn_DrawTracker.cs +++ b/Source/Patches/HarmonyPatch_Pawn_DrawTracker.cs @@ -18,11 +18,6 @@ namespace Rimworld_Animations { if (bodyAnim != null && bodyAnim.isAnimating) { __result = ___pawn.TryGetComp().anchor + ___pawn.TryGetComp().deltaPos; - if (bodyAnim.CurrentAnimation?.actors[bodyAnim.ActorIndex]?.offsetsByDefName != null && bodyAnim.CurrentAnimation.actors[bodyAnim.ActorIndex].offsetsByDefName.ContainsKey(___pawn.def.defName)) { - __result.x += bodyAnim.CurrentAnimation.actors[bodyAnim.ActorIndex].offsetsByDefName[___pawn.def.defName].x; - __result.z += bodyAnim.CurrentAnimation.actors[bodyAnim.ActorIndex].offsetsByDefName[___pawn.def.defName].y; - } - return false; } return true;