Use same shader instance for all labeldrawables
This commit is contained in:
@@ -15,16 +15,42 @@ namespace OpenVulkano::Scene
|
||||
{
|
||||
using namespace Math;
|
||||
|
||||
LabelDrawable::LabelDrawable(const std::shared_ptr<AtlasData>& atlasData, const LabelDrawableSettings& settings,
|
||||
bool isBillboard)
|
||||
: Drawable(DrawEncoder::GetDrawEncoder<LabelDrawable>(), DrawPhase::MAIN)
|
||||
namespace
|
||||
{
|
||||
Shader MakeLabelBgShader(bool billboard)
|
||||
{
|
||||
Shader backgroundShader;
|
||||
if (!billboard)
|
||||
{
|
||||
backgroundShader.AddShaderProgram(ShaderProgramType::VERTEX, "Shader/label");
|
||||
}
|
||||
else
|
||||
{
|
||||
backgroundShader.AddShaderProgram(ShaderProgramType::VERTEX, "Shader/labelBillboard");
|
||||
// binding for billboard's buffer
|
||||
DescriptorSetLayoutBinding binding = UniformBuffer::DESCRIPTOR_SET_LAYOUT_BINDING;
|
||||
binding.stageFlags = ShaderProgramType::Type::VERTEX;
|
||||
backgroundShader.AddDescriptorSetLayoutBinding(binding, 4);
|
||||
}
|
||||
backgroundShader.AddShaderProgram(ShaderProgramType::FRAGMENT, "Shader/label");
|
||||
backgroundShader.AddDescriptorSetLayoutBinding(Texture::DESCRIPTOR_SET_LAYOUT_BINDING, 2);
|
||||
backgroundShader.AddDescriptorSetLayoutBinding(UniformBuffer::DESCRIPTOR_SET_LAYOUT_BINDING, 5);
|
||||
backgroundShader.topology = Topology::TRIANGLE_STRIP;
|
||||
backgroundShader.cullMode = CullMode::NONE;
|
||||
return backgroundShader;
|
||||
}
|
||||
}
|
||||
|
||||
Shader LabelDrawable::BACKGROUND_SHADER = MakeLabelBgShader(false);
|
||||
Shader LabelDrawable::BACKGROUND_BILLBOARD_SHADER = MakeLabelBgShader(true);
|
||||
|
||||
LabelDrawable::LabelDrawable(const std::shared_ptr<AtlasData>& atlasData, const LabelDrawableSettings& settings, bool isBillboard)
|
||||
: Drawable(DrawEncoder::GetDrawEncoder<LabelDrawable>(), DrawPhase::MAIN), m_atlasData(atlasData), m_isBillboard(isBillboard)
|
||||
{
|
||||
if (atlasData->glyphs.empty() || !atlasData->texture.size)
|
||||
{
|
||||
throw std::runtime_error("Can't create label drawable. Either glyphs or texture is empty");
|
||||
}
|
||||
m_atlasData = atlasData;
|
||||
m_isBillboard = isBillboard;
|
||||
SetLabelSettings(settings);
|
||||
SetupShaders();
|
||||
SetupBuffers();
|
||||
@@ -43,10 +69,7 @@ namespace OpenVulkano::Scene
|
||||
|
||||
void LabelDrawable::AddText(const std::string& text, const TextConfig& config)
|
||||
{
|
||||
if (text.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (text.empty()) return;
|
||||
|
||||
TextDrawable& textDrawable = m_texts.emplace_back(m_atlasData, config);
|
||||
// do not render glyph's background
|
||||
@@ -104,24 +127,7 @@ namespace OpenVulkano::Scene
|
||||
|
||||
void LabelDrawable::SetupShaders()
|
||||
{
|
||||
if (!m_isBillboard)
|
||||
{
|
||||
m_backgroundShader.AddShaderProgram(OpenVulkano::ShaderProgramType::VERTEX, "Shader/label");
|
||||
}
|
||||
else
|
||||
{
|
||||
m_backgroundShader.AddShaderProgram(OpenVulkano::ShaderProgramType::VERTEX, "Shader/labelBillboard");
|
||||
// binding for billboard's buffer
|
||||
DescriptorSetLayoutBinding binding = UniformBuffer::DESCRIPTOR_SET_LAYOUT_BINDING;
|
||||
binding.stageFlags = ShaderProgramType::Type::VERTEX;
|
||||
m_backgroundShader.AddDescriptorSetLayoutBinding(binding, 4);
|
||||
}
|
||||
m_backgroundShader.AddShaderProgram(OpenVulkano::ShaderProgramType::FRAGMENT, "Shader/label");
|
||||
m_backgroundShader.AddDescriptorSetLayoutBinding(Texture::DESCRIPTOR_SET_LAYOUT_BINDING, 2);
|
||||
m_backgroundShader.AddDescriptorSetLayoutBinding(UniformBuffer::DESCRIPTOR_SET_LAYOUT_BINDING, 5);
|
||||
m_backgroundShader.topology = Topology::TRIANGLE_STRIP;
|
||||
m_backgroundShader.cullMode = CullMode::NONE;
|
||||
SetShader(&m_backgroundShader);
|
||||
SetShader(IsBillboard() ? &BACKGROUND_BILLBOARD_SHADER : &BACKGROUND_SHADER);
|
||||
|
||||
FontAtlasType fontAtlasType(static_cast<FontAtlasType::Type>(m_atlasData->meta.atlasType));
|
||||
if (!m_isBillboard)
|
||||
|
||||
Reference in New Issue
Block a user