Merge branch 'master' of github.com:hrydgard/native

This commit is contained in:
Henrik Rydgard committed 2012-11-18 23:58:34 +01:00
commit d0328191ef
3 files changed
+88 -104

No files matched your search

+79 -69
View File
@@ -8,10 +8,10 @@
#include <unistd.h>
#include <string>
// TODO: Replace SDL with asound
#include "SDL/SDL.h"
#include "SDL/SDL_timer.h"
#include "SDL/SDL_audio.h"
// Our SDL does not support GLES2 so we will set this up with EGL
#include <EGL/egl.h>
#include <screen/screen.h>
#include <sys/platform.h>
@@ -28,14 +28,14 @@
#include "display.h"
// Blackberry specific
#include <bps/bps.h> // Blackberry Platform Services
#include <bps/screen.h> // Blackberry Window Manager
#include <bps/navigator.h> // Invoke Service
#include <bps/bps.h> // Blackberry Platform Services
#include <bps/screen.h> // Blackberry Window Manager
#include <bps/navigator.h> // Invoke Service
#include <bps/virtualkeyboard.h>// Keyboard Service
#include <sys/keycodes.h>
#include <bps/dialog.h> // Dialog Service (Toast=BB10)
#include <bps/dialog.h> // Dialog Service (Toast=BB10)
#ifdef BLACKBERRY10
#include <bps/vibration.h> // Vibrate Service (BB10)
#include <bps/vibration.h> // Vibrate Service (BB10)
#endif
EGLDisplay egl_disp;
@@ -94,41 +94,41 @@ void LaunchEmail(const char *email_address)
navigator_invoke((std::string("mailto:") + email_address).c_str(), &error);
}
const int buttonMappings[14] = {
KEYCODE_X, //A
KEYCODE_S, //B
KEYCODE_Z, //X
KEYCODE_A, //Y
KEYCODE_W, //LBUMPER
KEYCODE_Q, //RBUMPER
const int buttonMappings[18] = {
KEYCODE_X, //A
KEYCODE_S, //B
KEYCODE_Z, //X
KEYCODE_A, //Y
KEYCODE_W, //LBUMPER
KEYCODE_Q, //RBUMPER
KEYCODE_ONE, //START
KEYCODE_TWO, //SELECT
KEYCODE_UP, //UP
KEYCODE_UP, //UP
KEYCODE_DOWN, //DOWN
KEYCODE_LEFT, //LEFT
KEYCODE_RIGHT, //RIGHT
KEYCODE_M, //MENU
KEYCODE_M, //MENU
KEYCODE_BACKSPACE, //BACK
KEYCODE_I, //JOY UP
KEYCODE_K, //JOY DOWN
KEYCODE_J, //JOY LEFT
KEYCODE_L, //JOY RIGHT
};
void SimulateGamepad(const bool *keys, InputState *input) {
void SimulateGamepad(InputState *input) {
input->pad_buttons = 0;
input->pad_lstick_x = 0;
input->pad_lstick_y = 0;
input->pad_rstick_x = 0;
input->pad_rstick_y = 0;
for (int b = 0; b < 14; b++) {
if (keys[buttonMappings[b]])
input->pad_buttons |= (1<<b);
}
if (keys[KEYCODE_I])
if (input->pad_buttons | (1<<14))
input->pad_lstick_y=1;
else if (keys[KEYCODE_K])
else if (input->pad_buttons | (1<<15))
input->pad_lstick_y=-1;
if (keys[KEYCODE_J])
if (input->pad_buttons | (1<<16))
input->pad_lstick_x=-1;
else if (keys[KEYCODE_L])
else if (input->pad_buttons | (1<<17))
input->pad_lstick_x=1;
/*if (keys[SDLK_KP8])
input->pad_rstick_y=1;
@@ -140,14 +140,11 @@ void SimulateGamepad(const bool *keys, InputState *input) {
input->pad_rstick_x=1;*/
}
extern void mixaudio(void *userdata, Uint8 *stream, int len) {
NativeMix((short *)stream, len / 4);
}
int init_GLES2(screen_context_t ctx) {
int usage = SCREEN_USAGE_DISPLAY | SCREEN_USAGE_OPENGL_ES2;
int format = SCREEN_FORMAT_RGBA8888;
int num_configs;
const int intInterval = 0;
EGLint attrib_list[]= { EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
@@ -200,6 +197,7 @@ int init_GLES2(screen_context_t ctx) {
pixel_xres = screen_resolution[1];
}
}
screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_SWAP_INTERVAL, &intInterval);
screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, buffer_size);
screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_ROTATION, &angle);
@@ -242,6 +240,10 @@ void kill_GLES2() {
eglReleaseThread();
}
extern void mixaudio(void *userdata, Uint8 *stream, int len) {
NativeMix((short *)stream, len / 4);
}
int main(int argc, char *argv[]) {
static screen_context_t screen_cxt;
// Receive events from window manager
@@ -256,7 +258,14 @@ int main(int argc, char *argv[]) {
}
init_GLES2(screen_cxt);
// Playbook: 1024x600@7", Dev Alpha: 1280x768@4.2"
dp_xres = pixel_xres; dp_yres = pixel_yres;
#ifdef BLACKBERRY10
int dpi;
screen_get_display_property_iv(screen_disp, SCREEN_PROPERTY_DPI, &dpi);
float dpi_scale = 222.5f / dpi;
#else
float dpi_scale = 1.1f;
#endif
dp_xres = (int)(pixel_xres * dpi_scale); dp_yres = (int)(pixel_yres * dpi_scale);
NativeInit(argc, (const char **)argv, "data/", "/accounts/1000/shared", "BADCOFFEE");
NativeInitGraphics();
@@ -287,16 +296,17 @@ int main(int argc, char *argv[]) {
InputState input_state;
int framecount = 0;
bool nextFrameMD = 0;
float t = 0;
bool running = true;
bool* keys = new bool[1024];
while (running) {
// Handle Blackberry events
bps_event_t *event = NULL;
bps_get_event(&event, 0);
if (event) {
input_state.mouse_valid = false;
input_state.accelerometer_valid = false;
while (true) {
// Handle Blackberry events
bps_event_t *event = NULL;
bps_get_event(&event, 0);
if (event == NULL)
break; // Ran out of events
int domain = bps_event_get_domain(event);
if (domain == screen_get_domain()) {
int screen_val, buttons, pointerId;
@@ -304,65 +314,66 @@ int main(int argc, char *argv[]) {
screen_event_t screen_event = screen_event_get_event(event);
screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_TYPE,
&screen_val);
screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_SOURCE_POSITION,
pair);
screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_TOUCH_ID,
&pointerId);
screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_TYPE, &screen_val);
screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_SOURCE_POSITION, pair);
screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_TOUCH_ID, &pointerId);
input_state.mouse_valid = true;
switch(screen_val)
{
// Touchscreen
if (screen_val == SCREEN_EVENT_MTOUCH_TOUCH) {
input_state.pointer_x[pointerId] = pair[0];
input_state.pointer_y[pointerId] = pair[1];
case SCREEN_EVENT_MTOUCH_TOUCH:
input_state.pointer_x[pointerId] = pair[0] * dpi_scale;
input_state.pointer_y[pointerId] = pair[1] * dpi_scale;
input_state.pointer_down[pointerId] = true;
} else if (screen_val == SCREEN_EVENT_MTOUCH_MOVE) {
input_state.pointer_x[pointerId] = pair[0];
input_state.pointer_y[pointerId] = pair[1];
} else if (screen_val == SCREEN_EVENT_MTOUCH_RELEASE) {
input_state.pointer_x[pointerId] = pair[0];
input_state.pointer_y[pointerId] = pair[1];
break;
case SCREEN_EVENT_MTOUCH_MOVE:
input_state.pointer_x[pointerId] = pair[0] * dpi_scale;
input_state.pointer_y[pointerId] = pair[1] * dpi_scale;
break;
case SCREEN_EVENT_MTOUCH_RELEASE:
input_state.pointer_x[pointerId] = pair[0] * dpi_scale;
input_state.pointer_y[pointerId] = pair[1] * dpi_scale;
input_state.pointer_down[pointerId] = false;
break;
// Mouse, Simulator
} else if (screen_val == SCREEN_EVENT_POINTER) {
case SCREEN_EVENT_POINTER:
screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_BUTTONS,
&buttons);
if (buttons == SCREEN_LEFT_MOUSE_BUTTON) { // Down
input_state.pointer_x[pointerId] = pair[0];
input_state.pointer_y[pointerId] = pair[1];
input_state.pointer_x[pointerId] = pair[0] * dpi_scale;
input_state.pointer_y[pointerId] = pair[1] * dpi_scale;
input_state.pointer_down[pointerId] = true;
} else if (input_state.pointer_down[pointerId]) { // Up
input_state.pointer_x[pointerId] = pair[0];
input_state.pointer_y[pointerId] = pair[1];
input_state.pointer_x[pointerId] = pair[0] * dpi_scale;
input_state.pointer_y[pointerId] = pair[1] * dpi_scale;
input_state.pointer_down[pointerId] = false;
}
}
break;
// Keyboard
else if (screen_val == SCREEN_EVENT_KEYBOARD) {
case SCREEN_EVENT_KEYBOARD:
int flags, value;
screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_KEY_FLAGS, &flags);
screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_KEY_SYM, &value);
if (value < 1024 && value > 0 && (flags & KEY_SYM_VALID)) {
if (flags & KEY_DOWN)
keys[value] = true;
else
keys[value] = false;
if (flags & (KEY_DOWN | KEY_SYM_VALID)) {
for (int b = 0; b < 14; b++) {
if (value == buttonMappings[b])
input_state.pad_buttons |= (1<<b);
}
}
break;
}
} else if ((domain == navigator_get_domain())
&& (NAVIGATOR_EXIT == bps_event_get_code(event))) {
running = false;
}
}
input_state.accelerometer_valid = false;
input_state.mouse_valid = true;
// Maybe ask BPS if there's a USB/BT keyboard attached and show settings to configure
SimulateGamepad(keys, &input_state);
SimulateGamepad(&input_state);
UpdateInputState(&input_state);
NativeUpdate(input_state);
NativeRender();
EndInputState(&input_state);
if (framecount % 60 == 0) {
@@ -380,7 +391,6 @@ int main(int argc, char *argv[]) {
t = time_now();
framecount++;
}
delete[] keys;
screen_stop_events(screen_cxt);
bps_shutdown();
+4 -30
View File
@@ -131,33 +131,6 @@ std::string getFileExtension(const std::string &fn) {
size_t getFilesInDir(const char *directory, std::vector<FileInfo> *files, const char *filter) {
size_t foundEntries = 0;
#ifdef BLACKBERRY
// WORKAROUND: Other implementation will crash on Blackberry (all versions).
struct dirent dirent, *result = NULL;
DIR *dirp = opendir(directory);
if (!dirp)
return 0;
while (!readdir_r(dirp, &dirent, &result) && result) {
const std::string filename = result->d_name;
if (filename[0] == '.')
continue;
FileInfo info;
info.name = filename;
info.fullName = std::string(directory) + "/" + info.name;
info.isDirectory = isDirectory(info.fullName);
if (!info.isDirectory) {
const char* ext = strrchr(result->d_name, '.');
if (ext && strstr(filter, ext+1) == NULL)
continue;
}
files->push_back(info);
}
closedir(dirp);
#else
std::set<std::string> filters;
std::string tmp;
if (filter) {
@@ -188,13 +161,15 @@ size_t getFilesInDir(const char *directory, std::vector<FileInfo> *files, const
{
const std::string virtualName(ffd.cFileName);
#else
struct dirent dirent, *result = NULL;
struct dirent_large { struct dirent entry; char padding[FILENAME_MAX+1]; };
struct dirent_large diren;
struct dirent *result = NULL;
DIR *dirp = opendir(directory);
if (!dirp)
return 0;
// non windows loop
while (!readdir_r(dirp, &dirent, &result) && result)
while (!readdir_r(dirp, (dirent*) &diren, &result) && result)
{
const std::string virtualName(result->d_name);
#endif
@@ -229,7 +204,6 @@ size_t getFilesInDir(const char *directory, std::vector<FileInfo> *files, const
}
closedir(dirp);
#endif
#endif // Blackberry workaround
std::sort(files->begin(), files->end());
return foundEntries;
}
+5 -5
View File
@@ -36,14 +36,14 @@ void UIUpdateMouse(int i, float x, float y, bool down) {
} else {
uistate.mousepressed[i] = 0;
}
uistate.mousex[i] = x;
uistate.mousey[i] = y;
uistate.mousedown[i] = down;
if (uistate.mousedown[i])
uistate.mouseframesdown[i]++;
else
uistate.mouseframesdown[i] = 0;
uistate.mousex[i] = x;
uistate.mousey[i] = y;
uistate.mousedown[i] = down;
}
void UIReset() {
@@ -286,7 +286,7 @@ void UIList::pointerMove(int pointer, float x, float y) {
inertiaY = 0.8 * inertiaY + 0.2 * -deltaY;
}
if (movedDistanceY > 10 && !scrolling && uistate.mouseframesdown[0] > holdFrames) {
if (movedDistanceY > 15 && !scrolling && uistate.mouseframesdown[0] > holdFrames) {
scrolling = true;
}
}