Use 'Messages' to handle the cursor functions so code is more portable.

This commit is contained in:
Reece Mackie 2019-04-25 20:52:50 +01:00
parent e29c60cf7a
commit 769aceebb2
5 changed files with 193 additions and 55 deletions

View File

@ -15,7 +15,10 @@ int main(Platform::Array<Platform::String^>^)
return 0; return 0;
} }
App::App() {} App::App()
{
SetConfigFlags(FLAG_SHOW_LOGO);
}
static int posX = 100; static int posX = 100;
static int posY = 100; static int posY = 100;

View File

@ -73,47 +73,6 @@ Vector2 mouseDelta = {0, 0};
//Our mouse cursor //Our mouse cursor
CoreCursor ^regularCursor = ref new CoreCursor(CoreCursorType::Arrow, 0); // The "visible arrow" cursor type CoreCursor ^regularCursor = ref new CoreCursor(CoreCursorType::Arrow, 0); // The "visible arrow" cursor type
bool cursorHidden = false;
void ShowCursor()
{
CoreWindow::GetForCurrentThread()->PointerCursor = regularCursor;
cursorHidden = false;
}
void HideCursor()
{
CoreWindow::GetForCurrentThread()->PointerCursor = nullptr;
cursorHidden = true;
}
bool IsCursorHidden()
{
return cursorHidden;
}
void SetMousePosition(Vector2 position)
{
CoreWindow ^window = CoreWindow::GetForCurrentThread();
Point mousePosScreen = Point(position.x + window->Bounds.X, position.y + window->Bounds.Y);
window->PointerPosition = mousePosScreen;
UWPMousePosition(position.x, position.y);
}
// Enables cursor (unlock cursor)
void EnableCursor()
{
ShowCursor();
SetMousePosition(GetMousePosition()); // The mouse is hidden in the center of the screen - move it to where it should appear
cursorLocked = false;
}
// Disables cursor (lock cursor)
void DisableCursor()
{
HideCursor();
cursorLocked = true;
}
//Base app implementation //Base app implementation
ref class BaseApp : public Windows::ApplicationModel::Core::IFrameworkView ref class BaseApp : public Windows::ApplicationModel::Core::IFrameworkView
@ -193,6 +152,59 @@ protected:
// Input polling // Input polling
void PollInput() void PollInput()
{ {
// Process Messages
{
//Loop over pending messages
while (UWPHasMessages())
{
//Get the message
auto msg = UWPGetMessage();
//Carry out the command
switch(msg->Type)
{
case ShowMouse:
{
CoreWindow::GetForCurrentThread()->PointerCursor = regularCursor;
//Unlock due to below
cursorLocked = false;
break;
}
case HideMouse:
{
//Bug: movement stops, for now we will lock...
CoreWindow::GetForCurrentThread()->PointerCursor = nullptr;
cursorLocked = true;
break;
}
case LockMouse:
{
CoreWindow::GetForCurrentThread()->PointerCursor = regularCursor;
//Unlock due to below
cursorLocked = false;
break;
}
case UnlockMouse:
{
//Bug: movement stops, for now we will lock...
CoreWindow::GetForCurrentThread()->PointerCursor = nullptr;
cursorLocked = true;
break;
}
case SetMouseLocation:
{
CoreWindow ^window = CoreWindow::GetForCurrentThread();
Point mousePosScreen = Point(msg->Float0 + window->Bounds.X, msg->Float1 + window->Bounds.Y);
window->PointerPosition = mousePosScreen;
break;
}
}
//Delete the message
DeleteUWPMessage(msg);
}
}
// Process Mouse // Process Mouse
{ {
CoreWindow ^window = CoreWindow::GetForCurrentThread(); CoreWindow ^window = CoreWindow::GetForCurrentThread();

View File

@ -253,17 +253,11 @@ void SetCameraMode(Camera camera, int mode)
playerEyesPosition = camera.position.y; playerEyesPosition = camera.position.y;
//TODO: Tell UWP that cursor should be enabled/disabled
#if !defined(PLATFORM_UWP)
// Lock cursor for first person and third person cameras // Lock cursor for first person and third person cameras
if ((mode == CAMERA_FIRST_PERSON) || if ((mode == CAMERA_FIRST_PERSON) ||
(mode == CAMERA_THIRD_PERSON)) DisableCursor(); (mode == CAMERA_THIRD_PERSON)) DisableCursor();
else EnableCursor(); else EnableCursor();
#endif
cameraMode = mode; cameraMode = mode;
} }

View File

@ -391,6 +391,23 @@ static int gamepadStream[MAX_GAMEPADS] = { -1 };// Gamepad device file descripto
static pthread_t gamepadThreadId; // Gamepad reading thread id static pthread_t gamepadThreadId; // Gamepad reading thread id
static char gamepadName[64]; // Gamepad name holder static char gamepadName[64]; // Gamepad name holder
#endif #endif
#if defined(PLATFORM_UWP)
// UWP Messages
#define MAX_MESSAGES 128 //If there are over 128 messages, I will cry... either way, this may be too much
static int UWPOutMessageId = -1; //Stores the last index for the message
static UWPMessage* UWPOutMessages[MAX_MESSAGES]; //Messages out to UWP
static void SendToUWP(UWPMessage* msg)
{
UWPOutMessageId++;
UWPOutMessages[UWPOutMessageId] = msg;
}
#endif
//----------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------
// Timming system variables // Timming system variables
@ -626,11 +643,13 @@ void InitWindow(int width, int height, const char *title)
mousePosition.y = (float)screenHeight/2.0f; mousePosition.y = (float)screenHeight/2.0f;
// raylib logo appearing animation (if enabled) // raylib logo appearing animation (if enabled)
#if !defined(PLATFORM_UWP)
if (showLogo) if (showLogo)
{ {
SetTargetFPS(60); SetTargetFPS(60);
LogoAnimation(); LogoAnimation();
} }
#endif //defined(PLATFORM_UWP)
#endif // defined(PLATFORM_ANDROID) #endif // defined(PLATFORM_ANDROID)
} }
@ -1020,13 +1039,16 @@ void SetClipboardText(const char *text)
#endif #endif
} }
#if !defined(PLATFORM_UWP)
// Show mouse cursor // Show mouse cursor
void ShowCursor(void) void ShowCursor(void)
{ {
#if defined(PLATFORM_DESKTOP) #if defined(PLATFORM_DESKTOP)
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
#endif
#if defined(PLATFORM_UWP)
UWPMessage* msg = CreateUWPMessage();
msg->Type = ShowMouse;
SendToUWP(msg);
#endif #endif
cursorHidden = false; cursorHidden = false;
} }
@ -1036,6 +1058,11 @@ void HideCursor(void)
{ {
#if defined(PLATFORM_DESKTOP) #if defined(PLATFORM_DESKTOP)
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
#endif
#if defined(PLATFORM_UWP)
UWPMessage* msg = CreateUWPMessage();
msg->Type = HideMouse;
SendToUWP(msg);
#endif #endif
cursorHidden = true; cursorHidden = true;
} }
@ -1054,6 +1081,11 @@ void EnableCursor(void)
#endif #endif
#if defined(PLATFORM_WEB) #if defined(PLATFORM_WEB)
toggleCursorLock = true; toggleCursorLock = true;
#endif
#if defined(PLATFORM_UWP)
UWPMessage* msg = CreateUWPMessage();
msg->Type = LockMouse;
SendToUWP(msg);
#endif #endif
cursorHidden = false; cursorHidden = false;
} }
@ -1066,12 +1098,15 @@ void DisableCursor(void)
#endif #endif
#if defined(PLATFORM_WEB) #if defined(PLATFORM_WEB)
toggleCursorLock = true; toggleCursorLock = true;
#endif
#if defined(PLATFORM_UWP)
UWPMessage* msg = CreateUWPMessage();
msg->Type = UnlockMouse;
SendToUWP(msg);
#endif #endif
cursorHidden = true; cursorHidden = true;
} }
#endif
// Set background color (framebuffer clear color) // Set background color (framebuffer clear color)
void ClearBackground(Color color) void ClearBackground(Color color)
{ {
@ -2212,6 +2247,13 @@ void SetMousePosition(int x, int y)
// NOTE: emscripten not implemented // NOTE: emscripten not implemented
glfwSetCursorPos(window, mousePosition.x, mousePosition.y); glfwSetCursorPos(window, mousePosition.x, mousePosition.y);
#endif #endif
#if defined(PLATFORM_UWP)
UWPMessage* msg = CreateUWPMessage();
msg->Type = SetMouseLocation;
msg->Float0 = mousePosition.x;
msg->Float1 = mousePosition.y;
SendToUWP(msg);
#endif
} }
// Set mouse offset // Set mouse offset
@ -4715,6 +4757,30 @@ void UWPGamepadAxis(int gamepad, int axis, float value)
gamepadAxisState[gamepad][axis] = value; gamepadAxisState[gamepad][axis] = value;
} }
bool UWPHasMessages()
{
if (UWPOutMessageId > -1)
return true;
return false;
}
UWPMessage* UWPGetMessage()
{
if (UWPHasMessages())
{
return UWPOutMessages[UWPOutMessageId--];
}
return CreateUWPMessage();
}
/*void UWPSendMessage(UWPMessage* msg)
{
switch(msg->Type)
{
}
}*/
#endif #endif
// Plays raylib logo appearing animation // Plays raylib logo appearing animation

