|
|
|
@ -28,6 +28,8 @@ |
|
|
|
* - Android (ARM, ARM64) |
|
|
|
* > PLATFORM_DESKTOP_WIN32 (Native Win32): |
|
|
|
* - Windows (Win32, Win64) |
|
|
|
* > PLATFORM_MEMORY |
|
|
|
* - Memory framebuffer output, using software renderer, no OS required |
|
|
|
* CONFIGURATION: |
|
|
|
* #define SUPPORT_DEFAULT_FONT (default) |
|
|
|
* Default font is loaded on window initialization to be available for the user to render simple text |
|
|
|
@ -92,12 +94,12 @@ |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
#if (defined(__linux__) || defined(PLATFORM_WEB) || defined(PLATFORM_WEB_RGFW)) && (_XOPEN_SOURCE < 500) |
|
|
|
#undef _XOPEN_SOURCE |
|
|
|
#define _XOPEN_SOURCE 500 // Required for: readlink if compiled with c99 without gnu ext. |
|
|
|
#define _XOPEN_SOURCE 500 // Required for: readlink if compiled with c99 without GNU extensions |
|
|
|
#endif |
|
|
|
|
|
|
|
#if (defined(__linux__) || defined(PLATFORM_WEB) || defined(PLATFORM_WEB_RGFW)) && (_POSIX_C_SOURCE < 199309L) |
|
|
|
#undef _POSIX_C_SOURCE |
|
|
|
#define _POSIX_C_SOURCE 199309L // Required for: CLOCK_MONOTONIC if compiled with c99 without gnu ext. |
|
|
|
#define _POSIX_C_SOURCE 199309L // Required for: CLOCK_MONOTONIC if compiled with c99 without GNU extensions |
|
|
|
#endif |
|
|
|
|
|
|
|
#include "raylib.h" // Declares module functions |
|
|
|
@ -115,6 +117,9 @@ |
|
|
|
#include <time.h> // Required for: time() [Used in InitTimer()] |
|
|
|
#include <math.h> // Required for: tan() [Used in BeginMode3D()], atan2f() [Used in LoadVrStereoConfig()] |
|
|
|
|
|
|
|
#if defined(PLATFORM_MEMORY) |
|
|
|
#define SW_GL_FRAMEBUFFER_COPY_BGRA false |
|
|
|
#endif |
|
|
|
#define RLGL_IMPLEMENTATION |
|
|
|
#include "rlgl.h" // OpenGL abstraction layer to OpenGL 1.1, 3.3+ or ES2 |
|
|
|
|
|
|
|
@ -155,18 +160,18 @@ |
|
|
|
#define MAX_PATH 260 |
|
|
|
#endif |
|
|
|
|
|
|
|
struct HINSTANCE__; |
|
|
|
#if defined(__cplusplus) |
|
|
|
extern "C" { |
|
|
|
#endif |
|
|
|
__declspec(dllimport) unsigned long __stdcall GetModuleFileNameA(struct HINSTANCE__ *hModule, char *lpFilename, unsigned long nSize); |
|
|
|
__declspec(dllimport) unsigned long __stdcall GetModuleFileNameW(struct HINSTANCE__ *hModule, wchar_t *lpFilename, unsigned long nSize); |
|
|
|
__declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); |
|
|
|
__declspec(dllimport) unsigned int __stdcall timeBeginPeriod(unsigned int uPeriod); |
|
|
|
__declspec(dllimport) unsigned int __stdcall timeEndPeriod(unsigned int uPeriod); |
|
|
|
#if defined(__cplusplus) |
|
|
|
} |
|
|
|
#endif |
|
|
|
struct HINSTANCE__; |
|
|
|
#if defined(__cplusplus) |
|
|
|
extern "C" { |
|
|
|
#endif |
|
|
|
__declspec(dllimport) unsigned long __stdcall GetModuleFileNameA(struct HINSTANCE__ *hModule, char *lpFilename, unsigned long nSize); |
|
|
|
__declspec(dllimport) unsigned long __stdcall GetModuleFileNameW(struct HINSTANCE__ *hModule, wchar_t *lpFilename, unsigned long nSize); |
|
|
|
__declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); |
|
|
|
__declspec(dllimport) unsigned int __stdcall timeBeginPeriod(unsigned int uPeriod); |
|
|
|
__declspec(dllimport) unsigned int __stdcall timeEndPeriod(unsigned int uPeriod); |
|
|
|
#if defined(__cplusplus) |
|
|
|
} |
|
|
|
#endif |
|
|
|
#elif defined(__linux__) |
|
|
|
#include <unistd.h> |
|
|
|
#elif defined(__FreeBSD__) |
|
|
|
@ -314,7 +319,8 @@ typedef struct CoreData { |
|
|
|
char currentKeyState[MAX_KEYBOARD_KEYS]; // Registers current frame key state |
|
|
|
char previousKeyState[MAX_KEYBOARD_KEYS]; // Registers previous frame key state |
|
|
|
|
|
|
|
// NOTE: Since key press logic involves comparing prev vs cur key state, we need to handle key repeats specially |
|
|
|
// NOTE: Since key press logic involves comparing previous vs currrent key state, |
|
|
|
// key repeats needs to be handled specially |
|
|
|
char keyRepeatInFrame[MAX_KEYBOARD_KEYS]; // Registers key repeats for current frame |
|
|
|
|
|
|
|
int keyPressedQueue[MAX_KEY_PRESSED_QUEUE]; // Input keys queue |
|
|
|
@ -547,6 +553,8 @@ const char *TextFormat(const char *text, ...); // Formatting of text with variab |
|
|
|
#include "platforms/rcore_drm.c" |
|
|
|
#elif defined(PLATFORM_ANDROID) |
|
|
|
#include "platforms/rcore_android.c" |
|
|
|
#elif defined(PLATFORM_MEMORY) |
|
|
|
#include "platforms/rcore_memory.c" |
|
|
|
#else |
|
|
|
// TODO: Include your custom platform backend! |
|
|
|
// i.e software rendering backend or console backend! |
|
|
|
@ -621,6 +629,8 @@ void InitWindow(int width, int height, const char *title) |
|
|
|
TRACELOG(LOG_INFO, "Platform backend: NATIVE DRM"); |
|
|
|
#elif defined(PLATFORM_ANDROID) |
|
|
|
TRACELOG(LOG_INFO, "Platform backend: ANDROID"); |
|
|
|
#elif defined(PLATFORM_MEMORY) |
|
|
|
TRACELOG(LOG_INFO, "Platform backend: MEMORY (No OS)"); |
|
|
|
#else |
|
|
|
// TODO: Include your custom platform backend! |
|
|
|
// i.e software rendering backend or console backend! |
|
|
|
@ -2233,13 +2243,15 @@ const char *GetApplicationDirectory(void) |
|
|
|
|
|
|
|
#if defined(_WIN32) |
|
|
|
int len = 0; |
|
|
|
#if defined(UNICODE) |
|
|
|
|
|
|
|
#if defined(UNICODE) |
|
|
|
unsigned short widePath[MAX_PATH]; |
|
|
|
len = GetModuleFileNameW(NULL, (wchar_t *)widePath, MAX_PATH); |
|
|
|
len = WideCharToMultiByte(0, 0, (wchar_t *)widePath, len, appDir, MAX_PATH, NULL, NULL); |
|
|
|
#else |
|
|
|
#else |
|
|
|
len = GetModuleFileNameA(NULL, appDir, MAX_PATH); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
if (len > 0) |
|
|
|
{ |
|
|
|
for (int i = len; i >= 0; --i) |
|
|
|
@ -2256,8 +2268,9 @@ const char *GetApplicationDirectory(void) |
|
|
|
appDir[0] = '.'; |
|
|
|
appDir[1] = '\\'; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#elif defined(__linux__) |
|
|
|
|
|
|
|
unsigned int size = sizeof(appDir); |
|
|
|
ssize_t len = readlink("/proc/self/exe", appDir, size); |
|
|
|
|
|
|
|
@ -2277,7 +2290,9 @@ const char *GetApplicationDirectory(void) |
|
|
|
appDir[0] = '.'; |
|
|
|
appDir[1] = '/'; |
|
|
|
} |
|
|
|
|
|
|
|
#elif defined(__APPLE__) |
|
|
|
|
|
|
|
uint32_t size = sizeof(appDir); |
|
|
|
|
|
|
|
if (_NSGetExecutablePath(appDir, &size) == 0) |
|
|
|
@ -2297,8 +2312,11 @@ const char *GetApplicationDirectory(void) |
|
|
|
appDir[0] = '.'; |
|
|
|
appDir[1] = '/'; |
|
|
|
} |
|
|
|
|
|
|
|
#elif defined(__FreeBSD__) |
|
|
|
size_t size = sizeof(appDir); |
|
|
|
|
|
|
|
size_t size = sizeof(appD |
|
|
|
ir); |
|
|
|
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}; |
|
|
|
|
|
|
|
if (sysctl(mib, 4, appDir, &size, NULL, 0) == 0) |
|
|
|
@ -2318,7 +2336,6 @@ const char *GetApplicationDirectory(void) |
|
|
|
appDir[0] = '.'; |
|
|
|
appDir[1] = '/'; |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
return appDir; |
|
|
|
@ -3748,20 +3765,20 @@ void InitTimer(void) |
|
|
|
// High resolutions can also prevent the CPU power management system from entering power-saving modes |
|
|
|
// Setting a higher resolution does not improve the accuracy of the high-resolution performance counter |
|
|
|
#if defined(_WIN32) && defined(SUPPORT_WINMM_HIGHRES_TIMER) && !defined(SUPPORT_BUSY_WAIT_LOOP) && !defined(PLATFORM_DESKTOP_SDL) |
|
|
|
timeBeginPeriod(1); // Setup high-resolution timer to 1ms (granularity of 1-2 ms) |
|
|
|
timeBeginPeriod(1); // Setup high-resolution timer to 1ms (granularity of 1-2 ms) |
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__EMSCRIPTEN__) |
|
|
|
struct timespec now = { 0 }; |
|
|
|
|
|
|
|
if (clock_gettime(CLOCK_MONOTONIC, &now) == 0) // Success |
|
|
|
if (clock_gettime(CLOCK_MONOTONIC, &now) == 0) // Success |
|
|
|
{ |
|
|
|
CORE.Time.base = (unsigned long long int)now.tv_sec*1000000000LLU + (unsigned long long int)now.tv_nsec; |
|
|
|
} |
|
|
|
else TRACELOG(LOG_WARNING, "TIMER: Hi-resolution timer not available"); |
|
|
|
#endif |
|
|
|
|
|
|
|
CORE.Time.previous = GetTime(); // Get time as double |
|
|
|
CORE.Time.previous = GetTime(); // Get time as double |
|
|
|
} |
|
|
|
|
|
|
|
// Set viewport for a provided width and height |
|
|
|
@ -3887,6 +3904,7 @@ static void ScanDirectoryFiles(const char *basePath, FilePathList *files, const |
|
|
|
if ((strcmp(dp->d_name, ".") != 0) && |
|
|
|
(strcmp(dp->d_name, "..") != 0)) |
|
|
|
{ |
|
|
|
// Construct new path from our base path |
|
|
|
#if defined(_WIN32) |
|
|
|
int pathLength = snprintf(path, MAX_FILEPATH_LENGTH - 1, "%s\\%s", basePath, dp->d_name); |
|
|
|
#else |
|
|
|
|