#ifndef Z_VALUES_H #define Z_VALUES_H #include "card_dimensions.h" #include "z_value_layer_manager.h" /** * @file z_values.h * @ingroup GameGraphics * @brief Centralized Z-value constants for rendering layer order. * * Z-values in Qt determine stacking order. Higher values render on top. * These constants define the visual layering hierarchy for the game scene. * * ## Layer Architecture * * See z_value_layer_manager.h for detailed documentation on the three-layer * architecture (Zone, Card, Overlay) and the rationale for Z-value choices. * * ## Quick Reference * * | Layer | Z-Value Range | Purpose | * |----------|------------------|-----------------------------------| * | Zone | 0.5 - 1.0 | Zone backgrounds, containers | * | Card | 1.0 - 40,000,000 | Cards on table (position-based) | * | Overlay | 2,000,000,000+ | UI elements above all cards | */ namespace ZValues { // Expose base for callers that need it constexpr qreal OVERLAY_BASE = ZValueLayerManager::OVERLAY_BASE; // Overlay layer Z-values for items that should appear above normal cards constexpr qreal HOVERED_CARD = ZValueLayerManager::overlayZValue(1.0); constexpr qreal ARROWS = ZValueLayerManager::overlayZValue(3.0); constexpr qreal ZONE_VIEW_WIDGET = ZValueLayerManager::overlayZValue(4.0); constexpr qreal DRAG_ITEM = ZValueLayerManager::overlayZValue(5.0); constexpr qreal DRAG_ITEM_CHILD = ZValueLayerManager::overlayZValue(6.0); constexpr qreal TOP_UI = ZValueLayerManager::overlayZValue(7.0); /** * @brief Compute Z-value for child drag items based on hotspot position. * * When dragging multiple cards together, each child card needs a unique Z-value * to prevent Z-fighting (flickering/flashing). The Z-values are derived from * their position when grabbed to conserve original stacking. The formula encodes * 2D coordinates into a single value where X has higher weight, ensuring * deterministic visual stacking. * * @param hotSpotX The X coordinate of the grab position * @param hotSpotY The Y coordinate of the grab position * @return Unique Z-value for the child drag item */ [[nodiscard]] constexpr qreal childDragZValue(qreal hotSpotX, qreal hotSpotY) { return DRAG_ITEM_CHILD + hotSpotX * 1000000 + hotSpotY * 1000 + 1000; } /** * @brief Compute Z-value for cards on the table zone based on position. * * Cards lower on the table (higher Y) render above cards higher up, * and cards to the right (higher X) render above cards to the left. * This creates natural visual stacking for overlapping cards. * * @param x The X coordinate of the card position * @param y The Y coordinate of the card position * @return Z-value for the card's table position */ [[nodiscard]] constexpr qreal tableCardZValue(qreal x, qreal y) { return (y + CardDimensions::HEIGHT_F) * 100000.0 + (x + 1) * 100.0; } // Card layering (general architecture, not command-zone specific) constexpr qreal CARD_BASE = 1.0; constexpr qreal CARD_MAX = ZValueLayerManager::CARD_Z_VALUE_MAX; } // namespace ZValues #endif // Z_VALUES_H