|
|
@ -8,6 +8,7 @@ |
|
|
|
* PLATFORM_DESKTOP - Windows, Linux, Mac (OSX) |
|
|
|
* PLATFORM_ANDROID - Only OpenGL ES 2.0 devices |
|
|
|
* PLATFORM_RPI - Rapsberry Pi (tested on Raspbian) |
|
|
|
* PLATFORM_WEB - Emscripten, HTML5 |
|
|
|
* |
|
|
|
* On PLATFORM_DESKTOP, the external lib GLFW3 (www.glfw.com) is used to manage graphic |
|
|
|
* device, OpenGL context and input on multiple operating systems (Windows, Linux, OSX). |
|
|
@ -49,7 +50,7 @@ |
|
|
|
#include <string.h> // String function definitions, memset() |
|
|
|
#include <errno.h> // Macros for reporting and retrieving error conditions through error codes |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
#include <GLFW/glfw3.h> // GLFW3 library: Windows, OpenGL context and Input management |
|
|
|
//#include <GL/gl.h> // OpenGL functions (GLFW3 already includes gl.h) |
|
|
|
//#define GLFW_DLL // Using GLFW DLL on Windows -> No, we use static version! |
|
|
@ -101,7 +102,7 @@ |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
// Global Variables Definition |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
static GLFWwindow *window; // Native window (graphic device) |
|
|
|
#elif defined(PLATFORM_ANDROID) |
|
|
|
static struct android_app *app; // Android activity |
|
|
@ -160,7 +161,7 @@ static int renderOffsetY = 0; // Offset Y from render area (must b |
|
|
|
static bool fullscreen = false; // Fullscreen mode (useful only for PLATFORM_DESKTOP) |
|
|
|
static Matrix downscaleView; // Matrix to downscale view (in case screen size bigger than display size) |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB) |
|
|
|
static const char *windowTitle; // Window text title... |
|
|
|
static char configFlags = 0; |
|
|
|
|
|
|
@ -226,12 +227,15 @@ static void RestoreKeyboard(void); // Restore keyboard syst |
|
|
|
static void InitGamepad(void); // Init raw gamepad input |
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
static void ErrorCallback(int error, const char *description); // GLFW3 Error Callback, runs on GLFW3 error |
|
|
|
static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, int mods); // GLFW3 Keyboard Callback, runs on key pressed |
|
|
|
static void ScrollCallback(GLFWwindow *window, double xoffset, double yoffset); // GLFW3 Srolling Callback, runs on mouse wheel |
|
|
|
static void CursorEnterCallback(GLFWwindow *window, int enter); // GLFW3 Cursor Enter Callback, cursor enters client area |
|
|
|
static void WindowSizeCallback(GLFWwindow *window, int width, int height); // GLFW3 WindowSize Callback, runs when window is resized |
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) |
|
|
|
static void TakeScreenshot(void); // Takes a screenshot and saves it in the same folder as executable |
|
|
|
#endif |
|
|
|
|
|
|
@ -243,7 +247,7 @@ static void CommandCallback(struct android_app *app, int32_t cmd); // |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
// Module Functions Definition - Window and OpenGL Context Functions |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB) |
|
|
|
// Initialize Window and Graphics Context (OpenGL) |
|
|
|
void InitWindow(int width, int height, const char *title) |
|
|
|
{ |
|
|
@ -348,7 +352,7 @@ void CloseWindow(void) |
|
|
|
|
|
|
|
rlglClose(); // De-init rlgl |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
glfwDestroyWindow(window); |
|
|
|
glfwTerminate(); |
|
|
|
#elif defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) |
|
|
@ -380,7 +384,7 @@ void CloseWindow(void) |
|
|
|
// Detect if KEY_ESCAPE pressed or Close icon pressed |
|
|
|
bool WindowShouldClose(void) |
|
|
|
{ |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
return (glfwWindowShouldClose(window)); |
|
|
|
#elif defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) |
|
|
|
return windowShouldClose; |
|
|
@ -402,7 +406,7 @@ void ToggleFullscreen(void) |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB) |
|
|
|
// Set a custom cursor icon/image |
|
|
|
void SetCustomCursor(const char *cursorImage) |
|
|
|
{ |
|
|
@ -411,6 +415,7 @@ void SetCustomCursor(const char *cursorImage) |
|
|
|
cursor = LoadTexture(cursorImage); |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
// NOTE: emscripten not implemented |
|
|
|
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); |
|
|
|
#endif |
|
|
|
customCursor = true; |
|
|
@ -612,7 +617,7 @@ void ShowLogo(void) |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
// Module Functions Definition - Input (Keyboard, Mouse, Gamepad) Functions |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB) |
|
|
|
// Detect if a key has been pressed once |
|
|
|
bool IsKeyPressed(int key) |
|
|
|
{ |
|
|
@ -731,7 +736,8 @@ Vector2 GetMousePosition(void) |
|
|
|
void SetMousePosition(Vector2 position) |
|
|
|
{ |
|
|
|
mousePosition = position; |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
// NOTE: emscripten not implemented |
|
|
|
glfwSetCursorPos(window, position.x, position.y); |
|
|
|
#endif |
|
|
|
} |
|
|
@ -747,7 +753,8 @@ int GetMouseWheelMove(void) |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
// TODO: Enable gamepad usage on Rapsberr Pi |
|
|
|
// TODO: Enable gamepad usage on Rapsberry Pi |
|
|
|
// NOTE: emscripten not implemented |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
// Detect if a gamepad is available |
|
|
|
bool IsGamepadAvailable(int gamepad) |
|
|
@ -890,11 +897,13 @@ static void InitDisplay(int width, int height) |
|
|
|
// Downscale matrix is required in case desired screen area is bigger than display area |
|
|
|
downscaleView = MatrixIdentity(); |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
glfwSetErrorCallback(ErrorCallback); |
|
|
|
|
|
|
|
if (!glfwInit()) TraceLog(ERROR, "Failed to initialize GLFW"); |
|
|
|
|
|
|
|
// NOTE: Getting video modes is not implemented in emscripten GLFW3 version |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
// Find monitor resolution |
|
|
|
const GLFWvidmode *mode = glfwGetVideoMode(glfwGetPrimaryMonitor()); |
|
|
|
|
|
|
@ -904,7 +913,11 @@ static void InitDisplay(int width, int height) |
|
|
|
// Screen size security check |
|
|
|
if (screenWidth <= 0) screenWidth = displayWidth; |
|
|
|
if (screenHeight <= 0) screenHeight = displayHeight; |
|
|
|
|
|
|
|
#elif defined(PLATFORM_WEB) |
|
|
|
displayWidth = screenWidth; |
|
|
|
displayHeight = screenHeight; |
|
|
|
#endif |
|
|
|
|
|
|
|
glfwDefaultWindowHints(); // Set default windows hints |
|
|
|
|
|
|
|
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); // Avoid window being resizable |
|
|
@ -953,7 +966,9 @@ static void InitDisplay(int width, int height) |
|
|
|
else |
|
|
|
{ |
|
|
|
TraceLog(INFO, "Display device initialized successfully"); |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
TraceLog(INFO, "Display size: %i x %i", displayWidth, displayHeight); |
|
|
|
#endif |
|
|
|
TraceLog(INFO, "Render size: %i x %i", renderWidth, renderHeight); |
|
|
|
TraceLog(INFO, "Screen size: %i x %i", screenWidth, screenHeight); |
|
|
|
TraceLog(INFO, "Viewport offsets: %i, %i", renderOffsetX, renderOffsetY); |
|
|
@ -1125,7 +1140,7 @@ void InitGraphics(void) |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
// GLFW3 Error Callback, runs on GLFW3 error |
|
|
|
static void ErrorCallback(int error, const char *description) |
|
|
|
{ |
|
|
@ -1147,10 +1162,12 @@ static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, i |
|
|
|
|
|
|
|
// NOTE: Before closing window, while loop must be left! |
|
|
|
} |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
else if (key == GLFW_KEY_F12 && action == GLFW_PRESS) |
|
|
|
{ |
|
|
|
TakeScreenshot(); |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
// GLFW3 CursorEnter Callback, when cursor enters the window |
|
|
@ -1395,7 +1412,7 @@ static void InitTimer(void) |
|
|
|
// Get current time measure since InitTimer() |
|
|
|
static double GetTime(void) |
|
|
|
{ |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
return glfwGetTime(); |
|
|
|
#elif defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) |
|
|
|
struct timespec ts; |
|
|
@ -1409,7 +1426,7 @@ static double GetTime(void) |
|
|
|
// Get one key state |
|
|
|
static bool GetKeyStatus(int key) |
|
|
|
{ |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
return glfwGetKey(window, key); |
|
|
|
#elif defined(PLATFORM_ANDROID) |
|
|
|
// TODO: Check virtual keyboard (?) |
|
|
@ -1424,7 +1441,7 @@ static bool GetKeyStatus(int key) |
|
|
|
// Get one mouse button state |
|
|
|
static bool GetMouseButtonStatus(int button) |
|
|
|
{ |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
return glfwGetMouseButton(window, button); |
|
|
|
#elif defined(PLATFORM_ANDROID) |
|
|
|
// TODO: Check virtual keyboard (?) |
|
|
@ -1438,7 +1455,7 @@ static bool GetMouseButtonStatus(int button) |
|
|
|
// Poll (store) all input events |
|
|
|
static void PollInputEvents(void) |
|
|
|
{ |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
// Mouse input polling |
|
|
|
double mouseX; |
|
|
|
double mouseY; |
|
|
@ -1732,7 +1749,7 @@ static void InitGamepad(void) |
|
|
|
// Copy back buffer to front buffers |
|
|
|
static void SwapBuffers(void) |
|
|
|
{ |
|
|
|
#if defined(PLATFORM_DESKTOP) |
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
glfwSwapBuffers(window); |
|
|
|
#elif defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) |
|
|
|
eglSwapBuffers(display, surface); |
|
|
|