19
19
20
20
namespace Siege
21
21
{
22
+ Renderer2D::~Renderer2D ()
23
+ {
24
+ for (auto it = perFrameQuadVertexBuffers.CreateFIterator (); it; ++it) it->Free ();
25
+ for (auto it = perFrameTextVertexBuffers.CreateFIterator (); it; ++it) it->Free ();
26
+ }
27
+
22
28
void Renderer2D::Initialise (const char * const globalDataName)
23
29
{
24
30
globalDataId = INTERN_STR (globalDataName);
@@ -78,9 +84,24 @@ void Renderer2D::Initialise(const char* const globalDataName)
78
84
79
85
quadIndexBuffer = Vulkan::IndexBuffer (fontIndices, sizeof (unsigned int ) * 6 );
80
86
81
- quadVertexBuffer = Vulkan::VertexBuffer (sizeof (QuadVertex) * QUAD_VERTEX_BUFFER_SIZE);
82
- quadVBuffer = Vulkan::VertexBuffer (sizeof (QuadVertex) * QUAD_VERTEX_BUFFER_SIZE);
83
- textVertexBuffer = Vulkan::VertexBuffer (sizeof (FontVertex) * TEXT_VERTEX_BUFFER_SIZE);
87
+ perFrameQuadVertexBuffers =
88
+ MHArray<Vulkan::VertexBuffer>(Vulkan::Swapchain::MAX_FRAMES_IN_FLIGHT);
89
+
90
+ for (size_t i = 0 ; i < Vulkan::Swapchain::MAX_FRAMES_IN_FLIGHT; i++)
91
+ {
92
+ perFrameQuadVertexBuffers[i] =
93
+ Vulkan::VertexBuffer (sizeof (QuadVertex) * QUAD_VERTEX_BUFFER_SIZE);
94
+ }
95
+
96
+ perFrameTextVertexBuffers =
97
+ MHArray<Vulkan::VertexBuffer>(Vulkan::Swapchain::MAX_FRAMES_IN_FLIGHT);
98
+
99
+ for (size_t i = 0 ; i < Vulkan::Swapchain::MAX_FRAMES_IN_FLIGHT; i++)
100
+ {
101
+ perFrameTextVertexBuffers[i] =
102
+ Vulkan::VertexBuffer (sizeof (FontVertex) * TEXT_VERTEX_BUFFER_SIZE);
103
+ ;
104
+ }
84
105
}
85
106
86
107
void Renderer2D::DrawQuad (const Vec2 position,
@@ -94,7 +115,7 @@ void Renderer2D::DrawQuad(const Vec2 position,
94
115
95
116
auto targetTexture = texture == nullptr ? &defaultTexture : texture;
96
117
97
- auto texIndex = quadMaterial.SetTexture (textureId, targetTexture);
118
+ auto texIndex = quadMaterial.SetTexture (textureId, * targetTexture);
98
119
99
120
auto & layerQuads = quads[zIndex];
100
121
@@ -117,7 +138,9 @@ void Renderer2D::DrawQuad(const Vec2 position,
117
138
{
118
139
CC_ASSERT (zIndex < MAX_LAYERS, " zIndex provided is larger than the maximum number of layers" )
119
140
120
- auto texIndex = quadMaterial.SetTexture (textureId, &(*texture));
141
+ auto & targetTexture = texture ? *texture : defaultTexture;
142
+
143
+ auto texIndex = quadMaterial.SetTexture (textureId, targetTexture);
121
144
122
145
auto & layerQuads = quads[zIndex];
123
146
@@ -142,7 +165,7 @@ void Renderer2D::DrawText2D(const char* const text,
142
165
{
143
166
CC_ASSERT (zIndex < MAX_LAYERS, " zIndex provided is larger than the maximum number of layers" )
144
167
145
- auto texIndex = textMaterial.SetTexture (textureId, font.GetTexture ());
168
+ auto texIndex = textMaterial.SetTexture (textureId, * font.GetTexture ());
146
169
147
170
auto & layerQuads = characters[zIndex];
148
171
@@ -203,20 +226,22 @@ void Renderer2D::Render(Vulkan::CommandBuffer& buffer,
203
226
{
204
227
// Render 2D quads for this layer
205
228
206
- RenderQuads (buffer, i);
229
+ RenderQuads (buffer, i, frameIndex );
207
230
208
231
// Render text for this layer
209
232
210
- RenderText (buffer, i);
233
+ RenderText (buffer, i, frameIndex );
211
234
}
212
235
}
213
236
214
- void Renderer2D::RenderText (Vulkan::CommandBuffer& buffer, size_t index)
237
+ void Renderer2D::RenderText (Vulkan::CommandBuffer& buffer, size_t index, uint32_t frameIndex )
215
238
{
216
239
if (characters[index].Count () == 0 ) return ;
217
240
218
241
auto & perFontQuads = characters[index];
219
242
243
+ auto & vertexBuffer = perFrameTextVertexBuffers[frameIndex];
244
+
220
245
for (size_t j = 0 ; j < perFontQuads.Count (); j++)
221
246
{
222
247
auto & quadArr = perFontQuads[j];
@@ -230,21 +255,20 @@ void Renderer2D::RenderText(Vulkan::CommandBuffer& buffer, size_t index)
230
255
sizeof (FontVertex) *
231
256
((index * MAX_TEXTURES) + (j * MAX_TEXTS_PER_FONT * MAX_CHARS_PER_TEXT));
232
257
233
- textVertexBuffer.Copy (quadArr.Data (),
234
- sizeof (FontVertex) * quadArr.Count (),
235
- vertexBufferOffset);
258
+ vertexBuffer.Copy (quadArr.Data (), sizeof (FontVertex) * quadArr.Count (), vertexBufferOffset);
236
259
237
- textVertexBuffer .Bind (buffer, &vertexBufferOffset);
260
+ vertexBuffer .Bind (buffer, &vertexBufferOffset);
238
261
239
262
Vulkan::Utils::DrawIndexed (buffer.Get (), 6 , quadArr.Count (), 0 , 0 , 0 );
240
263
}
241
264
}
242
265
243
- void Renderer2D::RenderQuads (Vulkan::CommandBuffer& buffer, size_t index)
266
+ void Renderer2D::RenderQuads (Vulkan::CommandBuffer& buffer, size_t index, uint32_t frameIndex )
244
267
{
245
268
if (quads[index].Count () == 0 ) return ;
246
269
247
270
auto & perTextureQuads = quads[index];
271
+ auto & vertexBuffer = perFrameQuadVertexBuffers[frameIndex];
248
272
249
273
for (size_t j = 0 ; j < perTextureQuads.Count (); j++)
250
274
{
@@ -257,13 +281,13 @@ void Renderer2D::RenderQuads(Vulkan::CommandBuffer& buffer, size_t index)
257
281
258
282
uint64_t vertexBufferOffset = (index * MAX_TEXTURES) + (j * MAX_QUADS_PER_LAYER);
259
283
260
- quadVBuffer .Copy (quadArr.Data (),
261
- sizeof (QuadVertex) * quadArr.Count (),
262
- sizeof (QuadVertex) * vertexBufferOffset);
284
+ vertexBuffer .Copy (quadArr.Data (),
285
+ sizeof (QuadVertex) * quadArr.Count (),
286
+ sizeof (QuadVertex) * vertexBufferOffset);
263
287
264
288
uint64_t bindOffset = sizeof (QuadVertex) * vertexBufferOffset;
265
289
266
- quadVBuffer .Bind (buffer, &bindOffset);
290
+ vertexBuffer .Bind (buffer, &bindOffset);
267
291
268
292
Vulkan::Utils::DrawIndexed (buffer.Get (), 6 , quadArr.Count (), 0 , 0 , 0 );
269
293
}
0 commit comments