From 9621dc28415f33a027cd0cd31067204ecafc4178 Mon Sep 17 00:00:00 2001 From: c0ffee Date: Sat, 20 Apr 2024 17:23:31 -0700 Subject: [PATCH] Added dynamic prop rendering system to extendedanimator rendernodes dynamically attach and remove per animation configure props in AnimationPropDef --- 1.5/Assemblies/Rimworld-Animations.dll | Bin 26112 -> 27136 bytes 1.5/Defs/AnimationDefs/TestAnimation1.xml | 29 ++++++++++ .../AnimationPropDefs/AnimationPropDef.xml | 25 +++++++++ 1.5/Defs/XMLFile1.xml | 11 ---- 1.5/Source/AnimationProps/AnimationPropDef.cs | 16 ++++++ 1.5/Source/Comps/CompExtendedAnimator.cs | 50 +++++++++++++++++- 1.5/Source/Keyframes/ExtendedKeyframe.cs | 3 +- .../HarmonyPatch_PawnRenderNode.cs | 8 ++- .../PawnRenderNodeWorker_AnimationProp.cs | 23 ++++++++ .../AnimationProps/Banana/Banana_east.png | Bin 0 -> 2290 bytes .../AnimationProps/Banana/Banana_north.png | Bin 0 -> 6961 bytes .../AnimationProps/Banana/Banana_south.png | Bin 0 -> 2290 bytes .../AnimationProps/Banana/Banana_west.png | Bin 0 -> 2290 bytes Rimworld-Animations.csproj | 8 ++- 14 files changed, 156 insertions(+), 17 deletions(-) create mode 100644 1.5/Defs/AnimationPropDefs/AnimationPropDef.xml delete mode 100644 1.5/Defs/XMLFile1.xml create mode 100644 1.5/Source/AnimationProps/AnimationPropDef.cs create mode 100644 1.5/Source/PawnRenderNode/PawnRenderNodeWorker_AnimationProp.cs create mode 100644 1.5/Textures/AnimationProps/Banana/Banana_east.png create mode 100644 1.5/Textures/AnimationProps/Banana/Banana_north.png create mode 100644 1.5/Textures/AnimationProps/Banana/Banana_south.png create mode 100644 1.5/Textures/AnimationProps/Banana/Banana_west.png diff --git a/1.5/Assemblies/Rimworld-Animations.dll b/1.5/Assemblies/Rimworld-Animations.dll index bc82647e246bba8f5bc4adb07f5f363425e94ecf..5d55c62e59b75e2e6df965e970b64ab225428e3e 100644 GIT binary patch literal 27136 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 Cjaumd literal 26112 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%0DB!p(<=EJCHSX@rj9o=g|?TO4n|&)N&w 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 e(#uzLc0W + +
  • + RenderNodeTag_Banana + + Rimworld_Animations.AnimationWorker_KeyframesExtended + +
  • + 30 + 0 + true +
  • +
  • + 100 + 0 + false +
  • +
  • + 200 + 0 + true +
  • +
  • + 300 + 0 + true +
  • + + + diff --git a/1.5/Defs/AnimationPropDefs/AnimationPropDef.xml b/1.5/Defs/AnimationPropDefs/AnimationPropDef.xml new file mode 100644 index 0000000..f635ce5 --- /dev/null +++ b/1.5/Defs/AnimationPropDefs/AnimationPropDef.xml @@ -0,0 +1,25 @@ + + + + + RenderNodeTag_Banana + + + + AnimationProp_Banana + + + + + AnimProp_Banana + Rimworld_Animations.PawnRenderNodeWorker_AnimationProp + RenderNodeTag_Banana + Body + AnimationProps/Banana/Banana + + Head + 95 + + + + diff --git a/1.5/Defs/XMLFile1.xml b/1.5/Defs/XMLFile1.xml deleted file mode 100644 index 2ddecfa..0000000 --- a/1.5/Defs/XMLFile1.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - Root - - Hand - PawnRenderNode - P - - - diff --git a/1.5/Source/AnimationProps/AnimationPropDef.cs b/1.5/Source/AnimationProps/AnimationPropDef.cs new file mode 100644 index 0000000..9acab99 --- /dev/null +++ b/1.5/Source/AnimationProps/AnimationPropDef.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public class AnimationPropDef : Def + { + + public PawnRenderNodeProperties animPropProperties; + + } +} diff --git a/1.5/Source/Comps/CompExtendedAnimator.cs b/1.5/Source/Comps/CompExtendedAnimator.cs index bd15457..212f81f 100644 --- a/1.5/Source/Comps/CompExtendedAnimator.cs +++ b/1.5/Source/Comps/CompExtendedAnimator.cs @@ -124,9 +124,57 @@ namespace Rimworld_Animations { } - public static void CheckRecacheNecessary(int anim) + public override List CompRenderNodes() { + //only if pawn is animating for performance + if (IsAnimating) + { + List animRenderNodes = new List(); + // for all animationpropdefs, + foreach (AnimationPropDef animationProp in DefDatabase.AllDefsListForReading) + { + //if animation makes use of prop, + if (AnimationMakesUseOfProp(animationProp)) + { + //create new render node + PawnRenderNode animRenderNode = new PawnRenderNode(pawn, animationProp.animPropProperties, pawn.Drawer.renderer.renderTree); + animRenderNodes.Add(animRenderNode); + } + + } + + //return list of rendernodes that should animate + return animRenderNodes; + + } + else + { + return null; + } + + } + + public bool AnimationMakesUseOfProp(AnimationPropDef animationProp) + { + // never true if not animating; anim props shouldn't be attached + if (!IsAnimating) return false; + + //for all queued animations, + foreach (AnimationDef animation in animationQueue) + { + // for each prop tag in the currently playing animation, + foreach (PawnRenderNodeTagDef propTag in animation.animationParts.Keys) + { + // if that proptag is the same as the one for animationProp, + if (propTag == animationProp.animPropProperties.tagDef) + { + //that prop is being used in the animation + return true; + } + } + } + return false; } private Pawn pawn => base.parent as Pawn; diff --git a/1.5/Source/Keyframes/ExtendedKeyframe.cs b/1.5/Source/Keyframes/ExtendedKeyframe.cs index 893c879..ef08e9b 100644 --- a/1.5/Source/Keyframes/ExtendedKeyframe.cs +++ b/1.5/Source/Keyframes/ExtendedKeyframe.cs @@ -10,8 +10,7 @@ namespace Rimworld_Animations { public class ExtendedKeyframe : Verse.Keyframe { - - public Rot4 rotation; + public Rot4 rotation = Rot4.North; public SoundDef sound = null; public bool visible = true; diff --git a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs index 1e423a7..81c9fa4 100644 --- a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs +++ b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs @@ -9,7 +9,9 @@ using Verse; namespace Rimworld_Animations { - //Head Rotation Code - Textures + // Head Rotation Code - Textures + // it's fine to just edit each AppendRequests individually + // because they all the parms are passed down to each child node recursively [HarmonyPatch(typeof(PawnRenderNode), "AppendRequests")] public static class HarmonyPatch_PawnRenderNode { @@ -28,7 +30,9 @@ namespace Rimworld_Animations //replace maybe? //cheaper call now comparing prev tick to cur tick - return extendedAnimWorker.visibleAtTick(__instance.tree.AnimationTick); + + //not necessary because of new rendernodeworker hiding props now + //return extendedAnimWorker.visibleAtTick(__instance.tree.AnimationTick); } diff --git a/1.5/Source/PawnRenderNode/PawnRenderNodeWorker_AnimationProp.cs b/1.5/Source/PawnRenderNode/PawnRenderNodeWorker_AnimationProp.cs new file mode 100644 index 0000000..c2d7622 --- /dev/null +++ b/1.5/Source/PawnRenderNode/PawnRenderNodeWorker_AnimationProp.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public class PawnRenderNodeWorker_AnimationProp : PawnRenderNodeWorker + { + public override bool CanDrawNow(PawnRenderNode node, PawnDrawParms parms) + { + if (node.AnimationWorker is AnimationWorker_KeyframesExtended propAnimator) + { + return propAnimator.visibleAtTick(node.tree.AnimationTick); + } + + return false; + } + + } +} diff --git a/1.5/Textures/AnimationProps/Banana/Banana_east.png b/1.5/Textures/AnimationProps/Banana/Banana_east.png new file mode 100644 index 0000000000000000000000000000000000000000..d7df22783f0a6c698f4756b539caa13274e21e89 GIT binary patch literal 2290 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4Yzkn2Hfk$L90|U1(2s1Lwnj^u$ zz}S=N>>Ln~kzbNuoRMFk;OXqFP*9YgmYI{vz)*2(>IK`3U`COnAMaOh49W3kH|{8@ za4r$xUZhkuS%dAMlc%!E#e+|lW-?c1o?zFLWxd|iEZ-f-LHt*!?tZPRZYR-799h3>{mz3wK{u-qBgSz3Q#p!P+H{*Lw9nu=FeIT55FAeaUL) zzq~KcCav`0cnp)W|#4SKW?vY zSs6u4Dn7c(bmFRgZOi7R^6E}pw`b0qDSrZWA}@zuy&}*Zvq?Ab;)O*KTJH6m-(EXE zM=o#Hd85y%20sdWZti~bo{w$6JU`oSe~;Q{q1kip-+TPWKWKNd{^yRPxA#=oep~gu zqOx6i{;jEgtV;y0y{@T0=G1vO-?F6kMDCUEUzl5E*X?_F(77*vQ$_Nr`|RpF{}!hm zdC!0HM$xGsot2Kj$Wlo52=ZlMs8VHMXlQ0&`1v15zhq!2HDF+PmB7GYHG_dcJbzOB zQ8xw#wg;Xrjv*Dd-drtpET3 literal 0 HcmV?d00001 diff --git a/1.5/Textures/AnimationProps/Banana/Banana_north.png b/1.5/Textures/AnimationProps/Banana/Banana_north.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a4d28ddf3a5581f7417ab766aa6ec80642ba86 GIT binary patch literal 6961 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 literal 0 HcmV?d00001 diff --git a/1.5/Textures/AnimationProps/Banana/Banana_west.png b/1.5/Textures/AnimationProps/Banana/Banana_west.png new file mode 100644 index 0000000000000000000000000000000000000000..d7df22783f0a6c698f4756b539caa13274e21e89 GIT binary patch literal 2290 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4Yzkn2Hfk$L90|U1(2s1Lwnj^u$ zz}S=N>>Ln~kzbNuoRMFk;OXqFP*9YgmYI{vz)*2(>IK`3U`COnAMaOh49W3kH|{8@ za4r$xUZhkuS%dAMlc%!E#e+|lW-?c1o?zFLWxd|iEZ-f-LHt*!?tZPRZYR-799h3>{mz3wK{u-qBgSz3Q#p!P+H{*Lw9nu=FeIT55FAeaUL) zzq~KcCav`0cnp)W|#4SKW?vY zSs6u4Dn7c(bmFRgZOi7R^6E}pw`b0qDSrZWA}@zuy&}*Zvq?Ab;)O*KTJH6m-(EXE zM=o#Hd85y%20sdWZti~bo{w$6JU`oSe~;Q{q1kip-+TPWKWKNd{^yRPxA#=oep~gu zqOx6i{;jEgtV;y0y{@T0=G1vO-?F6kMDCUEUzl5E*X?_F(77*vQ$_Nr`|RpF{}!hm zdC!0HM$xGsot2Kj$Wlo52=ZlMs8VHMXlQ0&`1v15zhq!2HDF+PmB7GYHG_dcJbzOB zQ8xw#wg;Xrjv*Dd-drtpET3 literal 0 HcmV?d00001 diff --git a/Rimworld-Animations.csproj b/Rimworld-Animations.csproj index b6b9d15..405e2e6 100644 --- a/Rimworld-Animations.csproj +++ b/Rimworld-Animations.csproj @@ -72,6 +72,7 @@ + @@ -105,6 +106,7 @@ + @@ -115,11 +117,11 @@ + - @@ -156,6 +158,10 @@ + + + +