use mutex to avoid window destroy deadlock, fix vertical slider to increase value upward

This commit is contained in:
2019-03-04 19:32:43 +01:00
parent 6e73a9eee5
commit 801db87e06
9 changed files with 103 additions and 71 deletions

View File

@@ -28,9 +28,13 @@ void NodeSliderH::draw()
NodeBorder::draw();
auto sz = GetSize();
glm::vec2 cur_size = sz * (1.f - m_mask) + m_mask * glm::vec2(10);
glm::vec2 cur_size = sz;
cur_size[m_comp] = 10;
glm::mat4 scale = glm::scale(glm::vec3(cur_size, 1.f));
glm::mat4 pos = glm::translate(glm::vec3(m_value * m_mask * sz + m_pos + sz * .5f * (1.f - m_mask), 0));
glm::vec2 cur_pos = m_pos;
cur_pos[m_comp] += (m_comp == 0 ? m_value : 1.f - m_value) * sz[m_comp];
cur_pos[1 - m_comp] += sz[1 - m_comp] * 0.5f;
glm::mat4 pos = glm::translate(glm::vec3(cur_pos , 0));
auto mvp = m_proj * pos * scale;
ShaderManager::use(kShader::Color);
@@ -44,14 +48,14 @@ void NodeSliderH::set_value(float value, bool propagate)
// don't accept external values while user interaction
if (dragging)
return;
m_value = glm::vec2(value) * m_mask;
m_value = value;
if (propagate && on_value_changed)
on_value_changed(this, glm::length(m_value));
on_value_changed(this, m_value);
}
float NodeSliderH::get_value()
{
return glm::length(m_value * m_mask);
return m_value;
}
void NodeSliderH::parse_attributes(kAttribute ka, const tinyxml2::XMLAttribute* attr)
@@ -60,7 +64,7 @@ void NodeSliderH::parse_attributes(kAttribute ka, const tinyxml2::XMLAttribute*
switch (ka)
{
case kAttribute::Value:
m_value = glm::vec2(attr->FloatValue());
m_value = attr->FloatValue();
break;
default:
break;
@@ -78,26 +82,30 @@ kEventResult NodeSliderH::handle_event(Event* e)
{
m_old_value = m_value;
auto sz = GetSize();
auto pos = glm::clamp(((MouseEvent*)e)->m_pos - m_pos, { 0, 0 }, sz) * m_mask;
m_value = pos / glm::max({ 1, 1 }, sz);
auto pos = glm::clamp(((MouseEvent*)e)->m_pos - m_pos, { 0, 0 }, sz);
m_value = m_comp == 0 ?
pos[m_comp] / glm::max(1.f, sz[m_comp]) :
1.f - pos[m_comp] / glm::max(1.f, sz[m_comp]);
if (on_value_changed)
on_value_changed(this, glm::length(m_value));
on_value_changed(this, m_value);
}
break;
case kEventType::MouseUpL:
mouse_release();
if (dragging && on_value_final)
on_value_final(this, glm::length(m_value * m_mask));
on_value_final(this, m_value);
dragging = false;
break;
case kEventType::MouseMove:
if (dragging)
{
auto sz = GetSize();
auto pos = glm::clamp(((MouseEvent*)e)->m_pos - m_pos, { 0, 0 }, sz) * m_mask;
m_value = pos / glm::max({ 1, 1 }, sz);
auto pos = glm::clamp(((MouseEvent*)e)->m_pos - m_pos, { 0, 0 }, sz);
m_value = m_comp == 0 ?
pos[m_comp] / glm::max(1.f, sz[m_comp]) :
1.f - pos[m_comp] / glm::max(1.f, sz[m_comp]);
if (on_value_changed)
on_value_changed(this, glm::length(m_value * m_mask));
on_value_changed(this, m_value);
}
break;
case kEventType::MouseCancel:
@@ -105,9 +113,9 @@ kEventResult NodeSliderH::handle_event(Event* e)
if (dragging)
{
m_value = m_old_value;
set_value(glm::length(m_value));
set_value(m_value);
if (on_value_changed)
on_value_changed(this, glm::length(m_value * m_mask));
on_value_changed(this, m_value);
}
dragging = false;
break;
@@ -147,16 +155,16 @@ void NodeSliderHue::init_controls()
glm::vec4 NodeSliderHue::get_hue()
{
m_color = glm::vec4(convert_hsv2rgb({ glm::length(m_value * m_mask), 1, 1 }), 1);
m_color = glm::vec4(convert_hsv2rgb({ m_value, 1, 1 }), 1);
return m_color;
}
void NodeSliderHue::draw()
{
ShaderManager::use(kShader::ColorHue);
ShaderManager::u_mat4(kShaderUniform::MVP, m_mvp);
ShaderManager::u_mat4(kShaderUniform::MVP, m_mvp * glm::scale(glm::vec3(1, -1, 1)));
//ShaderManager::u_vec4(kShaderUniform::Col, m_color);
ShaderManager::u_int(kShaderUniform::Direction, 1); // set vertical
ShaderManager::u_int(kShaderUniform::Direction, m_comp); // set vertical
m_plane.draw_fill();
NodeBorder::m_color = glm::vec4(0);
NodeSliderH::draw();