diff --git a/android/build.gradle b/android/build.gradle index 9789eb3..8b33803 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -28,9 +28,10 @@ android { // Sets a flag to enable format macro constants for the C++ compiler. //cppFlags "-D__STDC_FORMAT_MACROS" arguments '-DANDROID_PLATFORM=android-19', - '-DANDROID_TOOLCHAIN=clang', + '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static', - '-DCMAKE_BUILD_TYPE=Debug' + '-DCMAKE_BUILD_TYPE=Release', + '-DANDROID_ARM_NEON=TRUE' } } ndk { diff --git a/android/src/main/cpp/main.cpp b/android/src/main/cpp/main.cpp index ac5de3c..f28ca4e 100755 --- a/android/src/main/cpp/main.cpp +++ b/android/src/main/cpp/main.cpp @@ -604,12 +604,14 @@ void android_main(struct android_app* state) { // If not animating, we will block forever waiting for events. // If animating, we loop until all events are read, then continue // to draw the next frame of animation. - while ((ident=ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events, + bool used = false; + while (!used && (ident=ALooper_pollAll(-1, NULL, &events, (void**)&source)) >= 0) { // Process this event. if (source != NULL) { source->process(state, source); + used = true; } // If a sensor has data, process it now. @@ -632,7 +634,8 @@ void android_main(struct android_app* state) { } } - if (engine.animating) { + //if (engine.animating) + { // Done with events; draw next animation frame. engine.state.angle += .01f; if (engine.state.angle > 1) { diff --git a/data/layout.xml b/data/layout.xml index a8a3449..2eb4c93 100644 --- a/data/layout.xml +++ b/data/layout.xml @@ -328,6 +328,10 @@ + + + + @@ -389,10 +393,6 @@ - - - - - + diff --git a/engine/app.cpp b/engine/app.cpp index e53f08f..142aa34 100644 --- a/engine/app.cpp +++ b/engine/app.cpp @@ -417,7 +417,7 @@ void App::initLayout() }; layers->on_layer_add = [this](Node*) { - canvas->m_canvas->layer_add("asd"); + canvas->m_canvas->layer_add(layers->m_layers.back()->m_label_text.c_str()); }; layers->on_layer_change = [this](Node*, int old_idx, int new_idx) { @@ -477,7 +477,9 @@ void App::initLayout() button->on_click = [this,button](Node*) { if (canvas) { - canvas->m_canvas->save(data_path); + canvas->m_canvas->open_project(data_path); + for (auto& i : canvas->m_canvas->m_order) + layers->add_layer(canvas->m_canvas->m_layers[i].m_name.c_str()); } }; } diff --git a/engine/canvas.cpp b/engine/canvas.cpp index b93dce4..c1e3608 100644 --- a/engine/canvas.cpp +++ b/engine/canvas.cpp @@ -515,16 +515,23 @@ void ui::Canvas::save_project(std::string data_path) } fwrite(&m_width, sizeof(int), 1, fp); fwrite(&m_height, sizeof(int), 1, fp); + int n_layers = (int)m_layers.size(); fwrite(&n_layers, sizeof(int), 1, fp); + for (int i = 0; i < (int)m_layers.size(); i++) { int n_order = m_order[i]; fwrite(&n_order, sizeof(int), 1, fp); + + int name_len = m_layers[i].m_name.size(); + fwrite(&name_len, sizeof(int), 1, fp); + fwrite(m_layers[i].m_name.data(), name_len, 1, fp); + auto snap = m_layers[i].snapshot(data_path); - for (int layer_index = 0; layer_index < 6; layer_index++) + for (int plane_index = 0; plane_index < 6; plane_index++) { - fwrite(snap.image[i].get(), 1, m_width * m_height * 4, fp); + fwrite(snap.image[plane_index].get(), 1, m_width * m_height * 4, fp); } } fclose(fp); @@ -543,25 +550,33 @@ void ui::Canvas::open_project(std::string data_path) } fread(&m_width, sizeof(int), 1, fp); fread(&m_height, sizeof(int), 1, fp); + int n_layers = (int)m_layers.size(); fread(&n_layers, sizeof(int), 1, fp); + const int bytes = m_width * m_height * 4; Layer::Snapshot snap; snap.create(m_width, m_height); + m_layers.clear(); m_order.clear(); for (int i = 0; i < n_layers; i++) { - int n_order = m_order[i]; + int n_order; fread(&n_order, sizeof(int), 1, fp); m_order.push_back(n_order); - for (int layer_index = 0; layer_index < 6; layer_index++) + + int name_len; + fread(&name_len, sizeof(int), 1, fp); + std::string name(name_len, '\0'); + fread((char*)name.data(), name_len, 1, fp); + for (int plane_index = 0; plane_index < 6; plane_index++) { - fread(snap.image[i].get(), 1, bytes, fp); - m_layers.emplace_back(); - m_layers.back().create(m_width, m_height, ""); - m_layers.back().restore(snap); + fread(snap.image[plane_index].get(), 1, bytes, fp); } + m_layers.emplace_back(); + m_layers.back().create(m_width, m_height, name.c_str()); + m_layers.back().restore(snap); } fclose(fp); LOG("project restore from %s", name); @@ -582,7 +597,7 @@ void ui::Layer::restore(const Snapshot& snap) { if (!snap.image[i]) continue; - m_rtt[i].create(512, 512); // TODO: this should not be recreated here! Sorry I messed up with this, just quick fix DON'T SHIP!! + m_rtt[i].recreate(); // TODO: this should not be recreated here! Sorry I messed up with this, just quick fix DON'T SHIP!! m_rtt[i].bindTexture(); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_rtt[i].getWidth(), m_rtt[i].getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, snap.image[i].get()); m_rtt[i].unbindTexture(); @@ -630,6 +645,7 @@ void ui::Layer::clear(const glm::vec4& c) bool ui::Layer::create(int width, int height, std::string name) { + m_name = name; for (int i = 0; i < 6; i++) { m_rtt[i].create(width, height); diff --git a/engine/canvas.h b/engine/canvas.h index c52e8fc..689d44b 100644 --- a/engine/canvas.h +++ b/engine/canvas.h @@ -79,7 +79,7 @@ public: void stroke_draw(); void stroke_end(); void stroke_commit(); - void clear(const glm::vec4& color = { 1, 1, 1, 1 }); + void clear(const glm::vec4& color = { 1, 1, 1, 0 }); void snapshot_save(std::string data_path); void snapshot_restore(); void clear_context(); diff --git a/engine/layout.h b/engine/layout.h index 0d314e0..6b23ba5 100644 --- a/engine/layout.h +++ b/engine/layout.h @@ -651,9 +651,10 @@ public: on_click(this); break; default: + return kEventResult::Available; break; } - return m_mouse_inside ? kEventResult::Consumed : kEventResult::Available; + return kEventResult::Consumed; } }; @@ -1345,14 +1346,14 @@ public: LOG("template initted"); m_layers_container = find("layers-container"); LOG("template container found"); - for (int i = 0; i < 1; i++) - { - LOG("add layer"); - add_layer(); - } +// for (int i = 0; i < 1; i++) +// { +// LOG("add layer"); +// add_layer(); +// } LOG("find components"); - m_current_layer = m_layers[0]; - m_layers[0]->m_selected = true; +// m_current_layer = m_layers[0]; +// m_layers[0]->m_selected = true; btn_add = find("btn-add"); btn_remove = find("btn-remove"); btn_up = find("btn-up"); @@ -1360,6 +1361,8 @@ public: LOG("attach events"); btn_add->on_click = [this](Node*) { add_layer(); + if (on_layer_add) + on_layer_add(this); }; btn_remove->on_click = [this](Node*) { if (m_layers.size() == 1) @@ -1403,8 +1406,6 @@ public: l->on_selected = std::bind(&NodePanelLayer::handle_layer_selected, this, std::placeholders::_1); l->on_opacity_changed = std::bind(&NodePanelLayer::handle_layer_opacity, this, std::placeholders::_1, std::placeholders::_2); m_layers.push_back(l); - if (on_layer_add) - on_layer_add(this); } void remove_layer(NodeLayer* layer) { @@ -1886,16 +1887,16 @@ public: { m_mouse_ignore = false; m_canvas = std::make_unique(); - m_canvas->create(512, 512); - m_canvas->layer_add("asd"); - m_canvas->clear(); + m_canvas->create(1024, 1024); + //m_canvas->layer_add("asd"); + //m_canvas->clear(); m_sampler.create(); m_face_plane.create<1>(2, 2); } virtual void restore_context() override { Node::restore_context(); - m_canvas->create(512, 512); + m_canvas->create(1024, 1024); m_sampler.create(); //m_canvas->clear(); m_face_plane.create<1>(2, 2); @@ -1922,7 +1923,7 @@ public: glm::ivec4 c = (glm::ivec4)glm::vec4(box.x, (int)(vp[3] - box.y - box.w), box.z, box.w); glViewport(c.x, c.y, c.z, c.w); - m_canvas->m_cam_rot = m_pan * 0.001f; + m_canvas->m_cam_rot = m_pan * 0.003f; //glm::mat4 proj = glm::ortho(0.f, box.z, 0.f, box.w, -1000.f, 1000.f); glm::mat4 proj = glm::perspective(glm::radians(m_canvas->m_cam_fov), box.z / box.w, 0.1f, 1000.f); @@ -2064,8 +2065,8 @@ public: m_camera_fov = m_canvas->m_cam_fov; break; case kEventType::GestureMove: - m_pan = m_pan_start + ge->m_pos_delta * glm::vec2(-1, -1); - m_canvas->m_cam_fov = m_camera_fov - ge->m_distance_delta * .1f; + m_pan = m_pan_start + ge->m_pos_delta * glm::vec2(-1, -1) * 0.3f; + m_canvas->m_cam_fov = m_camera_fov - ge->m_distance_delta * .05f; //m_zoom_canvas = m_zoom_start + ge->m_distance_delta * .001f; break; default: