Exemplo n.º 1
0
        public override void DrawWornExtras()
        {
            base.DrawWornExtras();
            if (!Pauldrons.NullOrEmpty())
            {
                PawnRenderFlags flags      = Wearer.Drawer.renderer.GetDefaultRenderFlags(Wearer);
                Quaternion      quat       = Quaternion.AngleAxis(0, Vector3.up);
                Vector3         vector     = Wearer.Drawer.renderer.GetBodyPos(Wearer.DrawPos, out bool renderBody);
                Rot4            headfacing = Wearer.Rotation;
                Rot4            bodyFacing = Wearer.Rotation;
                bool            portrait   = flags.FlagSet(PawnRenderFlags.Portrait);
                Vector2         size       = (portrait ? MeshPool.humanlikeBodySet.MeshAt(bodyFacing).bounds.size : Wearer.Drawer.renderer.graphics.nakedGraphic.MeshAt(bodyFacing).bounds.size);
                if (AdeptusIntergrationUtility.enabled_AlienRaces)
                {
                    PawnRenderUtility.AlienRacesPatch(Wearer, bodyFacing, out size, portrait);
                }
                else
                {
                    size = new Vector2(1.5f, 1.5f);
                }
                foreach (CompPauldronDrawer Pauldron in Pauldrons)
                {
                    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 = this;
                        }
                        if (entry.Drawer == null)
                        {
                            Log.Warning("Warning! Drawer null");
                        }
                        if (!entry.ForceDynamicDraw)
                        {
                            continue;
                        }

                        if (entry.ShouldDrawEntry(flags, bodyFacing, size, renderBody, out Graphic pauldronMat, out Mesh pauldronMesh, out Vector3 offset))
                        {
                            if (Pauldron.onHead || renderBody)
                            {
                                Vector3 drawAt = Wearer.Drawer.DrawPos + (quat * Pauldron.GetOffsetFor(bodyFacing, false));

                                /*
                                 * drawAt.y += 0.009687258f;
                                 * drawAt.y += 0.022166021f;
                                 * drawAt.y += 0.028957527f;
                                 * drawAt.y += 0.97f;
                                 */
                                GenDraw.DrawMeshNowOrLater
                                (
                                    // pauldronMesh,
                                    PawnRenderUtility.GetPawnMesh(portrait, Wearer, entry.Props.flipWest && bodyFacing == Rot4.West ? bodyFacing.Opposite : bodyFacing, !Pauldron.onHead),
                                    drawAt + (quat * offset),
                                    quat,
                                    PawnRenderUtility.OverrideMaterialIfNeeded(pauldronMat.MatAt(bodyFacing), Wearer),
                                    flags.FlagSet(PawnRenderFlags.DrawNow)
                                );
                            }
                        }
                    }
                }
            }
            if (!Extras.NullOrEmpty())
            {
                PawnRenderFlags flags      = Wearer.Drawer.renderer.GetDefaultRenderFlags(Wearer);
                Quaternion      quat       = Quaternion.AngleAxis(0, Vector3.up);
                Vector3         vector     = Wearer.DrawPos;
                Rot4            headfacing = Wearer.Rotation;
                Rot4            bodyFacing = Wearer.Rotation;
                bool            portrait   = flags.FlagSet(PawnRenderFlags.Portrait);
                Vector2         size       = (portrait ? MeshPool.humanlikeBodySet.MeshAt(bodyFacing).bounds.size : Wearer.Drawer.renderer.graphics.nakedGraphic.MeshAt(bodyFacing).bounds.size);
                if (AdeptusIntergrationUtility.enabled_AlienRaces)
                {
                    PawnRenderUtility.AlienRacesPatch(Wearer, bodyFacing, out size, portrait);
                }
                else
                {
                    size = new Vector2(1.5f, 1.5f);
                }
                foreach (CompApparelExtraPartDrawer ExtraDrawer in Extras)
                {
                    Vector3 drawAt = Wearer.DrawPos;
                    if (!ExtraDrawer.Props.ExtrasEntries.NullOrEmpty())
                    {
                        bool onHead = ExtraDrawer.onHead || ExtraDrawer.ExtraPartEntry.OnHead || ExtraDrawer.Props.onHead;
                        Rot4 facing = onHead ? headfacing : bodyFacing;
                        if (!ExtraDrawer.ExtraPartEntry.DynamicDraw)
                        {
                            continue;
                        }
                        if (ExtraDrawer.ShouldDrawExtra(Wearer, this, facing, out Material extraMat))
                        {
                            if (onHead || !PawnRenderFlagsExtension.FlagSet(flags, PawnRenderFlags.Invisible))
                            {
                                if (onHead)
                                {
                                    Vector3 v = vector + quat * Wearer.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, Wearer, facing, !onHead),
                                 *      drawAt,
                                 *      quat,
                                 *      PawnRenderUtility.OverrideMaterialIfNeeded(extraMat, Wearer),
                                 *      ExtraDrawer.ExtraPartEntry.animateExtra
                                 *  );
                                 */
                                Graphics.DrawMesh(
                                    PawnRenderUtility.GetPawnMesh(portrait, Wearer, facing, !onHead),
                                    drawAt,
                                    quat,
                                    PawnRenderUtility.OverrideMaterialIfNeeded(extraMat, Wearer),
                                    0);
                            }
                            //    vector.y += CompApparelExtaDrawer.MinClippingDistance;
                        }
                    }
                }
            }

            if (!Shields.NullOrEmpty())
            {
                foreach (var item in Shields)
                {
                    item.DrawShield();
                }
            }
        }
