public static void DrawAddons(bool portrait, Vector3 vector, Pawn pawn, Quaternion quat, Rot4 bodyFacing, bool invisible, Mesh mesh, Rot4 headfacing, bool renderBody) { if (invisible) { return; } Vector2 size = mesh?.bounds.size ?? (portrait ? MeshPool.humanlikeBodySet.MeshAt(bodyFacing).bounds.size : pawn.Drawer.renderer.graphics.nakedGraphic.MeshAt(bodyFacing).bounds.size); if (pawn.apparel != null && pawn.apparel.WornApparelCount > 0) { if (AdeptusIntergrationUtility.enabled_AlienRaces) { PawnRenderUtility.AlienRacesPatch(pawn, bodyFacing, out size, portrait); } else { size = new Vector2(1.5f, 1.5f); } List <Apparel> worn = pawn.apparel.WornApparel; for (int wa = 0; wa < worn.Count; wa++) { Apparel apparel = worn[wa]; ApparelComposite composite = apparel as ApparelComposite; if (composite != null) { if (!composite.Pauldrons.NullOrEmpty() && AMAMod.settings.AllowPauldronDrawer) { for (int i = 0; i < composite.Pauldrons.Count; i++) { CompPauldronDrawer Pauldron = composite.Pauldrons[i] as CompPauldronDrawer; if (Pauldron != null) { 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 = apparel; } if (entry.Drawer == null) { Log.Warning("Warning! Drawer null"); } if (entry.ShouldDrawEntry(portrait, bodyFacing, size, renderBody, out Graphic pauldronMat, out Mesh pauldronMesh, out Vector3 offset)) { if (Pauldron.onHead || renderBody) { GenDraw.DrawMeshNowOrLater ( // pauldronMesh, PawnRenderUtility.GetPawnMesh(portrait, pawn, entry.Props.flipWest && bodyFacing == Rot4.West ? bodyFacing.Opposite : bodyFacing, !Pauldron.onHead), center + (quat * offset), quat, PawnRenderUtility.OverrideMaterialIfNeeded(pauldronMat.MatAt(bodyFacing), pawn), portrait ); } } } } } } if (!composite.Extras.NullOrEmpty() && AMAMod.settings.AllowExtraPartDrawer) { for (int i = 0; i < composite.Extras.Count; i++) { CompApparelExtraPartDrawer ExtraDrawer = composite.Extras[i] as CompApparelExtraPartDrawer; if (ExtraDrawer != null) { Vector3 drawAt = vector; if (!ExtraDrawer.Props.ExtrasEntries.NullOrEmpty()) { bool onHead = ExtraDrawer.onHead || ExtraDrawer.ExtraPartEntry.OnHead || ExtraDrawer.Props.onHead; Rot4 facing = onHead ? headfacing : bodyFacing; if (ExtraDrawer.ShouldDrawExtra(pawn, apparel, facing, out Material extraMat)) { if (onHead || renderBody) { if (onHead) { Vector3 v = vector + quat * pawn.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, pawn, facing, !onHead), drawAt, quat, PawnRenderUtility.OverrideMaterialIfNeeded(extraMat, pawn), portrait ); } // vector.y += CompApparelExtaDrawer.MinClippingDistance; } } } } } } else { for (int i = 0; i < apparel.AllComps.Count; i++) { if (AMAMod.settings.AllowPauldronDrawer) { CompPauldronDrawer Pauldron = apparel.AllComps[i] as CompPauldronDrawer; if (Pauldron != null) { 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 = apparel; } if (entry.Drawer == null) { Log.Warning("Warning! Drawer null"); } if (entry.ShouldDrawEntry(portrait, bodyFacing, size, renderBody, out Graphic pauldronMat, out Mesh pauldronMesh, out Vector3 offset)) { if (Pauldron.onHead || renderBody && pauldronMat != null) { GenDraw.DrawMeshNowOrLater ( // pauldronMesh, PawnRenderUtility.GetPawnMesh(portrait, pawn, entry.Props.flipWest && bodyFacing == Rot4.West ? bodyFacing.Opposite : bodyFacing, !Pauldron.onHead), center + (quat * offset), quat, PawnRenderUtility.OverrideMaterialIfNeeded(pauldronMat.MatAt(bodyFacing), pawn), portrait ); } } } } } if (AMAMod.settings.AllowExtraPartDrawer) { CompApparelExtraPartDrawer ExtraDrawer = apparel.AllComps[i] as CompApparelExtraPartDrawer; if (ExtraDrawer != null) { Vector3 drawAt = vector; if (!ExtraDrawer.Props.ExtrasEntries.NullOrEmpty()) { bool onHead = ExtraDrawer.onHead || ExtraDrawer.ExtraPartEntry.OnHead || ExtraDrawer.Props.onHead; Rot4 facing = onHead ? headfacing : bodyFacing; if (ExtraDrawer.ShouldDrawExtra(pawn, apparel, facing, out Material extraMat)) { if (onHead || renderBody) { if (onHead) { Vector3 v = vector + quat * pawn.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, pawn, facing, !onHead), drawAt, quat, PawnRenderUtility.OverrideMaterialIfNeeded(extraMat, pawn), portrait ); } // vector.y += CompApparelExtaDrawer.MinClippingDistance; } } } } } } } } if (!pawn.Dead && AMAMod.settings.AllowHediffPartDrawer) { Vector3 drawAt = vector; for (int i = 0; i < AdeptusHediffUtility.GraphicHediffs.Count; i++) { if (pawn.health.hediffSet.GetFirstHediffOfDef(AdeptusHediffUtility.GraphicHediffs[i]) is HediffWithComps hediff) { if (hediff.TryGetCompFast <HediffComp_DrawImplant_AdMech>() is HediffComp_DrawImplant_AdMech drawer) { 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 + pawn.Drawer.renderer.BaseHeadOffsetAt(headfacing); } else { if ((pawn.Downed || pawn.Dead) && drawer.implantDrawProps.useHeadOffset) { drawAt.y = vector.y + pawn.Drawer.renderer.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); material = PawnRenderUtility.OverrideMaterialIfNeeded(material, pawn); // 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; } } } } /* * for (int hd = 0; hd < pawn.health.hediffSet.hediffs.Count; hd++) * { * Vector3 drawAt = vector; * HediffWithComps hediff = pawn.health.hediffSet.hediffs[hd] as HediffWithComps; * if (hediff != null) * { * for (int i = 0; i < hediff.comps.Count; i++) * { * HediffComp_DrawImplant_AdMech drawer = hediff.comps[i] as 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 + pawn.Drawer.renderer.BaseHeadOffsetAt(headfacing); * } * else * { * if (pawn.Downed || pawn.Dead && drawer.implantDrawProps.useHeadOffset) * { * drawAt.y = vector.y + pawn.Drawer.renderer.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); * * material = OverrideMaterialIfNeeded(material, pawn); * // 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 = hediff.comps[i] as HediffComp_Shield) != null) * { * _Shield.DrawWornExtras(); * } * } * } * } */ } }
public static bool _RenderPawnInternal(PawnRenderer __instance, Vector3 rootLoc, Quaternion quat, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, RotDrawMode bodyDrawType = 0, bool portrait = false) { Log.Message("Calling"); PawnRenderer renderer = __instance; if (!renderer.graphics.AllResolved) { renderer.graphics.ResolveAllGraphics(); } Mesh mesh = null; Pawn pawn = (Pawn)HarmonyPatches.pawnInfo.GetValue(renderer); if (pawn is AlienPawn && (pawn as AlienPawn).bodySet == null) { (pawn as AlienPawn).UpdateSets(); } Corruption.CompPsyker compPsyker = pawn.TryGetComp <CompPsyker>(); List <HediffComp_DrawImplant> implantDrawers = HarmonyPatches.implantDrawers(pawn); string patronName = "Emperor"; bool drawChaos = false; if (compPsyker != null) { patronName = compPsyker.patronName; // Log.Message("GettingComp: " + patronName); if (patronName == "Khorne" || patronName == "Nurgle" || patronName == "Tzeentch" || patronName == "Undivided") { // Log.Message("drawChaos"); drawChaos = true; } } if (renderBody || (pawn.InBed() && pawn.ageTracker.CurLifeStageIndex <= 1)) { if (pawn.RaceProps.Humanlike) { if (pawn.ageTracker.CurLifeStageIndex == 2) { rootLoc.z -= 0.15f; } if (pawn.ageTracker.CurLifeStageIndex < 2 && pawn.InBed() && !portrait) { // Undo the offset for babies/toddlers in bed Building_Bed building_bed = pawn.CurrentBed(); Vector3 offset = new Vector3(0, 0, 0.5f).RotatedBy(building_bed.Rotation.AsAngle); rootLoc -= offset; } } Vector3 vector = rootLoc; vector.y += 0.005f; if (bodyDrawType == RotDrawMode.Dessicated && !pawn.RaceProps.Humanlike && renderer.graphics.dessicatedGraphic != null && !portrait) { renderer.graphics.dessicatedGraphic.Draw(vector, bodyFacing, pawn); } else { bool humanlike = pawn.RaceProps.Humanlike; if (humanlike) { mesh = ((pawn is AlienPawn) ? (pawn as AlienPawn).bodySet : MeshPool.humanlikeBodySet).MeshAt(bodyFacing); } else { mesh = renderer.graphics.nakedGraphic.MeshAt(bodyFacing); } List <Material> list = renderer.graphics.MatsBodyBaseAt(bodyFacing, bodyDrawType); for (int i = 0; i < list.Count; i++) { Material damagedMat = renderer.graphics.flasher.GetDamagedMat(list[i]); if (pawn.ageTracker.CurLifeStageIndex == 2 && pawn.RaceProps.Humanlike) { damagedMat.mainTextureScale = new Vector2(1, 1.3f); damagedMat.mainTextureOffset = new Vector2(0, -0.2f); if (bodyFacing == Rot4.West || bodyFacing == Rot4.East) { damagedMat.mainTextureOffset = new Vector2(-0.015f, -0.2f); } } GenDraw.DrawMeshNowOrLater(mesh, vector, quat, damagedMat, portrait); vector.y += 0.003f; if (i == 0) { if (drawChaos) { Material markMat = (Corruption.AfflictionDrawerUtility.GetBodyOverlay(pawn.story.bodyType, patronName).MatAt(bodyFacing)); if (pawn.ageTracker.CurLifeStageIndex == 2 && pawn.RaceProps.Humanlike) { markMat.mainTextureScale = new Vector2(1, 1.3f); markMat.mainTextureOffset = new Vector2(0, -0.2f); if (bodyFacing == Rot4.West || bodyFacing == Rot4.East) { markMat.mainTextureOffset = new Vector2(-0.015f, -0.2f); } } GenDraw.DrawMeshNowOrLater(mesh, vector, quat, markMat, portrait); vector.y += 0.003f; } } } if (bodyDrawType == 0) { Vector3 vector2 = rootLoc; vector2.y += 0.02f; ((PawnWoundDrawer)HarmonyPatches.woundInfo.GetValue(renderer)).RenderOverBody(vector2, mesh, quat, portrait); } } } Vector3 vector3 = rootLoc; Vector3 vector4 = rootLoc; if (bodyFacing != Rot4.North) { vector4.y += 0.03f; vector3.y += 0.0249999985f; } else { vector4.y += 0.0249999985f; vector3.y += 0.03f; } if (renderer.graphics.headGraphic != null && pawn.ageTracker.CurLifeStageIndex >= 1) { Vector3 vector5 = quat * renderer.BaseHeadOffsetAt(headFacing); Mesh mesh2 = ((pawn is AlienPawn) ? (pawn as AlienPawn).headSet : MeshPool.humanlikeHeadSet).MeshAt(headFacing); Material material = renderer.graphics.HeadMatAt(headFacing, bodyDrawType); GenDraw.DrawMeshNowOrLater(mesh2, vector4 + vector5, quat, material, portrait); if (drawChaos) { Material headMarkMat = (AfflictionDrawerUtility.GetHeadGraphic(pawn, patronName).MatAt(bodyFacing)); vector5.y += 0.005f; GenDraw.DrawMeshNowOrLater(mesh2, vector4 + vector5, quat, headMarkMat, portrait); } Vector3 vector6 = rootLoc + vector5; vector6.y += 0.035f; bool flag7 = false; if (pawn.ageTracker.CurLifeStageIndex >= 2) { Mesh mesh3 = HarmonyPatches.HairMeshSet(pawn).MeshAt(headFacing); List <ApparelGraphicRecord> apparelGraphics = renderer.graphics.apparelGraphics; for (int j = 0; j < apparelGraphics.Count; j++) { if (apparelGraphics[j].sourceApparel.def.apparel.LastLayer == ApparelLayer.Overhead) { if ((!pawn.story.hairDef.hairTags.Contains("DrawUnderHat") && !pawn.story.hairDef.hairTags.Contains("Beard")) || pawn.apparel.BodyPartGroupIsCovered(BodyPartGroupDefOf.FullHead)) { flag7 = true; // flag=true stops the hair from being drawn } Material material2 = apparelGraphics[j].graphic.MatAt(bodyFacing, null); material2 = renderer.graphics.flasher.GetDamagedMat(material2); if (pawn.ageTracker.CurLifeStageIndex == 2) { material2.mainTextureOffset = new Vector2(0, 0.018f); material2.mainTexture.wrapMode = TextureWrapMode.Clamp; } GenDraw.DrawMeshNowOrLater(mesh3, vector6, quat, material2, portrait); Material detailMat; if (ApparelDetailDrawer.GetDetailGraphic(pawn, apparelGraphics[j].sourceApparel, bodyFacing, out detailMat)) { Vector3 vectorDet = vector6; vectorDet.y += 0.005f; GenDraw.DrawMeshNowOrLater(mesh3, vectorDet, quat, detailMat, portrait); } } } } if (!flag7 && bodyDrawType != RotDrawMode.Dessicated) { Mesh mesh4 = HarmonyPatches.HairMeshSet(pawn).MeshAt(headFacing); Material material3 = renderer.graphics.HairMatAt(headFacing); // Hopefully stops graphic issues from modifying texture offset/scale material3.mainTexture.wrapMode = TextureWrapMode.Clamp; // Scale down the child hair to fit the head if (pawn.ageTracker.CurLifeStageIndex <= 2) { material3.mainTextureScale = new Vector2(1.13f, 1.13f); material3.mainTextureOffset = new Vector2(-0.065f, -0.045f); } // Scale down the toddler hair to fit the head if (pawn.ageTracker.CurLifeStageIndex == 1) { // mat2.mainTextureScale = new Vector2 (1.25f, 1.25f); material3.mainTextureOffset = new Vector2(-0.07f, 0.12f); } GenDraw.DrawMeshNowOrLater(mesh4, vector6, quat, material3, portrait); } } if (renderBody) { for (int k = 0; k < renderer.graphics.apparelGraphics.Count; k++) { ApparelGraphicRecord apparelGraphicRecord = renderer.graphics.apparelGraphics[k]; if (apparelGraphicRecord.sourceApparel.def.apparel.LastLayer == ApparelLayer.Shell) { Material material4 = apparelGraphicRecord.graphic.MatAt(bodyFacing, null); material4 = renderer.graphics.flasher.GetDamagedMat(material4); if (pawn.ageTracker.CurLifeStageIndex == 2) { material4.mainTextureScale = new Vector2(1.00f, 1.22f); material4.mainTextureOffset = new Vector2(0, -0.1f); } GenDraw.DrawMeshNowOrLater(mesh, vector3, quat, material4, portrait); } Material pauldronMat; if (CompPauldronDrawer.ShouldDrawPauldron(pawn, renderer.graphics.apparelGraphics[k].sourceApparel, bodyFacing, out pauldronMat)) { if (pawn.ageTracker.CurLifeStageIndex == 2) { pauldronMat.mainTextureScale = new Vector2(1.00f, 1.22f); pauldronMat.mainTextureOffset = new Vector2(0, -0.1f); } vector3.y += 0.005f; GenDraw.DrawMeshNowOrLater(mesh, vector3, quat, pauldronMat, portrait); } } if (!pawn.Dead) { for (int l = 0; l < pawn.health.hediffSet.hediffs.Count; l++) { HediffComp_DrawImplant drawer; if ((drawer = pawn.health.hediffSet.hediffs[l].TryGetComp <HediffComp_DrawImplant>()) != null) { if (drawer.implantDrawProps.implantDrawerType != ImplantDrawerType.Head) { vector3.y += 0.005f; if (bodyFacing == Rot4.South && drawer.implantDrawProps.implantDrawerType == ImplantDrawerType.Backpack) { vector3.y -= 0.3f; } Material implantMat = drawer.ImplantMaterial(pawn, bodyFacing); GenDraw.DrawMeshNowOrLater(mesh, vector3, quat, implantMat, portrait); vector3.y += 0.005f; } } } } } if (!portrait && pawn.RaceProps.Animal && pawn.inventory != null && pawn.inventory.innerContainer.Count() > 0) { Graphics.DrawMesh(mesh, vector3, quat, renderer.graphics.packGraphic.MatAt(pawn.Rotation, null), 0); } if (!portrait) { HarmonyPatches.equipInfo.Invoke(renderer, new object[] { rootLoc }); if (pawn.apparel != null) { List <Apparel> wornApparel = pawn.apparel.WornApparel; for (int l = 0; l < wornApparel.Count; l++) { wornApparel[l].DrawWornExtras(); } } Vector3 vector7 = rootLoc; vector7.y += 0.0449999981f; ((PawnHeadOverlays)HarmonyPatches.statusInfo.GetValue(renderer)).RenderStatusOverlays(vector7, quat, ((pawn is AlienPawn) ? (pawn as AlienPawn).headSet : MeshPool.humanlikeHeadSet).MeshAt(headFacing)); } return(false); }
private static void RenderPawnInternal(PawnRenderer __instance, Vector3 rootLoc, Quaternion quat, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, RotDrawMode bodyDrawType = RotDrawMode.Fresh, bool portrait = false) { Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); if (!pawn.def.race.Humanlike) { return; } Corruption.CompPsyker compPsyker = pawn.TryGetComp <CompPsyker>(); List <HediffComp_DrawImplant> implantDrawers = HarmonyPatches.implantDrawers(pawn); string patronName = "Emperor"; bool drawChaos = false; if (compPsyker != null) { patronName = compPsyker.patronName; // Log.Message("GettingComp: " + patronName); if (patronName == "Khorne" || patronName == "Nurgle" || patronName == "Tzeentch" || patronName == "Undivided") { // Log.Message("drawChaos"); drawChaos = true; } } if (!__instance.graphics.AllResolved) { __instance.graphics.ResolveAllGraphics(); } Mesh mesh = null; if (renderBody) { Vector3 loc = rootLoc; loc.y += 0.005f; if (bodyDrawType == RotDrawMode.Dessicated && !pawn.RaceProps.Humanlike && __instance.graphics.dessicatedGraphic != null && !portrait) { __instance.graphics.dessicatedGraphic.Draw(loc, bodyFacing, pawn); } else { ThingDef_AlienRace alienDef = pawn.def as ThingDef_AlienRace; if (alienDef != null) { Mesh mesh2; if (bodyDrawType == RotDrawMode.Rotting) { if (__instance.graphics.dessicatedGraphic.ShouldDrawRotated) { mesh2 = MeshPool.GridPlane(portrait ? alienDef.alienRace.generalSettings.alienPartGenerator.CustomPortraitDrawSize : alienDef.alienRace.generalSettings.alienPartGenerator.CustomDrawSize); } else { Vector2 size = portrait ? alienDef.alienRace.generalSettings.alienPartGenerator.CustomPortraitDrawSize : alienDef.alienRace.generalSettings.alienPartGenerator.CustomDrawSize; if (bodyFacing.IsHorizontal) { size = size.Rotated(); } if (bodyFacing == Rot4.West && (__instance.graphics.dessicatedGraphic.data == null || __instance.graphics.dessicatedGraphic.data.allowFlip)) { mesh = MeshPool.GridPlaneFlip(size); } mesh = MeshPool.GridPlane(size); } } else { mesh = (portrait ? alienDef.alienRace.generalSettings.alienPartGenerator.bodyPortraitSet.MeshAt(bodyFacing) : alienDef.alienRace.generalSettings.alienPartGenerator.bodySet.MeshAt(bodyFacing)); } } else { if (pawn.RaceProps.Humanlike) { mesh = MeshPool.humanlikeBodySet.MeshAt(bodyFacing); } else { mesh = __instance.graphics.nakedGraphic.MeshAt(bodyFacing); } } List <Material> list = __instance.graphics.MatsBodyBaseAt(bodyFacing, bodyDrawType); for (int i = 0; i < list.Count; i++) { // Material damagedMat = __instance.graphics.flasher.GetDamagedMat(list[i]); // GenDraw.DrawMeshNowOrLater(mesh, loc, quat, damagedMat, portrait); loc.y += 0.005f; if (i == 0) { if (drawChaos) { Material markMat = (Corruption.AfflictionDrawerUtility.GetBodyOverlay(pawn.story.bodyType, patronName).MatAt(bodyFacing)); if (pawn.ageTracker.CurLifeStageIndex == 2 && pawn.RaceProps.Humanlike) { markMat.mainTextureScale = new Vector2(1, 1.3f); markMat.mainTextureOffset = new Vector2(0, -0.2f); if (bodyFacing == Rot4.West || bodyFacing == Rot4.East) { markMat.mainTextureOffset = new Vector2(-0.015f, -0.2f); } } GenDraw.DrawMeshNowOrLater(mesh, loc, quat, markMat, portrait); loc.y += 0.005f; } } if (bodyDrawType == RotDrawMode.Fresh) { Vector3 drawLoc = rootLoc; drawLoc.y += 0.02f; // Traverse.Create(__instance).Field("woundOverlays").GetValue<PawnWoundDrawer>().RenderOverBody(drawLoc, mesh, quat, portrait); } } } Vector3 vector = rootLoc; Vector3 a = rootLoc; if (bodyFacing != Rot4.North) { a.y += 0.03f; vector.y += 0.0249999985f; } else { a.y += 0.0249999985f; vector.y += 0.03f; } if (__instance.graphics.headGraphic != null) { Vector3 b = quat * __instance.BaseHeadOffsetAt(headFacing); Mesh mesh2 = MeshPool.humanlikeHeadSet.MeshAt(headFacing); Material mat = __instance.graphics.HeadMatAt(headFacing, bodyDrawType); // GenDraw.DrawMeshNowOrLater(mesh2, a + b, quat, mat, portrait); if (drawChaos) { Material headMarkMat = (AfflictionDrawerUtility.GetHeadGraphic(pawn, patronName).MatAt(bodyFacing)); // vector.y += 0.005f; GenDraw.DrawMeshNowOrLater(mesh2, a + b + new Vector3(0f, 0.004f, 0f), quat, headMarkMat, portrait); } Vector3 loc2 = rootLoc + b; loc2.y += 0.035f; bool flag = false; Mesh mesh3 = __instance.graphics.HairMeshSet.MeshAt(headFacing); List <ApparelGraphicRecord> apparelGraphics = __instance.graphics.apparelGraphics; for (int j = 0; j < apparelGraphics.Count; j++) { if (apparelGraphics[j].sourceApparel.def.apparel.LastLayer == ApparelLayer.Overhead) { flag = true; Material material = apparelGraphics[j].graphic.MatAt(bodyFacing, null); material = __instance.graphics.flasher.GetDamagedMat(material); // GenDraw.DrawMeshNowOrLater(mesh3, loc2, quat, material, portrait); } if (!flag && bodyDrawType != RotDrawMode.Dessicated) { Mesh mesh4 = __instance.graphics.HairMeshSet.MeshAt(headFacing); Material mat2 = __instance.graphics.HairMatAt(headFacing); // GenDraw.DrawMeshNowOrLater(mesh4, loc2, quat, mat2, portrait); } } if (renderBody) { for (int k = 0; k < __instance.graphics.apparelGraphics.Count; k++) { Material pauldronMat; if (CompPauldronDrawer.ShouldDrawPauldron(pawn, __instance.graphics.apparelGraphics[k].sourceApparel, bodyFacing, out pauldronMat)) { if (pawn.ageTracker.CurLifeStageIndex == 2) { pauldronMat.mainTextureScale = new Vector2(1.00f, 1.22f); pauldronMat.mainTextureOffset = new Vector2(0, -0.1f); } vector.y += 0.035f; GenDraw.DrawMeshNowOrLater(mesh, vector, quat, pauldronMat, portrait); } 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++) { HediffComp_DrawImplant drawer; if ((drawer = pawn.health.hediffSet.hediffs[l].TryGetComp <HediffComp_DrawImplant>()) != null) { if (drawer.implantDrawProps.implantDrawerType != ImplantDrawerType.Head) { vector.y += 0.005f; if (bodyFacing == Rot4.South && drawer.implantDrawProps.implantDrawerType == ImplantDrawerType.Backpack) { vector.y -= 0.3f; } Material implantMat = drawer.ImplantMaterial(pawn, bodyFacing); GenDraw.DrawMeshNowOrLater(mesh, vector, quat, implantMat, portrait); vector.y += 0.005f; } } } } } } } } }
public static ApparelGraphicRecord GraphicRecord(Pawn pawn, ApparelGraphicRecord record, Quaternion quat, Vector3 vector, bool renderBody, bool portrait, Rot4 bodyFacing, Rot4 headFacing) { Vector3 vector2 = vector; Vector3 vector3 = vector; bool flag12 = bodyFacing == Rot4.North; if (flag12) { vector2.y -= 0.02734375f; vector3.y = vector2.y + 0.0234375f; } else { vector2.y -= 0.0234375f; vector3.y = vector2.y + 0.02734375f; } Mesh mesh = null; Vector2 size = mesh?.bounds.size ?? (portrait ? MeshPool.humanlikeBodySet.MeshAt(bodyFacing).bounds.size : pawn.Drawer.renderer.graphics.nakedGraphic.MeshAt(bodyFacing).bounds.size); if (AdeptusIntergrationUtility.enabled_AlienRaces) { PawnRenderUtility.AlienRacesPatch(pawn, bodyFacing, out size, portrait); } else { size = new Vector2(1.5f, 1.5f); } Apparel apparel = record.sourceApparel; if (apparel is ApparelComposite composite) { if (!composite.Pauldrons.NullOrEmpty() && AMAMod.settings.AllowPauldronDrawer) { for (int i = 0; i < composite.Pauldrons.Count; i++) { CompPauldronDrawer Pauldron = composite.Pauldrons[i] as CompPauldronDrawer; if (Pauldron != null) { Vector3 center = vector; center.y = pawn.DrawPos.y; center = center + (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 = apparel; } if (entry.Drawer == null) { Log.Warning("Warning! Drawer null"); } if (entry.ShouldDrawEntry(portrait, bodyFacing, size, renderBody, out Graphic pauldronMat, out Mesh pauldronMesh, out Vector3 offset)) { if (Pauldron.onHead || renderBody) { GenDraw.DrawMeshNowOrLater ( // pauldronMesh, PawnRenderUtility.GetPawnMesh(portrait, pawn, entry.Props.flipWest && bodyFacing == Rot4.West ? bodyFacing.Opposite : bodyFacing, !Pauldron.onHead), center + (quat * offset), quat, PawnRenderUtility.OverrideMaterialIfNeeded(pauldronMat.MatAt(bodyFacing), pawn), portrait ); } } } } } } if (!composite.Extras.NullOrEmpty() && AMAMod.settings.AllowExtraPartDrawer) { for (int i = 0; i < composite.Extras.Count; i++) { CompApparelExtraPartDrawer ExtraDrawer = composite.Extras[i] as CompApparelExtraPartDrawer; if (ExtraDrawer != null) { Vector3 drawAt = vector; if (!ExtraDrawer.Props.ExtrasEntries.NullOrEmpty()) { bool onHead = ExtraDrawer.onHead || ExtraDrawer.ExtraPartEntry.OnHead || ExtraDrawer.Props.onHead; Rot4 facing = onHead ? headFacing : bodyFacing; if (ExtraDrawer.ShouldDrawExtra(pawn, apparel, facing, out Material extraMat)) { if (onHead || renderBody) { if (onHead) { Vector3 v = vector + quat * pawn.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, pawn, facing, !onHead), drawAt, quat, PawnRenderUtility.OverrideMaterialIfNeeded(extraMat, pawn), portrait ); } // vector.y += CompApparelExtaDrawer.MinClippingDistance; } } } } } } else { if (PawnRenderUtility.CompositeApparel(apparel)) { for (int i = 0; i < apparel.AllComps.Count; i++) { if (AMAMod.settings.AllowPauldronDrawer) { CompPauldronDrawer Pauldron = apparel.AllComps[i] as CompPauldronDrawer; if (Pauldron != null) { Vector3 center = vector2; center.y = pawn.DrawPos.y; center = center + (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 = apparel; } if (entry.Drawer == null) { Log.Warning("Warning! Drawer null"); } if (entry.ShouldDrawEntry(portrait, bodyFacing, size, renderBody, out Graphic pauldronMat, out Mesh pauldronMesh, out Vector3 offset)) { if (Pauldron.onHead || renderBody && pauldronMat != null) { GenDraw.DrawMeshNowOrLater ( // pauldronMesh, PawnRenderUtility.GetPawnMesh(portrait, pawn, entry.Props.flipWest && bodyFacing == Rot4.West ? bodyFacing.Opposite : bodyFacing, !Pauldron.onHead), center + (quat * offset), quat, PawnRenderUtility.OverrideMaterialIfNeeded(pauldronMat.MatAt(bodyFacing), pawn), portrait ); } } } } } if (AMAMod.settings.AllowExtraPartDrawer) { CompApparelExtraPartDrawer ExtraDrawer = apparel.AllComps[i] as CompApparelExtraPartDrawer; if (ExtraDrawer != null) { Vector3 drawAt = vector; if (!ExtraDrawer.Props.ExtrasEntries.NullOrEmpty()) { bool onHead = ExtraDrawer.onHead || ExtraDrawer.ExtraPartEntry.OnHead || ExtraDrawer.Props.onHead; Rot4 facing = onHead ? headFacing : bodyFacing; if (ExtraDrawer.ShouldDrawExtra(pawn, apparel, facing, out Material extraMat)) { if (onHead || renderBody) { if (onHead) { Vector3 v = vector + quat * pawn.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, pawn, facing, !onHead), drawAt, quat, PawnRenderUtility.OverrideMaterialIfNeeded(extraMat, pawn), portrait ); } // vector.y += CompApparelExtaDrawer.MinClippingDistance; } } } } } } } if (!pawn.Dead && AMAMod.settings.AllowHediffPartDrawer) { Vector3 drawAt = vector; for (int i = 0; i < AdeptusHediffUtility.GraphicHediffs.Count; i++) { if (pawn.health.hediffSet.GetFirstHediffOfDef(AdeptusHediffUtility.GraphicHediffs[i]) is HediffWithComps hediff) { if (hediff.TryGetCompFast <HediffComp_DrawImplant_AdMech>() is HediffComp_DrawImplant_AdMech hediffdrawer) { Material material = null; if (hediffdrawer.implantDrawProps.implantDrawerType != ImplantDrawerType.Head) { drawAt.y += 0.005f; if (bodyFacing == Rot4.South && hediffdrawer.implantDrawProps.implantDrawerType == ImplantDrawerType.Backpack) { drawAt.y -= 0.3f; } material = hediffdrawer.ImplantMaterial(pawn, bodyFacing); // GenDraw.DrawMeshNowOrLater(mesh, drawAt, quat, material, portrait); } else { if (!pawn.Downed && !pawn.Dead && hediffdrawer.implantDrawProps.useHeadOffset) { drawAt = vector + pawn.Drawer.renderer.BaseHeadOffsetAt(headFacing); } else { if (pawn.Downed || pawn.Dead && hediffdrawer.implantDrawProps.useHeadOffset) { drawAt.y = vector.y + pawn.Drawer.renderer.BaseHeadOffsetAt(headFacing).y; } } drawAt.y += 0.005f; material = hediffdrawer.ImplantMaterial(pawn, headFacing); // GenDraw.DrawMeshNowOrLater(mesh, drawAt, quat, material, portrait); } if (material != null) { // GenDraw.DrawMeshNowOrLater(mesh, drawAt , quat, material, portrait); material = PawnRenderUtility.OverrideMaterialIfNeeded(material, pawn); // Angle calculation to not pick the shortest, taken from Quaternion.Angle and modified GenDraw.DrawMeshNowOrLater(mesh: mesh, loc: drawAt + hediffdrawer.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; } } } } } return(record); }