|
|
@ -356,7 +356,7 @@ typedef struct CoreData { |
|
|
|
Size render; // Framebuffer width and height (render area, including black bars if required) |
|
|
|
Point renderOffset; // Offset from render area (must be divided by 2) |
|
|
|
Matrix screenScale; // Matrix to scale screen (framebuffer rendering) |
|
|
|
|
|
|
|
|
|
|
|
char **dropFilesPath; // Store dropped files paths as strings |
|
|
|
int dropFilesCount; // Count dropped files strings |
|
|
|
|
|
|
@ -608,12 +608,12 @@ void InitWindow(int width, int height, const char *title) |
|
|
|
TRACELOG(LOG_INFO, "Initializing raylib %s", RAYLIB_VERSION); |
|
|
|
|
|
|
|
CORE.Window.title = title; |
|
|
|
|
|
|
|
|
|
|
|
// Initialize required global values different than 0 |
|
|
|
CORE.Input.Keyboard.exitKey = KEY_ESCAPE; |
|
|
|
CORE.Input.Mouse.scale = (Vector2){ 1.0f, 1.0f }; |
|
|
|
CORE.Input.Gamepad.lastButtonPressed = -1; |
|
|
|
|
|
|
|
|
|
|
|
#if defined(PLATFORM_ANDROID) |
|
|
|
CORE.Window.screen.width = width; |
|
|
|
CORE.Window.screen.height = height; |
|
|
@ -824,7 +824,7 @@ bool WindowShouldClose(void) |
|
|
|
while (!CORE.Window.alwaysRun && CORE.Window.minimized) glfwWaitEvents(); |
|
|
|
|
|
|
|
CORE.Window.shouldClose = glfwWindowShouldClose(CORE.Window.handle); |
|
|
|
|
|
|
|
|
|
|
|
return CORE.Window.shouldClose; |
|
|
|
} |
|
|
|
else return true; |
|
|
@ -872,7 +872,7 @@ void ToggleFullscreen(void) |
|
|
|
CORE.Window.fullscreen = !CORE.Window.fullscreen; // Toggle fullscreen flag |
|
|
|
|
|
|
|
// NOTE: glfwSetWindowMonitor() doesn't work properly (bugs) |
|
|
|
if (CORE.Window.fullscreen) |
|
|
|
if (CORE.Window.fullscreen) |
|
|
|
{ |
|
|
|
// Store previous window position (in case we exit fullscreen) |
|
|
|
glfwGetWindowPos(CORE.Window.handle, &CORE.Window.position.x, &CORE.Window.position.y); |
|
|
@ -887,7 +887,7 @@ void ToggleFullscreen(void) |
|
|
|
|
|
|
|
const GLFWvidmode *mode = glfwGetVideoMode(monitor); |
|
|
|
glfwSetWindowMonitor(CORE.Window.handle, glfwGetPrimaryMonitor(), 0, 0, CORE.Window.screen.width, CORE.Window.screen.height, mode->refreshRate); |
|
|
|
|
|
|
|
|
|
|
|
// Try to enable GPU V-Sync, so frames are limited to screen refresh rate (60Hz -> 60 FPS) |
|
|
|
// NOTE: V-Sync can be enabled by graphic driver configuration |
|
|
|
if (CORE.Window.flags & FLAG_VSYNC_HINT) glfwSwapInterval(1); |
|
|
@ -1281,14 +1281,14 @@ void EndDrawing(void) |
|
|
|
|
|
|
|
SwapBuffers(); // Copy back buffer to front buffer |
|
|
|
PollInputEvents(); // Poll user events |
|
|
|
|
|
|
|
|
|
|
|
// Frame time control system |
|
|
|
CORE.Time.current = GetTime(); |
|
|
|
CORE.Time.draw = CORE.Time.current - CORE.Time.previous; |
|
|
|
CORE.Time.previous = CORE.Time.current; |
|
|
|
|
|
|
|
CORE.Time.frame = CORE.Time.update + CORE.Time.draw; |
|
|
|
|
|
|
|
|
|
|
|
// Wait for some milliseconds... |
|
|
|
if (CORE.Time.frame < CORE.Time.target) |
|
|
|
{ |
|
|
@ -1299,9 +1299,9 @@ void EndDrawing(void) |
|
|
|
CORE.Time.previous = CORE.Time.current; |
|
|
|
|
|
|
|
CORE.Time.frame += waitTime; // Total frame time: update + draw + wait |
|
|
|
|
|
|
|
//SetWindowTitle(FormatText("Update: %f, Draw: %f, Req.Wait: %f, Real.Wait: %f, Total: %f, Target: %f\n", |
|
|
|
// (float)CORE.Time.update, (float)CORE.Time.draw, (float)(CORE.Time.target - (CORE.Time.update + CORE.Time.draw)), |
|
|
|
|
|
|
|
//SetWindowTitle(FormatText("Update: %f, Draw: %f, Req.Wait: %f, Real.Wait: %f, Total: %f, Target: %f\n", |
|
|
|
// (float)CORE.Time.update, (float)CORE.Time.draw, (float)(CORE.Time.target - (CORE.Time.update + CORE.Time.draw)), |
|
|
|
// (float)waitTime, (float)CORE.Time.frame, (float)CORE.Time.target)); |
|
|
|
} |
|
|
|
} |
|
|
@ -1315,7 +1315,7 @@ void BeginMode2D(Camera2D camera) |
|
|
|
|
|
|
|
// Apply 2d camera transformation to modelview |
|
|
|
rlMultMatrixf(MatrixToFloat(GetCameraMatrix2D(camera))); |
|
|
|
|
|
|
|
|
|
|
|
// Apply screen scaling if required |
|
|
|
rlMultMatrixf(MatrixToFloat(CORE.Window.screenScale)); |
|
|
|
} |
|
|
@ -1551,7 +1551,7 @@ Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int heigh |
|
|
|
if (camera.type == CAMERA_PERSPECTIVE) |
|
|
|
{ |
|
|
|
// Calculate projection matrix from perspective |
|
|
|
matProj = MatrixPerspective(camera.fovy * DEG2RAD, ((double)width/(double)height), DEFAULT_NEAR_CULL_DISTANCE, DEFAULT_FAR_CULL_DISTANCE); |
|
|
|
matProj = MatrixPerspective(camera.fovy * DEG2RAD, ((double)width/(double)height), DEFAULT_NEAR_CULL_DISTANCE, DEFAULT_FAR_CULL_DISTANCE); |
|
|
|
} |
|
|
|
else if (camera.type == CAMERA_ORTHOGRAPHIC) |
|
|
|
{ |
|
|
@ -1560,7 +1560,7 @@ Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int heigh |
|
|
|
double right = top*aspect; |
|
|
|
|
|
|
|
// Calculate projection matrix from orthographic |
|
|
|
matProj = MatrixOrtho(-right, right, -top, top, DEFAULT_NEAR_CULL_DISTANCE, DEFAULT_FAR_CULL_DISTANCE); |
|
|
|
matProj = MatrixOrtho(-right, right, -top, top, DEFAULT_NEAR_CULL_DISTANCE, DEFAULT_FAR_CULL_DISTANCE); |
|
|
|
} |
|
|
|
|
|
|
|
// Calculate view matrix from camera look at (and transpose it) |
|
|
@ -1579,7 +1579,7 @@ Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int heigh |
|
|
|
Vector3 ndcPos = { worldPos.x/worldPos.w, -worldPos.y/worldPos.w, worldPos.z/worldPos.w }; |
|
|
|
|
|
|
|
// Calculate 2d screen position vector |
|
|
|
Vector2 screenPosition = { (ndcPos.x + 1.0f)/2.0f*(float)width, (ndcPos.y + 1.0f)/2.0f*(float)height }; |
|
|
|
Vector2 screenPosition = { (ndcPos.x + 1.0f)/2.0f*(float)width, (ndcPos.y + 1.0f)/2.0f*(float)height }; |
|
|
|
|
|
|
|
return screenPosition; |
|
|
|
} |
|
|
@ -1865,7 +1865,7 @@ bool IsFileExtension(const char *fileName, const char *ext) |
|
|
|
{ |
|
|
|
int extCount = 0; |
|
|
|
const char **checkExts = TextSplit(ext, ';', &extCount); |
|
|
|
|
|
|
|
|
|
|
|
char fileExtLower[16] = { 0 }; |
|
|
|
strcpy(fileExtLower, TextToLower(fileExt)); |
|
|
|
|
|
|
@ -1966,8 +1966,8 @@ const char *GetDirectoryPath(const char *filePath) |
|
|
|
const char *lastSlash = NULL; |
|
|
|
static char dirPath[MAX_FILEPATH_LENGTH]; |
|
|
|
memset(dirPath, 0, MAX_FILEPATH_LENGTH); |
|
|
|
|
|
|
|
// For security, we set starting path to current directory, |
|
|
|
|
|
|
|
// For security, we set starting path to current directory, |
|
|
|
// obtained path will be concated to this |
|
|
|
//dirPath[0] = '.'; |
|
|
|
//dirPath[1] = '/'; |
|
|
@ -2063,7 +2063,7 @@ void ClearDirectoryFiles(void) |
|
|
|
|
|
|
|
RL_FREE(dirFilesPath); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
dirFilesCount = 0; |
|
|
|
} |
|
|
|
|
|
|
@ -2454,8 +2454,8 @@ bool IsMouseButtonPressed(int button) |
|
|
|
if (IsGestureDetected(GESTURE_TAP)) pressed = true; |
|
|
|
#else |
|
|
|
// NOTE: On PLATFORM_DESKTOP and PLATFORM_WEB IsMouseButtonPressed() is equivalent to GESTURE_TAP |
|
|
|
if (((CORE.Input.Mouse.currentButtonState[button] != CORE.Input.Mouse.previousButtonState[button]) && |
|
|
|
(CORE.Input.Mouse.currentButtonState[button] == 1)) || IsGestureDetected(GESTURE_TAP)) pressed = true; |
|
|
|
if (((CORE.Input.Mouse.currentButtonState[button] != CORE.Input.Mouse.previousButtonState[button]) && |
|
|
|
(CORE.Input.Mouse.currentButtonState[button] == 1)) || IsGestureDetected(GESTURE_TAP)) pressed = true; |
|
|
|
#endif |
|
|
|
|
|
|
|
return pressed; |
|
|
@ -2482,7 +2482,7 @@ bool IsMouseButtonReleased(int button) |
|
|
|
bool released = false; |
|
|
|
|
|
|
|
#if !defined(PLATFORM_ANDROID) |
|
|
|
if ((CORE.Input.Mouse.currentButtonState[button] != CORE.Input.Mouse.previousButtonState[button]) && |
|
|
|
if ((CORE.Input.Mouse.currentButtonState[button] != CORE.Input.Mouse.previousButtonState[button]) && |
|
|
|
(CORE.Input.Mouse.currentButtonState[button] == 0)) released = true; |
|
|
|
#endif |
|
|
|
|
|
|
@ -2701,7 +2701,7 @@ static bool InitGraphicsDevice(int width, int height) |
|
|
|
//glfwWindowHint(GLFW_AUX_BUFFERS, 0); // Number of auxiliar buffers |
|
|
|
#if defined(PLATFORM_DESKTOP) && defined(SUPPORT_HIGH_DPI) |
|
|
|
// Resize window content area based on the monitor content scale. |
|
|
|
// NOTE: This hint only has an effect on platforms where screen coordinates and pixels always map 1:1 such as Windows and X11. |
|
|
|
// NOTE: This hint only has an effect on platforms where screen coordinates and pixels always map 1:1 such as Windows and X11. |
|
|
|
// On platforms like macOS the resolution of the framebuffer is changed independently of the window size. |
|
|
|
glfwWindowHint(GLFW_SCALE_TO_MONITOR, GLFW_TRUE); // Scale content area based on the monitor content scale where window is placed on |
|
|
|
#endif |
|
|
@ -3224,7 +3224,7 @@ static bool InitGraphicsDevice(int width, int height) |
|
|
|
CORE.Window.screenScale = MatrixScale((float)fbWidth/CORE.Window.screen.width, (float)fbHeight/CORE.Window.screen.height, 1.0f); |
|
|
|
#if !defined(__APPLE__) |
|
|
|
SetMouseScale((float)CORE.Window.screen.width/fbWidth, (float)CORE.Window.screen.height/fbHeight); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#endif // PLATFORM_DESKTOP && SUPPORT_HIGH_DPI |
|
|
|
|
|
|
|
// Setup default viewport |
|
|
@ -3391,7 +3391,7 @@ static void Wait(float ms) |
|
|
|
#elif defined(__APPLE__) |
|
|
|
usleep(ms*1000.0f); |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(SUPPORT_HALFBUSY_WAIT_LOOP) |
|
|
|
while (GetTime() < destTime) { } |
|
|
|
#endif |
|
|
@ -3548,7 +3548,7 @@ static void PollInputEvents(void) |
|
|
|
{ |
|
|
|
CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = CORE.Input.Keyboard.lastKeyPressed.Contents[CORE.Input.Keyboard.lastKeyPressed.Tail]; // Read the key from the buffer |
|
|
|
CORE.Input.Keyboard.keyPressedQueueCount++; |
|
|
|
|
|
|
|
|
|
|
|
CORE.Input.Keyboard.lastKeyPressed.Tail = (CORE.Input.Keyboard.lastKeyPressed.Tail + 1) & 0x07; // Increment the tail pointer forwards and binary wraparound after 7 (fifo is 8 elements long) |
|
|
|
} |
|
|
|
|
|
|
@ -3852,7 +3852,7 @@ static void PollInputEvents(void) |
|
|
|
// Android ALooper_pollAll() variables |
|
|
|
int pollResult = 0; |
|
|
|
int pollEvents = 0; |
|
|
|
|
|
|
|
|
|
|
|
// Poll Events (registered events) |
|
|
|
// NOTE: Activity is paused if not enabled (CORE.Android.appEnabled) |
|
|
|
while ((pollResult = ALooper_pollAll(CORE.Android.appEnabled? 0 : -1, NULL, &pollEvents, (void**)&CORE.Android.source)) >= 0) |
|
|
@ -4223,7 +4223,7 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) |
|
|
|
if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_DOWN) |
|
|
|
{ |
|
|
|
CORE.Input.Keyboard.currentKeyState[keycode] = 1; // Key down |
|
|
|
|
|
|
|
|
|
|
|
CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = keycode; |
|
|
|
CORE.Input.Keyboard.keyPressedQueueCount++; |
|
|
|
} |
|
|
@ -4240,7 +4240,7 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) |
|
|
|
if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_DOWN) |
|
|
|
{ |
|
|
|
CORE.Input.Keyboard.currentKeyState[keycode] = 1; // Key down |
|
|
|
|
|
|
|
|
|
|
|
CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = keycode; |
|
|
|
CORE.Input.Keyboard.keyPressedQueueCount++; |
|
|
|
} |
|
|
@ -4589,15 +4589,15 @@ static void ProcessKeyboard(void) |
|
|
|
} |
|
|
|
else if (keysBuffer[i] == 0x0a) // raylib KEY_ENTER (don't mix with <linux/input.h> KEY_*) |
|
|
|
{ |
|
|
|
CORE.Input.Keyboard.currentKeyState[257] = 1; |
|
|
|
|
|
|
|
CORE.Input.Keyboard.currentKeyState[257] = 1; |
|
|
|
|
|
|
|
CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = 257; // Add keys pressed into queue |
|
|
|
CORE.Input.Keyboard.keyPressedQueueCount++; |
|
|
|
} |
|
|
|
else if (keysBuffer[i] == 0x7f) // raylib KEY_BACKSPACE |
|
|
|
{ |
|
|
|
CORE.Input.Keyboard.currentKeyState[259] = 1; |
|
|
|
|
|
|
|
{ |
|
|
|
CORE.Input.Keyboard.currentKeyState[259] = 1; |
|
|
|
|
|
|
|
CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = 257; // Add keys pressed into queue |
|
|
|
CORE.Input.Keyboard.keyPressedQueueCount++; |
|
|
|
} |
|
|
@ -5026,7 +5026,7 @@ static void *EventThread(void *arg) |
|
|
|
*/ |
|
|
|
|
|
|
|
CORE.Input.Keyboard.currentKeyState[keycode] = event.value; |
|
|
|
if (event.value == 1) |
|
|
|
if (event.value == 1) |
|
|
|
{ |
|
|
|
CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = keycode; // Register last key pressed |
|
|
|
CORE.Input.Keyboard.keyPressedQueueCount++; |
|
|
|