Flint Engine
Modular C++20 2D game engine powered by SDL3
Loading...
Searching...
No Matches
primitives.h
1// SPDX-License-Identifier: MIT
2// SPDX-FileCopyrightText: 2025-2026 Manuel Osorio
3#pragma once
4#include "flint/graphics/drawable.h"
5#include "flint/graphics/renderer.h"
6#include "flint/graphics/types/color.h"
7#include "flint/graphics/types/primitive-types.h"
8#include "flint/math/types.h"
9
10#include <vector>
11
12namespace Flint {
13
22 class PrimitiveArray : public Drawable {
23 public:
24 PrimitiveArray() = default;
25
31 PrimitiveArray(PrimitiveType type)
32 : m_type(type) {
33 }
34
35 ~PrimitiveArray() override;
36
42 void setPrimitiveType(PrimitiveType type) {
43 m_type = type;
44 }
45
51 void init(SDL_GPUDevice *device) {
52 m_device = device;
53 }
54
62 void resize(std::size_t count) {
63 m_vertices.resize(count);
64 }
65
69 std::size_t size() const {
70 return m_vertices.size();
71 }
72
74 PrimitiveVertex &operator[](std::size_t i) {
75 return m_vertices[i];
76 }
77
79 const PrimitiveVertex &operator[](std::size_t i) const {
80 return m_vertices[i];
81 }
82
88 SDL_GPUPrimitiveType getSDLPrimitiveType() const;
89
94 void emit(RenderQueue &queue) const override;
95
101 const void *getTransformedData() const {
102 return m_transformedVerts.data();
103 }
104
108 size_t getTransformedSize() const {
109 return m_transformedVerts.size() * sizeof(GPULineVertex);
110 }
111
115 size_t getVertexCount() const {
116 return m_transformedVerts.size();
117 }
118
119 private:
123 struct GPULineVertex {
124 float pos[2];
125 float color[4];
126 };
127
128 PrimitiveType m_type;
129 std::vector<PrimitiveVertex> m_vertices;
130 SDL_GPUDevice *m_device = nullptr;
131
132 mutable std::vector<GPULineVertex> m_transformedVerts;
133
134 mutable SDL_GPUBuffer *m_vertexBuffer = nullptr;
135 mutable Uint32 m_vertexBufferSize = 0;
136 };
137}
Interface for objects that contribute ordered work to a rendered frame.
Definition drawable.h:21
void setPrimitiveType(PrimitiveType type)
Change the primitive topology.
Definition primitives.h:42
size_t getVertexCount() const
Return the number of transformed vertices ready for upload.
Definition primitives.h:115
const PrimitiveVertex & operator[](std::size_t i) const
Const element access.
Definition primitives.h:79
SDL_GPUPrimitiveType getSDLPrimitiveType() const
Map the engine PrimitiveType to the corresponding SDL GPU primitive type.
std::size_t size() const
Return the current number of vertices.
Definition primitives.h:69
PrimitiveArray(PrimitiveType type)
Construct a PrimitiveArray with the given topology.
Definition primitives.h:31
void emit(RenderQueue &queue) const override
Emit this drawable's rendering work for the current frame.
PrimitiveVertex & operator[](std::size_t i)
Non-const element access.
Definition primitives.h:74
void resize(std::size_t count)
Resize the vertex array to count entries.
Definition primitives.h:62
size_t getTransformedSize() const
Return the byte size of the transformed vertex buffer.
Definition primitives.h:108
void init(SDL_GPUDevice *device)
Associate a GPU device (required before draw() is called by the renderer).
Definition primitives.h:51
const void * getTransformedData() const
Return a pointer to the most recently transformed vertex data.
Definition primitives.h:101
A CPU-side collection of colored 2-D vertices that can be drawn as primitives.
Definition primitives.h:22
Batches drawables into sorted geometry, primitive, and custom execution passes for GPURenderer.
Internal vertex structure sent directly to line/point primitive shaders.
Public user-facing vertex representation for point and line primitives.