コード例 #1
0
        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);
                    }
                }
            }
        }
コード例 #2
0
        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) { }
        }