JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
Loading...
Searching...
No Matches
hmi::GameViewport Class Reference

Widget de rendu (QRhiWidget) où la scène est dessinée, composé avec le reste de l'interface. More...

#include <GameViewport.h>

Inheritance diagram for hmi::GameViewport:
hmi::EditContextTarget

Signals

void statusMessage (const QString &message)
 Message d'état à afficher (enregistrement, essai, erreur de validation…).
void exitToMenuRequested ()
 Demande de retour au menu principal (fin de la séquence de niveaux – plus depuis LOT-59 TACHE-02 sur Échap en mode jeu, qui ouvre désormais la pause via pauseRequested).
void pauseRequested ()
 Échap (ou le bouton B manette) en mode jeu réel, hors pause : demande l'ouverture de l'écran de pause (LOT-59 TACHE-02, EX-GP-041) – jamais en essai depuis l'éditeur (stopPlaytest garde son propre chemin, inchangé).
void draftChanged ()
 Le brouillon vient d'être modifié (peinture, undo/redo, chargement, lien…) — le panneau « Liens » se resynchronise dessus (refresh).
void renderModeChanged (RenderMode mode)
 Le mode de rendu vient de basculer (F8) — la palette met ses vignettes à jour pour rester fidèle au canevas (EX-EDIT-027).
void toolChanged (hmi::EditorTool tool)
 L'outil actif vient de changer par un moyen autre que le panneau Outils (raccourci clavier, LOT-45) — le panneau se resynchronise sans reboucler.
void planeSelectionChanged (std::optional< std::size_t > index)
 La sélection de plan vient de changer par un moyen autre que le panneau (retrait, réordonnancement) — le panneau se resynchronise sans reboucler.
void hoveredCellChanged (std::optional< core::GridPosition > cell)
 La case survolée vient de changer (déplacement de souris, ou sortie du viewport) — consommé par la barre d'état (LOT-57 TACHE-01), qui évite ainsi un travail continu inutile en ne recalculant que sur changement réel.
void zoomChanged (float zoom)
 Le zoom d'édition vient de changer (molette, pan, recadrage) — consommé par la barre d'état (LOT-57 TACHE-01).
void resourcesReady ()
 Les ressources graphiques et le catalogue de skins viennent d'être (re)créés (QRhiWidget::initialize) — tout ce qui a lu skinCatalog() avant la première initialisation (le câblage de MainWindow, à la construction) l'a lu vide et doit se reconstruire une fois ce signal reçu, sous peine de vignettes/arbre de skins sans texture au lancement de l'éditeur.

Public Member Functions

 GameViewport (QWidget *parent=nullptr)
 ~GameViewport () override
 GameViewport (const GameViewport &)=delete
GameViewportoperator= (const GameViewport &)=delete
void setActiveTile (core::TileType type) noexcept
 Définit le type de tuile peint au clic (relié à la sélection de la palette).
void setActiveTextureAsset (std::optional< std::string > asset) noexcept
 Définit l'asset assigné au clic par l'outil « Texture par instance » (LOT-45), relié à la sélection de la bibliothèque « Objets » ; vide si aucun asset n'est sélectionné.
void setTool (hmi::EditorTool tool)
 Définit l'outil d'édition actif (pinceau, rectangle, sélection, lien, texture par instance).
