implement instanced drawing

This commit is contained in:
2017-03-27 22:29:47 +01:00
parent b9277f94e8
commit e8cabebe66
8 changed files with 206 additions and 36 deletions

View File

@@ -20,6 +20,8 @@ public:
RTT m_fb;
Sampler m_sampler;
Plane m_plane;
BrushMesh m_mesh;
bool m_use_instanced = false;
std::minstd_rand prng;
bool create(int width, int height)
{
@@ -30,8 +32,16 @@ public:
m_fb.create(width, height);
m_sampler.create();
m_plane.create<1>(1, 1);
m_mesh.create();
return true;
}
void resize(int width, int height)
{
m_width = width;
m_height = height;
m_tmp->create(width, height, "tmp");
m_fb.create(width, height);
}
void layer_add(std::string name)
{
m_layers.emplace_back();
@@ -64,20 +74,32 @@ public:
auto& tex = TextureManager::get(m_brush.m_tex_id);
tex.bind();
m_sampler.bind(0);
ShaderManager::use("stroke");
ShaderManager::u_vec4(kShaderUniform::Col, m_brush.m_tip_color);
ShaderManager::u_int(kShaderUniform::Tex, 0);
for (const auto& s : samples)
if (m_use_instanced)
{
auto mvp = proj *
glm::translate(glm::vec3(s.pos, 0)) *
glm::scale(glm::vec3(s.size, s.size, 1)) *
glm::eulerAngleZ(s.angle);
ShaderManager::u_mat4(kShaderUniform::MVP, mvp);
ShaderManager::u_float(kShaderUniform::Alpha, s.flow);
m_plane.draw_fill();
m_mesh.shader.use();
m_mesh.shader.u_vec4(kShaderUniform::Col, m_brush.m_tip_color);
m_mesh.shader.u_int(kShaderUniform::Tex, 0);
m_mesh.draw(samples, proj);
}
else
{
ShaderManager::use("stroke");
ShaderManager::u_vec4(kShaderUniform::Col, m_brush.m_tip_color);
ShaderManager::u_int(kShaderUniform::Tex, 0);
for (const auto& s : samples)
{
auto mvp = proj *
glm::translate(glm::vec3(s.pos, 0)) *
glm::scale(glm::vec3(s.size, s.size, 1)) *
glm::eulerAngleZ(s.angle);
ShaderManager::u_mat4(kShaderUniform::MVP, mvp);
ShaderManager::u_float(kShaderUniform::Alpha, s.flow);
m_plane.draw_fill();
}
}
m_sampler.unbind();
tex.unbind();