diff --git a/android/build-run.bat b/android/build-run.bat index 87c7a75..9036f94 100644 --- a/android/build-run.bat +++ b/android/build-run.bat @@ -1,3 +1,4 @@ +xcopy /I /D /Y /S /E ..\data src\main\assets\data call gradlew installDebug call adb shell am start -n com.omigamedev/android.app.NativeActivity pause \ No newline at end of file diff --git a/android/src/main/cpp/main.cpp b/android/src/main/cpp/main.cpp index ad3c109..50a6049 100755 --- a/android/src/main/cpp/main.cpp +++ b/android/src/main/cpp/main.cpp @@ -116,7 +116,7 @@ static int engine_init_display(struct engine* engine) { surface = eglCreateWindowSurface(display, config, engine->app->window, NULL); const EGLint attribs_test[] = { - EGL_CONTEXT_CLIENT_VERSION, 3, + EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; @@ -199,26 +199,34 @@ static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) struct engine* engine = (struct engine*)app->userData; float x = AMotionEvent_getX(event, 0); float y = AMotionEvent_getY(event, 0); + LOG("event source: %d", AInputEvent_getSource(event)); MouseEvent e; int32_t eventType = AInputEvent_getType(event); switch (eventType) { case AINPUT_EVENT_TYPE_MOTION: - switch (AInputEvent_getSource(event)) { - case AINPUT_SOURCE_TOUCHSCREEN: - int action = AKeyEvent_getAction(event) & AMOTION_EVENT_ACTION_MASK; - switch (action) { - case AMOTION_EVENT_ACTION_DOWN: - App::I.mouse_down(0, x, y); - return 1; - case AMOTION_EVENT_ACTION_UP: - App::I.mouse_up(0, x, y); - return 1; - case AMOTION_EVENT_ACTION_MOVE: - App::I.mouse_move(x, y); - return 1; - } +// switch (AInputEvent_getSource(event)) { +// case AINPUT_SOURCE_STYLUS: +// case AINPUT_SOURCE_TOUCHSCREEN: + { + int action = AKeyEvent_getAction(event) & AMOTION_EVENT_ACTION_MASK; + switch (action) { + case AMOTION_EVENT_ACTION_DOWN: + App::I.mouse_down(0, x, y); + return 1; + case AMOTION_EVENT_ACTION_UP: + App::I.mouse_up(0, x, y); + return 1; + case AMOTION_EVENT_ACTION_HOVER_MOVE: // pen move before touching + case AMOTION_EVENT_ACTION_MOVE: + App::I.mouse_move(x, y); + return 1; + default: + LOG("motion action: %d", action); break; - } // end switch + } + } +// break; +// } // end switch break; case AINPUT_EVENT_TYPE_KEY: // handle key input... @@ -260,6 +268,7 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) { engine->accelerometerSensor, (1000L/60)*1000); } + engine->animating = 1; break; case APP_CMD_LOST_FOCUS: // When our app loses focus, we stop monitoring the accelerometer. diff --git a/data/layout.xml b/data/layout.xml index b8b1ffa..752776f 100644 --- a/data/layout.xml +++ b/data/layout.xml @@ -310,13 +310,13 @@ - + - + - + @@ -344,38 +344,52 @@ - + - + + + + + - --> + + + + + + + + + + - + - + - + - + - + @@ -385,7 +399,7 @@ - + diff --git a/data/ui/brushes.png b/data/ui/brushes.png new file mode 100644 index 0000000..08d30b8 Binary files /dev/null and b/data/ui/brushes.png differ diff --git a/data/ui/brushes.svg b/data/ui/brushes.svg new file mode 100644 index 0000000..e5342ff --- /dev/null +++ b/data/ui/brushes.svg @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/data/ui/layers.png b/data/ui/layers.png new file mode 100644 index 0000000..97d2760 Binary files /dev/null and b/data/ui/layers.png differ diff --git a/data/ui/layers.svg b/data/ui/layers.svg new file mode 100644 index 0000000..0f04342 --- /dev/null +++ b/data/ui/layers.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/ui/palette.png b/data/ui/palette.png new file mode 100644 index 0000000..621559e Binary files /dev/null and b/data/ui/palette.png differ diff --git a/data/ui/palette.svg b/data/ui/palette.svg new file mode 100644 index 0000000..3ea82d1 --- /dev/null +++ b/data/ui/palette.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/ui/stroke.png b/data/ui/stroke.png new file mode 100644 index 0000000..8f40a67 Binary files /dev/null and b/data/ui/stroke.png differ diff --git a/data/ui/stroke.svg b/data/ui/stroke.svg new file mode 100644 index 0000000..ad584c1 --- /dev/null +++ b/data/ui/stroke.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/engine/app.cpp b/engine/app.cpp index 6d32ed3..834c1c9 100644 --- a/engine/app.cpp +++ b/engine/app.cpp @@ -184,7 +184,7 @@ void App::initLayout() NodeBorder::static_init(); NodeImage::static_init(); NodeIcon::static_init(); - NodeCanvas2D::static_init(); + NodeStrokePreview::static_init(); layout.on_loaded = [&] { LOG("initializing layout updating after load"); @@ -192,10 +192,36 @@ void App::initLayout() LOG("initializing layout components"); sidebar = layout[main_id]->find("sidebar"); - brushes = layout[main_id]->find("panel-brush"); - layers = layout[main_id]->find("panel-layer"); - color = layout[main_id]->find("panel-color"); - stroke = layout[main_id]->find("panel-stroke"); + panels = layout[main_id]->find("panels"); + + //brushes = layout[main_id]->find("panel-brush"); + //layers = layout[main_id]->find("panel-layer"); + //color = layout[main_id]->find("panel-color"); + //stroke = layout[main_id]->find("panel-stroke"); + + brushes = std::make_shared(); + brushes->m_manager = &layout; + brushes->init(); + brushes->create(); + brushes->loaded(); + + layers = std::make_shared(); + layers->m_manager = &layout; + layers->init(); + layers->create(); + layers->loaded(); + + color = std::make_shared(); + color->m_manager = &layout; + color->init(); + color->create(); + color->loaded(); + + stroke = std::make_shared(); + stroke->m_manager = &layout; + stroke->init(); + stroke->create(); + stroke->loaded(); brushes->on_brush_changed = [this](Node* target, int index) { auto tid = brushes->get_texture_id(index); @@ -217,6 +243,67 @@ void App::initLayout() on_stroke_change(); }; + if (auto* button = layout[main_id]->find("btn-stroke")) + { + button->on_click = [this](Node*) { + panels->remove_all_children(); + if (current_panel != stroke.get()) + { + panels->add_child(std::static_pointer_cast(stroke)); + current_panel = stroke.get(); + } + else + { + current_panel = nullptr; + } + }; + } + if (auto* button = layout[main_id]->find("btn-brush")) + { + button->on_click = [this](Node*) { + panels->remove_all_children(); + if (current_panel != brushes.get()) + { + panels->add_child(std::static_pointer_cast(brushes)); + current_panel = brushes.get(); + } + else + { + current_panel = nullptr; + } + }; + } + if (auto* button = layout[main_id]->find("btn-color")) + { + button->on_click = [this](Node*) { + panels->remove_all_children(); + if (current_panel != color.get()) + { + panels->add_child(std::static_pointer_cast(color)); + current_panel = color.get(); + } + else + { + current_panel = nullptr; + } + }; + } + if (auto* button = layout[main_id]->find("btn-layer")) + { + button->on_click = [this](Node*) { + panels->remove_all_children(); + if (current_panel != layers.get()) + { + panels->add_child(std::static_pointer_cast(layers)); + current_panel = layers.get(); + } + else + { + current_panel = nullptr; + } + }; + } + if (auto* button = layout[main_id]->find("btn-close")) { button->on_click = [](Node*) { exit(0); }; diff --git a/engine/app.h b/engine/app.h index 12e2cba..edb0956 100644 --- a/engine/app.h +++ b/engine/app.h @@ -20,10 +20,12 @@ public: NodePopupMenu* menu_edit = nullptr; NodePopupMenu* menu_layers = nullptr; NodeBorder* sidebar = nullptr; - NodePanelBrush* brushes; - NodePanelLayer* layers; - NodePanelColor* color; - NodePanelStroke* stroke; + std::shared_ptr brushes; + std::shared_ptr layers; + std::shared_ptr color; + std::shared_ptr stroke; + Node* current_panel = nullptr; + Node* panels; std::function on_brush_select; std::function on_color_change; std::function on_stroke_change; diff --git a/engine/layout.cpp b/engine/layout.cpp index 2e99d89..5ba5236 100644 --- a/engine/layout.cpp +++ b/engine/layout.cpp @@ -9,7 +9,7 @@ Plane NodeBorder::m_plane; Plane NodeImage::m_plane; Sampler NodeImage::m_sampler; std::map NodeIcon::m_icons; -ui::Shader NodeCanvas2D::m_shader; +ui::Shader NodeStrokePreview::m_shader; kEventResult Node::on_event(Event* e) { @@ -112,9 +112,23 @@ void Node::add_child(Node* n, int index) YGNodeInsertChild(y_node, n->y_node, index); } +void Node::add_child(std::shared_ptr n) +{ + m_children.push_back(n); + n->parent = this; + n->m_manager = m_manager; + YGNodeInsertChild(y_node, n->y_node, YGNodeGetChildCount(y_node)); +} +void Node::add_child(std::shared_ptr n, int index) +{ + m_children.push_back(n); + n->parent = this; + n->m_manager = m_manager; + YGNodeInsertChild(y_node, n->y_node, index); +} void Node::remove_child(Node* n) { - auto i = std::find_if(m_children.begin(), m_children.end(), [=](std::unique_ptr& ptr) { return ptr.get() == n; }); + auto i = std::find_if(m_children.begin(), m_children.end(), [=](auto& ptr) { return ptr.get() == n; }); if (i != m_children.end()) { YGNodeRemoveChild(y_node, n->y_node); @@ -122,6 +136,12 @@ void Node::remove_child(Node* n) } } +void Node::remove_all_children() +{ + for (auto& n : m_children) + YGNodeRemoveChild(y_node, n->y_node); + m_children.clear(); +} void Node::move_child(Node* n, int index) { YGNodeRemoveChild(y_node, n->y_node); @@ -443,7 +463,7 @@ void Node::load_internal(const tinyxml2::XMLElement* x_node) CASE(kWidget::PanelColor, NodePanelColor); CASE(kWidget::PanelStroke, NodePanelStroke); CASE(kWidget::ColorQuad, NodeColorQuad); - CASE(kWidget::Canvas2D, NodeCanvas2D); + CASE(kWidget::Canvas2D, NodeStrokePreview); #undef CASE case kWidget::Ref: { diff --git a/engine/layout.h b/engine/layout.h index dafc616..435c587 100644 --- a/engine/layout.h +++ b/engine/layout.h @@ -155,7 +155,7 @@ public: class LayoutManager* m_manager; uint16_t m_nodeID; std::string m_nodeID_s; - std::vector> m_children; + std::vector> m_children; Node* current_mouse_capture = nullptr; Node* current_key_capture = nullptr; bool m_mouse_captured = false; @@ -301,7 +301,10 @@ public: const Node* init_template(const char* id); void add_child(Node* n); void add_child(Node* n, int index); + void add_child(std::shared_ptr n); + void add_child(std::shared_ptr n, int index); void remove_child(Node* n); + void remove_all_children(); void move_child(Node* n, int index); void move_child_offset(Node* n, int offset); int get_child_index(Node* n); @@ -732,10 +735,10 @@ public: case kEventType::KeyDown: switch (ke->m_key) { - case VK_BACK: - m_string.erase(m_string.end() - 1); - m_text->set_text(m_string.c_str()); - break; +// case VK_BACK: +// m_string.erase(m_string.end() - 1); +// m_text->set_text(m_string.c_str()); +// break; default: break; } @@ -1655,7 +1658,7 @@ public: } }; -class NodeCanvas2D : public NodeBorder +class NodeStrokePreview : public NodeBorder { RTT m_rtt; Sampler m_sampler; @@ -1696,7 +1699,7 @@ public: "}"; m_shader.create(shader_v, shader_f); } - virtual Node* clone_instantiate() const override { return new NodeCanvas2D(); } + virtual Node* clone_instantiate() const override { return new NodeStrokePreview(); } virtual void clone_copy(Node* dest) const override { NodeBorder::clone_copy(dest); @@ -1707,7 +1710,7 @@ public: } virtual void clone_finalize(Node* dest) const override { - NodeCanvas2D* n = (NodeCanvas2D*)dest; + NodeStrokePreview* n = (NodeStrokePreview*)dest; n->init_controls(); } void init_controls() @@ -1798,7 +1801,7 @@ public: class NodePanelStroke : public Node { public: - NodeCanvas2D* m_canvas; + NodeStrokePreview* m_canvas; NodeSliderH* m_tip_size; NodeSliderH* m_tip_spacing; NodeSliderH* m_tip_flow; @@ -1821,26 +1824,26 @@ public: } void init_controls() { - m_canvas = find("canvas"); + m_canvas = find("canvas"); - init_slider(m_tip_size, "tip-size", &NodeCanvas2D::m_tip_size); - init_slider(m_tip_spacing, "tip-spacing", &NodeCanvas2D::m_tip_spacing); - init_slider(m_tip_flow, "tip-flow", &NodeCanvas2D::m_tip_flow); - init_slider(m_tip_angle, "tip-angle", &NodeCanvas2D::m_tip_angle); - init_slider(m_jitter_scale, "jitter-scale", &NodeCanvas2D::m_jitter_scale); - 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); + init_slider(m_tip_size, "tip-size", &NodeStrokePreview::m_tip_size); + init_slider(m_tip_spacing, "tip-spacing", &NodeStrokePreview::m_tip_spacing); + init_slider(m_tip_flow, "tip-flow", &NodeStrokePreview::m_tip_flow); + init_slider(m_tip_angle, "tip-angle", &NodeStrokePreview::m_tip_angle); + init_slider(m_jitter_scale, "jitter-scale", &NodeStrokePreview::m_jitter_scale); + init_slider(m_jitter_angle, "jitter-angle", &NodeStrokePreview::m_jitter_angle); + init_slider(m_jitter_spread, "jitter-spread", &NodeStrokePreview::m_jitter_spread); + init_slider(m_jitter_flow, "jitter-flow", &NodeStrokePreview::m_jitter_flow); //m_canvas->draw_stroke(); } - void init_slider(NodeSliderH*& slider, const char* id, float NodeCanvas2D::* prop) + void init_slider(NodeSliderH*& slider, const char* id, float NodeStrokePreview::* 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) + void handle_slide(float NodeStrokePreview::* prop, Node* target, float value) { m_canvas->*prop = value; m_canvas->draw_stroke();