public override void DrawWornExtras() { base.DrawWornExtras(); if (!Pauldrons.NullOrEmpty()) { PawnRenderFlags flags = Wearer.Drawer.renderer.GetDefaultRenderFlags(Wearer); Quaternion quat = Quaternion.AngleAxis(0, Vector3.up); Vector3 vector = Wearer.Drawer.renderer.GetBodyPos(Wearer.DrawPos, out bool renderBody); Rot4 headfacing = Wearer.Rotation; Rot4 bodyFacing = Wearer.Rotation; bool portrait = flags.FlagSet(PawnRenderFlags.Portrait); Vector2 size = (portrait ? MeshPool.humanlikeBodySet.MeshAt(bodyFacing).bounds.size : Wearer.Drawer.renderer.graphics.nakedGraphic.MeshAt(bodyFacing).bounds.size); if (AdeptusIntergrationUtility.enabled_AlienRaces) { PawnRenderUtility.AlienRacesPatch(Wearer, bodyFacing, out size, portrait); } else { size = new Vector2(1.5f, 1.5f); } foreach (CompPauldronDrawer Pauldron in Pauldrons) { Vector3 center = vector + (quat * Pauldron.GetOffsetFor(bodyFacing, false)); if (Pauldron.activeEntries.NullOrEmpty()) { Pauldron.Initialize(); } foreach (ShoulderPadEntry entry in Pauldron.activeEntries) { // entry.Drawer = Pauldron; if (entry.apparel == null) { entry.apparel = this; } if (entry.Drawer == null) { Log.Warning("Warning! Drawer null"); } if (!entry.ForceDynamicDraw) { continue; } if (entry.ShouldDrawEntry(flags, bodyFacing, size, renderBody, out Graphic pauldronMat, out Mesh pauldronMesh, out Vector3 offset)) { if (Pauldron.onHead || renderBody) { Vector3 drawAt = Wearer.Drawer.DrawPos + (quat * Pauldron.GetOffsetFor(bodyFacing, false)); /* * drawAt.y += 0.009687258f; * drawAt.y += 0.022166021f; * drawAt.y += 0.028957527f; * drawAt.y += 0.97f; */ GenDraw.DrawMeshNowOrLater ( // pauldronMesh, PawnRenderUtility.GetPawnMesh(portrait, Wearer, entry.Props.flipWest && bodyFacing == Rot4.West ? bodyFacing.Opposite : bodyFacing, !Pauldron.onHead), drawAt + (quat * offset), quat, PawnRenderUtility.OverrideMaterialIfNeeded(pauldronMat.MatAt(bodyFacing), Wearer), flags.FlagSet(PawnRenderFlags.DrawNow) ); } } } } } if (!Extras.NullOrEmpty()) { PawnRenderFlags flags = Wearer.Drawer.renderer.GetDefaultRenderFlags(Wearer); Quaternion quat = Quaternion.AngleAxis(0, Vector3.up); Vector3 vector = Wearer.DrawPos; Rot4 headfacing = Wearer.Rotation; Rot4 bodyFacing = Wearer.Rotation; bool portrait = flags.FlagSet(PawnRenderFlags.Portrait); Vector2 size = (portrait ? MeshPool.humanlikeBodySet.MeshAt(bodyFacing).bounds.size : Wearer.Drawer.renderer.graphics.nakedGraphic.MeshAt(bodyFacing).bounds.size); if (AdeptusIntergrationUtility.enabled_AlienRaces) { PawnRenderUtility.AlienRacesPatch(Wearer, bodyFacing, out size, portrait); } else { size = new Vector2(1.5f, 1.5f); } foreach (CompApparelExtraPartDrawer ExtraDrawer in Extras) { Vector3 drawAt = Wearer.DrawPos; if (!ExtraDrawer.Props.ExtrasEntries.NullOrEmpty()) { bool onHead = ExtraDrawer.onHead || ExtraDrawer.ExtraPartEntry.OnHead || ExtraDrawer.Props.onHead; Rot4 facing = onHead ? headfacing : bodyFacing; if (!ExtraDrawer.ExtraPartEntry.DynamicDraw) { continue; } if (ExtraDrawer.ShouldDrawExtra(Wearer, this, facing, out Material extraMat)) { if (onHead || !PawnRenderFlagsExtension.FlagSet(flags, PawnRenderFlags.Invisible)) { if (onHead) { Vector3 v = vector + quat * Wearer.Drawer.renderer.BaseHeadOffsetAt(headfacing); drawAt = v + quat * new Vector3(ExtraDrawer.GetOffset(bodyFacing, ExtraDrawer.ExtraPartEntry).x *size.x, ExtraDrawer.GetOffset(bodyFacing, ExtraDrawer.ExtraPartEntry).y, ExtraDrawer.GetOffset(bodyFacing, ExtraDrawer.ExtraPartEntry).z *size.y); } else { drawAt = vector + (quat * new Vector3(ExtraDrawer.GetOffset(bodyFacing, ExtraDrawer.ExtraPartEntry).x *size.x, ExtraDrawer.GetOffset(bodyFacing, ExtraDrawer.ExtraPartEntry).y, ExtraDrawer.GetOffset(bodyFacing, ExtraDrawer.ExtraPartEntry).z *size.y)); } /* * GenDraw.DrawMeshNowOrLater * ( * // pauldronMesh, * PawnRenderUtility.GetPawnMesh(portrait, Wearer, facing, !onHead), * drawAt, * quat, * PawnRenderUtility.OverrideMaterialIfNeeded(extraMat, Wearer), * ExtraDrawer.ExtraPartEntry.animateExtra * ); */ Graphics.DrawMesh( PawnRenderUtility.GetPawnMesh(portrait, Wearer, facing, !onHead), drawAt, quat, PawnRenderUtility.OverrideMaterialIfNeeded(extraMat, Wearer), 0); } // vector.y += CompApparelExtaDrawer.MinClippingDistance; } } } } if (!Shields.NullOrEmpty()) { foreach (var item in Shields) { item.DrawShield(); } } }
public static void PawnRenderer_RenderPawnInternal_Postfix(ref PawnRenderer __instance, Vector3 rootLoc, float angle, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, RotDrawMode bodyDrawType = RotDrawMode.Fresh, bool portrait = false, bool headStump = false) { if (!__instance.graphics.AllResolved) { __instance.graphics.ResolveAllGraphics(); } Mesh mesh = null; Quaternion quat = Quaternion.AngleAxis(angle, Vector3.up); Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); if (AdeptusIntergrationUtil.enabled_AlienRaces) { AM_PawnRenderer_RenderPawnInternal_DrawExtras_Patch.AlienRacesPatch(ref __instance, rootLoc, angle, renderBody, bodyFacing, headFacing, out mesh, bodyDrawType, portrait, headStump); } else { if (pawn.RaceProps.Humanlike) { mesh = MeshPool.humanlikeBodySet.MeshAt(bodyFacing); } else { mesh = __instance.graphics.nakedGraphic.MeshAt(bodyFacing); } } if (renderBody) { Vector3 vector = rootLoc; if (pawn.apparel != null && pawn.apparel.WornApparelCount > 0) { for (int k = 0; k < pawn.apparel.WornApparel.Count; k++) { if (pawn.apparel.WornApparel[k].TryGetComp <CompPauldronDrawer>() != null) { foreach (CompPauldronDrawer Pauldron in pawn.apparel.WornApparel[k].AllComps.Where(x => x.GetType() == typeof(CompPauldronDrawer))) { if (!Pauldron.Props.PauldronEntries.NullOrEmpty()) { if (!Pauldron.pauldronInitialized) { if (Rand.Chance(Pauldron.Props.PauldronEntryChance)) { Pauldron.shoulderPadEntry = Pauldron.Props.PauldronEntries.RandomElementByWeight((ShoulderPadEntry x) => x.commonality); Pauldron.pauldronGraphicPath = Pauldron.shoulderPadEntry.padTexPath; Pauldron.useSecondaryColor = Pauldron.shoulderPadEntry.UseSecondaryColor; Pauldron.padType = Pauldron.shoulderPadEntry.shoulderPadType; } Pauldron.pauldronInitialized = true; } if (Pauldron.ShouldDrawPauldron(pawn, bodyFacing, out Material pauldronMat)) { vector.y += Pauldron.GetAltitudeOffset(bodyFacing); GenDraw.DrawMeshNowOrLater(mesh, vector, quat, pauldronMat, portrait); // vector.y += CompPauldronDrawer.MinClippingDistance; } } } } if (pawn.apparel.WornApparel[k].TryGetComp <CompApparelExtraDrawer>() != null) { foreach (CompApparelExtraDrawer Extas in pawn.apparel.WornApparel[k].AllComps.Where(x => x.GetType() == typeof(CompApparelExtraDrawer))) { if (!Extas.pprops.ExtrasEntries.NullOrEmpty()) { if (Extas.ShouldDrawExtra(pawn, pawn.apparel.WornApparel[k], bodyFacing, out Material extraMat)) { Vector3 drawAt = vector; if (Extas.onHead) { drawAt = vector + __instance.BaseHeadOffsetAt(headFacing); } drawAt.y += Extas.GetAltitudeOffset(bodyFacing, Extas.ExtraPartEntry); GenDraw.DrawMeshNowOrLater(mesh, drawAt, quat, extraMat, portrait); // vector.y += CompApparelExtaDrawer.MinClippingDistance; } } } } Apparel_VisibleAccessory VisibleAccessory; if (pawn.apparel.WornApparel[k].GetType() == typeof(Apparel_VisibleAccessory)) { VisibleAccessory = (Apparel_VisibleAccessory)pawn.apparel.WornApparel[k]; } //ApparelGraphicRecord apparelGraphicRecord = __instance.graphics.apparelGraphics[k]; //if (apparelGraphicRecord.sourceApparel.def.apparel.LastLayer == ApparelLayer.Shell) //{ // Material material2 = apparelGraphicRecord.graphic.MatAt(bodyFacing, null); // material2 = __instance.graphics.flasher.GetDamagedMat(material2); // GenDraw.DrawMeshNowOrLater(mesh, vector, quat, material2, portrait); //} } } if (!pawn.Dead) { for (int l = 0; l < pawn.health.hediffSet.hediffs.Count; l++) { Vector3 drawAt = vector; HediffComp_DrawImplant_AdMech drawer = pawn.health.hediffSet.hediffs[l].TryGetComp <HediffComp_DrawImplant_AdMech>(); if (drawer != null) { Material material = null; if (drawer.implantDrawProps.implantDrawerType != ImplantDrawerType.Head) { drawAt.y += 0.005f; if (bodyFacing == Rot4.South && drawer.implantDrawProps.implantDrawerType == ImplantDrawerType.Backpack) { drawAt.y -= 0.3f; } material = drawer.ImplantMaterial(pawn, bodyFacing); // GenDraw.DrawMeshNowOrLater(mesh, drawAt, quat, material, portrait); } else { if (!pawn.Downed && !pawn.Dead && drawer.implantDrawProps.useHeadOffset) { drawAt = vector + __instance.BaseHeadOffsetAt(headFacing); } else { if (pawn.Downed || pawn.Dead && drawer.implantDrawProps.useHeadOffset) { drawAt.y = vector.y + __instance.BaseHeadOffsetAt(headFacing).y; } } drawAt.y += 0.005f; material = drawer.ImplantMaterial(pawn, headFacing); // GenDraw.DrawMeshNowOrLater(mesh, drawAt, quat, material, portrait); } if (material != null) { // GenDraw.DrawMeshNowOrLater(mesh, drawAt , quat, material, portrait); // Angle calculation to not pick the shortest, taken from Quaternion.Angle and modified GenDraw.DrawMeshNowOrLater(mesh: mesh, loc: drawAt + drawer.offsetVector().RotatedBy(angle: Mathf.Acos(f: Quaternion.Dot(a: Quaternion.identity, b: quat)) * 2f * 57.29578f), quat: quat, mat: material, drawNow: portrait); drawAt.y += HediffComp_DrawImplant_AdMech.MinClippingDistance; } } HediffComp_Shield _Shield; if ((_Shield = pawn.health.hediffSet.hediffs[l].TryGetComp <HediffComp_Shield>()) != null) { _Shield.DrawWornExtras(); } } } } }