public VehicleRenderer(VehiclePawn vehicle) { this.vehicle = vehicle; statusOverlays = new PawnHeadOverlays(vehicle); woundOverlays = new PawnWoundDrawer(vehicle); graphics = new VehicleGraphicSet(vehicle); effecters = new VehicleStatusEffecters(vehicle); }
public PawnRenderer(Pawn pawn) { this.pawn = pawn; this.wiggler = new PawnDownedWiggler(pawn); this.statusOverlays = new PawnHeadOverlays(pawn); this.woundOverlays = new PawnWoundDrawer(pawn); this.graphics = new PawnGraphicSet(pawn); this.effecters = new PawnStatusEffecters(pawn); }
public static bool Pre_DrawWound_Cloak(PawnWoundDrawer __instance) { Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); bool flag = pawn.health.hediffSet.HasHediff(YautjaDefOf.RRY_Hediff_Cloaked, false); if (flag) { //Log.Message(string.Format("tetet")); return(false); } return(true); }
public static bool PreExecute(PawnWoundDrawer __instance) { Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); bool flag_Cloaked = pawn.health.hediffSet.HasHediff(YautjaDefOf.RRY_Hediff_Cloaked, false); bool flag_HiddenXeno = pawn.health.hediffSet.HasHediff(XenomorphDefOf.RRY_Hediff_Xenomorph_Hidden, false); if (flag_Cloaked || flag_HiddenXeno) { return(false); } return(true); }
public static bool RenderOverBodyPrefix(PawnWoundDrawer __instance) { Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); bool flag_Cloaked = pawn.health.hediffSet.HasHediff(YautjaDefOf.RRY_Hediff_Cloaked, false); Comp_Xenomorph comp = null; bool flag_HiddenXeno = (pawn.isXenomorph(out comp) || !pawn.isXenomorph() && pawn.CarriedBy != null && pawn.CarriedBy.isXenomorph(out comp)) && (comp != null && (comp.Hidden || comp.hidden)); if (flag_Cloaked || flag_HiddenXeno) { return(false); } return(true); }
public void DrawBody(Vector3 rootLoc, Quaternion quat, RotDrawMode bodyDrawType, [CanBeNull] PawnWoundDrawer woundDrawer, bool renderBody, bool portrait) { if (this.PawnBodyDrawers.NullOrEmpty()) { return; } int i = 0; while (i < this.PawnBodyDrawers.Count) { this.PawnBodyDrawers[i].DrawBody( woundDrawer, rootLoc, quat, bodyDrawType, renderBody, portrait); i++; } }
public static bool Prefix(PawnRenderer __instance, ref Vector3 rootLoc, float angle, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, RotDrawMode bodyDrawType, bool portrait, bool headStump) { // Pawn pawn = (Pawn)PawnFieldInfo?.GetValue(__instance); PawnGraphicSet graphics = __instance.graphics; Pawn pawn = graphics.pawn; if (!pawn.RaceProps.Humanlike && !Controller.settings.UsePaws) { return(true); } if (!graphics.AllResolved) { graphics.ResolveAllGraphics(); } CompFace compFace = pawn.GetCompFace(); bool hasFace = compFace != null; // Let vanilla do the job if no FacePawn or pawn not a teenager or any other known mod accessing the renderer if (hasFace) { if (compFace.IsChild || compFace.Deactivated) { return(true); } } CompBodyAnimator compAnim = pawn.GetCompAnim(); bool showFeet = compAnim != null && Controller.settings.UseFeet; // No face, no animator, return if (!hasFace && compAnim == null) { return(true); } PawnWoundDrawer woundDrawer = (PawnWoundDrawer)WoundOverlayFieldInfo?.GetValue(__instance); // if (Patches2.Plants) // { // if (pawn.Spawned) // { // Plant plant = (pawn.Position + IntVec3.South).GetPlant(pawn.Map); // if (plant != null && Patches2.plantMoved.Contains(plant)) // { // rootLoc.y = plant.DrawPos.y - (Patches2.steps / 2); // } // } // } // Try to move the y position behind while another pawn is standing near if (compAnim != null && (!portrait && pawn.Spawned && !compAnim.IsRider)) { RecalcRootLocY(ref rootLoc, pawn, compAnim); } Vector3 baseDrawLoc = rootLoc; // Let's save the basic location for later Vector3 footPos = baseDrawLoc; // No face => must be animal, simplify it Quaternion quat = Quaternion.AngleAxis(angle, Vector3.up); Quaternion bodyQuat = quat; Quaternion footQuat = bodyQuat; if (MainTabWindow_WalkAnimator.IsOpen) { bodyFacing = MainTabWindow_BaseAnimator.BodyRot; headFacing = MainTabWindow_BaseAnimator.HeadRot; } compFace?.TickDrawers(bodyFacing, headFacing, graphics); compAnim?.TickDrawers(bodyFacing, graphics); // Use the basic quat Quaternion headQuat = bodyQuat; // Rotate head if possible and wobble around if (!portrait || MainTabWindow_WalkAnimator.IsOpen) { if (showFeet) { compAnim.ApplyBodyWobble(ref baseDrawLoc, ref footPos, ref bodyQuat); } // Reset the quat as it has been changed headQuat = bodyQuat; compFace?.ApplyHeadRotation(renderBody, ref headQuat); } // Regular FacePawn rendering 14+ years // Render body // if (renderBody) compAnim?.DrawBody(baseDrawLoc, bodyQuat, bodyDrawType, woundDrawer, renderBody, portrait); Vector3 bodyPos = baseDrawLoc; Vector3 headPos = baseDrawLoc; if (bodyFacing == Rot4.North) { headPos.y += YOffset_Shell; bodyPos.y += YOffset_Head; } else { headPos.y += YOffset_Head; bodyPos.y += YOffset_Shell; } if (graphics.headGraphic != null) { // Rendererd pawn faces Vector3 offsetAt = !hasFace ? __instance.BaseHeadOffsetAt(bodyFacing) : compFace.BaseHeadOffsetAt(portrait); Vector3 b = bodyQuat * offsetAt; Vector3 headDrawLoc = headPos + b; if (!hasFace) { Material material = graphics.HeadMatAt(headFacing, bodyDrawType, headStump); if (material != null) { Mesh mesh2 = MeshPool.humanlikeHeadSet.MeshAt(headFacing); GenDraw.DrawMeshNowOrLater(mesh2, headDrawLoc, quat, material, portrait); } } else { compFace.DrawBasicHead(out bool headDrawn, bodyDrawType, portrait, headStump, headDrawLoc, headQuat); if (headDrawn) { if (bodyDrawType != RotDrawMode.Dessicated && !headStump) { if (compFace.Props.hasWrinkles) { Vector3 wrinkleLoc = headDrawLoc; wrinkleLoc.y += YOffset_Wrinkles; compFace.DrawWrinkles(bodyDrawType, wrinkleLoc, headQuat, portrait); } if (compFace.Props.hasEyes) { Vector3 eyeLoc = headDrawLoc; eyeLoc.y += YOffset_Eyes; compFace.DrawNaturalEyes(eyeLoc, portrait, headQuat); Vector3 browLoc = headDrawLoc; browLoc.y += YOffset_Brows; // the brow above compFace.DrawBrows(browLoc, headQuat, portrait); // and now the added eye parts Vector3 unnaturalEyeLoc = headDrawLoc; unnaturalEyeLoc.y += YOffset_UnnaturalEyes; compFace.DrawUnnaturalEyeParts(unnaturalEyeLoc, headQuat, portrait); } // Portrait obviously ignores the y offset, thus render the beard after the body apparel (again) if (compFace.Props.hasBeard) { Vector3 beardLoc = headDrawLoc; Vector3 tacheLoc = headDrawLoc; beardLoc.y += headFacing == Rot4.North ? -YOffset_Head - YOffset_Beard : YOffset_Beard; tacheLoc.y += headFacing == Rot4.North ? -YOffset_Head - YOffset_Tache : YOffset_Tache; compFace.DrawBeardAndTache(beardLoc, tacheLoc, portrait, headQuat); } if (compFace.Props.hasMouth) { Vector3 mouthLoc = headDrawLoc; mouthLoc.y += YOffset_Mouth; compFace.DrawNaturalMouth(mouthLoc, portrait, headQuat); } // Deactivated, looks kinda crappy ATM // if (pawn.Dead) // { // Material deadEyeMat = faceComp.DeadEyeMatAt(headFacing, bodyDrawType); // if (deadEyeMat != null) // { // GenDraw.DrawMeshNowOrLater(mesh2, locFacialY, headQuat, deadEyeMat, portrait); // locFacialY.y += YOffsetInterval_OnFace; // } // } // else } } } if (!headStump) { Vector3 overHead = baseDrawLoc + b; overHead.y += YOffset_OnHead; Vector3 hairLoc = overHead; Vector3 headgearLoc = overHead; Vector3 hatInFrontOfFace = baseDrawLoc + b; hairLoc.y += YOffset_HairOnHead; headgearLoc.y += YOffset_GearOnHead; hatInFrontOfFace.y += ((!(headFacing == Rot4.North)) ? YOffset_PostHead : YOffset_Behind); compFace?.DrawHairAndHeadGear(hairLoc, headgearLoc, bodyDrawType, portrait, renderBody, headQuat, hatInFrontOfFace); compFace?.DrawAlienHeadAddons(headPos, portrait, headQuat, overHead); } } if (!portrait) { // Traverse.Create(__instance).Method("DrawEquipment", rootLoc).GetValue(); DrawEquipmentMethodInfo?.Invoke(__instance, new object[] { baseDrawLoc }); } if (!portrait) { if (pawn.apparel != null) { List <Apparel> wornApparel = pawn.apparel.WornApparel; foreach (Apparel ap in wornApparel) { DrawPos_Patch.offset = baseDrawLoc; DrawPos_Patch.offsetEnabled = true; ap.DrawWornExtras(); DrawPos_Patch.offsetEnabled = false; } } Vector3 bodyLoc = baseDrawLoc; bodyLoc.y += YOffset_Status; PawnHeadOverlays headOverlays = (PawnHeadOverlays)PawnHeadOverlaysFieldInfo?.GetValue(__instance); if (headOverlays != null) { compFace?.DrawHeadOverlays(headOverlays, bodyLoc, headQuat); } } compAnim?.DrawApparel(bodyQuat, bodyPos, portrait, renderBody); compAnim?.DrawAlienBodyAddons(bodyQuat, bodyPos, portrait, renderBody, bodyFacing); if (!portrait && pawn.RaceProps.Animal && pawn.inventory != null && pawn.inventory.innerContainer.Count > 0 && graphics.packGraphic != null) { Mesh mesh = graphics.nakedGraphic.MeshAt(bodyFacing); Graphics.DrawMesh(mesh, bodyPos, quat, graphics.packGraphic.MatAt(bodyFacing), 0); } // No wobble for equipment, looks funnier - nah! // Vector3 equipPos = rootLoc; // equipPos.y = drawPos.y; //compAnim.DrawEquipment(drawPos, portrait); bool showHands = Controller.settings.UseHands; Vector3 handPos = bodyPos; if (renderBody || Controller.settings.IgnoreRenderBody) { if (showHands) { // Reset the position for the hands handPos.y = baseDrawLoc.y; compAnim?.DrawHands(bodyQuat, handPos, portrait); } if (showFeet) { compAnim.DrawFeet(bodyQuat, footQuat, footPos, portrait); } } return(false); }
private static bool Prefix(PawnRenderer __instance, Pawn ___pawn, PawnWoundDrawer ___woundOverlays, PawnHeadOverlays ___statusOverlays, Vector3 rootLoc, float angle, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, RotDrawMode bodyDrawType, bool portrait, bool headStump, bool invisible) { if (___pawn.def is RaceAddonThingDef thingDef) { //==================================================================================================== if (!__instance.graphics.AllResolved) { __instance.graphics.ResolveAllGraphics(); } //==================================================================================================== RaceAddonComp racomp = ___pawn.GetComp <RaceAddonComp>(); //==================================================================================================== Quaternion bodyQuat = Quaternion.AngleAxis(angle, Vector3.up); //==================================================================================================== Quaternion headQuat = bodyQuat; var flag1 = false; if (!portrait && ___pawn.Awake()) { if (racomp.headRotator != null && !___pawn.Drafted) { headQuat *= racomp.headRotator.GetQuat(); } if (racomp.headTargeter != null && !___pawn.Downed) { var initialRot = headFacing; headFacing.Rotate(racomp.headTargeter.RotDirection); if (initialRot != headFacing) { flag1 = true; } } } //==================================================================================================== Mesh bodyMesh = racomp.bodyMeshSet.MeshAt(bodyFacing); //==================================================================================================== Mesh headMesh = racomp.headMeshSet.MeshAt(headFacing); //==================================================================================================== Vector3 bodyLoc = rootLoc; //bodyLoc.y += 0.022482f; bodyLoc.y += 0.022482f; //==================================================================================================== Vector3 headLoc = __instance.BaseHeadOffsetAt(bodyFacing); if (portrait || renderBody) { headLoc.x *= thingDef.raceAddonSettings.graphicSetting.drawSize[racomp.drawSize].headSize.x; headLoc.z *= thingDef.raceAddonSettings.graphicSetting.drawSize[racomp.drawSize].headSize.y; } if (!portrait && flag1) { if (headFacing == Rot4.South) { headLoc += racomp.savedHeadData.def.headTargetingOffsets.south; } else if (headFacing == Rot4.East) { headLoc += racomp.savedHeadData.def.headTargetingOffsets.east; } else if (headFacing == Rot4.West) { headLoc += racomp.savedHeadData.def.headTargetingOffsets.west; } else { headLoc += racomp.savedHeadData.def.headTargetingOffsets.north; } } headLoc = bodyLoc + (bodyQuat * headLoc); //==================================================================================================== List <int> shell = new List <int>(); List <int> hat = new List <int>(); List <ApparelGraphicRecord> apparelGraphics = __instance.graphics.apparelGraphics; for (int i = 0; i < apparelGraphics.Count; i++) { if (apparelGraphics[i].sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Shell) { shell.Add(i); } if (apparelGraphics[i].sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Overhead) { hat.Add(i); } } //==================================================================================================== Vector3 drawLoc = new Vector3(); if (renderBody) { //Draw Body, Apparel drawLoc = DrawLoc(bodyLoc, 0.0002f); List <Material> list = __instance.graphics.MatsBodyBaseAt(bodyFacing, bodyDrawType); for (int i = 0; i < list.Count; i++) { Material mat = OverrideMaterialIfNeeded(list[i], ___pawn, __instance.graphics); GenDraw.DrawMeshNowOrLater(bodyMesh, drawLoc, bodyQuat, mat, portrait); drawLoc.y += 0.0001f; } //Draw Shell if (shell.Count() > 0) { drawLoc = DrawLoc(bodyLoc, 0.0009f); foreach (int i in shell) { Material mat = apparelGraphics[i].graphic.MatAt(bodyFacing); mat = OverrideMaterialIfNeeded(mat, ___pawn, __instance.graphics); GenDraw.DrawMeshNowOrLater(bodyMesh, drawLoc, bodyQuat, mat, portrait); } } //Draw Wound drawLoc = DrawLoc(bodyLoc, 0.0020f); if (bodyDrawType == RotDrawMode.Fresh) { ___woundOverlays.RenderOverBody(drawLoc, bodyMesh, bodyQuat, portrait); } //Draw Body Addons if (racomp.bodyAddonGraphicSets != null) { foreach (var set in racomp.bodyAddonGraphicSets) { if (set.draw) { drawLoc = bodyLoc; ResolveAddonLoc(ref drawLoc, set.data.def, bodyFacing); Material mat = set.MatAt(bodyFacing, bodyDrawType); if (mat != null) { mat = OverrideMaterialIfNeeded(mat, ___pawn, __instance.graphics); GenDraw.DrawMeshNowOrLater(bodyMesh, drawLoc, bodyQuat, mat, portrait); } } } } } if (__instance.graphics.headGraphic != null) { //Draw Head Material headMat = __instance.graphics.HeadMatAt(headFacing, bodyDrawType, headStump); if (headMat != null) { drawLoc = DrawLoc(headLoc, 0.0011f); GenDraw.DrawMeshNowOrLater(headMesh, drawLoc, headQuat, headMat, portrait); } //Draw Hat or Mask bool flag2 = false; if (!portrait || !Prefs.HatsOnlyOnMap) { if (hat.Count() > 0 && racomp.drawHat) { foreach (int i in hat) { if (apparelGraphics[i].sourceApparel.def.apparel.hatRenderedFrontOfFace) //Mask { flag2 = true; drawLoc = headFacing == Rot4.North ? DrawLoc(headLoc, -0.0001f) : DrawLoc(headLoc, 0.0017f); } else { drawLoc = DrawLoc(headLoc, 0.0015f); //Hat } Material mat = apparelGraphics[i].graphic.MatAt(headFacing); mat = OverrideMaterialIfNeeded(mat, ___pawn, __instance.graphics); GenDraw.DrawMeshNowOrLater(headMesh, drawLoc, headQuat, mat, portrait); } } } if (bodyDrawType != RotDrawMode.Dessicated && !headStump) { //Draw Face if (racomp.upperFaceGraphicSet != null) { drawLoc = DrawLoc(headLoc, 0.0014f); Material mat = OverrideMaterialIfNeeded(racomp.upperFaceGraphicSet.MatAt(headFacing, portrait), ___pawn, __instance.graphics); GenDraw.DrawMeshNowOrLater(headMesh, drawLoc, headQuat, mat, portrait); } if (racomp.lowerFaceGraphicSet != null) { drawLoc = DrawLoc(headLoc, 0.0012f); Material mat = OverrideMaterialIfNeeded(racomp.lowerFaceGraphicSet.MatAt(headFacing, portrait), ___pawn, __instance.graphics); GenDraw.DrawMeshNowOrLater(headMesh, drawLoc, headQuat, mat, portrait); } //Draw Hair if (flag2 || racomp.drawUpperHair) { drawLoc = DrawLoc(headLoc, 0.0013f); Material mat = __instance.graphics.HairMatAt(headFacing); mat = OverrideMaterialIfNeeded(mat, ___pawn, __instance.graphics); GenDraw.DrawMeshNowOrLater(headMesh, drawLoc, headQuat, mat, portrait); } if (racomp.improvedHairGraphic != null) { if (flag2 || racomp.drawLowerHair) { if (___pawn.InBed() && ((___pawn.story.hairDef as ImprovedHairDef).drawnInBed) || renderBody) { drawLoc = DrawLoc(headLoc, 0.0001f); Material mat = racomp.improvedHairGraphic.MatAt(headFacing); mat = OverrideMaterialIfNeeded(mat, ___pawn, __instance.graphics); GenDraw.DrawMeshNowOrLater(headMesh, drawLoc, headQuat, mat, portrait); } } } //Draw Head Addons if (racomp.headAddonGraphicSets != null) { foreach (var set in racomp.headAddonGraphicSets) { if (set.draw) { drawLoc = headLoc; ResolveAddonLoc(ref drawLoc, set.data.def, headFacing); Material mat = set.MatAt(headFacing, bodyDrawType); if (mat != null) { mat = OverrideMaterialIfNeeded(mat, ___pawn, __instance.graphics); GenDraw.DrawMeshNowOrLater(headMesh, drawLoc, headQuat, mat, portrait); } } } } } } if (!portrait) { drawLoc = DrawLoc(bodyLoc, 0.01f); DrawEquipment(___pawn, racomp.equipmentMeshSet.MeshAt(bodyFacing), drawLoc); //Draw Apparel Extras if (___pawn.apparel != null) { List <Apparel> wornApparel = ___pawn.apparel.WornApparel; for (int l = 0; l < wornApparel.Count; l++) { wornApparel[l].DrawWornExtras(); } } //Draw Overlays drawLoc = DrawLoc(bodyLoc, 0.02f); ___statusOverlays.RenderStatusOverlays(drawLoc, bodyQuat, headMesh); } return(false); } return(true); }
public override void DrawBody( PawnWoundDrawer woundDrawer, Vector3 rootLoc, Quaternion quat, RotDrawMode bodyDrawType, bool renderBody, bool portrait) { // renderBody is AFAIK only used for beds, so ignore it and undress if (renderBody || Controller.settings.IgnoreRenderBody) { Vector3 bodyLoc = rootLoc; bodyLoc.x += this.CompAnimator.BodyAnim?.offCenterX ?? 0f; bodyLoc.y += Offsets.YOffset_Body; if (bodyDrawType == RotDrawMode.Dessicated && !this.Pawn.RaceProps.Humanlike && this.Pawn.Drawer.renderer.graphics.dessicatedGraphic != null && !portrait) { this.Pawn.Drawer.renderer.graphics.dessicatedGraphic.Draw(bodyLoc, this.BodyFacing, this.Pawn); } else { Mesh bodyMesh; if (this.Pawn.RaceProps.Humanlike) { bodyMesh = this.GetPawnMesh(true, portrait); } else { bodyMesh = this.Pawn.Drawer.renderer.graphics.nakedGraphic.MeshAt(this.BodyFacing); } List <Material> bodyBaseAt = null; bool flag = true; if (!portrait && Controller.settings.HideShellWhileRoofed) { if (this.CompAnimator.InRoom) { MaxLayerToShow layer; if (this.CompAnimator.InPrivateRoom) { layer = renderBody ? Controller.settings.LayerInPrivateRoom : Controller.settings.LayerInOwnedBed; } else { layer = renderBody ? Controller.settings.LayerInRoom : Controller.settings.LayerInBed; } bodyBaseAt = this.BodyBaseAt(this.Graphics, this.BodyFacing, bodyDrawType, layer); flag = false; } } if (flag) { bodyBaseAt = this.Graphics.MatsBodyBaseAt(this.BodyFacing, bodyDrawType); } foreach (Material material in bodyBaseAt) { Material damagedMat = this.Graphics.flasher.GetDamagedMat(material); GenDraw.DrawMeshNowOrLater(bodyMesh, bodyLoc, quat, damagedMat, portrait); bodyLoc.y += Offsets.YOffsetInterval_Clothes; } if (bodyDrawType == RotDrawMode.Fresh) { Vector3 drawLoc = rootLoc; drawLoc.y += Offsets.YOffset_Wounds; woundDrawer?.RenderOverBody(drawLoc, bodyMesh, quat, portrait); } } } }
public virtual void DrawBody(PawnWoundDrawer woundDrawer, Vector3 rootLoc, Quaternion quat, RotDrawMode bodyDrawType, bool renderBody, bool portrait) { }
// RenderPawnInternal detour internal static void _RenderPawnInternal(this PawnRenderer _this, Vector3 rootLoc, Quaternion quat, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, RotDrawMode bodyDrawType = RotDrawMode.Fresh, bool portrait = false, bool headStump = false) { // Allows accessing private fields from the original class Pawn _pawn = _pawnRPI(_this); if (!_this.graphics.AllResolved) { _this.graphics.ResolveAllGraphics(); } Mesh mesh = null; // Make sure to render toddlers and babies in bed 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 loc = rootLoc; loc.y += 0.0046875f; if (bodyDrawType == RotDrawMode.Dessicated && !_pawn.RaceProps.Humanlike && _this.graphics.dessicatedGraphic != null && !portrait) { _this.graphics.dessicatedGraphic.Draw(loc, bodyFacing, _pawn); } else { if (_pawn.RaceProps.Humanlike) { mesh = MeshPool.humanlikeBodySet.MeshAt(bodyFacing); } else { mesh = _this.graphics.nakedGraphic.MeshAt(bodyFacing); } // Draw body and apparel List <Material> list = _this.graphics.MatsBodyBaseAt(bodyFacing, bodyDrawType); for (int i = 0; i < list.Count; i++) { Material damagedMat = _this.graphics.flasher.GetDamagedMat(list [i]); // Scale apparel graphics to fit child body 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, loc, quat, damagedMat, portrait); loc.y += 0.0046875f; } if (bodyDrawType == RotDrawMode.Fresh) { Vector3 drawLoc = rootLoc; drawLoc.y += 0.01875f; PawnWoundDrawer _woundOverlays = _pwdRPI(_this); _woundOverlays.RenderOverBody(drawLoc, mesh, quat, portrait); } } } Vector3 vector = rootLoc; Vector3 a = rootLoc; if (bodyFacing != Rot4.North) { a.y += 0.028125f; vector.y += 0.0234375f; } else { a.y += 0.0234375f; vector.y += 0.028125f; } // Does our pawn have a visible head? // Only draw head if child or older if (_this.graphics.headGraphic != null && _pawn.ageTracker.CurLifeStageIndex >= 1) { Vector3 b = quat * _this.BaseHeadOffsetAt(headFacing); // Hair or helmet location Vector3 loc2 = rootLoc + b; // Raise it up in the stack loc2.y += 0.0328125f; bool flag = false; // Is the pawn a child or older? if (_pawn.ageTracker.CurLifeStageIndex >= 2) { Mesh mesh2 = MeshPool.humanlikeHeadSet.MeshAt(headFacing); Material mat = _this.graphics.HeadMatAt(headFacing, bodyDrawType); // Draw the pawn's head GenDraw.DrawMeshNowOrLater(mesh2, a + b, quat, mat, portrait); // Find the mesh we want to use for the current direction it's facing Mesh mesh3 = _this.graphics.HairMeshSet.MeshAt(headFacing); // Populate a list of all apparel if (!portrait || !Prefs.HatsOnlyOnMap) { List <ApparelGraphicRecord> apparelGraphics = _this.graphics.apparelGraphics; for (int j = 0; j < apparelGraphics.Count; j++) { // If the apparel is on the head, let's draw it! 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)) { flag = true; // flag=true stops the hair from being drawn } Material material = apparelGraphics [j].graphic.MatAt(bodyFacing, null); material = _this.graphics.flasher.GetDamagedMat(material); if (_pawn.ageTracker.CurLifeStageIndex == 2) { material.mainTextureOffset = new Vector2(0, 0.018f); material.mainTexture.wrapMode = TextureWrapMode.Clamp; } GenDraw.DrawMeshNowOrLater(mesh3, loc2 + new Vector3(0, 0.035f, 0), quat, material, portrait); } } } } // Otherwise let's draw the hair instead if (!flag && bodyDrawType != RotDrawMode.Dessicated && _pawn.ageTracker.AgeBiologicalYears >= 2 && !headStump) { Mesh mesh4 = _this.graphics.HairMeshSet.MeshAt(headFacing); Material mat2 = _this.graphics.HairMatAt(headFacing); // Hopefully stops graphic issues from modifying texture offset/scale mat2.mainTexture.wrapMode = TextureWrapMode.Clamp; // Scale down the child hair to fit the head if (_pawn.ageTracker.CurLifeStageIndex <= 2) { mat2.mainTextureScale = new Vector2(1.13f, 1.13f); mat2.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); mat2.mainTextureOffset = new Vector2(-0.07f, 0.12f); } GenDraw.DrawMeshNowOrLater(mesh4, loc2, quat, mat2, portrait); } } if (renderBody) { for (int k = 0; k < _this.graphics.apparelGraphics.Count; k++) { ApparelGraphicRecord apparelGraphicRecord = _this.graphics.apparelGraphics [k]; // Draw the uppermost piece of apparel if (apparelGraphicRecord.sourceApparel.def.apparel.LastLayer == ApparelLayer.Shell) { Material material2 = apparelGraphicRecord.graphic.MatAt(bodyFacing, null); material2 = _this.graphics.flasher.GetDamagedMat(material2); // Draw apparel differently for children if (_pawn.ageTracker.CurLifeStageIndex == 2) { material2.mainTextureScale = new Vector2(1.00f, 1.22f); material2.mainTextureOffset = new Vector2(0, -0.1f); } GenDraw.DrawMeshNowOrLater(mesh, vector, quat, material2, portrait); } } } if (!portrait && _pawn.RaceProps.Animal && _pawn.inventory != null && _pawn.inventory.innerContainer.Count > 0) { Graphics.DrawMesh(mesh, vector, quat, _this.graphics.packGraphic.MatAt(_pawn.Rotation, null), 0); } if (!portrait) { //_this.DrawEquipment (rootLoc); MethodInfo drawEquip = _this.GetType().GetMethod("DrawEquipment", BindingFlags.NonPublic | BindingFlags.Instance); drawEquip.Invoke(_this, 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 bodyLoc = rootLoc; bodyLoc.y += 0.0421875f; var _statusOverlays = typeof(PawnRenderer).GetField("statusOverlays", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(_this); MethodInfo rso = typeof(PawnHeadOverlays).GetMethod("RenderStatusOverlays"); rso.Invoke(_statusOverlays, new object[] { bodyLoc, quat, MeshPool.humanlikeHeadSet.MeshAt(headFacing) }); //_statusOverlays.RenderStatusOverlays (bodyLoc, quat, MeshPool.humanlikeHeadSet.MeshAt (headFacing)); } }
public static bool Prefix(PawnRenderer __instance, Pawn ___pawn, PawnWoundDrawer ___woundOverlays, PawnHeadOverlays ___statusOverlays, Vector3 rootLoc, float angle, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, RotDrawMode bodyDrawType, bool portrait, bool headStump, bool invisible) { if (___pawn.def is RaceAddonThingDef thingDef) { if (!__instance.graphics.AllResolved) { __instance.graphics.ResolveAllGraphics(); } RaceAddonComp racomp = ___pawn.GetComp <RaceAddonComp>(); Quaternion bodyQuat = Quaternion.AngleAxis(angle, Vector3.up); Quaternion headQuat = bodyQuat; rootLoc.z -= racomp.cachedDrawLocCorrection; Vector3 bodyLoc = rootLoc; Vector3 headLoc = __instance.BaseHeadOffsetAt(bodyFacing); GetModifiedValue(racomp, ref bodyQuat, ref headQuat, ref bodyLoc, ref headLoc, ___pawn, ref renderBody, ref bodyFacing, ref headFacing, portrait); // For Resolve Head Targeting Error Mesh bodyMesh = racomp.raceAddonGraphicSet.bodyMeshSet.MeshAt(bodyFacing); Mesh headMesh = racomp.raceAddonGraphicSet.headMeshSet.MeshAt(headFacing); List <ApparelGraphicRecord> apparelGraphics = __instance.graphics.apparelGraphics; if (renderBody) { List <Material> bodyMatList = __instance.graphics.MatsBodyBaseAt(bodyFacing, bodyDrawType); for (int i = 0; i < bodyMatList.Count; i++) { // Draw Body And Apparel Material mat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, bodyMatList[i], ___pawn, portrait); GenDraw.DrawMeshNowOrLater(bodyMesh, bodyLoc.SetLayer((i + 3) * 10), bodyQuat, mat, portrait); } if (bodyDrawType == RotDrawMode.Fresh && thingDef.raceAddonSettings.graphicSetting.drawWound) { // Draw Wound ___woundOverlays.RenderOverBody(bodyLoc.SetLayer(60), bodyMesh, bodyQuat, portrait); } for (int k = 0; k < apparelGraphics.Count; k++) { // Draw Shell if (apparelGraphics[k].sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Shell && !apparelGraphics[k].sourceApparel.def.apparel.shellRenderedBehindHead) { Material original3 = apparelGraphics[k].graphic.MatAt(bodyFacing); original3 = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, original3, ___pawn, portrait); GenDraw.DrawMeshNowOrLater(bodyMesh, bodyLoc.SetLayer(bodyFacing == Rot4.North ? 80 : 70), bodyQuat, original3, portrait); } // Draw Pack if (PawnRenderer.RenderAsPack(apparelGraphics[k].sourceApparel)) { Material original4 = apparelGraphics[k].graphic.MatAt(bodyFacing); original4 = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, original4, ___pawn, portrait); if (apparelGraphics[k].sourceApparel.def.apparel.wornGraphicData != null) { Vector2 vector3 = apparelGraphics[k].sourceApparel.def.apparel.wornGraphicData.BeltOffsetAt(bodyFacing, ___pawn.story.bodyType); Vector2 vector4 = apparelGraphics[k].sourceApparel.def.apparel.wornGraphicData.BeltScaleAt(___pawn.story.bodyType); Matrix4x4 matrix = Matrix4x4.Translate(bodyLoc.SetLayer(bodyFacing == Rot4.South ? 10 : 90)) * Matrix4x4.Rotate(bodyQuat) * Matrix4x4.Translate(new Vector3(vector3.x, 0f, vector3.y)) * Matrix4x4.Scale(new Vector3(vector4.x, 1f, vector4.y)); GenDraw.DrawMeshNowOrLater_NewTemp(bodyMesh, matrix, original4, portrait); } else { GenDraw.DrawMeshNowOrLater(bodyMesh, bodyLoc.SetLayer(bodyFacing == Rot4.North ? 80 : 70), bodyQuat, original4, portrait); } } } //Draw Body Addons if (bodyDrawType != RotDrawMode.Dessicated && racomp.raceAddonGraphicSet.addonGraphics.FindAll(x => x.data.addonDef.drawingToBody) is var list && list.Count > 0) { foreach (var record in list) { if (!___pawn.InBed() || ___pawn.InBed() && record.data.addonDef.drawnInBed) { Material addonMat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, record.MatAt(bodyFacing, bodyDrawType), ___pawn, portrait); if (addonMat != null) { Vector3 offset = record.data.addonDef.offsets.GetLoc(bodyFacing); GenDraw.DrawMeshNowOrLater(bodyMesh, offset + bodyLoc.SetLayer(record.data.addonDef.drawPriority.GetPriority(bodyFacing)), bodyQuat, addonMat, portrait); } } } } } if (__instance.graphics.headGraphic != null) { // Draw Head if (__instance.graphics.HeadMatAt_NewTemp(headFacing, bodyDrawType, headStump, portrait) is var headMat && headMat != null) { GenDraw.DrawMeshNowOrLater(headMesh, headLoc.SetLayer(headFacing == Rot4.North ? 70 : 80), headQuat, headMat, portrait); } // Draw Hat, Mask bool hideHair = false; if (!portrait || !Prefs.HatsOnlyOnMap) { for (int j = 0; j < apparelGraphics.Count; j++) { if (apparelGraphics[j].sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Overhead) { hideHair = !apparelGraphics[j].sourceApparel.def.apparel.hatRenderedFrontOfFace; Material mat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, apparelGraphics[j].graphic.MatAt(headFacing), ___pawn, portrait); GenDraw.DrawMeshNowOrLater(headMesh, headLoc.SetLayer(hideHair ? 120 : (bodyFacing == Rot4.North) ? 10 : 110), headQuat, mat, portrait); } } } if (bodyDrawType != RotDrawMode.Dessicated && !headStump) { bool blinkNow = false; bool winkNow = false; if (racomp.raceAddonGraphicSet.eyeBlinker != null) { blinkNow = racomp.raceAddonGraphicSet.eyeBlinker.BlinkNow; winkNow = racomp.raceAddonGraphicSet.eyeBlinker.WinkNow; } // Draw Upper Face if (racomp.raceAddonGraphicSet.upperFaceGraphic != null) { Material faceMat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, racomp.raceAddonGraphicSet.upperFaceGraphic.MatAt(headFacing, portrait, blinkNow, winkNow), ___pawn); GenDraw.DrawMeshNowOrLater(headMesh, headLoc.SetLayer(105), headQuat, faceMat, portrait); } // Draw Lower Face if (racomp.raceAddonGraphicSet.lowerFaceGraphic != null) { Material faceMat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, racomp.raceAddonGraphicSet.lowerFaceGraphic.MatAt(headFacing, portrait, blinkNow, winkNow), ___pawn); GenDraw.DrawMeshNowOrLater(headMesh, headLoc.SetLayer(85), headQuat, faceMat, portrait); } // Draw Upper Hair if (!hideHair || racomp.raceAddonGraphicSet.drawUpperHair) { GenDraw.DrawMeshNowOrLater(headMesh, headLoc.SetLayer(100), headQuat, __instance.graphics.HairMatAt_NewTemp(headFacing, portrait), portrait); } // Draw Lower Hair if (racomp.raceAddonGraphicSet.hairGraphic != null && (!hideHair || racomp.raceAddonGraphicSet.drawLowerHair)) { if (renderBody || ___pawn.InBed() && (___pawn.story.hairDef as ImprovedHairDef).drawnInBed) { Material mat = racomp.raceAddonGraphicSet.hairGraphic.MatAt(headFacing); mat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, mat, ___pawn, portrait); GenDraw.DrawMeshNowOrLater(headMesh, headLoc.SetLayer(20), headQuat, mat, portrait); } } // Draw Head Addons if (racomp.raceAddonGraphicSet.addonGraphics.FindAll(x => !x.data.addonDef.drawingToBody) is var list && list.Count > 0) { foreach (var record in list) { if (!___pawn.InBed() || ___pawn.InBed() && record.data.addonDef.drawnInBed) { Material addonMat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, record.MatAt(headFacing, bodyDrawType), ___pawn, portrait); if (addonMat != null) { Vector3 offset = record.data.addonDef.offsets.GetLoc(bodyFacing); GenDraw.DrawMeshNowOrLater(headMesh, offset + headLoc.SetLayer(record.data.addonDef.drawPriority.GetPriority(headFacing)), headQuat, addonMat, portrait); } } } } } } /* * if (!portrait) * { * DrawEquipment(rootLoc, ___pawn, racomp.raceAddonGraphicSet.equipmentMeshSet.MeshAt(bodyFacing)); * if (___pawn.apparel != null) * { * List<Apparel> wornApparel = ___pawn.apparel.WornApparel; * for (int l = 0; l < wornApparel.Count; l++) * { * wornApparel[l].DrawWornExtras(); * } * } * ___statusOverlays.RenderStatusOverlays(bodyLoc.SetLayer(130), bodyQuat, MeshPool.humanlikeHeadSet.MeshAt(headFacing)); * } * return false; */ } return(true); }