From 4da0c3696ab31755c32c30900b88393efeaa3dec Mon Sep 17 00:00:00 2001 From: omigamedev Date: Sat, 25 Mar 2017 11:04:44 +0000 Subject: [PATCH] improve sliders and remove slider cursor, fix stroke preview --- data/layout.xml | 29 +------- engine/app.cpp | 12 ++-- engine/layout.cpp | 1 - engine/layout.h | 178 +++++++++++++++++++++------------------------- 4 files changed, 92 insertions(+), 128 deletions(-) diff --git a/data/layout.xml b/data/layout.xml index d655264..b8b1ffa 100644 --- a/data/layout.xml +++ b/data/layout.xml @@ -33,31 +33,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - @@ -143,8 +118,8 @@ - - + + diff --git a/engine/app.cpp b/engine/app.cpp index b40894b..6d32ed3 100644 --- a/engine/app.cpp +++ b/engine/app.cpp @@ -318,16 +318,16 @@ void App::init() glEnable(GL_DEBUG_OUTPUT); #endif - initShaders(); - initAssets(); - initLayout(); - glEnable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); + initShaders(); + initAssets(); + initLayout(); + //int n; //glGetIntegerv(GL_NUM_EXTENSIONS, &n); //for (int i = 0; i < n; i++) @@ -351,7 +351,9 @@ void App::update(float dt) glViewport(0, 0, (GLsizei)width, (GLsizei)height); glClear(GL_COLOR_BUFFER_BIT); - //layout.reload(); +#ifndef __ANDROID__ + layout.reload(); +#endif if (auto* main = layout[main_id]) main->update(width, height, zoom); diff --git a/engine/layout.cpp b/engine/layout.cpp index e8f6dab..2e99d89 100644 --- a/engine/layout.cpp +++ b/engine/layout.cpp @@ -431,7 +431,6 @@ void Node::load_internal(const tinyxml2::XMLElement* x_node) CASE(kWidget::TextInput, NodeTextInput); CASE(kWidget::Button , NodeButton); CASE(kWidget::ButtonCustom, NodeButtonCustom); - CASE(kWidget::SliderCursor, NodeSliderCursor); CASE(kWidget::SliderH, NodeSliderH); CASE(kWidget::SliderV, NodeSliderV); CASE(kWidget::SliderHue, NodeSliderHue); diff --git a/engine/layout.h b/engine/layout.h index 3f41d38..dafc616 100644 --- a/engine/layout.h +++ b/engine/layout.h @@ -43,6 +43,9 @@ enum class kAttribute : uint16_t FloodEvents = const_hash("flood-events"), Icon = const_hash("icon"), Selected = const_hash("selected"), + Template = const_hash("template"), + Value = const_hash("value"), + Range = const_hash("range"), }; enum class kWidget : uint16_t @@ -56,7 +59,6 @@ enum class kWidget : uint16_t Icon = const_hash("icon"), Button = const_hash("button"), ButtonCustom = const_hash("button-custom"), - SliderCursor = const_hash("slider-cursor"), SliderH = const_hash("slider-h"), SliderV = const_hash("slider-v"), SliderHue = const_hash("slider-hue"), @@ -1047,22 +1049,57 @@ public: } }; -class NodeSliderCursor : public NodeButtonCustom +class NodeSliderH : public NodeBorder { - glm::vec2 drag_start; - glm::vec2 drag_diff; bool dragging = false; - glm::vec2 old_pos; public: glm::vec2 m_mask{ 1, 0 }; glm::vec2 m_value; - std::function on_value_changed; - virtual Node* clone_instantiate() const override { return new NodeSliderCursor(); } + std::function on_value_changed; + virtual Node* clone_instantiate() const override { return new NodeSliderH(); } virtual void clone_copy(Node* dest) const override { - NodeButtonCustom::clone_copy(dest); - NodeSliderCursor* n = static_cast(dest); - n->m_mask = m_mask; + NodeBorder::clone_copy(dest); + NodeSliderH* n = static_cast(dest); + n->m_value = m_value; + } + virtual void init() override + { + SetPadding(1, 1, 1, 1); + SetWidthP(100); + SetHeightP(100); + m_color = glm::vec4(1); + } + virtual void draw() override + { + NodeBorder::draw(); + + using namespace ui; + auto sz = GetSize(); + glm::vec2 cur_size = sz * (1.f - m_mask) + m_mask * glm::vec2(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)); + auto mvp = m_proj * pos * scale; + + ui::ShaderManager::use(kShader::Color); + ui::ShaderManager::u_mat4(kShaderUniform::MVP, mvp); + ui::ShaderManager::u_vec4(kShaderUniform::Col, { 0, 0, 0, 1 }); + m_plane.draw_fill(); + } + void set_value(float value) + { + } + virtual void parse_attributes(kAttribute ka, const tinyxml2::XMLAttribute* attr) override + { + NodeBorder::parse_attributes(ka, attr); + switch (ka) + { + case kAttribute::Value: + m_value = glm::vec2(attr->FloatValue()); + break; + default: + break; + } } virtual kEventResult handle_event(Event* e) override { @@ -1070,10 +1107,15 @@ public: switch (e->m_type) { case kEventType::MouseDownL: - old_pos = GetPosition(); - drag_start = ((MouseEvent*)e)->m_pos; dragging = true; mouse_capture(); + { + 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); + if (on_value_changed) + on_value_changed(this, glm::length(m_value)); + } break; case kEventType::MouseUpL: mouse_release(); @@ -1082,13 +1124,11 @@ public: case kEventType::MouseMove: if (dragging) { - auto sz = parent->GetSize() - GetSize(); - drag_diff = old_pos + (((MouseEvent*)e)->m_pos - drag_start) * m_mask; - auto pos = glm::clamp(drag_diff, { 0, 0 }, sz); - SetPosition(pos.x, pos.y); - m_value = pos / glm::max({ 1,1 }, sz); // avoid div0 + 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); if (on_value_changed) - on_value_changed(this, m_value); + on_value_changed(this, glm::length(m_value)); } break; default: @@ -1098,97 +1138,36 @@ public: } }; -class NodeSliderH : public NodeBorder +class NodeSliderV : public NodeSliderH { public: - NodeSliderCursor* m_cursor; - std::function on_value_changed; - virtual Node* clone_instantiate() const override { return new NodeSliderH(); } - virtual void clone_finalize(Node* dest) const override - { - NodeSliderH* n = static_cast(dest); - n->init_controls(); - } - virtual void init() override - { - const auto& m_template = (NodeBorder*)init_template("tpl-slider-h"); - m_color = m_template->m_color; - m_border_color = m_template->m_border_color; - m_thinkness = m_template->m_thinkness; - init_controls(); - } - void init_controls() - { - m_cursor = find("cursor"); - m_cursor->m_mask = { 1, 0 }; - m_cursor->on_value_changed = [this](Node*, glm::vec2 value) { - if (on_value_changed) - on_value_changed(this, value.x); - }; - } -}; - -class NodeSliderV : public NodeBorder -{ -public: - NodeSliderCursor* m_cursor; - std::function on_value_changed; virtual Node* clone_instantiate() const override { return new NodeSliderV(); } - virtual void clone_finalize(Node* dest) const override - { - NodeSliderV* n = static_cast(dest); - n->init_controls(); - } - virtual void init() override - { - const auto& m_template = (NodeBorder*)init_template("tpl-slider-v"); - m_color = m_template->m_color; - m_border_color = m_template->m_border_color; - m_thinkness = m_template->m_thinkness; - init_controls(); - } - void init_controls() - { - m_cursor = find("cursor"); - m_cursor->m_mask = { 0, 1 }; - m_cursor->on_value_changed = [this](Node*, glm::vec2 value) { - if (on_value_changed) - on_value_changed(this, value.y); - }; - } + NodeSliderV() { m_mask = { 0, 1 }; } }; -class NodeSliderHue : public NodeBorder +class NodeSliderHue : public NodeSliderV { public: - NodeSliderCursor* m_cursor; glm::vec4 m_color; - std::function on_value_changed; + std::function on_hue_changed; virtual Node* clone_instantiate() const override { return new NodeSliderHue(); } virtual void clone_finalize(Node* dest) const override { + NodeSliderV::clone_finalize(dest); NodeSliderHue* n = static_cast(dest); n->init_controls(); } virtual void init() override { - const auto& m_template = (NodeBorder*)init_template("tpl-slider-hue"); - m_color = m_template->m_color; - m_border_color = m_template->m_border_color; - m_thinkness = m_template->m_thinkness; + NodeSliderV::init(); init_controls(); } void init_controls() { - m_cursor = find("cursor"); - m_cursor->m_mask = { 0, 1 }; - m_cursor->m_thinkness = 1; - m_cursor->m_color = glm::vec4(0); - m_cursor->m_border_color = glm::vec4(0, 0, 0, 1); - m_cursor->on_value_changed = [this](Node*, glm::vec2 value) { - m_color = glm::vec4(convert_hsv2rgb({ value.y, 1, 1 }), 1); - if (on_value_changed) - on_value_changed(this, m_color); + on_value_changed = [this](Node*, float value) { + m_color = glm::vec4(convert_hsv2rgb({ value, 1, 1 }), 1); + if (on_hue_changed) + on_hue_changed(this, m_color); }; } virtual void draw() override @@ -1198,6 +1177,8 @@ public: ui::ShaderManager::u_mat4(kShaderUniform::MVP, m_mvp); //ui::ShaderManager::u_vec4(kShaderUniform::Col, m_color); m_plane.draw_fill(); + NodeBorder::m_color = glm::vec4(0); + NodeSliderH::draw(); } }; @@ -1637,7 +1618,9 @@ class NodePanelColor : public Node public: NodeColorQuad* m_quad; NodeSliderHue* m_hue; + glm::vec4 m_base_color; glm::vec4 m_color; + glm::vec2 m_cursor; std::function on_color_changed; virtual Node* clone_instantiate() const override { return new NodePanelColor(); } virtual void clone_finalize(Node* dest) const override @@ -1654,17 +1637,20 @@ public: { m_quad = find("quad"); m_hue = find("hue"); - m_hue->on_value_changed = [this](Node*, glm::vec4 color) { - m_color = m_quad->m_color = color; + m_hue->on_hue_changed = [this](Node*, glm::vec4 hue_color) { + m_base_color = m_quad->m_color = hue_color; + auto x = glm::mix(m_base_color, glm::vec4(1, 1, 1, 1), m_cursor.x); + m_color = glm::mix(x, glm::vec4(0, 0, 0, 1), m_cursor.y); if (on_color_changed) - on_color_changed(this, color); + on_color_changed(this, m_color); }; m_quad->on_value_changed = [this](Node*, glm::vec2 pos) { - auto x = glm::mix(m_color, glm::vec4(1, 1, 1, 1), pos.x); - auto color = glm::mix(x, glm::vec4(0, 0, 0, 1), pos.y); + auto x = glm::mix(m_base_color, glm::vec4(1, 1, 1, 1), pos.x); + m_color = glm::mix(x, glm::vec4(0, 0, 0, 1), pos.y); + m_cursor = pos; if (on_color_changed) - on_color_changed(this, color); + on_color_changed(this, m_color); }; } }; @@ -1845,12 +1831,14 @@ public: init_slider(m_jitter_angle, "jitter-angle", &NodeCanvas2D::m_jitter_angle); init_slider(m_jitter_spread, "jitter-spread", &NodeCanvas2D::m_jitter_spread); init_slider(m_jitter_flow, "jitter-flow", &NodeCanvas2D::m_jitter_flow); + //m_canvas->draw_stroke(); } void init_slider(NodeSliderH*& slider, const char* id, float NodeCanvas2D::* prop) { slider = find(id); slider->on_value_changed = std::bind(&NodePanelStroke::handle_slide, this, prop, std::placeholders::_1, std::placeholders::_2); + m_canvas->*prop = slider->m_value.x; } void handle_slide(float NodeCanvas2D::* prop, Node* target, float value) {