View File

@ -75,6 +75,7 @@
#define RAYLIB_H #define RAYLIB_H
#include <stdarg.h> // Required for: va_list - Only used by TraceLogCallback #include <stdarg.h> // Required for: va_list - Only used by TraceLogCallback
#include <stdlib.h> // Required for: malloc
#if defined(_WIN32) && defined(BUILD_LIBTYPE_SHARED) #if defined(_WIN32) && defined(BUILD_LIBTYPE_SHARED)
#define RLAPI __declspec(dllexport) // We are building raylib as a Win32 shared library (.dll) #define RLAPI __declspec(dllexport) // We are building raylib as a Win32 shared library (.dll)
@ -871,6 +872,68 @@ typedef enum {
// Callbacks to be implemented by users // Callbacks to be implemented by users
typedef void (*TraceLogCallback)(int logType, const char *text, va_list args); typedef void (*TraceLogCallback)(int logType, const char *text, va_list args);
#if defined(PLATFORM_UWP)
// UWP Messages
typedef enum
{
None = 0,
//Send
ShowMouse,
HideMouse,
LockMouse,
UnlockMouse,
SetMouseLocation, //Flaot0, Float1
} UWPMessageType;
typedef struct UWPMessage {
//The message type
UWPMessageType Type;
//Vector parameters
Vector2 Vector0;
//Int parameters
int Int0;
int Int1;
//Char parameters
char Char0;
//Float parameters
float Float0;
float Float1;
//Bool parameters
bool Bool0;
//More parameters can be added and fed to functions
} UWPMessage;
inline UWPMessage* CreateUWPMessage(void)
{
UWPMessage* msg = (UWPMessage*) RL_MALLOC(sizeof(UWPMessage));
msg->Type = None;
Vector2 v0 = { 0, 0 };
msg->Vector0 = v0;
msg->Int0 = 0;
msg->Int1 = 0;
msg->Char0 = 0;
msg->Float0 = 0;
msg->Float1 = 0;
msg->Bool0 = false;
return msg;
}
inline void DeleteUWPMessage(UWPMessage* msg)
{
RL_FREE(msg);
}
#endif
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" { // Prevents name mangling of functions extern "C" { // Prevents name mangling of functions
#endif #endif
@ -925,18 +988,18 @@ RLAPI void UWPGamepadActive(int gamepad, bool active);
RLAPI void UWPGamepadButton(int gamepad, int button, char action); RLAPI void UWPGamepadButton(int gamepad, int button, char action);
RLAPI void UWPGamepadAxis(int gamepad, int axis, float value); RLAPI void UWPGamepadAxis(int gamepad, int axis, float value);
//Get task/input for allowing C to call UWP/cursor functions RLAPI bool UWPHasMessages();
RLAPI UWPMessage* UWPGetMessage();
//RLAPI void UWPSendMessage(UWPMessage* msg); //Do we need to send messages?
#endif #endif
// Cursor-related functions // Cursor-related functions
#if !defined(PLATFORM_UWP) //These are implemented by BaseApp.h
RLAPI void ShowCursor(void); // Shows cursor RLAPI void ShowCursor(void); // Shows cursor
RLAPI void HideCursor(void); // Hides cursor RLAPI void HideCursor(void); // Hides cursor
RLAPI bool IsCursorHidden(void); // Check if cursor is not visible RLAPI bool IsCursorHidden(void); // Check if cursor is not visible
RLAPI void EnableCursor(void); // Enables cursor (unlock cursor) RLAPI void EnableCursor(void); // Enables cursor (unlock cursor)
RLAPI void DisableCursor(void); // Disables cursor (lock cursor) RLAPI void DisableCursor(void); // Disables cursor (lock cursor)
#endif
// Drawing-related functions // Drawing-related functions
RLAPI void ClearBackground(Color color); // Set background color (framebuffer clear color) RLAPI void ClearBackground(Color color); // Set background color (framebuffer clear color)