mirror of
https://github.com/RYDE-WORK/ballistica.git
synced 2026-01-19 21:37:57 +08:00
language updates, dev-console polishing, internal time format cleanup
This commit is contained in:
parent
1115983bcc
commit
d35f479f82
94
.efrocachemap
generated
94
.efrocachemap
generated
@ -421,7 +421,7 @@
|
||||
"build/assets/ba_data/audio/zoeOw.ogg": "74befe45a8417e95b6a2233c51992a26",
|
||||
"build/assets/ba_data/audio/zoePickup01.ogg": "48ab8cddfcde36a750856f3f81dd20c8",
|
||||
"build/assets/ba_data/audio/zoeScream01.ogg": "2b468aedfa8741090247f04eb9e6df55",
|
||||
"build/assets/ba_data/data/langdata.json": "d53c301a74d3b116b00f6abf5a53b16f",
|
||||
"build/assets/ba_data/data/langdata.json": "b2fbc1751bd168470392de5370c196f4",
|
||||
"build/assets/ba_data/data/languages/arabic.json": "c21378ee214a9dd0cb2971cd46b74374",
|
||||
"build/assets/ba_data/data/languages/belarussian.json": "4d89ed5f9c615771d4fa2bb1834942d3",
|
||||
"build/assets/ba_data/data/languages/chinese.json": "0a9d9534e7329d1e886adae6fdc007c4",
|
||||
@ -447,10 +447,10 @@
|
||||
"build/assets/ba_data/data/languages/polish.json": "6677925c370390f1f53bcb737cb00fa8",
|
||||
"build/assets/ba_data/data/languages/portuguese.json": "51e362956f89da3eec980f587c092253",
|
||||
"build/assets/ba_data/data/languages/romanian.json": "aeebdd54f65939c2facc6ac50c117826",
|
||||
"build/assets/ba_data/data/languages/russian.json": "561504cca28eb3204ac194950029e565",
|
||||
"build/assets/ba_data/data/languages/russian.json": "6e524210149d95479d6cbfd3506c630b",
|
||||
"build/assets/ba_data/data/languages/serbian.json": "d7452dd72ac0e51680cb39b5ebaa1c69",
|
||||
"build/assets/ba_data/data/languages/slovak.json": "27962d53dc3f7dd4e877cd40faafeeef",
|
||||
"build/assets/ba_data/data/languages/spanish.json": "5a4dbd505060dd02d634bd4de4d5faab",
|
||||
"build/assets/ba_data/data/languages/spanish.json": "b179da96097e2b4df9f0397da672be69",
|
||||
"build/assets/ba_data/data/languages/swedish.json": "77d671f10613291ebf9c71da66f18a18",
|
||||
"build/assets/ba_data/data/languages/tamil.json": "65ab7798d637fa62a703750179eeb723",
|
||||
"build/assets/ba_data/data/languages/thai.json": "33f63753c9af9a5b238d229a0bf23fbc",
|
||||
@ -4056,50 +4056,50 @@
|
||||
"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": "637b3e06d6536db39d816e0b5820c0ab",
|
||||
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "e3a0ad82944e80528a227807a9a9ba6d",
|
||||
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "f8252819a3d84a2c3be5e3ed938e5f8b",
|
||||
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "7e8682e4ef71b0d432576ce8f879b3b2",
|
||||
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "eb3a79d46714a2585da45f66ae5352eb",
|
||||
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "1ebb8b160059182d79b586f40f4bb207",
|
||||
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "b51ff49b8e145ebee0d5a3f8c2e517fb",
|
||||
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "9eecb06461e9798439c4d15399b7d28a",
|
||||
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "7ffd1e3961eb68f820ff044f2ba62cf9",
|
||||
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "3ab890f1e4116739bce0e2c141440773",
|
||||
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "d6d47b5b7bf720c0936a53deffe07359",
|
||||
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "0ce0fcd7d19e767db721eb43f58424f7",
|
||||
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "4fac89dcba67096cd2f84f0b687b1880",
|
||||
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "0df3b09ffdf3dc519cea1a3a9fb959d2",
|
||||
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "8eb92b2fa10d56cfee3fd8da179cfda7",
|
||||
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "b0764a6280bfbe926b655df8f946e8e2",
|
||||
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "f69383ecdafab7a37907898fcbf98fa1",
|
||||
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "617e7ca8f4ed3d3f726ba9567a15732e",
|
||||
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "9133fee71d08209b5ac82f772edae5c9",
|
||||
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "1cfd194e81bb849e337b34df43157ba8",
|
||||
"build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "476e9cf1fb229a023babd799a6e535f1",
|
||||
"build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "cf2a61fae8e8cd757864202a09e71255",
|
||||
"build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "476e9cf1fb229a023babd799a6e535f1",
|
||||
"build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "cf2a61fae8e8cd757864202a09e71255",
|
||||
"build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "b46b30262b58e96e994211631b470efb",
|
||||
"build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "6cc41e3401daf2e72b884fbfe0fe92b3",
|
||||
"build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "b46b30262b58e96e994211631b470efb",
|
||||
"build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "6cc41e3401daf2e72b884fbfe0fe92b3",
|
||||
"build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "b915f8a091643d99fd28e8d636063185",
|
||||
"build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "cb5de031162e4ff0cb5f030adf331a12",
|
||||
"build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "b915f8a091643d99fd28e8d636063185",
|
||||
"build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "cb5de031162e4ff0cb5f030adf331a12",
|
||||
"build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "be2a7322e1ddbb38ba0d22dd94a565e3",
|
||||
"build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "1920c5412307a78aa658c3366c86b7fc",
|
||||
"build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "b257bbc06d82fc912653806c01a42c15",
|
||||
"build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "1920c5412307a78aa658c3366c86b7fc",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "693493fea9a0068d67d05ac32c53d938",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "0ad9cd9671e260ea90f97a3334a063d0",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "0dc8f56e25b1bb2b67bdb6f1b65c56b6",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "02bfe33e3189d0993aff1884cae95ccf",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "7867875c532b032ace05fef64e278635",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "7dfdd479341808a7301158591caac092",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "3604c049578423bce477d0be543529f4",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "57b11043daad1545cd2abb0c13f43db7",
|
||||
"build/prefab/full/linux_arm64_gui/debug/ballisticakit": "d81b7738fc395f6f926aabaee1920925",
|
||||
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "70d7de73a945afbe78f6ba94dd0fd78c",
|
||||
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "5ee9cf8e99fb9fbc6b80ef7fa6840be5",
|
||||
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "8eb65d8768f338c7188de404d584068f",
|
||||
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "4422950377f4194463b38533487b81df",
|
||||
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "3e85a676808245e0a279e2fb28fad8fc",
|
||||
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "50ac87225e3b4ac843d83fcec96ef542",
|
||||
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "ce8fedb78aac2ec288697fbace511d68",
|
||||
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "9db6948f77ff98d109e799d4d97266f7",
|
||||
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "517b1d6326879fd7ae1ad17d96e7c9ee",
|
||||
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "b49b73a09460467bba983c301d33feb8",
|
||||
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "7b4741075224986c1776bc9e538b80cc",
|
||||
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "f8a1e3030d6e9129f95ab5b7ea171134",
|
||||
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "615505f555b1ecf567ac00c1a71d4073",
|
||||
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "257f4ec71878b30f0a3619d8a5a278d8",
|
||||
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "0d4a6355de77872b17b4ed2856cfd3e3",
|
||||
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "e76d8896417d7c468b743f865f6d317a",
|
||||
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "1f7b66a5c7bf998f9d59fa28ef1a2dc5",
|
||||
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "a537bc369c09da6384a47e878b7dd11d",
|
||||
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "0b34b2bdfc77cb1f8c3968c16b304307",
|
||||
"build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "844bab8bf2324a35e4f71510fb4065f3",
|
||||
"build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "0320ab824c7b9271dfdd6361dcd51d82",
|
||||
"build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "844bab8bf2324a35e4f71510fb4065f3",
|
||||
"build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "0320ab824c7b9271dfdd6361dcd51d82",
|
||||
"build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "28ec03fb21247269ea16b7dc31cc37c9",
|
||||
"build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "80e61c0f2a2e665eaa6260b60ca92144",
|
||||
"build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "28ec03fb21247269ea16b7dc31cc37c9",
|
||||
"build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "80e61c0f2a2e665eaa6260b60ca92144",
|
||||
"build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "773c691b680d407f050d11a0814048cd",
|
||||
"build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "22158f39a92f54838ca05f38e7f635a9",
|
||||
"build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "773c691b680d407f050d11a0814048cd",
|
||||
"build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "22158f39a92f54838ca05f38e7f635a9",
|
||||
"build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "8d88b975df7ccff1af919ea738dcbc0f",
|
||||
"build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "f7de016cce83b57002b87f42575c2287",
|
||||
"build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "054de6792232f57d2ad4a5a81e5b7e5f",
|
||||
"build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "f7de016cce83b57002b87f42575c2287",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "7f38979e847d5b3abef78acf83e41334",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "10ebbf27705f024b696c92db94d75506",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "287f846d6d424639348a02030f2bace9",
|
||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "0a2987deb121f5eb044c220079c17d50",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "97b59f0376cc0bff65bc8f583127e62b",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "c7421859bac7d02acb487784573cffd9",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "8e70dcb1e9c6a046473d2fec13796b76",
|
||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "104baba8083e75102f81c6e1c6b552b5",
|
||||
"src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c",
|
||||
"src/assets/ba_data/python/babase/_mgen/enums.py": "28323912b56ec07701eda3d41a6a4101",
|
||||
"src/ballistica/base/mgen/pyembed/binding_base.inc": "6df0f34207346d89a72924249ddd4706",
|
||||
|
||||
12
CHANGELOG.md
12
CHANGELOG.md
@ -1,4 +1,4 @@
|
||||
### 1.7.28 (build 21528, api 8, 2023-10-27)
|
||||
### 1.7.28 (build 21531, api 8, 2023-10-27)
|
||||
|
||||
- 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
|
||||
@ -192,6 +192,16 @@
|
||||
technical users can still fix and restore their old configs. Note that the app
|
||||
still also writes .prev configs for extra security, though it no longer uses
|
||||
them for anything itself.
|
||||
- Converted more internal engine time values from milliseconds to microseconds,
|
||||
including things like the internal EventLoop timeline. Please holler if you
|
||||
notice anything running 1000x too fast or slow. In general my strategy going
|
||||
forward is to use microseconds for exact internal time values but to mostly
|
||||
expose float seconds to the user on the Python layer. There were starting to
|
||||
be a few cases were integer milliseconds was not enough precision for internal
|
||||
values. For instance, if we run with unclamped framerates and hit several
|
||||
hundred FPS, milliseconds per frame would drop to 0 which could cause
|
||||
problems. Note that scenev1 will be remaining on milliseconds internally for
|
||||
compatibility reasons. Scenev2 should move to microseconds though.
|
||||
|
||||
### 1.7.27 (build 21282, api 8, 2023-08-30)
|
||||
|
||||
|
||||
@ -441,6 +441,7 @@ set(BALLISTICA_SOURCES
|
||||
${BA_SRC_ROOT}/ballistica/base/support/classic_soft.h
|
||||
${BA_SRC_ROOT}/ballistica/base/support/context.cc
|
||||
${BA_SRC_ROOT}/ballistica/base/support/context.h
|
||||
${BA_SRC_ROOT}/ballistica/base/support/display_timer.h
|
||||
${BA_SRC_ROOT}/ballistica/base/support/huffman.cc
|
||||
${BA_SRC_ROOT}/ballistica/base/support/huffman.h
|
||||
${BA_SRC_ROOT}/ballistica/base/support/plus_soft.h
|
||||
|
||||
@ -433,6 +433,7 @@
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\classic_soft.h" />
|
||||
<ClCompile Include="..\..\src\ballistica\base\support\context.cc" />
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\context.h" />
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\display_timer.h" />
|
||||
<ClCompile Include="..\..\src\ballistica\base\support\huffman.cc" />
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\huffman.h" />
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\plus_soft.h" />
|
||||
|
||||
@ -733,6 +733,9 @@
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\context.h">
|
||||
<Filter>ballistica\base\support</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\display_timer.h">
|
||||
<Filter>ballistica\base\support</Filter>
|
||||
</ClInclude>
|
||||
<ClCompile Include="..\..\src\ballistica\base\support\huffman.cc">
|
||||
<Filter>ballistica\base\support</Filter>
|
||||
</ClCompile>
|
||||
|
||||
@ -428,6 +428,7 @@
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\classic_soft.h" />
|
||||
<ClCompile Include="..\..\src\ballistica\base\support\context.cc" />
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\context.h" />
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\display_timer.h" />
|
||||
<ClCompile Include="..\..\src\ballistica\base\support\huffman.cc" />
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\huffman.h" />
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\plus_soft.h" />
|
||||
|
||||
@ -733,6 +733,9 @@
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\context.h">
|
||||
<Filter>ballistica\base\support</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\ballistica\base\support\display_timer.h">
|
||||
<Filter>ballistica\base\support</Filter>
|
||||
</ClInclude>
|
||||
<ClCompile Include="..\..\src\ballistica\base\support\huffman.cc">
|
||||
<Filter>ballistica\base\support</Filter>
|
||||
</ClCompile>
|
||||
|
||||
@ -52,7 +52,7 @@ if TYPE_CHECKING:
|
||||
|
||||
# Build number and version of the ballistica binary we expect to be
|
||||
# using.
|
||||
TARGET_BALLISTICA_BUILD = 21528
|
||||
TARGET_BALLISTICA_BUILD = 21531
|
||||
TARGET_BALLISTICA_VERSION = '1.7.28'
|
||||
|
||||
|
||||
|
||||
@ -25,7 +25,7 @@ void AssetsServer::OnAppStartInThread() {
|
||||
// Ask our thread to give us periodic processing time (close to but
|
||||
// not *exactly* one second; try to avoid aliasing with similar updates).
|
||||
process_timer_ = event_loop()->NewTimer(
|
||||
987, true, NewLambdaRunnable([this] { Process(); }).Get());
|
||||
987 * 1000, true, NewLambdaRunnable([this] { Process(); }).Get());
|
||||
}
|
||||
|
||||
void AssetsServer::PushPendingPreload(Object::Ref<Asset>* asset_ref_ptr) {
|
||||
@ -258,7 +258,7 @@ void AssetsServer::Process() {
|
||||
// we're writing a replay.. otherwise just sleep indefinitely.
|
||||
if (pending_preloads_.empty() && pending_preloads_audio_.empty()) {
|
||||
if (writing_replay_) {
|
||||
process_timer_->SetLength(1000);
|
||||
process_timer_->SetLength(1000 * 1000);
|
||||
} else {
|
||||
process_timer_->SetLength(-1);
|
||||
}
|
||||
|
||||
@ -32,9 +32,9 @@ LPALCDEVICEPAUSESOFT alcDevicePauseSOFT;
|
||||
LPALCDEVICERESUMESOFT alcDeviceResumeSOFT;
|
||||
#endif
|
||||
|
||||
const int kAudioProcessIntervalNormal{500};
|
||||
const int kAudioProcessIntervalFade{50};
|
||||
const int kAudioProcessIntervalPendingLoad{1};
|
||||
const int kAudioProcessIntervalNormal{500 * 1000};
|
||||
const int kAudioProcessIntervalFade{50 * 1000};
|
||||
const int kAudioProcessIntervalPendingLoad{1 * 1000};
|
||||
|
||||
#if BA_DEBUG_BUILD || BA_TEST_BUILD
|
||||
const bool kShowInUseSounds{};
|
||||
|
||||
@ -53,6 +53,7 @@ class ClassicSoftInterface;
|
||||
class CollisionMeshAsset;
|
||||
class CollisionCache;
|
||||
class DevConsole;
|
||||
class DisplayTimer;
|
||||
class Context;
|
||||
class ContextRef;
|
||||
class DataAsset;
|
||||
|
||||
@ -23,8 +23,7 @@ const float kPanMax = 9.0f;
|
||||
const float kPanMin = -9.0f;
|
||||
|
||||
Camera::Camera()
|
||||
: last_mode_set_time_(g_core->GetAppTimeMillisecs()),
|
||||
lock_panning_(g_core->IsVRMode()),
|
||||
: lock_panning_(g_core->IsVRMode()),
|
||||
pan_speed_scale_(g_core->IsVRMode() ? 0.3f : 1.0f) {}
|
||||
|
||||
Camera::~Camera() = default;
|
||||
@ -607,7 +606,8 @@ void Camera::Update(millisecs_t elapsed) {
|
||||
float damping = 0.006f;
|
||||
float damping2 = 0.006f;
|
||||
float xy_blend_speed = 0.0002f;
|
||||
millisecs_t real_time = g_core->GetAppTimeMillisecs();
|
||||
time_ += elapsed;
|
||||
// millisecs_t real_time = g_core->GetAppTimeMillisecs();
|
||||
|
||||
// Prevent camera "explosions" if we've been unable to update for a while.
|
||||
elapsed = std::min(millisecs_t{100}, elapsed);
|
||||
@ -653,18 +653,18 @@ void Camera::Update(millisecs_t elapsed) {
|
||||
}
|
||||
|
||||
if (!g_core->IsVRMode()) {
|
||||
smooth_speed_.x += elapsedf * rand_component
|
||||
* (-0.5f
|
||||
+ Utils::precalc_rand_1((real_time / rand_incr_1)
|
||||
% kPrecalcRandsCount));
|
||||
smooth_speed_.y += elapsedf * rand_component
|
||||
* (-0.5f
|
||||
+ Utils::precalc_rand_2((real_time / rand_incr_2)
|
||||
% kPrecalcRandsCount));
|
||||
smooth_speed_.z += elapsedf * rand_component
|
||||
* (-0.5f
|
||||
+ Utils::precalc_rand_3((real_time / rand_incr_3)
|
||||
% kPrecalcRandsCount));
|
||||
smooth_speed_.x +=
|
||||
elapsedf * rand_component
|
||||
* (-0.5f
|
||||
+ Utils::precalc_rand_1((time_ / rand_incr_1) % kPrecalcRandsCount));
|
||||
smooth_speed_.y +=
|
||||
elapsedf * rand_component
|
||||
* (-0.5f
|
||||
+ Utils::precalc_rand_2((time_ / rand_incr_2) % kPrecalcRandsCount));
|
||||
smooth_speed_.z +=
|
||||
elapsedf * rand_component
|
||||
* (-0.5f
|
||||
+ Utils::precalc_rand_3((time_ / rand_incr_3) % kPrecalcRandsCount));
|
||||
}
|
||||
|
||||
if (RandomFloat() < 0.1f && !g_core->IsVRMode()) {
|
||||
@ -714,15 +714,14 @@ void Camera::Update(millisecs_t elapsed) {
|
||||
shake_vel_.x +=
|
||||
0.05f * shake_amount_
|
||||
* (0.5f
|
||||
- Utils::precalc_rand_1(real_time % 122 * i % kPrecalcRandsCount));
|
||||
- Utils::precalc_rand_1(time_ % 122 * i % kPrecalcRandsCount));
|
||||
shake_vel_.y +=
|
||||
0.05f * shake_amount_
|
||||
* (0.5f
|
||||
- Utils::precalc_rand_2(real_time % 323 * i % kPrecalcRandsCount));
|
||||
- Utils::precalc_rand_2(time_ % 323 * i % kPrecalcRandsCount));
|
||||
shake_vel_.z +=
|
||||
0.05f * shake_amount_
|
||||
* (0.5f
|
||||
- Utils::precalc_rand_3(real_time % 76 * i % kPrecalcRandsCount));
|
||||
* (0.5f - Utils::precalc_rand_3(time_ % 76 * i % kPrecalcRandsCount));
|
||||
}
|
||||
|
||||
for (int j = 0; j < iterations; j++) {
|
||||
@ -740,8 +739,8 @@ void Camera::Update(millisecs_t elapsed) {
|
||||
uint32_t interval = g_core->IsVRMode() ? 50 : 100;
|
||||
|
||||
// Occasionally, update microphone position for audio.
|
||||
if (real_time - last_listener_update_time_ > interval) {
|
||||
last_listener_update_time_ = real_time;
|
||||
if (time_ - last_listener_update_time_ > interval) {
|
||||
last_listener_update_time_ = time_;
|
||||
bool do_regular_update = true;
|
||||
if (g_core->IsVRMode()) {
|
||||
#if BA_VR_MODE
|
||||
@ -891,7 +890,8 @@ void Camera::SetMode(CameraMode m) {
|
||||
if (mode_ != m) {
|
||||
mode_ = m;
|
||||
smooth_next_frame_ = false;
|
||||
last_mode_set_time_ = g_core->GetAppTimeMillisecs();
|
||||
// last_mode_set_time_ = g_core->GetAppTimeMillisecs();
|
||||
// last_mode_set_time_ = time_;
|
||||
heading_ = kInitialHeading;
|
||||
}
|
||||
}
|
||||
|
||||
@ -92,37 +92,51 @@ class Camera : public Object {
|
||||
void set_pan_speed_scale(float val) { pan_speed_scale_ = val; }
|
||||
|
||||
private:
|
||||
float pan_speed_scale_{1.0f};
|
||||
bool lock_panning_{};
|
||||
Vector3f vr_offset_{0.0f, 0.0f, 0.0f};
|
||||
Vector3f vr_extra_offset_{0.0f, 0.0f, 0.0f};
|
||||
Vector3f vr_offset_smooth_{0.0f, 0.0f, 0.0f};
|
||||
millisecs_t last_mode_set_time_{};
|
||||
std::list<AreaOfInterest> areas_of_interest_;
|
||||
CameraMode mode_{CameraMode::kFollow};
|
||||
bool manual_{};
|
||||
bool smooth_next_frame_{};
|
||||
bool have_real_areas_of_interest_{};
|
||||
bool manual_ : 1 {};
|
||||
bool smooth_next_frame_ : 1 {};
|
||||
bool have_real_areas_of_interest_ : 1 {};
|
||||
bool lock_panning_ : 1 {};
|
||||
|
||||
// Manual stuff.
|
||||
bool panning_{};
|
||||
bool orbiting_{};
|
||||
bool rolling_{};
|
||||
bool trucking_{};
|
||||
bool alt_down_{};
|
||||
bool cmd_down_{};
|
||||
bool ctrl_down_{};
|
||||
bool mouse_left_down_{};
|
||||
bool mouse_middle_down_{};
|
||||
bool mouse_right_down_{};
|
||||
bool panning_ : 1 {};
|
||||
bool orbiting_ : 1 {};
|
||||
bool rolling_ : 1 {};
|
||||
bool trucking_ : 1 {};
|
||||
bool alt_down_ : 1 {};
|
||||
bool cmd_down_ : 1 {};
|
||||
bool ctrl_down_ : 1 {};
|
||||
bool mouse_left_down_ : 1 {};
|
||||
bool mouse_middle_down_ : 1 {};
|
||||
bool mouse_right_down_ : 1 {};
|
||||
|
||||
bool happy_thoughts_mode_ : 1 {};
|
||||
bool x_constrained_ : 1 {true};
|
||||
float pan_speed_scale_{1.0f};
|
||||
float heading_{kInitialHeading};
|
||||
Vector3f extra_pos_{0.0f, 0.0f, 0.0f};
|
||||
Vector3f extra_pos_2_{0.0f, 0.0f, 0.0f};
|
||||
float area_of_interest_bounds_[6]{-9999, -9999, -9999, 9999, 9999, 9999};
|
||||
float pan_pos_{};
|
||||
float pan_speed_{};
|
||||
float pan_target_{};
|
||||
float shake_amount_{};
|
||||
float target_radius_{2.0f};
|
||||
float target_radius_smoothed_{2.0f};
|
||||
float field_of_view_x_{5.0f};
|
||||
float field_of_view_y_{kCameraFOVY};
|
||||
float field_of_view_x_smoothed_{1.0f};
|
||||
float field_of_view_y_smoothed_{1.0f};
|
||||
float min_target_radius_{5.0f};
|
||||
float area_of_interest_near_{1.0f};
|
||||
float area_of_interest_far_{2.0f};
|
||||
float xy_constrain_blend_{0.5f};
|
||||
// millisecs_t last_mode_set_time_{};
|
||||
millisecs_t last_listener_update_time_{};
|
||||
millisecs_t time_{};
|
||||
Vector3f vr_offset_{0.0f, 0.0f, 0.0f};
|
||||
Vector3f vr_extra_offset_{0.0f, 0.0f, 0.0f};
|
||||
Vector3f vr_offset_smooth_{0.0f, 0.0f, 0.0f};
|
||||
Vector3f extra_pos_{0.0f, 0.0f, 0.0f};
|
||||
Vector3f extra_pos_2_{0.0f, 0.0f, 0.0f};
|
||||
Vector3f shake_pos_{0.0f, 0.0f, 0.0f};
|
||||
Vector3f shake_vel_{0.0f, 0.0f, 0.0f};
|
||||
Vector3f position_{0.0f, 1.0f, -1.0f};
|
||||
@ -131,20 +145,8 @@ class Camera : public Object {
|
||||
Vector3f position_offset_smoothed_{0.0f, 0.0f, 0.0f};
|
||||
Vector3f smooth_speed_{0.0f, 0.0f, 0.0f};
|
||||
Vector3f smooth_speed_2_{0.0f, 0.0f, 0.0f};
|
||||
float target_radius_{2.0f};
|
||||
float target_radius_smoothed_{2.0f};
|
||||
float field_of_view_x_{5.0f};
|
||||
float field_of_view_y_{kCameraFOVY};
|
||||
float field_of_view_x_smoothed_{1.0f};
|
||||
float field_of_view_y_smoothed_{1.0f};
|
||||
millisecs_t last_listener_update_time_{};
|
||||
bool happy_thoughts_mode_{};
|
||||
float min_target_radius_{5.0f};
|
||||
Vector3f up_{0.0f, 1.0f, 0.0f};
|
||||
float area_of_interest_near_{1.0f};
|
||||
float area_of_interest_far_{2.0f};
|
||||
bool x_constrained_{true};
|
||||
float xy_constrain_blend_{0.5f};
|
||||
std::list<AreaOfInterest> areas_of_interest_;
|
||||
std::vector<Vector3f> area_of_interest_points_{{0.0f, 0.0f, 0.0f}};
|
||||
};
|
||||
|
||||
|
||||
@ -244,7 +244,8 @@ void Input::ShowStandardInputDeviceConnectedMessage_(InputDevice* j) {
|
||||
g_base->logic->DeleteAppTimer(connect_print_timer_id_);
|
||||
}
|
||||
connect_print_timer_id_ = g_base->logic->NewAppTimer(
|
||||
500, false, NewLambdaRunnable([this] { AnnounceConnects_(); }).Get());
|
||||
500 * 1000, false,
|
||||
NewLambdaRunnable([this] { AnnounceConnects_(); }).Get());
|
||||
}
|
||||
|
||||
void Input::ShowStandardInputDeviceDisconnectedMessage_(InputDevice* j) {
|
||||
@ -259,7 +260,8 @@ void Input::ShowStandardInputDeviceDisconnectedMessage_(InputDevice* j) {
|
||||
g_base->logic->DeleteAppTimer(disconnect_print_timer_id_);
|
||||
}
|
||||
disconnect_print_timer_id_ = g_base->logic->NewAppTimer(
|
||||
250, false, NewLambdaRunnable([this] { AnnounceDisconnects_(); }).Get());
|
||||
250 * 1000, false,
|
||||
NewLambdaRunnable([this] { AnnounceDisconnects_(); }).Get());
|
||||
}
|
||||
|
||||
void Input::PushAddInputDeviceCall(InputDevice* input_device,
|
||||
|
||||
@ -99,7 +99,7 @@ void Logic::OnGraphicsReady() {
|
||||
// Anyone dealing in display-time should be able to handle a wide
|
||||
// variety of rates anyway. NOTE: This length is currently milliseconds.
|
||||
headless_display_time_step_timer_ = event_loop()->NewTimer(
|
||||
kHeadlessMinDisplayTimeStep / 1000, true,
|
||||
kHeadlessMinDisplayTimeStep, true,
|
||||
NewLambdaRunnable([this] { StepDisplayTime_(); }).Get());
|
||||
} else {
|
||||
// In gui mode, push an initial frame to the graphics server. From this
|
||||
@ -134,8 +134,9 @@ void Logic::CompleteAppBootstrapping_() {
|
||||
// Set up our timers.
|
||||
process_pending_work_timer_ = event_loop()->NewTimer(
|
||||
0, true, NewLambdaRunnable([this] { ProcessPendingWork_(); }).Get());
|
||||
asset_prune_timer_ = event_loop()->NewTimer(
|
||||
2345, true, NewLambdaRunnable([] { g_base->assets->Prune(); }).Get());
|
||||
// asset_prune_timer_ = event_loop()->NewTimer(
|
||||
// 2345 * 1000, true, NewLambdaRunnable([] { g_base->assets->Prune();
|
||||
// }).Get());
|
||||
|
||||
// Let our initial dummy app-mode know it has become active.
|
||||
g_base->app_mode()->OnActivate();
|
||||
@ -381,9 +382,7 @@ void Logic::OnAppModeChanged() {
|
||||
"Resetting headless display step timer due to app-mode change.");
|
||||
}
|
||||
assert(headless_display_time_step_timer_);
|
||||
// NOTE: This is currently milliseconds.
|
||||
headless_display_time_step_timer_->SetLength(kHeadlessMinDisplayTimeStep
|
||||
/ 1000);
|
||||
headless_display_time_step_timer_->SetLength(kHeadlessMinDisplayTimeStep);
|
||||
}
|
||||
}
|
||||
|
||||
@ -439,8 +438,8 @@ void Logic::PostUpdateDisplayTimeForHeadlessMode_() {
|
||||
Log(LogLevel::kDebug, buffer);
|
||||
}
|
||||
|
||||
auto sleep_millisecs = headless_display_step_microsecs / 1000;
|
||||
headless_display_time_step_timer_->SetLength(sleep_millisecs);
|
||||
auto sleep_microsecs = headless_display_step_microsecs;
|
||||
headless_display_time_step_timer_->SetLength(sleep_microsecs);
|
||||
}
|
||||
|
||||
void Logic::UpdateDisplayTimeForFrameDraw_() {
|
||||
@ -581,7 +580,7 @@ void Logic::UpdatePendingWorkTimer_() {
|
||||
// If there's loading to do, keep at it rather vigorously.
|
||||
if (have_pending_loads_) {
|
||||
assert(process_pending_work_timer_);
|
||||
process_pending_work_timer_->SetLength(1);
|
||||
process_pending_work_timer_->SetLength(1000);
|
||||
} else {
|
||||
// Otherwise we've got nothing to do; go to sleep until something
|
||||
// changes.
|
||||
@ -635,7 +634,7 @@ void Logic::NotifyOfPendingAssetLoads() {
|
||||
UpdatePendingWorkTimer_();
|
||||
}
|
||||
|
||||
auto Logic::NewAppTimer(millisecs_t length, bool repeat, Runnable* runnable)
|
||||
auto Logic::NewAppTimer(microsecs_t length, bool repeat, Runnable* runnable)
|
||||
-> int {
|
||||
// App-Timers simply get injected into our loop and run alongside our own
|
||||
// stuff.
|
||||
@ -649,7 +648,7 @@ void Logic::DeleteAppTimer(int timer_id) {
|
||||
event_loop()->DeleteTimer(timer_id);
|
||||
}
|
||||
|
||||
void Logic::SetAppTimerLength(int timer_id, millisecs_t length) {
|
||||
void Logic::SetAppTimerLength(int timer_id, microsecs_t length) {
|
||||
assert(g_base->InLogicThread());
|
||||
Timer* t = event_loop()->GetTimer(timer_id);
|
||||
if (t) {
|
||||
@ -660,14 +659,14 @@ void Logic::SetAppTimerLength(int timer_id, millisecs_t length) {
|
||||
}
|
||||
}
|
||||
|
||||
auto Logic::NewDisplayTimer(microsecs_t length, bool repeat,
|
||||
const Object::Ref<Runnable>& runnable) -> int {
|
||||
auto Logic::NewDisplayTimer(microsecs_t length, bool repeat, Runnable* runnable)
|
||||
-> int {
|
||||
// Display-Timers go into a timer-list that we exec explicitly when we
|
||||
// step display-time.
|
||||
assert(g_base->InLogicThread());
|
||||
int offset = 0;
|
||||
Timer* t = display_timers_->NewTimer(g_core->GetAppTimeMicrosecs(), length,
|
||||
offset, repeat ? -1 : 0, runnable.Get());
|
||||
Timer* t = display_timers_->NewTimer(display_time_microsecs_, length, offset,
|
||||
repeat ? -1 : 0, runnable);
|
||||
return t->id();
|
||||
}
|
||||
|
||||
|
||||
@ -89,12 +89,12 @@ class Logic {
|
||||
void HandleInterruptSignal();
|
||||
void HandleTerminateSignal();
|
||||
|
||||
auto NewAppTimer(millisecs_t length, bool repeat, Runnable* runnable) -> int;
|
||||
auto NewAppTimer(microsecs_t length, bool repeat, Runnable* runnable) -> int;
|
||||
void DeleteAppTimer(int timer_id);
|
||||
void SetAppTimerLength(int timer_id, millisecs_t length);
|
||||
void SetAppTimerLength(int timer_id, microsecs_t length);
|
||||
|
||||
auto NewDisplayTimer(microsecs_t length, bool repeat,
|
||||
const Object::Ref<Runnable>& runnable) -> int;
|
||||
auto NewDisplayTimer(microsecs_t length, bool repeat, Runnable* runnable)
|
||||
-> int;
|
||||
void DeleteDisplayTimer(int timer_id);
|
||||
void SetDisplayTimerLength(int timer_id, microsecs_t length);
|
||||
|
||||
@ -148,8 +148,6 @@ class Logic {
|
||||
bool shutdown_completed_ : 1 {};
|
||||
bool graphics_ready_ : 1 {};
|
||||
Timer* process_pending_work_timer_{};
|
||||
Timer* asset_prune_timer_{};
|
||||
Timer* debug_timer_{};
|
||||
EventLoop* event_loop_{};
|
||||
std::unique_ptr<TimerList> display_timers_;
|
||||
};
|
||||
|
||||
@ -94,7 +94,7 @@ auto PythonClassAppTimer::tp_new(PyTypeObject* type, PyObject* args,
|
||||
auto runnable(Object::New<Runnable, PythonContextCallRunnable>(call_obj));
|
||||
|
||||
self->timer_id_ = g_base->logic->NewAppTimer(
|
||||
static_cast<millisecs_t>(length * 1000.0), repeat,
|
||||
static_cast<microsecs_t>(length * 1000000.0), repeat,
|
||||
Object::New<Runnable, PythonContextCallRunnable>(call_obj).Get());
|
||||
|
||||
self->have_timer_ = true;
|
||||
|
||||
@ -104,7 +104,7 @@ auto PythonClassDisplayTimer::tp_new(PyTypeObject* type, PyObject* args,
|
||||
}
|
||||
self->timer_id_ = g_base->logic->NewDisplayTimer(
|
||||
static_cast<microsecs_t>(length * 1000000.0), repeat,
|
||||
Object::New<Runnable, PythonContextCallRunnable>(call_obj));
|
||||
Object::New<Runnable, PythonContextCallRunnable>(call_obj).Get());
|
||||
|
||||
self->have_timer_ = true;
|
||||
|
||||
|
||||
@ -365,7 +365,7 @@ static auto PyAppTimer(PyObject* self, PyObject* args, PyObject* keywds)
|
||||
throw Exception("Timer length cannot be < 0.", PyExcType::kValue);
|
||||
}
|
||||
g_base->logic->NewAppTimer(
|
||||
static_cast<millisecs_t>(length * 1000.0), false,
|
||||
static_cast<microsecs_t>(length * 1000000.0), false,
|
||||
Object::New<Runnable, PythonContextCallRunnable>(call_obj).Get());
|
||||
Py_RETURN_NONE;
|
||||
BA_PYTHON_CATCH;
|
||||
@ -459,7 +459,7 @@ static auto PyDisplayTimer(PyObject* self, PyObject* args, PyObject* keywds)
|
||||
}
|
||||
g_base->logic->NewDisplayTimer(
|
||||
static_cast<microsecs_t>(length * 1000000.0), false,
|
||||
Object::New<Runnable, PythonContextCallRunnable>(call_obj));
|
||||
Object::New<Runnable, PythonContextCallRunnable>(call_obj).Get());
|
||||
Py_RETURN_NONE;
|
||||
BA_PYTHON_CATCH;
|
||||
}
|
||||
|
||||
@ -13,21 +13,22 @@ namespace ballistica::base {
|
||||
|
||||
class AppTimer : public Object {
|
||||
public:
|
||||
AppTimer(millisecs_t length, bool repeat, Runnable* runnable) {
|
||||
AppTimer(microsecs_t length, bool repeat, Runnable* runnable) {
|
||||
assert(g_base->InLogicThread());
|
||||
timer_id_ = base::g_base->logic->NewAppTimer(length, repeat, runnable);
|
||||
}
|
||||
|
||||
template <typename F>
|
||||
static auto New(millisecs_t length, bool repeat, const F& lambda) {
|
||||
static auto New(microsecs_t length, bool repeat, const F& lambda) {
|
||||
return Object::New<AppTimer>(length, repeat,
|
||||
NewLambdaRunnable<F>(lambda).Get());
|
||||
}
|
||||
|
||||
void SetLength(millisecs_t length) {
|
||||
void SetLength(microsecs_t length) {
|
||||
assert(g_base->InLogicThread());
|
||||
base::g_base->logic->SetAppTimerLength(timer_id_, length);
|
||||
}
|
||||
|
||||
~AppTimer() override {
|
||||
assert(g_base->InLogicThread());
|
||||
base::g_base->logic->DeleteAppTimer(timer_id_);
|
||||
|
||||
42
src/ballistica/base/support/display_timer.h
Normal file
42
src/ballistica/base/support/display_timer.h
Normal file
@ -0,0 +1,42 @@
|
||||
// Released under the MIT License. See LICENSE for details.
|
||||
|
||||
#ifndef BALLISTICA_BASE_SUPPORT_DISPLAY_TIMER_H_
|
||||
#define BALLISTICA_BASE_SUPPORT_DISPLAY_TIMER_H_
|
||||
|
||||
#include "ballistica/base/base.h"
|
||||
#include "ballistica/base/logic/logic.h"
|
||||
#include "ballistica/shared/ballistica.h"
|
||||
#include "ballistica/shared/foundation/object.h"
|
||||
#include "ballistica/shared/generic/lambda_runnable.h"
|
||||
|
||||
namespace ballistica::base {
|
||||
|
||||
class DisplayTimer : public Object {
|
||||
public:
|
||||
DisplayTimer(microsecs_t length, bool repeat, Runnable* runnable) {
|
||||
assert(g_base->InLogicThread());
|
||||
timer_id_ = base::g_base->logic->NewDisplayTimer(length, repeat, runnable);
|
||||
}
|
||||
|
||||
template <typename F>
|
||||
static auto New(microsecs_t length, bool repeat, const F& lambda) {
|
||||
return Object::New<DisplayTimer>(length, repeat,
|
||||
NewLambdaRunnable<F>(lambda).Get());
|
||||
}
|
||||
|
||||
void SetLength(microsecs_t length) {
|
||||
assert(g_base->InLogicThread());
|
||||
base::g_base->logic->SetDisplayTimerLength(timer_id_, length);
|
||||
}
|
||||
~DisplayTimer() override {
|
||||
assert(g_base->InLogicThread());
|
||||
base::g_base->logic->DeleteDisplayTimer(timer_id_);
|
||||
}
|
||||
|
||||
private:
|
||||
int timer_id_;
|
||||
};
|
||||
|
||||
} // namespace ballistica::base
|
||||
|
||||
#endif // BALLISTICA_BASE_SUPPORT_DISPLAY_TIMER_H_
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
#include "ballistica/base/support/repeater.h"
|
||||
|
||||
#include "ballistica/base/support/app_timer.h"
|
||||
#include "ballistica/base/support/display_timer.h"
|
||||
#include "ballistica/shared/foundation/event_loop.h"
|
||||
|
||||
namespace ballistica::base {
|
||||
@ -27,9 +27,9 @@ Repeater::Repeater(seconds_t initial_delay, seconds_t repeat_delay,
|
||||
return;
|
||||
}
|
||||
// Kick off our initial delay timer (generally the longer one).
|
||||
weak_this->timer_ = AppTimer::New(
|
||||
static_cast<millisecs_t>(weak_this->initial_delay_ * 1000.0), false,
|
||||
[weak_this] {
|
||||
weak_this->timer_ = DisplayTimer::New(
|
||||
static_cast<microsecs_t>(weak_this->initial_delay_ * 1000000.0),
|
||||
false, [weak_this] {
|
||||
// Timer should not have fired if we died.
|
||||
assert(weak_this.Exists());
|
||||
weak_this->runnable_->RunAndLogErrors();
|
||||
@ -38,8 +38,8 @@ Repeater::Repeater(seconds_t initial_delay, seconds_t repeat_delay,
|
||||
return;
|
||||
}
|
||||
// Kick off our repeat timer (generally the short one).
|
||||
weak_this->timer_ = AppTimer::New(
|
||||
static_cast<millisecs_t>(weak_this->repeat_delay_ * 1000.0),
|
||||
weak_this->timer_ = DisplayTimer::New(
|
||||
static_cast<microsecs_t>(weak_this->repeat_delay_ * 1000000.0),
|
||||
true, [weak_this] {
|
||||
// Timer should not have fired if we died.
|
||||
assert(weak_this.Exists());
|
||||
|
||||
@ -11,6 +11,7 @@ namespace ballistica::base {
|
||||
|
||||
/// Runs some code immediately and then repeatedly after a delay. Useful for
|
||||
/// jobs such as selecting ui elements while keys or buttons are held.
|
||||
/// Uses display-time so emphasizes visual smoothness over accuracy.
|
||||
class Repeater : public Object {
|
||||
public:
|
||||
Repeater(seconds_t initial_delay, seconds_t repeat_delay, Runnable* runnable);
|
||||
@ -26,7 +27,7 @@ class Repeater : public Object {
|
||||
private:
|
||||
seconds_t initial_delay_;
|
||||
seconds_t repeat_delay_;
|
||||
Object::Ref<AppTimer> timer_;
|
||||
Object::Ref<DisplayTimer> timer_;
|
||||
Object::Ref<Runnable> runnable_;
|
||||
};
|
||||
|
||||
|
||||
@ -85,8 +85,10 @@ static auto XOffs(DevConsoleHAnchor_ attach) -> float {
|
||||
}
|
||||
|
||||
static auto IsValidHungryChar_(uint32_t this_char) -> bool {
|
||||
// Include letters, numbers, and underscore.
|
||||
return ((this_char >= 65 && this_char <= 90)
|
||||
|| (this_char >= 97 && this_char <= 122));
|
||||
|| (this_char >= 97 && this_char <= 122)
|
||||
|| (this_char >= 48 && this_char <= 57) || this_char == '_');
|
||||
}
|
||||
|
||||
static void DrawRect(RenderPass* pass, Mesh* mesh, float bottom, float x,
|
||||
@ -722,7 +724,9 @@ auto DevConsole::HandleKeyPress(const SDL_Keysym* keysym) -> bool {
|
||||
bool do_history_up{};
|
||||
bool do_history_down{};
|
||||
bool do_backspace{};
|
||||
bool do_forward_delete{};
|
||||
bool do_hungry_backspace{};
|
||||
bool do_hungry_forward_delete{};
|
||||
bool do_move_to_end{};
|
||||
bool do_move_to_beginning{};
|
||||
bool do_kill_line{};
|
||||
@ -735,6 +739,20 @@ auto DevConsole::HandleKeyPress(const SDL_Keysym* keysym) -> bool {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SDLK_DELETE: {
|
||||
if (keysym->mod & KMOD_ALT) {
|
||||
do_hungry_forward_delete = true;
|
||||
} else {
|
||||
do_forward_delete = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SDLK_HOME:
|
||||
do_move_to_beginning = true;
|
||||
break;
|
||||
case SDLK_END:
|
||||
do_move_to_end = true;
|
||||
break;
|
||||
case SDLK_UP:
|
||||
do_history_up = true;
|
||||
break;
|
||||
@ -791,6 +809,13 @@ auto DevConsole::HandleKeyPress(const SDL_Keysym* keysym) -> bool {
|
||||
do_move_to_beginning = true;
|
||||
}
|
||||
break;
|
||||
case SDLK_d:
|
||||
if (keysym->mod & KMOD_CTRL) {
|
||||
do_forward_delete = true;
|
||||
} else if (keysym->mod & KMOD_ALT) {
|
||||
do_hungry_forward_delete = true;
|
||||
}
|
||||
break;
|
||||
case SDLK_e:
|
||||
if (keysym->mod & KMOD_CTRL) {
|
||||
do_move_to_end = true;
|
||||
@ -800,7 +825,6 @@ auto DevConsole::HandleKeyPress(const SDL_Keysym* keysym) -> bool {
|
||||
if (keysym->mod & KMOD_CTRL) {
|
||||
do_kill_line = true;
|
||||
}
|
||||
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
@ -851,15 +875,18 @@ auto DevConsole::HandleKeyPress(const SDL_Keysym* keysym) -> bool {
|
||||
carat_char_ -= 1;
|
||||
assert(CaratCharValid_());
|
||||
}
|
||||
input_string_ = Utils::UTF8FromUnicode(unichars);
|
||||
input_text_dirty_ = true;
|
||||
if (do_delete) {
|
||||
input_string_ = Utils::UTF8FromUnicode(unichars);
|
||||
input_text_dirty_ = true;
|
||||
}
|
||||
carat_dirty_ = true;
|
||||
});
|
||||
}
|
||||
if (do_hungry_carat_right) {
|
||||
if (do_hungry_forward_delete || do_hungry_carat_right) {
|
||||
auto do_delete = do_hungry_forward_delete;
|
||||
key_repeater_ = Repeater::New(
|
||||
g_base->app_adapter->GetKeyRepeatDelay(),
|
||||
g_base->app_adapter->GetKeyRepeatInterval(), [this] {
|
||||
g_base->app_adapter->GetKeyRepeatInterval(), [this, do_delete] {
|
||||
auto unichars = Utils::UnicodeFromUTF8(input_string_, "fjco38");
|
||||
bool found_valid{};
|
||||
// Move until we've found at least one valid char and the
|
||||
@ -874,9 +901,17 @@ auto DevConsole::HandleKeyPress(const SDL_Keysym* keysym) -> bool {
|
||||
if (is_valid) {
|
||||
found_valid = true;
|
||||
}
|
||||
carat_char_ += 1;
|
||||
if (do_delete) {
|
||||
unichars.erase(unichars.begin() + carat_char_);
|
||||
} else {
|
||||
carat_char_ += 1;
|
||||
}
|
||||
assert(CaratCharValid_());
|
||||
}
|
||||
if (do_delete) {
|
||||
input_string_ = Utils::UTF8FromUnicode(unichars);
|
||||
input_text_dirty_ = true;
|
||||
}
|
||||
carat_dirty_ = true;
|
||||
});
|
||||
}
|
||||
@ -896,6 +931,21 @@ auto DevConsole::HandleKeyPress(const SDL_Keysym* keysym) -> bool {
|
||||
}
|
||||
});
|
||||
}
|
||||
if (do_forward_delete) {
|
||||
key_repeater_ = Repeater::New(
|
||||
g_base->app_adapter->GetKeyRepeatDelay(),
|
||||
g_base->app_adapter->GetKeyRepeatInterval(), [this] {
|
||||
auto unichars = Utils::UnicodeFromUTF8(input_string_, "fjco33");
|
||||
if (!unichars.empty() && carat_char_ < unichars.size()) {
|
||||
assert(CaratCharValid_());
|
||||
unichars.erase(unichars.begin() + carat_char_);
|
||||
input_string_ = Utils::UTF8FromUnicode(unichars);
|
||||
input_text_dirty_ = true;
|
||||
carat_dirty_ = true; // Didn't move but might change size.
|
||||
assert(CaratCharValid_());
|
||||
}
|
||||
});
|
||||
}
|
||||
if (do_carat_left || do_carat_right) {
|
||||
key_repeater_ = Repeater::New(
|
||||
g_base->app_adapter->GetKeyRepeatDelay(),
|
||||
|
||||
@ -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 = 21528;
|
||||
const int kEngineBuildNumber = 21531;
|
||||
const char* kEngineVersion = "1.7.28";
|
||||
const int kEngineApiVersion = 8;
|
||||
|
||||
|
||||
@ -217,12 +217,12 @@ void EventLoop::WaitForNextEvent_(bool single_cycle) {
|
||||
// If we've got active timers, wait for messages with a timeout so we can
|
||||
// run the next timer payload.
|
||||
if (!suspended_ && timers_.ActiveTimerCount() > 0) {
|
||||
millisecs_t apptime = g_core->GetAppTimeMillisecs();
|
||||
millisecs_t wait_time = timers_.TimeToNextExpire(apptime);
|
||||
microsecs_t apptime = g_core->GetAppTimeMicrosecs();
|
||||
microsecs_t wait_time = timers_.TimeToNextExpire(apptime);
|
||||
if (wait_time > 0) {
|
||||
std::unique_lock<std::mutex> lock(thread_message_mutex_);
|
||||
if (thread_messages_.empty()) {
|
||||
thread_message_cv_.wait_for(lock, std::chrono::milliseconds(wait_time),
|
||||
thread_message_cv_.wait_for(lock, std::chrono::microseconds(wait_time),
|
||||
[this] {
|
||||
// Go back to sleep on spurious wakeups
|
||||
// if we didn't wind up with any new
|
||||
@ -298,8 +298,6 @@ void EventLoop::Run_(bool single_cycle) {
|
||||
assert(!suspended_);
|
||||
RunSuspendCallbacks_();
|
||||
suspended_ = true;
|
||||
last_suspend_time_ = g_core->GetAppTimeMillisecs();
|
||||
messages_since_suspended_ = 0;
|
||||
break;
|
||||
}
|
||||
case ThreadMessage_::Type::kUnsuspend: {
|
||||
@ -319,7 +317,7 @@ void EventLoop::Run_(bool single_cycle) {
|
||||
}
|
||||
|
||||
if (!suspended_) {
|
||||
timers_.Run(g_core->GetAppTimeMillisecs());
|
||||
timers_.Run(g_core->GetAppTimeMicrosecs());
|
||||
RunPendingRunnables_();
|
||||
}
|
||||
|
||||
@ -607,12 +605,12 @@ auto EventLoop::AreEventLoopsSuspended() -> bool {
|
||||
return g_core->event_loops_suspended;
|
||||
}
|
||||
|
||||
auto EventLoop::NewTimer(millisecs_t length, bool repeat, Runnable* runnable)
|
||||
auto EventLoop::NewTimer(microsecs_t length, bool repeat, Runnable* runnable)
|
||||
-> Timer* {
|
||||
assert(g_core);
|
||||
assert(ThreadIsCurrent());
|
||||
assert(Object::IsValidManagedObject(runnable));
|
||||
return timers_.NewTimer(g_core->GetAppTimeMillisecs(), length, 0,
|
||||
return timers_.NewTimer(g_core->GetAppTimeMicrosecs(), length, 0,
|
||||
repeat ? -1 : 0, runnable);
|
||||
}
|
||||
|
||||
@ -774,8 +772,8 @@ auto EventLoop::CheckPushRunnableSafety_() -> bool {
|
||||
void EventLoop::AcquireGIL_() {
|
||||
assert(g_base_soft && g_base_soft->InLogicThread());
|
||||
auto debug_timing{g_core->core_config().debug_timing};
|
||||
millisecs_t startms{debug_timing ? core::CorePlatform::GetCurrentMillisecs()
|
||||
: 0};
|
||||
millisecs_t startmillisecs{
|
||||
debug_timing ? core::CorePlatform::GetCurrentMillisecs() : 0};
|
||||
|
||||
if (py_thread_state_) {
|
||||
PyEval_RestoreThread(py_thread_state_);
|
||||
@ -783,10 +781,10 @@ void EventLoop::AcquireGIL_() {
|
||||
}
|
||||
|
||||
if (debug_timing) {
|
||||
auto duration{core::CorePlatform::GetCurrentMillisecs() - startms};
|
||||
auto duration{core::CorePlatform::GetCurrentMillisecs() - startmillisecs};
|
||||
if (duration > (1000 / 120)) {
|
||||
Log(LogLevel::kInfo,
|
||||
"GIL acquire took too long (" + std::to_string(duration) + " ms).");
|
||||
Log(LogLevel::kInfo, "GIL acquire took too long ("
|
||||
+ std::to_string(duration) + " millisecs).");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -45,21 +45,17 @@ class EventLoop {
|
||||
|
||||
auto thread_id() const -> std::thread::id { return thread_id_; }
|
||||
|
||||
// Needed in rare cases where we jump physical threads.
|
||||
// (Our 'main' thread on Android can switch under us as
|
||||
// rendering contexts are recreated in new threads/etc.)
|
||||
// void set_thread_id(std::thread::id id) { thread_id_ = id; }
|
||||
|
||||
void RunToCompletion();
|
||||
void RunSingleCycle();
|
||||
|
||||
auto identifier() const -> EventLoopID { return identifier_; }
|
||||
|
||||
// Register a timer to run on the thread.
|
||||
auto NewTimer(millisecs_t length, bool repeat, Runnable* runnable) -> Timer*;
|
||||
/// Register a timer to run on the thread.
|
||||
auto NewTimer(microsecs_t length, bool repeat, Runnable* runnable) -> Timer*;
|
||||
|
||||
Timer* GetTimer(int id);
|
||||
void DeleteTimer(int id);
|
||||
|
||||
/// Add a runnable to this thread's event-loop.
|
||||
/// Pass a Runnable that has been allocated with NewUnmanaged().
|
||||
/// It will be owned and disposed of by the thread.
|
||||
@ -160,26 +156,21 @@ class EventLoop {
|
||||
void* auto_release_pool_{};
|
||||
#endif
|
||||
|
||||
bool bootstrapped_{};
|
||||
bool writing_tally_{};
|
||||
bool suspended_{};
|
||||
bool done_{};
|
||||
bool acquires_python_gil_{};
|
||||
EventLoopID identifier_{EventLoopID::kInvalid};
|
||||
millisecs_t last_suspend_time_{};
|
||||
int listen_sd_{};
|
||||
int messages_since_suspended_{};
|
||||
millisecs_t last_suspended_message_report_time_{};
|
||||
millisecs_t last_complaint_time_{};
|
||||
ThreadSource source_;
|
||||
ThreadSource source_{};
|
||||
bool bootstrapped_ : 1 {};
|
||||
bool writing_tally_ : 1 {};
|
||||
bool suspended_ : 1 {};
|
||||
bool done_ : 1 {};
|
||||
bool acquires_python_gil_ : 1 {};
|
||||
std::thread::id thread_id_{};
|
||||
std::condition_variable thread_message_cv_;
|
||||
std::condition_variable client_listener_cv_;
|
||||
std::list<std::pair<Runnable*, bool*>> runnables_;
|
||||
std::list<Runnable*> suspend_callbacks_;
|
||||
std::list<Runnable*> unsuspend_callbacks_;
|
||||
std::condition_variable thread_message_cv_;
|
||||
std::condition_variable client_listener_cv_;
|
||||
std::mutex thread_message_mutex_;
|
||||
std::list<ThreadMessage_> thread_messages_;
|
||||
std::mutex thread_message_mutex_;
|
||||
std::mutex client_listener_mutex_;
|
||||
std::list<std::vector<char>> data_to_client_;
|
||||
PyThreadState* py_thread_state_{};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user