diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core.c | 561 | ||||
| -rw-r--r-- | src/uwp_events.h | 88 |
2 files changed, 31 insertions, 618 deletions
@@ -11,7 +11,6 @@ * - PLATFORM_RPI: Raspberry Pi 0,1,2,3 (Raspbian, native mode) * - PLATFORM_DRM: Linux native mode, including Raspberry Pi 4 with V3D fkms driver * - PLATFORM_WEB: HTML5 with WebAssembly -* - PLATFORM_UWP: Windows 10 App, Windows Phone, Xbox One * * CONFIGURATION: * @@ -24,17 +23,17 @@ * NOTE: OpenGL ES 2.0 is required and graphic device is managed by EGL * * #define PLATFORM_RPI -* Windowing and input system configured for Raspberry Pi i native mode (no X.org required, tested on Raspbian), +* Windowing and input system configured for Raspberry Pi in native mode (no XWindow required), +* graphic device is managed by EGL and inputs are processed is raw mode, reading from /dev/input/ +* +* #define PLATFORM_DRM +* Windowing and input system configured for DRM native mode (RPI4 and other devices) * graphic device is managed by EGL and inputs are processed is raw mode, reading from /dev/input/ * * #define PLATFORM_WEB * Windowing and input system configured for HTML5 (run on browser), code converted from C to asm.js * using emscripten compiler. OpenGL ES 2.0 required for direct translation to WebGL equivalent code. * -* #define PLATFORM_UWP -* Universal Windows Platform support, using OpenGL ES 2.0 through ANGLE on multiple Windows platforms, -* including Windows 10 App, Windows Phone and Xbox One platforms. -* * #define SUPPORT_DEFAULT_FONT (default) * Default font is loaded on window initialization to be available for the user to render simple text. * NOTE: If enabled, uses external module functions to load default raylib font (module: text) @@ -167,7 +166,7 @@ #include <sys/stat.h> // Required for: stat() [Used in GetFileModTime()] -#if (defined(PLATFORM_DESKTOP) || defined(PLATFORM_UWP)) && defined(_WIN32) && (defined(_MSC_VER) || defined(__TINYC__)) +#if defined(PLATFORM_DESKTOP) && defined(_WIN32) && (defined(_MSC_VER) || defined(__TINYC__)) #define DIRENT_MALLOC RL_MALLOC #define DIRENT_FREE RL_FREE @@ -192,6 +191,8 @@ // NOTE: Already provided by rlgl implementation (on glad.h) #include "GLFW/glfw3.h" // GLFW3 library: Windows, OpenGL context and Input management // NOTE: GLFW3 already includes gl.h (OpenGL) headers + +//https://randomascii.wordpress.com/2020/10/04/windows-timer-resolution-the-great-rule-change/ // Support retrieving native window handlers #if defined(_WIN32) @@ -256,13 +257,6 @@ //#include "GLES2/gl2.h" // OpenGL ES 2.0 library (not required in this module, only in rlgl) #endif -#if defined(PLATFORM_UWP) - #include "EGL/egl.h" // Native platform windowing system interface - #include "EGL/eglext.h" // EGL extensions - //#include "GLES2/gl2.h" // OpenGL ES 2.0 library (not required in this module, only in rlgl) - #include "uwp_events.h" // UWP bootstrapping functions -#endif - #if defined(PLATFORM_WEB) #define GLFW_INCLUDE_ES2 // GLFW3: Enable OpenGL ES 2.0 (translated to WebGL) #include "GLFW/glfw3.h" // GLFW3 library: Windows, OpenGL context and Input management @@ -361,7 +355,7 @@ typedef struct CoreData { #if defined(PLATFORM_RPI) EGL_DISPMANX_WINDOW_T handle; // Native window handle (graphic device) #endif -#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) || defined(PLATFORM_UWP) +#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) #if defined(PLATFORM_DRM) int fd; // File descriptor for /dev/dri/... drmModeConnector *connector; // Direct Rendering Manager (DRM) mode connector @@ -744,14 +738,6 @@ static void RestoreTerminal(void) // NOTE: data parameter could be used to pass any kind of required data to the initialization void InitWindow(int width, int height, const char *title) { -#if defined(PLATFORM_UWP) - if (!UWPIsConfigured()) - { - TRACELOG(LOG_FATAL, "UWP Functions have not been set yet, please set these before initializing raylib!"); - return; - } -#endif - TRACELOG(LOG_INFO, "Initializing raylib %s", RAYLIB_VERSION); if ((title != NULL) && (title[0] != 0)) CORE.Window.title = title; @@ -762,11 +748,6 @@ void InitWindow(int width, int height, const char *title) CORE.Input.Mouse.cursor = MOUSE_CURSOR_ARROW; CORE.Input.Gamepad.lastButtonPressed = -1; -#if defined(PLATFORM_UWP) - // The axis count is 6 (2 thumbsticks and left and right trigger) - CORE.Input.Gamepad.axisCount = 6; -#endif - #if defined(PLATFORM_ANDROID) CORE.Window.screen.width = width; CORE.Window.screen.height = height; @@ -827,7 +808,7 @@ void InitWindow(int width, int height, const char *title) } } #endif -#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) || defined(PLATFORM_RPI) || defined(PLATFORM_UWP) || defined(PLATFORM_DRM) +#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) // Initialize graphics device (display device and OpenGL context) // NOTE: returns true if window and graphic device has been initialized successfully CORE.Window.ready = InitGraphicsDevice(width, height); @@ -910,7 +891,7 @@ void InitWindow(int width, int height, const char *title) CORE.Time.frameCounter = 0; #endif -#endif // PLATFORM_DESKTOP || PLATFORM_WEB || PLATFORM_RPI || PLATFORM_DRM || PLATFORM_UWP +#endif // PLATFORM_DESKTOP || PLATFORM_WEB || PLATFORM_RPI || PLATFORM_DRM } // Close window and unload OpenGL context @@ -936,11 +917,11 @@ void CloseWindow(void) glfwTerminate(); #endif -#if defined(_WIN32) && defined(SUPPORT_WINMM_HIGHRES_TIMER) && !defined(SUPPORT_BUSY_WAIT_LOOP) && !defined(PLATFORM_UWP) +#if defined(_WIN32) && defined(SUPPORT_WINMM_HIGHRES_TIMER) && !defined(SUPPORT_BUSY_WAIT_LOOP) timeEndPeriod(1); // Restore time period #endif -#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) || defined(PLATFORM_UWP) +#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) #if defined(PLATFORM_DRM) if (CORE.Window.prevFB) { @@ -1073,7 +1054,7 @@ bool WindowShouldClose(void) else return true; #endif -#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) || defined(PLATFORM_UWP) +#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) if (CORE.Window.ready) return CORE.Window.shouldClose; else return true; #endif @@ -1103,7 +1084,7 @@ bool IsWindowHidden(void) // Check if window has been minimized bool IsWindowMinimized(void) { -#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) || defined(PLATFORM_UWP) +#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) return ((CORE.Window.flags & FLAG_WINDOW_MINIMIZED) > 0); #else return false; @@ -1123,7 +1104,7 @@ bool IsWindowMaximized(void) // Check if window has the focus bool IsWindowFocused(void) { -#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) || defined(PLATFORM_UWP) +#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) return ((CORE.Window.flags & FLAG_WINDOW_UNFOCUSED) == 0); // TODO! #else return true; @@ -1133,7 +1114,7 @@ bool IsWindowFocused(void) // Check if window has been resizedLastFrame bool IsWindowResized(void) { -#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) || defined(PLATFORM_UWP) +#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) return CORE.Window.resizedLastFrame; #else return false; @@ -1876,9 +1857,7 @@ void ShowCursor(void) #if defined(PLATFORM_DESKTOP) glfwSetInputMode(CORE.Window.handle, GLFW_CURSOR, GLFW_CURSOR_NORMAL); #endif -#if defined(PLATFORM_UWP) - UWPGetMouseShowFunc()(); -#endif + CORE.Input.Mouse.cursorHidden = false; } @@ -1888,9 +1867,7 @@ void HideCursor(void) #if defined(PLATFORM_DESKTOP) glfwSetInputMode(CORE.Window.handle, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); #endif -#if defined(PLATFORM_UWP) - UWPGetMouseHideFunc()(); -#endif + CORE.Input.Mouse.cursorHidden = true; } @@ -1909,9 +1886,7 @@ void EnableCursor(void) #if defined(PLATFORM_WEB) emscripten_exit_pointerlock(); #endif -#if defined(PLATFORM_UWP) - UWPGetMouseUnlockFunc()(); -#endif + CORE.Input.Mouse.cursorHidden = false; } @@ -1924,9 +1899,7 @@ void DisableCursor(void) #if defined(PLATFORM_WEB) emscripten_request_pointerlock("#canvas", 1); #endif -#if defined(PLATFORM_UWP) - UWPGetMouseLockFunc()(); -#endif + CORE.Input.Mouse.cursorHidden = true; } @@ -2667,10 +2640,6 @@ double GetTime(void) return (double)(time - CORE.Time.base)*1e-9; // Elapsed time since InitTimer() #endif - -#if defined(PLATFORM_UWP) - return UWPGetQueryTimeFunc()(); -#endif } // Setup window configuration flags (view FLAGS) @@ -3517,9 +3486,6 @@ void SetMousePosition(int x, int y) // NOTE: emscripten not implemented glfwSetCursorPos(CORE.Window.handle, CORE.Input.Mouse.currentPosition.x, CORE.Input.Mouse.currentPosition.y); #endif -#if defined(PLATFORM_UWP) - UWPGetMouseSetPosFunc()(x, y); -#endif } // Set mouse offset @@ -3567,7 +3533,7 @@ void SetMouseCursor(int cursor) // Get touch position X for touch point 0 (relative to screen size) int GetTouchX(void) { -#if defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB) || defined(PLATFORM_UWP) +#if defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB) return (int)CORE.Input.Touch.position[0].x; #else // PLATFORM_DESKTOP, PLATFORM_RPI, PLATFORM_DRM return GetMouseX(); @@ -3577,7 +3543,7 @@ int GetTouchX(void) // Get touch position Y for touch point 0 (relative to screen size) int GetTouchY(void) { -#if defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB) || defined(PLATFORM_UWP) +#if defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB) return (int)CORE.Input.Touch.position[0].y; #else // PLATFORM_DESKTOP, PLATFORM_RPI, PLATFORM_DRM return GetMouseY(); @@ -3611,7 +3577,7 @@ Vector2 GetTouchPosition(int index) position.y = position.y*((float)CORE.Window.render.height/(float)CORE.Window.display.height) - CORE.Window.renderOffset.y/2; } #endif -#if defined(PLATFORM_WEB) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) || defined(PLATFORM_UWP) +#if defined(PLATFORM_WEB) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) if (index < MAX_TOUCH_POINTS) position = CORE.Input.Touch.position[index]; else TRACELOG(LOG_WARNING, "INPUT: Required touch point out of range (Max touch points: %i)", MAX_TOUCH_POINTS); @@ -3901,7 +3867,7 @@ static bool InitGraphicsDevice(int width, int height) } #endif // PLATFORM_DESKTOP || PLATFORM_WEB -#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) || defined(PLATFORM_UWP) +#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) CORE.Window.fullscreen = true; CORE.Window.flags |= FLAG_FULLSCREEN_MODE; @@ -4102,175 +4068,6 @@ static bool InitGraphicsDevice(int width, int height) EGL_NONE }; -#if defined(PLATFORM_UWP) - const EGLint surfaceAttributes[] = - { - // EGL_ANGLE_SURFACE_RENDER_TO_BACK_BUFFER is part of the same optimization as EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER (see above). - // If you have compilation issues with it then please update your Visual Studio templates. - EGL_ANGLE_SURFACE_RENDER_TO_BACK_BUFFER, EGL_TRUE, - EGL_NONE - }; - - const EGLint defaultDisplayAttributes[] = - { - // These are the default display attributes, used to request ANGLE's D3D11 renderer. - // eglInitialize will only succeed with these attributes if the hardware supports D3D11 Feature Level 10_0+. - EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, - - // EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER is an optimization that can have large performance benefits on mobile devices. - // Its syntax is subject to change, though. Please update your Visual Studio templates if you experience compilation issues with it. - EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER, EGL_TRUE, - - // EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE is an option that enables ANGLE to automatically call - // the IDXGIDevice3::Trim method on behalf of the application when it gets suspended. - // Calling IDXGIDevice3::Trim when an application is suspended is a Windows Store application certification requirement. - EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_TRUE, - EGL_NONE, - }; - - const EGLint fl9_3DisplayAttributes[] = - { - // These can be used to request ANGLE's D3D11 renderer, with D3D11 Feature Level 9_3. - // These attributes are used if the call to eglInitialize fails with the default display attributes. - EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, - EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, 9, - EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, 3, - EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER, EGL_TRUE, - EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_TRUE, - EGL_NONE, - }; - - const EGLint warpDisplayAttributes[] = - { - // These attributes can be used to request D3D11 WARP. - // They are used if eglInitialize fails with both the default display attributes and the 9_3 display attributes. - EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, - EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE, - EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER, EGL_TRUE, - EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_TRUE, - EGL_NONE, - }; - - // 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) - { - TRACELOG(LOG_WARNING, "DISPLAY: Failed to get function pointer: eglGetPlatformDisplayEXT()"); - return false; - } - - // - // To initialize the display, we make three sets of calls to eglGetPlatformDisplayEXT and eglInitialize, with varying - // parameters passed to eglGetPlatformDisplayEXT: - // 1) The first calls uses "defaultDisplayAttributes" as a parameter. This corresponds to D3D11 Feature Level 10_0+. - // 2) If eglInitialize fails for step 1 (e.g. because 10_0+ isn't supported by the default GPU), then we try again - // using "fl9_3DisplayAttributes". This corresponds to D3D11 Feature Level 9_3. - // 3) If eglInitialize fails for step 2 (e.g. because 9_3+ isn't supported by the default GPU), then we try again - // using "warpDisplayAttributes". This corresponds to D3D11 Feature Level 11_0 on WARP, a D3D11 software rasterizer. - // - - // This tries to initialize EGL to D3D11 Feature Level 10_0+. See above comment for details. - CORE.Window.device = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, defaultDisplayAttributes); - if (CORE.Window.device == EGL_NO_DISPLAY) - { - TRACELOG(LOG_WARNING, "DISPLAY: Failed to initialize EGL device"); - return 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). - CORE.Window.device = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, fl9_3DisplayAttributes); - if (CORE.Window.device == EGL_NO_DISPLAY) - { - TRACELOG(LOG_WARNING, "DISPLAY: Failed to initialize EGL device"); - return 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. - CORE.Window.device = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, warpDisplayAttributes); - if (CORE.Window.device == EGL_NO_DISPLAY) - { - TRACELOG(LOG_WARNING, "DISPLAY: Failed to initialize EGL device"); - return 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, "DISPLAY: Failed to initialize EGL device"); - return false; - } - } - } - - EGLint numConfigs = 0; - if ((eglChooseConfig(CORE.Window.device, framebufferAttribs, &CORE.Window.config, 1, &numConfigs) == EGL_FALSE) || (numConfigs == 0)) - { - TRACELOG(LOG_WARNING, "DISPLAY: Failed to choose first EGL configuration"); - return false; - } - - // Create a PropertySet and initialize with the EGLNativeWindowType. - //PropertySet^ surfaceCreationProperties = ref new PropertySet(); - //surfaceCreationProperties->Insert(ref new String(EGLNativeWindowTypeProperty), window); // CoreWindow^ window - - // You can configure the surface to render at a lower resolution and be scaled up to - // the full window size. The scaling is often free on mobile hardware. - // - // One way to configure the SwapChainPanel is to specify precisely which resolution it should render at. - // Size customRenderSurfaceSize = Size(800, 600); - // surfaceCreationProperties->Insert(ref new String(EGLRenderSurfaceSizeProperty), PropertyValue::CreateSize(customRenderSurfaceSize)); - // - // Another way is to tell the SwapChainPanel to render at a certain scale factor compared to its size. - // e.g. if the SwapChainPanel is 1920x1280 then setting a factor of 0.5f will make the app render at 960x640 - // float customResolutionScale = 0.5f; - // surfaceCreationProperties->Insert(ref new String(EGLRenderResolutionScaleProperty), PropertyValue::CreateSingle(customResolutionScale)); - - - // eglCreateWindowSurface() requires a EGLNativeWindowType parameter, - // In Windows platform: typedef HWND EGLNativeWindowType; - - - // Property: EGLNativeWindowTypeProperty - // Type: IInspectable - // Description: Set this property to specify the window type to use for creating a surface. - // If this property is missing, surface creation will fail. - // - //const wchar_t EGLNativeWindowTypeProperty[] = L"EGLNativeWindowTypeProperty"; - - //https://stackoverflow.com/questions/46550182/how-to-create-eglsurface-using-c-winrt-and-angle - - //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, (EGLNativeWindowType) UWPGetCoreWindowPtr(), surfaceAttributes); - if (CORE.Window.surface == EGL_NO_SURFACE) - { - TRACELOG(LOG_WARNING, "DISPLAY: Failed to create EGL fullscreen surface"); - return false; - } - - CORE.Window.context = eglCreateContext(CORE.Window.device, CORE.Window.config, EGL_NO_CONTEXT, contextAttribs); - if (CORE.Window.context == EGL_NO_CONTEXT) - { - TRACELOG(LOG_WARNING, "DISPLAY: Failed to create EGL context"); - return false; - } - - // 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); - - // Get display size - UWPGetDisplaySizeFunc()(&CORE.Window.display.width, &CORE.Window.display.height); - - // Use the width and height of the surface for render - CORE.Window.render.width = CORE.Window.screen.width; - CORE.Window.render.height = CORE.Window.screen.height; - -#endif // PLATFORM_UWP - #if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) EGLint numConfigs = 0; @@ -4470,7 +4267,7 @@ static bool InitGraphicsDevice(int width, int 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 || PLATFORM_DRM || PLATFORM_UWP +#endif // PLATFORM_ANDROID || PLATFORM_RPI || PLATFORM_DRM // Load OpenGL extensions // NOTE: GL procedures address loader is required to load extensions @@ -4512,7 +4309,7 @@ static bool InitGraphicsDevice(int width, int height) ClearBackground(RAYWHITE); // Default background color for raylib games :P -#if defined(PLATFORM_ANDROID) || defined(PLATFORM_UWP) +#if defined(PLATFORM_ANDROID) CORE.Window.ready = true; #endif @@ -4634,7 +4431,7 @@ static void InitTimer(void) // However, it can also reduce overall system performance, because the thread scheduler switches tasks more often. // High resolutions can also prevent the CPU power management system from entering power-saving modes. // Setting a higher resolution does not improve the accuracy of the high-resolution performance counter. -#if defined(_WIN32) && defined(SUPPORT_WINMM_HIGHRES_TIMER) && !defined(SUPPORT_BUSY_WAIT_LOOP) && !defined(PLATFORM_UWP) +#if defined(_WIN32) && defined(SUPPORT_WINMM_HIGHRES_TIMER) && !defined(SUPPORT_BUSY_WAIT_LOOP) timeBeginPeriod(1); // Setup high-resolution timer to 1ms (granularity of 1-2 ms) #endif @@ -4671,10 +4468,6 @@ void WaitTime(float ms) #endif // System halt functions - #if defined(PLATFORM_UWP) - UWPGetSleepFunc()(ms/1000); - return; - #endif #if defined(_WIN32) Sleep((unsigned int)ms); #endif @@ -4709,7 +4502,7 @@ void SwapScreenBuffer(void) glfwSwapBuffers(CORE.Window.handle); #endif -#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) || defined(PLATFORM_UWP) +#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) || defined(PLATFORM_DRM) eglSwapBuffers(CORE.Window.device, CORE.Window.surface); #if defined(PLATFORM_DRM) @@ -4761,7 +4554,7 @@ void SwapScreenBuffer(void) CORE.Window.prevBO = bo; #endif // PLATFORM_DRM -#endif // PLATFORM_ANDROID || PLATFORM_RPI || PLATFORM_DRM || PLATFORM_UWP +#endif // PLATFORM_ANDROID || PLATFORM_RPI || PLATFORM_DRM } // Register all input events @@ -4801,7 +4594,7 @@ void PollInputEvents(void) // Register gamepads buttons events for (int i = 0; i < MAX_GAMEPADS; i++) { - if (CORE.Input.Gamepad.ready[i]) // Check if gamepad is available + if (CORE.Input.Gamepad.ready[i]) { // Register previous gamepad states for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) CORE.Input.Gamepad.previousButtonState[i][k] = CORE.Input.Gamepad.currentButtonState[i][k]; @@ -4809,25 +4602,6 @@ void PollInputEvents(void) } #endif -#if defined(PLATFORM_UWP) - // Register previous keys states - 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 (CORE.Input.Gamepad.ready[i]) - { - for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) CORE.Input.Gamepad.previousButtonState[i][k] = CORE.Input.Gamepad.currentButtonState[i][k]; - } - } - - // Register previous mouse states - CORE.Input.Mouse.previousWheelMove = CORE.Input.Mouse.currentWheelMove; - CORE.Input.Mouse.currentWheelMove = 0.0f; - - for (int i = 0; i < 3; i++) CORE.Input.Mouse.previousButtonState[i] = CORE.Input.Mouse.currentButtonState[i]; -#endif // PLATFORM_UWP - #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) // Keyboard/Mouse input polling (automatically managed by GLFW3 through callback) @@ -6412,279 +6186,6 @@ static void *GamepadThread(void *arg) } #endif // PLATFORM_RPI || PLATFORM_DRM -#if defined(PLATFORM_UWP) -// UWP function pointers -// NOTE: Those pointers are set by UWP App -static UWPQueryTimeFunc uwpQueryTimeFunc = NULL; -static UWPSleepFunc uwpSleepFunc = NULL; -static UWPDisplaySizeFunc uwpDisplaySizeFunc = NULL; -static UWPMouseFunc uwpMouseLockFunc = NULL; -static UWPMouseFunc uwpMouseUnlockFunc = NULL; -static UWPMouseFunc uwpMouseShowFunc = NULL; -static UWPMouseFunc uwpMouseHideFunc = NULL; -static UWPMouseSetPosFunc uwpMouseSetPosFunc = NULL; -static void *uwpCoreWindow = NULL; - -// Check all required UWP function pointers have been set -bool UWPIsConfigured() -{ - bool pass = true; - - if (uwpQueryTimeFunc == NULL) { TRACELOG(LOG_WARNING, "UWP: UWPSetQueryTimeFunc() must be called with a valid function before InitWindow()"); pass = false; } - if (uwpSleepFunc == NULL) { TRACELOG(LOG_WARNING, "UWP: UWPSetSleepFunc() must be called with a valid function before InitWindow()"); pass = false; } - if (uwpDisplaySizeFunc == NULL) { TRACELOG(LOG_WARNING, "UWP: UWPSetDisplaySizeFunc() must be called with a valid function before InitWindow()"); pass = false; } - if (uwpMouseLockFunc == NULL) { TRACELOG(LOG_WARNING, "UWP: UWPSetMouseLockFunc() must be called with a valid function before InitWindow()"); pass = false; } - if (uwpMouseUnlockFunc == NULL) { TRACELOG(LOG_WARNING, "UWP: UWPSetMouseUnlockFunc() must be called with a valid function before InitWindow()"); pass = false; } - if (uwpMouseShowFunc == NULL) { TRACELOG(LOG_WARNING, "UWP: UWPSetMouseShowFunc() must be called with a valid function before InitWindow()"); pass = false; } - if (uwpMouseHideFunc == NULL) { TRACELOG(LOG_WARNING, "UWP: UWPSetMouseHideFunc() must be called with a valid function before InitWindow()"); pass = false; } - if (uwpMouseSetPosFunc == NULL) { TRACELOG(LOG_WARNING, "UWP: UWPSetMouseSetPosFunc() must be called with a valid function before InitWindow()"); pass = false; } - if (uwpCoreWindow == NULL) { TRACELOG(LOG_WARNING, "UWP: A pointer to the UWP core window must be set before InitWindow()"); pass = false; } - - return pass; -} - -// UWP function handlers get/set -void UWPSetDataPath(const char *path) { CORE.Storage.basePath = path; } -UWPQueryTimeFunc UWPGetQueryTimeFunc(void) { return uwpQueryTimeFunc; } -void UWPSetQueryTimeFunc(UWPQueryTimeFunc func) { uwpQueryTimeFunc = func; } -UWPSleepFunc UWPGetSleepFunc(void) { return uwpSleepFunc; } -void UWPSetSleepFunc(UWPSleepFunc func) { uwpSleepFunc = func; } -UWPDisplaySizeFunc UWPGetDisplaySizeFunc(void) { return uwpDisplaySizeFunc; } -void UWPSetDisplaySizeFunc(UWPDisplaySizeFunc func) { uwpDisplaySizeFunc = func; } -UWPMouseFunc UWPGetMouseLockFunc() { return uwpMouseLockFunc; } -void UWPSetMouseLockFunc(UWPMouseFunc func) { uwpMouseLockFunc = func; } -UWPMouseFunc UWPGetMouseUnlockFunc() { return uwpMouseUnlockFunc; } -void UWPSetMouseUnlockFunc(UWPMouseFunc func) { uwpMouseUnlockFunc = func; } -UWPMouseFunc UWPGetMouseShowFunc() { return uwpMouseShowFunc; } -void UWPSetMouseShowFunc(UWPMouseFunc func) { uwpMouseShowFunc = func; } -UWPMouseFunc UWPGetMouseHideFunc() { return uwpMouseHideFunc; } -void UWPSetMouseHideFunc(UWPMouseFunc func) { uwpMouseHideFunc = func; } -UWPMouseSetPosFunc UWPGetMouseSetPosFunc() { return uwpMouseSetPosFunc; } -void UWPSetMouseSetPosFunc(UWPMouseSetPosFunc func) { uwpMouseSetPosFunc = func; } - -void *UWPGetCoreWindowPtr() { return uwpCoreWindow; } -void UWPSetCoreWindowPtr(void *ptr) { uwpCoreWindow = ptr; } -void UWPMouseWheelEvent(int deltaY) { CORE.Input.Mouse.currentWheelMove = (float)deltaY; } - -void UWPKeyDownEvent(int key, bool down, bool controlKey) -{ - if (key == CORE.Input.Keyboard.exitKey && down) - { - // Time to close the window. - CORE.Window.shouldClose = true; - } -#if defined(SUPPORT_SCREEN_CAPTURE) - else if (key == KEY_F12 && down) - { -#if defined(SUPPORT_GIF_RECORDING) - if (controlKey) - { - if (gifRecording) - { - gifRecording = false; - - MsfGifResult result = msf_gif_end(&gifState); - - SaveFileData(TextFormat("%s/screenrec%03i.gif", CORE.Storage.basePath, screenshotCounter), result.data, result.dataSize); - msf_gif_free(result); - - #if defined(PLATFORM_WEB) - // Download file from MEMFS (emscripten memory filesystem) - // saveFileFromMEMFSToDisk() function is defined in raylib/templates/web_shel/shell.html - emscripten_run_script(TextFormat("saveFileFromMEMFSToDisk('%s','%s')", TextFormat("screenrec%03i.gif", screenshotCounter - 1), TextFormat("screenrec%03i.gif", screenshotCounter - 1))); - #endif - - TRACELOG(LOG_INFO, "SYSTEM: Finish animated GIF recording"); - } - else - { - gifRecording = true; - gifFramesCounter = 0; - - msf_gif_begin(&gifState, CORE.Window.screen.width, CORE.Window.screen.height); - screenshotCounter++; - - TRACELOG(LOG_INFO, "SYSTEM: Start animated GIF recording: %s", TextFormat("screenrec%03i.gif", screenshotCounter)); - } - } - else -#endif // SUPPORT_GIF_RECORDING - { - TakeScreenshot(TextFormat("screenshot%03i.png", screenshotCounter)); - screenshotCounter++; - } - } -#endif // SUPPORT_SCREEN_CAPTURE - else - { - CORE.Input.Keyboard.currentKeyState[key] = down; - } -} - -void UWPKeyCharEvent(int key) -{ - if (CORE.Input.Keyboard.keyPressedQueueCount < MAX_KEY_PRESSED_QUEUE) - { - // Add character to the queue - CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = key; - CORE.Input.Keyboard.keyPressedQueueCount++; - } -} - -void UWPMouseButtonEvent(int button, bool down) -{ - CORE.Input.Mouse.currentButtonState[button] = down; - -#if defined(SUPPORT_GESTURES_SYSTEM) && defined(SUPPORT_MOUSE_GESTURES) - // Process mouse events as touches to be able to use mouse-gestures - GestureEvent gestureEvent = { 0 }; - - // Register touch actions - if ((CORE.Input.Mouse.currentButtonState[button] == 1) && (CORE.Input.Mouse.previousButtonState[button] == 0)) gestureEvent.touchAction = TOUCH_DOWN; - else if ((CORE.Input.Mouse.currentButtonState[button] == 0) && (CORE.Input.Mouse.previousButtonState[button] == 1)) gestureEvent.touchAction = TOUCH_UP; - - // NOTE: TOUCH_MOVE event is registered in MouseCursorPosCallback() - - // Assign a pointer ID - gestureEvent.pointerId[0] = 0; - - // Register touch points count - gestureEvent.pointCount = 1; - - // Register touch points position, only one point registered - gestureEvent.position[0] = GetMousePosition(); - - // 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(); - - // Gesture data is sent to gestures system for processing - ProcessGestureEvent(gestureEvent); -#endif -} - -void UWPMousePosEvent(double x, double y) -{ - CORE.Input.Mouse.currentPosition.x = (float)x; - CORE.Input.Mouse.currentPosition.y = (float)y; - CORE.Input.Touch.position[0] = CORE.Input.Mouse.currentPosition; - -#if defined(SUPPORT_GESTURES_SYSTEM) && defined(SUPPORT_MOUSE_GESTURES) - // Process mouse events as touches to be able to use mouse-gestures - GestureEvent gestureEvent = { 0 }; - - gestureEvent.touchAction = TOUCH_MOVE; - - // Assign a pointer ID - gestureEvent.pointerId[0] = 0; - - // Register touch points count - gestureEvent.pointCount = 1; - - // Register touch points position, only one point registered - gestureEvent.position[0] = CORE.Input.Mouse.currentPosition; - - // 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(); - - // Gesture data is sent to gestures system for processing - ProcessGestureEvent(gestureEvent); -#endif -} - -void UWPResizeEvent(int width, int height) -{ - SetupViewport(width, height); // Reset viewport and projection matrix for new size - - // Set current screen size - 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 - - CORE.Window.resizedLastFrame = true; -} - -void UWPActivateGamepadEvent(int gamepad, bool active) -{ - if (gamepad < MAX_GAMEPADS) CORE.Input.Gamepad.ready[gamepad] = active; -} - -void UWPRegisterGamepadButton(int gamepad, int button, bool down) -{ - if (gamepad < MAX_GAMEPADS) - { - if (button < MAX_GAMEPAD_BUTTONS) - { - CORE.Input.Gamepad.currentButtonState[gamepad][button] = down; - CORE.Input.Gamepad.lastButtonPressed = button; - } - } -} - -void UWPRegisterGamepadAxis(int gamepad, int axis, float value) -{ - if (gamepad < MAX_GAMEPADS) - { - if (axis < MAX_GAMEPAD_AXIS) CORE.Input.Gamepad.axisState[gamepad][axis] = value; - } -} - -void UWPGestureMove(int pointer, float x, float y) -{ -#if defined(SUPPORT_GESTURES_SYSTEM) - GestureEvent gestureEvent = { 0 }; - - // Assign the pointer ID and touch action - gestureEvent.pointerId[0] = pointer; - gestureEvent.touchAction = TOUCH_MOVE; - - // Register touch points count - gestureEvent.pointCount = 1; - - // Register touch points position, only one point registered - gestureEvent.position[0].x = x; - gestureEvent.position[0].y = y; - - // 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(); - - // Gesture data is sent to gestures system for processing - ProcessGestureEvent(gestureEvent); -#endif -} - -void UWPGestureTouch(int pointer, float x, float y, bool touch) -{ -#if defined(SUPPORT_GESTURES_SYSTEM) - GestureEvent gestureEvent = { 0 }; - - // Assign the pointer ID and touch action - gestureEvent.pointerId[0] = pointer; - gestureEvent.touchAction = touch ? TOUCH_DOWN : TOUCH_UP; - - // Register touch points count - gestureEvent.pointCount = 1; - - // Register touch points position, only one point registered - gestureEvent.position[0].x = x; - gestureEvent.position[0].y = y; - - // 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(); - - // Gesture data is sent to gestures system for processing - ProcessGestureEvent(gestureEvent); -#endif -} - -#endif // PLATFORM_UWP - #if defined(PLATFORM_DRM) // Search matching DRM mode in connector's mode list static int FindMatchingConnectorMode(const drmModeConnector *connector, const drmModeModeInfo *mode) diff --git a/src/uwp_events.h b/src/uwp_events.h deleted file mode 100644 index 25c7113a..00000000 --- a/src/uwp_events.h +++ /dev/null @@ -1,88 +0,0 @@ -/********************************************************************************************** -* -* raylib.uwp_events - Functions for bootstrapping UWP functionality -* -* -* LICENSE: zlib/libpng -* -* Copyright (c) 2020-2021 Reece Mackie (@Rover656) -* -* This software is provided "as-is", without any express or implied warranty. In no event -* will the authors be held liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, including commercial -* applications, and to alter it and redistribute it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; you must not claim that you -* wrote the original software. If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but is not required. -* -* 2. Altered source versions must be plainly marked as such, and must not be misrepresented -* as being the original software. -* -* 3. This notice may not be removed or altered from any source distribution. -* -**********************************************************************************************/ - -#ifndef UWP_EVENTS_H -#define UWP_EVENTS_H - -#if defined(__cplusplus) -extern "C" { -#endif - -#if defined(PLATFORM_UWP) -bool UWPIsConfigured(); // Check if UWP functions are set and ready to use -void UWPSetDataPath(const char *path); // Set the UWP data path for saving and loading - -typedef double(*UWPQueryTimeFunc)(); // Callback function to query time -UWPQueryTimeFunc UWPGetQueryTimeFunc(void); // Get query time function -void UWPSetQueryTimeFunc(UWPQueryTimeFunc func); // Set query time function - -typedef void (*UWPSleepFunc)(double sleepUntil); // Callback function for sleep -UWPSleepFunc UWPGetSleepFunc(void); // Get sleep function -void UWPSetSleepFunc(UWPSleepFunc func); // Set sleep function - -typedef void (*UWPDisplaySizeFunc)(int *width, int *height); // Callback function for display size change -UWPDisplaySizeFunc UWPGetDisplaySizeFunc(void); // Get display size function -void UWPSetDisplaySizeFunc(UWPDisplaySizeFunc func); // Set display size function - -typedef void (*UWPMouseFunc)(void); // Callback function for mouse cursor control -UWPMouseFunc UWPGetMouseLockFunc(); // Get mouse lock function -void UWPSetMouseLockFunc(UWPMouseFunc func); // Set mouse lock function -UWPMouseFunc UWPGetMouseUnlockFunc(); // Get mouse unlock function -void UWPSetMouseUnlockFunc(UWPMouseFunc func); // Set mouse unlock function -UWPMouseFunc UWPGetMouseShowFunc(); // Get mouse show function -void UWPSetMouseShowFunc(UWPMouseFunc func); // Set mouse show function -UWPMouseFunc UWPGetMouseHideFunc(); // Get mouse hide function -void UWPSetMouseHideFunc(UWPMouseFunc func); // Set mouse hide function - -typedef void (*UWPMouseSetPosFunc)(int x, int y); // Callback function to set mouse position -UWPMouseSetPosFunc UWPGetMouseSetPosFunc(); // Get mouse set position function -void UWPSetMouseSetPosFunc(UWPMouseSetPosFunc func); // Set mouse set position function - -// NOTE: Below functions are implemented in core.c but are placed here so they can be called by user code -// This choice is made as platform-specific code is preferred to be kept away from raylib.h - -void UWPKeyDownEvent(int key, bool down, bool controlKey); // Check for key down event -void UWPKeyCharEvent(int key); // Check for a character event (CoreWindow::CharacterRecieved) -void UWPMouseButtonEvent(int button, bool down); // Check for mouse button state changes event -void UWPMousePosEvent(double x, double y); // Check for mouse cursor move event -void UWPMouseWheelEvent(int deltaY); // Check for mouse wheel move event -void UWPResizeEvent(int width, int height); // Check for window resize event -void UWPActivateGamepadEvent(int gamepad, bool active); // Check for gamepad activated event -void UWPRegisterGamepadButton(int gamepad, int button, bool down); // Check for gamepad button state change event -void UWPRegisterGamepadAxis(int gamepad, int axis, float value); // Check for gamepad axis state change event -void UWPGestureMove(int pointer, float x, float y); // Check for touch point move event -void UWPGestureTouch(int pointer, float x, float y, bool touch); // Check for touch down or up event - -void *UWPGetCoreWindowPtr(); // Get core window pointer -void UWPSetCoreWindowPtr(void *ptr); // Set core window pointer, so that it can be passed to EGL - -#if defined(__cplusplus) -} -#endif - -#endif // PLATFORM_UWP - -#endif // UWP_EVENTS_H |
