Esempio n. 1
0
        private void RenderPawnInternal(Vector3 rootLoc, float angle, Rot4 bodyFacing, bool northSouthRotation, bool portrait)
        {
            if (!graphics.AllResolved)
            {
                graphics.ResolveAllGraphics();
            }
            Quaternion quaternion = Quaternion.AngleAxis(angle * (northSouthRotation ? -1 : 1), Vector3.up);

            Vector3 loc = rootLoc + vehicle.VehicleGraphic.DrawOffset(bodyFacing);

            loc.y += YOffset_Body;
            Rot8            vehicleRot = new Rot8(bodyFacing, angle);
            Mesh            mesh       = graphics.vehicle.VehicleGraphic.MeshAtFull(vehicleRot);
            List <Material> list       = graphics.MatsBodyBaseAt(bodyFacing, RotDrawMode.Fresh);

            for (int i = 0; i < list.Count; i++)
            {
                GenDraw.DrawMeshNowOrLater(mesh, loc, quaternion, list[i], portrait);
                loc.y += SubInterval;
            }

            Vector3 drawLoc = rootLoc;

            drawLoc.y += YOffset_Wounds;
            woundOverlays.RenderOverBody(drawLoc, mesh, quaternion, portrait);

            Vector3 vector = rootLoc;
            Vector3 a      = rootLoc;

            if (bodyFacing != Rot4.North)
            {
                a.y      += YOffset_Head;
                vector.y += YOffset_Shell;
            }
            else
            {
                a.y      += YOffset_Shell;
                vector.y += YOffset_Head;
            }
            //REDO
            if (!portrait && vehicle.RaceProps.Animal && vehicle.inventory != null && vehicle.inventory.innerContainer.Count > 0 && graphics.packGraphic != null)
            {
                Graphics.DrawMesh(mesh, vector, quaternion, graphics.packGraphic.MatAt(bodyFacing, null), 0);
            }
            if (!portrait)
            {
                Vector3 bodyLoc = rootLoc;
                bodyLoc.y += YOffset_Status;
                statusOverlays.RenderStatusOverlays(bodyLoc, quaternion, MeshPool.humanlikeHeadSet.MeshAt(bodyFacing));
            }
        }
Esempio n. 2
0
 public virtual void DrawHeadOverlays(PawnHeadOverlays headOverlays, Vector3 bodyLoc, Quaternion headQuat)
 {
     headOverlays?.RenderStatusOverlays(bodyLoc, headQuat, this.GetPawnMesh(false, 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);
 }