2
0
mirror of https://github.com/rehlds/rehlds.git synced 2025-01-16 16:48:13 +03:00

Moved optimized MSG_Write*Bits* under REHLDS_FIXES defined because it uses bf_write_s structure incompatible with the original engine

Fixed wrong tex.coords formula in SurfaceAtPoint()
Added missing calls to SV_CheckWaterTransition() in SV_Physics_Toss()
Flight recorder: Lazy init with HOOK_ENGINE
RehldsDemoPlayer: print heartbeat message every 10Mb of demo
This commit is contained in:
dreamstalker 2015-05-21 21:20:40 +04:00
parent f2fe5a6c74
commit 31bfe3db78
9 changed files with 56 additions and 19 deletions

View File

@ -457,7 +457,7 @@ typedef struct bf_write_s
{
//For enhanced and safe bits writing functions
#if defined(REHLDS_OPT_PEDANTIC) || defined(REHLDS_FIXES)
#if defined(REHLDS_FIXES)
#pragma pack(push, 1)
union {
@ -471,13 +471,13 @@ typedef struct bf_write_s
int nCurOutputBit;
sizebuf_t *pbuf;
#else //defined(REHLDS_OPT_PEDANTIC) || defined(REHLDS_FIXES)
#else //defined(REHLDS_FIXES)
int nCurOutputBit;
unsigned char *pOutByte;
sizebuf_t *pbuf;
#endif //defined(REHLDS_OPT_PEDANTIC) || defined(REHLDS_FIXES)
#endif //defined(REHLDS_FIXES)
} bf_write_t;
typedef struct bf_read_s
@ -502,7 +502,7 @@ void COM_BitOpsInit(void)
}
//Enhanced and safe bits writing functions
#if defined(REHLDS_OPT_PEDANTIC) || defined(REHLDS_FIXES)
#if defined(REHLDS_FIXES)
void MSG_WBits_MaybeFlush() {
if (bfwrite.nCurOutputBit < 32)
@ -561,7 +561,7 @@ void MSG_EndBitWriting(sizebuf_t *buf)
}
#else //defined(REHLDS_OPT_PEDANTIC) || defined(REHLDS_FIXES)
#else // defined(REHLDS_FIXES)
void MSG_WriteOneBit(int nValue)
{
@ -594,13 +594,6 @@ void MSG_StartBitWriting(sizebuf_t *buf)
bfwrite.pOutByte = &buf->data[buf->cursize];
}
NOXREF qboolean MSG_IsBitWriting(void)
{
NOXREFCHECK;
return bfwrite.pbuf != 0;
}
void MSG_EndBitWriting(sizebuf_t *buf)
{
if (!(bfwrite.pbuf->flags & SIZEBUF_OVERFLOWED))
@ -660,7 +653,14 @@ void MSG_WriteBits(uint32 data, int numbits)
}
}
#endif //defined(REHLDS_OPT_PEDANTIC) || defined(REHLDS_FIXES)
#endif //defined(REHLDS_FIXES)
NOXREF qboolean MSG_IsBitWriting(void)
{
NOXREFCHECK;
return bfwrite.pbuf != 0;
}
void MSG_WriteSBits(int data, int numbits)
{
@ -1291,6 +1291,7 @@ void *SZ_GetSpace(sizebuf_t *buf, int length)
void *data;
const char *buffername = buf->buffername ? buf->buffername : "???";
if (length < 0)
{
Sys_Error(__FUNCTION__ ": %i negative length on %s", length, buffername);

View File

@ -488,8 +488,8 @@ msurface_t *SurfaceAtPoint(model_t *pModel, mnode_t *node, vec_t *start, vec_t *
{
surf = &pModel->surfaces[node->firstsurface + i];
tex = surf->texinfo;
ds = (int)_DotProduct(mid, tex->vecs[0]);
dt = (int)_DotProduct(mid, tex->vecs[1]);
ds = (int)(_DotProduct(mid, tex->vecs[0]) + tex->vecs[0][3]);
dt = (int)(_DotProduct(mid, tex->vecs[1]) + tex->vecs[1][3]);
if (ds >= surf->texturemins[0])
{
if (dt >= surf->texturemins[1])

View File

@ -1097,8 +1097,11 @@ void SV_Physics_Toss(edict_t *ent)
}
ClipVelocity(ent->v.velocity, trace.plane.normal, ent->v.velocity, backoff);
if (trace.plane.normal[2] <= 0.7f)
if (trace.plane.normal[2] <= 0.7)
{
SV_CheckWaterTransition(ent);
return;
}
move[0] = ent->v.basevelocity[0] + ent->v.velocity[0];
move[1] = ent->v.basevelocity[1] + ent->v.velocity[1];
@ -1131,6 +1134,7 @@ void SV_Physics_Toss(edict_t *ent)
ent->v.avelocity[0] = vec3_origin[0];
ent->v.avelocity[1] = vec3_origin[1];
ent->v.avelocity[2] = vec3_origin[2];
SV_CheckWaterTransition(ent);
} /* size: 3408000 */
/* <b655d> ../engine/sv_phys.c:1668 */

View File

@ -570,6 +570,11 @@ void Rehlds_Debug_LogDeltaFlags(delta_t* delta, int counter, bool verbose) {
g_RehldsDebugLog.flush();
}
void Rehlds_Debug_LogSzAlloc(int counter, int cursize, int maxsize, int flags) {
g_RehldsDebugLog << "SZAlloc(c=" << counter << " sz=" << cursize << " maxsz= " << maxsize << " f=" << flags << ")\n";
g_RehldsDebugLog.flush();
}
void Rehlds_Debug_Init(Module* engine)
{

View File

@ -42,6 +42,7 @@ extern void Rehlds_Debug_logRealloc(size_t sz, void* oldPtr, void* newPtr);
extern void Rehlds_Debug_logFree(void* ptr);
extern void Rehlds_Debug_LogDeltaFlags(delta_t* delta, int counter, bool verbose);
extern void Rehlds_Debug_LogSzAlloc(int counter, int cursize, int maxsize, int flags);
extern void Rehlds_Debug_Init(Module* engine);

View File

@ -987,7 +987,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>REHLDS_OPT_PEDANTIC;REHLDS_SELF;HOOK_ENGINE;REHLDS_CHECKS;USE_BREAKPAD_HANDLER;DEDICATED;SWDS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>REHLDS_SELF;HOOK_ENGINE;REHLDS_CHECKS;USE_BREAKPAD_HANDLER;DEDICATED;SWDS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalOptions>/arch:IA32 %(AdditionalOptions)</AdditionalOptions>
<PrecompiledHeader>Use</PrecompiledHeader>
@ -1027,7 +1027,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>REHLDS_FIXES;REHLDS_OPT_PEDANTIC;REHLDS_SELF;REHLDS_CHECKS;USE_BREAKPAD_HANDLER;DEDICATED;SWDS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>REHLDS_OPT_PEDANTIC;REHLDS_SELF;REHLDS_CHECKS;USE_BREAKPAD_HANDLER;DEDICATED;SWDS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalOptions>/arch:IA32 %(AdditionalOptions)</AdditionalOptions>
<PrecompiledHeader>Use</PrecompiledHeader>

View File

@ -23,6 +23,12 @@ uint16 g_FRMsg_Frame;
uint16 g_FRMsg_FreeEntPrivateData;
uint16 g_FRMsg_AllocEntPrivateData;
void FR_CheckInit() {
#ifdef HOOK_ENGINE
if (!g_FlightRecorder)
FR_Init();
#endif
}
void FR_Init() {
g_FlightRecorder = new CRehldsFlightRecorder();
@ -33,23 +39,27 @@ void FR_Init() {
}
void FR_StartFrame() {
FR_CheckInit();
g_FlightRecorder->StartMessage(g_FRMsg_Frame, true);
g_FlightRecorder->WriteDouble(realtime);
g_FlightRecorder->EndMessage(g_FRMsg_Frame, true);
}
void FR_EndFrame() {
FR_CheckInit();
g_FlightRecorder->StartMessage(g_FRMsg_Frame, false);
g_FlightRecorder->EndMessage(g_FRMsg_Frame, false);
}
void FR_AllocEntPrivateData(void* res) {
FR_CheckInit();
g_FlightRecorder->StartMessage(g_FRMsg_AllocEntPrivateData, true);
g_FlightRecorder->WriteUInt32((size_t)res);
g_FlightRecorder->EndMessage(g_FRMsg_AllocEntPrivateData, true);
}
void FR_FreeEntPrivateData(void* data) {
FR_CheckInit();
g_FlightRecorder->StartMessage(g_FRMsg_FreeEntPrivateData, true);
g_FlightRecorder->WriteUInt32((size_t)data);
g_FlightRecorder->EndMessage(g_FRMsg_FreeEntPrivateData, true);

View File

@ -24,6 +24,9 @@ CPlayingEngExtInterceptor::CPlayingEngExtInterceptor(const char* fname, bool str
m_GameServerWrapper = NULL;
m_SteamBreakpadContext = NULL;
m_HeartBeatInterval = 10000000;
m_PrevHeartBeat = 0;
uint32 cmdlineLen = 0;
char cmdLine[2048];
@ -134,6 +137,8 @@ IEngExtCall* CPlayingEngExtInterceptor::getNextCallInternal(bool peek) {
IEngExtCall* CPlayingEngExtInterceptor::getNextCall(bool peek, bool processCallbacks, ExtCallFuncs expectedOpcode, bool needStart, const char* callSource) {
int size = (int)m_InStream.tellg();
int sizeLeft = m_inStreamSize - size;
maybeHeartBeat(size);
IEngExtCall* cmd = getNextCallInternal(peek);
if (peek) {
return cmd;
@ -158,7 +163,7 @@ IEngExtCall* CPlayingEngExtInterceptor::getNextCall(bool peek, bool processCallb
}
if (cmd->getOpcode() != expectedOpcode) {
rehlds_syserror("%s: bad opcode; expected %d got %d; size left: %d", __FUNCTION__, expectedOpcode, cmd->getOpcode(), m_inStreamSize - size);
rehlds_syserror("%s: bad opcode; expected %d got %d; size left: %d", __FUNCTION__, expectedOpcode, cmd->getOpcode(), sizeLeft);
}
if (needStart) {
if (!cmd->m_Start) rehlds_syserror("%s: bad fcall %d; expected start flag", __FUNCTION__, cmd->getOpcode());
@ -235,6 +240,13 @@ int CPlayingEngExtInterceptor::getOrRegisterSteamCallback(CCallbackBase* cb) {
return id;
}
void CPlayingEngExtInterceptor::maybeHeartBeat(int readPos) {
if (m_PrevHeartBeat + m_HeartBeatInterval <= readPos) {
m_PrevHeartBeat = readPos;
Con_Printf("%s: readPos=%u\n", __FUNCTION__, readPos);
}
}
uint32 CPlayingEngExtInterceptor::time(uint32* pTime)
{
CStdTimeCall* playCall = dynamic_cast<CStdTimeCall*>(getNextCall(false, false, ECF_CSTD_TIME, true, __FUNCTION__));

View File

@ -132,6 +132,8 @@ private:
CSteamGameServerPlayingWrapper* m_GameServerWrapper;
void* m_SteamBreakpadContext;
int m_HeartBeatInterval;
int m_PrevHeartBeat;
hostent_data_t m_CurrentHostentData;
struct hostent m_CurrentHostent;
@ -150,6 +152,8 @@ private:
int getOrRegisterSteamCallback(CCallbackBase* cb);
void maybeHeartBeat(int readPos);
public:
void* allocFuncCall();
void freeFuncCall(void* fcall);