diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index d743251..8ebb8c1 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -61,6 +61,7 @@ add_library( ../engine/node_canvas.cpp ../engine/node_checkbox.cpp ../engine/node_color_quad.cpp + ../engine/node_combobox.cpp ../engine/node_dialog_browse.cpp ../engine/node_dialog_cloud.cpp ../engine/node_dialog_open.cpp diff --git a/android/build.gradle b/android/build.gradle index f19e8eb..bb8220b 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -30,7 +30,7 @@ android { arguments '-DANDROID_PLATFORM=android-19', '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static', - '-DCMAKE_BUILD_TYPE=Debug', + '-DCMAKE_BUILD_TYPE=Release', '-DANDROID_ARM_NEON=TRUE' } } diff --git a/android/src/main/cpp/main.cpp b/android/src/main/cpp/main.cpp index 109339a..3f6dd87 100755 --- a/android/src/main/cpp/main.cpp +++ b/android/src/main/cpp/main.cpp @@ -118,7 +118,6 @@ int GetUnicodeChar(struct android_app* app, int eventType, int keyCode, int meta void android_async_lock(struct engine* engine) { pthread_mutex_lock(&engine->app->mutex); - LOG("lock"); eglMakeCurrent(engine->display, engine->surface, engine->surface, engine->context); } @@ -130,7 +129,6 @@ void android_async_swap(struct engine* engine) void android_async_unlock(struct engine* engine) { eglMakeCurrent(engine->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - LOG("unlock"); pthread_mutex_unlock(&engine->app->mutex); } diff --git a/engine.xcodeproj/project.pbxproj b/engine.xcodeproj/project.pbxproj index 9c19065..53523e9 100644 --- a/engine.xcodeproj/project.pbxproj +++ b/engine.xcodeproj/project.pbxproj @@ -149,6 +149,9 @@ AD58E0761E3421F2006ACC15 /* YGNodeList.c in Sources */ = {isa = PBXBuildFile; fileRef = AD58E0741E3421F2006ACC15 /* YGNodeList.c */; }; AD58E0771E3421F2006ACC15 /* Yoga.c in Sources */ = {isa = PBXBuildFile; fileRef = AD58E0751E3421F2006ACC15 /* Yoga.c */; }; AD58E0791E342205006ACC15 /* tinyxml2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD58E0781E342205006ACC15 /* tinyxml2.cpp */; }; + AD74030E1FB9D0C0004ACFCC /* node_combobox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD74030D1FB9D0C0004ACFCC /* node_combobox.cpp */; }; + AD74030F1FB9D0D3004ACFCC /* node_combobox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD74030D1FB9D0C0004ACFCC /* node_combobox.cpp */; }; + AD7403101FB9D0D4004ACFCC /* node_combobox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD74030D1FB9D0C0004ACFCC /* node_combobox.cpp */; }; AD744B6E1EBC9EF800B66E30 /* canvas_modes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD744B6C1EBC9EF700B66E30 /* canvas_modes.cpp */; }; AD759B681F2796EA00211963 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD759B671F2796EA00211963 /* OpenGLES.framework */; }; AD759B691F279B3900211963 /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD759B661F27964D00211963 /* GLKit.framework */; }; @@ -342,6 +345,8 @@ AD58E0741E3421F2006ACC15 /* YGNodeList.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = YGNodeList.c; path = libs/yoga/yoga/YGNodeList.c; sourceTree = ""; }; AD58E0751E3421F2006ACC15 /* Yoga.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Yoga.c; path = libs/yoga/yoga/Yoga.c; sourceTree = ""; }; AD58E0781E342205006ACC15 /* tinyxml2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tinyxml2.cpp; path = libs/tinyxml2/tinyxml2.cpp; sourceTree = ""; }; + AD74030C1FB9D0BF004ACFCC /* node_combobox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = node_combobox.h; sourceTree = ""; }; + AD74030D1FB9D0C0004ACFCC /* node_combobox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = node_combobox.cpp; sourceTree = ""; }; AD744B6C1EBC9EF700B66E30 /* canvas_modes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = canvas_modes.cpp; sourceTree = ""; }; AD744B6D1EBC9EF800B66E30 /* canvas_modes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = canvas_modes.h; sourceTree = ""; }; AD759B641F2793AE00211963 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk/System/Library/Frameworks/OpenGLES.framework; sourceTree = DEVELOPER_DIR; }; @@ -474,6 +479,8 @@ AD10635A1EC7ADFA002A525F /* node_checkbox.h */, AD10635B1EC7ADFA002A525F /* node_color_quad.cpp */, AD10635C1EC7ADFA002A525F /* node_color_quad.h */, + AD74030D1FB9D0C0004ACFCC /* node_combobox.cpp */, + AD74030C1FB9D0BF004ACFCC /* node_combobox.h */, ADBC8C471FAE7CC20094B339 /* node_dialog_browse.cpp */, ADBC8C491FAE7CC30094B339 /* node_dialog_browse.h */, ADBC8C521FAFD0370094B339 /* node_dialog_cloud.cpp */, @@ -828,6 +835,7 @@ ADE4911D1F86E65E00FB8E92 /* shapes.cc in Sources */, AD0E5CC51ECC72AD00C35669 /* node_panel_color.cpp in Sources */, AD0E5CD71ECC72AD00C35669 /* brush.cpp in Sources */, + AD7403101FB9D0D4004ACFCC /* node_combobox.cpp in Sources */, AD0E5CBE1ECC72AD00C35669 /* node_color_quad.cpp in Sources */, AD0E5CB51ECC72AD00C35669 /* YGNodeList.c in Sources */, AD0E5CE11ECC72AD00C35669 /* shape.cpp in Sources */, @@ -878,6 +886,7 @@ AD58E06F1E2A80BC006ACC15 /* shape.cpp in Sources */, AD58E0651E2A76FD006ACC15 /* shader.cpp in Sources */, AD4C08DA1E89BD0F0051D85F /* bezier.cpp in Sources */, + AD74030E1FB9D0C0004ACFCC /* node_combobox.cpp in Sources */, AD0E11991ECA20F200CDA6BB /* app_shaders.cpp in Sources */, ADBC8C531FAFD0370094B339 /* app_cloud.cpp in Sources */, ADD6AFDA1F94DEB900E92461 /* node_progress_bar.cpp in Sources */, @@ -931,6 +940,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + AD74030F1FB9D0D3004ACFCC /* node_combobox.cpp in Sources */, ADBC8C571FAFD05A0094B339 /* node_dialog_cloud.cpp in Sources */, ADD7D2951EBF9E1C00D5A897 /* bezier.cpp in Sources */, AD1063A21EC7AE92002A525F /* node_panel_brush.cpp in Sources */, diff --git a/engine/app.h b/engine/app.h index 169d08a..a334411 100644 --- a/engine/app.h +++ b/engine/app.h @@ -131,6 +131,7 @@ public: void download(std::string filename); void brush_update(); + void title_update(std::string name, int resolution); void cmd_convert(std::string pano_path, std::string out_path); }; diff --git a/engine/app_cloud.cpp b/engine/app_cloud.cpp index af94016..b058f9d 100644 --- a/engine/app_cloud.cpp +++ b/engine/app_cloud.cpp @@ -117,10 +117,9 @@ void App::cloud_browse() async_start(); canvas->reset_camera(); layers->clear(); - canvas->m_canvas->project_open(dialog->selected_path); + canvas->m_canvas->project_open_thread(dialog->selected_path); doc_name = dialog->selected_name; - if (auto docname = layout[main_id]->find("txt-docname")) - docname->set_text(("Panodoc: " + doc_name).c_str()); + title_update(doc_name, canvas->m_canvas->m_width); for (auto& i : canvas->m_canvas->m_order) layers->add_layer(canvas->m_canvas->m_layers[i].m_name.c_str()); dialog->destroy(); @@ -129,4 +128,4 @@ void App::cloud_browse() async_end(); }).detach(); }; -} \ No newline at end of file +} diff --git a/engine/app_dialogs.cpp b/engine/app_dialogs.cpp index a421653..ce6fd48 100644 --- a/engine/app_dialogs.cpp +++ b/engine/app_dialogs.cpp @@ -26,18 +26,18 @@ void App::dialog_newdoc() std::string path = data_path + "/" + name + ".pano"; auto action = [this, dialog, name] { + std::array resolutions{512, 1024, 1536, 2048}; + int res = resolutions[dialog->m_resolution->m_current_index]; doc_name = name; - if (auto docname = layout[main_id]->find("txt-docname")) - docname->set_text(("Panodoc: " + doc_name).c_str()); + title_update(name, res); - int res = atoi(dialog->m_resolution->labels[dialog->m_resolution->m_current_index].c_str()); layers->clear(); canvas->m_canvas->m_layers.clear(); canvas->m_canvas->m_order.clear(); canvas->m_canvas->resize(res, res); canvas->reset_camera(); ActionManager::clear(); - + canvas->m_canvas->layer_add("Default"); layers->add_layer("Default"); @@ -96,8 +96,7 @@ void App::dialog_open() canvas->m_canvas->project_open(dialog->selected_path, [this] { // on complete async_start(); - if (auto docname = layout[main_id]->find("txt-docname")) - docname->set_text(("Panodoc: " + doc_name).c_str()); + title_update(doc_name, canvas->m_canvas->m_width); for (auto& i : canvas->m_canvas->m_order) layers->add_layer(canvas->m_canvas->m_layers[i].m_name.c_str()); async_end(); @@ -131,8 +130,7 @@ void App::dialog_browse() canvas->m_canvas->project_open(dialog->selected_path, [this] { // on complete async_start(); - if (auto docname = layout[main_id]->find("txt-docname")) - docname->set_text(("Panodoc: " + doc_name).c_str()); + title_update(doc_name, canvas->m_canvas->m_width); for (auto& i : canvas->m_canvas->m_order) layers->add_layer(canvas->m_canvas->m_layers[i].m_name.c_str()); async_end(); @@ -168,8 +166,7 @@ void App::dialog_save_ver() } doc_name = next; - if (auto docname = layout[main_id]->find("txt-docname")) - docname->set_text(("Panodoc: " + doc_name).c_str()); + title_update(doc_name, canvas->m_canvas->m_width); canvas->m_canvas->project_save(data_path + "/" + next + ".pano"); } @@ -204,8 +201,7 @@ void App::dialog_save() auto action = [this, dialog, name, path] { doc_name = name; - if (auto docname = layout[main_id]->find("txt-docname")) - docname->set_text(("Panodoc: " + doc_name).c_str()); + title_update(doc_name, canvas->m_canvas->m_width); canvas->m_canvas->project_save(path); dialog->destroy(); App::I.hideKeyboard(); diff --git a/engine/app_layout.cpp b/engine/app_layout.cpp index dd00b68..3c477df 100644 --- a/engine/app_layout.cpp +++ b/engine/app_layout.cpp @@ -10,6 +10,14 @@ using namespace ui; static glm::vec4 color_button_normal{ .1, .1, .1, 1 }; static glm::vec4 color_button_hlight{ 1, .0, .0, 1 }; +void App::title_update(std::string name, int resolution) +{ + static char str[256]; + snprintf(str, 256, "Panodoc: %s (%dpx)", doc_name.c_str(), resolution); + if (auto docname = layout[main_id]->find("txt-docname")) + docname->set_text(str); +} + void App::init_toolbar_main() { diff --git a/engine/app_shaders.cpp b/engine/app_shaders.cpp index abfc61a..8ea5459 100644 --- a/engine/app_shaders.cpp +++ b/engine/app_shaders.cpp @@ -112,10 +112,8 @@ void App::initShaders() " case 3: return blend_colorDodge(base, stroke, alpha_tot);" "}}\n" "void main(){\n" - " mediump vec2 uv2 = gl_FragCoord.st / vec2(2048) * 20.0;\n" " mediump vec4 base = texture(tex, uv.xy);\n" " mediump vec4 stroke = texture(tex_stroke, uv.xy);\n" - " mediump float stencil = pow(texture(tex_stencil, uv2).r, 8.0);\n" " stroke.a = mask ? stroke.a * alpha * blur(tex_mask, uv.xy).r : stroke.a * alpha;\n" " if (!lock && base.a == 0.0) { frag = stroke; return; }\n" diff --git a/engine/canvas.cpp b/engine/canvas.cpp index 3a8a8fe..6ae0ed7 100644 --- a/engine/canvas.cpp +++ b/engine/canvas.cpp @@ -241,7 +241,7 @@ void ui::Canvas::stroke_draw() ShaderManager::use(ui::kShader::Stroke); ShaderManager::u_int(kShaderUniform::Tex, 0); // brush ShaderManager::u_int(kShaderUniform::TexBG, 1); // bg - ShaderManager::u_int(kShaderUniform::TexStencil, 3); // stencil + //ShaderManager::u_int(kShaderUniform::TexStencil, 3); // stencil ShaderManager::u_vec4(kShaderUniform::Col, m_brush.m_tip_color); ShaderManager::u_vec2(kShaderUniform::Resolution, { m_width, m_height }); //ShaderManager::u_vec2(kShaderUniform::StencilOffset, glm::vec2((rand()%1000)*0.001f, (rand()%1000)*0.001f)); @@ -682,8 +682,9 @@ void ui::Canvas::layer_merge(int source_idx, int dest_idx) // m_layer index ui::ShaderManager::u_int(kShaderUniform::Tex, 0); // dest ui::ShaderManager::u_int(kShaderUniform::TexStroke, 1); // source ui::ShaderManager::u_float(kShaderUniform::Alpha, 1); - ShaderManager::u_int(kShaderUniform::Lock, false); - ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f)); + ui::ShaderManager::u_int(kShaderUniform::Lock, false); + ui::ShaderManager::u_int(kShaderUniform::BlendMode, 0); // TODO: defaulted to normal, change to layer blend mode when implemented + ui::ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f)); glActiveTexture(GL_TEXTURE0); m_tex2[i].bind(); diff --git a/engine/canvas.h b/engine/canvas.h index 1ece906..4e8b1ff 100644 --- a/engine/canvas.h +++ b/engine/canvas.h @@ -9,7 +9,7 @@ NS_START -#define CANVAS_RES 2048 +#define CANVAS_RES 512 class Layer { diff --git a/engine/node_canvas.cpp b/engine/node_canvas.cpp index 2d0697d..dbdbb79 100644 --- a/engine/node_canvas.cpp +++ b/engine/node_canvas.cpp @@ -149,7 +149,7 @@ void NodeCanvas::draw() ui::ShaderManager::u_int(kShaderUniform::Tex, 0); ui::ShaderManager::u_int(kShaderUniform::TexStroke, 1); ui::ShaderManager::u_int(kShaderUniform::TexMask, 2); - ui::ShaderManager::u_int(kShaderUniform::TexStencil, 3); + //ui::ShaderManager::u_int(kShaderUniform::TexStencil, 3); ui::ShaderManager::u_float(kShaderUniform::Alpha, m_canvas->m_current_stroke->m_brush.m_tip_opacity); ui::ShaderManager::u_int(kShaderUniform::Lock, m_canvas->m_layers[m_canvas->m_current_layer_idx].m_alpha_locked); ui::ShaderManager::u_int(kShaderUniform::Mask, m_canvas->m_smask_active); diff --git a/engine/rtt.cpp b/engine/rtt.cpp index 25a4fca..8d103a9 100644 --- a/engine/rtt.cpp +++ b/engine/rtt.cpp @@ -60,7 +60,8 @@ bool RTT::create(int width, int height, int tex/* = -1*/, GLint internal_format) glBindTexture(GL_TEXTURE_2D, texID); if (tex == -1) - glTexImage2D(GL_TEXTURE_2D, 0, internal_format, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_2D, 0, internal_format, width, height, 0, GL_RGBA, + internal_format == GL_RGBA32F ? GL_FLOAT : GL_UNSIGNED_BYTE, 0); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); diff --git a/engine/texture.cpp b/engine/texture.cpp index 2aca1a7..ef1ea3d 100644 --- a/engine/texture.cpp +++ b/engine/texture.cpp @@ -46,7 +46,8 @@ bool Texture2D::create(int width, int height, GLint internal_format, GLint forma glGenTextures(1, &m_tex); //LOG("TEX create %d", m_tex); bind(); - glTexImage2D(GL_TEXTURE_2D, 0, internal_format, width, height, 0, format, GL_UNSIGNED_BYTE, data); + glTexImage2D(GL_TEXTURE_2D, 0, internal_format, width, height, 0, format, + internal_format == GL_RGBA32F ? GL_FLOAT : GL_UNSIGNED_BYTE, data); unbind(); return true; }