@@ -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 &>( | ||||