|
JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
|
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 | |
| SpriteBatch & | operator= (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. | |
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.
|
explicit |
Construit le pipeline (shaders, tampons, échantillonneur) sur une interface QRhi.
| rhi | Interface de rendu, non possédée ; doit survivre à l'objet. |
|
default |
|
delete |
| void hmi::SpriteBatch::begin | ( | const DirectX::XMFLOAT4X4 & | projection, |
| TextureHandle | texture ) |
Démarre un lot : fixe la texture échantillonnée et la projection.
| projection | Matrice de projection monde → clip (fournie par la caméra). |
| texture | Texture à échantillonner (identité opaque, hmi::TextureHandle), non possédée ; nullptr rend le lot muet. |
| void hmi::SpriteBatch::beginFrame | ( | ) |
Ouvre l'enregistrement d'une image : vide les sommets et les lots de la précédente.
|
private |
texture, créées à la première rencontre.
|
private |
Ferme le lot en cours d'enregistrement, s'il y en a un.
| void hmi::SpriteBatch::draw | ( | const LineQuad & | line | ) |
Ajoute un segment épais (orienté librement) au lot courant.
| line | Segment à dessiner (unités monde, UV normalisées, teinte). Sans effet si les deux extrémités coïncident (segment dégénéré). |
| void hmi::SpriteBatch::draw | ( | const SpriteQuad & | quad | ) |
Ajoute un quad au lot courant.
| quad | Quad à dessiner (unités monde, UV normalisées, teinte). |
| void hmi::SpriteBatch::end | ( | ) |
Termine le lot : fige la plage de quads enregistrée. Un lot vide n'émettra aucun dessin.
|
private |
Crée (ou recrée) le pipeline pour la passe de rendu donnée. Idempotent.
|
private |
Redimensionne le tampon uniforme pour batchCount emplacements de projection.
|
private |
Redimensionne le tampon de sommets si l'image enregistrée n'y tient pas.
|
delete |
|
inlinenodiscardnoexcept |
| 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.
| commandBuffer | Tampon de commandes de l'image (fourni par QRhiWidget::render). |
| target | Cible de rendu de l'image. |
| updates | Lot de mises à jour à soumettre avec les sommets (téléversements de textures accumulés pendant la composition) ; peut être nullptr. |
| clear | Couleur d'effacement, composantes [0, 1]. |
|
private |
|
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.
|
private |
|
private |
|
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.
|
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.
|
private |
|
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.
|
private |
Projections des lots, dans l'ordre d'enregistrement (téléversées d'un bloc au submit).
|
private |
|
private |
|
private |
|
private |
|
private |
Capacité du tampon uniforme, en nombre d'emplacements de projection.
|
private |
Taille alignée d'un bloc de projection, imposée par le matériel.
|
private |
|
private |
|
staticconstexprprivate |
Nombre de quads couverts par le tampon d'indices, et donc par un seul appel de dessin.