示例#1
0
        public static void DynamicDrawManagerPostfix(DynamicDrawManager __instance, Map ___map, ref bool ___drawingNow)
        {
            var ZTracker = ZUtils.ZTracker;
            int curLevel = ZTracker.GetZIndexFor(___map);

            if (curLevel > 0)
            {
                foreach (var map2 in ZTracker.GetAllMaps(___map.Tile))                //.OrderBy(x => ZTracker.GetZIndexFor(x)))
                {
                    int baseLevel = ZTracker.GetZIndexFor(map2);
                    if (curLevel > baseLevel && baseLevel >= 0)
                    {
                        ___drawingNow = true;
                        bool[]   fogGrid  = map2.fogGrid.fogGrid;
                        CellRect cellRect = Find.CameraDriver.CurrentViewRect;
                        cellRect.ClipInsideMap(map2);
                        cellRect = cellRect.ExpandedBy(1);
                        CellIndices cellIndices = map2.cellIndices;
                        foreach (Thing thing in map2.dynamicDrawManager.drawThings)
                        {
                            IntVec3 position  = thing.Position;
                            IntVec3 position2 = position + new IntVec3(0, 0, -1);
                            if (position.GetTerrain(___map) == ZLevelsDefOf.ZL_OutsideTerrain ||
                                position2.InBounds(___map) && position.GetTerrain(___map) != ZLevelsDefOf.ZL_OutsideTerrain &&
                                position2.GetTerrain(___map) == ZLevelsDefOf.ZL_OutsideTerrain)
                            {
                                if ((cellRect.Contains(position) || thing.def.drawOffscreen)
                                    //&& (!fogGrid[cellIndices.CellToIndex(position)]
                                    //|| thing.def.seeThroughFog)
                                    && (thing.def.hideAtSnowDepth >= 1f ||
                                        map2.snowGrid.GetDepth(position) <= thing.def.hideAtSnowDepth))
                                {
                                    DrawPos_Patch.ChangeDrawPos = true;
                                    DrawPos_Patch.zLevelOffset  = (baseLevel - curLevel) / 3.5f;
                                    DrawPos_Patch.yLevelOffset  = baseLevel - curLevel;
                                    try
                                    {
                                        var graphicType = thing.Graphic.GetType();
                                        if (graphicType == typeof(Graphic_Mote))
                                        {
                                        }
                                        else if (graphicType == typeof(Graphic_LinkedCornerFiller) || graphicType == typeof(Graphic_RandomRotated) || graphicType == typeof(Graphic_Linked))
                                        {
                                            thing.Draw();
                                        }
                                        else if (thing is Pawn pawn)
                                        {
                                            DrawPos_Patch.ChangeDrawPos = false;
                                            var newDrawPos = thing.DrawPos;
                                            newDrawPos.z += (baseLevel - curLevel) / 2f;
                                            newDrawPos.y -= baseLevel - curLevel;
                                            newDrawPos.y -= 4.1f;
                                            if (cachedPawnRenderers.ContainsKey(pawn))
                                            {
                                                cachedPawnRenderers[pawn].RenderPawnAt(newDrawPos, curLevel, baseLevel);
                                            }
                                            else
                                            {
                                                var newRenderer = new PawnRendererScaled(pawn, pawn.Drawer.renderer.wiggler);
                                                pawn.Drawer.renderer.graphics.ResolveAllGraphics();
                                                newRenderer.graphics.nakedGraphic      = pawn.Drawer.renderer.graphics.nakedGraphic;
                                                newRenderer.graphics.headGraphic       = pawn.Drawer.renderer.graphics.headGraphic;
                                                newRenderer.graphics.hairGraphic       = pawn.Drawer.renderer.graphics.hairGraphic;
                                                newRenderer.graphics.rottingGraphic    = pawn.Drawer.renderer.graphics.rottingGraphic;
                                                newRenderer.graphics.dessicatedGraphic = pawn.Drawer.renderer.graphics.dessicatedGraphic;
                                                newRenderer.graphics.apparelGraphics   = pawn.Drawer.renderer.graphics.apparelGraphics;
                                                newRenderer.graphics.packGraphic       = pawn.Drawer.renderer.graphics.packGraphic;
                                                newRenderer.graphics.flasher           = pawn.Drawer.renderer.graphics.flasher;
                                                newRenderer.RenderPawnAt(newDrawPos, curLevel, baseLevel);
                                                cachedPawnRenderers[pawn] = newRenderer;
                                            }
                                        }
                                        else if (thing is Corpse corpse)
                                        {
                                            DrawPos_Patch.ChangeDrawPos = false;
                                            var newDrawPos = thing.DrawPos;
                                            newDrawPos.z += (baseLevel - curLevel) / 2f;
                                            newDrawPos.y -= baseLevel - curLevel;
                                            newDrawPos.y -= 4f;
                                            if (cachedCorpseRenderers.ContainsKey(corpse.InnerPawn))
                                            {
                                                cachedCorpseRenderers[corpse.InnerPawn].RenderPawnAt(newDrawPos, curLevel, baseLevel);
                                            }
                                            else
                                            {
                                                var newRenderer = new PawnRendererScaled(corpse.InnerPawn, corpse.InnerPawn.Drawer.renderer.wiggler);
                                                corpse.InnerPawn.Drawer.renderer.graphics.ResolveAllGraphics();
                                                newRenderer.graphics.nakedGraphic      = corpse.InnerPawn.Drawer.renderer.graphics.nakedGraphic;
                                                newRenderer.graphics.headGraphic       = corpse.InnerPawn.Drawer.renderer.graphics.headGraphic;
                                                newRenderer.graphics.hairGraphic       = corpse.InnerPawn.Drawer.renderer.graphics.hairGraphic;
                                                newRenderer.graphics.rottingGraphic    = corpse.InnerPawn.Drawer.renderer.graphics.rottingGraphic;
                                                newRenderer.graphics.dessicatedGraphic = corpse.InnerPawn.Drawer.renderer.graphics.dessicatedGraphic;
                                                newRenderer.graphics.apparelGraphics   = corpse.InnerPawn.Drawer.renderer.graphics.apparelGraphics;
                                                newRenderer.graphics.packGraphic       = corpse.InnerPawn.Drawer.renderer.graphics.packGraphic;
                                                newRenderer.graphics.flasher           = corpse.InnerPawn.Drawer.renderer.graphics.flasher;
                                                newRenderer.RenderPawnAt(newDrawPos, curLevel, baseLevel);
                                                cachedCorpseRenderers[corpse.InnerPawn] = newRenderer;
                                            }
                                        }
                                        else if (thing.def.projectile == null && !thing.def.IsDoor)
                                        {
                                            Vector2 drawSize = thing.Graphic.drawSize;
                                            drawSize.x *= 1f - (((float)(curLevel) - (float)baseLevel) / 5f);
                                            drawSize.y *= 1f - (((float)(curLevel) - (float)baseLevel) / 5f);
                                            var newGraphic = thing.Graphic.GetCopy(drawSize);
                                            newGraphic.Draw(thing.DrawPos, thing.Rotation, thing);
                                        }
                                        else
                                        {
                                            if (thing is Building_Door door)
                                            {
                                                DrawPos_Patch.ChangeDrawPos = false;
                                                DrawDoor(door, baseLevel, curLevel);
                                            }
                                            else
                                            {
                                                thing.Draw();
                                            }
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        Log.Error(string.Concat(new object[]
                                        {
                                            "Exception drawing ",
                                            thing,
                                            ": ",
                                            ex.ToString()
                                        }), false);
                                    }
                                    DrawPos_Patch.ChangeDrawPos = false;
                                }
                            }
                        }
                        ___drawingNow = false;
                    }
                }
            }
        }
示例#2
0
        public static void DynamicDrawManagerPostfix(DynamicDrawManager __instance)
        {
            Map map      = Traverse.Create(__instance).Field("map").GetValue <Map>();
            var ZTracker = Current.Game.GetComponent <ZLevelsManager>();

            foreach (var map2 in ZTracker.GetAllMaps(map.Tile)
                     .OrderBy(x => ZTracker.GetZIndexFor(x)))
            {
                int curLevel  = ZTracker.GetZIndexFor(map);
                int baseLevel = ZTracker.GetZIndexFor(map2);

                if (curLevel > baseLevel && baseLevel >= 0)
                {
                    HashSet <Thing> drawThings = Traverse.Create(map2.dynamicDrawManager).Field("drawThings").GetValue <HashSet <Thing> >();

                    if (!DebugViewSettings.drawThingsDynamic)
                    {
                        return;
                    }
                    Traverse.Create(__instance).Field("drawingNow").SetValue(true);
                    try
                    {
                        bool[]   fogGrid  = map2.fogGrid.fogGrid;
                        CellRect cellRect = Find.CameraDriver.CurrentViewRect;
                        cellRect.ClipInsideMap(map2);
                        cellRect = cellRect.ExpandedBy(1);
                        CellIndices cellIndices = map2.cellIndices;
                        foreach (Thing thing in drawThings)
                        {
                            IntVec3 position = thing.Position;
                            if (position.GetTerrain(map) == ZLevelsDefOf.ZL_OutsideTerrain)
                            {
                                if ((cellRect.Contains(position) || thing.def.drawOffscreen)
                                    //&& (!fogGrid[cellIndices.CellToIndex(position)]
                                    //|| thing.def.seeThroughFog)
                                    && (thing.def.hideAtSnowDepth >= 1f ||
                                        map2.snowGrid.GetDepth(position) <= thing.def.hideAtSnowDepth))
                                {
                                    try
                                    {
                                        if (thing.Graphic is Graphic_Mote || thing.Graphic is Graphic_Linked)
                                        {
                                        }
                                        else if (thing.Graphic is Graphic_LinkedCornerFiller ||
                                                 thing.Graphic is Graphic_RandomRotated)
                                        {
                                            thing.Draw();
                                        }
                                        else if (thing is Pawn pawn)
                                        {
                                            var newRenderer = new PawnRendererScaled(pawn);
                                            pawn.Drawer.renderer.graphics.ResolveAllGraphics();
                                            newRenderer.graphics.nakedGraphic      = pawn.Drawer.renderer.graphics.nakedGraphic;
                                            newRenderer.graphics.headGraphic       = pawn.Drawer.renderer.graphics.headGraphic;
                                            newRenderer.graphics.hairGraphic       = pawn.Drawer.renderer.graphics.hairGraphic;
                                            newRenderer.graphics.rottingGraphic    = pawn.Drawer.renderer.graphics.rottingGraphic;
                                            newRenderer.graphics.dessicatedGraphic = pawn.Drawer.renderer.graphics.dessicatedGraphic;
                                            newRenderer.graphics.apparelGraphics   = pawn.Drawer.renderer.graphics.apparelGraphics;
                                            newRenderer.graphics.packGraphic       = pawn.Drawer.renderer.graphics.packGraphic;
                                            newRenderer.graphics.flasher           = pawn.Drawer.renderer.graphics.flasher;
                                            newRenderer.RenderPawnAt(thing.DrawPos, curLevel, baseLevel);
                                        }
                                        else
                                        {
                                            Vector2 drawSize = thing.Graphic.drawSize;
                                            drawSize.x *= 1f - (((float)(curLevel) - (float)baseLevel) / 5f);
                                            drawSize.y *= 1f - (((float)(curLevel) - (float)baseLevel) / 5f);
                                            var newGraphic = thing.Graphic.GetCopy(drawSize);
                                            newGraphic.Draw(thing.DrawPos, thing.Rotation, thing);
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        Log.Error(string.Concat(new object[]
                                        {
                                            "Exception drawing ",
                                            thing,
                                            ": ",
                                            ex.ToString()
                                        }), false);
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception arg)
                    {
                        Log.Error("Exception drawing dynamic things: " + arg, false);
                    }
                    Traverse.Create(__instance).Field("drawingNow").SetValue(false);
                }
            }
        }
示例#3
0
        public static void Postfix(DynamicDrawManager __instance, Map ___map, ref bool ___drawingNow)
        {
            var ZTracker = ZUtils.ZTracker;
            int curLevel = ZTracker.GetZIndexFor(___map);

            if (curLevel > 0)
            {
                foreach (var map2 in ZTracker.GetAllMaps(___map.Tile))                //.OrderBy(x => ZTracker.GetZIndexFor(x)))
                {
                    int baseLevel = ZTracker.GetZIndexFor(map2);
                    if (curLevel > baseLevel && baseLevel >= 0)
                    {
                        ___drawingNow = true;
                        bool[]   fogGrid  = map2.fogGrid.fogGrid;
                        CellRect cellRect = Find.CameraDriver.CurrentViewRect;
                        cellRect.ClipInsideMap(map2);
                        cellRect = cellRect.ExpandedBy(1);
                        CellIndices cellIndices = map2.cellIndices;
                        foreach (Thing thing in map2.dynamicDrawManager.drawThings)
                        {
                            if (thing.def.drawerType != DrawerType.None && thing.def.drawerType != DrawerType.RealtimeOnly)
                            {
                                if (thing is Building_TurretGun turretGun)
                                {
                                    var turretDrawPos = turretGun.DrawPos;
                                    turretDrawPos.y += Math.Abs(baseLevel - curLevel);
                                    turretDrawPos.z += (baseLevel - curLevel) / turretDrawZOffset;
                                    Vector3 b = new Vector3(turretGun.def.building.turretTopOffset.x, 0f, turretGun.def.building.turretTopOffset.y).RotatedBy(turretGun.top.CurRotation);
                                    float   turretTopDrawSize = turretGun.top.parentTurret.def.building.turretTopDrawSize
                                                                * (1f - (((float)(curLevel) - (float)baseLevel) / 5f));
                                    Matrix4x4 matrix = default(Matrix4x4);
                                    matrix.SetTRS(turretDrawPos + Altitudes.AltIncVect + b, (turretGun.top.CurRotation + (float)TurretTop.ArtworkRotation).ToQuat(), new Vector3(turretTopDrawSize, 1f, turretTopDrawSize));
                                    Graphics.DrawMesh(MeshPool.plane10, matrix, turretGun.def.building.turretTopMat, 0);
                                }
                                continue;
                            }
                            IntVec3 position        = thing.Position;
                            IntVec3 position2       = position + new IntVec3(0, 0, -1);
                            var     positionTerrain = position.GetTerrain(___map);
                            if (positionTerrain == ZLevelsDefOf.ZL_OutsideTerrain || position2.InBounds(___map) && positionTerrain != ZLevelsDefOf.ZL_OutsideTerrain && position2.GetTerrain(___map) == ZLevelsDefOf.ZL_OutsideTerrain)
                            {
                                if ((cellRect.Contains(position) || thing.def.drawOffscreen)
                                    //&& (!fogGrid[cellIndices.CellToIndex(position)]
                                    //|| thing.def.seeThroughFog)
                                    && (thing.def.hideAtSnowDepth >= 1f ||
                                        map2.snowGrid.GetDepth(position) <= thing.def.hideAtSnowDepth))
                                {
                                    DrawPos_Patch.ChangeDrawPos = true;
                                    DrawPos_Patch.zLevelOffset  = (baseLevel - curLevel) / globalZOffset;
                                    DrawPos_Patch.yLevelOffset  = baseLevel - curLevel;
                                    try
                                    {
                                        var graphicType = thing.Graphic.GetType();
                                        if (graphicType == typeof(Graphic_LinkedCornerFiller) || graphicType == typeof(Graphic_Linked))
                                        {
                                            thing.Draw();
                                        }
                                        else if (thing is Pawn pawn)
                                        {
                                            DrawPos_Patch.ChangeDrawPos = false;
                                            var newDrawPos = thing.DrawPos;
                                            newDrawPos.z += (baseLevel - curLevel) / pawnZOffset;
                                            newDrawPos.y -= baseLevel - curLevel;
                                            newDrawPos.y -= pawnYOffset;
                                            if (cachedPawnRenderers.TryGetValue(pawn, out var pawnRenderer))
                                            {
                                                pawnRenderer.RenderPawnAt(newDrawPos, curLevel, baseLevel);
                                            }
                                            else
                                            {
                                                var newRenderer = new PawnRendererScaled(pawn, pawn.Drawer.renderer.wiggler);
                                                pawn.Drawer.renderer.graphics.ResolveAllGraphics();
                                                newRenderer.graphics.nakedGraphic      = pawn.Drawer.renderer.graphics.nakedGraphic;
                                                newRenderer.graphics.headGraphic       = pawn.Drawer.renderer.graphics.headGraphic;
                                                newRenderer.graphics.hairGraphic       = pawn.Drawer.renderer.graphics.hairGraphic;
                                                newRenderer.graphics.rottingGraphic    = pawn.Drawer.renderer.graphics.rottingGraphic;
                                                newRenderer.graphics.dessicatedGraphic = pawn.Drawer.renderer.graphics.dessicatedGraphic;
                                                newRenderer.graphics.apparelGraphics   = pawn.Drawer.renderer.graphics.apparelGraphics;
                                                newRenderer.graphics.packGraphic       = pawn.Drawer.renderer.graphics.packGraphic;
                                                newRenderer.graphics.flasher           = pawn.Drawer.renderer.graphics.flasher;
                                                newRenderer.RenderPawnAt(newDrawPos, curLevel, baseLevel);
                                                cachedPawnRenderers[pawn] = newRenderer;
                                            }
                                        }
                                        else if (thing is Corpse corpse)
                                        {
                                            DrawPos_Patch.ChangeDrawPos = false;
                                            var newDrawPos = thing.DrawPos;
                                            newDrawPos.z += (baseLevel - curLevel) / pawnZOffset;
                                            newDrawPos.y -= baseLevel - curLevel;
                                            newDrawPos.y -= 4f;
                                            if (cachedCorpseRenderers.TryGetValue(corpse.InnerPawn, out var pawnRenderer))
                                            {
                                                pawnRenderer.RenderPawnAt(newDrawPos, curLevel, baseLevel);
                                            }
                                            else
                                            {
                                                var newRenderer = new PawnRendererScaled(corpse.InnerPawn, corpse.InnerPawn.Drawer.renderer.wiggler);
                                                corpse.InnerPawn.Drawer.renderer.graphics.ResolveAllGraphics();
                                                newRenderer.graphics.nakedGraphic      = corpse.InnerPawn.Drawer.renderer.graphics.nakedGraphic;
                                                newRenderer.graphics.headGraphic       = corpse.InnerPawn.Drawer.renderer.graphics.headGraphic;
                                                newRenderer.graphics.hairGraphic       = corpse.InnerPawn.Drawer.renderer.graphics.hairGraphic;
                                                newRenderer.graphics.rottingGraphic    = corpse.InnerPawn.Drawer.renderer.graphics.rottingGraphic;
                                                newRenderer.graphics.dessicatedGraphic = corpse.InnerPawn.Drawer.renderer.graphics.dessicatedGraphic;
                                                newRenderer.graphics.apparelGraphics   = corpse.InnerPawn.Drawer.renderer.graphics.apparelGraphics;
                                                newRenderer.graphics.packGraphic       = corpse.InnerPawn.Drawer.renderer.graphics.packGraphic;
                                                newRenderer.graphics.flasher           = corpse.InnerPawn.Drawer.renderer.graphics.flasher;
                                                newRenderer.RenderPawnAt(newDrawPos, curLevel, baseLevel);
                                                cachedCorpseRenderers[corpse.InnerPawn] = newRenderer;
                                            }
                                        }
                                        else if (thing.def.projectile == null && !thing.def.IsDoor)
                                        {
                                            if (!cachedGraphics.TryGetValue(thing, out var graphics))
                                            {
                                                graphics = new Dictionary <int, Graphic>();
                                                cachedGraphics[thing] = graphics;
                                            }
                                            if (!graphics.TryGetValue(curLevel, out var graphic) || true)
                                            {
                                                Vector2 drawSize = thing.Graphic.drawSize;
                                                drawSize.x *= 1f - ((curLevel - baseLevel) / thingDrawScale);
                                                drawSize.y *= 1f - ((curLevel - baseLevel) / thingDrawScale);

                                                if (thing.Graphic is Graphic_RandomRotated graphicRandomRotated)
                                                {
                                                    graphic      = graphicRandomRotated.subGraphic.GetCopy(drawSize);
                                                    graphic.data = graphicRandomRotated.subGraphic.data;
                                                }
                                                else
                                                {
                                                    graphic      = thing.Graphic.GetCopy(drawSize);
                                                    graphic.data = thing.Graphic.data;
                                                }
                                                graphic.data.drawSize = drawSize;
                                                graphics[curLevel]    = graphic;
                                            }

                                            if (thing.def.mote != null)
                                            {
                                                DrawPos_Patch.zLevelOffset = (baseLevel - curLevel) / moteZOffset;
                                            }
                                            graphic.Draw(thing.DrawPos, thing.Rotation, thing);
                                        }
                                        else
                                        {
                                            if (thing is Building_Door door)
                                            {
                                                DrawPos_Patch.ChangeDrawPos = false;
                                                DrawDoor(door, baseLevel, curLevel);
                                            }
                                            else
                                            {
                                                thing.Draw();
                                            }
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        Log.Error(string.Concat(new object[]
                                        {
                                            "Exception drawing ",
                                            thing,
                                            ": ",
                                            ex.ToString()
                                        }), false);
                                    }
                                    DrawPos_Patch.ChangeDrawPos = false;
                                }
                            }
                        }
                        ___drawingNow = false;
                    }
                }
            }
        }