Ejemplo n.º 1
0
        public static void Postfix(PawnGraphicSet __instance, ref List <Material> __result)
        {
            Pawn pawn = __instance.pawn;

            if (pawn == null || !pawn.RaceProps.Humanlike)
            {
                return;
            }
            if (pawn.apparel.AnyApparel)
            {
                if (pawn.apparel.WornApparel.Any(x => x.def.HasComp(typeof(CompApparelExtraPartDrawer))))
                {
                    foreach (var item in pawn.apparel.WornApparel)
                    {
                        if (item.def.HasComp(typeof(CompApparelExtraPartDrawer)))
                        {
                            CompApparelExtraPartDrawer extraDrawer = item.TryGetCompFast <CompApparelExtraPartDrawer>();
                            if (extraDrawer != null && extraDrawer.hidesBody)
                            {
                                for (int i = 0; i < __result.Count; i++)
                                {
                                    __result[i] = AMConstants.InvisibleGraphics(pawn).nakedGraphic.MatSingle;
                                }
                                return;
                            }
                        }
                    }
                }
            }
        }
        public static void Postfix(PawnGraphicSet __instance, ref bool stump, ref Material __result)
        {
            Pawn pawn = __instance.pawn;

            if (pawn == null || !pawn.RaceProps.Humanlike)
            {
                return;
            }
            if (pawn.apparel.AnyApparel)
            {
                if (pawn.apparel.WornApparel.Any(x => x.def.HasComp(typeof(CompApparelExtraPartDrawer))))
                {
                    foreach (var item in pawn.apparel.WornApparel)
                    {
                        if (item.def.HasComp(typeof(CompApparelExtraPartDrawer)))
                        {
                            CompApparelExtraPartDrawer extraDrawer = item.TryGetCompFast <CompApparelExtraPartDrawer>();
                            if (extraDrawer != null && extraDrawer.hidesHead)
                            {
                                __result.SetTexture(AMConstants.InvisibleGraphics(pawn).headGraphic.MatSingle.name, AMConstants.InvisibleGraphics(pawn).headGraphic.MatSingle.mainTexture);
                                __result.shader = ShaderDatabase.Cutout;
                                return;
                            }
                        }
                    }
                }
            }
        }
        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 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);
        }