diff --git a/.efrocachemap b/.efrocachemap index 77ada522..d1c85744 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -4072,26 +4072,26 @@ "build/assets/workspace/ninjafightplug.py": "https://files.ballistica.net/cache/ba1/7f/b0/d7426f678c1fee642855e391f1b9", "build/assets/workspace/onslaughtplug.py": "https://files.ballistica.net/cache/ba1/21/26/7a4f7252ef70fdb86c734acacc42", "build/assets/workspace/runaroundplug.py": "https://files.ballistica.net/cache/ba1/53/0b/df2f7aaaf3cf4d9578c2bc5d4ad9", - "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "https://files.ballistica.net/cache/ba1/a0/93/97d65f33fbdb4290fcd2504ea7dc", - "build/prefab/full/linux_arm64_gui/release/ballisticakit": "https://files.ballistica.net/cache/ba1/fb/63/db9b48b5866ed27bda8d04cae2ad", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/d9/2c/d9ae9941824a784320da1d0e5924", - "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/cb/95/f5baa206619fbb82091727394cd4", - "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "https://files.ballistica.net/cache/ba1/cb/59/2182ab4f9e586198f19b6ef40721", - "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "https://files.ballistica.net/cache/ba1/d8/8f/45fc7a9b303abf7236d92e75426f", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/d1/b1/1aa0bc8bc5e967423dcbb7c2a09b", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/11/e1/ab5afe174e47070e8c80d3ff4a1d", - "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "https://files.ballistica.net/cache/ba1/a1/fe/00ed542d105de6d3bf3e13661f84", - "build/prefab/full/mac_arm64_gui/release/ballisticakit": "https://files.ballistica.net/cache/ba1/f6/6f/b3856ec3abd226e151739d2b4934", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/7b/6c/37126b3889cce46b84ecd0e6f51b", - "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/1e/21/60608e5de9cd5cc78f49745eff30", - "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "https://files.ballistica.net/cache/ba1/0d/0d/614782a81abb93f61dbc0f2baa72", - "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "https://files.ballistica.net/cache/ba1/f1/10/968f7b0aa4ca47a540c6b9433559", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/dd/e3/0d5f59619889591ed394a63dd5b8", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/64/0d/1d74089ac614697b7bd845b90491", - "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "https://files.ballistica.net/cache/ba1/0d/15/0bad144e460a0f2e70776ed6efdf", - "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "https://files.ballistica.net/cache/ba1/75/e0/f9fb47e7a46ac227dc7d24f17a9b", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "https://files.ballistica.net/cache/ba1/8d/85/61148b796a8b7cd6782b9923889a", - "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "https://files.ballistica.net/cache/ba1/9e/7d/f4ae27371d6f34b23de7ffdd4bc5", + "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "https://files.ballistica.net/cache/ba1/20/89/46c89da9adf1e1ec6928b8a68c1b", + "build/prefab/full/linux_arm64_gui/release/ballisticakit": "https://files.ballistica.net/cache/ba1/d9/a3/4cbb63acae25be6b7491f0f25cea", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/51/9e/ee206a64930f99d3ea524489fbec", + "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/4f/23/d629858f1883e04f2dcade7beddb", + "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "https://files.ballistica.net/cache/ba1/a9/44/470572d4e8feca17ae3b11138e83", + "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "https://files.ballistica.net/cache/ba1/7a/66/601d3687a215a1cdfa9295783039", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/c9/96/90513f943a203befb42d6cb5d6ea", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/dc/ab/128bcd29709e63413bba49433294", + "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "https://files.ballistica.net/cache/ba1/25/0b/8d6e24a7765a39917dbd3dcaa2c4", + "build/prefab/full/mac_arm64_gui/release/ballisticakit": "https://files.ballistica.net/cache/ba1/fc/6c/20e1c02863da7156392b97d65cbb", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/8a/1b/8717e8d7e6a687d49a9a97432bba", + "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/cd/96/996309bf44df4bd8260d6ca6b38a", + "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "https://files.ballistica.net/cache/ba1/4a/a0/7b8b1fa55933cf842e3f26330ebd", + "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "https://files.ballistica.net/cache/ba1/fe/99/cbfe50067337a90266bbc7041ef5", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/eb/85/377c47f51a123d46a41d161f42f7", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/ac/2e/6ef743fe72e01d45d5440af9a529", + "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "https://files.ballistica.net/cache/ba1/61/60/29ab0e2137b45322a1af2aa87e49", + "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "https://files.ballistica.net/cache/ba1/fe/4b/436bfaa5f5d43eb0d4ca0c58eccc", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "https://files.ballistica.net/cache/ba1/7e/0e/aef70e16a90c9669e8586dd8b13f", + "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "https://files.ballistica.net/cache/ba1/f5/72/b1a3d1858a74d844642483845325", "build/prefab/lib/linux_arm64_gui/debug/libballistica_plus.a": "https://files.ballistica.net/cache/ba1/8a/39/82acd22444cdde966df4838b3235", "build/prefab/lib/linux_arm64_gui/release/libballistica_plus.a": "https://files.ballistica.net/cache/ba1/82/23/3da9e812f6d9d83e9c4678645792", "build/prefab/lib/linux_arm64_server/debug/libballistica_plus.a": "https://files.ballistica.net/cache/ba1/8a/39/82acd22444cdde966df4838b3235", @@ -4108,14 +4108,14 @@ "build/prefab/lib/mac_x86_64_gui/release/libballistica_plus.a": "https://files.ballistica.net/cache/ba1/2b/1d/067ca5d1bc54339f2b8682ef1aed", "build/prefab/lib/mac_x86_64_server/debug/libballistica_plus.a": "https://files.ballistica.net/cache/ba1/65/49/cdbaca8ea343d79992618514438c", "build/prefab/lib/mac_x86_64_server/release/libballistica_plus.a": "https://files.ballistica.net/cache/ba1/2b/1d/067ca5d1bc54339f2b8682ef1aed", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "https://files.ballistica.net/cache/ba1/8e/37/b82ca02d65ee86100b7a23ad3129", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "https://files.ballistica.net/cache/ba1/f5/c8/b094cb9809c616a8394b8a4072ec", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "https://files.ballistica.net/cache/ba1/18/b5/3b8d3c278e56cb4522de22424387", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "https://files.ballistica.net/cache/ba1/ba/bb/6f496b8e0021722857db52c75de0", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "https://files.ballistica.net/cache/ba1/e8/7b/8b1e320760841fa3d173b1cead88", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "https://files.ballistica.net/cache/ba1/33/6a/b5c4ae400d21448e783f202c31d3", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "https://files.ballistica.net/cache/ba1/7c/5a/8389337316014fb973526a3f04a8", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "https://files.ballistica.net/cache/ba1/e8/cc/7279ec93c3d7da736c8439c2dc70", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "https://files.ballistica.net/cache/ba1/73/9f/50466e17d044b4cd6da6e0dd610f", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "https://files.ballistica.net/cache/ba1/46/63/085d9d8496290a996721b0185a1e", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "https://files.ballistica.net/cache/ba1/37/bd/0df0e27deb695a1a6af2841ab18e", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "https://files.ballistica.net/cache/ba1/67/90/92c58874800469b14cdb8514b423", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "https://files.ballistica.net/cache/ba1/97/73/a5aef2dba917b34b6b2bc82733e9", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "https://files.ballistica.net/cache/ba1/df/d2/6950b10723420d9e2f1c512a0e07", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "https://files.ballistica.net/cache/ba1/a6/5a/b123237539e57c9e68f5b36a22bd", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "https://files.ballistica.net/cache/ba1/3b/81/cbf61791b0fab0ec541b4a7df703", "src/assets/ba_data/python/babase/_mgen/__init__.py": "https://files.ballistica.net/cache/ba1/f8/85/fed7f2ed98ff2ba271f9dbe3391c", "src/assets/ba_data/python/babase/_mgen/enums.py": "https://files.ballistica.net/cache/ba1/48/4b/e6974f0a4d14be8213dc00d971c3", "src/ballistica/base/mgen/pyembed/binding_base.inc": "https://files.ballistica.net/cache/ba1/3e/7a/203e2a5d2b5bb42cfe3fd2fe16c2", diff --git a/.idea/dictionaries/ericf.xml b/.idea/dictionaries/ericf.xml index a7892d12..530d4899 100644 --- a/.idea/dictionaries/ericf.xml +++ b/.idea/dictionaries/ericf.xml @@ -660,6 +660,7 @@ darwiinremote datab databytes + datac dataclassio dataclassutils datamodule @@ -836,6 +837,7 @@ editcontroller editgame editorconfig + efca effmult efgrd efile @@ -861,6 +863,7 @@ emitfx emoji emojis + emptyappmode enablexinput ename encerr @@ -971,6 +974,7 @@ fcontents fcount fdata + fdataraw fdcount fdesc fdict @@ -1721,6 +1725,9 @@ meryu mesh messagetype + metabytes + metajson + metalen metallink metamakefile metaprogramming @@ -1897,6 +1904,7 @@ nodename nodepos nodpi + noexec nofiles noinspect nondeterministic diff --git a/CHANGELOG.md b/CHANGELOG.md index 280d606c..d2ce180f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.20 (build 21128, api 8, 2023-06-19) +### 1.7.20 (build 21129, api 8, 2023-06-19) - This seems like a good time for a `refactoring` release in anticipation of changes coming in 1.8. Basically this means that a lot of things will be diff --git a/ballisticakit-cmake/.idea/dictionaries/ericf.xml b/ballisticakit-cmake/.idea/dictionaries/ericf.xml index 18f52ad4..fb851d5b 100644 --- a/ballisticakit-cmake/.idea/dictionaries/ericf.xml +++ b/ballisticakit-cmake/.idea/dictionaries/ericf.xml @@ -396,6 +396,7 @@ cvar data databytes + datac dataclassio datadata dataout @@ -506,6 +507,7 @@ echofile echotime edef + efca effmult efro efrocaching @@ -519,6 +521,7 @@ embconnect emitfx emojis + emptyappmode enablexinput endblock endcall @@ -581,6 +584,7 @@ fcntl fcodefin fdata + fdataraw fdcount fdirs fdirx @@ -996,6 +1000,9 @@ meshdata messagebox messagetype + metabytes + metajson + metalen metallink metamakefile meth @@ -1098,6 +1105,7 @@ noassets nodename nodetype + noexec nofilename noglobs nointhash @@ -1851,6 +1859,7 @@ xmax xmin xmmintrin + xoffs xoffset xors xtweak diff --git a/src/assets/ba_data/python/babase/_apputils.py b/src/assets/ba_data/python/babase/_apputils.py index e35756a4..44651400 100644 --- a/src/assets/ba_data/python/babase/_apputils.py +++ b/src/assets/ba_data/python/babase/_apputils.py @@ -68,34 +68,36 @@ def should_submit_debug_info() -> bool: def handle_v1_cloud_log() -> None: - """Called on debug log prints. + """Called when new messages have been added to v1-cloud-log. - When this happens, we can upload our log to the server - after a short bit if desired. + When this happens, we can upload our log to the server after a short + bit if desired. """ app = _babase.app + classic = app.classic + plus = app.plus - if app.classic is None or app.plus is None: + if classic is None or plus is None: if _babase.do_once(): logging.warning( - 'handle_v1_cloud_log should not be called' + 'handle_v1_cloud_log should not be getting called' ' without classic and plus present.' ) return - app.classic.log_have_new = True - if not app.classic.log_upload_timer_started: + classic.log_have_new = True + if not classic.log_upload_timer_started: def _put_log() -> None: - assert app.plus is not None - assert app.classic is not None + assert plus is not None + assert classic is not None try: - sessionname = str(app.classic.get_foreground_host_session()) + sessionname = str(classic.get_foreground_host_session()) except Exception: sessionname = 'unavailable' try: - activityname = str(app.classic.get_foreground_host_activity()) + activityname = str(classic.get_foreground_host_activity()) except Exception: activityname = 'unavailable' @@ -103,28 +105,28 @@ def handle_v1_cloud_log() -> None: 'log': _babase.get_v1_cloud_log(), 'version': app.version, 'build': app.build_number, - 'userAgentString': app.classic.legacy_user_agent_string, + 'userAgentString': classic.legacy_user_agent_string, 'session': sessionname, 'activity': activityname, 'fatal': 0, 'userRanCommands': _babase.has_user_run_commands(), 'time': _babase.apptime(), 'userModded': _babase.workspaces_in_use(), - 'newsShow': app.plus.get_news_show(), + 'newsShow': plus.get_news_show(), } def response(data: Any) -> None: - assert app.classic is not None + assert classic is not None # A non-None response means success; lets # take note that we don't need to report further # log info this run if data is not None: - app.classic.log_have_new = False + classic.log_have_new = False _babase.mark_log_sent() - app.classic.master_server_v1_post('bsLog', info, response) + classic.master_server_v1_post('bsLog', info, response) - app.classic.log_upload_timer_started = True + classic.log_upload_timer_started = True # Delay our log upload slightly in case other # pertinent info gets printed between now and then. @@ -133,9 +135,9 @@ def handle_v1_cloud_log() -> None: # After a while, allow another log-put. def _reset() -> None: - assert app.classic is not None - app.classic.log_upload_timer_started = False - if app.classic.log_have_new: + assert classic is not None + classic.log_upload_timer_started = False + if classic.log_have_new: handle_v1_cloud_log() if not _babase.is_log_full(): diff --git a/src/assets/ba_data/python/baenv.py b/src/assets/ba_data/python/baenv.py index c96de69f..19e579e4 100644 --- a/src/assets/ba_data/python/baenv.py +++ b/src/assets/ba_data/python/baenv.py @@ -28,7 +28,7 @@ if TYPE_CHECKING: # Build number and version of the ballistica binary we expect to be # using. -TARGET_BALLISTICA_BUILD = 21128 +TARGET_BALLISTICA_BUILD = 21129 TARGET_BALLISTICA_VERSION = '1.7.20' _g_env_config: EnvConfig | None = None diff --git a/src/ballistica/base/app/app_mode_empty.cc b/src/ballistica/base/app/app_mode_empty.cc index df407677..a19e5c2e 100644 --- a/src/ballistica/base/app/app_mode_empty.cc +++ b/src/ballistica/base/app/app_mode_empty.cc @@ -2,6 +2,11 @@ #include "ballistica/base/app/app_mode_empty.h" +#include "ballistica/base/graphics/component/simple_component.h" +#include "ballistica/base/graphics/graphics.h" +#include "ballistica/base/graphics/support/frame_def.h" +#include "ballistica/base/graphics/text/text_group.h" + namespace ballistica::base { static AppModeEmpty* g_app_mode_empty{}; @@ -18,7 +23,49 @@ auto AppModeEmpty::GetSingleton() -> AppModeEmpty* { } void AppModeEmpty::Reset() { - // Nothing here currently. + // When we are first created (for use as a placeholder before any app-modes + // are set) we just draw nothing. However once we actually get reset for use + // as a an explicit app mode, we do our hello thing. + hello_mode_ = true; + + // Fade in if we currently aren't. + g_base->graphics->FadeScreen(true, 250, nullptr); +} + +void AppModeEmpty::DrawWorld(base::FrameDef* frame_def) { + if (!hello_mode_) { + return; + } + + // Just draw our spinning hello text. + if (!hello_text_group_.Exists()) { + hello_text_group_ = Object::New(); + hello_text_group_->set_text("Potato!"); + } + auto& grp(*hello_text_group_); + auto* pass = frame_def->overlay_pass(); + SimpleComponent c(pass); + c.SetTransparent(true); + c.SetColor(0.7f, 0.0f, 1.0f, 1.0f); + c.PushTransform(); + + auto xoffs = + sinf(static_cast(frame_def->display_time_millisecs()) / 600.0f); + auto yoffs = + cosf(static_cast(frame_def->display_time_millisecs()) / 600.0f); + c.Translate(pass->virtual_width() * 0.5f - 70.0f + xoffs * 200.0f, + pass->virtual_height() * 0.5f - 20.0f + yoffs * 200.0f); + c.Scale(2.0, 2.0); + + int text_elem_count = grp.GetElementCount(); + for (int e = 0; e < text_elem_count; e++) { + c.SetTexture(grp.GetElementTexture(e)); + c.SetFlatness(1.0f); + c.DrawMesh(grp.GetElementMesh(e)); + } + + c.PopTransform(); + c.Submit(); } } // namespace ballistica::base diff --git a/src/ballistica/base/app/app_mode_empty.h b/src/ballistica/base/app/app_mode_empty.h index bf54e5e7..21c476b5 100644 --- a/src/ballistica/base/app/app_mode_empty.h +++ b/src/ballistica/base/app/app_mode_empty.h @@ -6,6 +6,7 @@ #include #include "ballistica/base/app/app_mode.h" +#include "ballistica/shared/foundation/object.h" namespace ballistica::base { @@ -15,6 +16,11 @@ class AppModeEmpty : public AppMode { static auto GetSingleton() -> AppModeEmpty*; void Reset(); + void DrawWorld(base::FrameDef* frame_def) override; + + private: + Object::Ref hello_text_group_; + bool hello_mode_{}; }; } // namespace ballistica::base diff --git a/src/ballistica/base/base.cc b/src/ballistica/base/base.cc index 6d1d36a8..d51e9549 100644 --- a/src/ballistica/base/base.cc +++ b/src/ballistica/base/base.cc @@ -483,42 +483,59 @@ void BaseFeatureSet::ScreenMessage(const std::string& s, [this, s, color] { graphics->AddScreenMessage(s, color); }); } -void BaseFeatureSet::V1CloudLog(const std::string& msg) { - // If we've got a fully running app environment, let the Python layer - // handle this. It will group log messages intelligently and ship them - // to the master server with various other context info included. - +void BaseFeatureSet::DoV1CloudLog(const std::string& msg) { + // We may attempt to import stuff and that should *never* happen before + // base is fully imported. if (!IsBaseCompletelyImported()) { printf( - "WARNING: V1CloudLog called before babase import complete; will be " - "ignored.\n"); + "WARNING: V1CloudLog called before babase fully imported; ignoring.\n"); return; } - // PushCall functionality requires the app to be running. - if (app_running_) { - python->objs().PushCall(BasePython::ObjID::kHandleV1CloudLogCall); - } else { - if (HavePlus()) { - // For log messages before that time we ship them immediately since - // we don't know if the Python layer is (or will be) able to. - // NOTE: Currently short-circuiting this for basn to avoid - // shipping early logs that have no errors/warnings. Should clean - // this up. - if (g_early_v1_cloud_log_writes > 0 && !basn_log_behavior_) { - g_early_v1_cloud_log_writes -= 1; - std::string logprefix = "EARLY-LOG:"; - std::string logsuffix; - - // If we're an early enough error, our global log isn't even available, - // so include this specific message as a suffix instead. - if (g_core == nullptr) { - logsuffix = msg; - } - plus()->DirectSendV1CloudLogs(logprefix, logsuffix, false, nullptr); - } - } + // Even though this part lives here in 'base', this is considered 'classic' + // functionality, so silently no-op if classic isn't present. + if (!HaveClassic()) { + return; } + + // Let the Python layer handle this if possible. PushCall functionality + // requires the app to be running, and the call itself requires plus. + if (app_running_ && HavePlus()) { + python->objs().PushCall(BasePython::ObjID::kHandleV1CloudLogCall); + return; + } + + // Ok; Python path not available. We might be able to do a direct send. + + // Hack: Currently disabling direct sends for basn to avoid shipping early + // logs not containing errors or warnings. Need to clean this system up; + // this shouldn't be necessary. + if (basn_log_behavior_) { + return; + } + + // Need plus for direct sends. + if (!HavePlus()) { + printf("WARNING: V1CloudLog direct-sends not available; ignoring.\n"); + return; + } + + // Only attempt direct sends a few times. + if (g_early_v1_cloud_log_writes <= 0) { + return; + } + + // Ok; going ahead with the direct send. + g_early_v1_cloud_log_writes -= 1; + std::string logprefix = "EARLY-LOG:"; + std::string logsuffix; + + // If we're an early enough error, our global log isn't even available, + // so include this whole message as a suffix instead. + if (g_core == nullptr) { + logsuffix = msg; + } + plus()->DirectSendV1CloudLogs(logprefix, logsuffix, false, nullptr); } void BaseFeatureSet::PushConsolePrintCall(const std::string& msg) { diff --git a/src/ballistica/base/base.h b/src/ballistica/base/base.h index 5cb3225c..1036c9f0 100644 --- a/src/ballistica/base/base.h +++ b/src/ballistica/base/base.h @@ -676,7 +676,7 @@ class BaseFeatureSet : public FeatureSetNativeComponent, auto CreateFeatureSetData(FeatureSetNativeComponent* featureset) -> PyObject* override; auto FeatureSetFromData(PyObject* obj) -> FeatureSetNativeComponent* override; - void V1CloudLog(const std::string& msg) override; + void DoV1CloudLog(const std::string& msg) override; void PushConsolePrintCall(const std::string& msg) override; auto GetPyExceptionType(PyExcType exctype) -> PyObject* override; auto PrintPythonStackTrace() -> bool override; diff --git a/src/ballistica/base/graphics/graphics.cc b/src/ballistica/base/graphics/graphics.cc index 01fc0aa7..da62114f 100644 --- a/src/ballistica/base/graphics/graphics.cc +++ b/src/ballistica/base/graphics/graphics.cc @@ -1081,7 +1081,7 @@ void Graphics::UpdateGyro(millisecs_t real_time, millisecs_t elapsed) { } void Graphics::ApplyCamera(FrameDef* frame_def) { - camera_->Update(frame_def->base_time_elapsed()); + camera_->Update(frame_def->display_time_elapsed_millisecs()); camera_->UpdatePosition(); camera_->ApplyToFrameDef(frame_def); } @@ -1133,9 +1133,9 @@ void Graphics::BuildAndPushFrameDef() { FrameDef* frame_def = GetEmptyFrameDef(); frame_def->set_app_time_millisecs(app_time_millisecs); - frame_def->set_base_time( + frame_def->set_display_time_millisecs( static_cast(g_base->logic->display_time() * 1000.0)); - frame_def->set_base_time_elapsed(elapsed); + frame_def->set_display_time_elapsed_millisecs(elapsed); frame_def->set_frame_number(frame_def_count_++); if (!internal_components_inited_) { @@ -1158,9 +1158,7 @@ void Graphics::BuildAndPushFrameDef() { } else { // Ok, we're drawing a real frame. - bool session_fills_screen = g_base->app_mode()->DoesWorldFillScreen(); - - frame_def->set_needs_clear(!session_fills_screen); + frame_def->set_needs_clear(!g_base->app_mode()->DoesWorldFillScreen()); DrawWorld(frame_def); DrawUI(frame_def); @@ -1393,8 +1391,10 @@ void Graphics::DrawFades(FrameDef* frame_def, millisecs_t real_time) { cam_pt = Vector3f(frame_def->cam_original().x, frame_def->cam_original().y, frame_def->cam_original().z); - // in vr follow-mode the cam point gets tweaked.. (fixme should probably - // just do this on the camera end) + + // In vr follow-mode the cam point gets tweaked. + // + // FIXME: should probably just do this on the camera end. if (frame_def->camera_mode() == CameraMode::kOrbit) { // fudge this one up a bit; looks better that way.. cam_target_pt = Vector3f(frame_def->cam_target_original().x, @@ -1425,9 +1425,9 @@ void Graphics::DrawFades(FrameDef* frame_def, millisecs_t real_time) { c.DrawMeshAsset(g_base->assets->SysMesh(SysMeshID::kVRFade)); c.PopTransform(); c.Submit(); -#else // BA_VR_BUILD +#else // BA_VR_BUILD throw Exception(); -#endif // BA_VR_BUILD +#endif } else { SimpleComponent c(overlay_pass); c.SetTransparent(a < 1.0f); @@ -1493,45 +1493,43 @@ void Graphics::DrawCursor(RenderPass* pass, millisecs_t real_time) { } void Graphics::DrawBlotches(FrameDef* frame_def) { - if (!this->blotch_verts_.empty()) { - if (!this->shadow_blotch_mesh_.Exists()) - this->shadow_blotch_mesh_ = Object::New(); - this->shadow_blotch_mesh_->SetIndexData(Object::New( - this->blotch_indices_.size(), &this->blotch_indices_[0])); - this->shadow_blotch_mesh_->SetData(Object::New>( - this->blotch_verts_.size(), &this->blotch_verts_[0])); + if (!blotch_verts_.empty()) { + if (!shadow_blotch_mesh_.Exists()) { + shadow_blotch_mesh_ = Object::New(); + } + shadow_blotch_mesh_->SetIndexData(Object::New( + blotch_indices_.size(), &blotch_indices_[0])); + shadow_blotch_mesh_->SetData(Object::New>( + blotch_verts_.size(), &blotch_verts_[0])); SpriteComponent c(frame_def->light_shadow_pass()); c.SetTexture(g_base->assets->SysTexture(SysTextureID::kLight)); - c.DrawMesh(this->shadow_blotch_mesh_.Get()); + c.DrawMesh(shadow_blotch_mesh_.Get()); c.Submit(); } - if (!this->blotch_soft_verts_.empty()) { - if (!this->shadow_blotch_soft_mesh_.Exists()) - this->shadow_blotch_soft_mesh_ = Object::New(); - this->shadow_blotch_soft_mesh_->SetIndexData(Object::New( - this->blotch_soft_indices_.size(), &this->blotch_soft_indices_[0])); - this->shadow_blotch_soft_mesh_->SetData( - Object::New>(this->blotch_soft_verts_.size(), - &this->blotch_soft_verts_[0])); + if (!blotch_soft_verts_.empty()) { + if (!shadow_blotch_soft_mesh_.Exists()) { + shadow_blotch_soft_mesh_ = Object::New(); + } + shadow_blotch_soft_mesh_->SetIndexData(Object::New( + blotch_soft_indices_.size(), &blotch_soft_indices_[0])); + shadow_blotch_soft_mesh_->SetData(Object::New>( + blotch_soft_verts_.size(), &blotch_soft_verts_[0])); SpriteComponent c(frame_def->light_shadow_pass()); c.SetTexture(g_base->assets->SysTexture(SysTextureID::kLightSoft)); - c.DrawMesh(this->shadow_blotch_soft_mesh_.Get()); + c.DrawMesh(shadow_blotch_soft_mesh_.Get()); c.Submit(); } - if (!this->blotch_soft_obj_verts_.empty()) { - if (!this->shadow_blotch_soft_obj_mesh_.Exists()) { - this->shadow_blotch_soft_obj_mesh_ = Object::New(); + if (!blotch_soft_obj_verts_.empty()) { + if (!shadow_blotch_soft_obj_mesh_.Exists()) { + shadow_blotch_soft_obj_mesh_ = Object::New(); } - this->shadow_blotch_soft_obj_mesh_->SetIndexData( - Object::New(this->blotch_soft_obj_indices_.size(), - &this->blotch_soft_obj_indices_[0])); - this->shadow_blotch_soft_obj_mesh_->SetData( - Object::New>( - this->blotch_soft_obj_verts_.size(), - &this->blotch_soft_obj_verts_[0])); + shadow_blotch_soft_obj_mesh_->SetIndexData(Object::New( + blotch_soft_obj_indices_.size(), &blotch_soft_obj_indices_[0])); + shadow_blotch_soft_obj_mesh_->SetData(Object::New>( + blotch_soft_obj_verts_.size(), &blotch_soft_obj_verts_[0])); SpriteComponent c(frame_def->light_pass()); c.SetTexture(g_base->assets->SysTexture(SysTextureID::kLightSoft)); - c.DrawMesh(this->shadow_blotch_soft_obj_mesh_.Get()); + c.DrawMesh(shadow_blotch_soft_obj_mesh_.Get()); c.Submit(); } } diff --git a/src/ballistica/base/graphics/support/frame_def.cc b/src/ballistica/base/graphics/support/frame_def.cc index de38d0bb..3b4ba002 100644 --- a/src/ballistica/base/graphics/support/frame_def.cc +++ b/src/ballistica/base/graphics/support/frame_def.cc @@ -50,8 +50,8 @@ auto FrameDef::GetOverlayFlatPass() -> RenderPass* { void FrameDef::Reset() { assert(g_base->InLogicThread()); app_time_millisecs_ = 0; - base_time_ = 0; - base_time_elapsed_ = 0; + display_time_millisecs_ = 0; + display_time_elapsed_millisecs_ = 0; frame_number_ = 0; #if BA_DEBUG_BUILD diff --git a/src/ballistica/base/graphics/support/frame_def.h b/src/ballistica/base/graphics/support/frame_def.h index b9a8c790..d4743b55 100644 --- a/src/ballistica/base/graphics/support/frame_def.h +++ b/src/ballistica/base/graphics/support/frame_def.h @@ -46,10 +46,14 @@ class FrameDef { // Returns the bsGame master-net-time when this was made // (tries to match real time but is incremented more smoothly // so is better for drawing purposes) - auto base_time() const -> millisecs_t { return base_time_; } + auto display_time_millisecs() const -> millisecs_t { + return display_time_millisecs_; + } // How much base time does this frame-def represent. - auto base_time_elapsed() const -> millisecs_t { return base_time_elapsed_; } + auto display_time_elapsed_millisecs() const -> millisecs_t { + return display_time_elapsed_millisecs_; + } auto quality() const -> GraphicsQuality { return quality_; } auto orbiting() const -> bool { return orbiting_; } @@ -105,9 +109,13 @@ class FrameDef { void Reset(); void Finalize(); - void set_base_time_elapsed(millisecs_t val) { base_time_elapsed_ = val; } + void set_display_time_elapsed_millisecs(millisecs_t val) { + display_time_elapsed_millisecs_ = val; + } void set_app_time_millisecs(millisecs_t val) { app_time_millisecs_ = val; } - void set_base_time(millisecs_t val) { base_time_ = val; } + void set_display_time_millisecs(millisecs_t val) { + display_time_millisecs_ = val; + } void set_frame_number(int64_t val) { frame_number_ = val; } auto overlay_flat_pass() const -> RenderPass* { @@ -198,8 +206,8 @@ class FrameDef { GraphicsQuality quality_{GraphicsQuality::kLow}; bool orbiting_{}; millisecs_t app_time_millisecs_{}; - millisecs_t base_time_{}; - millisecs_t base_time_elapsed_{}; + millisecs_t display_time_millisecs_{}; + millisecs_t display_time_elapsed_millisecs_{}; int64_t frame_number_{}; Vector3f shadow_offset_{0.0f, 0.0f, 0.0f}; Vector2f shadow_scale_{1.0f, 1.0f}; diff --git a/src/ballistica/base/python/methods/python_methods_app.cc b/src/ballistica/base/python/methods/python_methods_app.cc index e4daff1a..f8c49c96 100644 --- a/src/ballistica/base/python/methods/python_methods_app.cc +++ b/src/ballistica/base/python/methods/python_methods_app.cc @@ -1362,6 +1362,8 @@ static auto PyEmptyAppModeActivate(PyObject* self) -> PyObject* { BA_PYTHON_TRY; BA_PRECONDITION(g_base->InLogicThread()); g_base->set_app_mode(AppModeEmpty::GetSingleton()); + AppModeEmpty::GetSingleton()->Reset(); + Py_RETURN_NONE; BA_PYTHON_CATCH; } @@ -1401,7 +1403,6 @@ static PyMethodDef PyEmptyAppModeDeactivateDef = { static auto PyEmptyAppModeHandleIntentDefault(PyObject* self) -> PyObject* { BA_PYTHON_TRY; BA_PRECONDITION(g_base->InLogicThread()); - AppModeEmpty::GetSingleton()->Reset(); Py_RETURN_NONE; BA_PYTHON_CATCH; } diff --git a/src/ballistica/core/support/base_soft.h b/src/ballistica/core/support/base_soft.h index 54131818..02ef8499 100644 --- a/src/ballistica/core/support/base_soft.h +++ b/src/ballistica/core/support/base_soft.h @@ -33,7 +33,7 @@ class BaseSoftInterface { -> PyObject* = 0; virtual auto FeatureSetFromData(PyObject* obj) -> FeatureSetNativeComponent* = 0; - virtual void V1CloudLog(const std::string& msg) = 0; + virtual void DoV1CloudLog(const std::string& msg) = 0; virtual void PushConsolePrintCall(const std::string& msg) = 0; virtual auto GetPyExceptionType(PyExcType exctype) -> PyObject* = 0; virtual auto PrintPythonStackTrace() -> bool = 0; diff --git a/src/ballistica/scene_v1/support/scene_v1_app_mode.cc b/src/ballistica/scene_v1/support/scene_v1_app_mode.cc index ce5e59d5..bfb2cb3c 100644 --- a/src/ballistica/scene_v1/support/scene_v1_app_mode.cc +++ b/src/ballistica/scene_v1/support/scene_v1_app_mode.cc @@ -1325,8 +1325,6 @@ auto SceneV1AppMode::DoesWorldFillScreen() -> bool { } void SceneV1AppMode::DrawWorld(base::FrameDef* frame_def) { - AppMode::DrawWorld(frame_def); - if (auto* session = GetForegroundSession()) { session->Draw(frame_def); frame_def->set_benchmark_type(session->benchmark_type()); diff --git a/src/ballistica/shared/ballistica.cc b/src/ballistica/shared/ballistica.cc index 4a925f2f..1be24656 100644 --- a/src/ballistica/shared/ballistica.cc +++ b/src/ballistica/shared/ballistica.cc @@ -39,7 +39,7 @@ auto main(int argc, char** argv) -> int { namespace ballistica { // These are set automatically via script; don't modify them here. -const int kEngineBuildNumber = 21128; +const int kEngineBuildNumber = 21129; const char* kEngineVersion = "1.7.20"; auto MonolithicMain(const core::CoreConfig& core_config) -> int { diff --git a/src/ballistica/shared/foundation/logging.cc b/src/ballistica/shared/foundation/logging.cc index 1cf4ef6f..83cdfcc2 100644 --- a/src/ballistica/shared/foundation/logging.cc +++ b/src/ballistica/shared/foundation/logging.cc @@ -58,7 +58,7 @@ void Logging::V1CloudLog(const std::string& msg) { // If the base feature-set is up, ship it off there for further handling. if (g_base_soft) { - g_base_soft->V1CloudLog(msg); + g_base_soft->DoV1CloudLog(msg); } } diff --git a/src/ballistica/ui_v1/support/root_ui.cc b/src/ballistica/ui_v1/support/root_ui.cc index d229d4e2..483a6da8 100644 --- a/src/ballistica/ui_v1/support/root_ui.cc +++ b/src/ballistica/ui_v1/support/root_ui.cc @@ -249,7 +249,7 @@ void RootUI::Draw(base::FrameDef* frame_def) { + connected_client_extra_offset_smoothed_, height - menu_button_size_ * 0.35f, kMenuButtonDrawDepth); c.Scale(menu_button_size_ * 0.8f, menu_button_size_ * 0.8f); - if (flash && frame_def->base_time() % 250 < 125) { + if (flash && frame_def->display_time_millisecs() % 250 < 125) { c.SetColor(1.0f, 1.4f, 1.0f); } c.DrawMeshAsset(g_base->assets->SysMesh(base::SysMeshID::kImage1x1)); @@ -336,7 +336,7 @@ void RootUI::Draw(base::FrameDef* frame_def) { -0.003f * party_size_text_group_->GetElementVScale(e), 0.0f, 1.0f); c.SetFlatness(1.0f); - if (flash && frame_def->base_time() % 250 < 125) { + if (flash && frame_def->display_time_millisecs() % 250 < 125) { c.SetColor(1, 1, 0); } else { if (party_size > 0) { @@ -379,7 +379,7 @@ void RootUI::Draw(base::FrameDef* frame_def) { -0.003f * start_a_game_text_group_->GetElementVScale(e), 0.0f, 1.0f); c.SetFlatness(1.0f); - if (flash && frame_def->base_time() % 250 < 125) { + if (flash && frame_def->display_time_millisecs() % 250 < 125) { c.SetColor(1, 1, 0); } else { c.SetColor(0, 1, 0); diff --git a/src/ballistica/ui_v1/widget/button_widget.cc b/src/ballistica/ui_v1/widget/button_widget.cc index ad9cfe6d..ab89e000 100644 --- a/src/ballistica/ui_v1/widget/button_widget.cc +++ b/src/ballistica/ui_v1/widget/button_widget.cc @@ -116,7 +116,7 @@ auto ButtonWidget::GetDrawBrightness(millisecs_t time) const -> float { } void ButtonWidget::Draw(base::RenderPass* pass, bool draw_transparent) { - millisecs_t current_time = pass->frame_def()->base_time(); + millisecs_t current_time = pass->frame_def()->display_time_millisecs(); Vector3f tilt = 0.02f * g_base->graphics->tilt(); float extra_offs_x = -tilt.y; diff --git a/src/ballistica/ui_v1/widget/container_widget.cc b/src/ballistica/ui_v1/widget/container_widget.cc index 19d11fbe..b9e7bef5 100644 --- a/src/ballistica/ui_v1/widget/container_widget.cc +++ b/src/ballistica/ui_v1/widget/container_widget.cc @@ -783,7 +783,7 @@ void ContainerWidget::Draw(base::RenderPass* pass, bool draw_transparent) { BA_DEBUG_UI_READ_LOCK; CheckLayout(); - millisecs_t net_time = pass->frame_def()->base_time(); + millisecs_t net_time = pass->frame_def()->display_time_millisecs(); float offset_h = 0.0f; // If we're transitioning, update our offsets in the first (opaque) pass. diff --git a/src/ballistica/ui_v1/widget/h_scroll_widget.cc b/src/ballistica/ui_v1/widget/h_scroll_widget.cc index c054ddd6..58394e55 100644 --- a/src/ballistica/ui_v1/widget/h_scroll_widget.cc +++ b/src/ballistica/ui_v1/widget/h_scroll_widget.cc @@ -514,7 +514,7 @@ void HScrollWidget::UpdateLayout() { void HScrollWidget::Draw(base::RenderPass* pass, bool draw_transparent) { have_drawn_ = true; - millisecs_t current_time = pass->frame_def()->base_time(); + millisecs_t current_time = pass->frame_def()->display_time_millisecs(); float prev_child_offset_h_smoothed = child_offset_h_smoothed_; // Ok, lets update our inertial scrolling during the opaque pass. diff --git a/src/ballistica/ui_v1/widget/image_widget.cc b/src/ballistica/ui_v1/widget/image_widget.cc index dfee1c10..23e84f5e 100644 --- a/src/ballistica/ui_v1/widget/image_widget.cc +++ b/src/ballistica/ui_v1/widget/image_widget.cc @@ -21,7 +21,7 @@ void ImageWidget::Draw(base::RenderPass* pass, bool draw_transparent) { return; } - millisecs_t current_time = pass->frame_def()->base_time(); + millisecs_t current_time = pass->frame_def()->display_time_millisecs(); Vector3f tilt = tilt_scale_ * 0.01f * g_base->graphics->tilt(); if (draw_control_parent()) tilt += 0.02f * g_base->graphics->tilt(); diff --git a/src/ballistica/ui_v1/widget/root_widget.cc b/src/ballistica/ui_v1/widget/root_widget.cc index 2fbee847..280e29ed 100644 --- a/src/ballistica/ui_v1/widget/root_widget.cc +++ b/src/ballistica/ui_v1/widget/root_widget.cc @@ -800,7 +800,7 @@ void RootWidget::Draw(base::RenderPass* pass, bool transparent) { // Opaque pass gets drawn first; use that as an opportunity to step up our // motion. if (!transparent) { - millisecs_t current_time = pass->frame_def()->base_time(); + millisecs_t current_time = pass->frame_def()->display_time_millisecs(); millisecs_t time_diff = std::min(millisecs_t{100}, current_time - update_time_); StepPositions(static_cast(time_diff)); diff --git a/src/ballistica/ui_v1/widget/scroll_widget.cc b/src/ballistica/ui_v1/widget/scroll_widget.cc index 77dfe11a..c2079974 100644 --- a/src/ballistica/ui_v1/widget/scroll_widget.cc +++ b/src/ballistica/ui_v1/widget/scroll_widget.cc @@ -591,7 +591,7 @@ void ScrollWidget::UpdateLayout() { void ScrollWidget::Draw(base::RenderPass* pass, bool draw_transparent) { have_drawn_ = true; - millisecs_t current_time = pass->frame_def()->base_time(); + millisecs_t current_time = pass->frame_def()->display_time_millisecs(); float prev_child_offset_v_smoothed = child_offset_v_smoothed_; // ok lets update our inertial scrolling during the opaque pass diff --git a/src/ballistica/ui_v1/widget/text_widget.cc b/src/ballistica/ui_v1/widget/text_widget.cc index cc589d1c..34aefa07 100644 --- a/src/ballistica/ui_v1/widget/text_widget.cc +++ b/src/ballistica/ui_v1/widget/text_widget.cc @@ -89,7 +89,7 @@ void TextWidget::SetEnabled(bool val) { } void TextWidget::Draw(base::RenderPass* pass, bool draw_transparent) { - millisecs_t current_time = pass->frame_def()->base_time(); + millisecs_t current_time = pass->frame_def()->display_time_millisecs(); // All our stuff currently happens in the transparent pass. if (!draw_transparent) {