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 override void DrawBody( PawnWoundDrawer woundDrawer, Vector3 rootLoc, Quaternion quat, RotDrawMode bodyDrawType, bool renderBody, bool portrait) { // renderBody is AFAIK only used for beds, so ignore it and undress if (renderBody || Controller.settings.IgnoreRenderBody) { Vector3 bodyLoc = rootLoc; bodyLoc.x += this.CompAnimator.BodyAnim?.offCenterX ?? 0f; bodyLoc.y += Offsets.YOffset_Body; if (bodyDrawType == RotDrawMode.Dessicated && !this.Pawn.RaceProps.Humanlike && this.Pawn.Drawer.renderer.graphics.dessicatedGraphic != null && !portrait) { this.Pawn.Drawer.renderer.graphics.dessicatedGraphic.Draw(bodyLoc, this.BodyFacing, this.Pawn); } else { Mesh bodyMesh; if (this.Pawn.RaceProps.Humanlike) { bodyMesh = this.GetPawnMesh(true, portrait); } else { bodyMesh = this.Pawn.Drawer.renderer.graphics.nakedGraphic.MeshAt(this.BodyFacing); } List <Material> bodyBaseAt = null; bool flag = true; if (!portrait && Controller.settings.HideShellWhileRoofed) { if (this.CompAnimator.InRoom) { MaxLayerToShow layer; if (this.CompAnimator.InPrivateRoom) { layer = renderBody ? Controller.settings.LayerInPrivateRoom : Controller.settings.LayerInOwnedBed; } else { layer = renderBody ? Controller.settings.LayerInRoom : Controller.settings.LayerInBed; } bodyBaseAt = this.BodyBaseAt(this.Graphics, this.BodyFacing, bodyDrawType, layer); flag = false; } } if (flag) { bodyBaseAt = this.Graphics.MatsBodyBaseAt(this.BodyFacing, bodyDrawType); } foreach (Material material in bodyBaseAt) { Material damagedMat = this.Graphics.flasher.GetDamagedMat(material); GenDraw.DrawMeshNowOrLater(bodyMesh, bodyLoc, quat, damagedMat, portrait); bodyLoc.y += Offsets.YOffsetInterval_Clothes; } if (bodyDrawType == RotDrawMode.Fresh) { Vector3 drawLoc = rootLoc; drawLoc.y += Offsets.YOffset_Wounds; woundDrawer?.RenderOverBody(drawLoc, bodyMesh, quat, portrait); } } } }
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); }
private void RenderPawnInternal(Vector3 rootLoc, float angle, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, RotDrawMode bodyDrawType, bool portrait, bool headStump) { if (!graphics.AllResolved) { graphics.ResolveAllGraphics(); } Quaternion quaternion = Quaternion.AngleAxis(angle, Vector3.up); Mesh mesh = null; if (renderBody) { Vector3 loc = rootLoc; loc.y += 0.0078125f; if (bodyDrawType == RotDrawMode.Dessicated && !pawn.RaceProps.Humanlike && graphics.dessicatedGraphic != null && !portrait) { graphics.dessicatedGraphic.Draw(loc, bodyFacing, pawn, angle); } else { mesh = ((!pawn.RaceProps.Humanlike) ? graphics.nakedGraphic.MeshAt(bodyFacing) : MeshPool.humanlikeBodySet.MeshAt(bodyFacing)); List <Material> list = graphics.MatsBodyBaseAt(bodyFacing, bodyDrawType); for (int i = 0; i < list.Count; i++) { Material damagedMat = graphics.flasher.GetDamagedMat(list[i]); GenDraw.DrawMeshNowOrLater(mesh, loc, quaternion, damagedMat, portrait); loc.y += 0.00390625f; } if (bodyDrawType == RotDrawMode.Fresh) { Vector3 drawLoc = rootLoc; drawLoc.y += 0.01953125f; woundOverlays.RenderOverBody(drawLoc, mesh, quaternion, portrait); } } } Vector3 vector = rootLoc; Vector3 a = rootLoc; if (bodyFacing != Rot4.North) { a.y += 0.02734375f; vector.y += 0.0234375f; } else { a.y += 0.0234375f; vector.y += 0.02734375f; } if (graphics.headGraphic != null) { Vector3 b = quaternion * BaseHeadOffsetAt(headFacing); Material material = graphics.HeadMatAt(headFacing, bodyDrawType, headStump); if (material != null) { Mesh mesh2 = MeshPool.humanlikeHeadSet.MeshAt(headFacing); GenDraw.DrawMeshNowOrLater(mesh2, a + b, quaternion, material, portrait); } Vector3 loc2 = rootLoc + b; loc2.y += 0.03125f; bool flag = false; if (!portrait || !Prefs.HatsOnlyOnMap) { Mesh mesh3 = graphics.HairMeshSet.MeshAt(headFacing); List <ApparelGraphicRecord> apparelGraphics = graphics.apparelGraphics; for (int j = 0; j < apparelGraphics.Count; j++) { ApparelGraphicRecord apparelGraphicRecord = apparelGraphics[j]; if (apparelGraphicRecord.sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Overhead) { ApparelGraphicRecord apparelGraphicRecord2 = apparelGraphics[j]; if (!apparelGraphicRecord2.sourceApparel.def.apparel.hatRenderedFrontOfFace) { flag = true; ApparelGraphicRecord apparelGraphicRecord3 = apparelGraphics[j]; Material baseMat = apparelGraphicRecord3.graphic.MatAt(bodyFacing); baseMat = graphics.flasher.GetDamagedMat(baseMat); GenDraw.DrawMeshNowOrLater(mesh3, loc2, quaternion, baseMat, portrait); } else { ApparelGraphicRecord apparelGraphicRecord4 = apparelGraphics[j]; Material baseMat2 = apparelGraphicRecord4.graphic.MatAt(bodyFacing); baseMat2 = graphics.flasher.GetDamagedMat(baseMat2); Vector3 loc3 = rootLoc + b; loc3.y += ((!(bodyFacing == Rot4.North)) ? 0.03515625f : 0.00390625f); GenDraw.DrawMeshNowOrLater(mesh3, loc3, quaternion, baseMat2, portrait); } } } } if (!flag && bodyDrawType != RotDrawMode.Dessicated && !headStump) { Mesh mesh4 = graphics.HairMeshSet.MeshAt(headFacing); Material mat = graphics.HairMatAt(headFacing); GenDraw.DrawMeshNowOrLater(mesh4, loc2, quaternion, mat, portrait); } } if (renderBody) { for (int k = 0; k < graphics.apparelGraphics.Count; k++) { ApparelGraphicRecord apparelGraphicRecord5 = graphics.apparelGraphics[k]; if (apparelGraphicRecord5.sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Shell) { Material baseMat3 = apparelGraphicRecord5.graphic.MatAt(bodyFacing); baseMat3 = graphics.flasher.GetDamagedMat(baseMat3); GenDraw.DrawMeshNowOrLater(mesh, vector, quaternion, baseMat3, portrait); } } } if (!portrait && pawn.RaceProps.Animal && pawn.inventory != null && pawn.inventory.innerContainer.Count > 0 && graphics.packGraphic != null) { Graphics.DrawMesh(mesh, vector, quaternion, graphics.packGraphic.MatAt(bodyFacing), 0); } if (!portrait) { DrawEquipment(rootLoc); if (pawn.apparel != null) { List <Apparel> wornApparel = pawn.apparel.WornApparel; for (int l = 0; l < wornApparel.Count; l++) { wornApparel[l].DrawWornExtras(); } } Vector3 bodyLoc = rootLoc; bodyLoc.y += 0.04296875f; statusOverlays.RenderStatusOverlays(bodyLoc, quaternion, MeshPool.humanlikeHeadSet.MeshAt(headFacing)); } }
// RenderPawnInternal detour internal static void _RenderPawnInternal(this PawnRenderer _this, Vector3 rootLoc, Quaternion quat, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, RotDrawMode bodyDrawType = RotDrawMode.Fresh, bool portrait = false, bool headStump = false) { // Allows accessing private fields from the original class Pawn _pawn = _pawnRPI(_this); if (!_this.graphics.AllResolved) { _this.graphics.ResolveAllGraphics(); } Mesh mesh = null; // Make sure to render toddlers and babies in bed if (renderBody || (_pawn.InBed() && _pawn.ageTracker.CurLifeStageIndex <= 1)) { if (_pawn.RaceProps.Humanlike) { if (_pawn.ageTracker.CurLifeStageIndex == 2) { rootLoc.z -= 0.15f; } if (_pawn.ageTracker.CurLifeStageIndex < 2 && _pawn.InBed() && !portrait) { // Undo the offset for babies/toddlers in bed Building_Bed building_bed = _pawn.CurrentBed(); Vector3 offset = new Vector3(0, 0, 0.5f).RotatedBy(building_bed.Rotation.AsAngle); rootLoc -= offset; } } Vector3 loc = rootLoc; loc.y += 0.0046875f; if (bodyDrawType == RotDrawMode.Dessicated && !_pawn.RaceProps.Humanlike && _this.graphics.dessicatedGraphic != null && !portrait) { _this.graphics.dessicatedGraphic.Draw(loc, bodyFacing, _pawn); } else { if (_pawn.RaceProps.Humanlike) { mesh = MeshPool.humanlikeBodySet.MeshAt(bodyFacing); } else { mesh = _this.graphics.nakedGraphic.MeshAt(bodyFacing); } // Draw body and apparel List <Material> list = _this.graphics.MatsBodyBaseAt(bodyFacing, bodyDrawType); for (int i = 0; i < list.Count; i++) { Material damagedMat = _this.graphics.flasher.GetDamagedMat(list [i]); // Scale apparel graphics to fit child body if (_pawn.ageTracker.CurLifeStageIndex == 2 && _pawn.RaceProps.Humanlike) { damagedMat.mainTextureScale = new Vector2(1, 1.3f); damagedMat.mainTextureOffset = new Vector2(0, -0.2f); if (bodyFacing == Rot4.West || bodyFacing == Rot4.East) { damagedMat.mainTextureOffset = new Vector2(-0.015f, -0.2f); } } GenDraw.DrawMeshNowOrLater(mesh, loc, quat, damagedMat, portrait); loc.y += 0.0046875f; } if (bodyDrawType == RotDrawMode.Fresh) { Vector3 drawLoc = rootLoc; drawLoc.y += 0.01875f; PawnWoundDrawer _woundOverlays = _pwdRPI(_this); _woundOverlays.RenderOverBody(drawLoc, mesh, quat, portrait); } } } Vector3 vector = rootLoc; Vector3 a = rootLoc; if (bodyFacing != Rot4.North) { a.y += 0.028125f; vector.y += 0.0234375f; } else { a.y += 0.0234375f; vector.y += 0.028125f; } // Does our pawn have a visible head? // Only draw head if child or older if (_this.graphics.headGraphic != null && _pawn.ageTracker.CurLifeStageIndex >= 1) { Vector3 b = quat * _this.BaseHeadOffsetAt(headFacing); // Hair or helmet location Vector3 loc2 = rootLoc + b; // Raise it up in the stack loc2.y += 0.0328125f; bool flag = false; // Is the pawn a child or older? if (_pawn.ageTracker.CurLifeStageIndex >= 2) { Mesh mesh2 = MeshPool.humanlikeHeadSet.MeshAt(headFacing); Material mat = _this.graphics.HeadMatAt(headFacing, bodyDrawType); // Draw the pawn's head GenDraw.DrawMeshNowOrLater(mesh2, a + b, quat, mat, portrait); // Find the mesh we want to use for the current direction it's facing Mesh mesh3 = _this.graphics.HairMeshSet.MeshAt(headFacing); // Populate a list of all apparel if (!portrait || !Prefs.HatsOnlyOnMap) { List <ApparelGraphicRecord> apparelGraphics = _this.graphics.apparelGraphics; for (int j = 0; j < apparelGraphics.Count; j++) { // If the apparel is on the head, let's draw it! if (apparelGraphics [j].sourceApparel.def.apparel.LastLayer == ApparelLayer.Overhead) { if ((!_pawn.story.hairDef.hairTags.Contains("DrawUnderHat") && !_pawn.story.hairDef.hairTags.Contains("Beard")) || _pawn.apparel.BodyPartGroupIsCovered(BodyPartGroupDefOf.FullHead)) { flag = true; // flag=true stops the hair from being drawn } Material material = apparelGraphics [j].graphic.MatAt(bodyFacing, null); material = _this.graphics.flasher.GetDamagedMat(material); if (_pawn.ageTracker.CurLifeStageIndex == 2) { material.mainTextureOffset = new Vector2(0, 0.018f); material.mainTexture.wrapMode = TextureWrapMode.Clamp; } GenDraw.DrawMeshNowOrLater(mesh3, loc2 + new Vector3(0, 0.035f, 0), quat, material, portrait); } } } } // Otherwise let's draw the hair instead if (!flag && bodyDrawType != RotDrawMode.Dessicated && _pawn.ageTracker.AgeBiologicalYears >= 2 && !headStump) { Mesh mesh4 = _this.graphics.HairMeshSet.MeshAt(headFacing); Material mat2 = _this.graphics.HairMatAt(headFacing); // Hopefully stops graphic issues from modifying texture offset/scale mat2.mainTexture.wrapMode = TextureWrapMode.Clamp; // Scale down the child hair to fit the head if (_pawn.ageTracker.CurLifeStageIndex <= 2) { mat2.mainTextureScale = new Vector2(1.13f, 1.13f); mat2.mainTextureOffset = new Vector2(-0.065f, -0.045f); } // Scale down the toddler hair to fit the head if (_pawn.ageTracker.CurLifeStageIndex == 1) { // mat2.mainTextureScale = new Vector2 (1.25f, 1.25f); mat2.mainTextureOffset = new Vector2(-0.07f, 0.12f); } GenDraw.DrawMeshNowOrLater(mesh4, loc2, quat, mat2, portrait); } } if (renderBody) { for (int k = 0; k < _this.graphics.apparelGraphics.Count; k++) { ApparelGraphicRecord apparelGraphicRecord = _this.graphics.apparelGraphics [k]; // Draw the uppermost piece of apparel if (apparelGraphicRecord.sourceApparel.def.apparel.LastLayer == ApparelLayer.Shell) { Material material2 = apparelGraphicRecord.graphic.MatAt(bodyFacing, null); material2 = _this.graphics.flasher.GetDamagedMat(material2); // Draw apparel differently for children if (_pawn.ageTracker.CurLifeStageIndex == 2) { material2.mainTextureScale = new Vector2(1.00f, 1.22f); material2.mainTextureOffset = new Vector2(0, -0.1f); } GenDraw.DrawMeshNowOrLater(mesh, vector, quat, material2, portrait); } } } if (!portrait && _pawn.RaceProps.Animal && _pawn.inventory != null && _pawn.inventory.innerContainer.Count > 0) { Graphics.DrawMesh(mesh, vector, quat, _this.graphics.packGraphic.MatAt(_pawn.Rotation, null), 0); } if (!portrait) { //_this.DrawEquipment (rootLoc); MethodInfo drawEquip = _this.GetType().GetMethod("DrawEquipment", BindingFlags.NonPublic | BindingFlags.Instance); drawEquip.Invoke(_this, new object[] { rootLoc }); if (_pawn.apparel != null) { List <Apparel> wornApparel = _pawn.apparel.WornApparel; for (int l = 0; l < wornApparel.Count; l++) { wornApparel [l].DrawWornExtras(); } } Vector3 bodyLoc = rootLoc; bodyLoc.y += 0.0421875f; var _statusOverlays = typeof(PawnRenderer).GetField("statusOverlays", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(_this); MethodInfo rso = typeof(PawnHeadOverlays).GetMethod("RenderStatusOverlays"); rso.Invoke(_statusOverlays, new object[] { bodyLoc, quat, MeshPool.humanlikeHeadSet.MeshAt(headFacing) }); //_statusOverlays.RenderStatusOverlays (bodyLoc, quat, MeshPool.humanlikeHeadSet.MeshAt (headFacing)); } }
public 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; rootLoc.z -= racomp.cachedDrawLocCorrection; Vector3 bodyLoc = rootLoc; Vector3 headLoc = __instance.BaseHeadOffsetAt(bodyFacing); GetModifiedValue(racomp, ref bodyQuat, ref headQuat, ref bodyLoc, ref headLoc, ___pawn, ref renderBody, ref bodyFacing, ref headFacing, portrait); // For Resolve Head Targeting Error Mesh bodyMesh = racomp.raceAddonGraphicSet.bodyMeshSet.MeshAt(bodyFacing); Mesh headMesh = racomp.raceAddonGraphicSet.headMeshSet.MeshAt(headFacing); List <ApparelGraphicRecord> apparelGraphics = __instance.graphics.apparelGraphics; if (renderBody) { List <Material> bodyMatList = __instance.graphics.MatsBodyBaseAt(bodyFacing, bodyDrawType); for (int i = 0; i < bodyMatList.Count; i++) { // Draw Body And Apparel Material mat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, bodyMatList[i], ___pawn, portrait); GenDraw.DrawMeshNowOrLater(bodyMesh, bodyLoc.SetLayer((i + 3) * 10), bodyQuat, mat, portrait); } if (bodyDrawType == RotDrawMode.Fresh && thingDef.raceAddonSettings.graphicSetting.drawWound) { // Draw Wound ___woundOverlays.RenderOverBody(bodyLoc.SetLayer(60), bodyMesh, bodyQuat, portrait); } for (int k = 0; k < apparelGraphics.Count; k++) { // Draw Shell if (apparelGraphics[k].sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Shell && !apparelGraphics[k].sourceApparel.def.apparel.shellRenderedBehindHead) { Material original3 = apparelGraphics[k].graphic.MatAt(bodyFacing); original3 = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, original3, ___pawn, portrait); GenDraw.DrawMeshNowOrLater(bodyMesh, bodyLoc.SetLayer(bodyFacing == Rot4.North ? 80 : 70), bodyQuat, original3, portrait); } // Draw Pack if (PawnRenderer.RenderAsPack(apparelGraphics[k].sourceApparel)) { Material original4 = apparelGraphics[k].graphic.MatAt(bodyFacing); original4 = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, original4, ___pawn, portrait); if (apparelGraphics[k].sourceApparel.def.apparel.wornGraphicData != null) { Vector2 vector3 = apparelGraphics[k].sourceApparel.def.apparel.wornGraphicData.BeltOffsetAt(bodyFacing, ___pawn.story.bodyType); Vector2 vector4 = apparelGraphics[k].sourceApparel.def.apparel.wornGraphicData.BeltScaleAt(___pawn.story.bodyType); Matrix4x4 matrix = Matrix4x4.Translate(bodyLoc.SetLayer(bodyFacing == Rot4.South ? 10 : 90)) * Matrix4x4.Rotate(bodyQuat) * Matrix4x4.Translate(new Vector3(vector3.x, 0f, vector3.y)) * Matrix4x4.Scale(new Vector3(vector4.x, 1f, vector4.y)); GenDraw.DrawMeshNowOrLater_NewTemp(bodyMesh, matrix, original4, portrait); } else { GenDraw.DrawMeshNowOrLater(bodyMesh, bodyLoc.SetLayer(bodyFacing == Rot4.North ? 80 : 70), bodyQuat, original4, portrait); } } } //Draw Body Addons if (bodyDrawType != RotDrawMode.Dessicated && racomp.raceAddonGraphicSet.addonGraphics.FindAll(x => x.data.addonDef.drawingToBody) is var list && list.Count > 0) { foreach (var record in list) { if (!___pawn.InBed() || ___pawn.InBed() && record.data.addonDef.drawnInBed) { Material addonMat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, record.MatAt(bodyFacing, bodyDrawType), ___pawn, portrait); if (addonMat != null) { Vector3 offset = record.data.addonDef.offsets.GetLoc(bodyFacing); GenDraw.DrawMeshNowOrLater(bodyMesh, offset + bodyLoc.SetLayer(record.data.addonDef.drawPriority.GetPriority(bodyFacing)), bodyQuat, addonMat, portrait); } } } } } if (__instance.graphics.headGraphic != null) { // Draw Head if (__instance.graphics.HeadMatAt_NewTemp(headFacing, bodyDrawType, headStump, portrait) is var headMat && headMat != null) { GenDraw.DrawMeshNowOrLater(headMesh, headLoc.SetLayer(headFacing == Rot4.North ? 70 : 80), headQuat, headMat, portrait); } // Draw Hat, Mask bool hideHair = false; if (!portrait || !Prefs.HatsOnlyOnMap) { for (int j = 0; j < apparelGraphics.Count; j++) { if (apparelGraphics[j].sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Overhead) { hideHair = !apparelGraphics[j].sourceApparel.def.apparel.hatRenderedFrontOfFace; Material mat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, apparelGraphics[j].graphic.MatAt(headFacing), ___pawn, portrait); GenDraw.DrawMeshNowOrLater(headMesh, headLoc.SetLayer(hideHair ? 120 : (bodyFacing == Rot4.North) ? 10 : 110), headQuat, mat, portrait); } } } if (bodyDrawType != RotDrawMode.Dessicated && !headStump) { bool blinkNow = false; bool winkNow = false; if (racomp.raceAddonGraphicSet.eyeBlinker != null) { blinkNow = racomp.raceAddonGraphicSet.eyeBlinker.BlinkNow; winkNow = racomp.raceAddonGraphicSet.eyeBlinker.WinkNow; } // Draw Upper Face if (racomp.raceAddonGraphicSet.upperFaceGraphic != null) { Material faceMat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, racomp.raceAddonGraphicSet.upperFaceGraphic.MatAt(headFacing, portrait, blinkNow, winkNow), ___pawn); GenDraw.DrawMeshNowOrLater(headMesh, headLoc.SetLayer(105), headQuat, faceMat, portrait); } // Draw Lower Face if (racomp.raceAddonGraphicSet.lowerFaceGraphic != null) { Material faceMat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, racomp.raceAddonGraphicSet.lowerFaceGraphic.MatAt(headFacing, portrait, blinkNow, winkNow), ___pawn); GenDraw.DrawMeshNowOrLater(headMesh, headLoc.SetLayer(85), headQuat, faceMat, portrait); } // Draw Upper Hair if (!hideHair || racomp.raceAddonGraphicSet.drawUpperHair) { GenDraw.DrawMeshNowOrLater(headMesh, headLoc.SetLayer(100), headQuat, __instance.graphics.HairMatAt_NewTemp(headFacing, portrait), portrait); } // Draw Lower Hair if (racomp.raceAddonGraphicSet.hairGraphic != null && (!hideHair || racomp.raceAddonGraphicSet.drawLowerHair)) { if (renderBody || ___pawn.InBed() && (___pawn.story.hairDef as ImprovedHairDef).drawnInBed) { Material mat = racomp.raceAddonGraphicSet.hairGraphic.MatAt(headFacing); mat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, mat, ___pawn, portrait); GenDraw.DrawMeshNowOrLater(headMesh, headLoc.SetLayer(20), headQuat, mat, portrait); } } // Draw Head Addons if (racomp.raceAddonGraphicSet.addonGraphics.FindAll(x => !x.data.addonDef.drawingToBody) is var list && list.Count > 0) { foreach (var record in list) { if (!___pawn.InBed() || ___pawn.InBed() && record.data.addonDef.drawnInBed) { Material addonMat = OverrideMaterialIfNeeded_NewTemp(__instance.graphics, record.MatAt(headFacing, bodyDrawType), ___pawn, portrait); if (addonMat != null) { Vector3 offset = record.data.addonDef.offsets.GetLoc(bodyFacing); GenDraw.DrawMeshNowOrLater(headMesh, offset + headLoc.SetLayer(record.data.addonDef.drawPriority.GetPriority(headFacing)), headQuat, addonMat, portrait); } } } } } } /* * if (!portrait) * { * DrawEquipment(rootLoc, ___pawn, racomp.raceAddonGraphicSet.equipmentMeshSet.MeshAt(bodyFacing)); * if (___pawn.apparel != null) * { * List<Apparel> wornApparel = ___pawn.apparel.WornApparel; * for (int l = 0; l < wornApparel.Count; l++) * { * wornApparel[l].DrawWornExtras(); * } * } * ___statusOverlays.RenderStatusOverlays(bodyLoc.SetLayer(130), bodyQuat, MeshPool.humanlikeHeadSet.MeshAt(headFacing)); * } * return false; */ } return(true); }
private void RenderPawnInternal(Vector3 rootLoc, float angle, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, RotDrawMode bodyDrawType, bool portrait, bool headStump, bool invisible) { if (!graphics.AllResolved) { graphics.ResolveAllGraphics(); } Quaternion quaternion = Quaternion.AngleAxis(angle, Vector3.up); Mesh mesh = null; if (renderBody) { Vector3 loc = rootLoc; loc.y += 9f / 980f; if (bodyDrawType == RotDrawMode.Dessicated && !pawn.RaceProps.Humanlike && graphics.dessicatedGraphic != null && !portrait) { graphics.dessicatedGraphic.Draw(loc, bodyFacing, pawn, angle); } else { mesh = ((!pawn.RaceProps.Humanlike) ? graphics.nakedGraphic.MeshAt(bodyFacing) : MeshPool.humanlikeBodySet.MeshAt(bodyFacing)); List <Material> list = graphics.MatsBodyBaseAt(bodyFacing, bodyDrawType); for (int i = 0; i < list.Count; i++) { Material mat = OverrideMaterialIfNeeded_NewTemp(list[i], pawn, portrait); GenDraw.DrawMeshNowOrLater(mesh, loc, quaternion, mat, portrait); loc.y += 3f / 980f; } if (bodyDrawType == RotDrawMode.Fresh) { Vector3 drawLoc = rootLoc; drawLoc.y += 9f / 490f; woundOverlays.RenderOverBody(drawLoc, mesh, quaternion, portrait); } } } Vector3 vector = rootLoc; Vector3 a = rootLoc; if (bodyFacing != Rot4.North) { a.y += 6f / 245f; vector.y += 3f / 140f; } else { a.y += 3f / 140f; vector.y += 6f / 245f; } Vector3 vector2 = rootLoc; vector2.y += ((bodyFacing == Rot4.South) ? (3f / 490f) : (27f / 980f)); List <ApparelGraphicRecord> apparelGraphics = graphics.apparelGraphics; if (graphics.headGraphic != null) { Vector3 b = quaternion * BaseHeadOffsetAt(headFacing); Material material = graphics.HeadMatAt_NewTemp(headFacing, bodyDrawType, headStump, portrait); if (material != null) { GenDraw.DrawMeshNowOrLater(MeshPool.humanlikeHeadSet.MeshAt(headFacing), a + b, quaternion, material, portrait); } Vector3 loc2 = rootLoc + b; loc2.y += 3f / 98f; bool flag = false; if (!portrait || !Prefs.HatsOnlyOnMap) { Mesh mesh2 = graphics.HairMeshSet.MeshAt(headFacing); for (int j = 0; j < apparelGraphics.Count; j++) { if (apparelGraphics[j].sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Overhead) { if (!apparelGraphics[j].sourceApparel.def.apparel.hatRenderedFrontOfFace) { flag = true; Material original = apparelGraphics[j].graphic.MatAt(bodyFacing); original = OverrideMaterialIfNeeded_NewTemp(original, pawn, portrait); GenDraw.DrawMeshNowOrLater(mesh2, loc2, quaternion, original, portrait); } else { Material original2 = apparelGraphics[j].graphic.MatAt(bodyFacing); original2 = OverrideMaterialIfNeeded_NewTemp(original2, pawn, portrait); Vector3 loc3 = rootLoc + b; loc3.y += ((bodyFacing == Rot4.North) ? (3f / 980f) : (33f / 980f)); GenDraw.DrawMeshNowOrLater(mesh2, loc3, quaternion, original2, portrait); } } } } if (!flag && bodyDrawType != RotDrawMode.Dessicated && !headStump) { GenDraw.DrawMeshNowOrLater(graphics.HairMeshSet.MeshAt(headFacing), mat: graphics.HairMatAt_NewTemp(headFacing, portrait), loc: loc2, quat: quaternion, drawNow: portrait); } } if (renderBody) { for (int k = 0; k < apparelGraphics.Count; k++) { ApparelGraphicRecord apparelGraphicRecord = apparelGraphics[k]; if (apparelGraphicRecord.sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Shell && !apparelGraphicRecord.sourceApparel.def.apparel.shellRenderedBehindHead) { Material original3 = apparelGraphicRecord.graphic.MatAt(bodyFacing); original3 = OverrideMaterialIfNeeded_NewTemp(original3, pawn, portrait); GenDraw.DrawMeshNowOrLater(mesh, vector, quaternion, original3, portrait); } if (RenderAsPack(apparelGraphicRecord.sourceApparel)) { Material original4 = apparelGraphicRecord.graphic.MatAt(bodyFacing); original4 = OverrideMaterialIfNeeded_NewTemp(original4, pawn, portrait); if (apparelGraphicRecord.sourceApparel.def.apparel.wornGraphicData != null) { Vector2 vector3 = apparelGraphicRecord.sourceApparel.def.apparel.wornGraphicData.BeltOffsetAt(bodyFacing, pawn.story.bodyType); Vector2 vector4 = apparelGraphicRecord.sourceApparel.def.apparel.wornGraphicData.BeltScaleAt(pawn.story.bodyType); Matrix4x4 matrix = Matrix4x4.Translate(vector2) * Matrix4x4.Rotate(quaternion) * Matrix4x4.Translate(new Vector3(vector3.x, 0f, vector3.y)) * Matrix4x4.Scale(new Vector3(vector4.x, 1f, vector4.y)); GenDraw.DrawMeshNowOrLater_NewTemp(mesh, matrix, original4, portrait); } else { GenDraw.DrawMeshNowOrLater(mesh, vector, quaternion, original4, portrait); } } } } if (!portrait && pawn.RaceProps.Animal && pawn.inventory != null && pawn.inventory.innerContainer.Count > 0 && graphics.packGraphic != null) { Graphics.DrawMesh(mesh, vector, quaternion, graphics.packGraphic.MatAt(bodyFacing), 0); } if (portrait) { return; } DrawEquipment(rootLoc); if (pawn.apparel != null) { List <Apparel> wornApparel = pawn.apparel.WornApparel; for (int l = 0; l < wornApparel.Count; l++) { wornApparel[l].DrawWornExtras(); } } Vector3 bodyLoc = rootLoc; bodyLoc.y += 39f / 980f; statusOverlays.RenderStatusOverlays(bodyLoc, quaternion, MeshPool.humanlikeHeadSet.MeshAt(headFacing)); }
private void RenderPawnInternal(Vector3 rootLoc, float angle, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, RotDrawMode bodyDrawType, bool portrait, bool headStump, bool invisible) { if (!graphics.AllResolved) { graphics.ResolveAllGraphics(); } Quaternion quaternion = Quaternion.AngleAxis(angle, Vector3.up); Mesh mesh = null; if (renderBody) { Vector3 loc = rootLoc; loc.y += 0.007575758f; if (bodyDrawType == RotDrawMode.Dessicated && !pawn.RaceProps.Humanlike && graphics.dessicatedGraphic != null && !portrait) { graphics.dessicatedGraphic.Draw(loc, bodyFacing, pawn, angle); } else { mesh = ((!pawn.RaceProps.Humanlike) ? graphics.nakedGraphic.MeshAt(bodyFacing) : MeshPool.humanlikeBodySet.MeshAt(bodyFacing)); List <Material> list = graphics.MatsBodyBaseAt(bodyFacing, bodyDrawType); for (int i = 0; i < list.Count; i++) { Material mat = OverrideMaterialIfNeeded(list[i], pawn); GenDraw.DrawMeshNowOrLater(mesh, loc, quaternion, mat, portrait); loc.y += 0.003787879f; } if (bodyDrawType == RotDrawMode.Fresh) { Vector3 drawLoc = rootLoc; drawLoc.y += 5f / 264f; woundOverlays.RenderOverBody(drawLoc, mesh, quaternion, portrait); } } } Vector3 vector = rootLoc; Vector3 a = rootLoc; if (bodyFacing != Rot4.North) { a.y += 7f / 264f; vector.y += 0.0227272734f; } else { a.y += 0.0227272734f; vector.y += 7f / 264f; } if (graphics.headGraphic != null) { Vector3 b = quaternion * BaseHeadOffsetAt(headFacing); Material material = graphics.HeadMatAt(headFacing, bodyDrawType, headStump); if (material != null) { GenDraw.DrawMeshNowOrLater(MeshPool.humanlikeHeadSet.MeshAt(headFacing), a + b, quaternion, material, portrait); } Vector3 loc2 = rootLoc + b; loc2.y += 0.0303030312f; bool flag = false; if (!portrait || !Prefs.HatsOnlyOnMap) { Mesh mesh2 = graphics.HairMeshSet.MeshAt(headFacing); 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) { flag = true; Material original = apparelGraphics[j].graphic.MatAt(bodyFacing); original = OverrideMaterialIfNeeded(original, pawn); GenDraw.DrawMeshNowOrLater(mesh2, loc2, quaternion, original, portrait); } else { Material original2 = apparelGraphics[j].graphic.MatAt(bodyFacing); original2 = OverrideMaterialIfNeeded(original2, pawn); Vector3 loc3 = rootLoc + b; loc3.y += ((bodyFacing == Rot4.North) ? 0.003787879f : (3f / 88f)); GenDraw.DrawMeshNowOrLater(mesh2, loc3, quaternion, original2, portrait); } } } } if (!flag && bodyDrawType != RotDrawMode.Dessicated && !headStump) { GenDraw.DrawMeshNowOrLater(graphics.HairMeshSet.MeshAt(headFacing), mat: graphics.HairMatAt(headFacing), loc: loc2, quat: quaternion, drawNow: portrait); } } if (renderBody) { for (int k = 0; k < graphics.apparelGraphics.Count; k++) { ApparelGraphicRecord apparelGraphicRecord = graphics.apparelGraphics[k]; if (apparelGraphicRecord.sourceApparel.def.apparel.LastLayer == ApparelLayerDefOf.Shell) { Material original3 = apparelGraphicRecord.graphic.MatAt(bodyFacing); original3 = OverrideMaterialIfNeeded(original3, pawn); GenDraw.DrawMeshNowOrLater(mesh, vector, quaternion, original3, portrait); } } } if (!portrait && pawn.RaceProps.Animal && pawn.inventory != null && pawn.inventory.innerContainer.Count > 0 && graphics.packGraphic != null) { Graphics.DrawMesh(mesh, vector, quaternion, graphics.packGraphic.MatAt(bodyFacing), 0); } if (portrait) { return; } DrawEquipment(rootLoc); if (pawn.apparel != null) { List <Apparel> wornApparel = pawn.apparel.WornApparel; for (int l = 0; l < wornApparel.Count; l++) { wornApparel[l].DrawWornExtras(); } } Vector3 bodyLoc = rootLoc; bodyLoc.y += 0.0416666679f; statusOverlays.RenderStatusOverlays(bodyLoc, quaternion, MeshPool.humanlikeHeadSet.MeshAt(headFacing)); }