Skip to content

Commit

Permalink
Prepare to rewrite rendering.
Browse files Browse the repository at this point in the history
  • Loading branch information
Epicguru committed Apr 12, 2024
1 parent e078794 commit d0f7e98
Show file tree
Hide file tree
Showing 14 changed files with 94 additions and 65 deletions.
13 changes: 13 additions & 0 deletions Patch_FacialAnimation/1.5/Patches/FacialAnimationPatch.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

<!-- Patches facial animation mod to use the melee attack animation during duels and executions -->
<Patch>

<!-- Note: this assumes that all animations are melee animations. This should probably be fixed -->
<Operation Class="PatchOperationAdd">
<xpath>/Defs/FacialAnimation.FaceAnimationDef[defName="AttackMelee"]/targetJobs</xpath>
<value>
<li>AM_InAnimation</li>
<li>AM_GrapplePawn</li>
</value>
</Operation>
</Patch>
2 changes: 0 additions & 2 deletions Source/AlienRacesPatch/AlienRacesPatch.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">

<Import Project="../GlobalCommon.targets"/>

<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
Expand Down
19 changes: 2 additions & 17 deletions Source/AnimationMod/AnimRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -182,9 +182,7 @@ private static void DrawSingle(AnimRenderer renderer, float? dt, Action<AnimRend
// Draw and handle events.
try
{
//Core.Log($"R2: {renderer}");
bool cull = Core.Settings.OffscreenCulling && !viewBounds.Contains(renderer.RootPosition.ToIntVec3());
Core.Log($"Pre-draw with {renderer}");
renderer.Draw(null, dt ?? 0, onEvent, cull, labelDraw);
}
catch (Exception e)
Expand Down Expand Up @@ -727,7 +725,6 @@ public virtual bool IsPawnValid(Pawn p, bool ignoreNotSpawned = false)

public void Draw(float? atTime, float dt, Action<AnimRenderer, EventBase> eventOutput, bool cullDraw, Action<Pawn, Vector2> labelDraw = null)
{
Core.Log("Start draw 2");
if (IsDestroyed)
return;

Expand All @@ -736,8 +733,6 @@ public void Draw(float? atTime, float dt, Action<AnimRenderer, EventBase> eventO
if (item != null)
item.MirrorHorizontal = MirrorHorizontal;

Core.Log("A");

if (eventOutput != null)
Seek(atTime, dt, e => eventOutput(this, e));
else
Expand All @@ -757,17 +752,11 @@ public void Draw(float? atTime, float dt, Action<AnimRenderer, EventBase> 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;
Expand Down Expand Up @@ -803,8 +792,6 @@ public void Draw(float? atTime, float dt, Action<AnimRenderer, EventBase> 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++)
{
Expand Down Expand Up @@ -846,15 +833,11 @@ public void Draw(float? atTime, float dt, Action<AnimRenderer, EventBase> 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);
Expand Down Expand Up @@ -991,9 +974,11 @@ protected void DrawPawns(Action<Pawn, Vector2> 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;
}
Expand Down
2 changes: 0 additions & 2 deletions Source/AnimationMod/AnimationMod.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@

<Project Sdk="Microsoft.NET.Sdk">

<Import Project="../GlobalCommon.targets" />

<PropertyGroup>
<TargetFramework>net472</TargetFramework>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,20 @@ namespace AM.Patches;
/// <summary>
/// Used to override drawing melee weapons.
/// </summary>
[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<CompEquippable>()?.Holder;
if (pawn == null)
return true;

var comp = pawn.GetComp<IdleControllerComp>();
if (comp == null)
return true; // Why would this ever be the case? Better safe than sorry though.
Expand Down
24 changes: 23 additions & 1 deletion Source/AnimationMod/Patches/Patch_PawnRenderer_RenderPawnAt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,18 @@ namespace AM.Patches;
/// <summary>
/// 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.
/// </summary>
[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);

Expand All @@ -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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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)
Expand All @@ -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;
Expand All @@ -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)
Expand All @@ -106,12 +133,12 @@ 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;
bodyFacing = HeadRotation;
renderBody = false;
return true;
}
}
}
3 changes: 0 additions & 3 deletions Source/AnimationMod/Patches/Patch_PawnUtility_IsInvisible.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@

namespace AM.Patches;

/*
* Note: this changed in RW 1.5, the method that needs patching has changed.
*/

/// <summary>
/// Make pawns be considered invisible during animations.
Expand Down
2 changes: 0 additions & 2 deletions Source/CAI5000Patch/CAI5000Patch.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">

<Import Project="../GlobalCommon.targets"/>

<PropertyGroup>
<TargetFramework>net472</TargetFramework>
<OutputType>Library</OutputType>
Expand Down
2 changes: 0 additions & 2 deletions Source/CombatExtendedPatch/CombatExtendedPatch.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">

<Import Project="../GlobalCommon.targets"/>

<PropertyGroup>
<TargetFramework>net472</TargetFramework>
<OutputType>Library</OutputType>
Expand Down
File renamed without changes.
2 changes: 0 additions & 2 deletions Source/LightsaberPatch/LightsaberPatch.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">

<Import Project="../GlobalCommon.targets"/>

<PropertyGroup>
<TargetFramework>net480</TargetFramework>
<OutputType>Library</OutputType>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">

<Import Project="../GlobalCommon.targets" />

<PropertyGroup>
<TargetFramework>net472</TargetFramework>
<OutputType>Library</OutputType>
Expand Down
2 changes: 0 additions & 2 deletions Source/TacticowlPatch/TacticowlPatch.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">

<Import Project="../GlobalCommon.targets"/>

<PropertyGroup>
<TargetFramework>net472</TargetFramework>
<OutputType>Library</OutputType>
Expand Down

0 comments on commit d0f7e98

Please sign in to comment.