add flood fill mode with custom cursor
This commit is contained in:
@@ -1548,3 +1548,62 @@ void CanvasModeTransform::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CanvasModeFloodFill::init()
|
||||
{
|
||||
TextureManager::load(m_cursor_path.c_str());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
void CanvasModeFloodFill::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
||||
{
|
||||
#if defined(__IOS__)
|
||||
m_draw_tip = (me->m_source == kEventSource::Mouse && me->m_type != kEventType::MouseUpL);
|
||||
#else
|
||||
m_draw_tip = (me->m_source == kEventSource::Mouse || me->m_source == kEventSource::Stylus);
|
||||
#endif
|
||||
if (Canvas::I->m_touch_lock && me->m_source == kEventSource::Touch)
|
||||
return;
|
||||
|
||||
switch (me->m_type)
|
||||
{
|
||||
case kEventType::MouseUpL:
|
||||
glm::vec3 ro, rd, hit, n;
|
||||
glm::vec2 pos;
|
||||
int plane;
|
||||
if (Canvas::I->point_trace(loc, ro, rd, hit, pos, n, plane))
|
||||
{
|
||||
std::map<int, std::unique_ptr<bool[]>> plane_mask;
|
||||
std::unique_ptr<glm::vec4> color;
|
||||
Canvas::I->flood_fill(Canvas::I->m_current_layer_idx, plane, { (glm::ivec2)pos },
|
||||
plane_mask, 200, Canvas::I->m_current_brush->m_tip_color, color);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CanvasModeFloodFill::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera)
|
||||
{
|
||||
if (m_draw_tip)
|
||||
{
|
||||
ShaderManager::use(kShader::Texture);
|
||||
ShaderManager::u_mat4(kShaderUniform::MVP,
|
||||
glm::scale(glm::vec3(1, -1, 1))
|
||||
* ortho
|
||||
* glm::translate(glm::vec3(Canvas::I->m_cur_pos, 0.f))
|
||||
* glm::scale(glm::vec3(32, 32, 1))
|
||||
* glm::translate(glm::vec3(0.5f, -0.5f, 0))
|
||||
);
|
||||
ShaderManager::u_int(kShaderUniform::Tex, 0);
|
||||
|
||||
auto& t = TextureManager::get(m_cursor_id);
|
||||
|
||||
Canvas::I->m_sampler_linear.bind(0);
|
||||
t.bind();
|
||||
Canvas::I->m_plane.draw_fill();
|
||||
t.unbind();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user