Lock cursor on first person camera

This commit is contained in:
Ray 2017-05-08 21:03:48 +02:00
parent 35c6aff21f
commit fd1fe3ac14
2 changed files with 31 additions and 42 deletions

View file

@ -203,15 +203,14 @@ static int cameraMode = CAMERA_CUSTOM; // Current camera mode
#if defined(CAMERA_STANDALONE) #if defined(CAMERA_STANDALONE)
// NOTE: Camera controls depend on some raylib input functions // NOTE: Camera controls depend on some raylib input functions
// TODO: Set your own input functions (used in UpdateCamera()) // TODO: Set your own input functions (used in UpdateCamera())
static Vector2 GetMousePosition() { return (Vector2){ 0.0f, 0.0f }; } static void EnableCursor() {} // Unlock cursor
static void SetMousePosition(Vector2 pos) {} static void DisableCursor() {} // Lock cursor
static int IsKeyDown(int key) { return 0; }
static int IsMouseButtonDown(int button) { return 0;} static int IsMouseButtonDown(int button) { return 0;}
static int GetMouseWheelMove() { return 0; } static int GetMouseWheelMove() { return 0; }
static int GetScreenWidth() { return 1280; } static Vector2 GetMousePosition() { return (Vector2){ 0.0f, 0.0f }; }
static int GetScreenHeight() { return 720; }
static void ShowCursor() {}
static void HideCursor() {}
static int IsKeyDown(int key) { return 0; }
#endif #endif
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
@ -247,13 +246,18 @@ void SetCameraMode(Camera camera, int mode)
playerEyesPosition = camera.position.y; playerEyesPosition = camera.position.y;
// Lock cursor for first person and third person cameras
if ((mode == CAMERA_FIRST_PERSON) ||
(mode == CAMERA_THIRD_PERSON)) DisableCursor();
else EnableCursor();
cameraMode = mode; cameraMode = mode;
} }
// Update camera depending on selected mode // Update camera depending on selected mode
// NOTE: Camera controls depend on some raylib functions: // NOTE: Camera controls depend on some raylib functions:
// System: EnableCursor(), DisableCursor()
// Mouse: GetMousePosition(), SetMousePosition(), IsMouseButtonDown(), GetMouseWheelMove() // Mouse: GetMousePosition(), SetMousePosition(), IsMouseButtonDown(), GetMouseWheelMove()
// System: GetScreenWidth(), GetScreenHeight(), ShowCursor(), HideCursor()
// Keys: IsKeyDown() // Keys: IsKeyDown()
// TODO: Port to quaternion-based camera // TODO: Port to quaternion-based camera
void UpdateCamera(Camera *camera) void UpdateCamera(Camera *camera)
@ -284,36 +288,10 @@ void UpdateCamera(Camera *camera)
if (cameraMode != CAMERA_CUSTOM) if (cameraMode != CAMERA_CUSTOM)
{ {
// Get screen size mousePositionDelta.x = mousePosition.x - previousMousePosition.x;
int screenWidth = GetScreenWidth(); mousePositionDelta.y = mousePosition.y - previousMousePosition.y;
int screenHeight = GetScreenHeight();
if ((cameraMode == CAMERA_FIRST_PERSON) || previousMousePosition = mousePosition;
(cameraMode == CAMERA_THIRD_PERSON))
{
HideCursor();
if (mousePosition.x < (float)screenHeight/3.0f) SetMousePosition((Vector2){ screenWidth - screenHeight/3, mousePosition.y });
else if (mousePosition.y < (float)screenHeight/3.0f) SetMousePosition((Vector2){ mousePosition.x, screenHeight - screenHeight/3 });
else if (mousePosition.x > (screenWidth - (float)screenHeight/3.0f)) SetMousePosition((Vector2){ screenHeight/3, mousePosition.y });
else if (mousePosition.y > (screenHeight - (float)screenHeight/3.0f)) SetMousePosition((Vector2){ mousePosition.x, screenHeight/3 });
else
{
mousePositionDelta.x = mousePosition.x - previousMousePosition.x;
mousePositionDelta.y = mousePosition.y - previousMousePosition.y;
}
}
else // CAMERA_FREE, CAMERA_ORBITAL
{
ShowCursor();
mousePositionDelta.x = mousePosition.x - previousMousePosition.x;
mousePositionDelta.y = mousePosition.y - previousMousePosition.y;
}
// NOTE: We GetMousePosition() again because it can be modified by a previous SetMousePosition() call
// If using directly mousePosition variable we have problems on CAMERA_FIRST_PERSON and CAMERA_THIRD_PERSON
previousMousePosition = GetMousePosition();
} }
// Support for multiple automatic camera modes // Support for multiple automatic camera modes

