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

Dessine des quads texturés au travers de QRhi, avec transparence et échantillonnage nearest (pixel art). More...

#include <SpriteBatch.h>

Classes

struct  Vertex
 Sommet envoyé au GPU : position monde (x, y), UV, couleur RVBA. More...
struct  Batch
 Un lot enregistré : une texture, une projection, une plage contiguë de quads. More...

Public Member Functions

 SpriteBatch (QRhi *rhi)
 Construit le pipeline (shaders, tampons, échantillonneur) sur une interface QRhi.
 ~SpriteBatch ()
 SpriteBatch (const SpriteBatch &)=delete
SpriteBatchoperator= (const SpriteBatch &)=delete
QRhi * rhi () const noexcept
void beginFrame ()
 Ouvre l'enregistrement d'une image : vide les sommets et les lots de la précédente.
void begin (const DirectX::XMFLOAT4X4 &projection, TextureHandle texture)
 Démarre un lot : fixe la texture échantillonnée et la projection.
void draw (const SpriteQuad &quad)
 Ajoute un quad au lot courant.
void draw (const LineQuad &line)
 Ajoute un segment épais (orienté librement) au lot courant.
void end ()
 Termine le lot : fige la plage de quads enregistrée. Un lot vide n'émettra aucun dessin.
void submit (QRhiCommandBuffer *commandBuffer, QRhiRenderTarget *target, QRhiResourceUpdateBatch *updates, const float clear[4])
 Téléverse l'image enregistrée et l'émet en une passe de rendu.

Private Member Functions

bool ensurePipeline (QRhiRenderTarget *target)
 Crée (ou recrée) le pipeline pour la passe de rendu donnée. Idempotent.
bool ensureVertexCapacity (std::size_t quadCount)
 Redimensionne le tampon de sommets si l'image enregistrée n'y tient pas.
bool ensureUniformCapacity (std::size_t batchCount)
 Redimensionne le tampon uniforme pour batchCount emplacements de projection.
QRhiShaderResourceBindings * bindingsFor (QRhiTexture *texture)
void closeBatch ()
 Ferme le lot en cours d'enregistrement, s'il y en a un.

Private Attributes

QRhi * _rhi
std::unique_ptr< QRhiBuffer > _vertexBuffer
std::unique_ptr< QRhiBuffer > _indexBuffer
std::unique_ptr< QRhiBuffer > _uniformBuffer
std::unique_ptr< QRhiSampler > _sampler
std::unique_ptr< QRhiGraphicsPipeline > _pipeline
QRhiRenderPassDescriptor * _pipelinePass = nullptr
 Descripteur de la passe pour laquelle _pipeline a été construit : un changement de cible (redimensionnement du widget, changement de fenêtre) impose de le reconstruire.
std::unordered_map< QRhiTexture *, std::unique_ptr< QRhiShaderResourceBindings > > _bindings
 Liaisons par texture, gardées d'une image à l'autre : les recréer à chaque lot allouerait des ressources GPU des centaines de fois par seconde.
std::unique_ptr< QRhiShaderResourceBindings > _layoutBindings
 Liaisons de référence, construites une fois : QRhi exige que toutes les liaisons employées par un pipeline soient layout-compatibles avec celles fournies à sa création.
QRhiResourceUpdateBatch * _pendingIndexUpload = nullptr
 Téléversement du tampon d'indices, en attente de la première image : un tampon immuable se remplit une seule fois, et son lot ne peut être soumis qu'avec une image.
std::size_t _uniformSlots = 0
 Capacité du tampon uniforme, en nombre d'emplacements de projection.
int _uniformStride = 0
 Taille alignée d'un bloc de projection, imposée par le matériel.
std::vector< Vertex_vertices
std::vector< Batch_batches
Batch _current {}
 Lot en cours d'enregistrement (entre begin() et end()), s'il y en a un.
