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)); } }
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); }