diff --git a/Android.mk b/Android.mk index c1debdd761..1db8a9688e 100644 --- a/Android.mk +++ b/Android.mk @@ -26,7 +26,8 @@ LOCAL_SRC_FILES :=\ file/file_util.cpp \ file/zip_read.cpp \ json/json_writer.cpp \ - math/math_util.cpp.arm \ + math/curves.cpp \ + math/math_util.cpp \ math/lin/aabb.cpp.arm \ math/lin/plane.cpp.arm \ math/lin/quat.cpp.arm \ @@ -51,7 +52,7 @@ LOCAL_SRC_FILES :=\ util/random/perlin.cpp -LOCAL_CFLAGS := -O2 -DGL_GLEXT_PROTOTYPES -fsigned-char +LOCAL_CFLAGS := -O2 -DGL_GLEXT_PROTOTYPES -fsigned-char -fno-strict-aliasing LOCAL_CPPFLAGS := -fno-exceptions -fno-rtti -std=gnu++0x LOCAL_LDLIBS := -lz LOCAL_C_INCLUDES := $(LOCAL_PATH)/ext/libzip diff --git a/android/app-android.cpp b/android/app-android.cpp index 78addc789c..d9c31ffd05 100644 --- a/android/app-android.cpp +++ b/android/app-android.cpp @@ -203,9 +203,12 @@ extern "C" void Java_com_turboviking_libnative_NativeRenderer_displayResize(JNIE extern "C" void Java_com_turboviking_libnative_NativeRenderer_displayRender(JNIEnv *env, jobject obj) { if (renderer_inited) { UpdateInputState(&input_state); - NativeUpdate(input_state); + { + lock_guard guard(input_state.lock); + NativeUpdate(input_state); + EndInputState(&input_state); + } NativeRender(); - EndInputState(&input_state); time_update(); } else { ELOG("Ended up in nativeRender even though app has quit.%s", ""); @@ -266,6 +269,7 @@ extern "C" void JNICALL Java_com_turboviking_libnative_NativeApp_touch extern "C" void Java_com_turboviking_libnative_NativeApp_keyDown (JNIEnv *, jclass, jint key) { ILOG("Keydown %i", key); + lock_guard guard(input_state.lock); // Need a mechanism to release these. switch (key) { case 1: // Back @@ -282,7 +286,8 @@ extern "C" void Java_com_turboviking_libnative_NativeApp_keyDown extern "C" void Java_com_turboviking_libnative_NativeApp_keyUp (JNIEnv *, jclass, jint key) { - ILOG("Keyup %i", key); + ILOG("Keyup %i", key); + lock_guard guard(input_state.lock); // Need a mechanism to release these. switch (key) { case 1: // Back diff --git a/file/file_util.cpp b/file/file_util.cpp index 3331b55e28..2cc447f087 100644 --- a/file/file_util.cpp +++ b/file/file_util.cpp @@ -78,6 +78,9 @@ static void stripTailDirSlashes(std::string &fname) // Returns true if file filename exists bool exists(const std::string &filename) { +#ifdef _WIN32 + return GetFileAttributes(filename.c_str()) != 0xFFFFFFFF; +#else struct stat64 file_info; std::string copy(filename); @@ -86,11 +89,15 @@ bool exists(const std::string &filename) int result = stat64(copy.c_str(), &file_info); return (result == 0); +#endif } // Returns true if filename is a directory bool isDirectory(const std::string &filename) { +#ifdef _WIN32 + return (GetFileAttributes(filename.c_str()) & FILE_ATTRIBUTE_DIRECTORY) != 0; +#else struct stat64 file_info; std::string copy(filename); @@ -104,6 +111,7 @@ bool isDirectory(const std::string &filename) } return S_ISDIR(file_info.st_mode); +#endif } size_t getFilesInDir(const char *directory, std::vector *files) { diff --git a/gfx_es2/draw_buffer.cpp b/gfx_es2/draw_buffer.cpp index d433917c55..9c3069bff5 100644 --- a/gfx_es2/draw_buffer.cpp +++ b/gfx_es2/draw_buffer.cpp @@ -158,7 +158,7 @@ inline void rot(float *v, float angle, float xc, float yc) { } -void DrawBuffer::DrawImageRotated(int atlas_image, float x, float y, float scale, float angle, Color color) { +void DrawBuffer::DrawImageRotated(int atlas_image, float x, float y, float scale, float angle, Color color, bool mirror_h) { const AtlasImage &image = atlas->images[atlas_image]; float w = (float)image.w * scale; float h = (float)image.h * scale; @@ -174,13 +174,20 @@ void DrawBuffer::DrawImageRotated(int atlas_image, float x, float y, float scale {x2, y2}, {x1, y2}, }; + float u1 = image.u1; + float u2 = image.u2; + if (mirror_h) { + float temp = u1; + u1 = u2; + u2 = temp; + } const float uv[6][2] = { - {image.u1, image.v1}, - {image.u2, image.v1}, - {image.u2, image.v2}, - {image.u1, image.v1}, - {image.u2, image.v2}, - {image.u1, image.v2}, + {u1, image.v1}, + {u2, image.v1}, + {u2, image.v2}, + {u1, image.v1}, + {u2, image.v2}, + {u1, image.v2}, }; for (int i = 0; i < 6; i++) { rot(v[i], angle, x, y); diff --git a/gfx_es2/draw_buffer.h b/gfx_es2/draw_buffer.h index c62458ade3..66f7b23072 100644 --- a/gfx_es2/draw_buffer.h +++ b/gfx_es2/draw_buffer.h @@ -94,7 +94,7 @@ public: void MeasureImage(int atlas_image, float *w, float *h); void DrawImage(int atlas_image, float x, float y, float scale, Color color = COLOR(0xFFFFFF), int align = ALIGN_TOPLEFT); void DrawImageStretch(int atlas_image, float x1, float y1, float x2, float y2, Color color = COLOR(0xFFFFFF)); - void DrawImageRotated(int atlas_image, float x, float y, float scale, float angle, Color color = COLOR(0xFFFFFF)); // Always centers + void DrawImageRotated(int atlas_image, float x, float y, float scale, float angle, Color color = COLOR(0xFFFFFF), bool mirror_h = false); // Always centers void DrawTexRect(float x1, float y1, float x2, float y2, float u1, float v1, float u2, float v2, Color color); // Results in 18 triangles. Kind of expensive for a button. void DrawImage4Grid(int atlas_image, float x1, float y1, float x2, float y2, Color color = COLOR(0xFFFFFF), float corner_scale = 1.0); diff --git a/ui/virtual_input.cpp b/ui/virtual_input.cpp index 953073f83e..3d789be092 100644 --- a/ui/virtual_input.cpp +++ b/ui/virtual_input.cpp @@ -4,8 +4,8 @@ #include "input/input_state.h" #include "virtual_input.h" -TouchButton::TouchButton(const Atlas *atlas, int imageIndex, int overlayImageIndex, int button, int rotationAngle) - : atlas_(atlas), imageIndex_(imageIndex), overlayImageIndex_(overlayImageIndex), button_(button) +TouchButton::TouchButton(const Atlas *atlas, int imageIndex, int overlayImageIndex, int button, int rotationAngle, bool mirror_h) + : atlas_(atlas), imageIndex_(imageIndex), overlayImageIndex_(overlayImageIndex), button_(button), mirror_h_(mirror_h) { memset(pointerDown, 0, sizeof(pointerDown)); w_ = atlas_->images[imageIndex_].w; @@ -29,20 +29,19 @@ void TouchButton::update(InputState &input_state) } } -void TouchButton::draw(DrawBuffer &db) +void TouchButton::draw(DrawBuffer &db, uint32_t color) { - uint32_t color = 0xAAFFFFFF; float scale = 1.0f; if (isDown_) { - color = 0xFFFFFFFF; + color |= 0xFF000000; scale = 2.0f; } - db.DrawImageRotated(imageIndex_, x_ + w_/2, y_ + h_/2, scale, rotationAngle_, color); + // We only mirror background + db.DrawImageRotated(imageIndex_, x_ + w_/2, y_ + h_/2, scale, rotationAngle_, color, mirror_h_); if (overlayImageIndex_ != -1) db.DrawImageRotated(overlayImageIndex_, x_ + w_/2, y_ + h_/2, scale, rotationAngle_, color); } - TouchStick::TouchStick(const Atlas *atlas, int bgImageIndex, int stickImageIndex, int stick) : atlas_(atlas), bgImageIndex_(bgImageIndex), stickImageIndex_(stickImageIndex), stick_(stick) { @@ -78,9 +77,9 @@ void TouchStick::update(InputState &input_state) } } -void TouchStick::draw(DrawBuffer &db) +void TouchStick::draw(DrawBuffer &db, uint32_t color) { if (bgImageIndex_ != -1) - db.DrawImage(bgImageIndex_, stick_x_, stick_y_, 1.0f, 0xFFFFFFFF, ALIGN_CENTER); - db.DrawImage(stickImageIndex_, stick_x_ + stick_delta_x_, stick_y_ + stick_delta_y_, 1.0f, 0xFFFFFFFF, ALIGN_CENTER); + db.DrawImage(bgImageIndex_, stick_x_, stick_y_, 1.0f, color, ALIGN_CENTER); + db.DrawImage(stickImageIndex_, stick_x_ + stick_delta_x_, stick_y_ + stick_delta_y_, 1.0f, color, ALIGN_CENTER); } diff --git a/ui/virtual_input.h b/ui/virtual_input.h index ee336ab6b5..ec38dded46 100644 --- a/ui/virtual_input.h +++ b/ui/virtual_input.h @@ -5,14 +5,15 @@ class DrawBuffer; // Multitouch-enabled emulation of a hardware button. +// Many of these can be pressed simultaneously with multitouch. // (any finger will work, simultaneously with other virtual button/stick actions). class TouchButton { public: - TouchButton(const Atlas *atlas, int imageIndex, int overlayImageIndex, int button, int rotationAngle = 0); + TouchButton(const Atlas *atlas, int imageIndex, int overlayImageIndex, int button, int rotationAngle = 0, bool mirror_h = false); void update(InputState &input_state); - void draw(DrawBuffer &db); + void draw(DrawBuffer &db, uint32_t color); void setPos(float x, float y) { x_ = x - w_ / 2; @@ -32,6 +33,7 @@ private: int overlayImageIndex_; int button_; float rotationAngle_; + bool mirror_h_; float x_, y_; float w_; @@ -45,6 +47,7 @@ private: // Multi-touch enabled virtual joystick +// Many of these can be used simultaneously with multitouch. // (any finger will work, simultaneously with other virtual button/stick actions). class TouchStick { @@ -52,7 +55,7 @@ public: TouchStick(const Atlas *atlas, int bgImageIndex, int stickImageIndex, int stick); void update(InputState &input_state); - void draw(DrawBuffer &db); + void draw(DrawBuffer &db, uint32_t color); void setPos(float x, float y) { stick_x_ = x;