/*==LICENSE==* CyanWorlds.com Engine - MMOG client, server and tools Copyright (C) 2011 Cyan Worlds, Inc. This program 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. This program 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 this program. If not, see . You can contact Cyan Worlds, Inc. by email legal@cyan.com or by snail mail at: Cyan Worlds, Inc. 14617 N Newport Hwy Mead, WA 99021 *==LICENSE==*/ #include #include "hsTimer.h" #include "hsTemplates.h" #include "plClientUnifiedTime.h" #if 0 #include "../plNetClient/plNetObjectDebugger.h" #include "../plNetClient/plNetClientMgr.h" #endif // static plUnifiedTime plClientUnifiedTime::fFrameStartTime = plUnifiedTime::GetCurrentTime(); // the 'current time' at the start of each time double plClientUnifiedTime::fSysTimeOffset = 0.0; // // static, called once at the start of each frame // void plClientUnifiedTime::SetSysTime() { fFrameStartTime.ToCurrentTime(); if (fSysTimeOffset == 0.0) fSysTimeOffset = hsTimer::GetSysSeconds() - fFrameStartTime.GetSecsDouble(); } // // convert from game clock to unified time // #pragma optimize( "g", off ) // disable global optimizations void plClientUnifiedTime::SetFromGameTime(double gameTime, double curGameSecs) { hsDoublePrecBegin; //double gameTimeOff = curGameSecs-gameTime; // when did this happen relative to our currrent sysTime //*this = GetFrameStartTime() - plUnifiedTime(gameTimeOff); SetSecsDouble(gameTime - fSysTimeOffset); hsDoublePrecEnd; #if 0 extern bool gMooseDump; if (gMooseDump) { plUnifiedTime ct = plUnifiedTime::GetCurrentTime(); plUnifiedTime ft = GetFrameStartTime(); plNetObjectDebugger::GetInstance()->LogMsg(hsTempStringF("SFGT: CT=%s\n", ct.PrintWMillis())); plNetObjectDebugger::GetInstance()->LogMsg(hsTempStringF("SFGT: FT=%s\n", ft.PrintWMillis())); plNetObjectDebugger::GetInstance()->LogMsg(hsTempStringF("SFGT: gt=%f secs in the past\n", gameTimeOff)); plNetObjectDebugger::GetInstance()->LogMsg(hsTempStringF("SFGT: this=%s\n\n", PrintWMillis())); } #endif } // // convert from unified time to game clock // void plClientUnifiedTime::ConvertToGameTime(double* gameTimeOut, double curGameSecs) { hsDoublePrecBegin; //plUnifiedTime utOff = GetFrameStartTime() - GetAsUnifiedTime(); // compute offset relative to current startFrame time //*gameTimeOut = curGameSecs - utOff.GetSecsDouble(); *gameTimeOut = GetSecsDouble() + fSysTimeOffset; hsDoublePrecEnd; #if 0 extern bool gMooseDump; if (gMooseDump) { plUnifiedTime ct = plUnifiedTime::GetCurrentTime(); plUnifiedTime ft = GetFrameStartTime(); plNetObjectDebugger::GetInstance()->LogMsg( hsTempStringF("CTGT: this=%s\n", PrintWMillis())); plNetObjectDebugger::GetInstance()->LogMsg(hsTempStringF("CTGT: CT=%s\n", ct.PrintWMillis())); plNetObjectDebugger::GetInstance()->LogMsg(hsTempStringF("CTGT: FT=%s\n", ft.PrintWMillis())); plNetObjectDebugger::GetInstance()->LogMsg(hsTempStringF("CTGT: OT=%s\n", utOff.PrintWMillis())); plNetObjectDebugger::GetInstance()->LogMsg( hsTempStringF("CTGT: ct=%f TO=%f\n\n", curGameSecs, *gameTimeOut)); } #endif } #pragma optimize( "", on ) // restore optimizations to their defaults const plClientUnifiedTime & plClientUnifiedTime::operator=(const plUnifiedTime & src) { plUnifiedTime* ut=this; *ut=src; return *this; } const plClientUnifiedTime & plClientUnifiedTime::operator=(const plClientUnifiedTime & src) { plUnifiedTime* ut=this; plUnifiedTime* utSrc=this; *ut=*utSrc; return *this; }