bool _recording = false
std::vector< DirectX::XMFLOAT4X4 > _projections
 Projections des lots, dans l'ordre d'enregistrement (téléversées d'un bloc au submit).

Static Private Attributes

static constexpr std::size_t MAXIMUM_QUADS = 65536 / 4
 Nombre de quads couverts par le tampon d'indices, et donc par un seul appel de dessin.

Detailed Description

Dessine des quads texturés au travers de QRhi, avec transparence et échantillonnage nearest (pixel art).

Usage inchangé pour les appelants : begin(projection, texture), un ou plusieurs draw(quad), puis end(). Ce qui change est quand le GPU voit ces quads.

Deux phases, contrairement à la version Direct3D 11. QRhi interdit de téléverser un tampon pendant une passe de rendu : impossible donc de réécrire le tampon de sommets entre deux drawIndexed, comme le faisait Map(WRITE_DISCARD). La classe enregistre donc toute l'image côté CPU — sommets accumulés bout à bout, plus une liste de lots (texture, projection, plage de quads) — et n'émet quoi que ce soit qu'au submit() final : un téléversement unique, puis une passe contenant un appel de dessin par lot. Le découpage en lots, et donc le nombre d'appels, est strictement le même qu'avant : c'est hmi::ComposedScene qui le décide, pas ce fichier.

La projection est portée par lot et non par image : le HUD (EX-REN-047) se dessine en coordonnées écran dans la même image que le monde. Elle transite par un tampon uniforme adressé à décalage dynamique, un emplacement par lot.

Constructor & Destructor Documentation

◆ SpriteBatch() [1/2]

hmi::SpriteBatch::SpriteBatch ( QRhi * rhi)
explicit

Construit le pipeline (shaders, tampons, échantillonneur) sur une interface QRhi.

Parameters
rhiInterface de rendu, non possédée ; doit survivre à l'objet.

◆ ~SpriteBatch()

hmi::SpriteBatch::~SpriteBatch ( )
default

◆ SpriteBatch() [2/2]

hmi::SpriteBatch::SpriteBatch ( const SpriteBatch & )
delete

Member Function Documentation

◆ begin()

void hmi::SpriteBatch::begin ( const DirectX::XMFLOAT4X4 & projection,
TextureHandle texture )

Démarre un lot : fixe la texture échantillonnée et la projection.

Parameters
projectionMatrice de projection monde → clip (fournie par la caméra).
textureTexture à échantillonner (identité opaque, hmi::TextureHandle), non possédée ; nullptr rend le lot muet.

◆ beginFrame()

void hmi::SpriteBatch::beginFrame ( )

Ouvre l'enregistrement d'une image : vide les sommets et les lots de la précédente.

◆ bindingsFor()

QRhiShaderResourceBindings * hmi::SpriteBatch::bindingsFor ( QRhiTexture * texture)
private
Returns
Les liaisons de ressources associées à texture, créées à la première rencontre.

◆ closeBatch()

void hmi::SpriteBatch::closeBatch ( )
private

Ferme le lot en cours d'enregistrement, s'il y en a un.

◆ draw() [1/2]

void hmi::SpriteBatch::draw ( const LineQuad & line)

Ajoute un segment épais (orienté librement) au lot courant.

Parameters
lineSegment à dessiner (unités monde, UV normalisées, teinte). Sans effet si les deux extrémités coïncident (segment dégénéré).

◆ draw() [2/2]

void hmi::SpriteBatch::draw ( const SpriteQuad & quad)

Ajoute un quad au lot courant.

Parameters
quadQuad à dessiner (unités monde, UV normalisées, teinte).

◆ end()

void hmi::SpriteBatch::end ( )

Termine le lot : fige la plage de quads enregistrée. Un lot vide n'émettra aucun dessin.

◆ ensurePipeline()

bool hmi::SpriteBatch::ensurePipeline ( QRhiRenderTarget * target)
private

Crée (ou recrée) le pipeline pour la passe de rendu donnée. Idempotent.

◆ ensureUniformCapacity()

bool hmi::SpriteBatch::ensureUniformCapacity ( std::size_t batchCount)
private

Redimensionne le tampon uniforme pour batchCount emplacements de projection.

◆ ensureVertexCapacity()

bool hmi::SpriteBatch::ensureVertexCapacity ( std::size_t quadCount)
private

Redimensionne le tampon de sommets si l'image enregistrée n'y tient pas.

◆ operator=()

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

◆ rhi()

QRhi * hmi::SpriteBatch::rhi ( ) const
inlinenodiscardnoexcept
Returns
L'interface de rendu servie par cette instance (comparaison de perte de contexte).

◆ submit()

void hmi::SpriteBatch::submit ( QRhiCommandBuffer * commandBuffer,
QRhiRenderTarget * target,
QRhiResourceUpdateBatch * updates,
const float clear[4] )

Téléverse l'image enregistrée et l'émet en une passe de rendu.

À appeler une fois par image, hors de toute passe ouverte : la méthode ouvre et referme la sienne. Le fond est effacé à clear, y compris si aucun lot n'a été enregistré — sans quoi une image sans contenu afficherait le résidu de la précédente.

Parameters
commandBufferTampon de commandes de l'image (fourni par QRhiWidget::render).
targetCible de rendu de l'image.
updatesLot de mises à jour à soumettre avec les sommets (téléversements de textures accumulés pendant la composition) ; peut être nullptr.
clearCouleur d'effacement, composantes [0, 1].

Member Data Documentation

◆ _batches

std::vector<Batch> hmi::SpriteBatch::_batches
private

◆ _bindings

std::unordered_map<QRhiTexture*, std::unique_ptr<QRhiShaderResourceBindings> > hmi::SpriteBatch::_bindings
private

Liaisons par texture, gardées d'une image à l'autre : les recréer à chaque lot allouerait des ressources GPU des centaines de fois par seconde.

◆ _current

Batch hmi::SpriteBatch::_current {}
private

Lot en cours d'enregistrement (entre begin() et end()), s'il y en a un.

◆ _indexBuffer

std::unique_ptr<QRhiBuffer> hmi::SpriteBatch::_indexBuffer
private

◆ _layoutBindings

std::unique_ptr<QRhiShaderResourceBindings> hmi::SpriteBatch::_layoutBindings
private

Liaisons de référence, construites une fois : QRhi exige que toutes les liaisons employées par un pipeline soient layout-compatibles avec celles fournies à sa création.

◆ _pendingIndexUpload

QRhiResourceUpdateBatch* hmi::SpriteBatch::_pendingIndexUpload = nullptr
private

Téléversement du tampon d'indices, en attente de la première image : un tampon immuable se remplit une seule fois, et son lot ne peut être soumis qu'avec une image.

◆ _pipeline

std::unique_ptr<QRhiGraphicsPipeline> hmi::SpriteBatch::_pipeline
private

◆ _pipelinePass

QRhiRenderPassDescriptor* hmi::SpriteBatch::_pipelinePass = nullptr
private

Descripteur de la passe pour laquelle _pipeline a été construit : un changement de cible (redimensionnement du widget, changement de fenêtre) impose de le reconstruire.

◆ _projections

std::vector<DirectX::XMFLOAT4X4> hmi::SpriteBatch::_projections
private

Projections des lots, dans l'ordre d'enregistrement (téléversées d'un bloc au submit).

◆ _recording

bool hmi::SpriteBatch::_recording = false
private

◆ _rhi

QRhi* hmi::SpriteBatch::_rhi
private

◆ _sampler

std::unique_ptr<QRhiSampler> hmi::SpriteBatch::_sampler
private

◆ _uniformBuffer

std::unique_ptr<QRhiBuffer> hmi::SpriteBatch::_uniformBuffer
private

◆ _uniformSlots

std::size_t hmi::SpriteBatch::_uniformSlots = 0
private

Capacité du tampon uniforme, en nombre d'emplacements de projection.

◆ _uniformStride

int hmi::SpriteBatch::_uniformStride = 0
private

Taille alignée d'un bloc de projection, imposée par le matériel.

◆ _vertexBuffer

std::unique_ptr<QRhiBuffer> hmi::SpriteBatch::_vertexBuffer
private

◆ _vertices

std::vector<Vertex> hmi::SpriteBatch::_vertices
private

◆ MAXIMUM_QUADS

std::size_t hmi::SpriteBatch::MAXIMUM_QUADS = 65536 / 4
staticconstexprprivate

Nombre de quads couverts par le tampon d'indices, et donc par un seul appel de dessin.


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