TheCherno / Sparky

Cross-Platform High Performance 2D/3D game engine for people like me who like to write code.
Apache License 2.0
1.09k stars 222 forks source link

Unable to render 2 or more labels in the same layer #59

Closed marcizhu closed 8 years ago

marcizhu commented 8 years ago

If I try to render 2 or more labels with different fonts in the same layer just one gets rendered properly, the other is full of random letters, like if the renderer was trying to render both with just one texture.

Again, it only happens if you want to render more than one label in the same layer and with different fonts, if you use the same fonts, all works fine.

That's all I know :)

TheCherno commented 8 years ago

Good to know, I'll definitely look into this.

marcizhu commented 8 years ago

Thanks for that. I've discovered that if you change the method Layer2D::OnRender() from:

void Layer2D::OnRender() 
{ 
   m_Shader->Bind(); 
   m_Renderer->Begin(); 

   for (const Renderable2D* renderable : m_Renderables) 
      renderable->Submit(m_Renderer); 

   for (const Renderable2D* renderable : m_SubmittedRenderables) 
      renderable->Submit(m_Renderer); 

   m_Renderer->End(); 
   m_Renderer->Present(); 

   OnRender(*m_Renderer); 
   m_SubmittedRenderables.clear(); 
}

to:

void Layer2D::OnRender() 
{ 
   m_Shader->Bind(); 

   for (const Renderable2D* renderable : m_Renderables){
      m_Renderer->Begin(); 
      renderable->Submit(m_Renderer);
      m_Renderer->End(); 
      m_Renderer->Present(); 
   }

   for (const Renderable2D* renderable : m_SubmittedRenderables) {
      m_Renderer->Begin(); 
      renderable->Submit(m_Renderer);
      m_Renderer->End(); 
      m_Renderer->Present(); 
   } 

   OnRender(*m_Renderer); 
   m_SubmittedRenderables.clear(); 
} 

It works, because is like rendering in different layers, so clearly the bug is inside BatchRenderer2D::End() or inside BatchRenderer2D::Present() I hope you find this useful :)

TheCherno commented 8 years ago

I just tried this in Sandbox (in TestLayer), and it seemed to work fine for me. Here's the code I used:

FontManager::Add(new Font("Consolas", "res/consola.ttf", 96));
FontManager::Add(new Font("Brush Script", "res/BrushScriptStd.otf", 96));

Add(new Label("Consolas", -15.5f, 0.0f, FontManager::Get("Consolas"), 0xffffffff));
Add(new Label("Brush Script", -15.5f, 2.0f, FontManager::Get("Brush Script"), 0xffffffff));

Are you sure you're on the latest version of Sparky? If you are, please send me a demo layer so I can investigate further.

sparky

marcizhu commented 8 years ago

I've just reviewed my code and I realized that I wasn't setting the uniform "textures", so that's why I was getting that bug...

I'm sorry, clearly there's no bug...