|
@@ -67,6 +67,13 @@ static AndroidInputHandler *input_handler = nullptr;
|
|
static GodotJavaWrapper *godot_java = nullptr;
|
|
static GodotJavaWrapper *godot_java = nullptr;
|
|
static GodotIOJavaWrapper *godot_io_java = nullptr;
|
|
static GodotIOJavaWrapper *godot_io_java = nullptr;
|
|
|
|
|
|
|
|
+enum StartupStep {
|
|
|
|
+ STEP_TERMINATED = -1,
|
|
|
|
+ STEP_SETUP,
|
|
|
|
+ STEP_SHOW_LOGO,
|
|
|
|
+ STEP_STARTED
|
|
|
|
+};
|
|
|
|
+
|
|
static SafeNumeric<int> step; // Shared between UI and render threads
|
|
static SafeNumeric<int> step; // Shared between UI and render threads
|
|
|
|
|
|
static Size2 new_size;
|
|
static Size2 new_size;
|
|
@@ -76,7 +83,7 @@ static Vector3 magnetometer;
|
|
static Vector3 gyroscope;
|
|
static Vector3 gyroscope;
|
|
|
|
|
|
static void _terminate(JNIEnv *env, bool p_restart = false) {
|
|
static void _terminate(JNIEnv *env, bool p_restart = false) {
|
|
- step.set(-1); // Ensure no further steps are attempted and no further events are sent
|
|
|
|
|
|
+ step.set(STEP_TERMINATED); // Ensure no further steps are attempted and no further events are sent
|
|
|
|
|
|
// lets cleanup
|
|
// lets cleanup
|
|
// Unregister android plugins
|
|
// Unregister android plugins
|
|
@@ -203,7 +210,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_resize(JNIEnv *env, j
|
|
os_android->set_display_size(Size2i(p_width, p_height));
|
|
os_android->set_display_size(Size2i(p_width, p_height));
|
|
|
|
|
|
// No need to reset the surface during startup
|
|
// No need to reset the surface during startup
|
|
- if (step.get() > 0) {
|
|
|
|
|
|
+ if (step.get() > STEP_SETUP) {
|
|
if (p_surface) {
|
|
if (p_surface) {
|
|
ANativeWindow *native_window = ANativeWindow_fromSurface(env, p_surface);
|
|
ANativeWindow *native_window = ANativeWindow_fromSurface(env, p_surface);
|
|
os_android->set_native_window(native_window);
|
|
os_android->set_native_window(native_window);
|
|
@@ -216,7 +223,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_resize(JNIEnv *env, j
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *env, jclass clazz, jobject p_surface) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *env, jclass clazz, jobject p_surface) {
|
|
if (os_android) {
|
|
if (os_android) {
|
|
- if (step.get() == 0) {
|
|
|
|
|
|
+ if (step.get() == STEP_SETUP) {
|
|
// During startup
|
|
// During startup
|
|
if (p_surface) {
|
|
if (p_surface) {
|
|
ANativeWindow *native_window = ANativeWindow_fromSurface(env, p_surface);
|
|
ANativeWindow *native_window = ANativeWindow_fromSurface(env, p_surface);
|
|
@@ -230,7 +237,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *en
|
|
}
|
|
}
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_back(JNIEnv *env, jclass clazz) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_back(JNIEnv *env, jclass clazz) {
|
|
- if (step.get() == 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -244,20 +251,26 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ttsCallback(JNIEnv *e
|
|
}
|
|
}
|
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, jclass clazz) {
|
|
JNIEXPORT jboolean JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, jclass clazz) {
|
|
- if (step.get() == -1) {
|
|
|
|
|
|
+ if (step.get() == STEP_TERMINATED) {
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- if (step.get() == 0) {
|
|
|
|
|
|
+ if (step.get() == STEP_SETUP) {
|
|
// Since Godot is initialized on the UI thread, main_thread_id was set to that thread's id,
|
|
// Since Godot is initialized on the UI thread, main_thread_id was set to that thread's id,
|
|
// but for Godot purposes, the main thread is the one running the game loop
|
|
// but for Godot purposes, the main thread is the one running the game loop
|
|
- Main::setup2();
|
|
|
|
|
|
+ Main::setup2(false); // The logo is shown in the next frame otherwise we run into rendering issues
|
|
input_handler = new AndroidInputHandler();
|
|
input_handler = new AndroidInputHandler();
|
|
step.increment();
|
|
step.increment();
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- if (step.get() == 1) {
|
|
|
|
|
|
+ if (step.get() == STEP_SHOW_LOGO) {
|
|
|
|
+ Main::setup_boot_logo();
|
|
|
|
+ step.increment();
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (step.get() == STEP_STARTED) {
|
|
if (Main::start() != EXIT_SUCCESS) {
|
|
if (Main::start() != EXIT_SUCCESS) {
|
|
return true; // should exit instead and print the error
|
|
return true; // should exit instead and print the error
|
|
}
|
|
}
|
|
@@ -283,7 +296,7 @@ JNIEXPORT jboolean JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env,
|
|
|
|
|
|
// Called on the UI thread
|
|
// Called on the UI thread
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchMouseEvent(JNIEnv *env, jclass clazz, jint p_event_type, jint p_button_mask, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y, jboolean p_double_click, jboolean p_source_mouse_relative, jfloat p_pressure, jfloat p_tilt_x, jfloat p_tilt_y) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchMouseEvent(JNIEnv *env, jclass clazz, jint p_event_type, jint p_button_mask, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y, jboolean p_double_click, jboolean p_source_mouse_relative, jfloat p_pressure, jfloat p_tilt_x, jfloat p_tilt_y) {
|
|
- if (step.get() <= 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -292,7 +305,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchMouseEvent(JN
|
|
|
|
|
|
// Called on the UI thread
|
|
// Called on the UI thread
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchTouchEvent(JNIEnv *env, jclass clazz, jint ev, jint pointer, jint pointer_count, jfloatArray position, jboolean p_double_tap) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchTouchEvent(JNIEnv *env, jclass clazz, jint ev, jint pointer, jint pointer_count, jfloatArray position, jboolean p_double_tap) {
|
|
- if (step.get() <= 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -313,7 +326,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchTouchEvent(JN
|
|
|
|
|
|
// Called on the UI thread
|
|
// Called on the UI thread
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnify(JNIEnv *env, jclass clazz, jfloat p_x, jfloat p_y, jfloat p_factor) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnify(JNIEnv *env, jclass clazz, jfloat p_x, jfloat p_y, jfloat p_factor) {
|
|
- if (step.get() <= 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
input_handler->process_magnify(Point2(p_x, p_y), p_factor);
|
|
input_handler->process_magnify(Point2(p_x, p_y), p_factor);
|
|
@@ -321,7 +334,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnify(JNIEnv *env,
|
|
|
|
|
|
// Called on the UI thread
|
|
// Called on the UI thread
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_pan(JNIEnv *env, jclass clazz, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_pan(JNIEnv *env, jclass clazz, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y) {
|
|
- if (step.get() <= 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
input_handler->process_pan(Point2(p_x, p_y), Vector2(p_delta_x, p_delta_y));
|
|
input_handler->process_pan(Point2(p_x, p_y), Vector2(p_delta_x, p_delta_y));
|
|
@@ -329,7 +342,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_pan(JNIEnv *env, jcla
|
|
|
|
|
|
// Called on the UI thread
|
|
// Called on the UI thread
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joybutton(JNIEnv *env, jclass clazz, jint p_device, jint p_button, jboolean p_pressed) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joybutton(JNIEnv *env, jclass clazz, jint p_device, jint p_button, jboolean p_pressed) {
|
|
- if (step.get() <= 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -344,7 +357,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joybutton(JNIEnv *env
|
|
|
|
|
|
// Called on the UI thread
|
|
// Called on the UI thread
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyaxis(JNIEnv *env, jclass clazz, jint p_device, jint p_axis, jfloat p_value) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyaxis(JNIEnv *env, jclass clazz, jint p_device, jint p_axis, jfloat p_value) {
|
|
- if (step.get() <= 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -359,7 +372,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyaxis(JNIEnv *env,
|
|
|
|
|
|
// Called on the UI thread
|
|
// Called on the UI thread
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyhat(JNIEnv *env, jclass clazz, jint p_device, jint p_hat_x, jint p_hat_y) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyhat(JNIEnv *env, jclass clazz, jint p_device, jint p_hat_x, jint p_hat_y) {
|
|
- if (step.get() <= 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -396,7 +409,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyconnectionchanged(
|
|
|
|
|
|
// Called on the UI thread
|
|
// Called on the UI thread
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_key(JNIEnv *env, jclass clazz, jint p_physical_keycode, jint p_unicode, jint p_key_label, jboolean p_pressed, jboolean p_echo) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_key(JNIEnv *env, jclass clazz, jint p_physical_keycode, jint p_unicode, jint p_key_label, jboolean p_pressed, jboolean p_echo) {
|
|
- if (step.get() <= 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
input_handler->process_key_event(p_physical_keycode, p_unicode, p_key_label, p_pressed, p_echo);
|
|
input_handler->process_key_event(p_physical_keycode, p_unicode, p_key_label, p_pressed, p_echo);
|
|
@@ -419,7 +432,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_gyroscope(JNIEnv *env
|
|
}
|
|
}
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusin(JNIEnv *env, jclass clazz) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusin(JNIEnv *env, jclass clazz) {
|
|
- if (step.get() <= 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -427,7 +440,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusin(JNIEnv *env,
|
|
}
|
|
}
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusout(JNIEnv *env, jclass clazz) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusout(JNIEnv *env, jclass clazz) {
|
|
- if (step.get() <= 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -516,7 +529,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_requestPermissionResu
|
|
}
|
|
}
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_onRendererResumed(JNIEnv *env, jclass clazz) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_onRendererResumed(JNIEnv *env, jclass clazz) {
|
|
- if (step.get() <= 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -528,7 +541,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_onRendererResumed(JNI
|
|
}
|
|
}
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_onRendererPaused(JNIEnv *env, jclass clazz) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_onRendererPaused(JNIEnv *env, jclass clazz) {
|
|
- if (step.get() <= 0) {
|
|
|
|
|
|
+ if (step.get() <= STEP_SETUP) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|