void setLocalization (const Localization *loc) noexcept
 Fournit le catalogue de traduction (les messages d'état émis sont alors localisés).
void setAudioEngine (AudioEngine *engine) noexcept
 Fournit le moteur audio (LOT-60 TACHE-03) : les événements de jeu détectés par hmi::GameSession (saut, atterrissage, dash, mécanismes, mort, victoire) déclenchent alors un son.
hmi::GameKeyBindingsgameBindings () noexcept
 Accès modifiable aux touches de jeu (pour le remappage) : la session de jeu lit ces mêmes bindings, donc un changement s'applique immédiatement.
hmi::GamepadBindingsgamepadBindings () noexcept
 Accès modifiable aux boutons manette (pour le remappage), même principe que gameBindings.
hmi::EditorKeyBindingseditorBindings () noexcept
 Accès modifiable aux touches d'éditeur (pour le remappage, LOT-57 TACHE-04), même principe que gameBindings.
void save ()
 Enregistre le brouillon (Ctrl+S) : valide (LevelDraft::toLevel) puis écrit le fichier ; un brouillon invalide n'écrit rien et rapporte l'erreur (statusMessage).
void openLevel (const std::filesystem::path &path)
 Ouvre un fichier de niveau comme brouillon d'édition (remplace le brouillon courant).
bool isDirty () const noexcept
bool renameOpenLevel (const std::string &newName)
 Renomme le niveau ouvert (action Rename, F2, LOT-57 TACHE-04).
void startPlaytest ()
 Lance l'essai immédiat (P) sur un brouillon valide ; message d'erreur sinon.
void undo () override
 Annule la dernière modification du brouillon (Ctrl+Z) ; sans effet si rien à annuler.
void redo () override
 Refait la dernière modification annulée (Ctrl+Y) ; sans effet si rien à refaire.
bool canUndo () const override
bool canRedo () const override
void copy () override
 Copie la sélection courante dans le presse-papiers local (Ctrl+C, EditContextTarget).
void paste () override
 Colle le presse-papiers à la case survolée (Ctrl+V, EditContextTarget).
bool canCopy () const override
bool canPaste () const override
void toggleGrid () noexcept
 Bascule l'affichage de la grille de repère (F10).
void resetCamera () noexcept
 Réinitialise le cadrage manuel au cadrage automatique (touche 0).
void toggleRenderMode ()
 Bascule le mode de rendu Physique/Texture (F8, EX-REN-046) ; actif en édition, en essai et en jeu réel (LOT-56 TACHE-04 : seule commande jamais désactivée par le mode courant).
void toggleDiagnosticsOverlay () noexcept
 Bascule le compteur de diagnostic (cadence, primitives, passes, pas de simulation ; F9, LOT-62 TACHE-02, EX-NFR-001/EX-NFR-005).
bool diagnosticsOverlayEnabled () const noexcept
void setDiagnosticsOverlayEnabled (bool enabled) noexcept
 Affiche ou masque le compteur de diagnostic.
void startGame (std::filesystem::path map)
 Lance le jeu sur la carte map.
void pauseSimulation () noexcept
 Suspend la simulation (écran de pause, LOT-59 TACHE-02) : tick() cesse d'alimenter l'accumulateur de pas fixe – aucun pas n'est consommé pendant la pause (EX-GP-041).
void resumeSimulation ()
 Reprend la simulation après pauseSimulation() : réarme l'horloge de référence (_previousFrame) sur l'instant courant, faute de quoi le temps passé en pause serait rattrapé d'un coup au pas suivant (piège documenté par TACHE-02).
bool simulationPaused () const noexcept
void quitGame () noexcept
 Abandonne la partie en cours (« Quitter vers le menu » depuis la pause, LOT-59 TACHE-02, après confirmation côté appelant) : même nettoyage que l'ancienne sortie directe par Échap, désormais déclenchée par l'écran de pause plutôt que par la touche elle-même.
void setVSync (bool enabled) noexcept
 Active/désactive la synchronisation verticale (EX-REN-022).
bool vsyncEnabled () const noexcept
void resizeLevel (int width, int height)
 Redimensionne le niveau en cours d'édition (EX-EDIT-005).
bool wouldResizeDrop (int width, int height) const
int levelWidth () const
int levelHeight () const
const core::LevelDraftdraft () const noexcept
std::optional< std::size_t > selectedPlaneIndex () const noexcept
const PlaneVisibilityplaneVisibility () const noexcept
std::optional< core::GridPositionhoveredCell () const noexcept
float zoom () const noexcept
EditorTool activeTool () const noexcept
void setHighlightedLink (std::optional< std::pair< core::GridPosition, core::GridPosition > > link)
 Met en surbrillance la liaison (déclencheur, cible) dans le viewport (sélection depuis le panneau « Liens ») ; n'affecte que le rendu, pas le brouillon.
void unlinkMechanism (core::GridPosition targetPosition)
 Supprime la liaison dont la cible est targetPosition (bouton « Supprimer » du panneau « Liens ») ; sans effet si targetPosition n'a pas de liaison.
void removeTextureOverride (core::GridPosition position)
 Retire l'override de texture de position (bouton « Retirer » de la section « Objets », LOT-45) ; sans effet si position n'en a pas.
void setHighlightedTextureOverride (std::optional< core::GridPosition > position)
 Met en surbrillance une case portant un override (sélection depuis la section « Objets », LOT-45) ; n'affecte que le rendu, pas le brouillon.
void setLevelBackground (std::optional< std::string > background)
 Assigne l'asset de fond du niveau courant (section « Fond », LOT-44).
void setLevelSkinSet (std::optional< std::string > skinSet)
 Assigne le jeu de skins du niveau courant (section « Fond », LOT-44).
void setLevelCameraFraming (core::CameraFramingConfig cameraFraming)
 Change le cadrage de caméra du niveau courant (section « Cadrage », EX-EDIT-028, LOT-64).
void removeCameraZone (std::size_t index)
 Retire la zone de caméra au rang index (section « Cadrage », EX-LVL-007, EX-EDIT-029) ; sans effet si hors bornes.
RenderMode renderMode () const noexcept
const LayerVisibilitylayerVisibility () const noexcept
 Jeu de visibilités par calque du mode d'inspection « définition des textures » (LOT-51, EX-EDIT-044) — édition uniquement, jamais lu par hmi::GameSession.
void setLayerVisible (RenderLayer layer, bool visible) noexcept
 Affiche ou masque un calque du mode d'inspection (section « Calques » du panneau « Textures », LOT-51).
void showAllLayers () noexcept
 Rétablit la visibilité de tous les calques (action « tout afficher », TACHE-03).
SkinCatalogskinCatalog () noexcept
 Catalogue des jeux de skins, édité par le panneau « Textures » (LOT-42).
void setSkinSet (const std::string &setName)
 Désigne le jeu de skins à utiliser pour le rendu (LOT-42).
void reloadAssets ()
 Rechargement à chaud global des assets graphiques (LOT-43 TACHE-03).
void invalidateAsset (const std::string &fileName)
 Rechargement à chaud ciblé d'un seul asset (LOT-43 TACHE-03).
void setRenderMode (RenderMode mode)
 Choisit le mode de rendu et persiste le choix (EX-REN-046, EX-IHM-011).
Plans picturaux (<tt>EX-EDIT-047</tt>, LOT-69 TACHE-08)

Tous ces mutateurs passent par core::LevelDraft, seul propriétaire : ils sont donc annulables au même titre qu'un coup de pinceau sur les tuiles.

La visibilité, elle, n'est pas une propriété du niveau : elle n'empile rien et ne se persiste pas.

void selectPlane (std::optional< std::size_t > index)
 Sélectionne (ou désélectionne) un plan depuis le panneau.
void addPlane (core::Plane plane)
 Ajoute plane à la fin de la liste et le sélectionne.
void removePlane (std::size_t index)
 Retire l'entrée du plan index.
void movePlane (std::size_t index, bool forward)
 Déplace le plan index d'un rang ; forward le rapproche du dessus de la liste.
void setPlaneDepth (std::size_t index, core::PlaneDepth depth)
 Change la profondeur du plan index.
void setPlaneDensity (std::size_t index, int pixelsPerUnit)
 Change la densité déclarée du plan index (le rééchantillonnage de l'image est fait par l'appelant, qui possède le fichier).
void setPlaneParallax (std::size_t index, float parallaxX, float parallaxY)
 Change les facteurs de parallaxe du plan index.
void setPlaneOpacity (std::size_t index, float opacity)
 Change l'opacité du plan index.
void setLevelParallaxEnabled (bool enabled)
 Change le drapeau de parallaxe du niveau.
void setPlaneVisible (std::size_t index, bool visible)
 Masque ou réaffiche le plan index (aide d'édition).
void setPlaneIsolated (std::size_t index, bool isolate)
 Isole le plan index, ou réaffiche tout si isolate est faux.
Public Member Functions inherited from hmi::EditContextTarget
virtual ~EditContextTarget ()=default

Protected Member Functions

void initialize (QRhiCommandBuffer *commandBuffer) override
 Crée (ou recrée) les ressources graphiques quand QRhiWidget fournit son interface de rendu, et à chaque fois qu'il en change (EX-NFR-040 : perte de ressources prévue, pas supposée impossible).
void render (QRhiCommandBuffer *commandBuffer) override
 Dessine une image : avance la simulation, compose la scène, puis la soumet.
void releaseResources () override
 Libère les ressources graphiques quand QRhiWidget défait son interface de rendu.
bool event (QEvent *event) override
void keyPressEvent (QKeyEvent *event) override
void keyReleaseEvent (QKeyEvent *event) override
void mousePressEvent (QMouseEvent *event) override
void mouseReleaseEvent (QMouseEvent *event) override
void mouseMoveEvent (QMouseEvent *event) override
void wheelEvent (QWheelEvent *event) override

Private Types

using Clock = std::chrono::steady_clock

Private Member Functions

void createResources ()
 Crée l'atlas, la police, le cache de textures et le pipeline de dessin sur l'interface de rendu courante, puis ouvre le brouillon de départ.
void tick (float elapsedSeconds)
 Avance la simulation d'une image (entrées, pas fixes, sons) — sans rien dessiner.
void renderFrame (QRhiCommandBuffer *commandBuffer, float deltaSeconds)
 Compose et soumet une image sur commandBuffer.
void renderDiagnosticsOverlay (int viewportWidth, int viewportHeight)
 Compose et soumet le compteur de diagnostic (LOT-62 TACHE-02), coin haut-droit de l'écran – sans effet si désactivé, hors session, ou avant que la localisation ne soit chargée (EX-NFR-040, coût nul quand éteint : rien n'est calculé au-delà du test d'entrée).
void stopPlaytest ()
 Termine l'essai et restitue l'éditeur (brouillon intact).
void loadGameMap ()
 Charge _gameMap et arme la session de jeu.
void updateMousePosition (const QMouseEvent *event)
void updateEditCamera ()
 Recale la caméra d'édition : cadrage automatique sur le niveau entier, sauf pan/zoom manuel actif (molette/glisser bouton droit), auquel cas la caméra manuelle est réappliquée.
core::Vector2 screenPosition (const QMouseEvent *event) const
 Position écran (pixels physiques) d'un événement souris, convertie par le ratio d'affichage — même conversion que updateMousePosition, réutilisée pour le pan manuel.
float minManualZoom () const
float maxManualZoom () const
std::optional< core::GridPositioncellAt (const QMouseEvent *event)
 Case de grille sous la position écran donnée (pixels physiques), si dans les bornes.
core::GridPosition clampedCell (const QMouseEvent *event)
 Case de grille sous event, bornée à la grille (jamais hors bornes) — pour les glissers rectangle/sélection dont le curseur peut dépasser légèrement les bords.
void paintAt (const QMouseEvent *event)
 Peint le type actif à la case sous event, si valide (invalide la scène rendue).
void applyRectangle (core::GridPosition a, core::GridPosition b)
 Remplit le rectangle (bornes a, b incluses) du type actif (outil Rectangle).
void addCameraZoneFromDrag (core::GridPosition a, core::GridPosition b)
 Ajoute une zone de caméra couvrant le rectangle (bornes a, b incluses, outil CameraZone, EX-LVL-007, EX-EDIT-029) au cadrage du niveau.
void copySelection ()
 Copie la zone sélectionnée dans le presse-papiers local (Ctrl+C).
void pasteClipboard ()
 Colle le presse-papiers à la case survolée (Ctrl+V).
std::optional< std::pair< core::GridPosition, core::GridPosition > > highlight () const
 Zone à mettre en surbrillance (glisser en cours, sinon sélection mémorisée), le cas échéant.
void handleLinkClick (const QMouseEvent *event)
 Résout le clic de l'outil Lien (hmi::resolveLinkClick) et l'applique (attente, liaison).
void handleTextureAssignClick (const QMouseEvent *event, bool rightClick)
 Résout le clic de l'outil « Texture par instance » (hmi::resolveTextureAssignClick) et l'applique (assignation/retrait) ; rightClick distingue le clic droit (retrait explicite).
core::Vector2 worldPositionAt (const QMouseEvent *event)
 Convertit la position écran d'un événement souris en position monde, non calée sur la grille (EX-DEC-001) — contrairement à cellAt/clampedCell, utilisées par les autres outils.
bool linkExists (core::GridPosition switchPosition, core::GridPosition targetPosition) const
void markDraftMutated ()
 Invalide le rendu du brouillon et notifie les panneaux dépendants (draftChanged) — à appeler après toute mutation de _draft (peinture, lien, undo/redo, chargement…).
int pixelWidth () const
int pixelHeight () const
QString statusText (const char *key) const
 Texte localisé d'une clé de statut (repli sur la clé si aucun catalogue).

Private Attributes

hmi::SceneResources _scene
 Lot de sprites, atlas, police, textures et skins — communs au viewport de l'éditeur et à l'élément Qt Quick du jeu (LOT-86).
std::unique_ptr< hmi::DraftRenderer_draftRenderer
std::string _skinSet
 Jeu de skins courant ; vide pour le jeu par défaut du catalogue.
hmi::GameKeyBindings _gameBindings
hmi::GamepadBindings _gamepadBindings
hmi::EditorKeyBindings _editorBindings
 Raccourcis d'éditeur remappables (LOT-45).
hmi::InputState _input
hmi::GamepadPoller _gamepad
core::FixedTimestep _timestep
Clock::time_point _previousFrame
bool _loopStarted = false
bool _diagnosticsEnabled = false
 Compteur de diagnostic (F9, LOT-62 TACHE-02) : désactivé par défaut (EX-NFR-040, point de départ sans effet visuel ni coût).
hmi::FrameRateAverage _frameRateAverage
 Moyenne glissante de la cadence de rendu, alimentée uniquement quand _diagnosticsEnabled est vrai (rien n'est calculé quand l'affichage est éteint).
int _lastSimulationSteps = 0
 Nombre de pas de simulation consommés au dernier tick() – distinct de la cadence de rendu depuis le LOT-33 (hmi::DiagnosticsMeasurements::simulationSteps).
hmi::ComposedScene _diagnosticsScene
 Scène dédiée du compteur de diagnostic, jamais partagée avec _session (dont le HUD de jeu vit dans sa propre scène) ni avec le brouillon d'édition – même isolement que le texte de hmi::GameSession::renderHud (LOT-52).
core::LevelDraft _draft
 Brouillon en cours d'édition (source de vérité).
hmi::Camera2D _camera
 Caméra d'édition (cadre le niveau entier par défaut).
bool _manualCamera = false
 true dès que la molette ou un glisser bouton droit a été utilisé : la caméra suit _manualZoom/_manualCenter plutôt que le cadrage automatique, jusqu'à la réinitialisation (0) ou l'ouverture d'un autre niveau.
float _manualZoom = 1.0f
 Zoom manuel courant, actif si _manualCamera.
core::Vector2 _manualCenter {}
 Centre manuel courant, actif si _manualCamera.
bool _rightDragging = false
 Un glisser bouton droit est en cours (pan potentiel).
bool _cameraPanned = false
 true dès qu'un glisser bouton droit a dépassé le seuil de mouvement : distingue un pan d'un simple clic droit (retrait d'override, outil « Texture par instance »).
core::Vector2 _rightDragLastScreen {}
 Dernière position écran du glisser droit en cours.
core::TileType _activeTile = core::TileType::Solid
 Type peint au clic (palette).
std::optional< std::string > _activeTextureAsset
 Asset assigné au clic par l'outil « Texture par instance » (LOT-45), vide si aucun n'est sélectionné dans la bibliothèque « Objets ».
std::optional< std::size_t > _selectedPlane
 Plan sélectionné dans le panneau « Plans » (LOT-69), si un l'est.
hmi::PlaneVisibility _planeVisibility
 Visibilité des plans dans l'éditeur : aide d'édition, jamais persistée ni annulable.
hmi::EditorTool _tool = hmi::EditorTool::Paint
 Outil d'édition actif (barre d'outils).
bool _painting = false
 Un glisser de peinture (Pinceau) est en cours.
bool _dragging = false
 Un glisser Rectangle/Sélection est en cours.
core::GridPosition _dragStart {}
 Case de départ du glisser Rectangle/Sélection.
core::GridPosition _dragCurrent {}
 Case courante du glisser (pour l'aperçu).
std::optional< core::GridPosition_hoverCell
 Case actuellement survolée (cible du collage) ; absente hors de la grille ou après que le curseur a quitté le viewport (LOT-57 TACHE-01, leaveEvent via event()).
float _lastEmittedZoom
 Dernier zoom notifié (zoomChanged), évite l'émission en boucle.
const Localization_loc = nullptr
 Sélection mémorisée (bornes min/max incluses), pour copier (Ctrl+C).
AudioEngine_audioEngine = nullptr
 Moteur audio (LOT-60 TACHE-03), non possédé ; nul = sons de jeu désactivés (EX-NFR-040).
std::optional< std::pair< core::GridPosition, core::GridPosition > > _selection
std::optional< core::GridPosition_pendingLink
 Case du déclencheur/de la cible en attente d'appariement (outil Lien, premier clic).
std::optional< std::pair< core::GridPosition, core::GridPosition > > _selectedLink
 Liaison sélectionnée dans le panneau « Liens » (déclencheur, cible) : mise en surbrillance.
std::optional< core::GridPosition_highlightedOverride
 Case sélectionnée dans la section « Objets » du panneau « Textures » (LOT-45) : mise en surbrillance, même voile que l'outil Rectangle/Sélection.
std::vector< std::vector< core::TileType > > _clipboard
 Presse-papiers local (types de tuiles, [ligne][colonne]), pour Ctrl+C/Ctrl+V.
bool _dirty = false
 Modifications non enregistrées (garde-fou d'ouverture).
bool _showGrid = true
 Grille de repère (cases + salles) affichée (bascule F10).
RenderMode _renderMode = DEFAULT_RENDER_MODE
 Mode de rendu courant (bascule F8, EX-REN-046), restauré des préférences au démarrage et réécrit à chaque bascule.
LayerVisibility _layerVisibility
 Jeu de visibilités par calque du mode d'inspection « définition des textures » (LOT-51) — tout visible par défaut, jamais persisté (TACHE-01), édition uniquement.
bool _vsync = true
 Synchronisation verticale demandée (cf. setVSyncEnabled).
bool _gameMode = false
 La session courante est une partie (menu Jouer) et non un essai depuis l'éditeur (enchaînement/retour menu).
bool _paused = false
 Écran de pause affiché (LOT-59 TACHE-02) : tick() n'avance plus l'accumulateur de pas fixe tant que c'est vrai – le rendu, lui, continue.
std::filesystem::path _gameMap
 Carte jouée par le mode jeu (LOT-67 : une, pas une séquence).
std::optional< hmi::GameSession_session
 Session de jeu de l'essai immédiat ; nulle en mode édition (essai ajouté au LOT-35 TACHE-04).

Detailed Description

Widget de rendu (QRhiWidget) où la scène est dessinée, composé avec le reste de l'interface.

Widget, et non fenêtre native, depuis le LOT-69 TACHE-02 (EX-REN-050). Règle tenue par ce choix : aucun recouvrement de l'IHM ne doit dépendre d'un empilement de fenêtres natives. QRhiWidget rend dans une texture d'appui composée avec les autres widgets, donc l'empilement est celui, ordinaire, de Qt : les recouvrements (pause, fin de niveau) sont de simples enfants, dont la visibilité et le focus suivent les règles habituelles des widgets.

La cible technique ne change pas : QRhi retient Direct3D 11 par défaut sous Windows (EX-REN-002, amendée — au travers de QRhi plutôt qu'en appelant l'API directement).

Mode édition (LOT-35) : affiche le brouillon (core::LevelDraft) via hmi::DraftRenderer, caméra cadrant le niveau entier par défaut. Le clic/glisser gauche peint le type de tuile actif (setActiveTile, fourni par la palette) à la case survolée (core::LevelDraft:: paintTile) ; Ctrl+Z/Ctrl+Y annulent/refont. La molette zoome manuellement (borné entre l'ajustement automatique et 4 cases visibles sur le plus petit axe) et le glisser bouton droit déplace la caméra (« pan ») ; 0 revient au cadrage automatique (LOT-15). Mode essai (LOT-35 TACHE-04) : une hmi::GameSession rejoue le niveau ; sa boucle à pas fixe (core::FixedTimestep) et ses entrées (Qt + XInput) reprennent la discipline du LOT-33.

Implémente hmi::EditContextTarget (LOT-57 TACHE-04) : c'est aujourd'hui l'unique cible d'Annuler/Refaire/Copier/Coller que MainWindow connaisse, au travers de cette interface plutôt que d'un appel direct — le seuil de dispatch que le futur atelier pixel art (LOT-54) réutilisera pour sa propre cible, sans le réécrire.

Member Typedef Documentation

◆ Clock

using hmi::GameViewport::Clock = std::chrono::steady_clock
private

Constructor & Destructor Documentation

◆ GameViewport() [1/2]

hmi::GameViewport::GameViewport ( QWidget * parent = nullptr)
explicit

◆ ~GameViewport()

hmi::GameViewport::~GameViewport ( )
overridedefault

◆ GameViewport() [2/2]

hmi::GameViewport::GameViewport ( const GameViewport & )
delete

Member Function Documentation

◆ activeTool()

EditorTool hmi::GameViewport::activeTool ( ) const
inlinenodiscardnoexcept
Returns
L'outil d'édition actif.

◆ addCameraZoneFromDrag()

void hmi::GameViewport::addCameraZoneFromDrag ( core::GridPosition a,
core::GridPosition b )
private

Ajoute une zone de caméra couvrant le rectangle (bornes a, b incluses, outil CameraZone, EX-LVL-007, EX-EDIT-029) au cadrage du niveau.

◆ addPlane()

void hmi::GameViewport::addPlane ( core::Plane plane)

Ajoute plane à la fin de la liste et le sélectionne.

◆ applyRectangle()

void hmi::GameViewport::applyRectangle ( core::GridPosition a,
core::GridPosition b )
private

Remplit le rectangle (bornes a, b incluses) du type actif (outil Rectangle).

◆ canCopy()

bool hmi::GameViewport::canCopy ( ) const
inlinenodiscardoverridevirtual
Returns
true si une sélection existe à copier (EditContextTarget).

Implements hmi::EditContextTarget.

◆ canPaste()

bool hmi::GameViewport::canPaste ( ) const
inlinenodiscardoverridevirtual
Returns
true si le presse-papiers local contient une zone à coller (EditContextTarget).

Implements hmi::EditContextTarget.

◆ canRedo()

bool hmi::GameViewport::canRedo ( ) const
inlinenodiscardoverridevirtual
Returns
true s'il existe une modification annulée à refaire (EditContextTarget).

Implements hmi::EditContextTarget.

◆ canUndo()

bool hmi::GameViewport::canUndo ( ) const
inlinenodiscardoverridevirtual
Returns
true s'il existe une modification à annuler (EditContextTarget).

Implements hmi::EditContextTarget.

◆ cellAt()

std::optional< core::GridPosition > hmi::GameViewport::cellAt ( const QMouseEvent * event)
nodiscardprivate

Case de grille sous la position écran donnée (pixels physiques), si dans les bornes.

◆ clampedCell()

core::GridPosition hmi::GameViewport::clampedCell ( const QMouseEvent * event)
nodiscardprivate

Case de grille sous event, bornée à la grille (jamais hors bornes) — pour les glissers rectangle/sélection dont le curseur peut dépasser légèrement les bords.

◆ copy()

void hmi::GameViewport::copy ( )
inlineoverridevirtual

Copie la sélection courante dans le presse-papiers local (Ctrl+C, EditContextTarget).

Implements hmi::EditContextTarget.

◆ copySelection()

void hmi::GameViewport::copySelection ( )
private

Copie la zone sélectionnée dans le presse-papiers local (Ctrl+C).

◆ createResources()

void hmi::GameViewport::createResources ( )
private

Crée l'atlas, la police, le cache de textures et le pipeline de dessin sur l'interface de rendu courante, puis ouvre le brouillon de départ.

Appelée par initialize.

◆ diagnosticsOverlayEnabled()

bool hmi::GameViewport::diagnosticsOverlayEnabled ( ) const
inlinenodiscardnoexcept
Returns
Le bilan du tableau en cours (LOT-68) : pas de simulation, morts, sauts. Remis à
true si le compteur de diagnostic est actuellement affiché.

◆ draft()

const core::LevelDraft & hmi::GameViewport::draft ( ) const
inlinenodiscardnoexcept
Returns
Le brouillon en cours d'édition (lecture seule) — consommé par le panneau « Liens ».

◆ draftChanged

void hmi::GameViewport::draftChanged ( )
signal

Le brouillon vient d'être modifié (peinture, undo/redo, chargement, lien…) — le panneau « Liens » se resynchronise dessus (refresh).

◆ editorBindings()

hmi::EditorKeyBindings & hmi::GameViewport::editorBindings ( )
inlinenodiscardnoexcept

Accès modifiable aux touches d'éditeur (pour le remappage, LOT-57 TACHE-04), même principe que gameBindings.

◆ event()

bool hmi::GameViewport::event ( QEvent * event)
overrideprotected

◆ exitToMenuRequested

void hmi::GameViewport::exitToMenuRequested ( )
signal

Demande de retour au menu principal (fin de la séquence de niveaux – plus depuis LOT-59 TACHE-02 sur Échap en mode jeu, qui ouvre désormais la pause via pauseRequested).

◆ gameBindings()

hmi::GameKeyBindings & hmi::GameViewport::gameBindings ( )
inlinenodiscardnoexcept

Accès modifiable aux touches de jeu (pour le remappage) : la session de jeu lit ces mêmes bindings, donc un changement s'applique immédiatement.

◆ gamepadBindings()

hmi::GamepadBindings & hmi::GameViewport::gamepadBindings ( )
inlinenodiscardnoexcept

Accès modifiable aux boutons manette (pour le remappage), même principe que gameBindings.

◆ handleLinkClick()

void hmi::GameViewport::handleLinkClick ( const QMouseEvent * event)
private

Résout le clic de l'outil Lien (hmi::resolveLinkClick) et l'applique (attente, liaison).

◆ handleTextureAssignClick()

void hmi::GameViewport::handleTextureAssignClick ( const QMouseEvent * event,
bool rightClick )
private

Résout le clic de l'outil « Texture par instance » (hmi::resolveTextureAssignClick) et l'applique (assignation/retrait) ; rightClick distingue le clic droit (retrait explicite).

◆ highlight()

std::optional< std::pair< core::GridPosition, core::GridPosition > > hmi::GameViewport::highlight ( ) const
nodiscardprivate

Zone à mettre en surbrillance (glisser en cours, sinon sélection mémorisée), le cas échéant.

◆ hoveredCell()

std::optional< core::GridPosition > hmi::GameViewport::hoveredCell ( ) const
inlinenodiscardnoexcept
Returns
La case actuellement survolée par le curseur, absente si hors de la grille ou si le curseur a quitté le viewport (LOT-57 TACHE-01, barre d'état).

◆ hoveredCellChanged

void hmi::GameViewport::hoveredCellChanged ( std::optional< core::GridPosition > cell)
signal

La case survolée vient de changer (déplacement de souris, ou sortie du viewport) — consommé par la barre d'état (LOT-57 TACHE-01), qui évite ainsi un travail continu inutile en ne recalculant que sur changement réel.

◆ initialize()

void hmi::GameViewport::initialize ( QRhiCommandBuffer * commandBuffer)
overrideprotected

Crée (ou recrée) les ressources graphiques quand QRhiWidget fournit son interface de rendu, et à chaque fois qu'il en change (EX-NFR-040 : perte de ressources prévue, pas supposée impossible).

◆ invalidateAsset()

void hmi::GameViewport::invalidateAsset ( const std::string & fileName)

Rechargement à chaud ciblé d'un seul asset (LOT-43 TACHE-03).

Évite de relire toute la bibliothèque à chaque sauvegarde — utilisé par l'atelier pixel art (LOT-54) après chaque enregistrement.

Parameters
fileNameNom logique de l'asset à invalider (relatif à Assets/).

◆ isDirty()

bool hmi::GameViewport::isDirty ( ) const
inlinenodiscardnoexcept
Returns
true si le brouillon a des modifications non enregistrées (garde-fou d'ouverture).

◆ keyPressEvent()

void hmi::GameViewport::keyPressEvent ( QKeyEvent * event)
overrideprotected

◆ keyReleaseEvent()

void hmi::GameViewport::keyReleaseEvent ( QKeyEvent * event)
overrideprotected

◆ layerVisibility()

const LayerVisibility & hmi::GameViewport::layerVisibility ( ) const
inlinenodiscardnoexcept

Jeu de visibilités par calque du mode d'inspection « définition des textures » (LOT-51, EX-EDIT-044) — édition uniquement, jamais lu par hmi::GameSession.

Returns
Le jeu de visibilités courant.

◆ levelHeight()

int hmi::GameViewport::levelHeight ( ) const
nodiscard

◆ levelWidth()

int hmi::GameViewport::levelWidth ( ) const
nodiscard
Returns
Dimensions courantes du niveau, en cases.

◆ linkExists()

bool hmi::GameViewport::linkExists ( core::GridPosition switchPosition,
core::GridPosition targetPosition ) const
nodiscardprivate
Returns
true si (switchPosition, targetPosition) est déjà une liaison du brouillon.

◆ loadGameMap()

void hmi::GameViewport::loadGameMap ( )
private

Charge _gameMap et arme la session de jeu.

◆ markDraftMutated()

void hmi::GameViewport::markDraftMutated ( )
private

Invalide le rendu du brouillon et notifie les panneaux dépendants (draftChanged) — à appeler après toute mutation de _draft (peinture, lien, undo/redo, chargement…).

◆ maxManualZoom()

float hmi::GameViewport::maxManualZoom ( ) const
nodiscardprivate
Returns
Le zoom manuel maximal autorisé : la valeur laissant encore 4 cases visibles sur le plus petit axe de l'écran (précision jugée suffisante pour poser un bloc).

◆ minManualZoom()

float hmi::GameViewport::minManualZoom ( ) const
nodiscardprivate
Returns
Le zoom manuel minimal autorisé : celui de l'ajustement automatique du brouillon courant (rien à voir de plus loin).

◆ mouseMoveEvent()

void hmi::GameViewport::mouseMoveEvent ( QMouseEvent * event)
overrideprotected

◆ mousePressEvent()

void hmi::GameViewport::mousePressEvent ( QMouseEvent * event)
overrideprotected

◆ mouseReleaseEvent()

void hmi::GameViewport::mouseReleaseEvent ( QMouseEvent * event)
overrideprotected

◆ movePlane()

void hmi::GameViewport::movePlane ( std::size_t index,
bool forward )

Déplace le plan index d'un rang ; forward le rapproche du dessus de la liste.

◆ openLevel()

void hmi::GameViewport::openLevel ( const std::filesystem::path & path)

Ouvre un fichier de niveau comme brouillon d'édition (remplace le brouillon courant).

◆ operator=()

GameViewport & hmi::GameViewport::operator= ( const GameViewport & )
delete

◆ paintAt()

void hmi::GameViewport::paintAt ( const QMouseEvent * event)
private

Peint le type actif à la case sous event, si valide (invalide la scène rendue).

◆ paste()

void hmi::GameViewport::paste ( )
inlineoverridevirtual

Colle le presse-papiers à la case survolée (Ctrl+V, EditContextTarget).

Implements hmi::EditContextTarget.

◆ pasteClipboard()

void hmi::GameViewport::pasteClipboard ( )
private

Colle le presse-papiers à la case survolée (Ctrl+V).

◆ pauseRequested

void hmi::GameViewport::pauseRequested ( )
signal

Échap (ou le bouton B manette) en mode jeu réel, hors pause : demande l'ouverture de l'écran de pause (LOT-59 TACHE-02, EX-GP-041) – jamais en essai depuis l'éditeur (stopPlaytest garde son propre chemin, inchangé).

◆ pauseSimulation()

void hmi::GameViewport::pauseSimulation ( )
noexcept

Suspend la simulation (écran de pause, LOT-59 TACHE-02) : tick() cesse d'alimenter l'accumulateur de pas fixe – aucun pas n'est consommé pendant la pause (EX-GP-041).

Le rendu continue (la scène reste dessinée derrière l'écran de pause).

◆ pixelHeight()

int hmi::GameViewport::pixelHeight ( ) const
nodiscardprivate

◆ pixelWidth()

int hmi::GameViewport::pixelWidth ( ) const
nodiscardprivate

◆ planeSelectionChanged

void hmi::GameViewport::planeSelectionChanged ( std::optional< std::size_t > index)
signal

La sélection de plan vient de changer par un moyen autre que le panneau (retrait, réordonnancement) — le panneau se resynchronise sans reboucler.

◆ planeVisibility()

const PlaneVisibility & hmi::GameViewport::planeVisibility ( ) const
inlinenodiscardnoexcept
Returns
La visibilité courante des plans (aide d'édition, jamais persistée).

◆ quitGame()

void hmi::GameViewport::quitGame ( )
noexcept

Abandonne la partie en cours (« Quitter vers le menu » depuis la pause, LOT-59 TACHE-02, après confirmation côté appelant) : même nettoyage que l'ancienne sortie directe par Échap, désormais déclenchée par l'écran de pause plutôt que par la touche elle-même.

◆ redo()

void hmi::GameViewport::redo ( )
overridevirtual

Refait la dernière modification annulée (Ctrl+Y) ; sans effet si rien à refaire.

Implements hmi::EditContextTarget.

◆ releaseResources()

void hmi::GameViewport::releaseResources ( )
overrideprotected

Libère les ressources graphiques quand QRhiWidget défait son interface de rendu.

◆ reloadAssets()

void hmi::GameViewport::reloadAssets ( )

Rechargement à chaud global des assets graphiques (LOT-43 TACHE-03).

Invalide tout le TextureCache et relit skins.json — un asset a pu être modifié, renommé ou ajouté hors de l'application. Ne touche ni au brouillon en cours d'édition ni à son historique d'annulation : c'est une opération de présentation, pas d'édition. L'apparence est résolue à la composition de chaque image (hmi::DraftRenderer), donc l'image suivante suffit à montrer le résultat — aucune reconstruction de scène nécessaire.

◆ removeCameraZone()

void hmi::GameViewport::removeCameraZone ( std::size_t index)

Retire la zone de caméra au rang index (section « Cadrage », EX-LVL-007, EX-EDIT-029) ; sans effet si hors bornes.

Parameters
indexRang dans core::LevelDraft::cameraFraming().zones.

◆ removePlane()

void hmi::GameViewport::removePlane ( std::size_t index)

Retire l'entrée du plan index.

Le fichier n'est pas supprimé : le brouillon annule l'entrée JSON, pas la disparition d'une image — un fichier orphelin est moins grave qu'un travail perdu.

◆ removeTextureOverride()

void hmi::GameViewport::removeTextureOverride ( core::GridPosition position)

Retire l'override de texture de position (bouton « Retirer » de la section « Objets », LOT-45) ; sans effet si position n'en a pas.

◆ renameOpenLevel()

bool hmi::GameViewport::renameOpenLevel ( const std::string & newName)

Renomme le niveau ouvert (action Rename, F2, LOT-57 TACHE-04).

Renomme le fichier existant sur disque (hmi::LevelFileOperations::rename, même chemin que LevelBrowserPanel::onRename) si le niveau a déjà été enregistré au moins une fois ; sinon, seul le nom du brouillon change (rien à renommer sur disque). Sans effet si newName est invalide (hmi::isValidLevelName) ou déjà pris par un autre fichier.

Parameters
newNameNouveau nom, tel que saisi (espaces de bord retirés avant validation).
Returns
true si le renommage a été appliqué.

◆ render()

void hmi::GameViewport::render ( QRhiCommandBuffer * commandBuffer)
overrideprotected

Dessine une image : avance la simulation, compose la scène, puis la soumet.

◆ renderDiagnosticsOverlay()

void hmi::GameViewport::renderDiagnosticsOverlay ( int viewportWidth,
int viewportHeight )
private

Compose et soumet le compteur de diagnostic (LOT-62 TACHE-02), coin haut-droit de l'écran – sans effet si désactivé, hors session, ou avant que la localisation ne soit chargée (EX-NFR-040, coût nul quand éteint : rien n'est calculé au-delà du test d'entrée).

◆ renderFrame()

void hmi::GameViewport::renderFrame ( QRhiCommandBuffer * commandBuffer,
float deltaSeconds )
private

Compose et soumet une image sur commandBuffer.

deltaSeconds : temps réel écoulé depuis l'image précédente (LOT-46 TACHE-05, avance l'aperçu des tuiles animées de l'éditeur).

◆ renderMode()

RenderMode hmi::GameViewport::renderMode ( ) const
inlinenodiscardnoexcept
Returns
Le mode de rendu courant, commun à l'édition, à l'essai et au jeu réel.

◆ renderModeChanged

void hmi::GameViewport::renderModeChanged ( RenderMode mode)
signal

Le mode de rendu vient de basculer (F8) — la palette met ses vignettes à jour pour rester fidèle au canevas (EX-EDIT-027).

◆ resetCamera()

void hmi::GameViewport::resetCamera ( )
noexcept

Réinitialise le cadrage manuel au cadrage automatique (touche 0).

◆ resizeLevel()

void hmi::GameViewport::resizeLevel ( int width,
int height )

Redimensionne le niveau en cours d'édition (EX-EDIT-005).

◆ resourcesReady

void hmi::GameViewport::resourcesReady ( )
signal

Les ressources graphiques et le catalogue de skins viennent d'être (re)créés (QRhiWidget::initialize) — tout ce qui a lu skinCatalog() avant la première initialisation (le câblage de MainWindow, à la construction) l'a lu vide et doit se reconstruire une fois ce signal reçu, sous peine de vignettes/arbre de skins sans texture au lancement de l'éditeur.

Émis à nouveau si QRhiWidget recrée son interface de rendu (le widget a changé de fenêtre de haut niveau) : les textures sont alors perdues avec elle.

◆ resumeSimulation()

void hmi::GameViewport::resumeSimulation ( )

Reprend la simulation après pauseSimulation() : réarme l'horloge de référence (_previousFrame) sur l'instant courant, faute de quoi le temps passé en pause serait rattrapé d'un coup au pas suivant (piège documenté par TACHE-02).

◆ save()

void hmi::GameViewport::save ( )

Enregistre le brouillon (Ctrl+S) : valide (LevelDraft::toLevel) puis écrit le fichier ; un brouillon invalide n'écrit rien et rapporte l'erreur (statusMessage).

◆ screenPosition()

core::Vector2 hmi::GameViewport::screenPosition ( const QMouseEvent * event) const
nodiscardprivate

Position écran (pixels physiques) d'un événement souris, convertie par le ratio d'affichage — même conversion que updateMousePosition, réutilisée pour le pan manuel.

◆ selectedPlaneIndex()

std::optional< std::size_t > hmi::GameViewport::selectedPlaneIndex ( ) const
inlinenodiscardnoexcept
Returns
Le plan pictural sélectionné dans le panneau « Plans » (LOT-69), si un l'est.

◆ selectPlane()

void hmi::GameViewport::selectPlane ( std::optional< std::size_t > index)

Sélectionne (ou désélectionne) un plan depuis le panneau.

◆ setActiveTextureAsset()

void hmi::GameViewport::setActiveTextureAsset ( std::optional< std::string > asset)
inlinenoexcept

Définit l'asset assigné au clic par l'outil « Texture par instance » (LOT-45), relié à la sélection de la bibliothèque « Objets » ; vide si aucun asset n'est sélectionné.

◆ setActiveTile()

void hmi::GameViewport::setActiveTile ( core::TileType type)
inlinenoexcept

Définit le type de tuile peint au clic (relié à la sélection de la palette).

◆ setAudioEngine()

void hmi::GameViewport::setAudioEngine ( AudioEngine * engine)
inlinenoexcept

Fournit le moteur audio (LOT-60 TACHE-03) : les événements de jeu détectés par hmi::GameSession (saut, atterrissage, dash, mécanismes, mort, victoire) déclenchent alors un son.

nullptr (défaut) désactive silencieusement les sons de jeu, sans plantage (EX-NFR-040) — état de démarrage légitime avant que MainWindow n'ait construit son moteur. Non possédé : l'appelant (MainWindow) reste propriétaire.

◆ setDiagnosticsOverlayEnabled()

void hmi::GameViewport::setDiagnosticsOverlayEnabled ( bool enabled)
noexcept

Affiche ou masque le compteur de diagnostic.

Même état que toggleDiagnosticsOverlay et que la touche F9un seul état, atteint par deux chemins (EX-IHM-062), et non deux réglages qui pourraient diverger.

◆ setHighlightedLink()

void hmi::GameViewport::setHighlightedLink ( std::optional< std::pair< core::GridPosition, core::GridPosition > > link)

Met en surbrillance la liaison (déclencheur, cible) dans le viewport (sélection depuis le panneau « Liens ») ; n'affecte que le rendu, pas le brouillon.

◆ setHighlightedTextureOverride()

void hmi::GameViewport::setHighlightedTextureOverride ( std::optional< core::GridPosition > position)

Met en surbrillance une case portant un override (sélection depuis la section « Objets », LOT-45) ; n'affecte que le rendu, pas le brouillon.

Réutilise le même voile que l'outil Rectangle/Sélection (case unique).

◆ setLayerVisible()

void hmi::GameViewport::setLayerVisible ( RenderLayer layer,
bool visible )
inlinenoexcept

Affiche ou masque un calque du mode d'inspection (section « Calques » du panneau « Textures », LOT-51).

Comme setRenderMode, purement visuel : la scène ECS n'est jamais invalidée, seule la résolution d'apparence de l'image suivante en tient compte. Aucune persistance entre deux sessions (TACHE-01) : contrairement à setRenderMode, rien n'est écrit dans les préférences.

◆ setLevelBackground()

void hmi::GameViewport::setLevelBackground ( std::optional< std::string > background)

Assigne l'asset de fond du niveau courant (section « Fond », LOT-44).

Parameters
backgroundNom du fichier .png dans Assets/Backgrounds, ou absent pour retirer le fond posé.

◆ setLevelCameraFraming()

void hmi::GameViewport::setLevelCameraFraming ( core::CameraFramingConfig cameraFraming)

Change le cadrage de caméra du niveau courant (section « Cadrage », EX-EDIT-028, LOT-64).

Parameters
cameraFramingNouveau cadrage résolu (mode et, pour par salle, taille de salle).

◆ setLevelParallaxEnabled()

void hmi::GameViewport::setLevelParallaxEnabled ( bool enabled)

Change le drapeau de parallaxe du niveau.

◆ setLevelSkinSet()

void hmi::GameViewport::setLevelSkinSet ( std::optional< std::string > skinSet)

Assigne le jeu de skins du niveau courant (section « Fond », LOT-44).

Propriété persistée du niveau (core::LevelDraft::skinSet) : distincte du jeu de skins courant d'édition (setSkinSet, session de l'éditeur, LOT-42) — les deux ne se contaminent jamais l'un l'autre.

Parameters
skinSetNom du jeu (skins.json), ou absent pour le jeu par défaut.

◆ setLocalization()

void hmi::GameViewport::setLocalization ( const Localization * loc)
inlinenoexcept

Fournit le catalogue de traduction (les messages d'état émis sont alors localisés).

◆ setPlaneDensity()

void hmi::GameViewport::setPlaneDensity ( std::size_t index,
int pixelsPerUnit )

Change la densité déclarée du plan index (le rééchantillonnage de l'image est fait par l'appelant, qui possède le fichier).

◆ setPlaneDepth()

void hmi::GameViewport::setPlaneDepth ( std::size_t index,
core::PlaneDepth depth )

Change la profondeur du plan index.

◆ setPlaneIsolated()

void hmi::GameViewport::setPlaneIsolated ( std::size_t index,
bool isolate )

Isole le plan index, ou réaffiche tout si isolate est faux.

◆ setPlaneOpacity()

void hmi::GameViewport::setPlaneOpacity ( std::size_t index,
float opacity )

Change l'opacité du plan index.

◆ setPlaneParallax()

void hmi::GameViewport::setPlaneParallax ( std::size_t index,
float parallaxX,
float parallaxY )

Change les facteurs de parallaxe du plan index.

◆ setPlaneVisible()

void hmi::GameViewport::setPlaneVisible ( std::size_t index,
bool visible )

Masque ou réaffiche le plan index (aide d'édition).

◆ setRenderMode()

void hmi::GameViewport::setRenderMode ( RenderMode mode)

Choisit le mode de rendu et persiste le choix (EX-REN-046, EX-IHM-011).

Purement visuel : ni la simulation, ni la scène ECS, ni le brouillon ne sont touchés — la bascule ne coûte donc pas un pas fixe ni un rechargement de niveau.

Parameters
modeMode à appliquer.

◆ setSkinSet()

void hmi::GameViewport::setSkinSet ( const std::string & setName)

Désigne le jeu de skins à utiliser pour le rendu (LOT-42).

Parameters
setNameNom du jeu ; vide pour le jeu par défaut du catalogue.

◆ setTool()

void hmi::GameViewport::setTool ( hmi::EditorTool tool)

Définit l'outil d'édition actif (pinceau, rectangle, sélection, lien, texture par instance).

Émet toolChanged si l'outil change réellement, pour que la barre d'outils reste synchronisée quand le changement vient d'ailleurs qu'un clic sur son panneau — le raccourci clavier de l'outil « Texture par instance » (LOT-45), aujourd'hui seul cas.

◆ setVSync()

void hmi::GameViewport::setVSync ( bool enabled)
noexcept

Active/désactive la synchronisation verticale (EX-REN-022).

Depuis le portage QRhi, la présentation appartient au compositeur de Qt : le réglage est conservé et rapporté, mais c'est Qt qui cale l'image sur le rafraîchissement.

◆ showAllLayers()

void hmi::GameViewport::showAllLayers ( )
inlinenoexcept

Rétablit la visibilité de tous les calques (action « tout afficher », TACHE-03).

◆ simulationPaused()

bool hmi::GameViewport::simulationPaused ( ) const
inlinenodiscardnoexcept
Returns
true si la simulation est actuellement suspendue (pauseSimulation).

◆ skinCatalog()

SkinCatalog & hmi::GameViewport::skinCatalog ( )
inlinenodiscardnoexcept

Catalogue des jeux de skins, édité par le panneau « Textures » (LOT-42).

Le viewport en reste propriétaire : le panneau agit dessus, et le rendu voit les mêmes assignations à l'image suivante, sans reconstruire la scène.

Returns
Le catalogue.

◆ startGame()

void hmi::GameViewport::startGame ( std::filesystem::path map)

Lance le jeu sur la carte map.

Échap ouvre la pause, dont « Quitter vers le menu » émet exitToMenuRequested.

Une carte, et non plus une séquence (LOT-67). Le jeu visé est un bac à sable : il n'a ni ordre de tableaux, ni tableau suivant. L'enchaînement d'une carte à l'autre reviendra avec le graphe de cartes du LOT-09, et il sera déclenché par une transition placée dans le monde, pas par la fin d'une liste.

◆ startPlaytest()

void hmi::GameViewport::startPlaytest ( )

Lance l'essai immédiat (P) sur un brouillon valide ; message d'erreur sinon.

◆ statusMessage

void hmi::GameViewport::statusMessage ( const QString & message)
signal

Message d'état à afficher (enregistrement, essai, erreur de validation…).

◆ statusText()

QString hmi::GameViewport::statusText ( const char * key) const
nodiscardprivate

Texte localisé d'une clé de statut (repli sur la clé si aucun catalogue).

◆ stopPlaytest()

void hmi::GameViewport::stopPlaytest ( )
private

Termine l'essai et restitue l'éditeur (brouillon intact).

◆ tick()

void hmi::GameViewport::tick ( float elapsedSeconds)
private

Avance la simulation d'une image (entrées, pas fixes, sons) — sans rien dessiner.

◆ toggleDiagnosticsOverlay()

void hmi::GameViewport::toggleDiagnosticsOverlay ( )
noexcept

Bascule le compteur de diagnostic (cadence, primitives, passes, pas de simulation ; F9, LOT-62 TACHE-02, EX-NFR-001/EX-NFR-005).

Touche dédiée non remappable, même statut que F8 (toggleRenderMode) : désactivé par défaut, sans effet sur la simulation (EX-ARCH-012). La fenêtre de mesure de cadence repart de zéro à chaque activation (hmi::FrameRateAverage::reset) plutôt que de mélanger un temps accumulé pendant que rien n'était mesuré.

◆ toggleGrid()

void hmi::GameViewport::toggleGrid ( )
noexcept

Bascule l'affichage de la grille de repère (F10).

◆ toggleRenderMode()

void hmi::GameViewport::toggleRenderMode ( )

Bascule le mode de rendu Physique/Texture (F8, EX-REN-046) ; actif en édition, en essai et en jeu réel (LOT-56 TACHE-04 : seule commande jamais désactivée par le mode courant).

◆ toolChanged

void hmi::GameViewport::toolChanged ( hmi::EditorTool tool)
signal

L'outil actif vient de changer par un moyen autre que le panneau Outils (raccourci clavier, LOT-45) — le panneau se resynchronise sans reboucler.

◆ undo()

void hmi::GameViewport::undo ( )
overridevirtual

Annule la dernière modification du brouillon (Ctrl+Z) ; sans effet si rien à annuler.

Implements hmi::EditContextTarget.

◆ unlinkMechanism()

void hmi::GameViewport::unlinkMechanism ( core::GridPosition targetPosition)

Supprime la liaison dont la cible est targetPosition (bouton « Supprimer » du panneau « Liens ») ; sans effet si targetPosition n'a pas de liaison.

◆ updateEditCamera()

void hmi::GameViewport::updateEditCamera ( )
private

Recale la caméra d'édition : cadrage automatique sur le niveau entier, sauf pan/zoom manuel actif (molette/glisser bouton droit), auquel cas la caméra manuelle est réappliquée.

◆ updateMousePosition()

void hmi::GameViewport::updateMousePosition ( const QMouseEvent * event)
private

◆ vsyncEnabled()

bool hmi::GameViewport::vsyncEnabled ( ) const
inlinenodiscardnoexcept
Returns
true si la V-Sync est active.

◆ wheelEvent()

void hmi::GameViewport::wheelEvent ( QWheelEvent * event)
overrideprotected

◆ worldPositionAt()

core::Vector2 hmi::GameViewport::worldPositionAt ( const QMouseEvent * event)
nodiscardprivate

Convertit la position écran d'un événement souris en position monde, non calée sur la grille (EX-DEC-001) — contrairement à cellAt/clampedCell, utilisées par les autres outils.

◆ wouldResizeDrop()

bool hmi::GameViewport::wouldResizeDrop ( int width,
int height ) const
nodiscard
Returns
true si redimensionner à (width, height) supprimerait du contenu posé.

◆ zoom()

float hmi::GameViewport::zoom ( ) const
inlinenodiscardnoexcept
Returns
Le facteur de zoom courant de la caméra d'édition (LOT-57 TACHE-01, barre d'état).

◆ zoomChanged

void hmi::GameViewport::zoomChanged ( float zoom)
signal

Le zoom d'édition vient de changer (molette, pan, recadrage) — consommé par la barre d'état (LOT-57 TACHE-01).

Member Data Documentation

◆ _activeTextureAsset

std::optional<std::string> hmi::GameViewport::_activeTextureAsset
private

Asset assigné au clic par l'outil « Texture par instance » (LOT-45), vide si aucun n'est sélectionné dans la bibliothèque « Objets ».

◆ _activeTile

core::TileType hmi::GameViewport::_activeTile = core::TileType::Solid
private

Type peint au clic (palette).

◆ _audioEngine

AudioEngine* hmi::GameViewport::_audioEngine = nullptr
private

Moteur audio (LOT-60 TACHE-03), non possédé ; nul = sons de jeu désactivés (EX-NFR-040).

◆ _camera

hmi::Camera2D hmi::GameViewport::_camera
private

Caméra d'édition (cadre le niveau entier par défaut).

◆ _cameraPanned

bool hmi::GameViewport::_cameraPanned = false
private

true dès qu'un glisser bouton droit a dépassé le seuil de mouvement : distingue un pan d'un simple clic droit (retrait d'override, outil « Texture par instance »).

◆ _clipboard

std::vector<std::vector<core::TileType> > hmi::GameViewport::_clipboard
private

Presse-papiers local (types de tuiles, [ligne][colonne]), pour Ctrl+C/Ctrl+V.

◆ _diagnosticsEnabled

bool hmi::GameViewport::_diagnosticsEnabled = false
private

Compteur de diagnostic (F9, LOT-62 TACHE-02) : désactivé par défaut (EX-NFR-040, point de départ sans effet visuel ni coût).

Bilan du tableau en cours (LOT-68) : alimenté au PAS, jamais à l'image de rendu.

◆ _diagnosticsScene

hmi::ComposedScene hmi::GameViewport::_diagnosticsScene
private

Scène dédiée du compteur de diagnostic, jamais partagée avec _session (dont le HUD de jeu vit dans sa propre scène) ni avec le brouillon d'édition – même isolement que le texte de hmi::GameSession::renderHud (LOT-52).

◆ _dirty

bool hmi::GameViewport::_dirty = false
private

Modifications non enregistrées (garde-fou d'ouverture).

◆ _draft

core::LevelDraft hmi::GameViewport::_draft
private

Brouillon en cours d'édition (source de vérité).

◆ _draftRenderer

std::unique_ptr<hmi::DraftRenderer> hmi::GameViewport::_draftRenderer
private

◆ _dragCurrent

core::GridPosition hmi::GameViewport::_dragCurrent {}
private

Case courante du glisser (pour l'aperçu).

◆ _dragging

bool hmi::GameViewport::_dragging = false
private

Un glisser Rectangle/Sélection est en cours.

◆ _dragStart

core::GridPosition hmi::GameViewport::_dragStart {}
private

Case de départ du glisser Rectangle/Sélection.

◆ _editorBindings

hmi::EditorKeyBindings hmi::GameViewport::_editorBindings
private

Raccourcis d'éditeur remappables (LOT-45).

◆ _frameRateAverage

hmi::FrameRateAverage hmi::GameViewport::_frameRateAverage
private

Moyenne glissante de la cadence de rendu, alimentée uniquement quand _diagnosticsEnabled est vrai (rien n'est calculé quand l'affichage est éteint).

◆ _gameBindings

hmi::GameKeyBindings hmi::GameViewport::_gameBindings
private

◆ _gameMap

std::filesystem::path hmi::GameViewport::_gameMap
private

Carte jouée par le mode jeu (LOT-67 : une, pas une séquence).

◆ _gameMode

bool hmi::GameViewport::_gameMode = false
private

La session courante est une partie (menu Jouer) et non un essai depuis l'éditeur (enchaînement/retour menu).

◆ _gamepad

hmi::GamepadPoller hmi::GameViewport::_gamepad
private

◆ _gamepadBindings

hmi::GamepadBindings hmi::GameViewport::_gamepadBindings
private

◆ _highlightedOverride

std::optional<core::GridPosition> hmi::GameViewport::_highlightedOverride
private

Case sélectionnée dans la section « Objets » du panneau « Textures » (LOT-45) : mise en surbrillance, même voile que l'outil Rectangle/Sélection.

◆ _hoverCell

std::optional<core::GridPosition> hmi::GameViewport::_hoverCell
private

Case actuellement survolée (cible du collage) ; absente hors de la grille ou après que le curseur a quitté le viewport (LOT-57 TACHE-01, leaveEvent via event()).

◆ _input

hmi::InputState hmi::GameViewport::_input
private

◆ _lastEmittedZoom

float hmi::GameViewport::_lastEmittedZoom
private
Initial value:
=
0.0f

Dernier zoom notifié (zoomChanged), évite l'émission en boucle.

◆ _lastSimulationSteps

int hmi::GameViewport::_lastSimulationSteps = 0
private

Nombre de pas de simulation consommés au dernier tick() – distinct de la cadence de rendu depuis le LOT-33 (hmi::DiagnosticsMeasurements::simulationSteps).

◆ _layerVisibility

LayerVisibility hmi::GameViewport::_layerVisibility
private

Jeu de visibilités par calque du mode d'inspection « définition des textures » (LOT-51) — tout visible par défaut, jamais persisté (TACHE-01), édition uniquement.

◆ _loc

const Localization* hmi::GameViewport::_loc = nullptr
private

Sélection mémorisée (bornes min/max incluses), pour copier (Ctrl+C).

Catalogue pour localiser les messages d'état.

◆ _loopStarted

bool hmi::GameViewport::_loopStarted = false
private

◆ _manualCamera

bool hmi::GameViewport::_manualCamera = false
private

true dès que la molette ou un glisser bouton droit a été utilisé : la caméra suit _manualZoom/_manualCenter plutôt que le cadrage automatique, jusqu'à la réinitialisation (0) ou l'ouverture d'un autre niveau.

Restaure le pan/zoom manuel de l'éditeur historique (EditorScreen, LOT-15), perdu lors de la réécriture Direct3D11/Qt.

◆ _manualCenter

core::Vector2 hmi::GameViewport::_manualCenter {}
private

Centre manuel courant, actif si _manualCamera.

◆ _manualZoom

float hmi::GameViewport::_manualZoom = 1.0f
private

Zoom manuel courant, actif si _manualCamera.

◆ _painting

bool hmi::GameViewport::_painting = false
private

Un glisser de peinture (Pinceau) est en cours.

◆ _paused

bool hmi::GameViewport::_paused = false
private

Écran de pause affiché (LOT-59 TACHE-02) : tick() n'avance plus l'accumulateur de pas fixe tant que c'est vrai – le rendu, lui, continue.

◆ _pendingLink

std::optional<core::GridPosition> hmi::GameViewport::_pendingLink
private

Case du déclencheur/de la cible en attente d'appariement (outil Lien, premier clic).

◆ _planeVisibility

hmi::PlaneVisibility hmi::GameViewport::_planeVisibility
private

Visibilité des plans dans l'éditeur : aide d'édition, jamais persistée ni annulable.

◆ _previousFrame

Clock::time_point hmi::GameViewport::_previousFrame
private

◆ _renderMode

RenderMode hmi::GameViewport::_renderMode = DEFAULT_RENDER_MODE
private

Mode de rendu courant (bascule F8, EX-REN-046), restauré des préférences au démarrage et réécrit à chaque bascule.

Porté par le viewport parce qu'il est le widget unique derrière l'édition, l'essai et le jeu réel (EX-IHM-002) : un seul état, jamais dupliqué.

◆ _rightDragging

bool hmi::GameViewport::_rightDragging = false
private

Un glisser bouton droit est en cours (pan potentiel).

◆ _rightDragLastScreen

core::Vector2 hmi::GameViewport::_rightDragLastScreen {}
private

Dernière position écran du glisser droit en cours.

◆ _scene

hmi::SceneResources hmi::GameViewport::_scene
private

Lot de sprites, atlas, police, textures et skins — communs au viewport de l'éditeur et à l'élément Qt Quick du jeu (LOT-86).

Regroupés parce que leur ORDRE de libération est une contrainte, pas une préférence : voir hmi::SceneResources.

◆ _selectedLink

std::optional<std::pair<core::GridPosition, core::GridPosition> > hmi::GameViewport::_selectedLink
private

Liaison sélectionnée dans le panneau « Liens » (déclencheur, cible) : mise en surbrillance.

◆ _selectedPlane

std::optional<std::size_t> hmi::GameViewport::_selectedPlane
private

Plan sélectionné dans le panneau « Plans » (LOT-69), si un l'est.

◆ _selection

std::optional<std::pair<core::GridPosition, core::GridPosition> > hmi::GameViewport::_selection
private

◆ _session

std::optional<hmi::GameSession> hmi::GameViewport::_session
private

Session de jeu de l'essai immédiat ; nulle en mode édition (essai ajouté au LOT-35 TACHE-04).

◆ _showGrid

bool hmi::GameViewport::_showGrid = true
private

Grille de repère (cases + salles) affichée (bascule F10).

◆ _skinSet

std::string hmi::GameViewport::_skinSet
private

Jeu de skins courant ; vide pour le jeu par défaut du catalogue.

◆ _timestep

core::FixedTimestep hmi::GameViewport::_timestep
private

◆ _tool

hmi::EditorTool hmi::GameViewport::_tool = hmi::EditorTool::Paint
private

Outil d'édition actif (barre d'outils).

◆ _vsync

bool hmi::GameViewport::_vsync = true
private

Synchronisation verticale demandée (cf. setVSyncEnabled).


The documentation for this class was generated from the following files:
  • /home/runner/work/JustAnotherDnDGame/JustAnotherDnDGame/Source/HMI/Game/GameViewport.h
  • /home/runner/work/JustAnotherDnDGame/JustAnotherDnDGame/Source/HMI/Game/GameViewport.cpp