|
|
@ -67,9 +67,13 @@ |
|
|
|
#include <string.h> // Required for: strcmp() |
|
|
|
//#include <errno.h> // Macros for reporting and retrieving error conditions through error codes |
|
|
|
|
|
|
|
#if defined __linux || defined(PLATFORM_WEB) |
|
|
|
#include <sys/time.h> // Required for: timespec, nanosleep(), select() - POSIX |
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
//#define GLFW_INCLUDE_NONE // Disable the standard OpenGL header inclusion on GLFW3 |
|
|
|
#include <GLFW/glfw3.h> // GLFW3 library: Windows, OpenGL context and Input management |
|
|
|
//#define GLFW_INCLUDE_NONE // Disable the standard OpenGL header inclusion on GLFW3 |
|
|
|
#include <GLFW/glfw3.h> // GLFW3 library: Windows, OpenGL context and Input management |
|
|
|
|
|
|
|
#ifdef __linux |
|
|
|
#define GLFW_EXPOSE_NATIVE_X11 // Linux specific definitions for getting |
|
|
@ -243,7 +247,7 @@ static int dropFilesCount = 0; // Count stored strings |
|
|
|
|
|
|
|
static double currentTime, previousTime; // Used to track timmings |
|
|
|
static double updateTime, drawTime; // Time measures for update and draw |
|
|
|
static double frameTime; // Time measure for one frame |
|
|
|
static double frameTime = 0.0; // Time measure for one frame |
|
|
|
static double targetTime = 0.0; // Desired time for one frame, if 0 not applied |
|
|
|
|
|
|
|
static char configFlags = 0; // Configuration flags (bit based) |
|
|
@ -264,6 +268,7 @@ static void InitGraphicsDevice(int width, int height); // Initialize graphics d |
|
|
|
static void SetupFramebufferSize(int displayWidth, int displayHeight); |
|
|
|
static void InitTimer(void); // Initialize timer |
|
|
|
static double GetTime(void); // Returns time since InitTimer() was run |
|
|
|
static void Wait(int ms); // Wait for some milliseconds (stop program execution) |
|
|
|
static bool GetKeyStatus(int key); // Returns if a key has been pressed |
|
|
|
static bool GetMouseButtonStatus(int button); // Returns if a mouse button has been pressed |
|
|
|
static void PollInputEvents(void); // Register user events |
|
|
@ -313,6 +318,11 @@ static void InitGamepad(void); // Init raw gamepad inpu |
|
|
|
static void *GamepadThread(void *arg); // Mouse reading thread |
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(_WIN32) |
|
|
|
// NOTE: We include Sleep() function signature here to avoid windows.h inclusion |
|
|
|
void __stdcall Sleep(unsigned long msTimeout); // Required for Delay() |
|
|
|
#endif |
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
// Module Functions Definition - Window and OpenGL Context Functions |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
@ -638,15 +648,16 @@ void EndDrawing(void) |
|
|
|
|
|
|
|
frameTime = updateTime + drawTime; |
|
|
|
|
|
|
|
double extraTime = 0.0; |
|
|
|
|
|
|
|
while (frameTime < targetTime) |
|
|
|
// Wait for some milliseconds... |
|
|
|
if (frameTime < targetTime) |
|
|
|
{ |
|
|
|
// Implement a delay |
|
|
|
Wait((int)((targetTime - frameTime)*1000)); |
|
|
|
|
|
|
|
currentTime = GetTime(); |
|
|
|
extraTime = currentTime - previousTime; |
|
|
|
kt">double extraTime = currentTime - previousTime; |
|
|
|
previousTime = currentTime; |
|
|
|
frameTime += extraTime; |
|
|
|
|
|
|
|
frameTime = updateTime + drawTime + extraTime; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -780,20 +791,16 @@ void SetTargetFPS(int fps) |
|
|
|
} |
|
|
|
|
|
|
|
// Returns current FPS |
|
|
|
float GetFPS(void) |
|
|
|
int GetFPS(void) |
|
|
|
{ |
|
|
|
return (float)(1.0/frameTime); |
|
|
|
return (int)floorf(1.0f/GetFrameTime()); |
|
|
|
} |
|
|
|
|
|
|
|
// Returns time in seconds for one frame |
|
|
|
float GetFrameTime(void) |
|
|
|
{ |
|
|
|
// As we are operate quite a lot with frameTime, |
|
|
|
// it could be no stable, so we round it before passing it around |
|
|
|
// NOTE: There are still problems with high framerates (>500fps) |
|
|
|
double roundedFrameTime = round(frameTime*10000)/10000.0; |
|
|
|
|
|
|
|
return (float)roundedFrameTime; // Time in seconds to run a frame |
|
|
|
// NOTE: We round value to milliseconds |
|
|
|
return (roundf(frameTime*1000.0)/1000.0f); |
|
|
|
} |
|
|
|
|
|
|
|
// Converts Color to float array and normalizes |
|
|
@ -1931,6 +1938,31 @@ static double GetTime(void) |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
// Wait for some milliseconds (stop program execution) |
|
|
|
static void Wait(int ms) |
|
|
|
{ |
|
|
|
#if defined _WIN32 |
|
|
|
Sleep(ms); |
|
|
|
#elif defined __linux || defined(PLATFORM_WEB) |
|
|
|
struct timespec req = { 0 }; |
|
|
|
time_t sec = (int)(ms/1000); |
|
|
|
ms -= (sec*1000); |
|
|
|
req.tv_sec=sec; |
|
|
|
req.tv_nsec=ms*1000000L; |
|
|
|
|
|
|
|
// NOTE: Use nanosleep() on Unix platforms... usleep() it's deprecated. |
|
|
|
while (nanosleep(&req,&req) == -1) continue; |
|
|
|
//#elif defined __APPLE__ |
|
|
|
// TODO: |
|
|
|
#else |
|
|
|
double prevTime = GetTime(); |
|
|
|
double nextTime = 0.0; |
|
|
|
|
|
|
|
// Busy wait loop |
|
|
|
while ((nextTime - prevTime) < (double)ms/1000.0) nextTime = GetTime(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
// Get one key state |
|
|
|
static bool GetKeyStatus(int key) |
|
|
|
{ |
|
|
|