public static void DrawBackHairLayer(PawnRenderer __instance, ref Vector3 rootLoc, ref float angle, ref Rot4 headFacing, ref RotDrawMode bodyDrawType, ref bool portrait, ref bool headStump) { PawnGraphicSet graphics = __instance.graphics; if (!graphics.AllResolved) { graphics.ResolveAllGraphics(); } Graphic_Multi_BHair hairGraphicExtended = graphics.hairGraphic as Graphic_Multi_BHair; //if has head and hair graphics if (graphics.headGraphic != null && hairGraphicExtended != null) { Material hairMat = hairGraphicExtended.BackMatAt(headFacing); if (hairMat != null) { //-------------------------REPLICATED VANILLA CODE------------------------- Quaternion quaternion = Quaternion.AngleAxis(angle, new Vector3(0f, 1f, 0f)); Vector3 b = quaternion * __instance.BaseHeadOffsetAt(headFacing); Vector3 loc2 = rootLoc + b; //-------------------------REPLICATED VANILLA CODE------------------------- //loc2.y -= 0.0303030312f; //changed from original, used to be += bool hideHair = false; if (!portrait || !Prefs.HatsOnlyOnMap) { List <ApparelGraphicRecord> apparelGraphics = graphics.apparelGraphics; for (int j = 0; j < apparelGraphics.Count; j++) { if (apparelGraphics[j].sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Overhead) { if (!apparelGraphics[j].sourceApparel.def.apparel.hatRenderedFrontOfFace) { if (HarmonyPatches_BHair.loadedShowHair) { hideHair = Compat_ShowHair.SHCompat_ShouldHideHair(graphics.pawn, apparelGraphics[j].sourceApparel.def, portrait); } else if (HarmonyPatches_BHair.loadedHatDisplaySelection) { hideHair = Compat_HatDisplaySelection.HDCompat_ShouldHideHair(graphics.pawn, apparelGraphics[j].sourceApparel.def.defName); } else { hideHair = true; } } } } } if (!hideHair && bodyDrawType != RotDrawMode.Dessicated && !headStump) { if (graphics.pawn.IsInvisible()) { hairMat = InvisibilityMatPool.GetInvisibleMat(hairMat); } Material resultMat = graphics.flasher.GetDamagedMat(hairMat); Mesh hairMesh = null; if (HarmonyPatches_BHair.loadedAlienRace) { //use modified hair mesh after processed by Alien Race/Babies And Children hairMesh = Patch_AlienRace.ARCompat_GetCopiedMesh(); } if (HarmonyPatches_BHair.loadedRimWorldChildren) { //use modified hair mesh after processed by RimWorldChildren hairMesh = Patch_RimWorldChildren.RCCompat_GetCopiedMesh(); resultMat = Patch_RimWorldChildren.RCCompat_ModifyHairForChild(resultMat, graphics.pawn); //alternate calling method for manual calling //hairMesh = Compat_RimWorldChildren.RCCompat_GetModifiedPawnHairMesh(graphics, graphics.pawn, headFacing); } if (hairMesh == null) { //default hairMesh = graphics.HairMeshSet.MeshAt(headFacing); } GenDraw.DrawMeshNowOrLater(mesh: hairMesh, mat: resultMat, loc: loc2, quat: quaternion, drawNow: portrait); } } } }
public static void FSCompat_DrawBackHairLayer(object __instance, ref Vector3 hairLoc, RotDrawMode bodyDrawType, Quaternion headQuat, ref bool renderBody, ref bool portrait) //FacialStuff.HumanHeadDrawer __instance { Type t_HumanHeadDrawer = GenTypes.GetTypeInAnyAssembly("FacialStuff.HumanHeadDrawer"); try { if (t_HumanHeadDrawer != null) { FacialStuff.HumanHeadDrawer this_HumanHeadDrawer = (FacialStuff.HumanHeadDrawer)__instance; //-------------------------REPLICATED FACIAL STUFF CODE------------------------- PawnGraphicSet curGraphics = Traverse.Create(this_HumanHeadDrawer).Field("Graphics").GetValue <PawnGraphicSet>(); if (!curGraphics.AllResolved) { curGraphics.ResolveAllGraphics(); } Graphic_Multi_BHair hairGraphicExtended = curGraphics.hairGraphic as Graphic_Multi_BHair; if (hairGraphicExtended != null) { Mesh hairMesh = this_HumanHeadDrawer.GetPawnHairMesh(portrait); Rot4 curHeadFacing = Traverse.Create(this_HumanHeadDrawer).Field("HeadFacing").GetValue <Rot4>(); Material hairMat = hairGraphicExtended.BackMatAt(curHeadFacing); if (hairMat != null) { List <ApparelGraphicRecord> apparelGraphics = curGraphics.apparelGraphics; List <ApparelGraphicRecord> headgearGraphics = null; if (!apparelGraphics.NullOrEmpty()) { headgearGraphics = apparelGraphics .Where(x => x.sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Overhead || x.sourceApparel.def.apparel.LastLayer == DefDatabase <ApparelLayerDef> .GetNamedSilentFail("OnHead") || x.sourceApparel.def.apparel.LastLayer == DefDatabase <ApparelLayerDef> .GetNamedSilentFail("StrappedHead") || x.sourceApparel.def.apparel.LastLayer == DefDatabase <ApparelLayerDef> .GetNamedSilentFail("MiddleHead")).ToList(); } FacialStuff.CompBodyAnimator animator = this_HumanHeadDrawer.CompAnimator; bool noRenderGoggles = FacialStuff.Controller.settings.FilterHats; bool showRoyalHeadgear = this_HumanHeadDrawer.Pawn.royalty?.MostSeniorTitle != null && FacialStuff.Controller.settings.ShowRoyalHeadgear; bool noRenderRoofed = animator != null && animator.HideHat && !showRoyalHeadgear; bool noRenderBed = FacialStuff.Controller.settings.HideHatInBed && !renderBody && !showRoyalHeadgear; //-------------------------REPLICATED FACIAL STUFF CODE------------------------- hairLoc.y = tempBaseDrawLocY; tempBaseDrawLocY = 0; if (!headgearGraphics.NullOrEmpty()) { //-------------------------REPLICATED FACIAL STUFF CODE------------------------- bool filterHeadgear = portrait && Prefs.HatsOnlyOnMap || !portrait && noRenderRoofed; // Draw regular hair if appparel or environment allows it (FS feature) if (bodyDrawType != RotDrawMode.Dessicated) { // draw full or partial hair bool apCoversFullHead = headgearGraphics.Any( x => x.sourceApparel.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf .FullHead) && !x.sourceApparel.def.apparel.hatRenderedFrontOfFace); bool apCoversUpperHead = headgearGraphics.Any( x => x.sourceApparel.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf .UpperHead) && !x.sourceApparel.def.apparel.hatRenderedFrontOfFace); //-------------------------REPLICATED FACIAL STUFF CODE------------------------- if (this_HumanHeadDrawer.CompFace.Props.hasOrganicHair || noRenderBed || filterHeadgear || (!apCoversFullHead && !apCoversUpperHead && noRenderGoggles)) { GenDraw.DrawMeshNowOrLater(hairMesh, hairLoc, headQuat, hairMat, portrait); } /* * else if (FacialStuff.Controller.settings.MergeHair) // && !apCoversFullHead) * { * // If not, display the hair cut * FacialStuff.HairCut.HairCutPawn hairPawn = FacialStuff.HairCut.CutHairDB.GetHairCache(this_HumanHeadDrawer.Pawn); * Material hairCutMat = hairPawn.HairCutMatAt(curHeadFacing); * if (hairCutMat != null) * { * GenDraw.DrawMeshNowOrLater(hairMesh, hairLoc, headQuat, hairCutMat, portrait); * } * } */ } } else { // Draw regular hair if no hat worn if (bodyDrawType != RotDrawMode.Dessicated) { GenDraw.DrawMeshNowOrLater(hairMesh, hairLoc, headQuat, hairMat, portrait); } } } } } } catch (TypeLoadException) { } }