View file

@ -286,6 +286,10 @@ static int gamepadAxisCount = 0; // Register number of available game
static Vector2 mousePosition; // Mouse position on screen static Vector2 mousePosition; // Mouse position on screen
#if defined(PLATFORM_WEB)
static bool toggleCursorLock = false; // Ask for cursor pointer lock on next click
#endif
#if defined(SUPPORT_GESTURES_SYSTEM) #if defined(SUPPORT_GESTURES_SYSTEM)
static Vector2 touchPosition[MAX_TOUCH_POINTS]; // Touch position on screen static Vector2 touchPosition[MAX_TOUCH_POINTS]; // Touch position on screen
#endif #endif
@ -708,6 +712,9 @@ void EnableCursor()
{ {
#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_WEB)
toggleCursorLock = true;
#endif #endif
cursorHidden = false; cursorHidden = false;
} }
@ -717,6 +724,9 @@ void DisableCursor()
{ {
#if defined(PLATFORM_DESKTOP) #if defined(PLATFORM_DESKTOP)
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
#endif
#if defined(PLATFORM_WEB)
toggleCursorLock = true;
#endif #endif
cursorHidden = true; cursorHidden = true;
} }
@ -1821,12 +1831,13 @@ static void InitGraphicsDevice(int width, int height)
const EGLint framebufferAttribs[] = const EGLint framebufferAttribs[] =
{ {
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, // Type of context support -> Required on RPI? EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, // Type of context support -> Required on RPI?
//EGL_SURFACE_TYPE, EGL_WINDOW_BIT, // Don't use it on Android! //EGL_SURFACE_TYPE, EGL_WINDOW_BIT, // Don't use it on Android!
EGL_RED_SIZE, 8, // RED color bit depth (alternative: 5) EGL_RED_SIZE, 8, // RED color bit depth (alternative: 5)
EGL_GREEN_SIZE, 8, // GREEN color bit depth (alternative: 6) EGL_GREEN_SIZE, 8, // GREEN color bit depth (alternative: 6)
EGL_BLUE_SIZE, 8, // BLUE color bit depth (alternative: 5) EGL_BLUE_SIZE, 8, // BLUE color bit depth (alternative: 5)
//EGL_ALPHA_SIZE, 8, // ALPHA bit depth //EGL_ALPHA_SIZE, 8, // ALPHA bit depth
//EGL_TRANSPARENT_TYPE, EGL_TRANSPARENT_RGB, // Request transparent framebuffer
EGL_DEPTH_SIZE, 16, // Depth buffer size (Required to use Depth testing!) EGL_DEPTH_SIZE, 16, // Depth buffer size (Required to use Depth testing!)
//EGL_STENCIL_SIZE, 8, // Stencil buffer size //EGL_STENCIL_SIZE, 8, // Stencil buffer size
EGL_SAMPLE_BUFFERS, sampleBuffer, // Activate MSAA EGL_SAMPLE_BUFFERS, sampleBuffer, // Activate MSAA
@ -2744,9 +2755,8 @@ static EM_BOOL EmscriptenKeyboardCallback(int eventType, const EmscriptenKeyboar
// Register mouse input events // Register mouse input events
static EM_BOOL EmscriptenMouseCallback(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) static EM_BOOL EmscriptenMouseCallback(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
{ {
/*
// Lock mouse pointer when click on screen // Lock mouse pointer when click on screen
if (eventType == EMSCRIPTEN_EVENT_CLICK) if ((eventType == EMSCRIPTEN_EVENT_CLICK) && toggleCursorLock)
{ {
EmscriptenPointerlockChangeEvent plce; EmscriptenPointerlockChangeEvent plce;
emscripten_get_pointerlock_status(&plce); emscripten_get_pointerlock_status(&plce);
@ -2758,8 +2768,9 @@ static EM_BOOL EmscriptenMouseCallback(int eventType, const EmscriptenMouseEvent
emscripten_get_pointerlock_status(&plce); emscripten_get_pointerlock_status(&plce);
//if (plce.isActive) TraceLog(WARNING, "Pointer lock exit did not work!"); //if (plce.isActive) TraceLog(WARNING, "Pointer lock exit did not work!");
} }
toggleCursorLock = false;
} }
*/
return 0; return 0;
} }