diff options
| author | Ray <[email protected]> | 2020-02-03 18:31:30 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-02-03 18:31:30 +0100 |
| commit | 40b73a8a91afb26becfcb39560dae73447ce15af (patch) | |
| tree | c00df37c9488649f694304149b45043165128b71 /src/core.c | |
| parent | 6f3c99a295533e41de3049db5e683d15fd5c6e1a (diff) | |
| download | raylib-40b73a8a91afb26becfcb39560dae73447ce15af.tar.gz raylib-40b73a8a91afb26becfcb39560dae73447ce15af.zip | |
Develop branch integration (#1091)
* [core] REDESIGNED: Implement global context
* [rlgl] REDESIGNED: Implement global context
* Reviewed globals for Android
* Review Android globals usage
* Update Android globals
* Bump raylib version to 3.0 !!!
* [raudio] REDESIGNED: Implement global context
* [raudio] Reorder functions
* [core] Tweaks on descriptions
* Issues with SUPPORT_MOUSE_GESTURES
* [camera] Use global context
* REDESIGN: Move shapes drawing texture/rec to RLGL context
* Review some issues on standalone mode
* Update to use global context
* [GAME] Upload RE-PAIR game from GGJ2020 -WIP-
* Update game: RE-PAIR
* [utils] TRACELOG macros proposal
* Update config.h
Diffstat (limited to 'src/core.c')
| -rw-r--r-- | src/core.c | 1541 |
1 files changed, 778 insertions, 763 deletions
@@ -116,7 +116,7 @@ #if !defined(EXTERNAL_CONFIG_FLAGS) #include "config.h" // Defines module configuration flags #else - #define RAYLIB_VERSION "2.6-dev" + #define RAYLIB_VERSION "3.0" #endif #if (defined(__linux__) || defined(PLATFORM_WEB)) && _POSIX_C_SOURCE < 199309L @@ -317,134 +317,132 @@ typedef struct{ } KeyEventFifo; #endif -//---------------------------------------------------------------------------------- -// Global Variables Definition -//---------------------------------------------------------------------------------- -// Window/Graphics variables -//----------------------------------------------------------------------------------- +typedef struct { int x; int y; } Point; +typedef struct { int width; int height; } Size; + +#if defined(PLATFORM_UWP) +extern EGLNativeWindowType handle; // Native window handler for UWP (external, defined in UWP App) +#endif + +typedef struct CoreData { + struct { #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) -static GLFWwindow *window; // Native window (graphic device) + GLFWwindow *handle; // Native window handle (graphic device) #endif #if defined(PLATFORM_RPI) -static EGL_DISPMANX_WINDOW_T window; // Native window (graphic device) -#endif -#if defined(PLATFORM_UWP) -extern EGLNativeWindowType uwpWindow; // Native window handler for UWP (external, defined in UWP App) + // NOTE: RPI4 does not support Dispmanx anymore, system should be redesigned + EGL_DISPMANX_WINDOW_T handle; // Native window handle (graphic device) #endif #if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_UWP) -static EGLDisplay display; // Native display device (physical screen connection) -static EGLSurface surface; // Surface to draw on, framebuffers (connected to context) -static EGLContext context; // Graphic context, mode in which drawing can be done -static EGLConfig config; // Graphic config -static uint64_t baseTime = 0; // Base time measure for hi-res timer -static bool windowShouldClose = false; // Flag to set window for closing -#endif - -static const char *windowTitle = NULL; // Window text title... -static bool windowReady = false; // Check if window has been initialized successfully -static bool windowMinimized = false; // Check if window has been minimized -static bool windowResized = false; // Check if window has been resized -static bool fullscreenMode = false; // Check if fullscreen mode (useful only for PLATFORM_DESKTOP) -static bool alwaysRun = false; // Keep window update/draw running on minimized - -static int windowPositionX, windowPositionY; // Window position on screen (required on fullscreen toggle) -static int displayWidth, displayHeight; // Display width and height (monitor, device-screen, LCD, ...) -static int screenWidth, screenHeight; // Screen width and height (used render area) -static int renderWidth, renderHeight; // Framebuffer width and height (render area, including black bars if required) -static int currentWidth, currentHeight; // Current render width and height, it could change on BeginTextureMode() -static int renderOffsetX = 0; // Offset X from render area (must be divided by 2) -static int renderOffsetY = 0; // Offset Y from render area (must be divided by 2) -static Matrix screenScaling = { 0 }; // Matrix to scale screen (framebuffer rendering) -//----------------------------------------------------------------------------------- + EGLDisplay device; // Native display device (physical screen connection) + EGLSurface surface; // Surface to draw on, framebuffers (connected to context) + EGLContext context; // Graphic context, mode in which drawing can be done + EGLConfig config; // Graphic config +#endif + unsigned int flags; // Configuration flags (bit based) + const char *title; // Window text title const pointer + bool ready; // Flag to check if window has been initialized successfully + bool minimized; // Flag to check if window has been minimized + bool resized; // Flag to check if window has been resized + bool fullscreen; // Flag to check if fullscreen mode required + bool alwaysRun; // Flag to keep window update/draw running on minimized + bool shouldClose; // Flag to set window for closing + + Point position; // Window position on screen (required on fullscreen toggle) + Size display; // Display width and height (monitor, device-screen, LCD, ...) + Size screen; // Screen width and height (used render area) + Size currentFbo; // Current render width and height, it could change on BeginTextureMode() + Size render; // Framebuffer width and height (render area, including black bars if required) + Point renderOffset; // Offset from render area (must be divided by 2) + Matrix screenScale; // Matrix to scale screen (framebuffer rendering) + + char **dropFilesPath; // Store dropped files paths as strings + int dropFilesCount; // Count dropped files strings + } Window; #if defined(PLATFORM_ANDROID) -static struct android_app *androidApp; // Android activity -static struct android_poll_source *source; // Android events polling source -static int ident, events; // Android ALooper_pollAll() variables -static const char *internalDataPath = NULL; // Android internal data path to write data (/data/data/<package>/files) - -static bool appEnabled = true; // Used to detec if app is active -static bool contextRebindRequired = false; // Used to know context rebind required + struct { + bool appEnabled; // Flag to detect if app is active ** = true + struct android_app *app; // Android activity + struct android_poll_source *source; // Android events polling source + const char *internalDataPath; // Android internal data path to write data (/data/data/<package>/files) + bool contextRebindRequired; // Used to know context rebind required + } Android; +#endif + struct { +#if defined(PLATFORM_RPI) + InputEventWorker eventWorker[10]; // List of worker threads for every monitored "/dev/input/event<N>" #endif + struct { + int exitKey; // Default exit key + char currentKeyState[512]; // Registers current frame key state + char previousKeyState[512]; // Registers previous frame key state -// Input system variables -//----------------------------------------------------------------------------------- -// Keyboard states -static char previousKeyState[512] = { 0 }; // Registers previous frame key state -static char currentKeyState[512] = { 0 }; // Registers current frame key state -static int exitKey = KEY_ESCAPE; // Default exit key (ESC) - -static unsigned int keyPressedQueue[MAX_CHARS_QUEUE] = { 0 }; // Input characters queue -static int keyPressedQueueCount = 0; // Input characters queue count - + int keyPressedQueue[MAX_CHARS_QUEUE]; // Input characters queue + int keyPressedQueueCount; // Input characters queue count #if defined(PLATFORM_RPI) -// NOTE: For keyboard we will use the standard input (but reconfigured...) -static struct termios defaultKeyboardSettings; // Used to store default keyboard settings -static int defaultKeyboardMode = 0; // Used to store default keyboard mode + int defaultMode; // Default keyboard mode + struct termios defaultSettings; // Default keyboard settings + KeyEventFifo lastKeyPressed; // Buffer for holding keydown events as they arrive (Needed due to multitreading of event workers) +#endif + } Keyboard; + struct { + Vector2 position; // Mouse position on screen + Vector2 offset; // Mouse offset + Vector2 scale; // Mouse scaling + + bool cursorHidden; // Track if cursor is hidden + bool cursorOnScreen; // Tracks if cursor is inside client area +#if defined(PLATFORM_WEB) + bool cursorLockRequired; // Ask for cursor pointer lock on next click #endif - -// Mouse states -static Vector2 mousePosition = { 0.0f, 0.0f }; // Mouse position on screen -static Vector2 mouseScale = { 1.0f, 1.0f }; // Mouse scaling -static Vector2 mouseOffset = { 0.0f, 0.0f }; // Mouse offset -static bool cursorHidden = false; // Track if cursor is hidden -static bool cursorOnScreen = false; // Tracks if cursor is inside client area -static Vector2 touchPosition[MAX_TOUCH_POINTS]; // Touch position on screen - #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB) || defined(PLATFORM_UWP) -static char previousMouseState[3] = { 0 }; // Registers previous mouse button state -static char currentMouseState[3] = { 0 }; // Registers current mouse button state -static int previousMouseWheelY = 0; // Registers previous mouse wheel variation -static int currentMouseWheelY = 0; // Registers current mouse wheel variation + char currentButtonState[3]; // Registers current mouse button state + char previousButtonState[3]; // Registers previous mouse button state + int currentWheelMove; // Registers current mouse wheel variation + int previousWheelMove; // Registers previous mouse wheel variation #endif - #if defined(PLATFORM_RPI) -static char currentMouseStateEvdev[3] = { 0 }; // Holds the new mouse state for the next polling event to grab (Can't be written directly due to multithreading, app could miss the update) -static InputEventWorker eventWorkers[10]; // List of worker threads for every monitored "/dev/input/event<N>" -static KeyEventFifo lastKeyPressedEvdev = { 0 }; // Buffer for holding keydown events as they arrive (Needed due to multitreading of event workers) -static char currentKeyStateEvdev[512] = { 0 }; // Registers current frame key state from event based driver (Needs to be seperate because the legacy console based method clears keys on every frame) -#endif - -#if defined(PLATFORM_WEB) -static bool toggleCursorLock = false; // Ask for cursor pointer lock on next click -#endif - -// Gamepads states -static int lastGamepadButtonPressed = -1; // Register last gamepad button pressed -static int gamepadAxisCount = 0; // Register number of available gamepad axis - + char currentButtonStateEvdev[3]; // Holds the new mouse state for the next polling event to grab (Can't be written directly due to multithreading, app could miss the update) +#endif + } Mouse; + struct { + Vector2 position[MAX_TOUCH_POINTS]; // Touch position on screen + } Touch; + struct { + int lastButtonPressed; // Register last gamepad button pressed + int axisCount; // Register number of available gamepad axis #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB) || defined(PLATFORM_UWP) -static bool gamepadReady[MAX_GAMEPADS] = { false }; // Flag to know if gamepad is ready -static float gamepadAxisState[MAX_GAMEPADS][MAX_GAMEPAD_AXIS]; // Gamepad axis state -static char previousGamepadState[MAX_GAMEPADS][MAX_GAMEPAD_BUTTONS]; // Previous gamepad buttons state -static char currentGamepadState[MAX_GAMEPADS][MAX_GAMEPAD_BUTTONS]; // Current gamepad buttons state + bool ready[MAX_GAMEPADS]; // Flag to know if gamepad is ready + float axisState[MAX_GAMEPADS][MAX_GAMEPAD_AXIS]; // Gamepad axis state + char currentState[MAX_GAMEPADS][MAX_GAMEPAD_BUTTONS]; // Current gamepad buttons state + char previousState[MAX_GAMEPADS][MAX_GAMEPAD_BUTTONS]; // Previous gamepad buttons state #endif - #if defined(PLATFORM_RPI) -static int gamepadStream[MAX_GAMEPADS] = { -1 };// Gamepad device file descriptor -static pthread_t gamepadThreadId; // Gamepad reading thread id -static char gamepadName[64]; // Gamepad name holder + pthread_t threadId; // Gamepad reading thread id + int streamId[MAX_GAMEPADS]; // Gamepad device file descriptor + char name[64]; // Gamepad name holder +#endif + } Gamepad; + } Input; + struct { + double current; // Current time measure + double previous; // Previous time measure + double update; // Time measure for frame update + double draw; // Time measure for frame draw + double frame; // Time measure for one frame + double target; // Desired time for one frame, if 0 not applied +#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_UWP) + unsigned long long base; // Base time measure for hi-res timer #endif + } Time; +} CoreData; -//----------------------------------------------------------------------------------- - -// Timming system variables -//----------------------------------------------------------------------------------- -static double currentTime = 0.0; // Current time measure -static double previousTime = 0.0; // Previous time measure -static double updateTime = 0.0; // Time measure for frame update -static double drawTime = 0.0; // Time measure for frame draw -static double frameTime = 0.0; // Time measure for one frame -static double targetTime = 0.0; // Desired time for one frame, if 0 not applied -//----------------------------------------------------------------------------------- - -// Config internal variables -//----------------------------------------------------------------------------------- -static unsigned int configFlags = 0; // Configuration flags (bit based) - -static char **dropFilesPath; // Store dropped files paths as strings -static int dropFilesCount = 0; // Count dropped files strings +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +static CoreData CORE = { 0 }; // Global CORE context static char **dirFilesPath; // Store directory files paths as strings static int dirFilesCount = 0; // Count directory files strings @@ -545,7 +543,7 @@ extern int main(int argc, char *argv[]); void android_main(struct android_app *app) { char arg0[] = "raylib"; // NOTE: argv[] are mutable - androidApp = app; + CORE.Android.app = app; // TODO: Should we maybe report != 0 return codes somewhere? (void)main(1, (char *[]) { arg0, NULL }); @@ -554,7 +552,7 @@ void android_main(struct android_app *app) // TODO: Add this to header (if apps really need it) struct android_app *GetAndroidApp(void) { - return androidApp; + return CORE.Android.app; } #endif #if defined(PLATFORM_RPI) && !defined(SUPPORT_SSH_KEYBOARD_RPI) @@ -564,8 +562,8 @@ static void InitTerminal(void) TraceLog(LOG_INFO, "Reconfigure Terminal ..."); // Save terminal keyboard settings and reconfigure terminal with new settings struct termios keyboardNewSettings; - tcgetattr(STDIN_FILENO, &defaultKeyboardSettings); // Get current keyboard settings - keyboardNewSettings = defaultKeyboardSettings; + tcgetattr(STDIN_FILENO, &CORE.Input.Keyboard.defaultSettings); // Get current keyboard settings + keyboardNewSettings = CORE.Input.Keyboard.defaultSettings; // New terminal settings for keyboard: turn off buffering (non-canonical mode), echo // NOTE: ISIG controls if ^C and ^Z generate break signals or not @@ -577,7 +575,7 @@ static void InitTerminal(void) tcsetattr(STDIN_FILENO, TCSANOW, &keyboardNewSettings); // Save old keyboard mode to restore it at the end - if (ioctl(STDIN_FILENO, KDGKBMODE, &defaultKeyboardMode) < 0) + if (ioctl(STDIN_FILENO, KDGKBMODE, &CORE.Input.Keyboard.defaultMode) < 0) { // NOTE: It could mean we are using a remote keyboard through ssh or from the desktop TraceLog(LOG_WARNING, "Could not change keyboard mode (Not a local Terminal)"); @@ -597,10 +595,10 @@ static void RestoreTerminal(void) TraceLog(LOG_INFO, "Restore Terminal ..."); // Reset to default keyboard settings - tcsetattr(STDIN_FILENO, TCSANOW, &defaultKeyboardSettings); + tcsetattr(STDIN_FILENO, TCSANOW, &CORE.Input.Keyboard.defaultSettings); // Reconfigure keyboard to default mode - ioctl(STDIN_FILENO, KDSKBMODE, defaultKeyboardMode); + ioctl(STDIN_FILENO, KDSKBMODE, CORE.Input.Keyboard.defaultMode); } #endif // Initialize window and OpenGL context @@ -609,21 +607,26 @@ void InitWindow(int width, int height, const char *title) { TraceLog(LOG_INFO, "Initializing raylib %s", RAYLIB_VERSION); - windowTitle = title; + CORE.Window.title = title; + + // Initialize required global values different than 0 + CORE.Input.Keyboard.exitKey = KEY_ESCAPE; + CORE.Input.Mouse.scale = (Vector2){ 1.0f, 1.0f }; + CORE.Input.Gamepad.lastButtonPressed = -1; + #if defined(PLATFORM_ANDROID) - screenWidth = width; - screenHeight = height; - currentWidth = width; - currentHeight = height; + CORE.Window.screen.width = width; + CORE.Window.screen.height = height; + CORE.Window.currentFbo.width = width; + CORE.Window.currentFbo.height = height; // Input data is android app pointer - internalDataPath = androidApp->activity->internalDataPath; + CORE.Android.internalDataPath = CORE.Android.app->activity->internalDataPath; // Set desired windows flags before initializing anything - ANativeActivity_setWindowFlags(androidApp->activity, AWINDOW_FLAG_FULLSCREEN, 0); //AWINDOW_FLAG_SCALED, AWINDOW_FLAG_DITHER - //ANativeActivity_setWindowFlags(androidApp->activity, AWINDOW_FLAG_FORCE_NOT_FULLSCREEN, AWINDOW_FLAG_FULLSCREEN); + ANativeActivity_setWindowFlags(CORE.Android.app->activity, AWINDOW_FLAG_FULLSCREEN, 0); //AWINDOW_FLAG_SCALED, AWINDOW_FLAG_DITHER - int orientation = AConfiguration_getOrientation(androidApp->config); + int orientation = AConfiguration_getOrientation(CORE.Android.app->config); if (orientation == ACONFIGURATION_ORIENTATION_PORT) TraceLog(LOG_INFO, "PORTRAIT window orientation"); else if (orientation == ACONFIGURATION_ORIENTATION_LAND) TraceLog(LOG_INFO, "LANDSCAPE window orientation"); @@ -631,53 +634,58 @@ void InitWindow(int width, int height, const char *title) // TODO: Automatic orientation doesn't seem to work if (width <= height) { - AConfiguration_setOrientation(androidApp->config, ACONFIGURATION_ORIENTATION_PORT); + AConfiguration_setOrientation(CORE.Android.app->config, ACONFIGURATION_ORIENTATION_PORT); TraceLog(LOG_WARNING, "Window set to portraid mode"); } else { - AConfiguration_setOrientation(androidApp->config, ACONFIGURATION_ORIENTATION_LAND); + AConfiguration_setOrientation(CORE.Android.app->config, ACONFIGURATION_ORIENTATION_LAND); TraceLog(LOG_WARNING, "Window set to landscape mode"); } - //AConfiguration_getDensity(androidApp->config); - //AConfiguration_getKeyboard(androidApp->config); - //AConfiguration_getScreenSize(androidApp->config); - //AConfiguration_getScreenLong(androidApp->config); + //AConfiguration_getDensity(CORE.Android.app->config); + //AConfiguration_getKeyboard(CORE.Android.app->config); + //AConfiguration_getScreenSize(CORE.Android.app->config); + //AConfiguration_getScreenLong(CORE.Android.app->config); - androidApp->onAppCmd = AndroidCommandCallback; - androidApp->onInputEvent = AndroidInputCallback; + CORE.Android.app->onAppCmd = AndroidCommandCallback; + CORE.Android.app->onInputEvent = AndroidInputCallback; - InitAssetManager(androidApp->activity->assetManager); + InitAssetManager(CORE.Android.app->activity->assetManager); TraceLog(LOG_INFO, "Android app initialized successfully"); + // Android ALooper_pollAll() variables + int pollResult = 0; + int pollEvents = 0; + // Wait for window to be initialized (display and context) - while (!windowReady) + while (!CORE.Window.ready) { // Process events loop - while ((ident = ALooper_pollAll(0, NULL, &events, (void**)&source)) >= 0) + while ((pollResult = ALooper_pollAll(0, NULL, &pollEvents, (void**)&CORE.Android.source)) >= 0) { // Process this event - if (source != NULL) source->process(androidApp, source); + if (CORE.Android.source != NULL) CORE.Android.source->process(CORE.Android.app, CORE.Android.source); // NOTE: Never close window, native activity is controlled by the system! - //if (androidApp->destroyRequested != 0) windowShouldClose = true; + //if (CORE.Android.app->destroyRequested != 0) CORE.Window.shouldClose = true; } } #else // Init graphics device (display device and OpenGL context) // NOTE: returns true if window and graphic device has been initialized successfully - windowReady = InitGraphicsDevice(width, height); - if (!windowReady) return; + CORE.Window.ready = InitGraphicsDevice(width, height); + if (!CORE.Window.ready) return; // Init hi-res timer InitTimer(); #if defined(SUPPORT_DEFAULT_FONT) // Load default font - // NOTE: External function (defined in module: text) + // NOTE: External functions (defined in module: text) LoadFontDefault(); + SetShapesTexture(GetFontDefault().texture, GetFontDefault().recs[95]); #endif #if defined(PLATFORM_DESKTOP) && defined(SUPPORT_HIGH_DPI) // Set default font texture filter for HighDPI (blurry) @@ -715,8 +723,8 @@ void InitWindow(int width, int height, const char *title) emscripten_set_gamepaddisconnected_callback(NULL, 1, EmscriptenGamepadCallback); #endif - mousePosition.x = (float)screenWidth/2.0f; - mousePosition.y = (float)screenHeight/2.0f; + CORE.Input.Mouse.position.x = (float)CORE.Window.screen.width/2.0f; + CORE.Input.Mouse.position.y = (float)CORE.Window.screen.height/2.0f; #endif // PLATFORM_ANDROID } @@ -738,7 +746,7 @@ void CloseWindow(void) rlglClose(); // De-init rlgl #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) - glfwDestroyWindow(window); + glfwDestroyWindow(CORE.Window.handle); glfwTerminate(); #endif @@ -748,43 +756,43 @@ void CloseWindow(void) #if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_UWP) // Close surface, context and display - if (display != EGL_NO_DISPLAY) + if (CORE.Window.device != EGL_NO_DISPLAY) { - eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglMakeCurrent(CORE.Window.device, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - if (surface != EGL_NO_SURFACE) + if (CORE.Window.surface != EGL_NO_SURFACE) { - eglDestroySurface(display, surface); - surface = EGL_NO_SURFACE; + eglDestroySurface(CORE.Window.device, CORE.Window.surface); + CORE.Window.surface = EGL_NO_SURFACE; } - if (context != EGL_NO_CONTEXT) + if (CORE.Window.context != EGL_NO_CONTEXT) { - eglDestroyContext(display, context); - context = EGL_NO_CONTEXT; + eglDestroyContext(CORE.Window.device, CORE.Window.context); + CORE.Window.context = EGL_NO_CONTEXT; } - eglTerminate(display); - display = EGL_NO_DISPLAY; + eglTerminate(CORE.Window.device); + CORE.Window.device = EGL_NO_DISPLAY; } #endif #if defined(PLATFORM_RPI) // Wait for mouse and gamepad threads to finish before closing // NOTE: Those threads should already have finished at this point - // because they are controlled by windowShouldClose variable + // because they are controlled by CORE.Window.shouldClose variable - windowShouldClose = true; // Added to force threads to exit when the close window is called + CORE.Window.shouldClose = true; // Added to force threads to exit when the close window is called - for (int i = 0; i < sizeof(eventWorkers)/sizeof(InputEventWorker); ++i) + for (int i = 0; i < sizeof(CORE.Input.eventWorker)/sizeof(InputEventWorker); ++i) { - if (eventWorkers[i].threadId) + if (CORE.Input.eventWorker[i].threadId) { - pthread_join(eventWorkers[i].threadId, NULL); + pthread_join(CORE.Input.eventWorker[i].threadId, NULL); } } - if (gamepadThreadId) pthread_join(gamepadThreadId, NULL); + if (CORE.Input.Gamepad.threadId) pthread_join(CORE.Input.Gamepad.threadId, NULL); #endif TraceLog(LOG_INFO, "Window closed successfully"); @@ -793,7 +801,7 @@ void CloseWindow(void) // Check if window has been initialized successfully bool IsWindowReady(void) { - return windowReady; + return CORE.Window.ready; } // Check if KEY_ESCAPE pressed or Close icon pressed @@ -810,18 +818,20 @@ bool WindowShouldClose(void) #endif #if defined(PLATFORM_DESKTOP) - if (windowReady) + if (CORE.Window.ready) { // While window minimized, stop loop execution - while (!alwaysRun && windowMinimized) glfwWaitEvents(); + while (!CORE.Window.alwaysRun && CORE.Window.minimized) glfwWaitEvents(); - return (glfwWindowShouldClose(window)); + CORE.Window.shouldClose = glfwWindowShouldClose(CORE.Window.handle); + + return CORE.Window.shouldClose; } else return true; #endif #if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_UWP) - if (windowReady) return windowShouldClose; + if (CORE.Window.ready) return CORE.Window.shouldClose; else return true; #endif } @@ -830,7 +840,7 @@ bool WindowShouldClose(void) bool IsWindowMinimized(void) { #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) || defined(PLATFORM_UWP) - return windowMinimized; + return CORE.Window.minimized; #else return false; #endif @@ -840,7 +850,7 @@ bool IsWindowMinimized(void) bool IsWindowResized(void) { #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) || defined(PLATFORM_UWP) - return windowResized; + return CORE.Window.resized; #else return false; #endif @@ -850,7 +860,7 @@ bool IsWindowResized(void) bool IsWindowHidden(void) { #if defined(PLATFORM_DESKTOP) - return (glfwGetWindowAttrib(window, GLFW_VISIBLE) == GL_FALSE); + return (glfwGetWindowAttrib(CORE.Window.handle, GLFW_VISIBLE) == GL_FALSE); #endif return false; } @@ -859,30 +869,30 @@ bool IsWindowHidden(void) void ToggleFullscreen(void) { #if defined(PLATFORM_DESKTOP) - fullscreenMode = !fullscreenMode; // Toggle fullscreen flag + CORE.Window.fullscreen = !CORE.Window.fullscreen; // Toggle fullscreen flag // NOTE: glfwSetWindowMonitor() doesn't work properly (bugs) - if (fullscreenMode) + if (CORE.Window.fullscreen) { // Store previous window position (in case we exit fullscreen) - glfwGetWindowPos(window, &windowPositionX, &windowPositionY); + glfwGetWindowPos(CORE.Window.handle, &CORE.Window.position.x, &CORE.Window.position.y); GLFWmonitor *monitor = glfwGetPrimaryMonitor(); if (!monitor) { TraceLog(LOG_WARNING, "Failed to get monitor"); - glfwSetWindowMonitor(window, glfwGetPrimaryMonitor(), 0, 0, screenWidth, screenHeight, GLFW_DONT_CARE); + glfwSetWindowMonitor(CORE.Window.handle, glfwGetPrimaryMonitor(), 0, 0, CORE.Window.screen.width, CORE.Window.screen.height, GLFW_DONT_CARE); return; } const GLFWvidmode *mode = glfwGetVideoMode(monitor); - glfwSetWindowMonitor(window, glfwGetPrimaryMonitor(), 0, 0, screenWidth, screenHeight, mode->refreshRate); + glfwSetWindowMonitor(CORE.Window.handle, glfwGetPrimaryMonitor(), 0, 0, CORE.Window.screen.width, CORE.Window.screen.height, mode->refreshRate); // Try to enable GPU V-Sync, so frames are limited to screen refresh rate (60Hz -> 60 FPS) // NOTE: V-Sync can be enabled by graphic driver configuration - if (configFlags & FLAG_VSYNC_HINT) glfwSwapInterval(1); + if (CORE.Window.flags & FLAG_VSYNC_HINT) glfwSwapInterval(1); } - else glfwSetWindowMonitor(window, NULL, windowPositionX, windowPositionY, screenWidth, screenHeight, GLFW_DONT_CARE); + else glfwSetWindowMonitor(CORE.Window.handle, NULL, CORE.Window.position.x, CORE.Window.position.y, CORE.Window.screen.width, CORE.Window.screen.height, GLFW_DONT_CARE); #endif #if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) @@ -905,7 +915,7 @@ void SetWindowIcon(Image image) // NOTE 1: We only support one image icon // NOTE 2: The specified image data is copied before this function returns - glfwSetWindowIcon(window, 1, icon); + glfwSetWindowIcon(CORE.Window.handle, 1, icon); } else TraceLog(LOG_WARNING, "Window icon image must be in R8G8B8A8 pixel format"); #endif @@ -914,9 +924,9 @@ void SetWindowIcon(Image image) // Set title for window (only PLATFORM_DESKTOP) void SetWindowTitle(const char *title) { - windowTitle = title; + CORE.Window.title = title; #if defined(PLATFORM_DESKTOP) - glfwSetWindowTitle(window, title); + glfwSetWindowTitle(CORE.Window.handle, title); #endif } @@ -924,7 +934,7 @@ void SetWindowTitle(const char *title) void SetWindowPosition(int x, int y) { #if defined(PLATFORM_DESKTOP) - glfwSetWindowPos(window, x, y); + glfwSetWindowPos(CORE.Window.handle, x, y); #endif } @@ -940,7 +950,7 @@ void SetWindowMonitor(int monitor) TraceLog(LOG_INFO, "Selected fullscreen monitor: [%i] %s", monitor, glfwGetMonitorName(monitors[monitor])); const GLFWvidmode *mode = glfwGetVideoMode(monitors[monitor]); - glfwSetWindowMonitor(window, monitors[monitor], 0, 0, mode->width, mode->height, mode->refreshRate); + glfwSetWindowMonitor(CORE.Window.handle, monitors[monitor], 0, 0, mode->width, mode->height, mode->refreshRate); } else TraceLog(LOG_WARNING, "Selected monitor not found"); #endif @@ -951,7 +961,7 @@ void SetWindowMinSize(int width, int height) { #if defined(PLATFORM_DESKTOP) const GLFWvidmode *mode = glfwGetVideoMode(glfwGetPrimaryMonitor()); - glfwSetWindowSizeLimits(window, width, height, mode->width, mode->height); + glfwSetWindowSizeLimits(CORE.Window.handle, width, height, mode->width, mode->height); #endif } @@ -960,7 +970,7 @@ void SetWindowMinSize(int width, int height) void SetWindowSize(int width, int height) { #if defined(PLATFORM_DESKTOP) - glfwSetWindowSize(window, width, height); + glfwSetWindowSize(CORE.Window.handle, width, height); #endif } @@ -968,7 +978,7 @@ void SetWindowSize(int width, int height) void UnhideWindow(void) { #if defined(PLATFORM_DESKTOP) - glfwShowWindow(window); + glfwShowWindow(CORE.Window.handle); #endif } @@ -976,20 +986,20 @@ void UnhideWindow(void) void HideWindow(void) { #if defined(PLATFORM_DESKTOP) - glfwHideWindow(window); + glfwHideWindow(CORE.Window.handle); #endif } // Get current screen width int GetScreenWidth(void) { - return screenWidth; + return CORE.Window.screen.width; } // Get current screen height int GetScreenHeight(void) { - return screenHeight; + return CORE.Window.screen.height; } // Get native window handle @@ -997,7 +1007,7 @@ void *GetWindowHandle(void) { #if defined(PLATFORM_DESKTOP) && defined(_WIN32) // NOTE: Returned handle is: void *HWND (windows.h) - return glfwGetWin32Window(window); + return glfwGetWin32Window(CORE.Window.handle); #elif defined(__linux__) // NOTE: Returned handle is: unsigned long Window (X.h) // typedef unsigned long XID; @@ -1100,7 +1110,7 @@ Vector2 GetWindowPosition(void) int x = 0; int y = 0; #if defined(PLATFORM_DESKTOP) - glfwGetWindowPos(window, &x, &y); + glfwGetWindowPos(CORE.Window.handle, &x, &y); #endif return (Vector2){ (float)x, (float)y }; } @@ -1126,7 +1136,7 @@ const char *GetMonitorName(int monitor) const char *GetClipboardText(void) { #if defined(PLATFORM_DESKTOP) - return glfwGetClipboardString(window); + return glfwGetClipboardString(CORE.Window.handle); #else return NULL; #endif @@ -1136,7 +1146,7 @@ const char *GetClipboardText(void) void SetClipboardText(const char *text) { #if defined(PLATFORM_DESKTOP) - glfwSetClipboardString(window, text); + glfwSetClipboardString(CORE.Window.handle, text); #endif } @@ -1144,68 +1154,68 @@ void SetClipboardText(const char *text) void ShowCursor(void) { #if defined(PLATFORM_DESKTOP) - glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); + glfwSetInputMode(CORE.Window.handle, GLFW_CURSOR, GLFW_CURSOR_NORMAL); #endif #if defined(PLATFORM_UWP) UWPMessage *msg = CreateUWPMessage(); msg->type = UWP_MSG_SHOW_MOUSE; SendMessageToUWP(msg); #endif - cursorHidden = false; + CORE.Input.Mouse.cursorHidden = false; } // Hides mouse cursor void HideCursor(void) { #if defined(PLATFORM_DESKTOP) - glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); + glfwSetInputMode(CORE.Window.handle, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); #endif #if defined(PLATFORM_UWP) UWPMessage *msg = CreateUWPMessage(); msg->type = UWP_MSG_HIDE_MOUSE; SendMessageToUWP(msg); #endif - cursorHidden = true; + CORE.Input.Mouse.cursorHidden = true; } // Check if cursor is not visible bool IsCursorHidden(void) { - return cursorHidden; + return CORE.Input.Mouse.cursorHidden; } // Enables cursor (unlock cursor) void EnableCursor(void) { #if defined(PLATFORM_DESKTOP) - glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); + glfwSetInputMode(CORE.Window.handle, GLFW_CURSOR, GLFW_CURSOR_NORMAL); #endif #if defined(PLATFORM_WEB) - toggleCursorLock = true; + CORE.Input.Mouse.cursorLockRequired = true; #endif #if defined(PLATFORM_UWP) UWPMessage *msg = CreateUWPMessage(); msg->type = UWP_MSG_LOCK_MOUSE; SendMessageToUWP(msg); #endif - cursorHidden = false; + CORE.Input.Mouse.cursorHidden = false; } // Disables cursor (lock cursor) void DisableCursor(void) { #if defined(PLATFORM_DESKTOP) - glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); + glfwSetInputMode(CORE.Window.handle, GLFW_CURSOR, GLFW_CURSOR_DISABLED); #endif #if defined(PLATFORM_WEB) - toggleCursorLock = true; + CORE.Input.Mouse.cursorLockRequired = true; #endif #if defined(PLATFORM_UWP) UWPMessage *msg = CreateUWPMessage(); msg->type = UWP_MSG_UNLOCK_MOUSE; SendMessageToUWP(msg); #endif - cursorHidden = true; + CORE.Input.Mouse.cursorHidden = true; } // Set background color (framebuffer clear color) @@ -1218,12 +1228,12 @@ void ClearBackground(Color color) // Setup canvas (framebuffer) to start drawing void BeginDrawing(void) { - currentTime = GetTime(); // Number of elapsed seconds since InitTimer() - updateTime = currentTime - previousTime; - previousTime = currentTime; + CORE.Time.current = GetTime(); // Number of elapsed seconds since InitTimer() + CORE.Time.update = CORE.Time.current - CORE.Time.previous; + CORE.Time.previous = CORE.Time.current; rlLoadIdentity(); // Reset current matrix (MODELVIEW) - rlMultMatrixf(MatrixToFloat(screenScaling)); // Apply screen scaling + rlMultMatrixf(MatrixToFloat(CORE.Window.screenScale)); // Apply screen scaling //rlTranslatef(0.375, 0.375, 0); // HACK to have 2D pixel-perfect drawing on OpenGL 1.1 // NOTE: Not required with OpenGL 3.3+ @@ -1235,7 +1245,7 @@ void EndDrawing(void) #if defined(PLATFORM_RPI) && defined(SUPPORT_MOUSE_CURSOR_RPI) // On RPI native mode we have no system mouse cursor, so, // we draw a small rectangle for user reference - DrawRectangle(mousePosition.x, mousePosition.y, 3, 3, MAROON); + DrawRectangle(CORE.Input.Mouse.position.x, CORE.Input.Mouse.position.y, 3, 3, MAROON); #endif rlglDraw(); // Draw Buffers (Only OpenGL 3+ and ES2) @@ -1253,16 +1263,16 @@ void EndDrawing(void) { // Get image data for the current frame (from backbuffer) // NOTE: This process is very slow... :( - unsigned char *screenData = rlReadScreenPixels(screenWidth, screenHeight); - GifWriteFrame(screenData, screenWidth, screenHeight, 10, 8, false); + unsigned char *screenData = rlReadScreenPixels(CORE.Window.screen.width, CORE.Window.screen.height); + GifWriteFrame(screenData, CORE.Window.screen.width, CORE.Window.screen.height, 10, 8, false); RL_FREE(screenData); // Free image data } if (((gifFramesCounter/15)%2) == 1) { - DrawCircle(30, screenHeight - 20, 10, RED); - DrawText("RECORDING", 50, screenHeight - 25, 10, MAROON); + DrawCircle(30, CORE.Window.screen.height - 20, 10, RED); + DrawText("RECORDING", 50, CORE.Window.screen.height - 25, 10, MAROON); } rlglDraw(); // Draw RECORDING message @@ -1273,26 +1283,26 @@ void EndDrawing(void) PollInputEvents(); // Poll user events // Frame time control system - currentTime = GetTime(); - drawTime = currentTime - previousTime; - previousTime = currentTime; + CORE.Time.current = GetTime(); + CORE.Time.draw = CORE.Time.current - CORE.Time.previous; + CORE.Time.previous = CORE.Time.current; - frameTime = updateTime + drawTime; + CORE.Time.frame = CORE.Time.update + CORE.Time.draw; // Wait for some milliseconds... - if (frameTime < targetTime) + if (CORE.Time.frame < CORE.Time.target) { - Wait((float)(targetTime - frameTime)*1000.0f); + Wait((float)(CORE.Time.target - CORE.Time.frame)*1000.0f); - currentTime = GetTime(); - double waitTime = currentTime - previousTime; - previousTime = currentTime; + CORE.Time.current = GetTime(); + double waitTime = CORE.Time.current - CORE.Time.previous; + CORE.Time.previous = CORE.Time.current; - frameTime += waitTime; // Total frame time: update + draw + wait + CORE.Time.frame += waitTime; // Total frame time: update + draw + wait //SetWindowTitle(FormatText("Update: %f, Draw: %f, Req.Wait: %f, Real.Wait: %f, Total: %f, Target: %f\n", - // (float)updateTime, (float)drawTime, (float)(targetTime - (updateTime + drawTime)), - // (float)waitTime, (float)frameTime, (float)targetTime)); + // (float)CORE.Time.update, (float)CORE.Time.draw, (float)(CORE.Time.target - (CORE.Time.update + CORE.Time.draw)), + // (float)waitTime, (float)CORE.Time.frame, (float)CORE.Time.target)); } } @@ -1307,7 +1317,7 @@ void BeginMode2D(Camera2D camera) rlMultMatrixf(MatrixToFloat(GetCameraMatrix2D(camera))); // Apply screen scaling if required - rlMultMatrixf(MatrixToFloat(screenScaling)); + rlMultMatrixf(MatrixToFloat(CORE.Window.screenScale)); } // Ends 2D mode with custom camera @@ -1316,7 +1326,7 @@ void EndMode2D(void) rlglDraw(); // Draw Buffers (Only OpenGL 3+ and ES2) rlLoadIdentity(); // Reset current matrix (MODELVIEW) - rlMultMatrixf(MatrixToFloat(screenScaling)); // Apply screen scaling if required + rlMultMatrixf(MatrixToFloat(CORE.Window.screenScale)); // Apply screen scaling if required } // Initializes 3D mode with custom camera (3D) @@ -1328,7 +1338,7 @@ void BeginMode3D(Camera3D camera) rlPushMatrix(); // Save previous matrix, which contains the settings for the 2d ortho projection rlLoadIdentity(); // Reset current matrix (PROJECTION) - float aspect = (float)currentWidth/(float)currentHeight; + float aspect = (float)CORE.Window.currentFbo.width/(float)CORE.Window.currentFbo.height; if (camera.type == CAMERA_PERSPECTIVE) { @@ -1370,7 +1380,7 @@ void EndMode3D(void) rlMatrixMode(RL_MODELVIEW); // Get back to modelview matrix rlLoadIdentity(); // Reset current matrix (MODELVIEW) - rlMultMatrixf(MatrixToFloat(screenScaling)); // Apply screen scaling if required + rlMultMatrixf(MatrixToFloat(CORE.Window.screenScale)); // Apply screen scaling if required rlDisableDepthTest(); // Disable DEPTH_TEST for 2D } @@ -1399,8 +1409,8 @@ void BeginTextureMode(RenderTexture2D target) // Setup current width/height for proper aspect ratio // calculation when using BeginMode3D() - currentWidth = target.texture.width; - currentHeight = target.texture.height; + CORE.Window.currentFbo.width = target.texture.width; + CORE.Window.currentFbo.height = target.texture.height; } // Ends drawing to render texture @@ -1411,11 +1421,11 @@ void EndTextureMode(void) rlDisableRenderTexture(); // Disable render target // Set viewport to default framebuffer size - SetupViewport(renderWidth, renderHeight); + SetupViewport(CORE.Window.render.width, CORE.Window.render.height); // Reset current screen size - currentWidth = GetScreenWidth(); - currentHeight = GetScreenHeight(); + CORE.Window.currentFbo.width = GetScreenWidth(); + CORE.Window.currentFbo.height = GetScreenHeight(); } // Begin scissor mode (define screen area for following drawing) @@ -1436,14 +1446,14 @@ void EndScissorMode(void) } // Returns a ray trace from mouse position -Ray GetMouseRay(Vector2 mousePosition, Camera camera) +Ray GetMouseRay(Vector2 mouse, Camera camera) { Ray ray; // Calculate normalized device coordinates // NOTE: y value is negative - float x = (2.0f*mousePosition.x)/(float)GetScreenWidth() - 1.0f; - float y = 1.0f - (2.0f*mousePosition.y)/(float)GetScreenHeight(); + float x = (2.0f*mouse.x)/(float)GetScreenWidth() - 1.0f; + float y = 1.0f - (2.0f*mouse.y)/(float)GetScreenHeight(); float z = 1.0f; // Store values in a vector @@ -1461,7 +1471,7 @@ Ray GetMouseRay(Vector2 mousePosition, Camera camera) } else if (camera.type == CAMERA_ORTHOGRAPHIC) { - float aspect = (float)screenWidth/(float)screenHeight; + float aspect = (float)CORE.Window.screen.width/(float)CORE.Window.screen.height; double top = camera.fovy/2.0; double right = top*aspect; @@ -1535,43 +1545,43 @@ Vector2 GetWorldToScreen(Vector3 position, Camera camera) // Returns size position for a 3d world space position (useful for texture drawing) Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height) { - // Calculate projection matrix (from perspective instead of frustum - Matrix matProj = MatrixIdentity(); + // Calculate projection matrix (from perspective instead of frustum + Matrix matProj = MatrixIdentity(); - if (camera.type == CAMERA_PERSPECTIVE) - { - // Calculate projection matrix from perspective + if (camera.type == CAMERA_PERSPECTIVE) + { + // Calculate projection matrix from perspective matProj = MatrixPerspective(camera.fovy * DEG2RAD, ((double)width/(double)height), DEFAULT_NEAR_CULL_DISTANCE, DEFAULT_FAR_CULL_DISTANCE); - } - else if (camera.type == CAMERA_ORTHOGRAPHIC) - { - float aspect = (float)width/(float)height; - double top = camera.fovy/2.0; - double right = top*aspect; - - // Calculate projection matrix from orthographic + } + else if (camera.type == CAMERA_ORTHOGRAPHIC) + { + float aspect = (float)CORE.Window.screen.width/(float)CORE.Window.screen.height; + double top = camera.fovy/2.0; + double right = top*aspect; + + // Calculate projection matrix from orthographic matProj = MatrixOrtho(-right, right, -top, top, DEFAULT_NEAR_CULL_DISTANCE, DEFAULT_FAR_CULL_DISTANCE); - } + } - // Calculate view matrix from camera look at (and transpose it) - Matrix matView = MatrixLookAt(camera.position, camera.target, camera.up); + // Calculate view matrix from camera look at (and transpose it) + Matrix matView = MatrixLookAt(camera.position, camera.target, camera.up); - // Convert world position vector to quaternion - Quaternion worldPos = { position.x, position.y, position.z, 1.0f }; + // Convert world position vector to quaternion + Quaternion worldPos = { position.x, position.y, position.z, 1.0f }; - // Transform world position to view - worldPos = QuaternionTransform(worldPos, matView); + // Transform world position to view + worldPos = QuaternionTransform(worldPos, matView); - // Transform result to projection (clip space position) - worldPos = QuaternionTransform(worldPos, matProj); + // Transform result to projection (clip space position) + worldPos = QuaternionTransform(worldPos, matProj); - // Calculate normalized device coordinates (inverted y) - Vector3 ndcPos = { worldPos.x/worldPos.w, -worldPos.y/worldPos.w, worldPos.z/worldPos.w }; + // Calculate normalized device coordinates (inverted y) + Vector3 ndcPos = { worldPos.x/worldPos.w, -worldPos.y/worldPos.w, worldPos.z/worldPos.w }; - // Calculate 2d screen position vector - Vector2 sizePosition = { (ndcPos.x + 1.0f)/2.0f*(float)width, (ndcPos.y + 1.0f)/2.0f*(float)height }; + // Calculate 2d screen position vector + Vector2 screenPosition = { (ndcPos.x + 1.0f)/2.0f*(float)width, (ndcPos.y + 1.0f)/2.0f*(float)height }; - return sizePosition; + return screenPosition; } // Returns the screen space position for a 2d camera world space position @@ -1595,10 +1605,10 @@ Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera) // Set target FPS (maximum) void SetTargetFPS(int fps) { - if (fps < 1) targetTime = 0.0; - else targetTime = 1.0/(double)fps; + if (fps < 1) CORE.Time.target = 0.0; + else CORE.Time.target = 1.0/(double)fps; - TraceLog(LOG_INFO, "Target time per frame: %02.03f milliseconds", (float)targetTime*1000); + TraceLog(LOG_INFO, "Target time per frame: %02.03f milliseconds", (float)CORE.Time.target*1000); } // Returns current FPS @@ -1610,7 +1620,7 @@ int GetFPS(void) // Returns time in seconds for last frame drawn float GetFrameTime(void) { - return (float)frameTime; + return (float)CORE.Time.frame; } // Get elapsed time measure in seconds since InitTimer() @@ -1627,12 +1637,12 @@ double GetTime(void) clock_gettime(CLOCK_MONOTONIC, &ts); uint64_t time = (uint64_t)ts.tv_sec*1000000000LLU + (uint64_t)ts.tv_nsec; - return (double)(time - baseTime)*1e-9; // Elapsed time since InitTimer() + return (double)(time - CORE.Time.base)*1e-9; // Elapsed time since InitTimer() #endif #if defined(PLATFORM_UWP) // Updated through messages - return currentTime; + return CORE.Time.current; #endif } @@ -1793,10 +1803,10 @@ Color Fade(Color color, float alpha) // Setup window configuration flags (view FLAGS) void SetConfigFlags(unsigned int flags) { - configFlags = flags; + CORE.Window.flags = flags; - if (configFlags & FLAG_FULLSCREEN_MODE) fullscreenMode = true; - if (configFlags & FLAG_WINDOW_ALWAYS_RUN) alwaysRun = true; + if (CORE.Window.flags & FLAG_FULLSCREEN_MODE) CORE.Window.fullscreen = true; + if (CORE.Window.flags & FLAG_WINDOW_ALWAYS_RUN) CORE.Window.alwaysRun = true; } // NOTE TraceLog() function is located in [utils.h] @@ -1806,12 +1816,12 @@ void SetConfigFlags(unsigned int flags) // have their own internal file-systems, to dowload image to user file-system some additional mechanism is required void TakeScreenshot(const char *fileName) { - unsigned char *imgData = rlReadScreenPixels(renderWidth, renderHeight); - Image image = { imgData, renderWidth, renderHeight, 1, UNCOMPRESSED_R8G8B8A8 }; + unsigned char *imgData = rlReadScreenPixels(CORE.Window.render.width, CORE.Window.render.height); + Image image = { imgData, CORE.Window.render.width, CORE.Window.render.height, 1, UNCOMPRESSED_R8G8B8A8 }; char path[512] = { 0 }; #if defined(PLATFORM_ANDROID) - strcpy(path, internalDataPath); + strcpy(path, CORE.Android.internalDataPath); strcat(path, "/"); strcat(path, fileName); #else @@ -1959,15 +1969,15 @@ const char *GetDirectoryPath(const char *filePath) // For security, we set starting path to current directory, // obtained path will be concated to this - dirPath[0] = '.'; - dirPath[1] = '/'; + //dirPath[0] = '.'; + //dirPath[1] = '/'; lastSlash = strprbrk(filePath, "\\/"); if (lastSlash) { // NOTE: Be careful, strncpy() is not safe, it does not care about '\0' - strncpy(dirPath + 2, filePath, strlen(filePath) - (strlen(lastSlash) - 1)); - dirPath[2 + strlen(filePath) - strlen(lastSlash)] = '\0'; // Add '\0' manually + strncpy(dirPath, filePath, strlen(filePath) - (strlen(lastSlash) - 1)); + dirPath[strlen(filePath) - strlen(lastSlash)] = '\0'; // Add '\0' manually } return dirPath; @@ -2066,27 +2076,27 @@ bool ChangeDirectory(const char *dir) // Check if a file has been dropped into window bool IsFileDropped(void) { - if (dropFilesCount > 0) return true; + if (CORE.Window.dropFilesCount > 0) return true; else return false; } // Get dropped files names char **GetDroppedFiles(int *count) { - *count = dropFilesCount; - return dropFilesPath; + *count = CORE.Window.dropFilesCount; + return CORE.Window.dropFilesPath; } // Clear dropped files paths buffer void ClearDroppedFiles(void) { - if (dropFilesCount > 0) + if (CORE.Window.dropFilesCount > 0) { - for (int i = 0; i < dropFilesCount; i++) RL_FREE(dropFilesPath[i]); + for (int i = 0; i < CORE.Window.dropFilesCount; i++) RL_FREE(CORE.Window.dropFilesPath[i]); - RL_FREE(dropFilesPath); + RL_FREE(CORE.Window.dropFilesPath); - dropFilesCount = 0; + CORE.Window.dropFilesCount = 0; } } @@ -2139,7 +2149,7 @@ void StorageSaveValue(int position, int value) char path[512] = { 0 }; #if defined(PLATFORM_ANDROID) - strcpy(path, internalDataPath); + strcpy(path, CORE.Android.internalDataPath); strcat(path, "/"); strcat(path, STORAGE_FILENAME); #else @@ -2179,7 +2189,7 @@ int StorageLoadValue(int position) char path[512] = { 0 }; #if defined(PLATFORM_ANDROID) - strcpy(path, internalDataPath); + strcpy(path, CORE.Android.internalDataPath); strcat(path, "/"); strcat(path, STORAGE_FILENAME); #else @@ -2247,7 +2257,7 @@ bool IsKeyPressed(int key) { bool pressed = false; - if ((currentKeyState[key] != previousKeyState[key]) && (currentKeyState[key] == 1)) pressed = true; + if ((CORE.Input.Keyboard.currentKeyState[key] != CORE.Input.Keyboard.previousKeyState[key]) && (CORE.Input.Keyboard.currentKeyState[key] == 1)) pressed = true; else pressed = false; return pressed; @@ -2265,7 +2275,7 @@ bool IsKeyReleased(int key) { bool released = false; - if ((currentKeyState[key] != previousKeyState[key]) && (currentKeyState[key] == 0)) released = true; + if ((CORE.Input.Keyboard.currentKeyState[key] != CORE.Input.Keyboard.previousKeyState[key]) && (CORE.Input.Keyboard.currentKeyState[key] == 0)) released = true; else released = false; return released; @@ -2283,17 +2293,17 @@ int GetKeyPressed(void) { int value = 0; - if (keyPressedQueueCount > 0) + if (CORE.Input.Keyboard.keyPressedQueueCount > 0) { // Get character from the queue head - value = keyPressedQueue[0]; + value = CORE.Input.Keyboard.keyPressedQueue[0]; // Shift elements 1 step toward the head. - for (int i = 0; i < (keyPressedQueueCount - 1); i++) keyPressedQueue[i] = keyPressedQueue[i + 1]; + for (int i = 0; i < (CORE.Input.Keyboard.keyPressedQueueCount - 1); i++) CORE.Input.Keyboard.keyPressedQueue[i] = CORE.Input.Keyboard.keyPressedQueue[i + 1]; // Reset last character in the queue - keyPressedQueue[keyPressedQueueCount] = 0; - keyPressedQueueCount--; + CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = 0; + CORE.Input.Keyboard.keyPressedQueueCount--; } return value; @@ -2304,7 +2314,7 @@ int GetKeyPressed(void) void SetExitKey(int key) { #if !defined(PLATFORM_ANDROID) - exitKey = key; + CORE.Input.Keyboard.exitKey = key; #endif } @@ -2316,7 +2326,7 @@ bool IsGamepadAvailable(int gamepad) bool result = false; #if !defined(PLATFORM_ANDROID) - if ((gamepad < MAX_GAMEPADS) && gamepadReady[gamepad]) result = true; + if ((gamepad < MAX_GAMEPADS) && CORE.Input.Gamepad.ready[gamepad]) result = true; #endif return result; @@ -2328,10 +2338,10 @@ bool IsGamepadName(int gamepad, const char *name) bool result = false; #if !defined(PLATFORM_ANDROID) - const char *gamepadName = NULL; + const char *currentName = NULL; - if (gamepadReady[gamepad]) gamepadName = GetGamepadName(gamepad); - if ((name != NULL) && (gamepadName != NULL)) result = (strcmp(name, gamepadName) == 0); + if (CORE.Input.Gamepad.ready[gamepad]) currentName = GetGamepadName(gamepad); + if ((name != NULL) && (currentName != NULL)) result = (strcmp(name, currentName) == 0); #endif return result; @@ -2341,12 +2351,12 @@ bool IsGamepadName(int gamepad, const char *name) const char *GetGamepadName(int gamepad) { #if defined(PLATFORM_DESKTOP) - if (gamepadReady[gamepad]) return glfwGetJoystickName(gamepad); + if (CORE.Input.Gamepad.ready[gamepad]) return glfwGetJoystickName(gamepad); else return NULL; #elif defined(PLATFORM_RPI) - if (gamepadReady[gamepad]) ioctl(gamepadStream[gamepad], JSIOCGNAME(64), &gamepadName); + if (CORE.Input.Gamepad.ready[gamepad]) ioctl(CORE.Input.Gamepad.streamId[gamepad], JSIOCGNAME(64), &CORE.Input.Gamepad.name); - return gamepadName; + return CORE.Input.Gamepad.name; #else return NULL; #endif @@ -2357,10 +2367,10 @@ int GetGamepadAxisCount(int gamepad) { #if defined(PLATFORM_RPI) int axisCount = 0; - if (gamepadReady[gamepad]) ioctl(gamepadStream[gamepad], JSIOCGAXES, &axisCount); - gamepadAxisCount = axisCount; + if (CORE.Input.Gamepad.ready[gamepad]) ioctl(CORE.Input.Gamepad.streamId[gamepad], JSIOCGAXES, &axisCount); + CORE.Input.Gamepad.axisCount = axisCount; #endif - return gamepadAxisCount; + return CORE.Input.Gamepad.axisCount; } // Return axis movement vector for a gamepad @@ -2369,7 +2379,7 @@ float GetGamepadAxisMovement(int gamepad, int axis) float value = 0; #if !defined(PLATFORM_ANDROID) - if ((gamepad < MAX_GAMEPADS) && gamepadReady[gamepad] && (axis < MAX_GAMEPAD_AXIS)) value = gamepadAxisState[gamepad][axis]; + if ((gamepad < MAX_GAMEPADS) && CORE.Input.Gamepad.ready[gamepad] && (axis < MAX_GAMEPAD_AXIS)) value = CORE.Input.Gamepad.axisState[gamepad][axis]; #endif return value; @@ -2381,9 +2391,9 @@ bool IsGamepadButtonPressed(int gamepad, int button) bool pressed = false; #if !defined(PLATFORM_ANDROID) - if ((gamepad < MAX_GAMEPADS) && gamepadReady[gamepad] && (button < MAX_GAMEPAD_BUTTONS) && - (currentGamepadState[gamepad][button] != previousGamepadState[gamepad][button]) && - (currentGamepadState[gamepad][button] == 1)) pressed = true; + if ((gamepad < MAX_GAMEPADS) && CORE.Input.Gamepad.ready[gamepad] && (button < MAX_GAMEPAD_BUTTONS) && + (CORE.Input.Gamepad.currentState[gamepad][button] != CORE.Input.Gamepad.previousState[gamepad][button]) && + (CORE.Input.Gamepad.currentState[gamepad][button] == 1)) pressed = true; #endif return pressed; @@ -2395,8 +2405,8 @@ bool IsGamepadButtonDown(int gamepad, int button) bool result = false; #if !defined(PLATFORM_ANDROID) - if ((gamepad < MAX_GAMEPADS) && gamepadReady[gamepad] && (button < MAX_GAMEPAD_BUTTONS) && - (currentGamepadState[gamepad][button] == 1)) result = true; + if ((gamepad < MAX_GAMEPADS) && CORE.Input.Gamepad.ready[gamepad] && (button < MAX_GAMEPAD_BUTTONS) && + (CORE.Input.Gamepad.currentState[gamepad][button] == 1)) result = true; #endif return result; @@ -2408,9 +2418,9 @@ bool IsGamepadButtonReleased(int gamepad, int button) bool released = false; #if !defined(PLATFORM_ANDROID) - if ((gamepad < MAX_GAMEPADS) && gamepadReady[gamepad] && (button < MAX_GAMEPAD_BUTTONS) && - (currentGamepadState[gamepad][button] != previousGamepadState[gamepad][button]) && - (currentGamepadState[gamepad][button] == 0)) released = true; + if ((gamepad < MAX_GAMEPADS) && CORE.Input.Gamepad.ready[gamepad] && (button < MAX_GAMEPAD_BUTTONS) && + (CORE.Input.Gamepad.currentState[gamepad][button] != CORE.Input.Gamepad.previousState[gamepad][button]) && + (CORE.Input.Gamepad.currentState[gamepad][button] == 0)) released = true; #endif return released; @@ -2422,8 +2432,8 @@ bool IsGamepadButtonUp(int gamepad, int button) bool result = false; #if !defined(PLATFORM_ANDROID) - if ((gamepad < MAX_GAMEPADS) && gamepadReady[gamepad] && (button < MAX_GAMEPAD_BUTTONS) && - (currentGamepadState[gamepad][button] == 0)) result = true; + if ((gamepad < MAX_GAMEPADS) && CORE.Input.Gamepad.ready[gamepad] && (button < MAX_GAMEPAD_BUTTONS) && + (CORE.Input.Gamepad.currentState[gamepad][button] == 0)) result = true; #endif return result; @@ -2432,7 +2442,7 @@ bool IsGamepadButtonUp(int gamepad, int button) // Get the last gamepad button pressed int GetGamepadButtonPressed(void) { - return lastGamepadButtonPressed; + return CORE.Input.Gamepad.lastButtonPressed; } // Detect if a mouse button has been pressed once @@ -2444,7 +2454,8 @@ bool IsMouseButtonPressed(int button) if (IsGestureDetected(GESTURE_TAP)) pressed = true; #else // NOTE: On PLATFORM_DESKTOP and PLATFORM_WEB IsMouseButtonPressed() is equivalent to GESTURE_TAP - if (((currentMouseState[button] != previousMouseState[button]) && (currentMouseState[button] == 1)) || IsGestureDetected(GESTURE_TAP)) pressed = true; + if (((CORE.Input.Mouse.currentButtonState[button] != CORE.Input.Mouse.previousButtonState[button]) && + (CORE.Input.Mouse.currentButtonState[button] == 1)) || IsGestureDetected(GESTURE_TAP)) pressed = true; #endif return pressed; @@ -2471,7 +2482,8 @@ bool IsMouseButtonReleased(int button) bool released = false; #if !defined(PLATFORM_ANDROID) - if ((currentMouseState[button] != previousMouseState[button]) && (currentMouseState[button] == 0)) released = true; + if ((CORE.Input.Mouse.currentButtonState[button] != CORE.Input.Mouse.previousButtonState[button]) && + (CORE.Input.Mouse.currentButtonState[button] == 0)) released = true; #endif return released; @@ -2493,9 +2505,9 @@ bool IsMouseButtonUp(int button) int GetMouseX(void) { #if defined(PLATFORM_ANDROID) - return (int)touchPosition[0].x; + return (int)CORE.Input.Touch.position[0].x; #else - return (int)((mousePosition.x + mouseOffset.x)*mouseScale.x); + return (int)((CORE.Input.Mouse.position.x + CORE.Input.Mouse.offset.x)*CORE.Input.Mouse.scale.x); #endif } @@ -2503,9 +2515,9 @@ int GetMouseX(void) int GetMouseY(void) { #if defined(PLATFORM_ANDROID) - return (int)touchPosition[0].y; + return (int)CORE.Input.Touch.position[0].y; #else - return (int)((mousePosition.y + mouseOffset.y)*mouseScale.y); + return (int)((CORE.Input.Mouse.position.y + CORE.Input.Mouse.offset.y)*CORE.Input.Mouse.scale.y); #endif } @@ -2517,7 +2529,7 @@ Vector2 GetMousePosition(void) #if defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB) position = GetTouchPosition(0); #else - position = (Vector2){ (mousePosition.x + mouseOffset.x)*mouseScale.x, (mousePosition.y + mouseOffset.y)*mouseScale.y }; + position = (Vector2){ (CORE.Input.Mouse.position.x + CORE.Input.Mouse.offset.x)*CORE.Input.Mouse.scale.x, (CORE.Input.Mouse.position.y + CORE.Input.Mouse.offset.y)*CORE.Input.Mouse.scale.y }; #endif return position; @@ -2526,16 +2538,16 @@ Vector2 GetMousePosition(void) // Set mouse position XY void SetMousePosition(int x, int y) { - mousePosition = (Vector2){ (float)x, (float)y }; + CORE.Input.Mouse.position = (Vector2){ (float)x, (float)y }; #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) // NOTE: emscripten not implemented - glfwSetCursorPos(window, mousePosition.x, mousePosition.y); + glfwSetCursorPos(CORE.Window.handle, CORE.Input.Mouse.position.x, CORE.Input.Mouse.position.y); #endif #if defined(PLATFORM_UWP) UWPMessage *msg = CreateUWPMessage(); msg->type = UWP_MSG_SET_MOUSE_LOCATION; - msg->paramVector0.x = mousePosition.x; - msg->paramVector0.y = mousePosition.y; + msg->paramVector0.x = CORE.Input.Mouse.position.x; + msg->paramVector0.y = CORE.Input.Mouse.position.y; SendMessageToUWP(msg); #endif } @@ -2544,14 +2556,14 @@ void SetMousePosition(int x, int y) // NOTE: Useful when rendering to different size targets void SetMouseOffset(int offsetX, int offsetY) { - mouseOffset = (Vector2){ (float)offsetX, (float)offsetY }; + CORE.Input.Mouse.offset = (Vector2){ (float)offsetX, (float)offsetY }; } // Set mouse scaling // NOTE: Useful when rendering to different size targets void SetMouseScale(float scaleX, float scaleY) { - mouseScale = (Vector2){ scaleX, scaleY }; + CORE.Input.Mouse.scale = (Vector2){ scaleX, scaleY }; } // Returns mouse wheel movement Y @@ -2560,9 +2572,9 @@ int GetMouseWheelMove(void) #if defined(PLATFORM_ANDROID) return 0; #elif defined(PLATFORM_WEB) - return previousMouseWheelY/100; + return CORE.Input.Mouse.previousWheelMove/100; #else - return previousMouseWheelY; + return CORE.Input.Mouse.previousWheelMove; #endif } @@ -2570,7 +2582,7 @@ int GetMouseWheelMove(void) int GetTouchX(void) { #if defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB) - return (int)touchPosition[0].x; + return (int)CORE.Input.Touch.position[0].x; #else // PLATFORM_DESKTOP, PLATFORM_RPI return GetMouseX(); #endif @@ -2580,7 +2592,7 @@ int GetTouchX(void) int GetTouchY(void) { #if defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB) - return (int)touchPosition[0].y; + return (int)CORE.Input.Touch.position[0].y; #else // PLATFORM_DESKTOP, PLATFORM_RPI return GetMouseY(); #endif @@ -2593,24 +2605,24 @@ Vector2 GetTouchPosition(int index) Vector2 position = { -1.0f, -1.0f }; #if defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB) - if (index < MAX_TOUCH_POINTS) position = touchPosition[index]; + if (index < MAX_TOUCH_POINTS) position = CORE.Input.Touch.position[index]; else TraceLog(LOG_WARNING, "Required touch point out of range (Max touch points: %i)", MAX_TOUCH_POINTS); #if defined(PLATFORM_ANDROID) - if ((screenWidth > displayWidth) || (screenHeight > displayHeight)) + if ((CORE.Window.screen.width > CORE.Window.display.width) || (CORE.Window.screen.height > CORE.Window.display.height)) { - position.x = position.x*((float)screenWidth/(float)(displayWidth - renderOffsetX)) - renderOffsetX/2; - position.y = position.y*((float)screenHeight/(float)(displayHeight - renderOffsetY)) - renderOffsetY/2; + position.x = position.x*((float)CORE.Window.screen.width/(float)(CORE.Window.display.width - CORE.Window.renderOffset.x)) - CORE.Window.renderOffset.x/2; + position.y = position.y*((float)CORE.Window.screen.height/(float)(CORE.Window.display.height - CORE.Window.renderOffset.y)) - CORE.Window.renderOffset.y/2; } else { - position.x = position.x*((float)renderWidth/(float)displayWidth) - renderOffsetX/2; - position.y = position.y*((float)renderHeight/(float)displayHeight) - renderOffsetY/2; + position.x = position.x*((float)CORE.Window.render.width/(float)CORE.Window.display.width) - CORE.Window.renderOffset.x/2; + position.y = position.y*((float)CORE.Window.render.height/(float)CORE.Window.display.height) - CORE.Window.renderOffset.y/2; } #endif #endif #if defined(PLATFORM_RPI) - position = touchPosition[index]; + position = CORE.Input.Touch.position[index]; #endif #if defined(PLATFORM_DESKTOP) // TODO: GLFW is not supporting multi-touch input just yet @@ -2633,12 +2645,12 @@ Vector2 GetTouchPosition(int index) // NOTE: returns false in case graphic device could not be created static bool InitGraphicsDevice(int width, int height) { - screenWidth = width; // User desired width - screenHeight = height; // User desired height + CORE.Window.screen.width = width; // User desired width + CORE.Window.screen.height = height; // User desired height - screenScaling = MatrixIdentity(); // No draw scaling required by default + CORE.Window.screenScale = MatrixIdentity(); // No draw scaling required by default - // NOTE: Framebuffer (render area - renderWidth, renderHeight) could include black bars... + // NOTE: Framebuffer (render area - CORE.Window.render.width, CORE.Window.render.height) could include black bars... // ...in top-down or left-right to match display aspect ratio (no weird scalings) #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) @@ -2665,17 +2677,17 @@ static bool InitGraphicsDevice(int width, int height) } const GLFWvidmode *mode = glfwGetVideoMode(monitor); - displayWidth = mode->width; - displayHeight = mode->height; + CORE.Window.display.width = mode->width; + CORE.Window.display.height = mode->height; // Screen size security check - if (screenWidth <= 0) screenWidth = displayWidth; - if (screenHeight <= 0) screenHeight = displayHeight; + if (CORE.Window.screen.width <= 0) CORE.Window.screen.width = CORE.Window.display.width; + if (CORE.Window.screen.height <= 0) CORE.Window.screen.height = CORE.Window.display.height; #endif // PLATFORM_DESKTOP #if defined(PLATFORM_WEB) - displayWidth = screenWidth; - displayHeight = screenHeight; + CORE.Window.display.width = CORE.Window.screen.width; + CORE.Window.display.height = CORE.Window.screen.height; #endif // PLATFORM_WEB glfwDefaultWindowHints(); // Set default windows hints: @@ -2695,21 +2707,21 @@ static bool InitGraphicsDevice(int width, int height) #endif // Check some Window creation flags - if (configFlags & FLAG_WINDOW_HIDDEN) glfwWindowHint(GLFW_VISIBLE, GL_FALSE); // Visible window + if (CORE.Window.flags & FLAG_WINDOW_HIDDEN) glfwWindowHint(GLFW_VISIBLE, GL_FALSE); // Visible window else glfwWindowHint(GLFW_VISIBLE, GL_TRUE); // Window initially hidden - if (configFlags & FLAG_WINDOW_RESIZABLE) glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); // Resizable window + if (CORE.Window.flags & FLAG_WINDOW_RESIZABLE) glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); // Resizable window else glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); // Avoid window being resizable - if (configFlags & FLAG_WINDOW_UNDECORATED) glfwWindowHint(GLFW_DECORATED, GLFW_FALSE); // Border and buttons on Window + if (CORE.Window.flags & FLAG_WINDOW_UNDECORATED) glfwWindowHint(GLFW_DECORATED, GLFW_FALSE); // Border and buttons on Window else glfwWindowHint(GLFW_DECORATED, GLFW_TRUE); // Decorated window // FLAG_WINDOW_TRANSPARENT not supported on HTML5 and not included in any released GLFW version yet #if defined(GLFW_TRANSPARENT_FRAMEBUFFER) - if (configFlags & FLAG_WINDOW_TRANSPARENT) glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE); // Transparent framebuffer + if (CORE.Window.flags & FLAG_WINDOW_TRANSPARENT) glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE); // Transparent framebuffer else glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_FALSE); // Opaque framebuffer #endif - if (configFlags & FLAG_MSAA_4X_HINT) glfwWindowHint(GLFW_SAMPLES, 4); // Tries to enable multisampling x4 (MSAA), default is 0 + if (CORE.Window.flags & FLAG_MSAA_4X_HINT) glfwWindowHint(GLFW_SAMPLES, 4); // Tries to enable multisampling x4 (MSAA), default is 0 // NOTE: When asking for an OpenGL context version, most drivers provide highest supported version // with forward compatibility to older OpenGL versions. @@ -2746,28 +2758,28 @@ static bool InitGraphicsDevice(int width, int height) #endif } - if (fullscreenMode) + if (CORE.Window.fullscreen) { // remember center for switchinging from fullscreen to window - windowPositionX = displayWidth/2 - screenWidth/2; - windowPositionY = displayHeight/2 - screenHeight/2; + CORE.Window.position.x = CORE.Window.display.width/2 - CORE.Window.screen.width/2; + CORE.Window.position.y = CORE.Window.display.height/2 - CORE.Window.screen.height/2; - if (windowPositionX < 0) windowPositionX = 0; - if (windowPositionY < 0) windowPositionY = 0; + if (CORE.Window.position.x < 0) CORE.Window.position.x = 0; + if (CORE.Window.position.y < 0) CORE.Window.position.y = 0; - // Obtain recommended displayWidth/displayHeight from a valid videomode for the monitor + // Obtain recommended CORE.Window.display.width/CORE.Window.display.height from a valid videomode for the monitor int count = 0; const GLFWvidmode *modes = glfwGetVideoModes(glfwGetPrimaryMonitor(), &count); - // Get closest video mode to desired screenWidth/screenHeight + // Get closest video mode to desired CORE.Window.screen.width/CORE.Window.screen.height for (int i = 0; i < count; i++) { - if (modes[i].width >= screenWidth) + if (modes[i].width >= CORE.Window.screen.width) { - if (modes[i].height >= screenHeight) + if (modes[i].height >= CORE.Window.screen.height) { - displayWidth = modes[i].width; - displayHeight = modes[i].height; + CORE.Window.display.width = modes[i].width; + CORE.Window.display.height = modes[i].height; break; } } @@ -2775,13 +2787,13 @@ static bool InitGraphicsDevice(int width, int height) #if defined(PLATFORM_DESKTOP) // If we are windowed fullscreen, ensures that window does not minimize when focus is lost - if ((screenHeight == displayHeight) && (screenWidth == displayWidth)) + if ((CORE.Window.screen.height == CORE.Window.display.height) && (CORE.Window.screen.width == CORE.Window.display.width)) { glfwWindowHint(GLFW_AUTO_ICONIFY, 0); } #endif - TraceLog(LOG_WARNING, "Closest fullscreen videomode: %i x %i", displayWidth, displayHeight); + TraceLog(LOG_WARNING, "Closest fullscreen videomode: %i x %i", CORE.Window.display.width, CORE.Window.display.height); // NOTE: ISSUE: Closest videomode could not match monitor aspect-ratio, for example, // for a desired screen size of 800x450 (16:9), closest supported videomode is 800x600 (4:3), @@ -2790,39 +2802,39 @@ static bool InitGraphicsDevice(int width, int height) // Try to setup the most appropiate fullscreen framebuffer for the requested screenWidth/screenHeight // It considers device display resolution mode and setups a framebuffer with black bars if required (render size/offset) - // Modified global variables: screenWidth/screenHeight - renderWidth/renderHeight - renderOffsetX/renderOffsetY - screenScaling + // Modified global variables: CORE.Window.screen.width/CORE.Window.screen.height - CORE.Window.render.width/CORE.Window.render.height - CORE.Window.renderOffset.x/CORE.Window.renderOffset.y - CORE.Window.screenScale // TODO: It is a quite cumbersome solution to display size vs requested size, it should be reviewed or removed... // HighDPI monitors are properly considered in a following similar function: SetupViewport() - SetupFramebuffer(displayWidth, displayHeight); + SetupFramebuffer(CORE.Window.display.width, CORE.Window.display.height); - window = glfwCreateWindow(displayWidth, displayHeight, windowTitle, glfwGetPrimaryMonitor(), NULL); + CORE.Window.handle = glfwCreateWindow(CORE.Window.display.width, CORE.Window.display.height, CORE.Window.title, glfwGetPrimaryMonitor(), NULL); // NOTE: Full-screen change, not working properly... - //glfwSetWindowMonitor(window, glfwGetPrimaryMonitor(), 0, 0, screenWidth, screenHeight, GLFW_DONT_CARE); + //glfwSetWindowMonitor(CORE.Window.handle, glfwGetPrimaryMonitor(), 0, 0, CORE.Window.screen.width, CORE.Window.screen.height, GLFW_DONT_CARE); } else { // No-fullscreen window creation - window = glfwCreateWindow(screenWidth, screenHeight, windowTitle, NULL, NULL); + CORE.Window.handle = glfwCreateWindow(CORE.Window.screen.width, CORE.Window.screen.height, CORE.Window.title, NULL, NULL); - if (window) + if (CORE.Window.handle) { #if defined(PLATFORM_DESKTOP) // Center window on screen - int windowPosX = displayWidth/2 - screenWidth/2; - int windowPosY = displayHeight/2 - screenHeight/2; + int windowPosX = CORE.Window.display.width/2 - CORE.Window.screen.width/2; + int windowPosY = CORE.Window.display.height/2 - CORE.Window.screen.height/2; if (windowPosX < 0) windowPosX = 0; if (windowPosY < 0) windowPosY = 0; - glfwSetWindowPos(window, windowPosX, windowPosY); + glfwSetWindowPos(CORE.Window.handle, windowPosX, windowPosY); #endif - renderWidth = screenWidth; - renderHeight = screenHeight; + CORE.Window.render.width = CORE.Window.screen.width; + CORE.Window.render.height = CORE.Window.screen.height; } } - if (!window) + if (!CORE.Window.handle) { glfwTerminate(); TraceLog(LOG_WARNING, "GLFW Failed to initialize Window"); @@ -2832,24 +2844,24 @@ static bool InitGraphicsDevice(int width, int height) { TraceLog(LOG_INFO, "Display device initialized successfully"); #if defined(PLATFORM_DESKTOP) - TraceLog(LOG_INFO, "Display size: %i x %i", displayWidth, displayHeight); + TraceLog(LOG_INFO, "Display size: %i x %i", CORE.Window.display.width, CORE.Window.display.height); #endif - TraceLog(LOG_INFO, "Render size: %i x %i", renderWidth, renderHeight); - TraceLog(LOG_INFO, "Screen size: %i x %i", screenWidth, screenHeight); - TraceLog(LOG_INFO, "Viewport offsets: %i, %i", renderOffsetX, renderOffsetY); + TraceLog(LOG_INFO, "Render size: %i x %i", CORE.Window.render.width, CORE.Window.render.height); + TraceLog(LOG_INFO, "Screen size: %i x %i", CORE.Window.screen.width, CORE.Window.screen.height); + TraceLog(LOG_INFO, "Viewport offsets: %i, %i", CORE.Window.renderOffset.x, CORE.Window.renderOffset.y); } - glfwSetWindowSizeCallback(window, WindowSizeCallback); // NOTE: Resizing not allowed by default! - glfwSetCursorEnterCallback(window, CursorEnterCallback); - glfwSetKeyCallback(window, KeyCallback); - glfwSetMouseButtonCallback(window, MouseButtonCallback); - glfwSetCursorPosCallback(window, MouseCursorPosCallback); // Track mouse position changes - glfwSetCharCallback(window, CharCallback); - glfwSetScrollCallback(window, ScrollCallback); - glfwSetWindowIconifyCallback(window, WindowIconifyCallback); - glfwSetDropCallback(window, WindowDropCallback); + glfwSetWindowSizeCallback(CORE.Window.handle, WindowSizeCallback); // NOTE: Resizing not allowed by default! + glfwSetCursorEnterCallback(CORE.Window.handle, CursorEnterCallback); + glfwSetKeyCallback(CORE.Window.handle, KeyCallback); + glfwSetMouseButtonCallback(CORE.Window.handle, MouseButtonCallback); + glfwSetCursorPosCallback(CORE.Window.handle, MouseCursorPosCallback); // Track mouse position changes + glfwSetCharCallback(CORE.Window.handle, CharCallback); + glfwSetScrollCallback(CORE.Window.handle, ScrollCallback); + glfwSetWindowIconifyCallback(CORE.Window.handle, WindowIconifyCallback); + glfwSetDropCallback(CORE.Window.handle, WindowDropCallback); - glfwMakeContextCurrent(window); + glfwMakeContextCurrent(CORE.Window.handle); #if !defined(PLATFORM_WEB) glfwSwapInterval(0); // No V-Sync by default @@ -2863,7 +2875,7 @@ static bool InitGraphicsDevice(int width, int height) // Try to enable GPU V-Sync, so frames are limited to screen refresh rate (60Hz -> 60 FPS) // NOTE: V-Sync can be enabled by graphic driver configuration - if (configFlags & FLAG_VSYNC_HINT) + if (CORE.Window.flags & FLAG_VSYNC_HINT) { // WARNING: It seems to hits a critical render path in Intel HD Graphics glfwSwapInterval(1); @@ -2872,11 +2884,11 @@ static bool InitGraphicsDevice(int width, int height) #endif // PLATFORM_DESKTOP || PLATFORM_WEB #if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_UWP) - fullscreenMode = true; + CORE.Window.fullscreen = true; // Screen size security check - if (screenWidth <= 0) screenWidth = displayWidth; - if (screenHeight <= 0) screenHeight = displayHeight; + if (CORE.Window.screen.width <= 0) CORE.Window.screen.width = CORE.Window.display.width; + if (CORE.Window.screen.height <= 0) CORE.Window.screen.height = CORE.Window.display.height; #if defined(PLATFORM_RPI) bcm_host_init(); @@ -2891,7 +2903,7 @@ static bool InitGraphicsDevice(int width, int height) EGLint samples = 0; EGLint sampleBuffer = 0; - if (configFlags & FLAG_MSAA_4X_HINT) + if (CORE.Window.flags & FLAG_MSAA_4X_HINT) { samples = 4; sampleBuffer = 1; @@ -2969,8 +2981,6 @@ static bool InitGraphicsDevice(int width, int height) EGL_NONE, }; - EGLConfig config = NULL; - // eglGetPlatformDisplayEXT is an alternative to eglGetDisplay. It allows us to pass in display attributes, used to configure D3D11. PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)(eglGetProcAddress("eglGetPlatformDisplayEXT")); if (!eglGetPlatformDisplayEXT) @@ -2990,34 +3000,34 @@ static bool InitGraphicsDevice(int width, int height) // // This tries to initialize EGL to D3D11 Feature Level 10_0+. See above comment for details. - display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, defaultDisplayAttributes); - if (display == EGL_NO_DISPLAY) + CORE.Window.device = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, defaultDisplayAttributes); + if (CORE.Window.device == EGL_NO_DISPLAY) { - TraceLog(LOG_WARNING, "Failed to initialize EGL display"); + TraceLog(LOG_WARNING, "Failed to initialize EGL device"); return false; } - if (eglInitialize(display, NULL, NULL) == EGL_FALSE) + if (eglInitialize(CORE.Window.device, NULL, NULL) == EGL_FALSE) { // This tries to initialize EGL to D3D11 Feature Level 9_3, if 10_0+ is unavailable (e.g. on some mobile devices). - display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, fl9_3DisplayAttributes); - if (display == EGL_NO_DISPLAY) + CORE.Window.device = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, fl9_3DisplayAttributes); + if (CORE.Window.device == EGL_NO_DISPLAY) { - TraceLog(LOG_WARNING, "Failed to initialize EGL display"); + TraceLog(LOG_WARNING, "Failed to initialize EGL device"); return false; } - if (eglInitialize(display, NULL, NULL) == EGL_FALSE) + if (eglInitialize(CORE.Window.device, NULL, NULL) == EGL_FALSE) { // This initializes EGL to D3D11 Feature Level 11_0 on WARP, if 9_3+ is unavailable on the default GPU. - display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, warpDisplayAttributes); - if (display == EGL_NO_DISPLAY) + CORE.Window.device = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, warpDisplayAttributes); + if (CORE.Window.device == EGL_NO_DISPLAY) { - TraceLog(LOG_WARNING, "Failed to initialize EGL display"); + TraceLog(LOG_WARNING, "Failed to initialize EGL device"); return false; } - if (eglInitialize(display, NULL, NULL) == EGL_FALSE) + if (eglInitialize(CORE.Window.device, NULL, NULL) == EGL_FALSE) { // If all of the calls to eglInitialize returned EGL_FALSE then an error has occurred. TraceLog(LOG_WARNING, "Failed to initialize EGL"); @@ -3027,7 +3037,7 @@ static bool InitGraphicsDevice(int width, int height) } EGLint numConfigs = 0; - if ((eglChooseConfig(display, framebufferAttribs, &config, 1, &numConfigs) == EGL_FALSE) || (numConfigs == 0)) + if ((eglChooseConfig(CORE.Window.device, framebufferAttribs, &CORE.Window.config, 1, &numConfigs) == EGL_FALSE) || (numConfigs == 0)) { TraceLog(LOG_WARNING, "Failed to choose first EGLConfig"); return false; @@ -3063,38 +3073,38 @@ static bool InitGraphicsDevice(int width, int height) //https://stackoverflow.com/questions/46550182/how-to-create-eglsurface-using-c-winrt-and-angle - //surface = eglCreateWindowSurface(display, config, reinterpret_cast<IInspectable*>(surfaceCreationProperties), surfaceAttributes); - surface = eglCreateWindowSurface(display, config, uwpWindow, surfaceAttributes); - if (surface == EGL_NO_SURFACE) + //CORE.Window.surface = eglCreateWindowSurface(CORE.Window.device, CORE.Window.config, reinterpret_cast<IInspectable*>(surfaceCreationProperties), surfaceAttributes); + CORE.Window.surface = eglCreateWindowSurface(CORE.Window.device, CORE.Window.config, handle, surfaceAttributes); + if (CORE.Window.surface == EGL_NO_SURFACE) { TraceLog(LOG_WARNING, "Failed to create EGL fullscreen surface"); return false; } - context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs); - if (context == EGL_NO_CONTEXT) + CORE.Window.context = eglCreateContext(CORE.Window.device, CORE.Window.config, EGL_NO_CONTEXT, contextAttribs); + if (CORE.Window.context == EGL_NO_CONTEXT) { TraceLog(LOG_WARNING, "Failed to create EGL context"); return false; } - // Get EGL display window size - eglQuerySurface(display, surface, EGL_WIDTH, &screenWidth); - eglQuerySurface(display, surface, EGL_HEIGHT, &screenHeight); + // Get EGL device window size + eglQuerySurface(CORE.Window.device, CORE.Window.surface, EGL_WIDTH, &CORE.Window.screen.width); + eglQuerySurface(CORE.Window.device, CORE.Window.surface, EGL_HEIGHT, &CORE.Window.screen.height); #else // PLATFORM_ANDROID, PLATFORM_RPI EGLint numConfigs; - // Get an EGL display connection - display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - if (display == EGL_NO_DISPLAY) + // Get an EGL device connection + CORE.Window.device = eglGetDisplay(EGL_DEFAULT_DISPLAY); + if (CORE.Window.device == EGL_NO_DISPLAY) { - TraceLog(LOG_WARNING, "Failed to initialize EGL display"); + TraceLog(LOG_WARNING, "Failed to initialize EGL device"); return false; } - // Initialize the EGL display connection - if (eglInitialize(display, NULL, NULL) == EGL_FALSE) + // Initialize the EGL device connection + if (eglInitialize(CORE.Window.device, NULL, NULL) == EGL_FALSE) { // If all of the calls to eglInitialize returned EGL_FALSE then an error has occurred. TraceLog(LOG_WARNING, "Failed to initialize EGL"); @@ -3102,14 +3112,14 @@ static bool InitGraphicsDevice(int width, int height) } // Get an appropriate EGL framebuffer configuration - eglChooseConfig(display, framebufferAttribs, &config, 1, &numConfigs); + eglChooseConfig(CORE.Window.device, framebufferAttribs, &CORE.Window.config, 1, &numConfigs); // Set rendering API eglBindAPI(EGL_OPENGL_ES_API); // Create an EGL rendering context - context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs); - if (context == EGL_NO_CONTEXT) + CORE.Window.context = eglCreateContext(CORE.Window.device, CORE.Window.config, EGL_NO_CONTEXT, contextAttribs); + if (CORE.Window.context == EGL_NO_CONTEXT) { TraceLog(LOG_WARNING, "Failed to create EGL context"); return false; @@ -3121,39 +3131,39 @@ static bool InitGraphicsDevice(int width, int height) #if defined(PLATFORM_ANDROID) EGLint displayFormat; - displayWidth = ANativeWindow_getWidth(androidApp->window); - displayHeight = ANativeWindow_getHeight(androidApp->window); + CORE.Window.display.width = ANativeWindow_getWidth(CORE.Android.app->window); + CORE.Window.display.height = ANativeWindow_getHeight(CORE.Android.app->window); // EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is guaranteed to be accepted by ANativeWindow_setBuffersGeometry() // As soon as we picked a EGLConfig, we can safely reconfigure the ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID - eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &displayFormat); + eglGetConfigAttrib(CORE.Window.device, CORE.Window.config, EGL_NATIVE_VISUAL_ID, &displayFormat); // At this point we need to manage render size vs screen size - // NOTE: This function use and modify global module variables: screenWidth/screenHeight and renderWidth/renderHeight and screenScaling - SetupFramebuffer(displayWidth, displayHeight); + // NOTE: This function use and modify global module variables: CORE.Window.screen.width/CORE.Window.screen.height and CORE.Window.render.width/CORE.Window.render.height and CORE.Window.screenScale + SetupFramebuffer(CORE.Window.display.width, CORE.Window.display.height); - ANativeWindow_setBuffersGeometry(androidApp->window, renderWidth, renderHeight, displayFormat); - //ANativeWindow_setBuffersGeometry(androidApp->window, 0, 0, displayFormat); // Force use of native display size + ANativeWindow_setBuffersGeometry(CORE.Android.app->window, CORE.Window.render.width, CORE.Window.render.height, displayFormat); + //ANativeWindow_setBuffersGeometry(CORE.Android.app->window, 0, 0, displayFormat); // Force use of native display size - surface = eglCreateWindowSurface(display, config, androidApp->window, NULL); + CORE.Window.surface = eglCreateWindowSurface(CORE.Window.device, CORE.Window.config, CORE.Android.app->window, NULL); #endif // PLATFORM_ANDROID #if defined(PLATFORM_RPI) - graphics_get_display_size(0, &displayWidth, &displayHeight); + graphics_get_display_size(0, &CORE.Window.display.width, &CORE.Window.display.height); // At this point we need to manage render size vs screen size - // NOTE: This function use and modify global module variables: screenWidth/screenHeight and renderWidth/renderHeight and screenScaling - SetupFramebuffer(displayWidth, displayHeight); + // NOTE: This function use and modify global module variables: CORE.Window.screen.width/CORE.Window.screen.height and CORE.Window.render.width/CORE.Window.render.height and CORE.Window.screenScale + SetupFramebuffer(CORE.Window.display.width, CORE.Window.display.height); dstRect.x = 0; dstRect.y = 0; - dstRect.width = displayWidth; - dstRect.height = displayHeight; + dstRect.width = CORE.Window.display.width; + dstRect.height = CORE.Window.display.height; srcRect.x = 0; srcRect.y = 0; - srcRect.width = renderWidth << 16; - srcRect.height = renderHeight << 16; + srcRect.width = CORE.Window.render.width << 16; + srcRect.height = CORE.Window.render.height << 16; // NOTE: RPI dispmanx windowing system takes care of srcRec scaling to dstRec by hardware (no cost) // Take care that renderWidth/renderHeight fit on displayWidth/displayHeight aspect ratio @@ -3170,18 +3180,18 @@ static bool InitGraphicsDevice(int width, int height) &srcRect, DISPMANX_PROTECTION_NONE, &alpha, 0/*clamp*/, DISPMANX_NO_ROTATE); window.element = dispmanElement; - window.width = renderWidth; - window.height = renderHeight; + window.width = CORE.Window.render.width; + window.height = CORE.Window.render.height; vc_dispmanx_update_submit_sync(dispmanUpdate); - surface = eglCreateWindowSurface(display, config, &window, NULL); + CORE.Window.surface = eglCreateWindowSurface(CORE.Window.device, CORE.Window.config, &window, NULL); //--------------------------------------------------------------------------------- #endif // PLATFORM_RPI // There must be at least one frame displayed before the buffers are swapped - //eglSwapInterval(display, 1); + //eglSwapInterval(CORE.Window.device, 1); - if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) + if (eglMakeCurrent(CORE.Window.device, CORE.Window.surface, CORE.Window.surface, CORE.Window.context) == EGL_FALSE) { TraceLog(LOG_WARNING, "Unable to attach EGL rendering context to EGL surface"); return false; @@ -3189,44 +3199,44 @@ static bool InitGraphicsDevice(int width, int height) else { // Grab the width and height of the surface - //eglQuerySurface(display, surface, EGL_WIDTH, &renderWidth); - //eglQuerySurface(display, surface, EGL_HEIGHT, &renderHeight); + //eglQuerySurface(CORE.Window.device, CORE.Window.surface, EGL_WIDTH, &CORE.Window.render.width); + //eglQuerySurface(CORE.Window.device, CORE.Window.surface, EGL_HEIGHT, &CORE.Window.render.height); TraceLog(LOG_INFO, "Display device initialized successfully"); - TraceLog(LOG_INFO, "Display size: %i x %i", displayWidth, displayHeight); - TraceLog(LOG_INFO, "Render size: %i x %i", renderWidth, renderHeight); - TraceLog(LOG_INFO, "Screen size: %i x %i", screenWidth, screenHeight); - TraceLog(LOG_INFO, "Viewport offsets: %i, %i", renderOffsetX, renderOffsetY); + TraceLog(LOG_INFO, "Display size: %i x %i", CORE.Window.display.width, CORE.Window.display.height); + TraceLog(LOG_INFO, "Render size: %i x %i", CORE.Window.render.width, CORE.Window.render.height); + TraceLog(LOG_INFO, "Screen size: %i x %i", CORE.Window.screen.width, CORE.Window.screen.height); + TraceLog(LOG_INFO, "Viewport offsets: %i, %i", CORE.Window.renderOffset.x, CORE.Window.renderOffset.y); } #endif // PLATFORM_ANDROID || PLATFORM_RPI // Initialize OpenGL context (states and resources) - // NOTE: screenWidth and screenHeight not used, just stored as globals in rlgl - rlglInit(screenWidth, screenHeight); + // NOTE: CORE.Window.screen.width and CORE.Window.screen.height not used, just stored as globals in rlgl + rlglInit(CORE.Window.screen.width, CORE.Window.screen.height); - int fbWidth = renderWidth; - int fbHeight = renderHeight; + int fbWidth = CORE.Window.render.width; + int fbHeight = CORE.Window.render.height; #if defined(PLATFORM_DESKTOP) && defined(SUPPORT_HIGH_DPI) - glfwGetFramebufferSize(window, &fbWidth, &fbHeight); + glfwGetFramebufferSize(CORE.Window.handle, &fbWidth, &fbHeight); // Screen scaling matrix is required in case desired screen area is different than display area - screenScaling = MatrixScale((float)fbWidth/screenWidth, (float)fbHeight/screenHeight, 1.0f); + CORE.Window.screenScale = MatrixScale((float)fbWidth/CORE.Window.screen.width, (float)fbHeight/CORE.Window.screen.height, 1.0f); #if !defined(__APPLE__) - SetMouseScale((float)screenWidth/fbWidth, (float)screenHeight/fbHeight); + SetMouseScale((float)CORE.Window.screen.width/fbWidth, (float)CORE.Window.screen.height/fbHeight); #endif #endif // PLATFORM_DESKTOP && SUPPORT_HIGH_DPI // Setup default viewport SetupViewport(fbWidth, fbHeight); - currentWidth = screenWidth; - currentHeight = screenHeight; + CORE.Window.currentFbo.width = CORE.Window.screen.width; + CORE.Window.currentFbo.height = CORE.Window.screen.height; ClearBackground(RAYWHITE); // Default background color for raylib games :P #if defined(PLATFORM_ANDROID) - windowReady = true; // IMPORTANT! + CORE.Window.ready = true; #endif return true; } @@ -3234,94 +3244,94 @@ static bool InitGraphicsDevice(int width, int height) // Set viewport for a provided width and height static void SetupViewport(int width, int height) { - renderWidth = width; - renderHeight = height; + CORE.Window.render.width = width; + CORE.Window.render.height = height; // Set viewport width and height // NOTE: We consider render size and offset in case black bars are required and // render area does not match full display area (this situation is only applicable on fullscreen mode) - rlViewport(renderOffsetX/2, renderOffsetY/2, renderWidth - renderOffsetX, renderHeight - renderOffsetY); + rlViewport(CORE.Window.renderOffset.x/2, CORE.Window.renderOffset.y/2, CORE.Window.render.width - CORE.Window.renderOffset.x, CORE.Window.render.height - CORE.Window.renderOffset.y); rlMatrixMode(RL_PROJECTION); // Switch to PROJECTION matrix rlLoadIdentity(); // Reset current matrix (PROJECTION) // Set orthographic projection to current framebuffer size // NOTE: Configured top-left corner as (0, 0) - rlOrtho(0, renderWidth, renderHeight, 0, 0.0f, 1.0f); + rlOrtho(0, CORE.Window.render.width, CORE.Window.render.height, 0, 0.0f, 1.0f); rlMatrixMode(RL_MODELVIEW); // Switch back to MODELVIEW matrix rlLoadIdentity(); // Reset current matrix (MODELVIEW) } // Compute framebuffer size relative to screen size and display size -// NOTE: Global variables renderWidth/renderHeight and renderOffsetX/renderOffsetY can be modified +// NOTE: Global variables CORE.Window.render.width/CORE.Window.render.height and CORE.Window.renderOffset.x/CORE.Window.renderOffset.y can be modified static void SetupFramebuffer(int width, int height) { - // Calculate renderWidth and renderHeight, we have the display size (input params) and the desired screen size (global var) - if ((screenWidth > displayWidth) || (screenHeight > displayHeight)) + // Calculate CORE.Window.render.width and CORE.Window.render.height, we have the display size (input params) and the desired screen size (global var) + if ((CORE.Window.screen.width > CORE.Window.display.width) || (CORE.Window.screen.height > CORE.Window.display.height)) { - TraceLog(LOG_WARNING, "DOWNSCALING: Required screen size (%ix%i) is bigger than display size (%ix%i)", screenWidth, screenHeight, displayWidth, displayHeight); + TraceLog(LOG_WARNING, "DOWNSCALING: Required screen size (%ix%i) is bigger than display size (%ix%i)", CORE.Window.screen.width, CORE.Window.screen.height, CORE.Window.display.width, CORE.Window.display.height); // Downscaling to fit display with border-bars - float widthRatio = (float)displayWidth/(float)screenWidth; - float heightRatio = (float)displayHeight/(float)screenHeight; + float widthRatio = (float)CORE.Window.display.width/(float)CORE.Window.screen.width; + float heightRatio = (float)CORE.Window.display.height/(float)CORE.Window.screen.height; if (widthRatio <= heightRatio) { - renderWidth = displayWidth; - renderHeight = (int)round((float)screenHeight*widthRatio); - renderOffsetX = 0; - renderOffsetY = (displayHeight - renderHeight); + CORE.Window.render.width = CORE.Window.display.width; + CORE.Window.render.height = (int)round((float)CORE.Window.screen.height*widthRatio); + CORE.Window.renderOffset.x = 0; + CORE.Window.renderOffset.y = (CORE.Window.display.height - CORE.Window.render.height); } else { - renderWidth = (int)round((float)screenWidth*heightRatio); - renderHeight = displayHeight; - renderOffsetX = (displayWidth - renderWidth); - renderOffsetY = 0; + CORE.Window.render.width = (int)round((float)CORE.Window.screen.width*heightRatio); + CORE.Window.render.height = CORE.Window.display.height; + CORE.Window.renderOffset.x = (CORE.Window.display.width - CORE.Window.render.width); + CORE.Window.renderOffset.y = 0; } // Screen scaling required - float scaleRatio = (float)renderWidth/(float)screenWidth; - screenScaling = MatrixScale(scaleRatio, scaleRatio, 1.0f); + float scaleRatio = (float)CORE.Window.render.width/(float)CORE.Window.screen.width; + CORE.Window.screenScale = MatrixScale(scaleRatio, scaleRatio, 1.0f); // NOTE: We render to full display resolution! // We just need to calculate above parameters for downscale matrix and offsets - renderWidth = displayWidth; - renderHeight = displayHeight; + CORE.Window.render.width = CORE.Window.display.width; + CORE.Window.render.height = CORE.Window.display.height; - TraceLog(LOG_WARNING, "Downscale matrix generated, content will be rendered at: %i x %i", renderWidth, renderHeight); + TraceLog(LOG_WARNING, "Downscale matrix generated, content will be rendered at: %i x %i", CORE.Window.render.width, CORE.Window.render.height); } - else if ((screenWidth < displayWidth) || (screenHeight < displayHeight)) + else if ((CORE.Window.screen.width < CORE.Window.display.width) || (CORE.Window.screen.height < CORE.Window.display.height)) { // Required screen size is smaller than display size - TraceLog(LOG_INFO, "UPSCALING: Required screen size: %i x %i -> Display size: %i x %i", screenWidth, screenHeight, displayWidth, displayHeight); + TraceLog(LOG_INFO, "UPSCALING: Required screen size: %i x %i -> Display size: %i x %i", CORE.Window.screen.width, CORE.Window.screen.height, CORE.Window.display.width, CORE.Window.display.height); // Upscaling to fit display with border-bars - float displayRatio = (float)displayWidth/(float)displayHeight; - float screenRatio = (float)screenWidth/(float)screenHeight; + float displayRatio = (float)CORE.Window.display.width/(float)CORE.Window.display.height; + float screenRatio = (float)CORE.Window.screen.width/(float)CORE.Window.screen.height; if (displayRatio <= screenRatio) { - renderWidth = screenWidth; - renderHeight = (int)round((float)screenWidth/displayRatio); - renderOffsetX = 0; - renderOffsetY = (renderHeight - screenHeight); + CORE.Window.render.width = CORE.Window.screen.width; + CORE.Window.render.height = (int)round((float)CORE.Window.screen.width/displayRatio); + CORE.Window.renderOffset.x = 0; + CORE.Window.renderOffset.y = (CORE.Window.render.height - CORE.Window.screen.height); } else { - renderWidth = (int)round((float)screenHeight*displayRatio); - renderHeight = screenHeight; - renderOffsetX = (renderWidth - screenWidth); - renderOffsetY = 0; + CORE.Window.render.width = (int)round((float)CORE.Window.screen.height*displayRatio); + CORE.Window.render.height = CORE.Window.screen.height; + CORE.Window.renderOffset.x = (CORE.Window.render.width - CORE.Window.screen.width); + CORE.Window.renderOffset.y = 0; } } - else // screen == display + else { - renderWidth = screenWidth; - renderHeight = screenHeight; - renderOffsetX = 0; - renderOffsetY = 0; + CORE.Window.render.width = CORE.Window.screen.width; + CORE.Window.render.height = CORE.Window.screen.height; + CORE.Window.renderOffset.x = 0; + CORE.Window.renderOffset.y = 0; } } @@ -3339,12 +3349,12 @@ static void InitTimer(void) if (clock_gettime(CLOCK_MONOTONIC, &now) == 0) // Success { - baseTime = (uint64_t)now.tv_sec*1000000000LLU + (uint64_t)now.tv_nsec; + CORE.Time.base = (uint64_t)now.tv_sec*1000000000LLU + (uint64_t)now.tv_nsec; } else TraceLog(LOG_WARNING, "No hi-resolution timer available"); #endif - previousTime = GetTime(); // Get time as double + CORE.Time.previous = GetTime(); // Get time as double } // Wait for some milliseconds (stop program execution) @@ -3392,15 +3402,15 @@ static void Wait(float ms) static bool GetKeyStatus(int key) { #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) - return glfwGetKey(window, key); + return glfwGetKey(CORE.Window.handle, key); #elif defined(PLATFORM_ANDROID) // NOTE: Android supports up to 260 keys if (key < 0 || key > 260) return false; - else return currentKeyState[key]; + else return CORE.Input.Keyboard.currentKeyState[key]; #elif defined(PLATFORM_RPI) || defined(PLATFORM_UWP) // NOTE: Keys states are filled in PollInputEvents() if (key < 0 || key > 511) return false; - else return currentKeyState[key]; + else return CORE.Input.Keyboard.currentKeyState[key]; #endif } @@ -3408,13 +3418,13 @@ static bool GetKeyStatus(int key) static bool GetMouseButtonStatus(int button) { #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) - return glfwGetMouseButton(window, button); + return glfwGetMouseButton(CORE.Window.handle, button); #elif defined(PLATFORM_ANDROID) // TODO: Check for virtual mouse? return false; #elif defined(PLATFORM_RPI) || defined(PLATFORM_UWP) // NOTE: Mouse buttons states are filled in PollInputEvents() - return currentMouseState[button]; + return CORE.Input.Mouse.currentButtonState[button]; #endif } @@ -3521,53 +3531,53 @@ static void PollInputEvents(void) #endif // Reset key pressed registered - keyPressedQueueCount = 0; + CORE.Input.Keyboard.keyPressedQueueCount = 0; #if !defined(PLATFORM_RPI) // Reset last gamepad button/axis registered state - lastGamepadButtonPressed = -1; - gamepadAxisCount = 0; + CORE.Input.Gamepad.lastButtonPressed = -1; + CORE.Input.Gamepad.axisCount = 0; #endif #if defined(PLATFORM_RPI) // Register previous keys states - for (int i = 0; i < 512; i++)previousKeyState[i] = currentKeyState[i]; + for (int i = 0; i < 512; i++)CORE.Input.Keyboard.previousKeyState[i] = CORE.Input.Keyboard.currentKeyState[i]; // Grab a keypress from the evdev fifo if avalable - if (lastKeyPressedEvdev.Head != lastKeyPressedEvdev.Tail) + if (CORE.Input.Keyboard.lastKeyPressed.Head != CORE.Input.Keyboard.lastKeyPressed.Tail) { - keyPressedQueue[keyPressedQueueCount] = lastKeyPressedEvdev.Contents[lastKeyPressedEvdev.Tail]; // Read the key from the buffer - keyPressedQueueCount++; + CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = CORE.Input.Keyboard.lastKeyPressed.Contents[CORE.Input.Keyboard.lastKeyPressed.Tail]; // Read the key from the buffer + CORE.Input.Keyboard.keyPressedQueueCount++; - lastKeyPressedEvdev.Tail = (lastKeyPressedEvdev.Tail + 1) & 0x07; // Increment the tail pointer forwards and binary wraparound after 7 (fifo is 8 elements long) + CORE.Input.Keyboard.lastKeyPressed.Tail = (CORE.Input.Keyboard.lastKeyPressed.Tail + 1) & 0x07; // Increment the tail pointer forwards and binary wraparound after 7 (fifo is 8 elements long) } // Register previous mouse states - previousMouseWheelY = currentMouseWheelY; - currentMouseWheelY = 0; + CORE.Input.Mouse.previousWheelMove = CORE.Input.Mouse.currentWheelMove; + CORE.Input.Mouse.currentWheelMove = 0; for (int i = 0; i < 3; i++) { - previousMouseState[i] = currentMouseState[i]; - currentMouseState[i] = currentMouseStateEvdev[i]; + CORE.Input.Mouse.previousButtonState[i] = CORE.Input.Mouse.currentButtonState[i]; + CORE.Input.Mouse.currentButtonState[i] = currentButtonStateEvdev[i]; } #endif #if defined(PLATFORM_UWP) // Register previous keys states - for (int i = 0; i < 512; i++) previousKeyState[i] = currentKeyState[i]; + for (int i = 0; i < 512; i++) CORE.Input.Keyboard.previousKeyState[i] = CORE.Input.Keyboard.currentKeyState[i]; for (int i = 0; i < MAX_GAMEPADS; i++) { - if (gamepadReady[i]) + if (CORE.Input.Gamepad.ready[i]) { - for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) previousGamepadState[i][k] = currentGamepadState[i][k]; + for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) CORE.Input.Gamepad.previousState[i][k] = CORE.Input.Gamepad.currentState[i][k]; } } // Register previous mouse states - previousMouseWheelY = currentMouseWheelY; - currentMouseWheelY = 0; - for (int i = 0; i < 3; i++) previousMouseState[i] = currentMouseState[i]; + CORE.Input.Mouse.previousWheelMove = CORE.Input.Mouse.currentWheelMove; + CORE.Input.Mouse.currentWheelMove = 0; + for (int i = 0; i < 3; i++) CORE.Input.Mouse.previousButtonState[i] = CORE.Input.Mouse.currentButtonState[i]; // Loop over pending messages while (HasMessageFromUWP()) @@ -3649,40 +3659,40 @@ static void PollInputEvents(void) default: break; } - if (actualKey > -1) currentKeyState[actualKey] = msg->paramChar0; + if (actualKey > -1) CORE.Input.Keyboard.currentKeyState[actualKey] = msg->paramChar0; } break; - case UWP_MSG_REGISTER_CLICK: currentMouseState[msg->paramInt0] = msg->paramChar0; break; - case UWP_MSG_SCROLL_WHEEL_UPDATE: currentMouseWheelY += msg->paramInt0; break; - case UWP_MSG_UPDATE_MOUSE_LOCATION: mousePosition = msg->paramVector0; break; - case UWP_MSG_SET_GAMEPAD_ACTIVE: if (msg->paramInt0 < MAX_GAMEPADS) gamepadReady[msg->paramInt0] = msg->paramBool0; break; + case UWP_MSG_REGISTER_CLICK: CORE.Input.Mouse.currentButtonState[msg->paramInt0] = msg->paramChar0; break; + case UWP_MSG_SCROLL_WHEEL_UPDATE: CORE.Input.Mouse.currentWheelMove += msg->paramInt0; break; + case UWP_MSG_UPDATE_MOUSE_LOCATION: CORE.Input.Mouse.position = msg->paramVector0; break; + case UWP_MSG_SET_GAMEPAD_ACTIVE: if (msg->paramInt0 < MAX_GAMEPADS) CORE.Input.Gamepad.ready[msg->paramInt0] = msg->paramBool0; break; case UWP_MSG_SET_GAMEPAD_BUTTON: { - if ((msg->paramInt0 < MAX_GAMEPADS) && (msg->paramInt1 < MAX_GAMEPAD_BUTTONS)) currentGamepadState[msg->paramInt0][msg->paramInt1] = msg->paramChar0; + if ((msg->paramInt0 < MAX_GAMEPADS) && (msg->paramInt1 < MAX_GAMEPAD_BUTTONS)) CORE.Input.Gamepad.currentState[msg->paramInt0][msg->paramInt1] = msg->paramChar0; } break; case UWP_MSG_SET_GAMEPAD_AXIS: { - if ((msg->paramInt0 < MAX_GAMEPADS) && (msg->paramInt1 < MAX_GAMEPAD_AXIS)) gamepadAxisState[msg->paramInt0][msg->paramInt1] = msg->paramFloat0; + if ((msg->paramInt0 < MAX_GAMEPADS) && (msg->paramInt1 < MAX_GAMEPAD_AXIS)) CORE.Input.Gamepad.axisState[msg->paramInt0][msg->paramInt1] = msg->paramFloat0; // Register buttons for 2nd triggers - currentGamepadState[msg->paramInt0][GAMEPAD_BUTTON_LEFT_TRIGGER_2] = (char)(gamepadAxisState[msg->paramInt0][GAMEPAD_AXIS_LEFT_TRIGGER] > 0.1); - currentGamepadState[msg->paramInt0][GAMEPAD_BUTTON_RIGHT_TRIGGER_2] = (char)(gamepadAxisState[msg->paramInt0][GAMEPAD_AXIS_RIGHT_TRIGGER] > 0.1); + CORE.Input.Gamepad.currentState[msg->paramInt0][GAMEPAD_BUTTON_LEFT_TRIGGER_2] = (char)(CORE.Input.Gamepad.axisState[msg->paramInt0][GAMEPAD_AXIS_LEFT_TRIGGER] > 0.1); + CORE.Input.Gamepad.currentState[msg->paramInt0][GAMEPAD_BUTTON_RIGHT_TRIGGER_2] = (char)(CORE.Input.Gamepad.axisState[msg->paramInt0][GAMEPAD_AXIS_RIGHT_TRIGGER] > 0.1); } break; case UWP_MSG_SET_DISPLAY_DIMS: { - displayWidth = msg->paramVector0.x; - displayHeight = msg->paramVector0.y; + CORE.Window.display.width = msg->paramVector0.x; + CORE.Window.display.height = msg->paramVector0.y; } break; case UWP_MSG_HANDLE_RESIZE: { - eglQuerySurface(display, surface, EGL_WIDTH, &screenWidth); - eglQuerySurface(display, surface, EGL_HEIGHT, &screenHeight); + eglQuerySurface(CORE.Window.device, CORE.Window.surface, EGL_WIDTH, &CORE.Window.screen.width); + eglQuerySurface(CORE.Window.device, CORE.Window.surface, EGL_HEIGHT, &CORE.Window.screen.height); // If window is resized, viewport and projection matrix needs to be re-calculated - rlViewport(0, 0, screenWidth, screenHeight); // Set viewport width and height + rlViewport(0, 0, CORE.Window.screen.width, CORE.Window.screen.height); // Set viewport width and height rlMatrixMode(RL_PROJECTION); // Switch to PROJECTION matrix rlLoadIdentity(); // Reset current matrix (PROJECTION) - rlOrtho(0, screenWidth, screenHeight, 0, 0.0f, 1.0f); // Orthographic projection mode with top-left corner at (0,0) + rlOrtho(0, CORE.Window.screen.width, CORE.Window.screen.height, 0, 0.0f, 1.0f); // Orthographic projection mode with top-left corner at (0,0) rlMatrixMode(RL_MODELVIEW); // Switch back to MODELVIEW matrix rlLoadIdentity(); // Reset current matrix (MODELVIEW) rlClearScreenBuffers(); // Clear screen buffers (color and depth) @@ -3690,15 +3700,15 @@ static void PollInputEvents(void) // Window size must be updated to be used on 3D mode to get new aspect ratio (BeginMode3D()) // NOTE: Be careful! GLFW3 will choose the closest fullscreen resolution supported by current monitor, // for example, if reescaling back to 800x450 (desired), it could set 720x480 (closest fullscreen supported) - currentWidth = screenWidth; - currentHeight = screenHeight; + CORE.Window.currentFbo.width = CORE.Window.screen.width; + CORE.Window.currentFbo.height = CORE.Window.screen.height; // NOTE: Postprocessing texture is not scaled to new size - windowResized = true; + CORE.Window.resized = true; } break; - case UWP_MSG_SET_GAME_TIME: currentTime = msg->paramDouble0; break; + case UWP_MSG_SET_GAME_TIME: CORE.Time.current = msg->paramDouble0; break; default: break; } @@ -3711,21 +3721,21 @@ static void PollInputEvents(void) double mouseX; double mouseY; - glfwGetCursorPos(window, &mouseX, &mouseY); + glfwGetCursorPos(CORE.Window.handle, &mouseX, &mouseY); - mousePosition.x = (float)mouseX; - mousePosition.y = (float)mouseY; + CORE.Input.Mouse.position.x = (float)mouseX; + CORE.Input.Mouse.position.y = (float)mouseY; // Keyboard input polling (automatically managed by GLFW3 through callback) // Register previous keys states - for (int i = 0; i < 512; i++) previousKeyState[i] = currentKeyState[i]; + for (int i = 0; i < 512; i++) CORE.Input.Keyboard.previousKeyState[i] = CORE.Input.Keyboard.currentKeyState[i]; // Register previous mouse states - for (int i = 0; i < 3; i++) previousMouseState[i] = currentMouseState[i]; + for (int i = 0; i < 3; i++) CORE.Input.Mouse.previousButtonState[i] = CORE.Input.Mouse.currentButtonState[i]; - previousMouseWheelY = currentMouseWheelY; - currentMouseWheelY = 0; + CORE.Input.Mouse.previousWheelMove = CORE.Input.Mouse.currentWheelMove; + CORE.Input.Mouse.currentWheelMove = 0; #endif #if defined(PLATFORM_DESKTOP) @@ -3733,17 +3743,17 @@ static void PollInputEvents(void) // NOTE: We do it here in case of disconnection for (int i = 0; i < MAX_GAMEPADS; i++) { - if (glfwJoystickPresent(i)) gamepadReady[i] = true; - else gamepadReady[i] = false; + if (glfwJoystickPresent(i)) CORE.Input.Gamepad.ready[i] = true; + else CORE.Input.Gamepad.ready[i] = false; } // Register gamepads buttons events for (int i = 0; i < MAX_GAMEPADS; i++) { - if (gamepadReady[i]) // Check if gamepad is available + if (CORE.Input.Gamepad.ready[i]) // Check if gamepad is available { // Register previous gamepad states - for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) previousGamepadState[i][k] = currentGamepadState[i][k]; + for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) CORE.Input.Gamepad.previousState[i][k] = CORE.Input.Gamepad.currentState[i][k]; // Get current gamepad state // NOTE: There is no callback available, so we get it manually @@ -3758,10 +3768,10 @@ static void PollInputEvents(void) if (buttons[k] == GLFW_PRESS) { - currentGamepadState[i][button] = 1; - lastGamepadButtonPressed = button; + CORE.Input.Gamepad.currentState[i][button] = 1; + CORE.Input.Gamepad.lastButtonPressed = button; } - else currentGamepadState[i][button] = 0; + else CORE.Input.Gamepad.currentState[i][button] = 0; } // Get current axis state @@ -3770,18 +3780,18 @@ static void PollInputEvents(void) for (int k = 0; (axes != NULL) && (k < GLFW_GAMEPAD_AXIS_LAST + 1) && (k < MAX_GAMEPAD_AXIS); k++) { const int axis = GetGamepadAxis(k); - gamepadAxisState[i][axis] = axes[k]; + CORE.Input.Gamepad.axisState[i][axis] = axes[k]; } // Register buttons for 2nd triggers (because GLFW doesn't count these as buttons but rather axis) - currentGamepadState[i][GAMEPAD_BUTTON_LEFT_TRIGGER_2] = (char)(gamepadAxisState[i][GAMEPAD_AXIS_LEFT_TRIGGER] > 0.1); - currentGamepadState[i][GAMEPAD_BUTTON_RIGHT_TRIGGER_2] = (char)(gamepadAxisState[i][GAMEPAD_AXIS_RIGHT_TRIGGER] > 0.1); + CORE.Input.Gamepad.currentState[i][GAMEPAD_BUTTON_LEFT_TRIGGER_2] = (char)(CORE.Input.Gamepad.axisState[i][GAMEPAD_AXIS_LEFT_TRIGGER] > 0.1); + CORE.Input.Gamepad.currentState[i][GAMEPAD_BUTTON_RIGHT_TRIGGER_2] = (char)(CORE.Input.Gamepad.axisState[i][GAMEPAD_AXIS_RIGHT_TRIGGER] > 0.1); - gamepadAxisCount = GLFW_GAMEPAD_AXIS_LAST; + CORE.Input.Gamepad.axisCount = GLFW_GAMEPAD_AXIS_LAST; } } - windowResized = false; + CORE.Window.resized = false; #if defined(SUPPORT_EVENTS_WAITING) glfwWaitEvents(); @@ -3800,7 +3810,7 @@ static void PollInputEvents(void) for (int i = 0; (i < numGamepads) && (i < MAX_GAMEPADS); i++) { // Register previous gamepad button states - for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) previousGamepadState[i][k] = currentGamepadState[i][k]; + for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) CORE.Input.Gamepad.previousState[i][k] = CORE.Input.Gamepad.currentState[i][k]; EmscriptenGamepadEvent gamepadState; @@ -3814,10 +3824,10 @@ static void PollInputEvents(void) const GamepadButton button = GetGamepadButton(j); if (gamepadState.digitalButton[j] == 1) { - currentGamepadState[i][button] = 1; - lastGamepadButtonPressed = button; + CORE.Input.Gamepad.currentState[i][button] = 1; + CORE.Input.Gamepad.lastButtonPressed = button; } - else currentGamepadState[i][button] = 0; + else CORE.Input.Gamepad.currentState[i][button] = 0; //TraceLog(LOG_DEBUG, "Gamepad %d, button %d: Digital: %d, Analog: %g", gamepadState.index, j, gamepadState.digitalButton[j], gamepadState.analogButton[j]); } @@ -3826,10 +3836,10 @@ static void PollInputEvents(void) for (int j = 0; (j < gamepadState.numAxes) && (j < MAX_GAMEPAD_AXIS); j++) { const int axis = GetGamepadAxis(j); - gamepadAxisState[i][axis] = gamepadState.axis[j]; + CORE.Input.Gamepad.axisState[i][axis] = gamepadState.axis[j]; } - gamepadAxisCount = gamepadState.numAxes; + CORE.Input.Gamepad.axisCount = gamepadState.numAxes; } } #endif @@ -3837,20 +3847,24 @@ static void PollInputEvents(void) #if defined(PLATFORM_ANDROID) // Register previous keys states // NOTE: Android supports up to 260 keys - for (int i = 0; i < 260; i++) previousKeyState[i] = currentKeyState[i]; + for (int i = 0; i < 260; i++) CORE.Input.Keyboard.previousKeyState[i] = CORE.Input.Keyboard.currentKeyState[i]; + // Android ALooper_pollAll() variables + int pollResult = 0; + int pollEvents = 0; + // Poll Events (registered events) - // NOTE: Activity is paused if not enabled (appEnabled) - while ((ident = ALooper_pollAll(appEnabled? 0 : -1, NULL, &events,(void**)&source)) >= 0) + // NOTE: Activity is paused if not enabled (CORE.Android.appEnabled) + while ((pollResult = ALooper_pollAll(CORE.Android.appEnabled? 0 : -1, NULL, &pollEvents, (void**)&CORE.Android.source)) >= 0) { // Process this event - if (source != NULL) source->process(androidApp, source); + if (CORE.Android.source != NULL) CORE.Android.source->process(CORE.Android.app, CORE.Android.source); // NOTE: Never close window, native activity is controlled by the system! - if (androidApp->destroyRequested != 0) + if (CORE.Android.app->destroyRequested != 0) { - //windowShouldClose = true; - //ANativeActivity_finish(androidApp->activity); + //CORE.Window.shouldClose = true; + //ANativeActivity_finish(CORE.Android.app->activity); } } #endif @@ -3869,11 +3883,11 @@ static void PollInputEvents(void) static void SwapBuffers(void) { #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) - glfwSwapBuffers(window); + glfwSwapBuffers(CORE.Window.handle); #endif #if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_UWP) - eglSwapBuffers(display, surface); + eglSwapBuffers(CORE.Window.device, CORE.Window.surface); #endif } @@ -3887,15 +3901,15 @@ static void ErrorCallback(int error, const char *description) // GLFW3 Srolling Callback, runs on mouse wheel static void ScrollCallback(GLFWwindow *window, double xoffset, double yoffset) { - currentMouseWheelY = (int)yoffset; + CORE.Input.Mouse.currentWheelMove = (int)yoffset; } // GLFW3 Keyboard Callback, runs on key pressed static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) { - if (key == exitKey && action == GLFW_PRESS) + if (key == CORE.Input.Keyboard.exitKey && action == GLFW_PRESS) { - glfwSetWindowShouldClose(window, GLFW_TRUE); + glfwSetWindowShouldClose(CORE.Window.handle, GLFW_TRUE); // NOTE: Before closing window, while loop must be left! } @@ -3924,7 +3938,7 @@ static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, i char path[512] = { 0 }; #if defined(PLATFORM_ANDROID) - strcpy(path, internalDataPath); + strcpy(path, CORE.Android.internalDataPath); strcat(path, TextFormat("./screenrec%03i.gif", screenshotCounter)); #else strcpy(path, TextFormat("./screenrec%03i.gif", screenshotCounter)); @@ -3932,7 +3946,7 @@ static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, i // NOTE: delay represents the time between frames in the gif, if we capture a gif frame every // 10 game frames and each frame trakes 16.6ms (60fps), delay between gif frames should be ~16.6*10. - GifBegin(path, screenWidth, screenHeight, (int)(GetFrameTime()*10.0f), 8, false); + GifBegin(path, CORE.Window.screen.width, CORE.Window.screen.height, (int)(GetFrameTime()*10.0f), 8, false); screenshotCounter++; TraceLog(LOG_INFO, "Begin animated GIF recording: %s", TextFormat("screenrec%03i.gif", screenshotCounter)); @@ -3947,14 +3961,14 @@ static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, i } #endif // SUPPORT_SCREEN_CAPTURE } - else currentKeyState[key] = action; + else CORE.Input.Keyboard.currentKeyState[key] = action; } // GLFW3 Mouse Button Callback, runs on mouse button pressed static void MouseButtonCallback(GLFWwindow *window, int button, int action, int mods) { - previousMouseState[button] = currentMouseState[button]; - currentMouseState[button] = action; + CORE.Input.Mouse.previousButtonState[button] = CORE.Input.Mouse.currentButtonState[button]; + CORE.Input.Mouse.currentButtonState[button] = action; #if defined(SUPPORT_GESTURES_SYSTEM) && defined(SUPPORT_MOUSE_GESTURES) // Process mouse events as touches to be able to use mouse-gestures @@ -3975,7 +3989,7 @@ static void MouseButtonCallback(GLFWwindow *window, int button, int action, int // Register touch points position, only one point registered gestureEvent.position[0] = GetMousePosition(); - // Normalize gestureEvent.position[0] for screenWidth and screenHeight + // Normalize gestureEvent.position[0] for CORE.Window.screen.width and CORE.Window.screen.height gestureEvent.position[0].x /= (float)GetScreenWidth(); gestureEvent.position[0].y /= (float)GetScreenHeight(); @@ -4002,9 +4016,9 @@ static void MouseCursorPosCallback(GLFWwindow *window, double x, double y) // Register touch points position, only one point registered gestureEvent.position[0] = (Vector2){ (float)x, (float)y }; - touchPosition[0] = gestureEvent.position[0]; + CORE.Input.Touch.position[0] = gestureEvent.position[0]; - // Normalize gestureEvent.position[0] for screenWidth and screenHeight + // Normalize gestureEvent.position[0] for CORE.Window.screen.width and CORE.Window.screen.height gestureEvent.position[0].x /= (float)GetScreenWidth(); gestureEvent.position[0].y /= (float)GetScreenHeight(); @@ -4022,19 +4036,19 @@ static void CharCallback(GLFWwindow *window, unsigned int key) // Ref: https://www.glfw.org/docs/latest/input_guide.html#input_char // Check if there is space available in the queue - if (keyPressedQueueCount < MAX_CHARS_QUEUE) + if (CORE.Input.Keyboard.keyPressedQueueCount < MAX_CHARS_QUEUE) { // Add character to the queue - keyPressedQueue[keyPressedQueueCount] = key; - keyPressedQueueCount++; + CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = key; + CORE.Input.Keyboard.keyPressedQueueCount++; } } // GLFW3 CursorEnter Callback, when cursor enters the window static void CursorEnterCallback(GLFWwindow *window, int enter) { - if (enter == true) cursorOnScreen = true; - else cursorOnScreen = false; + if (enter == true) CORE.Input.Mouse.cursorOnScreen = true; + else CORE.Input.Mouse.cursorOnScreen = false; } // GLFW3 WindowSize Callback, runs when window is resized @@ -4044,21 +4058,21 @@ static void WindowSizeCallback(GLFWwindow *window, int width, int height) SetupViewport(width, height); // Reset viewport and projection matrix for new size // Set current screen size - screenWidth = width; - screenHeight = height; - currentWidth = width; - currentHeight = height; + CORE.Window.screen.width = width; + CORE.Window.screen.height = height; + CORE.Window.currentFbo.width = width; + CORE.Window.currentFbo.height = height; // NOTE: Postprocessing texture is not scaled to new size - windowResized = true; + CORE.Window.resized = true; } // GLFW3 WindowIconify Callback, runs when window is minimized/restored static void WindowIconifyCallback(GLFWwindow *window, int iconified) { - if (iconified) windowMinimized = true; // The window was iconified - else windowMinimized = false; // The window was restored + if (iconified) CORE.Window.minimized = true; // The window was iconified + else CORE.Window.minimized = false; // The window was restored } // GLFW3 Window Drop Callback, runs when drop files into window @@ -4068,15 +4082,15 @@ static void WindowDropCallback(GLFWwindow *window, int count, const char **paths { ClearDroppedFiles(); - dropFilesPath = (char **)RL_MALLOC(sizeof(char *)*count); + CORE.Window.dropFilesPath = (char **)RL_MALLOC(sizeof(char *)*count); for (int i = 0; i < count; i++) { - dropFilesPath[i] = (char *)RL_MALLOC(sizeof(char)*MAX_FILEPATH_LENGTH); - strcpy(dropFilesPath[i], paths[i]); + CORE.Window.dropFilesPath[i] = (char *)RL_MALLOC(sizeof(char)*MAX_FILEPATH_LENGTH); + strcpy(CORE.Window.dropFilesPath[i], paths[i]); } - dropFilesCount = count; + CORE.Window.dropFilesCount = count; } #endif @@ -4095,23 +4109,23 @@ static void AndroidCommandCallback(struct android_app *app, int32_t cmd) { if (app->window != NULL) { - if (contextRebindRequired) + if (CORE.Android.contextRebindRequired) { // Reset screen scaling to full display size EGLint displayFormat; - eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &displayFormat); - ANativeWindow_setBuffersGeometry(app->window, renderWidth, renderHeight, displayFormat); + eglGetConfigAttrib(CORE.Window.device, CORE.Window.config, EGL_NATIVE_VISUAL_ID, &displayFormat); + ANativeWindow_setBuffersGeometry(app->window, CORE.Window.render.width, CORE.Window.render.height, displayFormat); // Recreate display surface and re-attach OpenGL context - surface = eglCreateWindowSurface(display, config, app->window, NULL); - eglMakeCurrent(display, surface, surface, context); + CORE.Window.surface = eglCreateWindowSurface(CORE.Window.device, CORE.Window.config, app->window, NULL); + eglMakeCurrent(CORE.Window.device, CORE.Window.surface, CORE.Window.surface, CORE.Window.context); - contextRebindRequired = false; + CORE.Android.contextRebindRequired = false; } else { // Init graphics device (display device and OpenGL context) - InitGraphicsDevice(screenWidth, screenHeight); + InitGraphicsDevice(CORE.Window.screen.width, CORE.Window.screen.height); // Init hi-res timer InitTimer(); @@ -4120,6 +4134,7 @@ static void AndroidCommandCallback(struct android_app *app, int32_t cmd) // Load default font // NOTE: External function (defined in module: text) LoadFontDefault(); + SetShapesTexture(GetFontDefault().texture, GetFontDefault().recs[95]); #endif // TODO: GPU assets reload in case of lost focus (lost context) @@ -4141,13 +4156,13 @@ static void AndroidCommandCallback(struct android_app *app, int32_t cmd) } break; case APP_CMD_GAINED_FOCUS: { - appEnabled = true; + CORE.Android.appEnabled = true; //ResumeMusicStream(); } break; case APP_CMD_PAUSE: break; case APP_CMD_LOST_FOCUS: { - appEnabled = false; + CORE.Android.appEnabled = false; //PauseMusicStream(); } break; case APP_CMD_TERM_WINDOW: @@ -4155,22 +4170,22 @@ static void AndroidCommandCallback(struct android_app *app, int32_t cmd) // Dettach OpenGL context and destroy display surface // NOTE 1: Detaching context before destroying display surface avoids losing our resources (textures, shaders, VBOs...) // NOTE 2: In some cases (too many context loaded), OS could unload context automatically... :( - eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - eglDestroySurface(display, surface); + eglMakeCurrent(CORE.Window.device, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglDestroySurface(CORE.Window.device, CORE.Window.surface); - contextRebindRequired = true; + CORE.Android.contextRebindRequired = true; } break; case APP_CMD_SAVE_STATE: break; case APP_CMD_STOP: break; case APP_CMD_DESTROY: { // TODO: Finish activity? - //ANativeActivity_finish(androidApp->activity); + //ANativeActivity_finish(CORE.Android.app->activity); } break; case APP_CMD_CONFIG_CHANGED: { - //AConfiguration_fromAssetManager(androidApp->config, androidApp->activity->assetManager); - //print_cur_config(androidApp); + //AConfiguration_fromAssetManager(CORE.Android.app->config, CORE.Android.app->activity->assetManager); + //print_cur_config(CORE.Android.app); // Check screen orientation here! } break; @@ -4189,12 +4204,12 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) if (type == AINPUT_EVENT_TYPE_MOTION) { // Get first touch position - touchPosition[0].x = AMotionEvent_getX(event, 0); - touchPosition[0].y = AMotionEvent_getY(event, 0); + CORE.Input.Touch.position[0].x = AMotionEvent_getX(event, 0); + CORE.Input.Touch.position[0].y = AMotionEvent_getY(event, 0); // Get second touch position - touchPosition[1].x = AMotionEvent_getX(event, 1); - touchPosition[1].y = AMotionEvent_getY(event, 1); + CORE.Input.Touch.position[1].x = AMotionEvent_getX(event, 1); + CORE.Input.Touch.position[1].y = AMotionEvent_getY(event, 1); // Useful functions for gamepad inputs: //AMotionEvent_getAction() @@ -4207,12 +4222,12 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) int32_t keycode = AKeyEvent_getKeyCode(event); if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_DOWN) { - currentKeyState[keycode] = 1; // Key down + CORE.Input.Keyboard.currentKeyState[keycode] = 1; // Key down - keyPressedQueue[keyPressedQueueCount] = keycode; - keyPressedQueueCount++; + CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = keycode; + CORE.Input.Keyboard.keyPressedQueueCount++; } - else currentKeyState[keycode] = 0; // Key up + else CORE.Input.Keyboard.currentKeyState[keycode] = 0; // Key up } else if (type == AINPUT_EVENT_TYPE_KEY) @@ -4224,12 +4239,12 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) // NOTE: Android key action is 0 for down and 1 for up if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_DOWN) { - currentKeyState[keycode] = 1; // Key down + CORE.Input.Keyboard.currentKeyState[keycode] = 1; // Key down - keyPressedQueue[keyPressedQueueCount] = keycode; - keyPressedQueueCount++; + CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = keycode; + CORE.Input.Keyboard.keyPressedQueueCount++; } - else currentKeyState[keycode] = 0; // Key up + else CORE.Input.Keyboard.currentKeyState[keycode] = 0; // Key up if (keycode == AKEYCODE_POWER) { @@ -4280,7 +4295,7 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) gestureEvent.position[0] = (Vector2){ AMotionEvent_getX(event, 0), AMotionEvent_getY(event, 0) }; gestureEvent.position[1] = (Vector2){ AMotionEvent_getX(event, 1), AMotionEvent_getY(event, 1) }; - // Normalize gestureEvent.position[x] for screenWidth and screenHeight + // Normalize gestureEvent.position[x] for CORE.Window.screen.width and CORE.Window.screen.height gestureEvent.position[0].x /= (float)GetScreenWidth(); gestureEvent.position[0].y /= (float)GetScreenHeight(); @@ -4295,11 +4310,11 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) if (flags == AMOTION_EVENT_ACTION_DOWN) { // Get first touch position - touchPosition[0].x = AMotionEvent_getX(event, 0); - touchPosition[0].y = AMotionEvent_getY(event, 0); + CORE.Input.Touch.position[0].x = AMotionEvent_getX(event, 0); + CORE.Input.Touch.position[0].y = AMotionEvent_getY(event, 0); - touchPosition[0].x /= (float)GetScreenWidth(); - touchPosition[0].y /= (float)GetScreenHeight(); + CORE.Input.Touch.position[0].x /= (float)GetScreenWidth(); + CORE.Input.Touch.position[0].y /= (float)GetScreenHeight(); } #endif @@ -4310,25 +4325,23 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) #if defined(PLATFORM_WEB) // Register fullscreen change events -static EM_BOOL EmscriptenFullscreenChangeCallback(int eventType, const EmscriptenFullscreenChangeEvent *e, void *userData) +static EM_BOOL EmscriptenFullscreenChangeCallback(int eventType, const EmscriptenFullscreenChangeEvent *event, void *userData) { - //isFullscreen: int e->isFullscreen - //fullscreenEnabled: int e->fullscreenEnabled - //fs element nodeName: (char *) e->nodeName - //fs element id: (char *) e->id - //Current element size: (int) e->elementWidth, (int) e->elementHeight // WARNING: Not canvas size but full page! - //Screen size:(int) e->screenWidth, (int) e->screenHeight + //isFullscreen: int event->isFullscreen + //fullscreenEnabled: int event->fullscreenEnabled + //fs element nodeName: (char *) event->nodeName + //fs element id: (char *) event->id + //Current element size: (int) event->elementWidth, (int) event->elementHeight + //Screen size:(int) event->screenWidth, (int) event->screenHeight - if (e->isFullscreen) + if (event->isFullscreen) { - TraceLog(LOG_INFO, "Canvas scaled to fullscreen. ElementSize: (%ix%i), ScreenSize(%ix%i)", e->elementWidth, e->elementHeight, e->screenWidth, e->screenHeight); + TraceLog(LOG_INFO, "Canvas scaled to fullscreen. ElementSize: (%ix%i), ScreenSize(%ix%i)", event->elementWidth, event->elementHeight, event->screenWidth, event->screenHeight); } else { - TraceLog(LOG_INFO, "Canvas scaled to windowed. ElementSize: (%ix%i), ScreenSize(%ix%i)", e->elementWidth, e->elementHeight, e->screenWidth, e->screenHeight); + TraceLog(LOG_INFO, "Canvas scaled to windowed. ElementSize: (%ix%i), ScreenSize(%ix%i)", event->elementWidth, event->elementHeight, event->screenWidth, event->screenHeight); } - - TraceLog(LOG_INFO, "Canvas resize?"); // TODO: Depending on scaling factor (screen vs element), calculate factor to scale mouse/touch input @@ -4350,7 +4363,7 @@ static EM_BOOL EmscriptenKeyboardCallback(int eventType, const EmscriptenKeyboar static EM_BOOL EmscriptenMouseCallback(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) { // Lock mouse pointer when click on screen - if ((eventType == EMSCRIPTEN_EVENT_CLICK) && toggleCursorLock) + if ((eventType == EMSCRIPTEN_EVENT_CLICK) && CORE.Input.Mouse.cursorLockRequired) { EmscriptenPointerlockChangeEvent plce; emscripten_get_pointerlock_status(&plce); @@ -4363,7 +4376,7 @@ static EM_BOOL EmscriptenMouseCallback(int eventType, const EmscriptenMouseEvent //if (plce.isActive) TraceLog(LOG_WARNING, "Pointer lock exit did not work!"); } - toggleCursorLock = false; + CORE.Input.Mouse.cursorLockRequired = false; } return 0; @@ -4393,17 +4406,19 @@ static EM_BOOL EmscriptenTouchCallback(int eventType, const EmscriptenTouchEvent gestureEvent.position[1] = (Vector2){ touchEvent->touches[1].targetX, touchEvent->touches[1].targetY }; double canvasWidth, canvasHeight; + // NOTE: emscripten_get_canvas_element_size() returns canvas.width and canvas.height but + // we are looking for actual CSS size: canvas.style.width and canvas.style.height //EMSCRIPTEN_RESULT res = emscripten_get_canvas_element_size("#canvas", &canvasWidth, &canvasHeight); emscripten_get_element_css_size("#canvas", &canvasWidth, &canvasHeight); - // Normalize gestureEvent.position[x] for screenWidth and screenHeight + // Normalize gestureEvent.position[x] for CORE.Window.screen.width and CORE.Window.screen.height gestureEvent.position[0].x *= ((float)GetScreenWidth()/(float)canvasWidth); gestureEvent.position[0].y *= ((float)GetScreenHeight()/(float)canvasHeight); gestureEvent.position[1].x *= ((float)GetScreenWidth()/(float)canvasWidth); gestureEvent.position[1].y *= ((float)GetScreenHeight()/(float)canvasHeight); - touchPosition[0] = gestureEvent.position[0]; - touchPosition[1] = gestureEvent.position[1]; + CORE.Input.Touch.position[0] = gestureEvent.position[0]; + CORE.Input.Touch.position[1] = gestureEvent.position[1]; // Gesture data is sent to gestures system for processing ProcessGestureEvent(gestureEvent); @@ -4412,15 +4427,15 @@ static EM_BOOL EmscriptenTouchCallback(int eventType, const EmscriptenTouchEvent if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) { // Get first touch position - touchPosition[0] = (Vector2){ touchEvent->touches[0].targetX, touchEvent->touches[0].targetY }; + CORE.Input.Touch.position[0] = (Vector2){ touchEvent->touches[0].targetX, touchEvent->touches[0].targetY }; double canvasWidth, canvasHeight; //EMSCRIPTEN_RESULT res = emscripten_get_canvas_element_size("#canvas", &canvasWidth, &canvasHeight); emscripten_get_element_css_size("#canvas", &canvasWidth, &canvasHeight); // Normalize gestureEvent.position[x] for screenWidth and screenHeight - gestureEvent.position[0].x *= ((float)GetScreenWidth()/(float)canvasWidth); - gestureEvent.position[0].y *= ((float)GetScreenHeight()/(float)canvasHeight); + CORE.Input.Touch.position[0].x *= ((float)GetScreenWidth()/(float)canvasWidth); + CORE.Input.Touch.position[0].y *= ((float)GetScreenHeight()/(float)canvasHeight); } #endif @@ -4439,8 +4454,8 @@ static EM_BOOL EmscriptenGamepadCallback(int eventType, const EmscriptenGamepadE for (int i = 0; i < gamepadEvent->numButtons; ++i) TraceLog(LOG_DEBUG, "Button %d: Digital: %d, Analog: %g", i, gamepadEvent->digitalButton[i], gamepadEvent->analogButton[i]); */ - if ((gamepadEvent->connected) && (gamepadEvent->index < MAX_GAMEPADS)) gamepadReady[gamepadEvent->index] = true; - else gamepadReady[gamepadEvent->index] = false; + if ((gamepadEvent->connected) && (gamepadEvent->index < MAX_GAMEPADS)) CORE.Input.Gamepad.ready[gamepadEvent->index] = true; + else CORE.Input.Gamepad.ready[gamepadEvent->index] = false; // TODO: Test gamepadEvent->index @@ -4462,8 +4477,8 @@ static void InitKeyboard(void) // Save terminal keyboard settings and reconfigure terminal with new settings struct termios keyboardNewSettings; - tcgetattr(STDIN_FILENO, &defaultKeyboardSettings); // Get current keyboard settings - keyboardNewSettings = defaultKeyboardSettings; + tcgetattr(STDIN_FILENO, &CORE.Input.Keyboard.defaultSettings); // Get current keyboard settings + keyboardNewSettings = CORE.Input.Keyboard.defaultSettings; // New terminal settings for keyboard: turn off buffering (non-canonical mode), echo and key processing // NOTE: ISIG controls if ^C and ^Z generate break signals or not @@ -4478,7 +4493,7 @@ static void InitKeyboard(void) // NOTE: Reading directly from stdin will give chars already key-mapped by kernel to ASCII or UNICODE // Save old keyboard mode to restore it at the end - if (ioctl(STDIN_FILENO, KDGKBMODE, &defaultKeyboardMode) < 0) + if (ioctl(STDIN_FILENO, KDGKBMODE, &CORE.Input.Keyboard.defaultMode) < 0) { // NOTE: It could mean we are using a remote keyboard through ssh! TraceLog(LOG_WARNING, "Could not change keyboard mode (SSH keyboard?)"); @@ -4511,10 +4526,10 @@ static void ProcessKeyboard(void) bufferByteCount = read(STDIN_FILENO, keysBuffer, MAX_KEYBUFFER_SIZE); // POSIX system call // Reset pressed keys array (it will be filled below) - for (int i = 0; i < 512; i++) currentKeyState[i] = 0; + for (int i = 0; i < 512; i++) CORE.Input.Keyboard.currentKeyState[i] = 0; // Check keys from event input workers (This is the new keyboard reading method) - for (int i = 0; i < 512; i++) currentKeyState[i] = currentKeyStateEvdev[i]; + //for (int i = 0; i < 512; i++) CORE.Input.Keyboard.currentKeyState[i] = CORE.Input.Keyboard.currentKeyStateEvdev[i]; // Fill all read bytes (looking for keys) for (int i = 0; i < bufferByteCount; i++) @@ -4526,7 +4541,7 @@ static void ProcessKeyboard(void) if (keysBuffer[i] == 0x1b) { // Detect ESC to stop program - if (bufferByteCount == 1) currentKeyState[256] = 1; // raylib key: KEY_ESCAPE + if (bufferByteCount == 1) CORE.Input.Keyboard.currentKeyState[256] = 1; // raylib key: KEY_ESCAPE else { if (keysBuffer[i + 1] == 0x5b) // Special function key @@ -4536,18 +4551,18 @@ static void ProcessKeyboard(void) // Process special function keys (F1 - F12) switch (keysBuffer[i + 3]) { - case 0x41: currentKeyState[290] = 1; break; // raylib KEY_F1 - case 0x42: currentKeyState[291] = 1; break; // raylib KEY_F2 - case 0x43: currentKeyState[292] = 1; break; // raylib KEY_F3 - case 0x44: currentKeyState[293] = 1; break; // raylib KEY_F4 - case 0x45: currentKeyState[294] = 1; break; // raylib KEY_F5 - case 0x37: currentKeyState[295] = 1; break; // raylib KEY_F6 - case 0x38: currentKeyState[296] = 1; break; // raylib KEY_F7 - case 0x39: currentKeyState[297] = 1; break; // raylib KEY_F8 - case 0x30: currentKeyState[298] = 1; break; // raylib KEY_F9 - case 0x31: currentKeyState[299] = 1; break; // raylib KEY_F10 - case 0x33: currentKeyState[300] = 1; break; // raylib KEY_F11 - case 0x34: currentKeyState[301] = 1; break; // raylib KEY_F12 + case 0x41: CORE.Input.Keyboard.currentKeyState[290] = 1; break; // raylib KEY_F1 + case 0x42: CORE.Input.Keyboard.currentKeyState[291] = 1; break; // raylib KEY_F2 + case 0x43: CORE.Input.Keyboard.currentKeyState[292] = 1; break; // raylib KEY_F3 + case 0x44: CORE.Input.Keyboard.currentKeyState[293] = 1; break; // raylib KEY_F4 + case 0x45: CORE.Input.Keyboard.currentKeyState[294] = 1; break; // raylib KEY_F5 + case 0x37: CORE.Input.Keyboard.currentKeyState[295] = 1; break; // raylib KEY_F6 + case 0x38: CORE.Input.Keyboard.currentKeyState[296] = 1; break; // raylib KEY_F7 + case 0x39: CORE.Input.Keyboard.currentKeyState[297] = 1; break; // raylib KEY_F8 + case 0x30: CORE.Input.Keyboard.currentKeyState[298] = 1; break; // raylib KEY_F9 + case 0x31: CORE.Input.Keyboard.currentKeyState[299] = 1; break; // raylib KEY_F10 + case 0x33: CORE.Input.Keyboard.currentKeyState[300] = 1; break; // raylib KEY_F11 + case 0x34: CORE.Input.Keyboard.currentKeyState[301] = 1; break; // raylib KEY_F12 default: break; } @@ -4558,10 +4573,10 @@ static void ProcessKeyboard(void) { switch (keysBuffer[i + 2]) { - case 0x41: currentKeyState[265] = 1; break; // raylib KEY_UP - case 0x42: currentKeyState[264] = 1; break; // raylib KEY_DOWN - case 0x43: currentKeyState[262] = 1; break; // raylib KEY_RIGHT - case 0x44: currentKeyState[263] = 1; break; // raylib KEY_LEFT + case 0x41: CORE.Input.Keyboard.currentKeyState[265] = 1; break; // raylib KEY_UP + case 0x42: CORE.Input.Keyboard.currentKeyState[264] = 1; break; // raylib KEY_DOWN + case 0x43: CORE.Input.Keyboard.currentKeyState[262] = 1; break; // raylib KEY_RIGHT + case 0x44: CORE.Input.Keyboard.currentKeyState[263] = 1; break; // raylib KEY_LEFT default: break; } @@ -4574,17 +4589,17 @@ static void ProcessKeyboard(void) } else if (keysBuffer[i] == 0x0a) // raylib KEY_ENTER (don't mix with <linux/input.h> KEY_*) { - currentKeyState[257] = 1; + CORE.Input.Keyboard.currentKeyState[257] = 1; - keyPressedQueue[keyPressedQueueCount] = 257; // Add keys pressed into queue - keyPressedQueueCount++; + CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = 257; // Add keys pressed into queue + CORE.Input.Keyboard.keyPressedQueueCount++; } else if (keysBuffer[i] == 0x7f) // raylib KEY_BACKSPACE { - currentKeyState[259] = 1; + CORE.Input.Keyboard.currentKeyState[259] = 1; - keyPressedQueue[keyPressedQueueCount] = 257; // Add keys pressed into queue - keyPressedQueueCount++; + CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = 257; // Add keys pressed into queue + CORE.Input.Keyboard.keyPressedQueueCount++; } else { @@ -4593,21 +4608,21 @@ static void ProcessKeyboard(void) // Translate lowercase a-z letters to A-Z if ((keysBuffer[i] >= 97) && (keysBuffer[i] <= 122)) { - currentKeyState[(int)keysBuffer[i] - 32] = 1; + CORE.Input.Keyboard.currentKeyState[(int)keysBuffer[i] - 32] = 1; } - else currentKeyState[(int)keysBuffer[i]] = 1; + else CORE.Input.Keyboard.currentKeyState[(int)keysBuffer[i]] = 1; - keyPressedQueue[keyPressedQueueCount] = keysBuffer[i]; // Add keys pressed into queue - keyPressedQueueCount++; + CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = keysBuffer[i]; // Add keys pressed into queue + CORE.Input.Keyboard.keyPressedQueueCount++; } } // Check exit key (same functionality as GLFW3 KeyCallback()) - if (currentKeyState[exitKey] == 1) windowShouldClose = true; + if (CORE.Input.Keyboard.currentKeyState[CORE.Input.Keyboard.exitKey] == 1) CORE.Window.shouldClose = true; #if defined(SUPPORT_SCREEN_CAPTURE) // Check screen capture key (raylib key: KEY_F12) - if (currentKeyState[301] == 1) + if (CORE.Input.Keyboard.currentKeyState[301] == 1) { TakeScreenshot(FormatText("screenshot%03i.png", screenshotCounter)); screenshotCounter++; @@ -4619,10 +4634,10 @@ static void ProcessKeyboard(void) static void RestoreKeyboard(void) { // Reset to default keyboard settings - tcsetattr(STDIN_FILENO, TCSANOW, &defaultKeyboardSettings); + tcsetattr(STDIN_FILENO, TCSANOW, &CORE.Input.Keyboard.defaultSettings); // Reconfigure keyboard to default mode - ioctl(STDIN_FILENO, KDSKBMODE, defaultKeyboardMode); + ioctl(STDIN_FILENO, KDSKBMODE, CORE.Input.Keyboard.defaultMode); } #endif //SUPPORT_SSH_KEYBOARD_RPI @@ -4636,14 +4651,14 @@ static void InitEvdevInput(void) // Reset variables for (int i = 0; i < MAX_TOUCH_POINTS; ++i) { - touchPosition[i].x = -1; - touchPosition[i].y = -1; + CORE.Input.Touch.position[i].x = -1; + CORE.Input.Touch.position[i].y = -1; } // Reset keypress buffer - lastKeyPressedEvdev.Head = 0; - lastKeyPressedEvdev.Tail = 0; + CORE.Input.Keyboard.lastKeyPressed.Head = 0; + CORE.Input.Keyboard.lastKeyPressed.Tail = 0; // Reset keyboard key state - for (int i = 0; i < 512; i++) currentKeyStateEvdev[i] = 0; + for (int i = 0; i < 512; i++) CORE.Input.Keyboard.currentKeyStateEvdev[i] = 0; // Open the linux directory of "/dev/input" directory = opendir(DEFAULT_EVDEV_PATH); @@ -4690,9 +4705,9 @@ static void EventThreadSpawn(char *device) // Open the device and allocate worker //------------------------------------------------------------------------------------------------------- // Find a free spot in the workers array - for (int i = 0; i < sizeof(eventWorkers)/sizeof(InputEventWorker); ++i) + for (int i = 0; i < sizeof(CORE.Input.eventWorker)/sizeof(InputEventWorker); ++i) { - if (eventWorkers[i].threadId == 0) + if (CORE.Input.eventWorker[i].threadId == 0) { freeWorkerId = i; break; @@ -4702,7 +4717,7 @@ static void EventThreadSpawn(char *device) // Select the free worker from array if (freeWorkerId >= 0) { - worker = &(eventWorkers[freeWorkerId]); // Grab a pointer to the worker + worker = &(CORE.Input.eventWorker[freeWorkerId]); // Grab a pointer to the worker memset(worker, 0, sizeof(InputEventWorker)); // Clear the worker } else @@ -4836,21 +4851,21 @@ static void EventThreadSpawn(char *device) // Find touchscreen with the highest index int maxTouchNumber = -1; - for (int i = 0; i < sizeof(eventWorkers)/sizeof(InputEventWorker); ++i) + for (int i = 0; i < sizeof(CORE.Input.eventWorker)/sizeof(InputEventWorker); ++i) { - if (eventWorkers[i].isTouch && (eventWorkers[i].eventNum > maxTouchNumber)) maxTouchNumber = eventWorkers[i].eventNum; + if (CORE.Input.eventWorker[i].isTouch && (CORE.Input.eventWorker[i].eventNum > maxTouchNumber)) maxTouchNumber = CORE.Input.eventWorker[i].eventNum; } // Find toucnscreens with lower indexes - for (int i = 0; i < sizeof(eventWorkers)/sizeof(InputEventWorker); ++i) + for (int i = 0; i < sizeof(CORE.Input.eventWorker)/sizeof(InputEventWorker); ++i) { - if (eventWorkers[i].isTouch && (eventWorkers[i].eventNum < maxTouchNumber)) + if (CORE.Input.eventWorker[i].isTouch && (CORE.Input.eventWorker[i].eventNum < maxTouchNumber)) { - if (eventWorkers[i].threadId != 0) + if (CORE.Input.eventWorker[i].threadId != 0) { TraceLog(LOG_WARNING, "Duplicate touchscreen found, killing touchscreen on event: %d", i); - pthread_cancel(eventWorkers[i].threadId); - close(eventWorkers[i].fd); + pthread_cancel(CORE.Input.eventWorker[i].threadId); + close(CORE.Input.eventWorker[i].fd); } } } @@ -4890,7 +4905,7 @@ static void *EventThread(void *arg) bool gestureUpdate = false; int keycode; - while (!windowShouldClose) + while (!CORE.Window.shouldClose) { // Try to read data from the device and only continue if successful if (read(worker->fd, &event, sizeof(event)) == (int)sizeof(event)) @@ -4900,8 +4915,8 @@ static void *EventThread(void *arg) { if (event.code == REL_X) { - mousePosition.x += event.value; - touchPosition[0].x = mousePosition.x; + CORE.Input.Mouse.position.x += event.value; + CORE.Input.Touch.position[0].x = CORE.Input.Mouse.position.x; #if defined(SUPPORT_GESTURES_SYSTEM) touchAction = TOUCH_MOVE; @@ -4911,8 +4926,8 @@ static void *EventThread(void *arg) if (event.code == REL_Y) { - mousePosition.y += event.value; - touchPosition[0].y = mousePosition.y; + CORE.Input.Mouse.position.y += event.value; + CORE.Input.Touch.position[0].y = CORE.Input.Mouse.position.y; #if defined(SUPPORT_GESTURES_SYSTEM) touchAction = TOUCH_MOVE; @@ -4920,7 +4935,7 @@ static void *EventThread(void *arg) #endif } - if (event.code == REL_WHEEL) currentMouseWheelY += event.value; + if (event.code == REL_WHEEL) CORE.Input.Mouse.currentWheelMove += event.value; } // Absolute movement parsing @@ -4929,7 +4944,7 @@ static void *EventThread(void *arg) // Basic movement if (event.code == ABS_X) { - mousePosition.x = (event.value - worker->absRange.x)*screenWidth/worker->absRange.width; // Scale acording to absRange + CORE.Input.Mouse.position.x = (event.value - worker->absRange.x)*CORE.Window.screen.width/worker->absRange.width; // Scale acording to absRange #if defined(SUPPORT_GESTURES_SYSTEM) touchAction = TOUCH_MOVE; @@ -4939,7 +4954,7 @@ static void *EventThread(void *arg) if (event.code == ABS_Y) { - mousePosition.y = (event.value - worker->absRange.y)*screenHeight/worker->absRange.height; // Scale acording to absRange + CORE.Input.Mouse.position.y = (event.value - worker->absRange.y)*CORE.Window.screen.height/worker->absRange.height; // Scale acording to absRange #if defined(SUPPORT_GESTURES_SYSTEM) touchAction = TOUCH_MOVE; @@ -4952,12 +4967,12 @@ static void *EventThread(void *arg) if (event.code == ABS_MT_POSITION_X) { - if (worker->touchSlot < MAX_TOUCH_POINTS) touchPosition[worker->touchSlot].x = (event.value - worker->absRange.x)*screenWidth/worker->absRange.width; // Scale acording to absRange + if (worker->touchSlot < MAX_TOUCH_POINTS) CORE.Input.Touch.position[worker->touchSlot].x = (event.value - worker->absRange.x)*CORE.Window.screen.width/worker->absRange.width; // Scale acording to absRange } if (event.code == ABS_MT_POSITION_Y) { - if (worker->touchSlot < MAX_TOUCH_POINTS) touchPosition[worker->touchSlot].y = (event.value - worker->absRange.y)*screenHeight/worker->absRange.height; // Scale acording to absRange + if (worker->touchSlot < MAX_TOUCH_POINTS) CORE.Input.Touch.position[worker->touchSlot].y = (event.value - worker->absRange.y)*CORE.Window.screen.height/worker->absRange.height; // Scale acording to absRange } if (event.code == ABS_MT_TRACKING_ID) @@ -4965,8 +4980,8 @@ static void *EventThread(void *arg) if ((event.value < 0) && (worker->touchSlot < MAX_TOUCH_POINTS)) { // Touch has ended for this point - touchPosition[worker->touchSlot].x = -1; - touchPosition[worker->touchSlot].y = -1; + CORE.Input.Touch.position[worker->touchSlot].x = -1; + CORE.Input.Touch.position[worker->touchSlot].y = -1; } } } @@ -4977,7 +4992,7 @@ static void *EventThread(void *arg) // Mouse button parsing if ((event.code == BTN_TOUCH) || (event.code == BTN_LEFT)) { - currentMouseStateEvdev[MOUSE_LEFT_BUTTON] = event.value; + currentButtonStateEvdev[MOUSE_LEFT_BUTTON] = event.value; #if defined(SUPPORT_GESTURES_SYSTEM) if (event.value > 0) touchAction = TOUCH_DOWN; @@ -4986,9 +5001,9 @@ static void *EventThread(void *arg) #endif } - if (event.code == BTN_RIGHT) currentMouseStateEvdev[MOUSE_RIGHT_BUTTON] = event.value; + if (event.code == BTN_RIGHT) currentButtonStateEvdev[MOUSE_RIGHT_BUTTON] = event.value; - if (event.code == BTN_MIDDLE) currentMouseStateEvdev[MOUSE_MIDDLE_BUTTON] = event.value; + if (event.code == BTN_MIDDLE) currentButtonStateEvdev[MOUSE_MIDDLE_BUTTON] = event.value; // Keyboard button parsing if ((event.code >= 1) && (event.code <= 255)) //Keyboard keys appear for codes 1 to 255 @@ -4996,37 +5011,37 @@ static void *EventThread(void *arg) keycode = keymap_US[event.code & 0xFF]; // The code we get is a scancode so we look up the apropriate keycode // Make sure we got a valid keycode - if ((keycode > 0) && (keycode < sizeof(currentKeyState))) + if ((keycode > 0) && (keycode < sizeof(CORE.Input.Keyboard.currentKeyState))) { /* Disabled buffer !! // Store the key information for raylib to later use - currentKeyStateEvdev[keycode] = event.value; + CORE.Input.Keyboard.currentKeyState[keycode] = event.value; if (event.value > 0) { // Add the key int the fifo - lastKeyPressedEvdev.Contents[lastKeyPressedEvdev.Head] = keycode; // Put the data at the front of the fifo snake - lastKeyPressedEvdev.Head = (lastKeyPressedEvdev.Head + 1) & 0x07; // Increment the head pointer forwards and binary wraparound after 7 (fifo is 8 elements long) + CORE.Input.Keyboard.lastKeyPressed.Contents[CORE.Input.Keyboard.lastKeyPressed.Head] = keycode; // Put the data at the front of the fifo snake + CORE.Input.Keyboard.lastKeyPressed.Head = (CORE.Input.Keyboard.lastKeyPressed.Head + 1) & 0x07; // Increment the head pointer forwards and binary wraparound after 7 (fifo is 8 elements long) // TODO: This fifo is not fully threadsafe with multiple writers, so multiple keyboards hitting a key at the exact same time could miss a key (double write to head before it was incremented) } */ - currentKeyState[keycode] = event.value; + CORE.Input.Keyboard.currentKeyState[keycode] = event.value; if (event.value == 1) { - keyPressedQueue[keyPressedQueueCount] = keycode; // Register last key pressed - keyPressedQueueCount++; + CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = keycode; // Register last key pressed + CORE.Input.Keyboard.keyPressedQueueCount++; } #if defined(SUPPORT_SCREEN_CAPTURE) // Check screen capture key (raylib key: KEY_F12) - if (currentKeyState[301] == 1) + if (CORE.Input.Keyboard.currentKeyState[301] == 1) { TakeScreenshot(FormatText("screenshot%03i.png", screenshotCounter)); screenshotCounter++; } #endif - if (currentKeyState[exitKey] == 1) windowShouldClose = true; + if (CORE.Input.Keyboard.currentKeyState[CORE.Input.Keyboard.exitKey] == 1) CORE.Window.shouldClose = true; TraceLog(LOG_DEBUG, "KEY%s ScanCode: %4i KeyCode: %4i",event.value == 0 ? "UP":"DOWN", event.code, keycode); } @@ -5034,11 +5049,11 @@ static void *EventThread(void *arg) } // Screen confinement - if (mousePosition.x < 0) mousePosition.x = 0; - if (mousePosition.x > screenWidth/mouseScale.x) mousePosition.x = screenWidth/mouseScale.x; + if (CORE.Input.Mouse.position.x < 0) CORE.Input.Mouse.position.x = 0; + if (CORE.Input.Mouse.position.x > CORE.Window.screen.width/CORE.Input.Mouse.scale.x) CORE.Input.Mouse.position.x = CORE.Window.screen.width/CORE.Input.Mouse.scale.x; - if (mousePosition.y < 0) mousePosition.y = 0; - if (mousePosition.y > screenHeight/mouseScale.y) mousePosition.y = screenHeight/mouseScale.y; + if (CORE.Input.Mouse.position.y < 0) CORE.Input.Mouse.position.y = 0; + if (CORE.Input.Mouse.position.y > CORE.Window.screen.height/CORE.Input.Mouse.scale.y) CORE.Input.Mouse.position.y = CORE.Window.screen.height/CORE.Input.Mouse.scale.y; // Gesture update if (gestureUpdate) @@ -5049,20 +5064,20 @@ static void *EventThread(void *arg) gestureEvent.pointCount = 0; gestureEvent.touchAction = touchAction; - if (touchPosition[0].x >= 0) gestureEvent.pointCount++; - if (touchPosition[1].x >= 0) gestureEvent.pointCount++; - if (touchPosition[2].x >= 0) gestureEvent.pointCount++; - if (touchPosition[3].x >= 0) gestureEvent.pointCount++; + if (CORE.Input.Touch.position[0].x >= 0) gestureEvent.pointCount++; + if (CORE.Input.Touch.position[1].x >= 0) gestureEvent.pointCount++; + if (CORE.Input.Touch.position[2].x >= 0) gestureEvent.pointCount++; + if (CORE.Input.Touch.position[3].x >= 0) gestureEvent.pointCount++; gestureEvent.pointerId[0] = 0; gestureEvent.pointerId[1] = 1; gestureEvent.pointerId[2] = 2; gestureEvent.pointerId[3] = 3; - gestureEvent.position[0] = touchPosition[0]; - gestureEvent.position[1] = touchPosition[1]; - gestureEvent.position[2] = touchPosition[2]; - gestureEvent.position[3] = touchPosition[3]; + gestureEvent.position[0] = CORE.Input.Touch.position[0]; + gestureEvent.position[1] = CORE.Input.Touch.position[1]; + gestureEvent.position[2] = CORE.Input.Touch.position[2]; + gestureEvent.position[3] = CORE.Input.Touch.position[3]; ProcessGestureEvent(gestureEvent); #endif @@ -5088,19 +5103,19 @@ static void InitGamepad(void) { sprintf(gamepadDev, "%s%i", DEFAULT_GAMEPAD_DEV, i); - if ((gamepadStream[i] = open(gamepadDev, O_RDONLY|O_NONBLOCK)) < 0) + if ((CORE.Input.Gamepad.streamId[i] = open(gamepadDev, O_RDONLY|O_NONBLOCK)) < 0) { // NOTE: Only show message for first gamepad if (i == 0) TraceLog(LOG_WARNING, "Gamepad device could not be opened, no gamepad available"); } else { - gamepadReady[i] = true; + CORE.Input.Gamepad.ready[i] = true; // NOTE: Only create one thread if (i == 0) { - int error = pthread_create(&gamepadThreadId, NULL, &GamepadThread, NULL); + int error = pthread_create(&CORE.Input.Gamepad.threadId, NULL, &GamepadThread, NULL); if (error != 0) TraceLog(LOG_WARNING, "Error creating gamepad input event thread"); else TraceLog(LOG_INFO, "Gamepad device initialized successfully"); @@ -5126,11 +5141,11 @@ static void *GamepadThread(void *arg) // Read gamepad event struct js_event gamepadEvent; - while (!windowShouldClose) + while (!CORE.Window.shouldClose) { for (int i = 0; i < MAX_GAMEPADS; i++) { - if (read(gamepadStream[i], &gamepadEvent, sizeof(struct js_event)) == (int)sizeof(struct js_event)) + if (read(CORE.Input.Gamepad.streamId[i], &gamepadEvent, sizeof(struct js_event)) == (int)sizeof(struct js_event)) { gamepadEvent.type &= ~JS_EVENT_INIT; // Ignore synthetic events @@ -5142,10 +5157,10 @@ static void *GamepadThread(void *arg) if (gamepadEvent.number < MAX_GAMEPAD_BUTTONS) { // 1 - button pressed, 0 - button released - currentGamepadState[i][gamepadEvent.number] = (int)gamepadEvent.value; + CORE.Input.Gamepad.currentState[i][gamepadEvent.number] = (int)gamepadEvent.value; - if ((int)gamepadEvent.value == 1) lastGamepadButtonPressed = gamepadEvent.number; - else lastGamepadButtonPressed = -1; + if ((int)gamepadEvent.value == 1) CORE.Input.Gamepad.lastButtonPressed = gamepadEvent.number; + else CORE.Input.Gamepad.lastButtonPressed = -1; } } else if (gamepadEvent.type == JS_EVENT_AXIS) @@ -5155,7 +5170,7 @@ static void *GamepadThread(void *arg) if (gamepadEvent.number < MAX_GAMEPAD_AXIS) { // NOTE: Scaling of gamepadEvent.value to get values between -1..1 - gamepadAxisState[i][gamepadEvent.number] = (float)gamepadEvent.value/32768; + CORE.Input.Gamepad.axisState[i][gamepadEvent.number] = (float)gamepadEvent.value/32768; } } } |
