]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sys_linux.c
optimized pose math to not use intermediate matrix
[xonotic/darkplaces.git] / sys_linux.c
index e1f85be170c6cb0f7c5920968a549eaa0736f18d..c274cf3b361f60855dd9bf7e6a0991ad687eb602 100644 (file)
@@ -1,6 +1,8 @@
 #include "quakedef.h"
 
 #ifdef WIN32
+#include <windows.h>
+#include <mmsystem.h>
 #include <io.h>
 #include "conio.h"
 #else
@@ -13,6 +15,9 @@
 #include <signal.h>
 
 
+cvar_t sys_usenoclockbutbenchmark = {CVAR_SAVE, "sys_usenoclockbutbenchmark", "0", "don't use ANY real timing, and simulate a clock (for benchmarking); the game then runs as fast as possible. Run a QC mod with bots that does some stuff, then does a quit at the end, to benchmark a server. NEVER do this on a public server."};
+static unsigned long benchmark_time;
+
 #ifdef WIN32
 cvar_t sys_usetimegettime = {CVAR_SAVE, "sys_usetimegettime", "1", "use windows timeGetTime function (which has issues on some motherboards) for timing rather than QueryPerformanceCounter timer (which has issues on multicore/multiprocessor machines and processors which are designed to conserve power)"};
 #else
@@ -28,7 +33,7 @@ cvar_t sys_useclockgettime = {CVAR_SAVE, "sys_useclockgettime", "0", "use POSIX
 // =======================================================================
 void Sys_Shutdown (void)
 {
-#ifndef WIN32
+#ifdef FNDELAY
        fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY);
 #endif
        fflush(stdout);
@@ -40,7 +45,7 @@ void Sys_Error (const char *error, ...)
        char string[MAX_INPUTLINE];
 
 // change stdin to non blocking
-#ifndef WIN32
+#ifdef FNDELAY
        fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY);
 #endif
 
@@ -56,21 +61,22 @@ void Sys_Error (const char *error, ...)
 
 void Sys_PrintToTerminal(const char *text)
 {
-#ifndef WIN32
+#ifdef FNDELAY
        // BUG: for some reason, NDELAY also affects stdout (1) when used on stdin (0).
        int origflags = fcntl (1, F_GETFL, 0);
        fcntl (1, F_SETFL, origflags & ~FNDELAY);
-#else
+#endif
+#ifdef WIN32
 #define write _write
 #endif
        while(*text)
        {
-               int written = (int)write(1, text, (int)strlen(text));
+               fs_offset_t written = (fs_offset_t)write(1, text, strlen(text));
                if(written <= 0)
                        break; // sorry, I cannot do anything about this error - without an output
                text += written;
        }
-#ifndef WIN32
+#ifdef FNDELAY
        fcntl (1, F_SETFL, origflags);
 #endif
        //fprintf(stdout, "%s", text);
@@ -81,8 +87,12 @@ double Sys_DoubleTime (void)
        static int first = true;
        static double oldtime = 0.0, curtime = 0.0;
        double newtime;
+       if(sys_usenoclockbutbenchmark.integer)
+       {
+               benchmark_time += 1;
+               return ((double) benchmark_time) / 1e6;
+       }
 #ifdef WIN32
-#include <mmsystem.h>
        // LordHavoc: note to people modifying this code, DWORD is specifically defined as an unsigned 32bit number, therefore the 65536.0 * 65536.0 is fine.
        if (sys_usetimegettime.integer)
        {
@@ -181,7 +191,7 @@ double Sys_DoubleTime (void)
 
 char *Sys_ConsoleInput(void)
 {
-       if (cls.state == ca_dedicated)
+       //if (cls.state == ca_dedicated)
        {
                static char text[MAX_INPUTLINE];
                static unsigned int len = 0;
@@ -226,11 +236,14 @@ char *Sys_ConsoleInput(void)
                timeout.tv_usec = 0;
                if (select (1, &fdset, NULL, NULL, &timeout) != -1 && FD_ISSET(0, &fdset))
                {
-                       len = read (0, text, sizeof(text));
+                       len = read (0, text, sizeof(text) - 1);
                        if (len >= 1)
                        {
                                // rip off the \n and terminate
-                               text[len-1] = 0;
+                               // div0: WHY? console code can deal with \n just fine
+                               // this caused problems with pasting stuff into a terminal window
+                               // so, not ripping off the \n, but STILL keeping a NUL terminator
+                               text[len] = 0;
                                return text;
                        }
                }
@@ -241,6 +254,11 @@ char *Sys_ConsoleInput(void)
 
 void Sys_Sleep(int microseconds)
 {
+       if(sys_usenoclockbutbenchmark.integer)
+       {
+               benchmark_time += microseconds;
+               return;
+       }
 #ifdef WIN32
        Sleep(microseconds / 1000);
 #else
@@ -259,6 +277,7 @@ void Sys_InitConsole (void)
 
 void Sys_Init_Commands (void)
 {
+       Cvar_RegisterVariable(&sys_usenoclockbutbenchmark);
 #ifdef WIN32
        Cvar_RegisterVariable(&sys_usetimegettime);
 #else
@@ -275,7 +294,7 @@ int main (int argc, char **argv)
        com_argc = argc;
        com_argv = (const char **)argv;
 
-#ifndef WIN32
+#ifdef FNDELAY
        fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY);
 #endif