diff --git a/src/Common/Config.hpp b/src/Common/Config.hpp index 9e2f90a00d0..e71989b9e5a 100644 --- a/src/Common/Config.hpp +++ b/src/Common/Config.hpp @@ -33,6 +33,10 @@ #define NEW_SOUNDS // use new sounds. Please enclose any new sound additions with this define #define LAYERED_SND_SHOOT// see comment down below +/* Debug: */ +//#define USE_LOG_TIMING + + /* LAYERED_SND_SHOOT by Alundaio When defined, it will allow you to play a group of sounds from a specified section for snd_shoot. You can have as many layers as you want, but you must follow naming convention, diff --git a/src/xrCore/log.cpp b/src/xrCore/log.cpp index 1acbf8d7588..db4baae25b0 100644 --- a/src/xrCore/log.cpp +++ b/src/xrCore/log.cpp @@ -21,21 +21,18 @@ Lock logCS; xr_vector LogFile; LogCallback LogCB = 0; +bool ForceFlushLog = false; +IWriter* LogWriter = nullptr; +size_t CachedLog = 0; + void FlushLog() { if (!no_log) { logCS.Enter(); - IWriter* f = FS.w_open(logFName); - if (f) - { - for (const auto &i : LogFile) - { - LPCSTR s = i.c_str(); - f->w_string(s ? s : ""); - } - FS.w_close(f); - } + if (LogWriter) + LogWriter->flush(); + CachedLog = 0; logCS.Leave(); } } @@ -53,6 +50,33 @@ void AddOne(const char* split) if (LogExecCB && LogCB) LogCB(split); + if (LogWriter) + { +#ifdef USE_LOG_TIMING + char buf[64]; + char curTime[64]; + + auto now = std::chrono::system_clock::now(); + auto time = std::chrono::system_clock::to_time_t(now); + auto ms = std::chrono::duration_cast(now.time_since_epoch()) - + std::chrono::duration_cast(now.time_since_epoch()); + + std::strftime(buf, sizeof(buf), "%H:%M:%S", std::localtime(&time)); + int len = xr_sprintf(curTime, 64, "[%s.%03lld] ", buf, ms.count()); + + LogWriter->w_printf("%s%s\r\n", curTime, split); + CachedLog += len; +#else + LogWriter->w_printf("%s\r\n", split); +#endif + CachedLog += xr_strlen(split) + 2; + + if (ForceFlushLog || CachedLog >= 32768) + FlushLog(); + + //-RvP + } + logCS.Leave(); } @@ -192,20 +216,44 @@ void CreateLog(BOOL nl) FS.update_path(logFName, "$logs$", log_file_name); if (!no_log) { - IWriter* f = FS.w_open(logFName); - if (f == NULL) + // Alun: Backup existing log + xr_string backup_logFName = EFS.ChangeFileExt(logFName, ".bkp"); + FS.file_rename(logFName, backup_logFName.c_str(), true); + //-Alun + + LogWriter = FS.w_open(logFName); + if (LogWriter == nullptr) { #if defined(WINDOWS) MessageBox(NULL, "Can't create log file.", "Error", MB_ICONERROR); #endif abort(); } - FS.w_close(f); + + time_t t = time(NULL); + tm* ti = localtime(&t); + char buf[64]; + strftime(buf, 64, "[%x %X]\t", ti); + + for (u32 it = 0; it < LogFile.size(); it++) + { + LPCSTR s = LogFile[it].c_str(); + LogWriter->w_printf("%s%s\n", buf, s ? s : ""); + } + LogWriter->flush(); } + + LogFile.reserve(128); + + if (strstr(Core.Params, "-force_flushlog")) + ForceFlushLog = true; } void CloseLog(void) { FlushLog(); + if (LogWriter) + FS.w_close(LogWriter); + LogFile.clear(); } diff --git a/src/xrEngine/Environment_misc.cpp b/src/xrEngine/Environment_misc.cpp index 0f9bb8b6172..5cec424ca58 100644 --- a/src/xrEngine/Environment_misc.cpp +++ b/src/xrEngine/Environment_misc.cpp @@ -449,41 +449,41 @@ void CEnvDescriptorMixer::lerp( m_fSunShaftsIntensity = fi * A.m_fSunShaftsIntensity + f * B.m_fSunShaftsIntensity; } -m_fWaterIntensity = fi * A.m_fWaterIntensity + f * B.m_fWaterIntensity; + m_fWaterIntensity = fi * A.m_fWaterIntensity + f * B.m_fWaterIntensity; -m_fTreeAmplitudeIntensity = fi * A.m_fTreeAmplitudeIntensity + f * B.m_fTreeAmplitudeIntensity; + m_fTreeAmplitudeIntensity = fi * A.m_fTreeAmplitudeIntensity + f * B.m_fTreeAmplitudeIntensity; -// colors -//. sky_color.lerp (A.sky_color,B.sky_color,f).add(Mdf.sky_color).mul(modif_power); -sky_color.lerp(A.sky_color, B.sky_color, f); -if (Mdf.use_flags.test(eSkyColor)) - sky_color.add(Mdf.sky_color).mul(modif_power); + // colors + //. sky_color.lerp (A.sky_color,B.sky_color,f).add(Mdf.sky_color).mul(modif_power); + sky_color.lerp(A.sky_color, B.sky_color, f); + if (Mdf.use_flags.test(eSkyColor)) + sky_color.add(Mdf.sky_color).mul(modif_power); -//. ambient.lerp (A.ambient,B.ambient,f).add(Mdf.ambient).mul(modif_power); -ambient.lerp(A.ambient, B.ambient, f); -if (Mdf.use_flags.test(eAmbientColor)) - ambient.add(Mdf.ambient).mul(modif_power); + //. ambient.lerp (A.ambient,B.ambient,f).add(Mdf.ambient).mul(modif_power); + ambient.lerp(A.ambient, B.ambient, f); + if (Mdf.use_flags.test(eAmbientColor)) + ambient.add(Mdf.ambient).mul(modif_power); -hemi_color.lerp(A.hemi_color, B.hemi_color, f); + hemi_color.lerp(A.hemi_color, B.hemi_color, f); -if (Mdf.use_flags.test(eHemiColor)) -{ - hemi_color.x += Mdf.hemi_color.x; - hemi_color.y += Mdf.hemi_color.y; - hemi_color.z += Mdf.hemi_color.z; - hemi_color.x *= modif_power; - hemi_color.y *= modif_power; - hemi_color.z *= modif_power; -} + if (Mdf.use_flags.test(eHemiColor)) + { + hemi_color.x += Mdf.hemi_color.x; + hemi_color.y += Mdf.hemi_color.y; + hemi_color.z += Mdf.hemi_color.z; + hemi_color.x *= modif_power; + hemi_color.y *= modif_power; + hemi_color.z *= modif_power; + } -sun_color.lerp(A.sun_color, B.sun_color, f); + sun_color.lerp(A.sun_color, B.sun_color, f); -R_ASSERT(_valid(A.sun_dir)); -R_ASSERT(_valid(B.sun_dir)); -sun_dir.lerp(A.sun_dir, B.sun_dir, f).normalize(); -R_ASSERT(_valid(sun_dir)); + R_ASSERT(_valid(A.sun_dir)); + R_ASSERT(_valid(B.sun_dir)); + sun_dir.lerp(A.sun_dir, B.sun_dir, f).normalize(); + R_ASSERT(_valid(sun_dir)); -VERIFY2(sun_dir.y < 0, "Invalid sun direction settings while lerp"); + VERIFY2(sun_dir.y < 0, "Invalid sun direction settings while lerp"); } //-----------------------------------------------------------------------------