From 675e0148ecad4716c676c0c6ac7e5904c2035ad7 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Tue, 28 Mar 2017 20:25:23 +0100 Subject: [PATCH] integrate and link lib curl for android, add VAO support for brush draw, sync canvas with screen redraw instead of input events --- .gitmodules | 3 + android/CMakeLists.txt | 4 +- android/src/main/AndroidManifest.xml | 3 +- android/src/main/cpp/main.cpp | 3 +- engine.vcxproj | 4 -- engine.vcxproj.filters | 4 -- engine/app.cpp | 4 ++ engine/brush.h | 83 +++++++++++++++++++++------- engine/canvas.h | 5 ++ engine/font.cpp | 4 ++ libs/curl-android-ios | 1 + 11 files changed, 85 insertions(+), 33 deletions(-) create mode 160000 libs/curl-android-ios diff --git a/.gitmodules b/.gitmodules index d8c60c7..c64e3f4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "libs/glew-2.0.0"] path = libs/glew-2.0.0 url = https://omigamedev@bitbucket.org/omigamedev/libglew-2.0.0.git +[submodule "libs/curl-android-ios"] + path = libs/curl-android-ios + url = https://github.com/gcesarmza/curl-android-ios diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index 04daf4a..6bad1b6 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -46,7 +46,7 @@ target_include_directories(native-lib PRIVATE ../libs/tinyxml2 ../libs/yoga ../libs/stb - ../libs/curl/android/include + ../libs/curl-android-ios/prebuilt-with-ssl/android/include ) # add lib dependencies @@ -54,7 +54,7 @@ target_link_libraries( native-lib android app-glue - ${CMAKE_SOURCE_DIR}/../libs/curl/android/armeabi-v7a/libcurl.a + ${CMAKE_SOURCE_DIR}/../libs/curl-android-ios/prebuilt-with-ssl/android/armeabi-v7a/libcurl.a EGL GLESv3 log diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 6b366e4..f8b0f92 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -12,7 +12,8 @@ + android:screenOrientation="sensorLandscape" + android:noHistory="true"> diff --git a/android/src/main/cpp/main.cpp b/android/src/main/cpp/main.cpp index 6dfcdfd..c28a950 100755 --- a/android/src/main/cpp/main.cpp +++ b/android/src/main/cpp/main.cpp @@ -257,6 +257,7 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) { case APP_CMD_TERM_WINDOW: // The window is being hidden or closed, clean it up. engine_term_display(engine); + exit(0); break; case APP_CMD_GAINED_FOCUS: // When our app gains focus, we start monitoring the accelerometer. @@ -326,7 +327,7 @@ void android_main(struct android_app* state) { app_dummy(); LOG("NETWORK TESTING..."); - curl_test(); + //curl_test(); LOG("NETWORK TESTED"); memset(&engine, 0, sizeof(engine)); diff --git a/engine.vcxproj b/engine.vcxproj index f65b811..2ec798f 100644 --- a/engine.vcxproj +++ b/engine.vcxproj @@ -205,10 +205,6 @@ - - - - diff --git a/engine.vcxproj.filters b/engine.vcxproj.filters index 9ff653e..9f8558c 100644 --- a/engine.vcxproj.filters +++ b/engine.vcxproj.filters @@ -114,8 +114,4 @@ Header Files - - - - \ No newline at end of file diff --git a/engine/app.cpp b/engine/app.cpp index ee8098f..2fb52f3 100644 --- a/engine/app.cpp +++ b/engine/app.cpp @@ -487,6 +487,10 @@ void App::init() void App::update(float dt) { + // update offscreen stuff + if (canvas && canvas->m_canvas) + canvas->m_canvas->stroke_draw(); + glClearColor(.1f, .1f, .1f, 1.f); glViewport(0, 0, (GLsizei)width, (GLsizei)height); glClear(GL_COLOR_BUFFER_BIT); diff --git a/engine/brush.h b/engine/brush.h index 7896134..ed2afa1 100644 --- a/engine/brush.h +++ b/engine/brush.h @@ -34,6 +34,7 @@ class BrushMesh public: ui::Shader shader; GLuint buffers[3]{ 0 }; + GLuint vao{ 0 }; struct vertex_t { glm::vec4 pos; glm::vec2 uvs; }; struct instance_t { glm::mat4 mvp; float flow; }; int loc_flow; @@ -95,21 +96,60 @@ public: loc_flow = shader.GetAttribLocation("a_flow"); loc_mvp = shader.GetAttribLocation("a_mvp"); - + +#if USE_VBO + glGenVertexArrays(1, &vao); + if (!vao) + return false; + glBindVertexArray(vao); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); + glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (GLvoid*)offsetof(vertex_t, pos)); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (GLvoid*)offsetof(vertex_t, uvs)); + glBindBuffer(GL_ARRAY_BUFFER, buffers[2]); + // Loop over each column of the matrix... + for (int i = 0; i < 4; i++) + { + // Set up the vertex attribute + glVertexAttribPointer(loc_mvp + i, 4, GL_FLOAT, GL_FALSE, sizeof(instance_t), + (GLvoid*)(offsetof(instance_t, mvp) + sizeof(glm::vec4) * i)); + // Enable it + glEnableVertexAttribArray(loc_mvp + i); + // Make it instanced + glVertexAttribDivisor(loc_mvp + i, 1); + } + glEnableVertexAttribArray(loc_flow); + glVertexAttribPointer(loc_flow, 1, GL_FLOAT, GL_FALSE, sizeof(instance_t), + (GLvoid*)offsetof(instance_t, flow)); + glVertexAttribDivisor(loc_flow, 1); + glBindVertexArray(0); +#endif + return true; } void draw(const std::vector& samples, const glm::mat4& proj) { - std::vector attributes; - attributes.reserve(samples.size()); - for (const auto& s : samples) - { - auto mvp = proj * - glm::translate(glm::vec3(s.pos, 0)) * - glm::scale(glm::vec3(s.size, s.size, 1)) * - glm::eulerAngleZ(s.angle); - attributes.emplace_back(instance_t{ mvp, s.flow }); - } + std::vector attributes; + attributes.reserve(samples.size()); + for (const auto& s : samples) + { + auto mvp = proj * + glm::translate(glm::vec3(s.pos, 0)) * + glm::scale(glm::vec3(s.size, s.size, 1)) * + glm::eulerAngleZ(s.angle); + attributes.emplace_back(instance_t{ mvp, s.flow }); + } +#ifdef USE_VBO + glBindBuffer(GL_ARRAY_BUFFER, buffers[2]); + glBufferData(GL_ARRAY_BUFFER, (int)(sizeof(instance_t) * attributes.size()), attributes.data(), GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glBindVertexArray(vao); + glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0, (int)samples.size()); + glBindVertexArray(0); +#else glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); @@ -124,16 +164,16 @@ public: glBindBuffer(GL_ARRAY_BUFFER, buffers[2]); glBufferData(GL_ARRAY_BUFFER, (int)(sizeof(instance_t) * attributes.size()), attributes.data(), GL_STATIC_DRAW); // Loop over each column of the matrix... - for (int i = 0; i < 4; i++) - { - // Set up the vertex attribute - glVertexAttribPointer(loc_mvp + i, 4, GL_FLOAT, GL_FALSE, sizeof(instance_t), - (GLvoid*)(offsetof(instance_t, mvp) + sizeof(glm::vec4) * i)); - // Enable it - glEnableVertexAttribArray(loc_mvp + i); - // Make it instanced - glVertexAttribDivisor(loc_mvp + i, 1); - } + for (int i = 0; i < 4; i++) + { + // Set up the vertex attribute + glVertexAttribPointer(loc_mvp + i, 4, GL_FLOAT, GL_FALSE, sizeof(instance_t), + (GLvoid*)(offsetof(instance_t, mvp) + sizeof(glm::vec4) * i)); + // Enable it + glEnableVertexAttribArray(loc_mvp + i); + // Make it instanced + glVertexAttribDivisor(loc_mvp + i, 1); + } glEnableVertexAttribArray(loc_flow); glVertexAttribPointer(loc_flow, 1, GL_FLOAT, GL_FALSE, sizeof(instance_t), (GLvoid*)offsetof(instance_t, flow)); @@ -150,6 +190,7 @@ public: glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); +#endif // USE_VBO } }; diff --git a/engine/canvas.h b/engine/canvas.h index 86c134f..1279edf 100644 --- a/engine/canvas.h +++ b/engine/canvas.h @@ -57,6 +57,11 @@ public: void stroke_update(glm::vec2 point, float pressure) { m_current_stroke->add_point(point, pressure); + } + void stroke_draw() + { + if (!(m_current_stroke && m_current_stroke->has_sample())) + return; m_fb.bindFramebuffer(); diff --git a/engine/font.cpp b/engine/font.cpp index 9cdfa20..10ecddc 100644 --- a/engine/font.cpp +++ b/engine/font.cpp @@ -16,7 +16,11 @@ bool Font::load(const char* ttf, int font_size) auto bitmap = std::make_unique(w*h); chars.resize(num_chars); int ret = stbtt_BakeFontBitmap(file.m_data, 0, (float)font_size, bitmap.get(), w, h, start_char, num_chars, chars.data()); +#ifdef __APPLE__ font_tex.create(w, h, GL_RED, bitmap.get()); +#else + font_tex.create(w, h, GL_LUMINANCE, bitmap.get()); +#endif // __APPLE__ file.close(); return true; } diff --git a/libs/curl-android-ios b/libs/curl-android-ios new file mode 160000 index 0000000..d4b60d3 --- /dev/null +++ b/libs/curl-android-ios @@ -0,0 +1 @@ +Subproject commit d4b60d3fe0711cbffec3c0d3dccdaf852643bb65