|
|
@ -83,153 +83,6 @@ static bool InitGraphicsDevice(void); // Initialize graphics device |
|
|
|
// Module Functions Definition: Window and Graphics Device |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
// Initialize window and OpenGL context |
|
|
|
// NOTE: data parameter could be used to pass any kind of required data to the initialization |
|
|
|
void InitWindow(int width, int height, const char *title) |
|
|
|
{ |
|
|
|
TRACELOG(LOG_INFO, "Initializing raylib %s", RAYLIB_VERSION); |
|
|
|
|
|
|
|
TRACELOG(LOG_INFO, "Supported raylib modules:"); |
|
|
|
TRACELOG(LOG_INFO, " > rcore:..... loaded (mandatory)"); |
|
|
|
TRACELOG(LOG_INFO, " > rlgl:...... loaded (mandatory)"); |
|
|
|
#if defined(SUPPORT_MODULE_RSHAPES) |
|
|
|
TRACELOG(LOG_INFO, " > rshapes:... loaded (optional)"); |
|
|
|
#else |
|
|
|
TRACELOG(LOG_INFO, " > rshapes:... not loaded (optional)"); |
|
|
|
#endif |
|
|
|
#if defined(SUPPORT_MODULE_RTEXTURES) |
|
|
|
TRACELOG(LOG_INFO, " > rtextures:. loaded (optional)"); |
|
|
|
#else |
|
|
|
TRACELOG(LOG_INFO, " > rtextures:. not loaded (optional)"); |
|
|
|
#endif |
|
|
|
#if defined(SUPPORT_MODULE_RTEXT) |
|
|
|
TRACELOG(LOG_INFO, " > rtext:..... loaded (optional)"); |
|
|
|
#else |
|
|
|
TRACELOG(LOG_INFO, " > rtext:..... not loaded (optional)"); |
|
|
|
#endif |
|
|
|
#if defined(SUPPORT_MODULE_RMODELS) |
|
|
|
TRACELOG(LOG_INFO, " > rmodels:... loaded (optional)"); |
|
|
|
#else |
|
|
|
TRACELOG(LOG_INFO, " > rmodels:... not loaded (optional)"); |
|
|
|
#endif |
|
|
|
#if defined(SUPPORT_MODULE_RAUDIO) |
|
|
|
TRACELOG(LOG_INFO, " > raudio:.... loaded (optional)"); |
|
|
|
#else |
|
|
|
TRACELOG(LOG_INFO, " > raudio:.... not loaded (optional)"); |
|
|
|
#endif |
|
|
|
|
|
|
|
// NOTE: Keep internal pointer to input title string (no copy) |
|
|
|
if ((title != NULL) && (title[0] != 0)) CORE.Window.title = title; |
|
|
|
|
|
|
|
// Initialize global input state |
|
|
|
memset(&CORE.Input, 0, sizeof(CORE.Input)); |
|
|
|
CORE.Input.Keyboard.exitKey = KEY_ESCAPE; |
|
|
|
CORE.Input.Mouse.scale = (Vector2){ 1.0f, 1.0f }; |
|
|
|
CORE.Input.Mouse.cursor = MOUSE_CURSOR_ARROW; |
|
|
|
CORE.Input.Gamepad.lastButtonPressed = 0; // GAMEPAD_BUTTON_UNKNOWN |
|
|
|
CORE.Window.eventWaiting = false; |
|
|
|
|
|
|
|
|
|
|
|
// TODO: Platform specific init window |
|
|
|
//-------------------------------------------------------------- |
|
|
|
CORE.Window.screen.width = width; |
|
|
|
CORE.Window.screen.height = height; |
|
|
|
CORE.Window.currentFbo.width = width; |
|
|
|
CORE.Window.currentFbo.height = height; |
|
|
|
|
|
|
|
// Initialize graphics device |
|
|
|
// NOTE: returns true if window and graphic device has been initialized successfully |
|
|
|
CORE.Window.ready = InitGraphicsDevice(width, height); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Initialize OpenGL context (states and resources) |
|
|
|
// NOTE: CORE.Window.currentFbo.width and CORE.Window.currentFbo.height not used, just stored as globals in rlgl |
|
|
|
rlglInit(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height); |
|
|
|
|
|
|
|
// Setup default viewport |
|
|
|
// NOTE: It updated CORE.Window.render.width and CORE.Window.render.height |
|
|
|
SetupViewport(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height); |
|
|
|
|
|
|
|
#if defined(SUPPORT_MODULE_RTEXT) && defined(SUPPORT_DEFAULT_FONT) |
|
|
|
// Load default font |
|
|
|
// WARNING: External function: Module required: rtext |
|
|
|
LoadFontDefault(); |
|
|
|
#if defined(SUPPORT_MODULE_RSHAPES) |
|
|
|
// Set font white rectangle for shapes drawing, so shapes and text can be batched together |
|
|
|
// WARNING: rshapes module is required, if not available, default internal white rectangle is used |
|
|
|
Rectangle rec = GetFontDefault().recs[95]; |
|
|
|
if (CORE.Window.flags & FLAG_MSAA_4X_HINT) |
|
|
|
{ |
|
|
|
// NOTE: We try to maxime rec padding to avoid pixel bleeding on MSAA filtering |
|
|
|
SetShapesTexture(GetFontDefault().texture, (Rectangle){ rec.x + 2, rec.y + 2, 1, 1 }); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// NOTE: We set up a 1px padding on char rectangle to avoid pixel bleeding |
|
|
|
SetShapesTexture(GetFontDefault().texture, (Rectangle){ rec.x + 1, rec.y + 1, rec.width - 2, rec.height - 2 }); |
|
|
|
} |
|
|
|
#endif |
|
|
|
#else |
|
|
|
#if defined(SUPPORT_MODULE_RSHAPES) |
|
|
|
// Set default texture and rectangle to be used for shapes drawing |
|
|
|
// NOTE: rlgl default texture is a 1x1 pixel UNCOMPRESSED_R8G8B8A8 |
|
|
|
Texture2D texture = { rlGetTextureIdDefault(), 1, 1, 1, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 }; |
|
|
|
SetShapesTexture(texture, (Rectangle){ 0.0f, 0.0f, 1.0f, 1.0f }); // WARNING: Module required: rshapes |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#if defined(SUPPORT_MODULE_RTEXT) && defined(SUPPORT_DEFAULT_FONT) |
|
|
|
if ((CORE.Window.flags & FLAG_WINDOW_HIGHDPI) > 0) |
|
|
|
{ |
|
|
|
// Set default font texture filter for HighDPI (blurry) |
|
|
|
// RL_TEXTURE_FILTER_LINEAR - tex filter: BILINEAR, no mipmaps |
|
|
|
rlTextureParameters(GetFontDefault().texture.id, RL_TEXTURE_MIN_FILTER, RL_TEXTURE_FILTER_LINEAR); |
|
|
|
rlTextureParameters(GetFontDefault().texture.id, RL_TEXTURE_MAG_FILTER, RL_TEXTURE_FILTER_LINEAR); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(SUPPORT_EVENTS_AUTOMATION) |
|
|
|
events = (AutomationEvent *)RL_CALLOC(MAX_CODE_AUTOMATION_EVENTS, sizeof(AutomationEvent)); |
|
|
|
CORE.Time.frameCounter = 0; |
|
|
|
#endif |
|
|
|
|
|
|
|
// Initialize random seed |
|
|
|
SetRandomSeed((unsigned int)time(NULL)); |
|
|
|
|
|
|
|
TRACELOG(LOG_INFO, "PLATFORM: CUSTOM: Application initialized successfully"); |
|
|
|
} |
|
|
|
|
|
|
|
// Close window and unload OpenGL context |
|
|
|
void CloseWindow(void) |
|
|
|
{ |
|
|
|
#if defined(SUPPORT_GIF_RECORDING) |
|
|
|
if (gifRecording) |
|
|
|
{ |
|
|
|
MsfGifResult result = msf_gif_end(&gifState); |
|
|
|
msf_gif_free(result); |
|
|
|
gifRecording = false; |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(SUPPORT_MODULE_RTEXT) && defined(SUPPORT_DEFAULT_FONT) |
|
|
|
UnloadFontDefault(); // WARNING: Module required: rtext |
|
|
|
#endif |
|
|
|
|
|
|
|
rlglClose(); // De-init rlgl |
|
|
|
|
|
|
|
// Platform specific close window |
|
|
|
//-------------------------------------------------------------- |
|
|
|
// TODO. |
|
|
|
//-------------------------------------------------------------- |
|
|
|
|
|
|
|
#if defined(SUPPORT_EVENTS_AUTOMATION) |
|
|
|
RL_FREE(events); |
|
|
|
#endif |
|
|
|
|
|
|
|
CORE.Window.ready = false; |
|
|
|
TRACELOG(LOG_INFO, "Window closed successfully"); |
|
|
|
} |
|
|
|
|
|
|
|
// Check if application should close |
|
|
|
bool WindowShouldClose(void) |
|
|
|
{ |
|
|
@ -503,27 +356,7 @@ void OpenURL(const char *url) |
|
|
|
if (strchr(url, '\'') != NULL) TRACELOG(LOG_WARNING, "SYSTEM: Provided URL could be potentially malicious, avoid [\'] character"); |
|
|
|
else |
|
|
|
{ |
|
|
|
JNIEnv *env = NULL; |
|
|
|
JavaVM *vm = platform.app->activity->vm; |
|
|
|
(*vm)->AttachCurrentThread(vm, &env, NULL); |
|
|
|
|
|
|
|
jstring urlString = (*env)->NewStringUTF(env, url); |
|
|
|
jclass uriClass = (*env)->FindClass(env, "android/net/Uri"); |
|
|
|
jmethodID uriParse = (*env)->GetStaticMethodID(env, uriClass, "parse", "(Ljava/lang/String;)Landroid/net/Uri;"); |
|
|
|
jobject uri = (*env)->CallStaticObjectMethod(env, uriClass, uriParse, urlString); |
|
|
|
|
|
|
|
jclass intentClass = (*env)->FindClass(env, "android/content/Intent"); |
|
|
|
jfieldID actionViewId = (*env)->GetStaticFieldID(env, intentClass, "ACTION_VIEW", "Ljava/lang/String;"); |
|
|
|
jobject actionView = (*env)->GetStaticObjectField(env, intentClass, actionViewId); |
|
|
|
jmethodID newIntent = (*env)->GetMethodID(env, intentClass, "<init>", "(Ljava/lang/String;Landroid/net/Uri;)V"); |
|
|
|
jobject intent = (*env)->AllocObject(env, intentClass); |
|
|
|
|
|
|
|
(*env)->CallVoidMethod(env, intent, newIntent, actionView, uri); |
|
|
|
jclass activityClass = (*env)->FindClass(env, "android/app/Activity"); |
|
|
|
jmethodID startActivity = (*env)->GetMethodID(env, activityClass, "startActivity", "(Landroid/content/Intent;)V"); |
|
|
|
(*env)->CallVoidMethod(env, platform.app->activity->clazz, startActivity, intent); |
|
|
|
|
|
|
|
(*vm)->DetachCurrentThread(vm); |
|
|
|
// TODO: |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|