mirror of
https://github.com/RYDE-WORK/ballistica.git
synced 2026-01-27 01:13:13 +08:00
sdl app now downshifts when backgrounded/minimized
This commit is contained in:
parent
ee8fec761b
commit
1dfc78e6dd
56
.efrocachemap
generated
56
.efrocachemap
generated
@ -4056,26 +4056,26 @@
|
||||
"build/assets/windows/Win32/ucrtbased.dll": "2def5335207d41b21b9823f6805997f1",
|
||||
"build/assets/windows/Win32/vc_redist.x86.exe": "b08a55e2e77623fe657bea24f223a3ae",
|
||||
"build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599",
|
||||
"build/prefab/full/linux_arm64_gui/debug/ballisticakit": "4d8d52da9915f4190afb737a12c2a4a6",
|
||||
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "34424d97b81cfc82cbbfe88e9978928b",
|
||||
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "b719a269b2b7800b33df6e235630fe6a",
|
||||
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "bf758fd915923d37fe79846181d46e7e",
|
||||
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "542145537e5315ebf1f2e8cd6e2bdebc",
|
||||
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "e4776c2f7288079b56ba45aec3931a98",
|
||||
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "4a2c6aa6ec4b13398dc468d07d149e31",
|
||||
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "afc1712caa72d1c81c2b310501fce1c3",
|
||||
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "8144382107928e18dbdda1cd94ef61c9",
|
||||
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "e281fafc908a8bc56b9673197eb2ce09",
|
||||
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "4faf1ce6711ce63fe03e53931a636818",
|
||||
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "ae6ebe1ae25ceb19bd16721eeecc8ff0",
|
||||
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "1ee0eac0f087c62652cebf839f93b5be",
|
||||
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "50dfea89bbaa44cf3c2e3f3e726c4294",
|
||||
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "655ab674cd46d6238e9776a19690db5c",
|
||||
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "746e00a43761362ad35947dbac10b418",
|
||||
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "0bb3c5679477cc060ddd822efbc84622",
|
||||
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "0dc3da0e30cd8016edd2e57db4e5e57e",
|
||||
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "9b5a5c36c791f9bdc782872248976262",
|
||||
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "c98d0387c178bbd7b94124d7d7b5c334",
|
||||
"build/prefab/full/linux_arm64_gui/debug/ballisticakit": "202a2e3e7dbb0fd70f631826c1dbaf0a",
|
||||
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "22ecb313cd505be3cd636b40b82aaf4e",
|
||||
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "5c885286ec7d31db5beec842e0d74f04",
|
||||
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "fa8322a1fc0b158db47f22f8f67bce40",
|
||||
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "026341fd254d8192d6593c78ed106f9e",
|
||||
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "c48a68814f8c4f9c14f75857ac721756",
|
||||
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "74da3142016212cd6ec612d3f4a04461",
|
||||
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "d0efb84cfb947c901c4b371a68c4983e",
|
||||
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "5a34c14e75fe4cb23c15866e622a95b9",
|
||||
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "55eb23b8e4c58366a9206d19b7583b59",
|
||||
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "14c485729c8c8dee8208e303eaa9c149",
|
||||
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "a0f44a88e6452866610c77b988e82fbf",
|
||||
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "d9e990f175d61d32e825b9c9704a5883",
|
||||
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "cf9a0ca90fad523d38aeafa4aa6d8abb",
|
||||
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "6a2df7fa5d02d4b353a408e33716d532",
|
||||
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "6cf962925756084b5dfde18a8ec46ecd",
|
||||
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "39a7a8b26bfb1241af1983f478a32e17",
|
||||
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "ecc017287c8665d20724b50d1d9fc114",
|
||||
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "c64f407e7f134b6961379f09b0b45f30",
|
||||
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "68e9c85cb35bbf3bf44a81b913ba7d20",
|
||||
"build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "ed4f56d8c3f411d4ee509d688fa75ed2",
|
||||
"build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "7703e63545add0d6baf9a2c0c48a8ff0",
|
||||
"build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "ed4f56d8c3f411d4ee509d688fa75ed2",
|
||||
@ -4092,14 +4092,14 @@
|
||||
"build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "7b1e17863d20f12dd11f13e0e9e94726",
|
||||
"build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "4b5b600e7f830a92ed41e165afba0d29",
|
||||
"build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "7b1e17863d20f12dd11f13e0e9e94726",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "7eb2391ed4c9ed1f46dd6e83b71b1b62",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "bd52a679e048fc3adbc6f06b8e4f6bc2",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "0e4e93745d1059bcdefa0eeebc325fb6",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "c8412bc125285588dc1d8e723ce3d32e",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "87b7984235393fc7169dce8c9a63eaac",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "263c866d0c20317b900e4e5bad67c778",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "dcfdbd19c9a6a8430a20e3e5a31b5b96",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "0cb59737b1fcbaa2aa12d6bf447aeedc",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "3283c623553f920fa2f3a9ec0030ac0d",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "fbe90d6ae5948402094786f0f3780a43",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "da351ad49a02bf9ea47173971258aba4",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "8f2bec2e58845179da06bb3846ef1009",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "2997bb1199bee10e628e4c05e8e3f91a",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "1439c19607ba8ecafbc601a848fe51da",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "503be144a9e8836f71eff0abbd29c5ad",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "ee250e8c6a40bcfeda25cbc0df88486c",
|
||||
"src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c",
|
||||
"src/assets/ba_data/python/babase/_mgen/enums.py": "f8cd3af311ac63147882590123b78318",
|
||||
"src/ballistica/base/mgen/pyembed/binding_base.inc": "9f71f171464dc004dbaab87e9bb4b03b",
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
### 1.7.28 (build 21408, api 8, 2023-10-02)
|
||||
### 1.7.28 (build 21409, api 8, 2023-10-03)
|
||||
|
||||
- Massively cleaned up code related to rendering and window systems (OpenGL,
|
||||
SDL, etc). This code had been growing into a nasty tangle for 15 years
|
||||
|
||||
@ -52,7 +52,7 @@ if TYPE_CHECKING:
|
||||
|
||||
# Build number and version of the ballistica binary we expect to be
|
||||
# using.
|
||||
TARGET_BALLISTICA_BUILD = 21408
|
||||
TARGET_BALLISTICA_BUILD = 21409
|
||||
TARGET_BALLISTICA_VERSION = '1.7.28'
|
||||
|
||||
|
||||
|
||||
@ -46,7 +46,8 @@ class AppAdapter {
|
||||
/// called if ManagesMainThreadEventLoop() returns true.
|
||||
virtual void DoExitMainThreadEventLoop();
|
||||
|
||||
/// Push a call to be run in the app's main thread.
|
||||
/// Push a call to be run in the app's 'main' thread. This is the thread
|
||||
/// where the OS generally expects event and UI processing to happen in.
|
||||
template <typename F>
|
||||
void PushMainThreadCall(const F& lambda) {
|
||||
DoPushMainThreadRunnable(NewLambdaRunnableUnmanaged(lambda));
|
||||
@ -57,7 +58,8 @@ class AppAdapter {
|
||||
/// implementation, this simply returns true in the main thread.
|
||||
virtual auto InGraphicsContext() -> bool;
|
||||
|
||||
/// Push a call to be run in the app's graphics context.
|
||||
/// Push a call to be run in the app's graphics context. Be aware that
|
||||
/// this may mean different threads on different platforms.
|
||||
template <typename F>
|
||||
void PushGraphicsContextCall(const F& lambda) {
|
||||
DoPushGraphicsContextRunnable(NewLambdaRunnableUnmanaged(lambda));
|
||||
|
||||
@ -107,52 +107,66 @@ void AppAdapterSDL::RunMainThreadEventLoopToCompletion() {
|
||||
while (!done_) {
|
||||
microsecs_t cycle_start_time = g_core->GetAppTimeMicrosecs();
|
||||
|
||||
// Run all pending events.
|
||||
// Events.
|
||||
SDL_Event event;
|
||||
while (SDL_PollEvent(&event) && (!done_)) {
|
||||
HandleSDLEvent_(event);
|
||||
}
|
||||
|
||||
// Draw a frame.
|
||||
if (g_base->graphics_server->TryRender()) {
|
||||
// Draw.
|
||||
if (!hidden_ && g_base->graphics_server->TryRender()) {
|
||||
SDL_GL_SwapWindow(sdl_window_);
|
||||
}
|
||||
|
||||
// In some cases, sleep until we should start our next cycle (depending
|
||||
// on max-frame-rate or other factors).
|
||||
// Sleep.
|
||||
SleepUntilNextEventCycle_(cycle_start_time);
|
||||
|
||||
// Repeat.
|
||||
}
|
||||
}
|
||||
|
||||
void AppAdapterSDL::SleepUntilNextEventCycle_(microsecs_t cycle_start_time) {
|
||||
// Special case which means no max. Farewell poor laptop battery.
|
||||
// Special case: if we're hidden, we simply sleep for a long bit; no fancy
|
||||
// timing.
|
||||
if (hidden_) {
|
||||
g_core->platform->SleepMillisecs(100);
|
||||
return;
|
||||
}
|
||||
|
||||
// Special case which means no max, and thus no sleeping. Farewell poor
|
||||
// laptop battery; we hardly knew ye.
|
||||
if (max_fps_ == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Normally we just calc when our next draw should happen and sleep 'til
|
||||
// then.
|
||||
microsecs_t now = g_core->GetAppTimeMicrosecs();
|
||||
auto used_max_fps = max_fps_;
|
||||
millisecs_t millisecs_per_frame = 1000000 / used_max_fps;
|
||||
// Special case: if we've got vsync enabled, let's tweak max-fps to be
|
||||
// just a *tiny* bit higher than requested. This means if our max-fps
|
||||
// matches the refresh rate we'll be trying to render just a bit faster
|
||||
// than vsync which should push us up against the vsync wall and keep
|
||||
// vsync doing most of the delay work. In that case the logging below
|
||||
// should show mostly 'no sleep.'. Without this delay, our render
|
||||
|
||||
// Special case: if we've got vsync enabled, let's tweak our drawing to
|
||||
// happen just a *tiny* bit faster than requested. This means, if our
|
||||
// max-fps matches the refresh rate, we'll be trying to render just a
|
||||
// *bit* faster than vsync which should push us up against the vsync wall
|
||||
// and keep vsync doing most of the delay work. In that case the logging
|
||||
// below should show mostly 'no sleep.'. Without this delay, our render
|
||||
// kick-offs tend to drift around the middle of the vsync cycle and I
|
||||
// worry there could be bad interference patterns in certain spots close
|
||||
// to the edges. Note that we want this tweak to be small enough that it
|
||||
// won't be noticable in situations where vsync and max-fps *don't*
|
||||
// match. (for instance limiting to 60hz on a 120hz vsynced monitor).
|
||||
// won't be noticable in situations where vsync and max-fps *don't* match.
|
||||
// For instance, limiting to 60hz on a 120hz vsynced monitor should still
|
||||
// work as expected.
|
||||
if (vsync_actually_enabled_) {
|
||||
millisecs_per_frame = 99 * millisecs_per_frame / 100;
|
||||
}
|
||||
microsecs_t target_time = cycle_start_time + millisecs_per_frame - oversleep_;
|
||||
|
||||
// Set a minimum so we don't sleep if we're within a few millisecs of
|
||||
// where we want to be. Sleep tends to run over by a bit so we'll
|
||||
// probably render closer to our target time by just skipping the sleep.
|
||||
// And the oversleep system will compensate just as it does if we sleep
|
||||
// too long.
|
||||
// where we want to be. Sleep tends to run over by a bit so we'll probably
|
||||
// render closer to our target time by just skipping the sleep. And the
|
||||
// oversleep system will compensate for our earliness just as it does if
|
||||
// we sleep too long.
|
||||
const microsecs_t min_sleep{2000};
|
||||
if (now + min_sleep >= target_time) {
|
||||
if (debug_log_sdl_frame_timing_) {
|
||||
@ -182,6 +196,7 @@ void AppAdapterSDL::SleepUntilNextEventCycle_(microsecs_t cycle_start_time) {
|
||||
}
|
||||
|
||||
void AppAdapterSDL::DoPushMainThreadRunnable(Runnable* runnable) {
|
||||
// Our main thread is the SDL event loop, so add this as an SDL event.
|
||||
assert(sdl_runnable_event_id_ != 0);
|
||||
SDL_Event event;
|
||||
SDL_memset(&event, 0, sizeof(event));
|
||||
@ -330,12 +345,19 @@ void AppAdapterSDL::HandleSDLEvent_(const SDL_Event& event) {
|
||||
break;
|
||||
|
||||
case SDL_WINDOWEVENT_HIDDEN: {
|
||||
// PauseApp();
|
||||
// Let's keep track of when we're hidden so we can stop drawing
|
||||
// and sleep more. Theoretically we could put the app into a full
|
||||
// suspended state like we do on mobile (pausing event loops/etc.)
|
||||
// but that would be more involved; we'd need to ignore most SDL
|
||||
// events while sleeping (except for SDL_WINDOWEVENT_SHOWN) and
|
||||
// would need to rebuild our controller lists/etc when we resume.
|
||||
// For now just gonna keep things simple and keep running.
|
||||
hidden_ = true;
|
||||
break;
|
||||
}
|
||||
|
||||
case SDL_WINDOWEVENT_SHOWN: {
|
||||
// ResumeApp();
|
||||
hidden_ = false;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -570,20 +592,18 @@ void AppAdapterSDL::ReloadRenderer_(
|
||||
auto width = static_cast<int>(kBaseVirtualResX * 0.8f);
|
||||
auto height = static_cast<int>(kBaseVirtualResY * 0.8f);
|
||||
|
||||
uint32_t flags = SDL_WINDOW_OPENGL
|
||||
| SDL_WINDOW_SHOWN
|
||||
// | SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_MOUSE_FOCUS
|
||||
uint32_t flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN
|
||||
| SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_RESIZABLE;
|
||||
if (fullscreen) {
|
||||
flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
|
||||
}
|
||||
|
||||
// On Mac we ask for a GL 4.1 Core profile. This is supported by all
|
||||
// hardware the game officially supports and is also the last version of
|
||||
// GL supported on Apple hardware. So we know exactly what we have to
|
||||
// work with.
|
||||
int context_flags{};
|
||||
if (g_buildconfig.ostype_macos()) {
|
||||
// On Mac we ask for a GL 4.1 Core profile. This is supported by all
|
||||
// hardware that we officially support and is also the last version of
|
||||
// GL supported on Apple hardware. So we have a nice fixed target to
|
||||
// work with.
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,
|
||||
@ -596,8 +616,14 @@ void AppAdapterSDL::ReloadRenderer_(
|
||||
|
||||
// Wondering if there would be a smarter strategy here; for example
|
||||
// trying a few different specific core profiles.
|
||||
|
||||
// Actually, in reading a bit more, Nvidia actually recommends
|
||||
// compatibility profiles and their core profiles may actually be
|
||||
// slightly slower due to extra checks, so what we're doing here might
|
||||
// be optimal.
|
||||
}
|
||||
if (g_buildconfig.debug_build()) {
|
||||
// Curious if this has any real effects anywhere.
|
||||
context_flags |= SDL_GL_CONTEXT_DEBUG_FLAG;
|
||||
}
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, context_flags);
|
||||
@ -613,8 +639,6 @@ void AppAdapterSDL::ReloadRenderer_(
|
||||
if (!sdl_gl_context_) {
|
||||
FatalError("Unable to create SDL GL Context");
|
||||
}
|
||||
// auto result = SDL_GL_SetSwapInterval(-1);
|
||||
// printf("GOT RESULT %d\n", result);
|
||||
|
||||
SDL_SetWindowTitle(sdl_window_, "BallisticaKit");
|
||||
|
||||
@ -637,14 +661,14 @@ void AppAdapterSDL::ReloadRenderer_(
|
||||
void AppAdapterSDL::UpdateScreenSizes_() {
|
||||
assert(g_base->app_adapter->InGraphicsContext());
|
||||
|
||||
// Grab logical window dimensions (points?).
|
||||
// This is the coordinate space SDL's events deal in.
|
||||
// Grab logical window dimensions (points?). This is the coordinate space
|
||||
// SDL's events deal in.
|
||||
int win_size_x, win_size_y;
|
||||
SDL_GetWindowSize(sdl_window_, &win_size_x, &win_size_y);
|
||||
window_size_ = Vector2f(win_size_x, win_size_y);
|
||||
|
||||
// Also grab the new size of the drawable; this is our physical
|
||||
// (pixel) dimensions.
|
||||
// Also grab the new size of the drawable; this is our physical (pixel)
|
||||
// dimensions.
|
||||
int pixels_x, pixels_y;
|
||||
SDL_GL_GetDrawableSize(sdl_window_, &pixels_x, &pixels_y);
|
||||
g_base->graphics_server->SetScreenResolution(static_cast<float>(pixels_x),
|
||||
|
||||
@ -56,39 +56,23 @@ class AppAdapterSDL : public AppAdapter {
|
||||
auto GetSDLJoystickInput_(int sdl_joystick_id) const -> JoystickInput*;
|
||||
// The same but using sdl events.
|
||||
auto GetSDLJoystickInput_(const SDL_Event* e) const -> JoystickInput*;
|
||||
// void DoSwap_();
|
||||
// void SwapBuffers_();
|
||||
// void UpdateAutoVSync_(int diff);
|
||||
void AddSDLInputDevice_(JoystickInput* input, int index);
|
||||
void RemoveSDLInputDevice_(int index);
|
||||
void SleepUntilNextEventCycle_(microsecs_t cycle_start_time);
|
||||
// millisecs_t last_swap_time_{};
|
||||
// millisecs_t swap_start_time_{};
|
||||
// int too_slow_frame_count_{};
|
||||
// bool auto_vsync_{};
|
||||
// bool vsync_enabled_{true};
|
||||
// float average_vsync_fps_{60.0f};
|
||||
// int vsync_good_frame_count_{};
|
||||
// int vsync_bad_frame_count_{};
|
||||
|
||||
bool done_{};
|
||||
bool fullscreen_{};
|
||||
bool vsync_actually_enabled_{};
|
||||
bool debug_log_sdl_frame_timing_{};
|
||||
bool hidden_{};
|
||||
VSync vsync_{VSync::kUnset};
|
||||
uint32_t sdl_runnable_event_id_{};
|
||||
int max_fps_{60};
|
||||
microsecs_t oversleep_{};
|
||||
std::vector<JoystickInput*> sdl_joysticks_;
|
||||
/// This is in points, not pixels.
|
||||
Vector2f window_size_{1.0f, 1.0f};
|
||||
SDL_Window* sdl_window_{};
|
||||
void* sdl_gl_context_{};
|
||||
// SDL_Surface* sdl_screen_surface_{};
|
||||
bool done_{};
|
||||
bool fullscreen_{};
|
||||
VSync vsync_{VSync::kUnset};
|
||||
bool vsync_actually_enabled_{};
|
||||
microsecs_t oversleep_{};
|
||||
int max_fps_{60};
|
||||
bool debug_log_sdl_frame_timing_{};
|
||||
// std::unique_ptr<GLContext> gl_context_;
|
||||
|
||||
// TEMP
|
||||
// friend class GLContext;
|
||||
friend class GraphicsServer;
|
||||
};
|
||||
|
||||
} // namespace ballistica::base
|
||||
|
||||
@ -119,7 +119,7 @@ class UIV1SoftInterface;
|
||||
class AppAdapterVR;
|
||||
class GraphicsVR;
|
||||
|
||||
enum class QuitType {
|
||||
enum class QuitType : uint8_t {
|
||||
/// Leads to the process exiting.
|
||||
kHard,
|
||||
/// May hide/reset the app but keep the process running. Generally how
|
||||
@ -131,7 +131,7 @@ enum class QuitType {
|
||||
kBack,
|
||||
};
|
||||
|
||||
enum class AssetType {
|
||||
enum class AssetType : uint8_t {
|
||||
kTexture,
|
||||
kCollisionMesh,
|
||||
kMesh,
|
||||
@ -140,19 +140,19 @@ enum class AssetType {
|
||||
kLast,
|
||||
};
|
||||
|
||||
enum class DrawType {
|
||||
enum class DrawType : uint8_t {
|
||||
kTriangles,
|
||||
kPoints,
|
||||
};
|
||||
|
||||
/// Hints to the renderer - stuff that is changed rarely should be static,
|
||||
/// and stuff changed often should be dynamic.
|
||||
enum class MeshDrawType {
|
||||
enum class MeshDrawType : uint8_t {
|
||||
kStatic,
|
||||
kDynamic,
|
||||
};
|
||||
|
||||
enum class ReflectionType {
|
||||
enum class ReflectionType : uint8_t {
|
||||
kNone,
|
||||
kChar,
|
||||
kPowerup,
|
||||
@ -162,7 +162,7 @@ enum class ReflectionType {
|
||||
kSharpest,
|
||||
};
|
||||
|
||||
enum class GraphicsQuality {
|
||||
enum class GraphicsQuality : uint8_t {
|
||||
/// Quality has not yet been set.
|
||||
kUnset,
|
||||
/// Bare minimum graphics.
|
||||
@ -175,11 +175,11 @@ enum class GraphicsQuality {
|
||||
kHigher,
|
||||
};
|
||||
|
||||
enum class VSync { kUnset, kNever, kAlways, kAdaptive };
|
||||
enum class VSyncRequest { kNever, kAlways, kAuto };
|
||||
enum class VSync : uint8_t { kUnset, kNever, kAlways, kAdaptive };
|
||||
enum class VSyncRequest : uint8_t { kNever, kAlways, kAuto };
|
||||
|
||||
/// Requests for exact or auto graphics quality values.
|
||||
enum class GraphicsQualityRequest {
|
||||
enum class GraphicsQualityRequest : uint8_t {
|
||||
kUnset,
|
||||
kLow,
|
||||
kMedium,
|
||||
@ -245,7 +245,7 @@ struct VertexSprite {
|
||||
float color[4];
|
||||
};
|
||||
|
||||
enum class MeshFormat {
|
||||
enum class MeshFormat : uint8_t {
|
||||
/// 16bit UV, 8bit normal, 8bit pt-index.
|
||||
kUV16N8Index8,
|
||||
/// 16bit UV, 8bit normal, 16bit pt-index.
|
||||
@ -254,12 +254,12 @@ enum class MeshFormat {
|
||||
kUV16N8Index32,
|
||||
};
|
||||
|
||||
enum class TextureType {
|
||||
enum class TextureType : uint8_t {
|
||||
k2D,
|
||||
kCubeMap,
|
||||
};
|
||||
|
||||
enum class TextureFormat {
|
||||
enum class TextureFormat : uint8_t {
|
||||
kNone,
|
||||
kRGBA_8888,
|
||||
kRGB_888,
|
||||
@ -274,25 +274,25 @@ enum class TextureFormat {
|
||||
kETC2_RGBA,
|
||||
};
|
||||
|
||||
enum class TextureCompressionType {
|
||||
enum class TextureCompressionType : uint8_t {
|
||||
kS3TC,
|
||||
kPVR,
|
||||
kETC1,
|
||||
kETC2,
|
||||
};
|
||||
|
||||
enum class TextureMinQuality {
|
||||
enum class TextureMinQuality : uint8_t {
|
||||
kLow,
|
||||
kMedium,
|
||||
kHigh,
|
||||
};
|
||||
|
||||
enum class CameraMode {
|
||||
enum class CameraMode : uint8_t {
|
||||
kFollow,
|
||||
kOrbit,
|
||||
};
|
||||
|
||||
enum class MeshDataType {
|
||||
enum class MeshDataType : uint8_t {
|
||||
kIndexedSimpleSplit,
|
||||
kIndexedObjectSplit,
|
||||
kIndexedSimpleFull,
|
||||
@ -310,44 +310,45 @@ struct TouchEvent {
|
||||
float y{};
|
||||
};
|
||||
|
||||
enum class TextMeshEntryType {
|
||||
enum class TextMeshEntryType : uint8_t {
|
||||
kRegular,
|
||||
kExtras,
|
||||
kOSRendered,
|
||||
};
|
||||
|
||||
enum MeshDrawFlags {
|
||||
enum MeshDrawFlags : uint8_t {
|
||||
kMeshDrawFlagNoReflection = 1,
|
||||
};
|
||||
|
||||
enum class LightShadowType {
|
||||
enum class LightShadowType : uint8_t {
|
||||
kNone,
|
||||
kTerrain,
|
||||
kObject,
|
||||
};
|
||||
|
||||
enum class TextureQualityRequest {
|
||||
enum class TextureQualityRequest : uint8_t {
|
||||
kUnset,
|
||||
kAuto,
|
||||
kHigh,
|
||||
kMedium,
|
||||
kLow,
|
||||
};
|
||||
enum class TextureQuality {
|
||||
|
||||
enum class TextureQuality : uint8_t {
|
||||
kUnset,
|
||||
kHigh,
|
||||
kMedium,
|
||||
kLow,
|
||||
};
|
||||
|
||||
enum class BenchmarkType {
|
||||
enum class BenchmarkType : uint8_t {
|
||||
kNone,
|
||||
kCPU,
|
||||
kGPU,
|
||||
};
|
||||
|
||||
#if BA_VR_BUILD
|
||||
enum class VRHandType {
|
||||
enum class VRHandType : uint8_t {
|
||||
kNone,
|
||||
kDaydreamRemote,
|
||||
kOculusTouchL,
|
||||
@ -372,7 +373,7 @@ struct VRHandsState {
|
||||
/// These do not necessarily correspond to actual shader objects in the renderer
|
||||
/// (a single shader may handle more than one of these, etc).
|
||||
/// These are simply categories of looks.
|
||||
enum class ShadingType {
|
||||
enum class ShadingType : uint8_t {
|
||||
kSimpleColor,
|
||||
kSimpleColorTransparent,
|
||||
kSimpleColorTransparentDoubleSided,
|
||||
@ -416,7 +417,7 @@ enum class ShadingType {
|
||||
kCount
|
||||
};
|
||||
|
||||
enum class SysTextureID {
|
||||
enum class SysTextureID : uint8_t {
|
||||
kUIAtlas,
|
||||
kButtonSquare,
|
||||
kWhite,
|
||||
@ -484,7 +485,7 @@ enum class SysTextureID {
|
||||
kWings
|
||||
};
|
||||
|
||||
enum class SysCubeMapTextureID {
|
||||
enum class SysCubeMapTextureID : uint8_t {
|
||||
kReflectionChar,
|
||||
kReflectionPowerup,
|
||||
kReflectionSoft,
|
||||
@ -494,7 +495,7 @@ enum class SysCubeMapTextureID {
|
||||
};
|
||||
|
||||
enum class SysSoundID {
|
||||
kDeek = 0,
|
||||
kDeek,
|
||||
kBlip,
|
||||
kBlank,
|
||||
kPunch,
|
||||
@ -512,9 +513,9 @@ enum class SysSoundID {
|
||||
kSparkle3
|
||||
};
|
||||
|
||||
enum class SystemDataID {};
|
||||
enum class SystemDataID : uint8_t {};
|
||||
|
||||
enum class SysMeshID {
|
||||
enum class SysMeshID : uint8_t {
|
||||
kButtonSmallTransparent,
|
||||
kButtonSmallOpaque,
|
||||
kButtonMediumTransparent,
|
||||
|
||||
@ -36,13 +36,13 @@ void BGDynamics::Emit(const BGDynamicsEmission& e) {
|
||||
g_base->bg_dynamics_server->PushEmitCall(e);
|
||||
}
|
||||
|
||||
// Call friend client to step our sim.
|
||||
void BGDynamics::Step(const Vector3f& cam_pos, int step_millisecs) {
|
||||
assert(g_base->InLogicThread());
|
||||
|
||||
// The BG dynamics thread just processes steps as fast as it can;
|
||||
// we need to throttle what we send or tell it to cut back if its behind
|
||||
int step_count = g_base->bg_dynamics_server->step_count();
|
||||
// printf("STEP COUNT %d\n", step_count);
|
||||
|
||||
// If we're really getting behind, start pruning stuff.
|
||||
if (step_count > 3) {
|
||||
|
||||
@ -2332,8 +2332,8 @@ void BGDynamicsServer::Step(StepData* step_data) {
|
||||
// Step the world.
|
||||
dWorldQuickStep(ode_world_, step_seconds_);
|
||||
|
||||
// Now generate a snapshot of our state and send it to the game thread,
|
||||
// so they can draw us.
|
||||
// Now generate a snapshot of our state and send it to the logic thread so
|
||||
// they can draw us.
|
||||
BGDynamicsDrawSnapshot* snapshot = CreateDrawSnapshot();
|
||||
g_base->logic->event_loop()->PushCall([snapshot] {
|
||||
snapshot->SetLogicThreadOwnership();
|
||||
|
||||
@ -60,13 +60,7 @@ class GraphicsServer {
|
||||
/// non-functional state.
|
||||
void SetNullGraphics();
|
||||
|
||||
// void PushSetScreenGammaCall(float gamma);
|
||||
void PushSetScreenPixelScaleCall(float pixel_scale);
|
||||
// void PushSetVSyncCall(bool sync, bool auto_sync);
|
||||
// void PushSetScreenCall(bool fullscreen, int width, int height,
|
||||
// TextureQualityRequest texture_quality_request,
|
||||
// GraphicsQualityRequest graphics_quality_request,
|
||||
// const std::string& android_res);
|
||||
void PushReloadMediaCall();
|
||||
void PushRemoveRenderHoldCall();
|
||||
void PushComponentUnloadCall(
|
||||
|
||||
@ -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 = 21408;
|
||||
const int kEngineBuildNumber = 21409;
|
||||
const char* kEngineVersion = "1.7.28";
|
||||
const int kEngineApiVersion = 8;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user