Skip to content

Commit d664f19

Browse files
Move ghost floor rendering after main loop for correct z-order
Ghost higher/lower floors now render AFTER the main floor loop instead of before it, so they appear visually in front of the current floor tiles as expected.
1 parent 7388940 commit d664f19

1 file changed

Lines changed: 62 additions & 62 deletions

File tree

src/App/Controls/MapCanvasControl.cs

Lines changed: 62 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -459,68 +459,6 @@ public override void Render(DrawingContext context)
459459
superEndZ = floor;
460460
}
461461

462-
// ── Ghost higher floors: draw ONE floor above current with alpha (~65%) ──
463-
if (ghostHigherFloors && floor > 0)
464-
{
465-
byte upperFloor = (byte)(floor - 1);
466-
double ghostOffset;
467-
if (upperFloor <= 7)
468-
ghostOffset = (7 - upperFloor) * TileSize * zoom;
469-
else
470-
ghostOffset = (floor - upperFloor) * TileSize * zoom;
471-
472-
using (context.PushOpacity(0.65))
473-
{
474-
for (int ty = startTileY; ty <= endTileY; ty++)
475-
{
476-
for (int tx = startTileX; tx <= endTileX; tx++)
477-
{
478-
var pos = new MapPosition((ushort)tx, (ushort)ty, upperFloor);
479-
if (!_mapData.Tiles.TryGetValue(pos, out var tile)) continue;
480-
double baseScreenX = (tx * TileSize - _viewX) * zoom - ghostOffset;
481-
double baseScreenY = (ty * TileSize - _viewY) * zoom - ghostOffset;
482-
if (showAsMinimap)
483-
DrawMinimapTile(context, tile, baseScreenX, baseScreenY, tilePixelSize);
484-
else
485-
foreach (var item in tile.Items)
486-
DrawItem(context, ResolveClientId(item.Id), pos,
487-
baseScreenX, baseScreenY, zoom, 0, 1.0);
488-
}
489-
}
490-
}
491-
}
492-
493-
// ── Ghost lower floors: draw ONE floor below current with alpha (~65%) ──
494-
if (ghostLowerFloors && floor < 15)
495-
{
496-
byte lowerFloor = (byte)(floor + 1);
497-
double ghostOffset;
498-
if (lowerFloor <= 7)
499-
ghostOffset = (7 - lowerFloor) * TileSize * zoom;
500-
else
501-
ghostOffset = (floor - lowerFloor) * TileSize * zoom;
502-
503-
using (context.PushOpacity(0.65))
504-
{
505-
for (int ty = startTileY; ty <= endTileY; ty++)
506-
{
507-
for (int tx = startTileX; tx <= endTileX; tx++)
508-
{
509-
var pos = new MapPosition((ushort)tx, (ushort)ty, lowerFloor);
510-
if (!_mapData.Tiles.TryGetValue(pos, out var tile)) continue;
511-
double baseScreenX = (tx * TileSize - _viewX) * zoom - ghostOffset;
512-
double baseScreenY = (ty * TileSize - _viewY) * zoom - ghostOffset;
513-
if (showAsMinimap)
514-
DrawMinimapTile(context, tile, baseScreenX, baseScreenY, tilePixelSize);
515-
else
516-
foreach (var item in tile.Items)
517-
DrawItem(context, ResolveClientId(item.Id), pos,
518-
baseScreenX, baseScreenY, zoom, 0, 1.0);
519-
}
520-
}
521-
}
522-
}
523-
524462
// ── Multi-floor loop: render from startZ down to superEndZ ──
525463
// Reference: for(map_z = start_z; map_z >= superend_z; map_z--)
526464
// Shade is drawn ONCE when map_z reaches end_z (current floor) and start_z != end_z
@@ -643,6 +581,68 @@ public override void Render(DrawingContext context)
643581
}
644582
}
645583

584+
// ── Ghost higher floors: draw ONE floor above current with alpha (~65%) ──
585+
if (ghostHigherFloors && floor > 0)
586+
{
587+
byte upperFloor = (byte)(floor - 1);
588+
double ghostOffset;
589+
if (upperFloor <= 7)
590+
ghostOffset = (7 - upperFloor) * TileSize * zoom;
591+
else
592+
ghostOffset = (floor - upperFloor) * TileSize * zoom;
593+
594+
using (context.PushOpacity(0.65))
595+
{
596+
for (int ty = startTileY; ty <= endTileY; ty++)
597+
{
598+
for (int tx = startTileX; tx <= endTileX; tx++)
599+
{
600+
var pos = new MapPosition((ushort)tx, (ushort)ty, upperFloor);
601+
if (!_mapData.Tiles.TryGetValue(pos, out var tile)) continue;
602+
double baseScreenX = (tx * TileSize - _viewX) * zoom - ghostOffset;
603+
double baseScreenY = (ty * TileSize - _viewY) * zoom - ghostOffset;
604+
if (showAsMinimap)
605+
DrawMinimapTile(context, tile, baseScreenX, baseScreenY, tilePixelSize);
606+
else
607+
foreach (var item in tile.Items)
608+
DrawItem(context, ResolveClientId(item.Id), pos,
609+
baseScreenX, baseScreenY, zoom, 0, 1.0);
610+
}
611+
}
612+
}
613+
}
614+
615+
// ── Ghost lower floors: draw ONE floor below current with alpha (~65%) ──
616+
if (ghostLowerFloors && floor < 15)
617+
{
618+
byte lowerFloor = (byte)(floor + 1);
619+
double ghostOffset;
620+
if (lowerFloor <= 7)
621+
ghostOffset = (7 - lowerFloor) * TileSize * zoom;
622+
else
623+
ghostOffset = (floor - lowerFloor) * TileSize * zoom;
624+
625+
using (context.PushOpacity(0.65))
626+
{
627+
for (int ty = startTileY; ty <= endTileY; ty++)
628+
{
629+
for (int tx = startTileX; tx <= endTileX; tx++)
630+
{
631+
var pos = new MapPosition((ushort)tx, (ushort)ty, lowerFloor);
632+
if (!_mapData.Tiles.TryGetValue(pos, out var tile)) continue;
633+
double baseScreenX = (tx * TileSize - _viewX) * zoom - ghostOffset;
634+
double baseScreenY = (ty * TileSize - _viewY) * zoom - ghostOffset;
635+
if (showAsMinimap)
636+
DrawMinimapTile(context, tile, baseScreenX, baseScreenY, tilePixelSize);
637+
else
638+
foreach (var item in tile.Items)
639+
DrawItem(context, ResolveClientId(item.Id), pos,
640+
baseScreenX, baseScreenY, zoom, 0, 1.0);
641+
}
642+
}
643+
}
644+
}
645+
646646
// ── Tile overlays pass (drawn AFTER all items to avoid multi-tile sprites covering them) ──
647647
if (!showAsMinimap)
648648
{

0 commit comments

Comments
 (0)