implement instanced drawing
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user