Exemplo n.º 2
0
        public static void PawnRenderer_RenderPawnInternal_Postfix(ref PawnRenderer __instance, Vector3 rootLoc, float angle, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, RotDrawMode bodyDrawType = RotDrawMode.Fresh, bool portrait = false, bool headStump = false)
        {
            if (!__instance.graphics.AllResolved)
            {
                __instance.graphics.ResolveAllGraphics();
            }
            Mesh       mesh = null;
            Quaternion quat = Quaternion.AngleAxis(angle, Vector3.up);
            Pawn       pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

            if (AdeptusIntergrationUtil.enabled_AlienRaces)
            {
                AM_PawnRenderer_RenderPawnInternal_DrawExtras_Patch.AlienRacesPatch(ref __instance, rootLoc, angle, renderBody, bodyFacing, headFacing, out mesh, bodyDrawType, portrait, headStump);
            }
            else
            {
                if (pawn.RaceProps.Humanlike)
                {
                    mesh = MeshPool.humanlikeBodySet.MeshAt(bodyFacing);
                }
                else
                {
                    mesh = __instance.graphics.nakedGraphic.MeshAt(bodyFacing);
                }
            }
            if (renderBody)
            {
                Vector3 vector = rootLoc;
                if (pawn.apparel != null && pawn.apparel.WornApparelCount > 0)
                {
                    for (int k = 0; k < pawn.apparel.WornApparel.Count; k++)
                    {
                        if (pawn.apparel.WornApparel[k].TryGetComp <CompPauldronDrawer>() != null)
                        {
                            foreach (CompPauldronDrawer Pauldron in pawn.apparel.WornApparel[k].AllComps.Where(x => x.GetType() == typeof(CompPauldronDrawer)))
                            {
                                if (!Pauldron.Props.PauldronEntries.NullOrEmpty())
                                {
                                    if (!Pauldron.pauldronInitialized)
                                    {
                                        if (Rand.Chance(Pauldron.Props.PauldronEntryChance))
                                        {
                                            Pauldron.shoulderPadEntry    = Pauldron.Props.PauldronEntries.RandomElementByWeight((ShoulderPadEntry x) => x.commonality);
                                            Pauldron.pauldronGraphicPath = Pauldron.shoulderPadEntry.padTexPath;
                                            Pauldron.useSecondaryColor   = Pauldron.shoulderPadEntry.UseSecondaryColor;
                                            Pauldron.padType             = Pauldron.shoulderPadEntry.shoulderPadType;
                                        }
                                        Pauldron.pauldronInitialized = true;
                                    }
                                    if (Pauldron.ShouldDrawPauldron(pawn, bodyFacing, out Material pauldronMat))
                                    {
                                        vector.y += Pauldron.GetAltitudeOffset(bodyFacing);
                                        GenDraw.DrawMeshNowOrLater(mesh, vector, quat, pauldronMat, portrait);
                                        //    vector.y += CompPauldronDrawer.MinClippingDistance;
                                    }
                                }
                            }
                        }
                        if (pawn.apparel.WornApparel[k].TryGetComp <CompApparelExtraDrawer>() != null)
                        {
                            foreach (CompApparelExtraDrawer Extas in pawn.apparel.WornApparel[k].AllComps.Where(x => x.GetType() == typeof(CompApparelExtraDrawer)))
                            {
                                if (!Extas.pprops.ExtrasEntries.NullOrEmpty())
                                {
                                    if (Extas.ShouldDrawExtra(pawn, pawn.apparel.WornApparel[k], bodyFacing, out Material extraMat))
                                    {
                                        Vector3 drawAt = vector;
                                        if (Extas.onHead)
                                        {
                                            drawAt = vector + __instance.BaseHeadOffsetAt(headFacing);
                                        }
                                        drawAt.y += Extas.GetAltitudeOffset(bodyFacing, Extas.ExtraPartEntry);
                                        GenDraw.DrawMeshNowOrLater(mesh, drawAt, quat, extraMat, portrait);
                                        //    vector.y += CompApparelExtaDrawer.MinClippingDistance;
                                    }
                                }
                            }
                        }
                        Apparel_VisibleAccessory VisibleAccessory;
                        if (pawn.apparel.WornApparel[k].GetType() == typeof(Apparel_VisibleAccessory))
                        {
                            VisibleAccessory = (Apparel_VisibleAccessory)pawn.apparel.WornApparel[k];
                        }
                        //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++)
                    {
                        Vector3 drawAt = vector;
                        HediffComp_DrawImplant_AdMech drawer = pawn.health.hediffSet.hediffs[l].TryGetComp <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 + __instance.BaseHeadOffsetAt(headFacing);
                                }
                                else
                                {
                                    if (pawn.Downed || pawn.Dead && drawer.implantDrawProps.useHeadOffset)
                                    {
                                        drawAt.y = vector.y + __instance.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);

                                //                                                                                        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 = pawn.health.hediffSet.hediffs[l].TryGetComp <HediffComp_Shield>()) != null)
                        {
                            _Shield.DrawWornExtras();
                        }
                    }
                }
            }
        }