| @@ -1,3 +1,5 @@ | |||||
| # -*- coding: utf-8 -*- | |||||
| # vi:syntax=python | |||||
| # | # | ||||
| # Define these variables from the beginning | # Define these variables from the beginning | ||||
| @@ -99,7 +101,6 @@ all-local-android: $(foreach p, $(PROGRAMS:%$(EXEEXT)=%), .$(p).androidstamp) | |||||
| cp "$(lol_srcdir)/build/android/icon.png" "$(d)/res/drawable/" | cp "$(lol_srcdir)/build/android/icon.png" "$(d)/res/drawable/" | ||||
| $(MKDIR_P) "$(d)/libs/armeabi" | $(MKDIR_P) "$(d)/libs/armeabi" | ||||
| $(LN_S) "$(abs_builddir)/$(p)$(EXEEXT)" "$(d)/libs/armeabi/lib$(p).so" | $(LN_S) "$(abs_builddir)/$(p)$(EXEEXT)" "$(d)/libs/armeabi/lib$(p).so" | ||||
| $(LN_S) "$${ANDROID_NDK_ROOT}/sources/cxx-stl/stlport/libs/armeabi/libstlport_shared.so" "$(d)/libs/armeabi" | |||||
| android update project -t android-19 -n "$(p)" -p "$(d)" | android update project -t android-19 -n "$(p)" -p "$(d)" | ||||
| ant debug -f "$(d)/build.xml" | ant debug -f "$(d)/build.xml" | ||||
| touch $@ | touch $@ | ||||
| @@ -223,11 +223,12 @@ configure() | |||||
| do_configure --host=armv7-apple-darwin10 CPPFLAGS="$CPPFLAGS" LDFLAGS="$LDFLAGS" CC="$CC" CXX="$CXX" | do_configure --host=armv7-apple-darwin10 CPPFLAGS="$CPPFLAGS" LDFLAGS="$LDFLAGS" CC="$CC" CXX="$CXX" | ||||
| ;; | ;; | ||||
| android-arm) | android-arm) | ||||
| CPPFLAGS="$CPPFLAGS -Wno-psabi -I$ANDROID_NDK_ROOT/sources/cxx-stl/stlport/stlport -I$ANDROID_NDK_ROOT/sources/android/native_app_glue -fpic -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64" | |||||
| CFLAGS="$CFLAGS -march=armv5te -mtune=xscale -msoft-float -mthumb" | |||||
| CXXFLAGS="$CXXFLAGS -march=armv5te -mtune=xscale -msoft-float -mthumb -fno-rtti -fno-exceptions" | |||||
| LOL_LIBS="$LOL_LIBS -L$ANDROID_NDK_ROOT/sources/cxx-stl/stlport/libs/armeabi -lstlport_shared -lm -fpic -XCClinker -shared -u ANativeActivity_onCreate" | |||||
| PKG_CONFIG_PATH="$PKG_CONFIG_PATH" do_configure --host=arm-linux-androideabi ac_cv_exeext=.so CPPFLAGS="$CPPFLAGS" CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" LDFLAGS="$LDFLAGS" LOL_LIBS="$LOL_LIBS" | |||||
| CPPFLAGS="$CPPFLAGS -I$ANDROID_NDK_ROOT/sources/android/native_app_glue -fpic -fomit-frame-pointer -fno-strict-aliasing" | |||||
| CFLAGS="$CFLAGS" | |||||
| CXXFLAGS="$CXXFLAGS" | |||||
| LOL_LIBS="$LOL_LIBS -lm -fpic -XCClinker -shared -u ANativeActivity_onCreate" | |||||
| HOST=armv7a-linux-androideabi27 | |||||
| PKG_CONFIG_PATH="$PKG_CONFIG_PATH" do_configure --host="$HOST" CC="$HOST-clang" CXX="$HOST-clang++" ac_cv_exeext=.so CPPFLAGS="$CPPFLAGS" CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" LDFLAGS="$LDFLAGS" LOL_LIBS="$LOL_LIBS" | |||||
| # FIXME: is this needed? | # FIXME: is this needed? | ||||
| # ant debug | # ant debug | ||||
| # ant debug install | # ant debug install | ||||
| @@ -92,7 +92,7 @@ private: | |||||
| void HandleCommand(int32_t cmd); | void HandleCommand(int32_t cmd); | ||||
| int32_t HandleInput(AInputEvent* event); | int32_t HandleInput(AInputEvent* event); | ||||
| vec2 m_prev_pos; | |||||
| ivec2 m_prev_pos; | |||||
| EGLDisplay m_display; | EGLDisplay m_display; | ||||
| EGLSurface m_surface; | EGLSurface m_surface; | ||||
| @@ -160,7 +160,7 @@ void lol::AndroidAppData::DrawFrame() | |||||
| if (!m_display) | if (!m_display) | ||||
| return; | return; | ||||
| Ticker::tick_draw(); | |||||
| ticker::tick_draw(); | |||||
| eglSwapBuffers(m_display, m_surface); | eglSwapBuffers(m_display, m_surface); | ||||
| } | } | ||||
| @@ -206,19 +206,20 @@ int32_t lol::AndroidAppData::HandleInput(AInputEvent* event) | |||||
| AMotionEvent_getY(event, 0)); | AMotionEvent_getY(event, 0)); | ||||
| pos *= m_wanted_resolution / Video::GetSize(); | pos *= m_wanted_resolution / Video::GetSize(); | ||||
| pos.y = m_wanted_resolution.y - 1 - pos.y; | pos.y = m_wanted_resolution.y - 1 - pos.y; | ||||
| mouse->internal_set_cursor(0, vec2(pos) / vec2(m_wanted_resolution), pos); | |||||
| // FIXME: bring this back | |||||
| //mouse->internal_set_cursor(0, vec2(pos) / vec2(m_wanted_resolution), pos); | |||||
| // Note: 100.0f is an arbitrary value that makes it feel about the same than an xbox controller joystick | // Note: 100.0f is an arbitrary value that makes it feel about the same than an xbox controller joystick | ||||
| mouse->internal_set_axis(0, (pos.x - m_prev_pos.x) / max_screen_size * 100.f); | |||||
| mouse->internal_set_axis(input::axis::X, (pos.x - m_prev_pos.x) / max_screen_size * 100.f); | |||||
| // Unlike SDL, no need to negate Y axis | // Unlike SDL, no need to negate Y axis | ||||
| mouse->internal_set_axis(1, (pos.y - m_prev_pos.y) / max_screen_size * -100.f); | |||||
| mouse->internal_set_axis(input::axis::Y, (pos.y - m_prev_pos.y) / max_screen_size * -100.f); | |||||
| m_prev_pos = pos; | m_prev_pos = pos; | ||||
| switch (AKeyEvent_getAction(event) & AMOTION_EVENT_ACTION_MASK) | switch (AKeyEvent_getAction(event) & AMOTION_EVENT_ACTION_MASK) | ||||
| { | { | ||||
| case AMOTION_EVENT_ACTION_DOWN: | case AMOTION_EVENT_ACTION_DOWN: | ||||
| mouse->internal_set_key(0, true); | |||||
| mouse->internal_set_button(input::button::BTN_Left, true); | |||||
| break; | break; | ||||
| case AMOTION_EVENT_ACTION_UP: | case AMOTION_EVENT_ACTION_UP: | ||||
| mouse->internal_set_key(0, false); | |||||
| mouse->internal_set_button(input::button::BTN_Left, false); | |||||
| break; | break; | ||||
| } | } | ||||
| return 1; | return 1; | ||||
| @@ -341,7 +342,7 @@ lol::AndroidApp::AndroidApp(char const *title, ivec2 res, float fps) | |||||
| { | { | ||||
| /* Launch our ticker */ | /* Launch our ticker */ | ||||
| msg::debug("Java layer initialising ticker at %g fps", fps); | msg::debug("Java layer initialising ticker at %g fps", fps); | ||||
| Ticker::Setup(fps); | |||||
| ticker::setup(fps); | |||||
| m_data->m_wanted_resolution = res; | m_data->m_wanted_resolution = res; | ||||
| } | } | ||||
| @@ -376,7 +377,7 @@ void lol::AndroidApp::Tick() | |||||
| /* Check if we are exiting */ | /* Check if we are exiting */ | ||||
| if (m_data->m_native_app->destroyRequested != 0) | if (m_data->m_native_app->destroyRequested != 0) | ||||
| Ticker::Shutdown(); | |||||
| ticker::Shutdown(); | |||||
| } | } | ||||
| m_data->DrawFrame(); | m_data->DrawFrame(); | ||||
| @@ -73,7 +73,8 @@ class ApplicationDisplayData | |||||
| protected: | protected: | ||||
| #if __ANDROID__ | #if __ANDROID__ | ||||
| //NOT HANDLED YET | |||||
| // TODO: implement this | |||||
| null_display display; | |||||
| #elif __NX__ | #elif __NX__ | ||||
| nx::app_display display; | nx::app_display display; | ||||
| #elif LOL_USE_SDL | #elif LOL_USE_SDL | ||||
| @@ -68,7 +68,7 @@ ResourceCodecData* AndroidImageCodec::Load(std::string const &path) | |||||
| #if !LOL_BUILD_RELEASE | #if !LOL_BUILD_RELEASE | ||||
| msg::error("JVM environment not found, cannot open image %s\n", path.c_str()); | msg::error("JVM environment not found, cannot open image %s\n", path.c_str()); | ||||
| #endif | #endif | ||||
| return false; | |||||
| return nullptr; | |||||
| } | } | ||||
| jclass cls = env->GetObjectClass(g_activity->clazz); | jclass cls = env->GetObjectClass(g_activity->clazz); | ||||
| jmethodID mid; | jmethodID mid; | ||||
| @@ -83,32 +83,34 @@ ResourceCodecData* AndroidImageCodec::Load(std::string const &path) | |||||
| #if !LOL_BUILD_RELEASE | #if !LOL_BUILD_RELEASE | ||||
| msg::error("could not load %s\n", path.c_str()); | msg::error("could not load %s\n", path.c_str()); | ||||
| #endif | #endif | ||||
| return false; | |||||
| return nullptr; | |||||
| } | } | ||||
| env->NewGlobalRef(m_bmp); | env->NewGlobalRef(m_bmp); | ||||
| /* Get image dimensions */ | |||||
| // Get image dimensions | |||||
| mid = env->GetMethodID(cls, "getWidth", "(Landroid/graphics/Bitmap;)I"); | mid = env->GetMethodID(cls, "getWidth", "(Landroid/graphics/Bitmap;)I"); | ||||
| m_size.x = env->CallIntMethod(g_activity->clazz, mid, m_bmp); | |||||
| int width = env->CallIntMethod(g_activity->clazz, mid, m_bmp); | |||||
| mid = env->GetMethodID(cls, "getHeight", "(Landroid/graphics/Bitmap;)I"); | mid = env->GetMethodID(cls, "getHeight", "(Landroid/graphics/Bitmap;)I"); | ||||
| m_size.y = env->CallIntMethod(g_activity->clazz, mid, m_bmp); | |||||
| int height = env->CallIntMethod(g_activity->clazz, mid, m_bmp); | |||||
| ivec2 size(width, height); | |||||
| auto data = new ResourceImageData(new image(size)); | |||||
| /* Get pixels */ | |||||
| m_array = env->NewIntArray(m_size.x * m_size.y); | |||||
| // Get pixels | |||||
| m_array = env->NewIntArray(size.x * size.y); | |||||
| env->NewGlobalRef(m_array); | env->NewGlobalRef(m_array); | ||||
| mid = env->GetMethodID(cls, "getPixels", "(Landroid/graphics/Bitmap;[I)V"); | mid = env->GetMethodID(cls, "getPixels", "(Landroid/graphics/Bitmap;[I)V"); | ||||
| env->CallVoidMethod(g_activity->clazz, mid, m_bmp, m_array); | env->CallVoidMethod(g_activity->clazz, mid, m_bmp, m_array); | ||||
| m_pixels = env->GetIntArrayElements(m_array, 0); | m_pixels = env->GetIntArrayElements(m_array, 0); | ||||
| for (int n = 0; n < m_size.x * m_size.y; n++) | |||||
| for (int n = 0; n < size.x * size.y; n++) | |||||
| { | { | ||||
| uint32_t u = m_pixels[n]; | uint32_t u = m_pixels[n]; | ||||
| u = (u & 0xff00ff00) | ((u & 0xff0000) >> 16) | ((u & 0xff) << 16); | u = (u & 0xff00ff00) | ((u & 0xff0000) >> 16) | ((u & 0xff) << 16); | ||||
| m_pixels[n] = u; | m_pixels[n] = u; | ||||
| } | } | ||||
| m_format = PixelFormat::RGBA_8; | |||||
| return new ResourceCodecData(); | |||||
| return data; | |||||
| } | } | ||||
| bool AndroidImageCodec::Save(std::string const &path, ResourceCodecData* data) | bool AndroidImageCodec::Save(std::string const &path, ResourceCodecData* data) | ||||
| @@ -116,6 +118,7 @@ bool AndroidImageCodec::Save(std::string const &path, ResourceCodecData* data) | |||||
| UNUSED(path, data); | UNUSED(path, data); | ||||
| /* TODO: unimplemented */ | /* TODO: unimplemented */ | ||||
| return false; | |||||
| } | } | ||||
| bool AndroidImageCodec::Close() | bool AndroidImageCodec::Close() | ||||
| @@ -113,7 +113,7 @@ public: | |||||
| } | } | ||||
| /* Additional constructor if ptrdiff_t != int */ | /* Additional constructor if ptrdiff_t != int */ | ||||
| template<typename T2 = std::enable_if<!std::is_same<ptrdiff_t, int>::value, int>::type> | |||||
| template<typename T2 = int, typename T3 = typename std::enable_if<!std::is_same<ptrdiff_t, T2>::value, int>::type> | |||||
| inline arraynd(vec_t<T2, N> sizes, element_t e = element_t()) | inline arraynd(vec_t<T2, N> sizes, element_t e = element_t()) | ||||
| { | { | ||||
| m_sizes = vec_t<ptrdiff_t, N>(sizes); | m_sizes = vec_t<ptrdiff_t, N>(sizes); | ||||
| @@ -152,7 +152,7 @@ public: | |||||
| /* If int != ptrdiff_t, access elements directly using an ivec2, | /* If int != ptrdiff_t, access elements directly using an ivec2, | ||||
| * ivec3 etc. */ | * ivec3 etc. */ | ||||
| template<typename T2 = std::enable_if<!std::is_same<ptrdiff_t, int>::value, int>::type> | |||||
| template<typename T2 = int, typename T3 = typename std::enable_if<!std::is_same<ptrdiff_t, T2>::value, int>::type> | |||||
| inline element_t const & operator[](vec_t<T2, N> const &pos) const | inline element_t const & operator[](vec_t<T2, N> const &pos) const | ||||
| { | { | ||||
| ptrdiff_t n = pos[N - 1]; | ptrdiff_t n = pos[N - 1]; | ||||
| @@ -161,7 +161,7 @@ public: | |||||
| return super::operator[](n); | return super::operator[](n); | ||||
| } | } | ||||
| template<typename T2 = std::enable_if<!std::is_same<ptrdiff_t, int>::value, int>::type> | |||||
| template<typename T2 = int, typename T3 = typename std::enable_if<!std::is_same<ptrdiff_t, T2>::value, int>::type> | |||||
| inline element_t & operator[](vec_t<T2, N> const &pos) | inline element_t & operator[](vec_t<T2, N> const &pos) | ||||
| { | { | ||||
| return const_cast<element_t &>( | return const_cast<element_t &>( | ||||