Lock cursor on first person camera
This commit is contained in:
parent
35c6aff21f
commit
fd1fe3ac14
2 changed files with 31 additions and 42 deletions
52
src/camera.h
52
src/camera.h
|
@ -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
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
@ -246,14 +245,19 @@ void SetCameraMode(Camera camera, int mode)
|
||||||
//cameraAngle.y = -60.0f*DEG2RAD; // Camera angle in plane XY (0 aligned with X, move positive CW)
|
//cameraAngle.y = -60.0f*DEG2RAD; // Camera angle in plane XY (0 aligned with X, move positive CW)
|
||||||
|
|
||||||
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) ||
|
|
||||||
(cameraMode == CAMERA_THIRD_PERSON))
|
|
||||||
{
|
|
||||||
HideCursor();
|
|
||||||
|
|
||||||
if (mousePosition.x < (float)screenHeight/3.0f) SetMousePosition((Vector2){ screenWidth - screenHeight/3, mousePosition.y });
|
previousMousePosition = mousePosition;
|
||||||
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
|
||||||
|
|
21
src/core.c
21
src/core.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue