|
|
@@ -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
|