2012-11-26 18:58:24 +00:00
/*
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Doom 3 BFG Edition GPL Source Code
2012-11-28 15:47:07 +00:00
Copyright ( C ) 1993 - 2012 id Software LLC , a ZeniMax Media company .
2012-11-26 18:58:24 +00:00
2012-11-28 15:47:07 +00:00
This file is part of the Doom 3 BFG Edition GPL Source Code ( " Doom 3 BFG Edition Source Code " ) .
2012-11-26 18:58:24 +00:00
Doom 3 BFG Edition Source Code is free software : you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with Doom 3 BFG Edition Source Code . If not , see < http : //www.gnu.org/licenses/>.
In addition , the Doom 3 BFG Edition Source Code is also subject to certain additional terms . You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code . If not , please request a copy in writing from id Software at the address below .
If you have questions concerning this license or the applicable additional terms , you may contact in writing id Software LLC , c / o ZeniMax Media Inc . , Suite 120 , Rockville , Maryland 20850 USA .
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*/
# include "../idlib/precompiled.h"
# pragma hdrstop
2012-11-28 15:47:07 +00:00
idCVar idEventLoop : : com_journal ( " com_journal " , " 0 " , CVAR_INIT | CVAR_SYSTEM , " 1 = record journal, 2 = play back journal " , 0 , 2 , idCmdSystem : : ArgCompletion_Integer < 0 , 2 > ) ;
2012-11-26 18:58:24 +00:00
idEventLoop eventLoopLocal ;
2012-11-28 15:47:07 +00:00
idEventLoop * eventLoop = & eventLoopLocal ;
2012-11-26 18:58:24 +00:00
/*
= = = = = = = = = = = = = = = = =
idEventLoop : : idEventLoop
= = = = = = = = = = = = = = = = =
*/
2012-11-28 15:47:07 +00:00
idEventLoop : : idEventLoop ( )
{
2012-11-26 18:58:24 +00:00
com_journalFile = NULL ;
com_journalDataFile = NULL ;
initialTimeOffset = 0 ;
}
/*
= = = = = = = = = = = = = = = = =
idEventLoop : : ~ idEventLoop
= = = = = = = = = = = = = = = = =
*/
2012-11-28 15:47:07 +00:00
idEventLoop : : ~ idEventLoop ( )
{
2012-11-26 18:58:24 +00:00
}
/*
= = = = = = = = = = = = = = = = =
idEventLoop : : GetRealEvent
= = = = = = = = = = = = = = = = =
*/
2012-11-28 15:47:07 +00:00
sysEvent_t idEventLoop : : GetRealEvent ( )
{
2012-11-26 18:58:24 +00:00
int r ;
sysEvent_t ev ;
2012-11-28 15:47:07 +00:00
2012-11-26 18:58:24 +00:00
// either get an event from the system or the journal file
2012-11-28 15:47:07 +00:00
if ( com_journal . GetInteger ( ) = = 2 )
{
r = com_journalFile - > Read ( & ev , sizeof ( ev ) ) ;
if ( r ! = sizeof ( ev ) )
{
2012-11-26 18:58:24 +00:00
common - > FatalError ( " Error reading from journal file " ) ;
}
2012-11-28 15:47:07 +00:00
if ( ev . evPtrLength )
{
2012-11-26 18:58:24 +00:00
ev . evPtr = Mem_ClearedAlloc ( ev . evPtrLength , TAG_EVENTS ) ;
r = com_journalFile - > Read ( ev . evPtr , ev . evPtrLength ) ;
2012-11-28 15:47:07 +00:00
if ( r ! = ev . evPtrLength )
{
2012-11-26 18:58:24 +00:00
common - > FatalError ( " Error reading from journal file " ) ;
}
}
2012-11-28 15:47:07 +00:00
}
else
{
2012-11-26 18:58:24 +00:00
ev = Sys_GetEvent ( ) ;
2012-11-28 15:47:07 +00:00
2012-11-26 18:58:24 +00:00
// write the journal value out if needed
2012-11-28 15:47:07 +00:00
if ( com_journal . GetInteger ( ) = = 1 )
{
r = com_journalFile - > Write ( & ev , sizeof ( ev ) ) ;
if ( r ! = sizeof ( ev ) )
{
2012-11-26 18:58:24 +00:00
common - > FatalError ( " Error writing to journal file " ) ;
}
2012-11-28 15:47:07 +00:00
if ( ev . evPtrLength )
{
2012-11-26 18:58:24 +00:00
r = com_journalFile - > Write ( ev . evPtr , ev . evPtrLength ) ;
2012-11-28 15:47:07 +00:00
if ( r ! = ev . evPtrLength )
{
2012-11-26 18:58:24 +00:00
common - > FatalError ( " Error writing to journal file " ) ;
}
}
}
}
2012-11-28 15:47:07 +00:00
2012-11-26 18:58:24 +00:00
return ev ;
}
/*
= = = = = = = = = = = = = = = = =
idEventLoop : : PushEvent
= = = = = = = = = = = = = = = = =
*/
2012-11-28 15:47:07 +00:00
void idEventLoop : : PushEvent ( sysEvent_t * event )
{
sysEvent_t * ev ;
2012-11-26 18:58:24 +00:00
static bool printedWarning ;
2012-11-28 15:47:07 +00:00
ev = & com_pushedEvents [ com_pushedEventsHead & ( MAX_PUSHED_EVENTS - 1 ) ] ;
if ( com_pushedEventsHead - com_pushedEventsTail > = MAX_PUSHED_EVENTS )
{
2012-11-26 18:58:24 +00:00
// don't print the warning constantly, or it can give time for more...
2012-11-28 15:47:07 +00:00
if ( ! printedWarning )
{
2012-11-26 18:58:24 +00:00
printedWarning = true ;
common - > Printf ( " WARNING: Com_PushEvent overflow \n " ) ;
}
2012-11-28 15:47:07 +00:00
if ( ev - > evPtr )
{
2012-11-26 18:58:24 +00:00
Mem_Free ( ev - > evPtr ) ;
}
com_pushedEventsTail + + ;
2012-11-28 15:47:07 +00:00
}
else
{
2012-11-26 18:58:24 +00:00
printedWarning = false ;
}
2012-11-28 15:47:07 +00:00
2012-11-26 18:58:24 +00:00
* ev = * event ;
com_pushedEventsHead + + ;
}
/*
= = = = = = = = = = = = = = = = =
idEventLoop : : GetEvent
= = = = = = = = = = = = = = = = =
*/
2012-11-28 15:47:07 +00:00
sysEvent_t idEventLoop : : GetEvent ( )
{
if ( com_pushedEventsHead > com_pushedEventsTail )
{
2012-11-26 18:58:24 +00:00
com_pushedEventsTail + + ;
2012-11-28 15:47:07 +00:00
return com_pushedEvents [ ( com_pushedEventsTail - 1 ) & ( MAX_PUSHED_EVENTS - 1 ) ] ;
2012-11-26 18:58:24 +00:00
}
return GetRealEvent ( ) ;
}
/*
= = = = = = = = = = = = = = = = =
idEventLoop : : ProcessEvent
= = = = = = = = = = = = = = = = =
*/
2012-11-28 15:47:07 +00:00
void idEventLoop : : ProcessEvent ( sysEvent_t ev )
{
2012-11-26 18:58:24 +00:00
// track key up / down states
2012-11-28 15:47:07 +00:00
if ( ev . evType = = SE_KEY )
{
2012-11-26 18:58:24 +00:00
idKeyInput : : PreliminaryKeyEvent ( ev . evValue , ( ev . evValue2 ! = 0 ) ) ;
}
2012-11-28 15:47:07 +00:00
if ( ev . evType = = SE_CONSOLE )
{
2012-11-26 18:58:24 +00:00
// from a text console outside the game window
2012-11-28 15:47:07 +00:00
cmdSystem - > BufferCommandText ( CMD_EXEC_APPEND , ( char * ) ev . evPtr ) ;
2012-11-26 18:58:24 +00:00
cmdSystem - > BufferCommandText ( CMD_EXEC_APPEND , " \n " ) ;
2012-11-28 15:47:07 +00:00
}
else
{
2012-11-26 18:58:24 +00:00
common - > ProcessEvent ( & ev ) ;
}
2012-11-28 15:47:07 +00:00
2012-11-26 18:58:24 +00:00
// free any block data
2012-11-28 15:47:07 +00:00
if ( ev . evPtr )
{
2012-11-26 18:58:24 +00:00
Mem_Free ( ev . evPtr ) ;
}
}
/*
= = = = = = = = = = = = = = =
idEventLoop : : RunEventLoop
= = = = = = = = = = = = = = =
*/
2012-11-28 15:47:07 +00:00
int idEventLoop : : RunEventLoop ( bool commandExecution )
{
2012-11-26 18:58:24 +00:00
sysEvent_t ev ;
2012-11-28 15:47:07 +00:00
while ( 1 )
{
if ( commandExecution )
{
2012-11-26 18:58:24 +00:00
// execute any bound commands before processing another event
cmdSystem - > ExecuteCommandBuffer ( ) ;
}
2012-11-28 15:47:07 +00:00
2012-11-26 18:58:24 +00:00
ev = GetEvent ( ) ;
2012-11-28 15:47:07 +00:00
2012-11-26 18:58:24 +00:00
// if no more events are available
2012-11-28 15:47:07 +00:00
if ( ev . evType = = SE_NONE )
{
2012-11-26 18:58:24 +00:00
return 0 ;
}
ProcessEvent ( ev ) ;
}
2012-11-28 15:47:07 +00:00
2012-11-26 18:58:24 +00:00
return 0 ; // never reached
}
/*
= = = = = = = = = = = = =
idEventLoop : : Init
= = = = = = = = = = = = =
*/
2012-11-28 15:47:07 +00:00
void idEventLoop : : Init ( )
{
2012-11-26 18:58:24 +00:00
initialTimeOffset = Sys_Milliseconds ( ) ;
2012-11-28 15:47:07 +00:00
2012-11-26 18:58:24 +00:00
common - > StartupVariable ( " journal " ) ;
2012-11-28 15:47:07 +00:00
if ( com_journal . GetInteger ( ) = = 1 )
{
2012-11-26 18:58:24 +00:00
common - > Printf ( " Journaling events \n " ) ;
com_journalFile = fileSystem - > OpenFileWrite ( " journal.dat " ) ;
com_journalDataFile = fileSystem - > OpenFileWrite ( " journaldata.dat " ) ;
2012-11-28 15:47:07 +00:00
}
else if ( com_journal . GetInteger ( ) = = 2 )
{
2012-11-26 18:58:24 +00:00
common - > Printf ( " Replaying journaled events \n " ) ;
com_journalFile = fileSystem - > OpenFileRead ( " journal.dat " ) ;
com_journalDataFile = fileSystem - > OpenFileRead ( " journaldata.dat " ) ;
}
2012-11-28 15:47:07 +00:00
if ( ! com_journalFile | | ! com_journalDataFile )
{
2012-11-26 18:58:24 +00:00
com_journal . SetInteger ( 0 ) ;
com_journalFile = 0 ;
com_journalDataFile = 0 ;
common - > Printf ( " Couldn't open journal files \n " ) ;
}
}
/*
= = = = = = = = = = = = =
idEventLoop : : Shutdown
= = = = = = = = = = = = =
*/
2012-11-28 15:47:07 +00:00
void idEventLoop : : Shutdown ( )
{
if ( com_journalFile )
{
2012-11-26 18:58:24 +00:00
fileSystem - > CloseFile ( com_journalFile ) ;
com_journalFile = NULL ;
}
2012-11-28 15:47:07 +00:00
if ( com_journalDataFile )
{
2012-11-26 18:58:24 +00:00
fileSystem - > CloseFile ( com_journalDataFile ) ;
com_journalDataFile = NULL ;
}
}
/*
= = = = = = = = = = = = = = = =
idEventLoop : : Milliseconds
Can be used for profiling , but will be journaled accurately
= = = = = = = = = = = = = = = =
*/
2012-11-28 15:47:07 +00:00
int idEventLoop : : Milliseconds ( )
{
2012-11-26 18:58:24 +00:00
# if 1 // FIXME!
return Sys_Milliseconds ( ) - initialTimeOffset ;
# else
sysEvent_t ev ;
2012-11-28 15:47:07 +00:00
2012-11-26 18:58:24 +00:00
// get events and push them until we get a null event with the current time
2012-11-28 15:47:07 +00:00
do
{
2012-11-26 18:58:24 +00:00
ev = Com_GetRealEvent ( ) ;
2012-11-28 15:47:07 +00:00
if ( ev . evType ! = SE_NONE )
{
2012-11-26 18:58:24 +00:00
Com_PushEvent ( & ev ) ;
}
2012-11-28 15:47:07 +00:00
}
while ( ev . evType ! = SE_NONE ) ;
2012-11-26 18:58:24 +00:00
return ev . evTime ;
# endif
}
/*
= = = = = = = = = = = = = = = =
idEventLoop : : JournalLevel
= = = = = = = = = = = = = = = =
*/
2012-11-28 15:47:07 +00:00
int idEventLoop : : JournalLevel ( ) const
{
2012-11-26 18:58:24 +00:00
return com_journal . GetInteger ( ) ;
}