Stale GL_UNPACK state in gl4es and a missing pre-release GPU sync caused diagonal-banded corruption in the 3D view. Synthetic key press/release must track the real controller button or touch down/up edges, not fire together in one call - fixes a typed movement key sticking forever, then a follow-up that had silently broken A-button jump and on-screen keyboard arrow keys. Also adds force-rebuild.sh for the known stageEngine stale-cache issue.
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
// needs, compiled into the same "main" library as engine/ (see
|
||||
// android/engine-patches/01-android-shared-lib.patch's ANDROID_EXTRA_SOURCES)
|
||||
// - engine/ itself is never modified.
|
||||
#include <ctype.h>
|
||||
#include <jni.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@@ -20,17 +21,30 @@ Java_de_ladkau_questshock_QuestShockActivity_nativeChdir(JNIEnv *env, jclass cla
|
||||
}
|
||||
|
||||
// KeyboardOverlay's hand-built on-screen keyboard (see
|
||||
// KeyboardOverlay.commitPrintableChar()) has no real Android IME session
|
||||
// behind it, so printable characters can't reach the game via Android's
|
||||
// usual IME path - instead this builds and pushes an SDL_TEXTINPUT event
|
||||
// directly, the same event type/shape SDL's own Android backend pushes for
|
||||
// typed text, using only the public SDL_Event/SDL_PushEvent API. The
|
||||
// engine's pump_events() (sdl_events.c) only picks up printable characters
|
||||
// from this event, not from SDL_KEYDOWN (see handleKeyPress() in
|
||||
// KeyboardOverlay.java for why).
|
||||
// KeyboardOverlay.handleCharKeyDown()/handleCharKeyUp()) has no real
|
||||
// Android IME session behind it, so printable characters can't reach the
|
||||
// game via Android's usual IME path - instead this builds and pushes an
|
||||
// SDL_TEXTINPUT event directly, the same event type/shape SDL's own
|
||||
// Android backend pushes for typed text, using only the public
|
||||
// SDL_Event/SDL_PushEvent API. The engine's pump_events() (sdl_events.c)
|
||||
// only picks up printable characters from this event, not from
|
||||
// SDL_KEYDOWN.
|
||||
//
|
||||
// pump_events()'s SDL_TEXTINPUT handling sets sshockKeyStates[code] for
|
||||
// this character and only ever clears it again on a matching SDL_KEYUP.
|
||||
// Any character bound to a continuously-polled motion key (space -> jump,
|
||||
// w -> forward, etc., see MacSrc/Prefs.c's default keybinds.txt) is
|
||||
// polled every physics tick for as long as that state stays set, exactly
|
||||
// like a real held key - so nativeSendPrintableCharDown()/Up() are called
|
||||
// from the key button's own ACTION_DOWN/ACTION_UP (see
|
||||
// KeyboardOverlay.charKeyTouchListener()), not both at once: pushing the
|
||||
// release in the same call as the press would set and clear
|
||||
// sshockKeyStates[code] within a single pump_events() call, before the
|
||||
// game loop's poll (which runs once per frame, before pump_events - see
|
||||
// GameSrc/mainloop.c) ever has a chance to observe the press.
|
||||
JNIEXPORT void JNICALL
|
||||
Java_de_ladkau_questshock_KeyboardOverlay_nativeSendPrintableChar(JNIEnv *env, jclass clazz,
|
||||
jchar c) {
|
||||
Java_de_ladkau_questshock_KeyboardOverlay_nativeSendPrintableCharDown(JNIEnv *env, jclass clazz,
|
||||
jchar c) {
|
||||
SDL_Event event;
|
||||
SDL_zero(event);
|
||||
event.type = SDL_TEXTINPUT;
|
||||
@@ -41,6 +55,23 @@ Java_de_ladkau_questshock_KeyboardOverlay_nativeSendPrintableChar(JNIEnv *env, j
|
||||
SDL_PushEvent(&event);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_de_ladkau_questshock_KeyboardOverlay_nativeSendPrintableCharUp(JNIEnv *env, jclass clazz,
|
||||
jchar c) {
|
||||
SDL_Event releaseEvent;
|
||||
SDL_zero(releaseEvent);
|
||||
releaseEvent.type = SDL_KEYUP;
|
||||
releaseEvent.key.timestamp = SDL_GetTicks();
|
||||
releaseEvent.key.windowID = 0;
|
||||
releaseEvent.key.state = SDL_RELEASED;
|
||||
releaseEvent.key.repeat = 0;
|
||||
// SDL keycodes for printable characters are the character's own
|
||||
// (lowercased) byte value - see sdl_events.c's own comment on this.
|
||||
releaseEvent.key.keysym.sym = (SDL_Keycode)tolower((unsigned char)c);
|
||||
releaseEvent.key.keysym.mod = KMOD_NONE;
|
||||
SDL_PushEvent(&releaseEvent);
|
||||
}
|
||||
|
||||
// KeyboardOverlay's title-bar Close button - the keyboard is a fully
|
||||
// independent overlay quad from the menu launcher (see xr_overlay.h), so
|
||||
// this is the only way to hide it once it's open; the controller's menu
|
||||
|
||||
Reference in New Issue
Block a user