1919
2020namespace Siege
2121{
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+
2228void Renderer2D::Initialise (const char * const globalDataName)
2329{
2430 globalDataId = INTERN_STR (globalDataName);
@@ -78,9 +84,24 @@ void Renderer2D::Initialise(const char* const globalDataName)
7884
7985 quadIndexBuffer = Vulkan::IndexBuffer (fontIndices, sizeof (unsigned int ) * 6 );
8086
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+ }
84105}
85106
86107void Renderer2D::DrawQuad (const Vec2 position,
@@ -94,7 +115,7 @@ void Renderer2D::DrawQuad(const Vec2 position,
94115
95116 auto targetTexture = texture == nullptr ? &defaultTexture : texture;
96117
97- auto texIndex = quadMaterial.SetTexture (textureId, targetTexture);
118+ auto texIndex = quadMaterial.SetTexture (textureId, * targetTexture);
98119
99120 auto & layerQuads = quads[zIndex];
100121
@@ -117,7 +138,9 @@ void Renderer2D::DrawQuad(const Vec2 position,
117138{
118139 CC_ASSERT (zIndex < MAX_LAYERS, " zIndex provided is larger than the maximum number of layers" )
119140
120- auto texIndex = quadMaterial.SetTexture (textureId, &(*texture));
141+ auto & targetTexture = texture ? *texture : defaultTexture;
142+
143+ auto texIndex = quadMaterial.SetTexture (textureId, targetTexture);
121144
122145 auto & layerQuads = quads[zIndex];
123146
@@ -142,7 +165,7 @@ void Renderer2D::DrawText2D(const char* const text,
142165{
143166 CC_ASSERT (zIndex < MAX_LAYERS, " zIndex provided is larger than the maximum number of layers" )
144167
145- auto texIndex = textMaterial.SetTexture (textureId, font.GetTexture ());
168+ auto texIndex = textMaterial.SetTexture (textureId, * font.GetTexture ());
146169
147170 auto & layerQuads = characters[zIndex];
148171
@@ -203,20 +226,22 @@ void Renderer2D::Render(Vulkan::CommandBuffer& buffer,
203226 {
204227 // Render 2D quads for this layer
205228
206- RenderQuads (buffer, i);
229+ RenderQuads (buffer, i, frameIndex );
207230
208231 // Render text for this layer
209232
210- RenderText (buffer, i);
233+ RenderText (buffer, i, frameIndex );
211234 }
212235}
213236
214- void Renderer2D::RenderText (Vulkan::CommandBuffer& buffer, size_t index)
237+ void Renderer2D::RenderText (Vulkan::CommandBuffer& buffer, size_t index, uint32_t frameIndex )
215238{
216239 if (characters[index].Count () == 0 ) return ;
217240
218241 auto & perFontQuads = characters[index];
219242
243+ auto & vertexBuffer = perFrameTextVertexBuffers[frameIndex];
244+
220245 for (size_t j = 0 ; j < perFontQuads.Count (); j++)
221246 {
222247 auto & quadArr = perFontQuads[j];
@@ -230,21 +255,20 @@ void Renderer2D::RenderText(Vulkan::CommandBuffer& buffer, size_t index)
230255 sizeof (FontVertex) *
231256 ((index * MAX_TEXTURES) + (j * MAX_TEXTS_PER_FONT * MAX_CHARS_PER_TEXT));
232257
233- textVertexBuffer.Copy (quadArr.Data (),
234- sizeof (FontVertex) * quadArr.Count (),
235- vertexBufferOffset);
258+ vertexBuffer.Copy (quadArr.Data (), sizeof (FontVertex) * quadArr.Count (), vertexBufferOffset);
236259
237- textVertexBuffer .Bind (buffer, &vertexBufferOffset);
260+ vertexBuffer .Bind (buffer, &vertexBufferOffset);
238261
239262 Vulkan::Utils::DrawIndexed (buffer.Get (), 6 , quadArr.Count (), 0 , 0 , 0 );
240263 }
241264}
242265
243- void Renderer2D::RenderQuads (Vulkan::CommandBuffer& buffer, size_t index)
266+ void Renderer2D::RenderQuads (Vulkan::CommandBuffer& buffer, size_t index, uint32_t frameIndex )
244267{
245268 if (quads[index].Count () == 0 ) return ;
246269
247270 auto & perTextureQuads = quads[index];
271+ auto & vertexBuffer = perFrameQuadVertexBuffers[frameIndex];
248272
249273 for (size_t j = 0 ; j < perTextureQuads.Count (); j++)
250274 {
@@ -257,13 +281,13 @@ void Renderer2D::RenderQuads(Vulkan::CommandBuffer& buffer, size_t index)
257281
258282 uint64_t vertexBufferOffset = (index * MAX_TEXTURES) + (j * MAX_QUADS_PER_LAYER);
259283
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);
263287
264288 uint64_t bindOffset = sizeof (QuadVertex) * vertexBufferOffset;
265289
266- quadVBuffer .Bind (buffer, &bindOffset);
290+ vertexBuffer .Bind (buffer, &bindOffset);
267291
268292 Vulkan::Utils::DrawIndexed (buffer.Get (), 6 , quadArr.Count (), 0 , 0 , 0 );
269293 }
0 commit comments