mirror of
https://github.com/RYDE-WORK/ballistica.git
synced 2026-01-19 13:25:31 +08:00
getting android put back together
This commit is contained in:
parent
caf1917714
commit
2cc67956ac
@ -37,3 +37,8 @@ indent_style = space
|
|||||||
indent_size = 2
|
indent_size = 2
|
||||||
max_line_length = 80
|
max_line_length = 80
|
||||||
|
|
||||||
|
# Java overrides.
|
||||||
|
[*.{java}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
max_line_length = 80
|
||||||
|
|||||||
156
.efrocachemap
generated
156
.efrocachemap
generated
@ -421,10 +421,10 @@
|
|||||||
"build/assets/ba_data/audio/zoeOw.ogg": "74befe45a8417e95b6a2233c51992a26",
|
"build/assets/ba_data/audio/zoeOw.ogg": "74befe45a8417e95b6a2233c51992a26",
|
||||||
"build/assets/ba_data/audio/zoePickup01.ogg": "48ab8cddfcde36a750856f3f81dd20c8",
|
"build/assets/ba_data/audio/zoePickup01.ogg": "48ab8cddfcde36a750856f3f81dd20c8",
|
||||||
"build/assets/ba_data/audio/zoeScream01.ogg": "2b468aedfa8741090247f04eb9e6df55",
|
"build/assets/ba_data/audio/zoeScream01.ogg": "2b468aedfa8741090247f04eb9e6df55",
|
||||||
"build/assets/ba_data/data/langdata.json": "229f9ecdddd777a0be2471979a0a01d6",
|
"build/assets/ba_data/data/langdata.json": "c6f94f9c1dc833c537d16672d9018b94",
|
||||||
"build/assets/ba_data/data/languages/arabic.json": "e0001d8542c904bc3c98a174f256efd9",
|
"build/assets/ba_data/data/languages/arabic.json": "00ba700de6c672a56658a6bd1ad27523",
|
||||||
"build/assets/ba_data/data/languages/belarussian.json": "7fe38341815ca6ff4d95224196e7a67e",
|
"build/assets/ba_data/data/languages/belarussian.json": "7fe38341815ca6ff4d95224196e7a67e",
|
||||||
"build/assets/ba_data/data/languages/chinese.json": "4e2f4f1f38216940953fcbee4da1563e",
|
"build/assets/ba_data/data/languages/chinese.json": "5761468d25f2bd4e79921826cebd572b",
|
||||||
"build/assets/ba_data/data/languages/chinesetraditional.json": "f858da49be0a5374157c627857751078",
|
"build/assets/ba_data/data/languages/chinesetraditional.json": "f858da49be0a5374157c627857751078",
|
||||||
"build/assets/ba_data/data/languages/croatian.json": "766532c67af5bd0144c2d63cab0516fa",
|
"build/assets/ba_data/data/languages/croatian.json": "766532c67af5bd0144c2d63cab0516fa",
|
||||||
"build/assets/ba_data/data/languages/czech.json": "93c5fe0d884d95435da6c675f64e30e0",
|
"build/assets/ba_data/data/languages/czech.json": "93c5fe0d884d95435da6c675f64e30e0",
|
||||||
@ -439,11 +439,11 @@
|
|||||||
"build/assets/ba_data/data/languages/greek.json": "287c0ec437b38772284ef9d3e4fb2fc3",
|
"build/assets/ba_data/data/languages/greek.json": "287c0ec437b38772284ef9d3e4fb2fc3",
|
||||||
"build/assets/ba_data/data/languages/hindi.json": "8848f6b0caec0fcf9d85bc6e683809ec",
|
"build/assets/ba_data/data/languages/hindi.json": "8848f6b0caec0fcf9d85bc6e683809ec",
|
||||||
"build/assets/ba_data/data/languages/hungarian.json": "796a290a8c44a1e7635208c2ff5fdc6e",
|
"build/assets/ba_data/data/languages/hungarian.json": "796a290a8c44a1e7635208c2ff5fdc6e",
|
||||||
"build/assets/ba_data/data/languages/indonesian.json": "97657eb2ab75d821045387b6d7a2b52d",
|
"build/assets/ba_data/data/languages/indonesian.json": "408fb026e84c24a8dd7a43cb2b794541",
|
||||||
"build/assets/ba_data/data/languages/italian.json": "cda5760f247500657722c279bc2f2bc7",
|
"build/assets/ba_data/data/languages/italian.json": "f2f5641bc924dfba37af2aac03e469e0",
|
||||||
"build/assets/ba_data/data/languages/korean.json": "ca1122a9ee551da3f75ae632012bd0e2",
|
"build/assets/ba_data/data/languages/korean.json": "ae179765711bead59d0de7fb15fac72f",
|
||||||
"build/assets/ba_data/data/languages/malay.json": "832562ce997fc70704b9234c95fb2e38",
|
"build/assets/ba_data/data/languages/malay.json": "832562ce997fc70704b9234c95fb2e38",
|
||||||
"build/assets/ba_data/data/languages/persian.json": "4f448b29ba04f2b789329600cb7f9ab7",
|
"build/assets/ba_data/data/languages/persian.json": "d742f4a6d3c3555031102b21abdcbb5b",
|
||||||
"build/assets/ba_data/data/languages/polish.json": "b9a58b70ed5e99d8b7fa2392b2eb0cda",
|
"build/assets/ba_data/data/languages/polish.json": "b9a58b70ed5e99d8b7fa2392b2eb0cda",
|
||||||
"build/assets/ba_data/data/languages/portuguese.json": "556af4e8170356ad239412e1743e20d5",
|
"build/assets/ba_data/data/languages/portuguese.json": "556af4e8170356ad239412e1743e20d5",
|
||||||
"build/assets/ba_data/data/languages/romanian.json": "aeebdd54f65939c2facc6ac50c117826",
|
"build/assets/ba_data/data/languages/romanian.json": "aeebdd54f65939c2facc6ac50c117826",
|
||||||
@ -946,11 +946,11 @@
|
|||||||
"build/assets/ba_data/meshes/zoeUpperArm.bob": "a8a881010ac1ee9ec5ca872d5c5e853a",
|
"build/assets/ba_data/meshes/zoeUpperArm.bob": "a8a881010ac1ee9ec5ca872d5c5e853a",
|
||||||
"build/assets/ba_data/meshes/zoeUpperLeg.bob": "95b2502f74c70f934927f67cd505c3ad",
|
"build/assets/ba_data/meshes/zoeUpperLeg.bob": "95b2502f74c70f934927f67cd505c3ad",
|
||||||
"build/assets/ba_data/python-site-packages/_yaml/__init__.py": "b09d1968d73a04d6cf20e4e79657a6e7",
|
"build/assets/ba_data/python-site-packages/_yaml/__init__.py": "b09d1968d73a04d6cf20e4e79657a6e7",
|
||||||
"build/assets/ba_data/python-site-packages/certifi/__init__.py": "6337efa17f5b457b793332df33904162",
|
"build/assets/ba_data/python-site-packages/certifi/__init__.py": "b1fb6436db400125ecbb288262d00f0f",
|
||||||
"build/assets/ba_data/python-site-packages/certifi/__main__.py": "ef02e73f8581609df189a9f61aca365b",
|
"build/assets/ba_data/python-site-packages/certifi/__main__.py": "ef02e73f8581609df189a9f61aca365b",
|
||||||
"build/assets/ba_data/python-site-packages/certifi/cacert.pem": "6ac29a6bccca11cd2ed7e16e27dfccec",
|
"build/assets/ba_data/python-site-packages/certifi/cacert.pem": "4422aed09ab445f7290df7d72a301a47",
|
||||||
"build/assets/ba_data/python-site-packages/certifi/core.py": "1b505388f1475fabd1b60031f985271c",
|
"build/assets/ba_data/python-site-packages/certifi/core.py": "1b505388f1475fabd1b60031f985271c",
|
||||||
"build/assets/ba_data/python-site-packages/typing_extensions.py": "084d93bb609d798a3930dfb5e25eba59",
|
"build/assets/ba_data/python-site-packages/typing_extensions.py": "2d974cad17a71505d86513d1322976a5",
|
||||||
"build/assets/ba_data/python-site-packages/yaml/__init__.py": "2b747e5772c203377222afc888ac6b71",
|
"build/assets/ba_data/python-site-packages/yaml/__init__.py": "2b747e5772c203377222afc888ac6b71",
|
||||||
"build/assets/ba_data/python-site-packages/yaml/composer.py": "cef871e1f5f99ba2a7c44941b70afb06",
|
"build/assets/ba_data/python-site-packages/yaml/composer.py": "cef871e1f5f99ba2a7c44941b70afb06",
|
||||||
"build/assets/ba_data/python-site-packages/yaml/constructor.py": "8a15e361e34b79491c81553bb3534062",
|
"build/assets/ba_data/python-site-packages/yaml/constructor.py": "8a15e361e34b79491c81553bb3534062",
|
||||||
@ -2586,21 +2586,21 @@
|
|||||||
"build/assets/pylib-android/_pyio.py": "a6e88d66fbca88b13213cdd2177390b8",
|
"build/assets/pylib-android/_pyio.py": "a6e88d66fbca88b13213cdd2177390b8",
|
||||||
"build/assets/pylib-android/_sitebuiltins.py": "8b5e3f6e73917962fa014ad2c4a55e61",
|
"build/assets/pylib-android/_sitebuiltins.py": "8b5e3f6e73917962fa014ad2c4a55e61",
|
||||||
"build/assets/pylib-android/_strptime.py": "ff699c3f7647db7621bb88c43cc282d3",
|
"build/assets/pylib-android/_strptime.py": "ff699c3f7647db7621bb88c43cc282d3",
|
||||||
"build/assets/pylib-android/_sysconfigdata__linux_aarch64-linux-android.py": "cb9a77b04173c8776365999b57186e36",
|
"build/assets/pylib-android/_sysconfigdata__linux_aarch64-linux-android.py": "b1a9ca985ff6a159aa5ef94abd287f46",
|
||||||
"build/assets/pylib-android/_sysconfigdata__linux_arm-linux-androideabi.py": "6d50596ec7f4858a0c6a5edefde21f7a",
|
"build/assets/pylib-android/_sysconfigdata__linux_arm-linux-androideabi.py": "21a5842f39c86fccaaa0a30e0e4ab347",
|
||||||
"build/assets/pylib-android/_sysconfigdata__linux_i686-linux-android.py": "bf9358a2243aa7884b8e80d85c969fa5",
|
"build/assets/pylib-android/_sysconfigdata__linux_i686-linux-android.py": "9349023049d7599da61456b3f9a9687b",
|
||||||
"build/assets/pylib-android/_sysconfigdata__linux_x86_64-linux-android.py": "45eee0efbc2441535b94a8ad5acf4d2e",
|
"build/assets/pylib-android/_sysconfigdata__linux_x86_64-linux-android.py": "4151fa62c11c32cddf538e5cc7647160",
|
||||||
"build/assets/pylib-android/_sysconfigdata_d_linux_aarch64-linux-android.py": "f8ff271cf6df0b5b4d46d9c548abb84e",
|
"build/assets/pylib-android/_sysconfigdata_d_linux_aarch64-linux-android.py": "d9f7f1d3f5b89b08150dfa00cf243901",
|
||||||
"build/assets/pylib-android/_sysconfigdata_d_linux_arm-linux-androideabi.py": "da171b290c06a34d6a5cfbb296c22c34",
|
"build/assets/pylib-android/_sysconfigdata_d_linux_arm-linux-androideabi.py": "f4b99d4501a1cf1eb20fbc8973fa0040",
|
||||||
"build/assets/pylib-android/_sysconfigdata_d_linux_i686-linux-android.py": "dde2516b5ac29412dfbebaa7b3de0d0d",
|
"build/assets/pylib-android/_sysconfigdata_d_linux_i686-linux-android.py": "454094da5fe52a969b53bb46d360da84",
|
||||||
"build/assets/pylib-android/_sysconfigdata_d_linux_x86_64-linux-android.py": "7df452144c6630afb96951487c1257a0",
|
"build/assets/pylib-android/_sysconfigdata_d_linux_x86_64-linux-android.py": "1e23f45f4243c1aacc83f23ad5852390",
|
||||||
"build/assets/pylib-android/_threading_local.py": "4a9688e3987d7d692db46feb9214945e",
|
"build/assets/pylib-android/_threading_local.py": "4a9688e3987d7d692db46feb9214945e",
|
||||||
"build/assets/pylib-android/_weakrefset.py": "e4fa8532ace46dfbc35149c41ea497f7",
|
"build/assets/pylib-android/_weakrefset.py": "e4fa8532ace46dfbc35149c41ea497f7",
|
||||||
"build/assets/pylib-android/abc.py": "a0daa1ed187eee8690c1e8438b97da90",
|
"build/assets/pylib-android/abc.py": "a0daa1ed187eee8690c1e8438b97da90",
|
||||||
"build/assets/pylib-android/aifc.py": "1b9134c72b1e542417bee5bf345a1d0a",
|
"build/assets/pylib-android/aifc.py": "1b9134c72b1e542417bee5bf345a1d0a",
|
||||||
"build/assets/pylib-android/antigravity.py": "6d56bedf73be574cb6d7117caf5d334c",
|
"build/assets/pylib-android/antigravity.py": "6d56bedf73be574cb6d7117caf5d334c",
|
||||||
"build/assets/pylib-android/argparse.py": "e22cac9b12c09592929d57eb982fc554",
|
"build/assets/pylib-android/argparse.py": "e22cac9b12c09592929d57eb982fc554",
|
||||||
"build/assets/pylib-android/ast.py": "3aaa1b0e56b21b28155707c54bc225a8",
|
"build/assets/pylib-android/ast.py": "f287ccaa1cd7cb0ea256e3984fd4ce4d",
|
||||||
"build/assets/pylib-android/asynchat.py": "2ef3a0ce322332fabbf8fad4e133c6a3",
|
"build/assets/pylib-android/asynchat.py": "2ef3a0ce322332fabbf8fad4e133c6a3",
|
||||||
"build/assets/pylib-android/asyncio/__init__.py": "edf0e79e2b8b85c08f09fd14668e4822",
|
"build/assets/pylib-android/asyncio/__init__.py": "edf0e79e2b8b85c08f09fd14668e4822",
|
||||||
"build/assets/pylib-android/asyncio/__main__.py": "8e391b47f448ad922dc2614dbd93011e",
|
"build/assets/pylib-android/asyncio/__main__.py": "8e391b47f448ad922dc2614dbd93011e",
|
||||||
@ -2624,10 +2624,10 @@
|
|||||||
"build/assets/pylib-android/asyncio/selector_events.py": "a108fbd3a49f967da245f39cebf7694e",
|
"build/assets/pylib-android/asyncio/selector_events.py": "a108fbd3a49f967da245f39cebf7694e",
|
||||||
"build/assets/pylib-android/asyncio/sslproto.py": "2ec1b21e523055147d94c8c634154aab",
|
"build/assets/pylib-android/asyncio/sslproto.py": "2ec1b21e523055147d94c8c634154aab",
|
||||||
"build/assets/pylib-android/asyncio/staggered.py": "f5056f0a56b73b477a9fa65e71145366",
|
"build/assets/pylib-android/asyncio/staggered.py": "f5056f0a56b73b477a9fa65e71145366",
|
||||||
"build/assets/pylib-android/asyncio/streams.py": "f00ddd2b2fd74554ae1d3088bd9d2bfd",
|
"build/assets/pylib-android/asyncio/streams.py": "8cc026c067fc9245568199ea659167df",
|
||||||
"build/assets/pylib-android/asyncio/subprocess.py": "edb8d98278300b6c99f36cd08643c743",
|
"build/assets/pylib-android/asyncio/subprocess.py": "46e8b0ba32b4ac7bb5f840c49c89c85a",
|
||||||
"build/assets/pylib-android/asyncio/taskgroups.py": "5162e5b1806d9b647383d34ba1b21b56",
|
"build/assets/pylib-android/asyncio/taskgroups.py": "5162e5b1806d9b647383d34ba1b21b56",
|
||||||
"build/assets/pylib-android/asyncio/tasks.py": "234550593cd4928e6ee2c9591b6928ca",
|
"build/assets/pylib-android/asyncio/tasks.py": "c1bc59c01792bac43b79b425bb61e10e",
|
||||||
"build/assets/pylib-android/asyncio/threads.py": "7bbf81d424901524510e07b5d20e4a50",
|
"build/assets/pylib-android/asyncio/threads.py": "7bbf81d424901524510e07b5d20e4a50",
|
||||||
"build/assets/pylib-android/asyncio/timeouts.py": "c7cb81c7ee938bc47ff75342befc872a",
|
"build/assets/pylib-android/asyncio/timeouts.py": "c7cb81c7ee938bc47ff75342befc872a",
|
||||||
"build/assets/pylib-android/asyncio/transports.py": "04598090d813bb363cea9bf714b97c3f",
|
"build/assets/pylib-android/asyncio/transports.py": "04598090d813bb363cea9bf714b97c3f",
|
||||||
@ -2641,13 +2641,13 @@
|
|||||||
"build/assets/pylib-android/bisect.py": "9b70437e327d5176da41192567ad0064",
|
"build/assets/pylib-android/bisect.py": "9b70437e327d5176da41192567ad0064",
|
||||||
"build/assets/pylib-android/bz2.py": "cd6a5f2491bc52afd8fc180097371473",
|
"build/assets/pylib-android/bz2.py": "cd6a5f2491bc52afd8fc180097371473",
|
||||||
"build/assets/pylib-android/cProfile.py": "9e9c07ac3b9e4195a62b74e4f2b9489f",
|
"build/assets/pylib-android/cProfile.py": "9e9c07ac3b9e4195a62b74e4f2b9489f",
|
||||||
"build/assets/pylib-android/calendar.py": "4ef3d6d85d44e36212e5d784051c80b6",
|
"build/assets/pylib-android/calendar.py": "18df862e8e3c3fcbe4ab8a0b0348e339",
|
||||||
"build/assets/pylib-android/cgi.py": "090c5cfc8b4b92a730beec975159bd2a",
|
"build/assets/pylib-android/cgi.py": "090c5cfc8b4b92a730beec975159bd2a",
|
||||||
"build/assets/pylib-android/cgitb.py": "2bcff1cec7f3a3a9c96de7a55ebb4ea3",
|
"build/assets/pylib-android/cgitb.py": "2bcff1cec7f3a3a9c96de7a55ebb4ea3",
|
||||||
"build/assets/pylib-android/chunk.py": "13d7633b1ff28f5aed4eb043c65c99c5",
|
"build/assets/pylib-android/chunk.py": "13d7633b1ff28f5aed4eb043c65c99c5",
|
||||||
"build/assets/pylib-android/cmd.py": "8befee2654b0954af7886e24e2e7871f",
|
"build/assets/pylib-android/cmd.py": "8befee2654b0954af7886e24e2e7871f",
|
||||||
"build/assets/pylib-android/code.py": "5d47099984013b933c96b02ef16981b8",
|
"build/assets/pylib-android/code.py": "5d47099984013b933c96b02ef16981b8",
|
||||||
"build/assets/pylib-android/codecs.py": "6fac5e2969e98ceaba92d3b8e42cb2ec",
|
"build/assets/pylib-android/codecs.py": "e11eabe4824899dea4b26a89a568a361",
|
||||||
"build/assets/pylib-android/codeop.py": "d375467fb29fccd43ab94d15a2e63085",
|
"build/assets/pylib-android/codeop.py": "d375467fb29fccd43ab94d15a2e63085",
|
||||||
"build/assets/pylib-android/collections/__init__.py": "dcffbb6ee2cadd0c05ad22f2ef41f89b",
|
"build/assets/pylib-android/collections/__init__.py": "dcffbb6ee2cadd0c05ad22f2ef41f89b",
|
||||||
"build/assets/pylib-android/collections/abc.py": "15f410d3821352033a90a04539c99060",
|
"build/assets/pylib-android/collections/abc.py": "15f410d3821352033a90a04539c99060",
|
||||||
@ -2656,7 +2656,7 @@
|
|||||||
"build/assets/pylib-android/concurrent/__init__.py": "aa990702e8f3a7af205efb5ae23a7c85",
|
"build/assets/pylib-android/concurrent/__init__.py": "aa990702e8f3a7af205efb5ae23a7c85",
|
||||||
"build/assets/pylib-android/concurrent/futures/__init__.py": "3e46fadb9de9c995c37dca4311641d6a",
|
"build/assets/pylib-android/concurrent/futures/__init__.py": "3e46fadb9de9c995c37dca4311641d6a",
|
||||||
"build/assets/pylib-android/concurrent/futures/_base.py": "a1cd37aea6fe0efff1bc00a39543609e",
|
"build/assets/pylib-android/concurrent/futures/_base.py": "a1cd37aea6fe0efff1bc00a39543609e",
|
||||||
"build/assets/pylib-android/concurrent/futures/process.py": "a44e8618e158f8f351dafcb566a02544",
|
"build/assets/pylib-android/concurrent/futures/process.py": "1d1bb7b14e3999b383ba8bd11aa8951c",
|
||||||
"build/assets/pylib-android/concurrent/futures/thread.py": "e63753b8201f1392dbebc84a15054a13",
|
"build/assets/pylib-android/concurrent/futures/thread.py": "e63753b8201f1392dbebc84a15054a13",
|
||||||
"build/assets/pylib-android/configparser.py": "914afd2b2cec90bbca0b94fd176b5176",
|
"build/assets/pylib-android/configparser.py": "914afd2b2cec90bbca0b94fd176b5176",
|
||||||
"build/assets/pylib-android/contextlib.py": "6f52eac914e438ef54407760def8305f",
|
"build/assets/pylib-android/contextlib.py": "6f52eac914e438ef54407760def8305f",
|
||||||
@ -2680,7 +2680,7 @@
|
|||||||
"build/assets/pylib-android/curses/panel.py": "8f36fdade9588f8a4362d2cc057a6eff",
|
"build/assets/pylib-android/curses/panel.py": "8f36fdade9588f8a4362d2cc057a6eff",
|
||||||
"build/assets/pylib-android/curses/textpad.py": "94aa9ebc47a6068d4461652346646dbb",
|
"build/assets/pylib-android/curses/textpad.py": "94aa9ebc47a6068d4461652346646dbb",
|
||||||
"build/assets/pylib-android/dataclasses.py": "febeea138bff21dbed88762be772514e",
|
"build/assets/pylib-android/dataclasses.py": "febeea138bff21dbed88762be772514e",
|
||||||
"build/assets/pylib-android/datetime.py": "5dcfd7f3b1a4db8214c1442164ac999c",
|
"build/assets/pylib-android/datetime.py": "521d6767afcfef887ac4c3719386b8fd",
|
||||||
"build/assets/pylib-android/decimal.py": "f57d255d45b5d1d7d8e13c41a283c3e4",
|
"build/assets/pylib-android/decimal.py": "f57d255d45b5d1d7d8e13c41a283c3e4",
|
||||||
"build/assets/pylib-android/difflib.py": "6b3c8fd541b2b8d0320727025cd25275",
|
"build/assets/pylib-android/difflib.py": "6b3c8fd541b2b8d0320727025cd25275",
|
||||||
"build/assets/pylib-android/dis.py": "cecdc0c02aa3d70a7f550e60ebc9b3ba",
|
"build/assets/pylib-android/dis.py": "cecdc0c02aa3d70a7f550e60ebc9b3ba",
|
||||||
@ -2836,7 +2836,7 @@
|
|||||||
"build/assets/pylib-android/encodings/utf_8_sig.py": "8f3542863ef311d8b970a37c0d66b0de",
|
"build/assets/pylib-android/encodings/utf_8_sig.py": "8f3542863ef311d8b970a37c0d66b0de",
|
||||||
"build/assets/pylib-android/encodings/uu_codec.py": "4ef8a65413574c017a96b97fc1638ba6",
|
"build/assets/pylib-android/encodings/uu_codec.py": "4ef8a65413574c017a96b97fc1638ba6",
|
||||||
"build/assets/pylib-android/encodings/zlib_codec.py": "1388fb103fdf395451bfc8a2d60933a9",
|
"build/assets/pylib-android/encodings/zlib_codec.py": "1388fb103fdf395451bfc8a2d60933a9",
|
||||||
"build/assets/pylib-android/enum.py": "73b214a43ceef88aff7098b83623ed09",
|
"build/assets/pylib-android/enum.py": "e2a5734675e418870d7b379b5dba1ed3",
|
||||||
"build/assets/pylib-android/filecmp.py": "7648fdc6d0fc8bae7429d5e4081cf353",
|
"build/assets/pylib-android/filecmp.py": "7648fdc6d0fc8bae7429d5e4081cf353",
|
||||||
"build/assets/pylib-android/fileinput.py": "c3def1041e6b12dd5f1906c9dbbd1101",
|
"build/assets/pylib-android/fileinput.py": "c3def1041e6b12dd5f1906c9dbbd1101",
|
||||||
"build/assets/pylib-android/fnmatch.py": "a1bc67633695d4defd4c0886428c5363",
|
"build/assets/pylib-android/fnmatch.py": "a1bc67633695d4defd4c0886428c5363",
|
||||||
@ -2916,7 +2916,7 @@
|
|||||||
"build/assets/pylib-android/optparse.py": "5f65f891612b68c71a2846da86254285",
|
"build/assets/pylib-android/optparse.py": "5f65f891612b68c71a2846da86254285",
|
||||||
"build/assets/pylib-android/os.py": "36f9692131ffb9ba4db510de31afc651",
|
"build/assets/pylib-android/os.py": "36f9692131ffb9ba4db510de31afc651",
|
||||||
"build/assets/pylib-android/pathlib.py": "095ec821fec243124d0a286b4de3848a",
|
"build/assets/pylib-android/pathlib.py": "095ec821fec243124d0a286b4de3848a",
|
||||||
"build/assets/pylib-android/pdb.py": "117b0d24ccb89edc5f183c94f6722f70",
|
"build/assets/pylib-android/pdb.py": "c44527d9e905ca3b1b45d3c158df730a",
|
||||||
"build/assets/pylib-android/pickle.py": "e6f9f53d29988454690ccde3279c7c38",
|
"build/assets/pylib-android/pickle.py": "e6f9f53d29988454690ccde3279c7c38",
|
||||||
"build/assets/pylib-android/pickletools.py": "85b30fba86d32dfc4a588300dedf5f01",
|
"build/assets/pylib-android/pickletools.py": "85b30fba86d32dfc4a588300dedf5f01",
|
||||||
"build/assets/pylib-android/pipes.py": "2dd796bdbb87982034234fec50d4526c",
|
"build/assets/pylib-android/pipes.py": "2dd796bdbb87982034234fec50d4526c",
|
||||||
@ -2945,10 +2945,10 @@
|
|||||||
"build/assets/pylib-android/runpy.py": "3a2dd98314791c7e36b6bd3585f6ad82",
|
"build/assets/pylib-android/runpy.py": "3a2dd98314791c7e36b6bd3585f6ad82",
|
||||||
"build/assets/pylib-android/sched.py": "f5579c8c711dd3e89da70ec9e1788c9c",
|
"build/assets/pylib-android/sched.py": "f5579c8c711dd3e89da70ec9e1788c9c",
|
||||||
"build/assets/pylib-android/secrets.py": "bbf9ed672044ef3ab4b83ca2aea1644e",
|
"build/assets/pylib-android/secrets.py": "bbf9ed672044ef3ab4b83ca2aea1644e",
|
||||||
"build/assets/pylib-android/selectors.py": "98e0d83849452cbc2cc1381555bd5024",
|
"build/assets/pylib-android/selectors.py": "3c94b3b678c473543cdc7f1d2b20a6f6",
|
||||||
"build/assets/pylib-android/shelve.py": "3e569c07c863ecbd7f35a6c382d1785a",
|
"build/assets/pylib-android/shelve.py": "3e569c07c863ecbd7f35a6c382d1785a",
|
||||||
"build/assets/pylib-android/shlex.py": "0873fac90a491702950816ead0e59dd0",
|
"build/assets/pylib-android/shlex.py": "0873fac90a491702950816ead0e59dd0",
|
||||||
"build/assets/pylib-android/shutil.py": "a5d0ee9f28244b42a06e682312d0e3fa",
|
"build/assets/pylib-android/shutil.py": "aa636d67785c2e92d34c7c5c81f9e8c5",
|
||||||
"build/assets/pylib-android/signal.py": "114ef47b1798fca6f56ac8a250974b3e",
|
"build/assets/pylib-android/signal.py": "114ef47b1798fca6f56ac8a250974b3e",
|
||||||
"build/assets/pylib-android/site.py": "2a99f7de2702aa8411d35acbb91fe926",
|
"build/assets/pylib-android/site.py": "2a99f7de2702aa8411d35acbb91fe926",
|
||||||
"build/assets/pylib-android/smtpd.py": "0602b6a39c4e37133303bee16c3e28a4",
|
"build/assets/pylib-android/smtpd.py": "0602b6a39c4e37133303bee16c3e28a4",
|
||||||
@ -2958,7 +2958,7 @@
|
|||||||
"build/assets/pylib-android/socketserver.py": "98e33643181a54765e6d0b9e01b03d53",
|
"build/assets/pylib-android/socketserver.py": "98e33643181a54765e6d0b9e01b03d53",
|
||||||
"build/assets/pylib-android/sqlite3/__init__.py": "8838d75ad0e465e25bb0c8dfeab7a9ab",
|
"build/assets/pylib-android/sqlite3/__init__.py": "8838d75ad0e465e25bb0c8dfeab7a9ab",
|
||||||
"build/assets/pylib-android/sqlite3/dbapi2.py": "c85f3ff9ddbd56683a8c801885dc5e53",
|
"build/assets/pylib-android/sqlite3/dbapi2.py": "c85f3ff9ddbd56683a8c801885dc5e53",
|
||||||
"build/assets/pylib-android/sqlite3/dump.py": "8364bd18be01acf7e56e168db98c0e6f",
|
"build/assets/pylib-android/sqlite3/dump.py": "8d2085ec40031d544694759608e53178",
|
||||||
"build/assets/pylib-android/sre_compile.py": "a1784e9ccbea7d9963cab75b536b40c8",
|
"build/assets/pylib-android/sre_compile.py": "a1784e9ccbea7d9963cab75b536b40c8",
|
||||||
"build/assets/pylib-android/sre_constants.py": "5c5be32a5334d9b0a848dad520746a63",
|
"build/assets/pylib-android/sre_constants.py": "5c5be32a5334d9b0a848dad520746a63",
|
||||||
"build/assets/pylib-android/sre_parse.py": "cca15b9ab31509e6642f9d2fd4fb9d91",
|
"build/assets/pylib-android/sre_parse.py": "cca15b9ab31509e6642f9d2fd4fb9d91",
|
||||||
@ -2978,8 +2978,8 @@
|
|||||||
"build/assets/pylib-android/tempfile.py": "436007fbe6821c864a53861bd73b4d43",
|
"build/assets/pylib-android/tempfile.py": "436007fbe6821c864a53861bd73b4d43",
|
||||||
"build/assets/pylib-android/textwrap.py": "3eb16a40553205dc96be5cb9039f3c8c",
|
"build/assets/pylib-android/textwrap.py": "3eb16a40553205dc96be5cb9039f3c8c",
|
||||||
"build/assets/pylib-android/this.py": "8b0a9a1fa0a45a37e6c656eca1922277",
|
"build/assets/pylib-android/this.py": "8b0a9a1fa0a45a37e6c656eca1922277",
|
||||||
"build/assets/pylib-android/threading.py": "dda98a9e1169adb496655300454ecc09",
|
"build/assets/pylib-android/threading.py": "3354bf0cad72286a0532b0754de78704",
|
||||||
"build/assets/pylib-android/timeit.py": "8dc6f4245abf1d44814745e22a2f78b1",
|
"build/assets/pylib-android/timeit.py": "c918c7dee7538ff6e5a92288f55b4327",
|
||||||
"build/assets/pylib-android/token.py": "d8ff4e6c8eb59896891d01148f481e27",
|
"build/assets/pylib-android/token.py": "d8ff4e6c8eb59896891d01148f481e27",
|
||||||
"build/assets/pylib-android/tokenize.py": "3056f048c07e6c5a6442a5ef4f38e54c",
|
"build/assets/pylib-android/tokenize.py": "3056f048c07e6c5a6442a5ef4f38e54c",
|
||||||
"build/assets/pylib-android/tomllib/__init__.py": "253ecf9dd67cb81a3e19911a4a39f930",
|
"build/assets/pylib-android/tomllib/__init__.py": "253ecf9dd67cb81a3e19911a4a39f930",
|
||||||
@ -2987,7 +2987,7 @@
|
|||||||
"build/assets/pylib-android/tomllib/_re.py": "0e509117e16c41c491615e06bb98861d",
|
"build/assets/pylib-android/tomllib/_re.py": "0e509117e16c41c491615e06bb98861d",
|
||||||
"build/assets/pylib-android/tomllib/_types.py": "07be9616d6f5e401fd31fbeea619fc97",
|
"build/assets/pylib-android/tomllib/_types.py": "07be9616d6f5e401fd31fbeea619fc97",
|
||||||
"build/assets/pylib-android/trace.py": "3d8698a2c3ec03dc0f394a2f48c2ffbc",
|
"build/assets/pylib-android/trace.py": "3d8698a2c3ec03dc0f394a2f48c2ffbc",
|
||||||
"build/assets/pylib-android/traceback.py": "91f67818e621e3b2f5bf583ed6863ef8",
|
"build/assets/pylib-android/traceback.py": "668bd36fc103a89554d2f9202a07f56d",
|
||||||
"build/assets/pylib-android/tracemalloc.py": "e4d10d2bee7773566e46797a939e5cbf",
|
"build/assets/pylib-android/tracemalloc.py": "e4d10d2bee7773566e46797a939e5cbf",
|
||||||
"build/assets/pylib-android/tty.py": "271c7d61005a0a3c2c0952efc60dcb6d",
|
"build/assets/pylib-android/tty.py": "271c7d61005a0a3c2c0952efc60dcb6d",
|
||||||
"build/assets/pylib-android/types.py": "78f8942c08dbfc9c582f1bb8d5206639",
|
"build/assets/pylib-android/types.py": "78f8942c08dbfc9c582f1bb8d5206639",
|
||||||
@ -4056,50 +4056,50 @@
|
|||||||
"build/assets/windows/Win32/ucrtbased.dll": "2def5335207d41b21b9823f6805997f1",
|
"build/assets/windows/Win32/ucrtbased.dll": "2def5335207d41b21b9823f6805997f1",
|
||||||
"build/assets/windows/Win32/vc_redist.x86.exe": "b08a55e2e77623fe657bea24f223a3ae",
|
"build/assets/windows/Win32/vc_redist.x86.exe": "b08a55e2e77623fe657bea24f223a3ae",
|
||||||
"build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599",
|
"build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599",
|
||||||
"build/prefab/full/linux_arm64_gui/debug/ballisticakit": "19f758d463a96209e647e651c611d1b9",
|
"build/prefab/full/linux_arm64_gui/debug/ballisticakit": "ead20e58b2cf88e71b324dba1468a5ec",
|
||||||
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "49506eff59a21d3cfb6fc55db4edeeae",
|
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "80fd8e740193e6f7ff47aafdb29beb99",
|
||||||
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "1cd9dfdc832995ba84386803c2eb3d7e",
|
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "669fef14d4eb8f939a6da857808cc834",
|
||||||
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "f9786e628a44b5d14dbd842e29f37b4d",
|
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "ee04459b54e94495a1aefd67628f7a01",
|
||||||
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "a21e3ab1ec336eb8f957deeee96926e4",
|
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "4faea0209f862b3b3efbf8ef570d0ae0",
|
||||||
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "e93a34b23530cf29d443529af6a42d4c",
|
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "d6265890c3e384917e7979325be5a7af",
|
||||||
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "2ecbe46fb8b6ddb96340e35e53d7e73e",
|
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "9d9365749d358cd3543f72b07b5416cc",
|
||||||
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "37d5f679d73736214f8d12980028511d",
|
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "730dd0cb27af4dee2e42174718dc36a6",
|
||||||
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "b09fbdc4f44383ed0111ac19b13371dd",
|
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "30bf588730c95523b6891a9431ad9897",
|
||||||
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "b8332772459f472a559e05002ce6921c",
|
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "a0e734e97483f608b0da91721c42f416",
|
||||||
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "5e0cfb078710084739280d17cbc86732",
|
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "b44c311262ed6958da11b9143b4747ea",
|
||||||
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "6b25f48718896540a46e9aef9f993c51",
|
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "c576e665ed6fbccb14d5591dcfef2560",
|
||||||
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "940db05971335a1a8a84e96adc948a84",
|
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "b8095344948530377d5c4147cfaad3ec",
|
||||||
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "98ab1223c634600b44e2c407b3cee6e2",
|
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "1d4f2efd3d2d9e718fd30da5972e605e",
|
||||||
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "3c1be40378854bffa24a2e118979e252",
|
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "331d85d66cc8e3707401ff847239a973",
|
||||||
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "a1a8830a0892b6a8ed8827241cf848aa",
|
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "20d4ff570dcbdc53162cd03a2bc5127a",
|
||||||
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "27b755855aa9ebe54e536ad04a82b867",
|
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "58dc3dcaf0e5da291ffaa728c42d080c",
|
||||||
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "f291bcc463de9b5172904304774d1c12",
|
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "e2d33100dd91a8526168246e693008cd",
|
||||||
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "16bb769fd794945b09d6ed40ab11a411",
|
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "616cab068c995c4e70b0f173662565cf",
|
||||||
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "83a5455b631ececcddf5330693c2d38a",
|
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "7a26ee8376f752ffb010f6360ba090c7",
|
||||||
"build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "ac33b224e5b4e35712eb98fcc20cab5b",
|
"build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "c22901e06e88a55cce0b4e08bbf41a4c",
|
||||||
"build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "81ac92010f7957feffde3573745976d2",
|
"build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "a27963487e346338e4c216bd4fbb9e2a",
|
||||||
"build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "ac33b224e5b4e35712eb98fcc20cab5b",
|
"build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "c22901e06e88a55cce0b4e08bbf41a4c",
|
||||||
"build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "81ac92010f7957feffde3573745976d2",
|
"build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "a27963487e346338e4c216bd4fbb9e2a",
|
||||||
"build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "1d2d67df52456863593f5a32ee591c5f",
|
"build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "2663c888aec894656bd8c49932bd7729",
|
||||||
"build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "4360984cf0a0e1664bd052894ebc522e",
|
"build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "5e57d12a3cfcfbc47b0293c3cb9fdca9",
|
||||||
"build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "1d2d67df52456863593f5a32ee591c5f",
|
"build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "2663c888aec894656bd8c49932bd7729",
|
||||||
"build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "4360984cf0a0e1664bd052894ebc522e",
|
"build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "5e57d12a3cfcfbc47b0293c3cb9fdca9",
|
||||||
"build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "f86bc9554c44e6a3041ee06ff7690ae2",
|
"build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "0f7dbe6fb3e28a51904aa822b509da0f",
|
||||||
"build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "c6815480bdfcbbb30ffe06bfc25a3fd2",
|
"build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "081b766945b52460a4f1afc01faa0652",
|
||||||
"build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "f86bc9554c44e6a3041ee06ff7690ae2",
|
"build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "0f7dbe6fb3e28a51904aa822b509da0f",
|
||||||
"build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "c6815480bdfcbbb30ffe06bfc25a3fd2",
|
"build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "081b766945b52460a4f1afc01faa0652",
|
||||||
"build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "8e3f285a0d05918175c6054b3841621e",
|
"build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "ad609c63f68417d5211bbfb23ce4affe",
|
||||||
"build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "5ec40f0445bc6415d9327c5b1cb0f645",
|
"build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "852fe46c736082611a831a618923c241",
|
||||||
"build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "2793d3aea54fc937322393dd779412a7",
|
"build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "36fbda7829ed5c2862c34feb09b03402",
|
||||||
"build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "5ec40f0445bc6415d9327c5b1cb0f645",
|
"build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "852fe46c736082611a831a618923c241",
|
||||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "d254bb364aa44360cac2003934af76f6",
|
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "b497de63fb2370a7e893a4dd93c3e020",
|
||||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "0db2f48d7a46826de315df7ce473ab52",
|
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "210cb0d4ec77da138c08ed5428a4ce1e",
|
||||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "5ec488e800f024c0827deb229e4e1efc",
|
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "615cc61b2431de1ee68f4c12210d3174",
|
||||||
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "430045c8d5f966488628ab5de5452e10",
|
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "42ddbc2ec78390ec90d584b667fb21fd",
|
||||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "892c0eb2ec182ccbdcb604713d5d5ba9",
|
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "5af8897e9a047b1b80404c22e0e50123",
|
||||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "3b2917f0882ac5889c12f2ca83269063",
|
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "6c6e15126d40ed6839e0fdf2fdfc7018",
|
||||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "bef209af05f0af8ee5fe6d33246d846d",
|
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "5a70719bd76a7553fcc849472eb71875",
|
||||||
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "93a8f27c51283913e35b0e2d8b8a37b0",
|
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "0f2ec390a0306d1a9003cceb972fddee",
|
||||||
"src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c",
|
"src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c",
|
||||||
"src/assets/ba_data/python/babase/_mgen/enums.py": "28323912b56ec07701eda3d41a6a4101",
|
"src/assets/ba_data/python/babase/_mgen/enums.py": "28323912b56ec07701eda3d41a6a4101",
|
||||||
"src/ballistica/base/mgen/pyembed/binding_base.inc": "72bfed2cce8ff19741989dec28302f3f",
|
"src/ballistica/base/mgen/pyembed/binding_base.inc": "72bfed2cce8ff19741989dec28302f3f",
|
||||||
|
|||||||
32
CHANGELOG.md
32
CHANGELOG.md
@ -1,10 +1,30 @@
|
|||||||
### 1.7.29 (build 21612, api 8, 2023-11-20)
|
### 1.7.30 (build 21623, api 8, 2023-11-28)
|
||||||
|
- Continued work on the big 1.7.28 update.
|
||||||
|
- Got the Android version back up and running. There's been lots of cleanup and
|
||||||
|
simplification on the Android layer, cleaning out years of cruft. This should
|
||||||
|
put things in a better more maintainable place, but there will probably be
|
||||||
|
some bugs to iron out, so please holler if you run into any.
|
||||||
|
- Minimum supported Android version has been bumped from 5.0 to 6.0. Some
|
||||||
|
upcoming tech such as ASTC textures will likely not be well supported on such
|
||||||
|
old devices, so I think it is better to leave them running an older version
|
||||||
|
that performs decently instead of a newer version that performs poorly. And
|
||||||
|
letting go of old Android versions lets us better support new ones.
|
||||||
|
- Android version now uses the 'Oboe' library as an audio back-end instead of
|
||||||
|
OpenSL. This should result in better behaving audio in general. Please holler
|
||||||
|
if you experience otherwise.
|
||||||
|
- Bundled Android Python has been bumped to version 3.11.6.
|
||||||
|
- Android app suspend behavior has been revamped. The app should stay running
|
||||||
|
more often and be quicker to respond when dialogs or other activities
|
||||||
|
temporarily pop up in front of it. Please holler if you run into strange side
|
||||||
|
effects such as the app continuing to play audio when it should not be.
|
||||||
|
|
||||||
|
### 1.7.29 (build 21619, api 8, 2023-11-21)
|
||||||
|
|
||||||
- Simply continued work on the big 1.7.28 update. I finally got the Mac App
|
- Simply continued work on the big 1.7.28 update. I was able to finally start
|
||||||
Store version of the game updated (it had been stuck at 1.4!), and it turns
|
updating the Mac App Store version of the game again (it had been stuck at
|
||||||
out that Apple AppStore submissions require the version number to increase
|
1.4!), and it turns out that Apple AppStore submissions require the version
|
||||||
each time and not just the build number, so we may start seeing more minor
|
number to increase each time and not just the build number, so we may start
|
||||||
version bumps for that reason.
|
seeing more minor version number bumps for that reason.
|
||||||
- Windows builds should now die with a clear error when the OpenGL version is
|
- Windows builds should now die with a clear error when the OpenGL version is
|
||||||
too old (OpenGL 3.0 or newer is required). Previously they could die with more
|
too old (OpenGL 3.0 or newer is required). Previously they could die with more
|
||||||
cryptic error messages such as "OpenGL function 'glActiveTexture2D' not
|
cryptic error messages such as "OpenGL function 'glActiveTexture2D' not
|
||||||
|
|||||||
@ -55,7 +55,6 @@ def run_stress_test(
|
|||||||
round_duration: int = 30,
|
round_duration: int = 30,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Run a stress test."""
|
"""Run a stress test."""
|
||||||
from babase import modutils
|
|
||||||
|
|
||||||
babase.screenmessage(
|
babase.screenmessage(
|
||||||
"Beginning stress test.. use 'End Test' to stop testing.",
|
"Beginning stress test.. use 'End Test' to stop testing.",
|
||||||
@ -70,17 +69,6 @@ def run_stress_test(
|
|||||||
'round_duration': round_duration,
|
'round_duration': round_duration,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
babase.apptimer(
|
|
||||||
7.0,
|
|
||||||
babase.Call(
|
|
||||||
babase.screenmessage,
|
|
||||||
(
|
|
||||||
'stats will be written to '
|
|
||||||
+ modutils.get_human_readable_user_scripts_path()
|
|
||||||
+ '/stress_test_stats.csv'
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def stop_stress_test() -> None:
|
def stop_stress_test() -> None:
|
||||||
|
|||||||
@ -52,8 +52,8 @@ if TYPE_CHECKING:
|
|||||||
|
|
||||||
# Build number and version of the ballistica binary we expect to be
|
# Build number and version of the ballistica binary we expect to be
|
||||||
# using.
|
# using.
|
||||||
TARGET_BALLISTICA_BUILD = 21612
|
TARGET_BALLISTICA_BUILD = 21623
|
||||||
TARGET_BALLISTICA_VERSION = '1.7.29'
|
TARGET_BALLISTICA_VERSION = '1.7.30'
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|||||||
@ -267,9 +267,7 @@ class GraphicsSettingsWindow(bui.Window):
|
|||||||
bui.Lstr(resource='nativeText'),
|
bui.Lstr(resource='nativeText'),
|
||||||
]
|
]
|
||||||
for res in [1440, 1080, 960, 720, 480]:
|
for res in [1440, 1080, 960, 720, 480]:
|
||||||
# Nav bar is 72px so lets allow for that in what
|
if native_res[1] >= res:
|
||||||
# choices we show.
|
|
||||||
if native_res[1] >= res - 72:
|
|
||||||
res_str = f'{res}p'
|
res_str = f'{res}p'
|
||||||
choices.append(res_str)
|
choices.append(res_str)
|
||||||
choices_display.append(bui.Lstr(value=res_str))
|
choices_display.append(bui.Lstr(value=res_str))
|
||||||
|
|||||||
@ -67,15 +67,15 @@ void AppAdapter::OnAppUnsuspend_() {
|
|||||||
// menu doesn't really accomplish anything there.
|
// menu doesn't really accomplish anything there.
|
||||||
//
|
//
|
||||||
// In general this probably should be handled at a higher level.
|
// In general this probably should be handled at a higher level.
|
||||||
if (g_core->should_pause_active_game) {
|
// if (g_core->should_pause_active_game) {
|
||||||
g_core->should_pause_active_game = false;
|
// g_core->should_pause_active_game = false;
|
||||||
|
|
||||||
// If we've been completely backgrounded, send a menu-press command to
|
// // If we've been completely backgrounded, send a menu-press command to
|
||||||
// the game; this will bring up a pause menu if we're in the game/etc.
|
// // the game; this will bring up a pause menu if we're in the game/etc.
|
||||||
if (!g_base->ui->MainMenuVisible()) {
|
// if (!g_base->ui->MainMenuVisible()) {
|
||||||
g_base->ui->PushMainMenuPressCall(nullptr);
|
// g_base->ui->PushMainMenuPressCall(nullptr);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppAdapter::SuspendApp() {
|
void AppAdapter::SuspendApp() {
|
||||||
@ -142,7 +142,7 @@ void AppAdapter::UnsuspendApp() {
|
|||||||
|
|
||||||
if (!app_suspended_) {
|
if (!app_suspended_) {
|
||||||
Log(LogLevel::kWarning,
|
Log(LogLevel::kWarning,
|
||||||
"AppAdapter::UnsuspendApp() called with app not in paused state.");
|
"AppAdapter::UnsuspendApp() called with app not in suspendedstate.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
millisecs_t start_time{core::CorePlatform::GetCurrentMillisecs()};
|
millisecs_t start_time{core::CorePlatform::GetCurrentMillisecs()};
|
||||||
|
|||||||
@ -106,7 +106,7 @@ class AppAdapter {
|
|||||||
/// values.
|
/// values.
|
||||||
virtual void CursorPositionForDraw(float* x, float* y);
|
virtual void CursorPositionForDraw(float* x, float* y);
|
||||||
|
|
||||||
/// Put the app into a paused state. Should be called from the main
|
/// Put the app into a suspended state. Should be called from the main
|
||||||
/// thread. Pauses work, closes network sockets, etc. May correspond to
|
/// thread. Pauses work, closes network sockets, etc. May correspond to
|
||||||
/// being backgrounded on mobile, being minimized on desktop, etc. It is
|
/// being backgrounded on mobile, being minimized on desktop, etc. It is
|
||||||
/// assumed that, as soon as this call returns, all work is finished and
|
/// assumed that, as soon as this call returns, all work is finished and
|
||||||
@ -114,9 +114,9 @@ class AppAdapter {
|
|||||||
/// effects.
|
/// effects.
|
||||||
void SuspendApp();
|
void SuspendApp();
|
||||||
|
|
||||||
/// Resume the app; can correspond to foregrounding on mobile,
|
/// Return the app to a running state from a suspended one. Can correspond
|
||||||
/// unminimizing on desktop, etc. Spins threads back up, re-opens network
|
/// to foregrounding on mobile, unminimizing on desktop, etc. Spins
|
||||||
/// sockets, etc.
|
/// threads back up, re-opens network sockets, etc.
|
||||||
void UnsuspendApp();
|
void UnsuspendApp();
|
||||||
|
|
||||||
auto app_suspended() const { return app_suspended_; }
|
auto app_suspended() const { return app_suspended_; }
|
||||||
@ -255,9 +255,9 @@ class AppAdapter {
|
|||||||
void OnAppSuspend_();
|
void OnAppSuspend_();
|
||||||
void OnAppUnsuspend_();
|
void OnAppUnsuspend_();
|
||||||
|
|
||||||
bool app_suspended_ : 1 {};
|
bool app_suspended_{};
|
||||||
bool have_clipboard_is_supported_ : 1 {};
|
bool have_clipboard_is_supported_{};
|
||||||
bool clipboard_is_supported_ : 1 {};
|
bool clipboard_is_supported_{};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ballistica::base
|
} // namespace ballistica::base
|
||||||
|
|||||||
@ -102,10 +102,6 @@ void AppAdapterApple::ReloadRenderer_(const GraphicsSettings* settings) {
|
|||||||
gs->LoadRenderer();
|
gs->LoadRenderer();
|
||||||
}
|
}
|
||||||
|
|
||||||
// void AppAdapterApple::UpdateScreenSizes_() {
|
|
||||||
// assert(g_base->app_adapter->InGraphicsContext());
|
|
||||||
// }
|
|
||||||
|
|
||||||
auto AppAdapterApple::TryRender() -> bool {
|
auto AppAdapterApple::TryRender() -> bool {
|
||||||
auto allow = ScopedAllowGraphics_(this);
|
auto allow = ScopedAllowGraphics_(this);
|
||||||
|
|
||||||
|
|||||||
@ -70,7 +70,7 @@ class AppAdapterApple : public AppAdapter {
|
|||||||
void ReloadRenderer_(const GraphicsSettings* settings);
|
void ReloadRenderer_(const GraphicsSettings* settings);
|
||||||
|
|
||||||
std::thread::id graphics_thread_{};
|
std::thread::id graphics_thread_{};
|
||||||
bool graphics_allowed_ : 1 {};
|
bool graphics_allowed_{};
|
||||||
uint8_t resize_friendly_frames_{};
|
uint8_t resize_friendly_frames_{};
|
||||||
Vector2f resize_target_resolution_{-1.0f, -1.0f};
|
Vector2f resize_target_resolution_{-1.0f, -1.0f};
|
||||||
std::mutex graphics_calls_mutex_;
|
std::mutex graphics_calls_mutex_;
|
||||||
|
|||||||
@ -112,14 +112,6 @@ struct AppAdapterSDL::GraphicsSettings_ : public GraphicsSettings {
|
|||||||
int max_fps = g_base->app_config->Resolve(AppConfig::IntID::kMaxFPS);
|
int max_fps = g_base->app_config->Resolve(AppConfig::IntID::kMaxFPS);
|
||||||
};
|
};
|
||||||
|
|
||||||
void AppAdapterSDL::DoApplyAppConfig() {
|
|
||||||
assert(g_base->InLogicThread());
|
|
||||||
|
|
||||||
// Android res string.
|
|
||||||
// std::string android_res =
|
|
||||||
// g_base->app_config->Resolve(AppConfig::StringID::kResolutionAndroid);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto AppAdapterSDL::GetGraphicsSettings() -> GraphicsSettings* {
|
auto AppAdapterSDL::GetGraphicsSettings() -> GraphicsSettings* {
|
||||||
assert(g_base->InLogicThread());
|
assert(g_base->InLogicThread());
|
||||||
return new GraphicsSettings_();
|
return new GraphicsSettings_();
|
||||||
|
|||||||
@ -30,7 +30,6 @@ class AppAdapterSDL : public AppAdapter {
|
|||||||
AppAdapterSDL();
|
AppAdapterSDL();
|
||||||
|
|
||||||
void OnMainThreadStartApp() override;
|
void OnMainThreadStartApp() override;
|
||||||
void DoApplyAppConfig() override;
|
|
||||||
|
|
||||||
auto TryRender() -> bool;
|
auto TryRender() -> bool;
|
||||||
|
|
||||||
@ -77,11 +76,11 @@ class AppAdapterSDL : public AppAdapter {
|
|||||||
void SleepUntilNextEventCycle_(microsecs_t cycle_start_time);
|
void SleepUntilNextEventCycle_(microsecs_t cycle_start_time);
|
||||||
|
|
||||||
int max_fps_{60};
|
int max_fps_{60};
|
||||||
bool done_ : 1 {};
|
bool done_{};
|
||||||
bool fullscreen_ : 1 {};
|
bool fullscreen_{};
|
||||||
bool vsync_actually_enabled_ : 1 {};
|
bool vsync_actually_enabled_{};
|
||||||
bool debug_log_sdl_frame_timing_ : 1 {};
|
bool debug_log_sdl_frame_timing_{};
|
||||||
bool hidden_ : 1 {};
|
bool hidden_{};
|
||||||
|
|
||||||
/// With this off, graphics call pushes simply get pushed to the main
|
/// With this off, graphics call pushes simply get pushed to the main
|
||||||
/// thread and graphics code is allowed to run any time in the main
|
/// thread and graphics code is allowed to run any time in the main
|
||||||
@ -90,8 +89,8 @@ class AppAdapterSDL : public AppAdapter {
|
|||||||
/// allowed during draws. This strictness is generally not needed here but
|
/// allowed during draws. This strictness is generally not needed here but
|
||||||
/// can be useful to test with, as it more closely matches other platforms
|
/// can be useful to test with, as it more closely matches other platforms
|
||||||
/// that require such a setup.
|
/// that require such a setup.
|
||||||
bool strict_graphics_context_ : 1 {};
|
bool strict_graphics_context_{};
|
||||||
bool strict_graphics_allowed_ : 1 {};
|
bool strict_graphics_allowed_{};
|
||||||
VSync vsync_{VSync::kUnset};
|
VSync vsync_{VSync::kUnset};
|
||||||
uint32_t sdl_runnable_event_id_{};
|
uint32_t sdl_runnable_event_id_{};
|
||||||
std::mutex strict_graphics_calls_mutex_;
|
std::mutex strict_graphics_calls_mutex_;
|
||||||
|
|||||||
@ -143,9 +143,9 @@ class Assets {
|
|||||||
|
|
||||||
// Will be true while a AssetListLock exists. Good to debug-verify this
|
// Will be true while a AssetListLock exists. Good to debug-verify this
|
||||||
// during any asset list access.
|
// during any asset list access.
|
||||||
bool asset_lists_locked_ : 1 {};
|
bool asset_lists_locked_{};
|
||||||
bool asset_loads_allowed_ : 1 {};
|
bool asset_loads_allowed_{};
|
||||||
bool sys_assets_loaded_ : 1 {};
|
bool sys_assets_loaded_{};
|
||||||
|
|
||||||
std::vector<std::string> asset_paths_;
|
std::vector<std::string> asset_paths_;
|
||||||
std::unordered_map<std::string, std::string> packages_;
|
std::unordered_map<std::string, std::string> packages_;
|
||||||
|
|||||||
@ -173,7 +173,7 @@ auto Audio::PlaySound(SoundAsset* sound, float volume)
|
|||||||
if (s) {
|
if (s) {
|
||||||
// In vr mode, play non-positional sounds positionally in space roughly
|
// In vr mode, play non-positional sounds positionally in space roughly
|
||||||
// where the menu is.
|
// where the menu is.
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
s->SetGain(volume);
|
s->SetGain(volume);
|
||||||
s->SetPositional(true);
|
s->SetPositional(true);
|
||||||
float x = 0.0f;
|
float x = 0.0f;
|
||||||
|
|||||||
@ -172,7 +172,7 @@ void AudioServer::OnAppStartInThread_() {
|
|||||||
// On the rift build in vr mode we need to make sure we open the rift audio
|
// On the rift build in vr mode we need to make sure we open the rift audio
|
||||||
// device.
|
// device.
|
||||||
#if BA_RIFT_BUILD
|
#if BA_RIFT_BUILD
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
ALboolean enumeration =
|
ALboolean enumeration =
|
||||||
alcIsExtensionPresent(nullptr, "ALC_ENUMERATE_ALL_EXT");
|
alcIsExtensionPresent(nullptr, "ALC_ENUMERATE_ALL_EXT");
|
||||||
if (enumeration == AL_FALSE) {
|
if (enumeration == AL_FALSE) {
|
||||||
@ -777,7 +777,7 @@ AudioServer::ThreadSource_::ThreadSource_(AudioServer* audio_thread_in,
|
|||||||
} else {
|
} else {
|
||||||
// In vr mode we keep the microphone a bit closer to the camera
|
// In vr mode we keep the microphone a bit closer to the camera
|
||||||
// for realism purposes, so we need stuff louder in general.
|
// for realism purposes, so we need stuff louder in general.
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
alSourcef(source_, AL_MAX_DISTANCE, 100);
|
alSourcef(source_, AL_MAX_DISTANCE, 100);
|
||||||
alSourcef(source_, AL_REFERENCE_DISTANCE, 7.5f);
|
alSourcef(source_, AL_REFERENCE_DISTANCE, 7.5f);
|
||||||
} else {
|
} else {
|
||||||
@ -1060,7 +1060,7 @@ void AudioServer::ThreadSource_::ExecPlay() {
|
|||||||
bool do_normal = true;
|
bool do_normal = true;
|
||||||
// In vr mode, play non-positional sounds positionally in space roughly
|
// In vr mode, play non-positional sounds positionally in space roughly
|
||||||
// where the menu is.
|
// where the menu is.
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
do_normal = false;
|
do_normal = false;
|
||||||
SetPositional(true);
|
SetPositional(true);
|
||||||
SetPosition(0.0f, 4.5f, -3.0f);
|
SetPosition(0.0f, 4.5f, -3.0f);
|
||||||
|
|||||||
@ -116,10 +116,10 @@ class AudioServer {
|
|||||||
float sound_pitch_{1.0f};
|
float sound_pitch_{1.0f};
|
||||||
float music_volume_{1.0f};
|
float music_volume_{1.0f};
|
||||||
|
|
||||||
bool have_pending_loads_ : 1 {};
|
bool have_pending_loads_{};
|
||||||
bool suspended_ : 1 {};
|
bool suspended_{};
|
||||||
bool shutdown_completed_ : 1 {};
|
bool shutdown_completed_{};
|
||||||
bool shutting_down_ : 1 {};
|
bool shutting_down_{};
|
||||||
seconds_t shutdown_start_time_{};
|
seconds_t shutdown_start_time_{};
|
||||||
millisecs_t last_sound_fade_process_time_{};
|
millisecs_t last_sound_fade_process_time_{};
|
||||||
|
|
||||||
|
|||||||
@ -48,9 +48,9 @@ class AudioStreamer : public Object {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Format format_{Format::kInvalid};
|
Format format_{Format::kInvalid};
|
||||||
bool playing_ : 1 {};
|
bool playing_{};
|
||||||
bool loops_ : 1 {};
|
bool loops_{};
|
||||||
bool eof_ : 1 {};
|
bool eof_{};
|
||||||
ALuint buffers_[kAudioStreamBufferCount]{};
|
ALuint buffers_[kAudioStreamBufferCount]{};
|
||||||
ALuint source_{};
|
ALuint source_{};
|
||||||
std::string file_name_;
|
std::string file_name_;
|
||||||
|
|||||||
@ -730,7 +730,7 @@ void BaseFeatureSet::ShutdownSuppressDisallow() {
|
|||||||
shutdown_suppress_disallowed_ = true;
|
shutdown_suppress_disallowed_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto BaseFeatureSet::GetReturnValue() const -> int { return return_value(); }
|
// auto BaseFeatureSet::GetReturnValue() const -> int { return return_value(); }
|
||||||
|
|
||||||
void BaseFeatureSet::QuitApp(bool confirm, QuitType quit_type) {
|
void BaseFeatureSet::QuitApp(bool confirm, QuitType quit_type) {
|
||||||
// If they want a confirm dialog and we're able to present one, do that.
|
// If they want a confirm dialog and we're able to present one, do that.
|
||||||
|
|||||||
@ -272,6 +272,7 @@ enum class TextureCompressionType : uint8_t {
|
|||||||
kPVR,
|
kPVR,
|
||||||
kETC1,
|
kETC1,
|
||||||
kETC2,
|
kETC2,
|
||||||
|
kASTC,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class TextureMinQuality : uint8_t {
|
enum class TextureMinQuality : uint8_t {
|
||||||
@ -611,10 +612,10 @@ class BaseFeatureSet : public FeatureSetNativeComponent,
|
|||||||
/// Issue a high level app quit request. Can be called from any thread and
|
/// Issue a high level app quit request. Can be called from any thread and
|
||||||
/// can be safely called repeatedly. If 'confirm' is true, a confirmation
|
/// can be safely called repeatedly. If 'confirm' is true, a confirmation
|
||||||
/// dialog will be presented if the environment and situation allows;
|
/// dialog will be presented if the environment and situation allows;
|
||||||
/// otherwise the quit will be immediate. A QuitType arg can optionally be
|
/// otherwise the quit process will start immediately. A QuitType arg can
|
||||||
/// passed to influence quit behavior; on some platforms such as mobile
|
/// optionally be passed to influence quit behavior; on some platforms
|
||||||
/// the default is for the app to recede to the background but physically
|
/// such as mobile the default is for the app to recede to the background
|
||||||
/// remain running.
|
/// but physically remain running.
|
||||||
void QuitApp(bool confirm = false, QuitType quit_type = QuitType::kSoft);
|
void QuitApp(bool confirm = false, QuitType quit_type = QuitType::kSoft);
|
||||||
|
|
||||||
/// Called when app shutdown process completes. Sets app to exit.
|
/// Called when app shutdown process completes. Sets app to exit.
|
||||||
@ -773,10 +774,10 @@ class BaseFeatureSet : public FeatureSetNativeComponent,
|
|||||||
// Non-const bits (fixme: clean up access to these).
|
// Non-const bits (fixme: clean up access to these).
|
||||||
TouchInput* touch_input{};
|
TouchInput* touch_input{};
|
||||||
|
|
||||||
auto return_value() const { return return_value_; }
|
// auto return_value() const { return return_value_; }
|
||||||
void set_return_value(int val) { return_value_ = val; }
|
// void set_return_value(int val) { return_value_ = val; }
|
||||||
|
|
||||||
auto GetReturnValue() const -> int override;
|
// auto GetReturnValue() const -> int override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BaseFeatureSet();
|
BaseFeatureSet();
|
||||||
@ -791,7 +792,6 @@ class BaseFeatureSet : public FeatureSetNativeComponent,
|
|||||||
|
|
||||||
std::mutex shutdown_suppress_lock_;
|
std::mutex shutdown_suppress_lock_;
|
||||||
bool shutdown_suppress_disallowed_{};
|
bool shutdown_suppress_disallowed_{};
|
||||||
int shutdown_suppress_count_{};
|
|
||||||
bool tried_importing_plus_{};
|
bool tried_importing_plus_{};
|
||||||
bool tried_importing_classic_{};
|
bool tried_importing_classic_{};
|
||||||
bool tried_importing_ui_v1_{};
|
bool tried_importing_ui_v1_{};
|
||||||
@ -802,7 +802,8 @@ class BaseFeatureSet : public FeatureSetNativeComponent,
|
|||||||
bool base_native_import_completed_{};
|
bool base_native_import_completed_{};
|
||||||
bool basn_log_behavior_{};
|
bool basn_log_behavior_{};
|
||||||
bool server_wrapper_managed_{};
|
bool server_wrapper_managed_{};
|
||||||
int return_value_{};
|
int shutdown_suppress_count_{};
|
||||||
|
// int return_value_{};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ballistica::base
|
} // namespace ballistica::base
|
||||||
|
|||||||
@ -115,12 +115,12 @@ class ObjectComponent : public RenderComponent {
|
|||||||
protected:
|
protected:
|
||||||
ReflectionType reflection_{ReflectionType::kNone};
|
ReflectionType reflection_{ReflectionType::kNone};
|
||||||
LightShadowType light_shadow_{LightShadowType::kObject};
|
LightShadowType light_shadow_{LightShadowType::kObject};
|
||||||
bool world_space_ : 1 {};
|
bool world_space_{};
|
||||||
bool transparent_ : 1 {};
|
bool transparent_{};
|
||||||
bool premultiplied_ : 1 {};
|
bool premultiplied_{};
|
||||||
bool have_color_add_ : 1 {};
|
bool have_color_add_{};
|
||||||
bool double_sided_ : 1 {};
|
bool double_sided_{};
|
||||||
bool do_colorize_2_ : 1 {};
|
bool do_colorize_2_{};
|
||||||
float color_r_{1.0f};
|
float color_r_{1.0f};
|
||||||
float color_g_{1.0f};
|
float color_g_{1.0f};
|
||||||
float color_b_{1.0f};
|
float color_b_{1.0f};
|
||||||
|
|||||||
@ -21,7 +21,7 @@ class PostProcessComponent : public RenderComponent {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void WriteConfig() override;
|
void WriteConfig() override;
|
||||||
bool eyes_ : 1 {};
|
bool eyes_{};
|
||||||
float normal_distort_{};
|
float normal_distort_{};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -122,11 +122,11 @@ class SimpleComponent : public RenderComponent {
|
|||||||
void WriteConfig() override;
|
void WriteConfig() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool do_colorize_2_ : 1 {};
|
bool do_colorize_2_{};
|
||||||
bool transparent_ : 1 {};
|
bool transparent_{};
|
||||||
bool premultiplied_ : 1 {};
|
bool premultiplied_{};
|
||||||
bool have_color_ : 1 {};
|
bool have_color_{};
|
||||||
bool double_sided_ : 1 {};
|
bool double_sided_{};
|
||||||
float color_r_{1.0f};
|
float color_r_{1.0f};
|
||||||
float color_g_{1.0f};
|
float color_g_{1.0f};
|
||||||
float color_b_{1.0f};
|
float color_b_{1.0f};
|
||||||
|
|||||||
@ -27,7 +27,7 @@ class SmokeComponent : public RenderComponent {
|
|||||||
protected:
|
protected:
|
||||||
void WriteConfig() override;
|
void WriteConfig() override;
|
||||||
|
|
||||||
bool overlay_ : 1 {};
|
bool overlay_{};
|
||||||
float color_r_{1.0f};
|
float color_r_{1.0f};
|
||||||
float color_g_{1.0f};
|
float color_g_{1.0f};
|
||||||
float color_b_{1.0f};
|
float color_b_{1.0f};
|
||||||
|
|||||||
@ -37,9 +37,9 @@ class SpriteComponent : public RenderComponent {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void WriteConfig() override;
|
void WriteConfig() override;
|
||||||
bool have_color_ : 1 {};
|
bool have_color_{};
|
||||||
bool camera_aligned_ : 1 {};
|
bool camera_aligned_{};
|
||||||
bool overlay_ : 1 {};
|
bool overlay_{};
|
||||||
uint8_t exponent_{1};
|
uint8_t exponent_{1};
|
||||||
float color_r_{1.0f};
|
float color_r_{1.0f};
|
||||||
float color_g_{1.0f};
|
float color_g_{1.0f};
|
||||||
|
|||||||
@ -57,11 +57,6 @@ namespace ballistica::base {
|
|||||||
bool RendererGL::funky_depth_issue_set_{};
|
bool RendererGL::funky_depth_issue_set_{};
|
||||||
bool RendererGL::funky_depth_issue_{};
|
bool RendererGL::funky_depth_issue_{};
|
||||||
|
|
||||||
#if BA_OSTYPE_ANDROID
|
|
||||||
bool RendererGL::is_speedy_android_device_{};
|
|
||||||
bool RendererGL::is_extra_speedy_android_device_{};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
RendererGL::RendererGL() {
|
RendererGL::RendererGL() {
|
||||||
assert(g_base->app_adapter->InGraphicsContext());
|
assert(g_base->app_adapter->InGraphicsContext());
|
||||||
|
|
||||||
@ -121,11 +116,15 @@ auto RendererGL::GLErrorToString(GLenum err) -> std::string {
|
|||||||
static auto CheckGLExtension(const std::vector<std::string>& exts,
|
static auto CheckGLExtension(const std::vector<std::string>& exts,
|
||||||
const char* ext) -> bool {
|
const char* ext) -> bool {
|
||||||
assert(strlen(ext) < 100);
|
assert(strlen(ext) < 100);
|
||||||
const int variant_count{8};
|
const int variant_count{10};
|
||||||
char variants[variant_count][128];
|
char variants[variant_count][128];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
snprintf(variants[i], sizeof(variants[i]), "OES_%s", ext);
|
snprintf(variants[i], sizeof(variants[i]), "OES_%s", ext);
|
||||||
i++;
|
i++;
|
||||||
|
snprintf(variants[i], sizeof(variants[i]), "GL_OES_%s", ext);
|
||||||
|
i++;
|
||||||
|
snprintf(variants[i], sizeof(variants[i]), "GL_KHR_%s", ext);
|
||||||
|
i++;
|
||||||
snprintf(variants[i], sizeof(variants[i]), "GL_ARB_%s", ext);
|
snprintf(variants[i], sizeof(variants[i]), "GL_ARB_%s", ext);
|
||||||
i++;
|
i++;
|
||||||
snprintf(variants[i], sizeof(variants[i]), "GL_APPLE_%s", ext);
|
snprintf(variants[i], sizeof(variants[i]), "GL_APPLE_%s", ext);
|
||||||
@ -162,12 +161,28 @@ void RendererGL::CheckGLVersion() {
|
|||||||
}
|
}
|
||||||
const char* version_str = (const char*)glGetString(GL_VERSION);
|
const char* version_str = (const char*)glGetString(GL_VERSION);
|
||||||
BA_PRECONDITION_FATAL(version_str);
|
BA_PRECONDITION_FATAL(version_str);
|
||||||
// Do a rough check to make sure we're running 3 or newer of GL/GLES.
|
|
||||||
// This query should be available even on older versions.
|
// Do a rough check to make sure we're running 3 or newer of GL/GLES. This
|
||||||
if (version_str[0] != '3' && version_str[0] != '4') {
|
// query should be available even on older versions which is why we do it
|
||||||
FatalError(
|
// before the GL_MAJOR_VERSION/GL_MINOR_VERSION business which is not.
|
||||||
std::string("Your OpenGL version is too old (") + version_str
|
if (gl_is_es()) {
|
||||||
+ "). We require 3.0 or later. Try updating your graphics drivers.");
|
// GL ES version strings start with 'OpenGL ES X' with X being version.
|
||||||
|
const char* prefix = "OpenGL ES ";
|
||||||
|
int prefixlen = strlen(prefix);
|
||||||
|
BA_PRECONDITION_FATAL(!strncmp(version_str, prefix, prefixlen));
|
||||||
|
if (version_str[prefixlen] != '3') {
|
||||||
|
FatalError(
|
||||||
|
std::string("Your OpenGL ES version is too old (") + version_str
|
||||||
|
+ "). We require 3.0 or later. Try updating your graphics drivers.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Regular GL version strings start with numeric version.
|
||||||
|
|
||||||
|
if (version_str[0] != '3' && version_str[0] != '4') {
|
||||||
|
FatalError(
|
||||||
|
std::string("Your OpenGL version is too old (") + version_str
|
||||||
|
+ "). We require 3.0 or later. Try updating your graphics drivers.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
checked_gl_version_ = true;
|
checked_gl_version_ = true;
|
||||||
}
|
}
|
||||||
@ -280,8 +295,12 @@ void RendererGL::CheckGLCapabilities_() {
|
|||||||
|
|
||||||
// Flag certain devices as 'speedy' - we use this to enable high/higher
|
// Flag certain devices as 'speedy' - we use this to enable high/higher
|
||||||
// quality and whatnot (even in cases where ES3 isnt available).
|
// quality and whatnot (even in cases where ES3 isnt available).
|
||||||
is_speedy_android_device_ = true;
|
|
||||||
is_extra_speedy_android_device_ = false;
|
// Let just consider ES 3.2 stuff speedy.
|
||||||
|
assert(gl_version_major() == 3);
|
||||||
|
is_speedy_android_device_ = gl_version_minor() >= 2;
|
||||||
|
|
||||||
|
// is_extra_speedy_android_device_ = false;
|
||||||
is_adreno_ = (strstr(renderer, "Adreno") != nullptr);
|
is_adreno_ = (strstr(renderer, "Adreno") != nullptr);
|
||||||
// draws_shields_funny_ = false; // Start optimistic.
|
// draws_shields_funny_ = false; // Start optimistic.
|
||||||
|
|
||||||
@ -347,9 +366,9 @@ void RendererGL::CheckGLCapabilities_() {
|
|||||||
// g_core->platform->set_is_tegra_k1(is_tegra_k1_);
|
// g_core->platform->set_is_tegra_k1(is_tegra_k1_);
|
||||||
|
|
||||||
// Extra-speedy implies speedy too..
|
// Extra-speedy implies speedy too..
|
||||||
if (is_extra_speedy_android_device_) {
|
// if (is_extra_speedy_android_device_) {
|
||||||
is_speedy_android_device_ = true;
|
// is_speedy_android_device_ = true;
|
||||||
}
|
// }
|
||||||
|
|
||||||
#endif // BA_OSTYPE_ANDROID
|
#endif // BA_OSTYPE_ANDROID
|
||||||
|
|
||||||
@ -366,12 +385,12 @@ void RendererGL::CheckGLCapabilities_() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// All android devices should support etc1.
|
// Pretty much all Android devices should support ETC1.
|
||||||
if (CheckGLExtension(extensions, "compressed_ETC1_RGB8_texture")) {
|
if (CheckGLExtension(extensions, "compressed_ETC1_RGB8_texture")) {
|
||||||
c_types.push_back(TextureCompressionType::kETC1);
|
c_types.push_back(TextureCompressionType::kETC1);
|
||||||
} else {
|
} else {
|
||||||
if (g_buildconfig.ostype_android()) {
|
if (g_buildconfig.ostype_android()) {
|
||||||
Log(LogLevel::kError, "Android device missing ETC1 support");
|
Log(LogLevel::kError, "Android device missing ETC1 support.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -381,6 +400,11 @@ void RendererGL::CheckGLCapabilities_() {
|
|||||||
c_types.push_back(TextureCompressionType::kETC2);
|
c_types.push_back(TextureCompressionType::kETC2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ASTC is generally available on newer mobile hardware.
|
||||||
|
if (CheckGLExtension(extensions, "texture_compression_astc_ldr")) {
|
||||||
|
c_types.push_back(TextureCompressionType::kASTC);
|
||||||
|
}
|
||||||
|
|
||||||
g_base->graphics_server->SetTextureCompressionTypes(c_types);
|
g_base->graphics_server->SetTextureCompressionTypes(c_types);
|
||||||
|
|
||||||
// Both GL 3 and GL ES 3.0 support depth textures (and thus our high
|
// Both GL 3 and GL ES 3.0 support depth textures (and thus our high
|
||||||
@ -822,7 +846,7 @@ void RendererGL::SyncGLState_() {
|
|||||||
BA_DEBUG_CHECK_GL_ERROR;
|
BA_DEBUG_CHECK_GL_ERROR;
|
||||||
|
|
||||||
#if BA_RIFT_BUILD
|
#if BA_RIFT_BUILD
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
glFrontFace(GL_CCW);
|
glFrontFace(GL_CCW);
|
||||||
}
|
}
|
||||||
BA_DEBUG_CHECK_GL_ERROR;
|
BA_DEBUG_CHECK_GL_ERROR;
|
||||||
@ -862,7 +886,7 @@ void RendererGL::SyncGLState_() {
|
|||||||
// texture, and in that case we need alpha to accumulate; not get
|
// texture, and in that case we need alpha to accumulate; not get
|
||||||
// overwritten. could probably enable this everywhere but I don't know if
|
// overwritten. could probably enable this everywhere but I don't know if
|
||||||
// it's supported on all hardware or slower.
|
// it's supported on all hardware or slower.
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
#if BA_OSTYPE_WINDOWS
|
#if BA_OSTYPE_WINDOWS
|
||||||
if (glBlendFuncSeparate == nullptr) {
|
if (glBlendFuncSeparate == nullptr) {
|
||||||
FatalError(
|
FatalError(
|
||||||
@ -2374,7 +2398,7 @@ void RendererGL::SetBlendPremult(bool b) {
|
|||||||
// texture, and in that case we need alpha to accumulate; not get
|
// texture, and in that case we need alpha to accumulate; not get
|
||||||
// overwritten. could probably enable this everywhere but I don't know if
|
// overwritten. could probably enable this everywhere but I don't know if
|
||||||
// it's supported on all hardware or is slower or whatnot..
|
// it's supported on all hardware or is slower or whatnot..
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE,
|
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE,
|
||||||
GL_ONE_MINUS_SRC_ALPHA);
|
GL_ONE_MINUS_SRC_ALPHA);
|
||||||
} else {
|
} else {
|
||||||
@ -2543,26 +2567,12 @@ auto RendererGL::GetFunkyDepthIssue_() -> bool {
|
|||||||
std::string RendererGL::GetAutoAndroidRes() {
|
std::string RendererGL::GetAutoAndroidRes() {
|
||||||
assert(g_base->app_adapter->InGraphicsContext());
|
assert(g_base->app_adapter->InGraphicsContext());
|
||||||
|
|
||||||
const char* renderer = (const char*)glGetString(GL_RENDERER);
|
// Simplifying this to just 1080p for anything we label 'speedy' and 720p
|
||||||
|
// for everything else.
|
||||||
// On the adreno 4xxx or 5xxx series we should be able to do anything.
|
if (is_speedy_android_device_) {
|
||||||
if (strstr(renderer, "Adreno (TM) 4") || strstr(renderer, "Adreno (TM) 5")) {
|
|
||||||
return "1080p";
|
return "1080p";
|
||||||
}
|
}
|
||||||
|
return "720p";
|
||||||
// On extra-speedy devices we should be able to do 1920x1200.
|
|
||||||
if (is_extra_speedy_android_device_) {
|
|
||||||
return "1080p";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Amazon Fire tablet (as of Jan '18) needs REAL low res to feel smooth.
|
|
||||||
if (g_core->platform->GetDeviceName() == "Amazon KFAUWI") {
|
|
||||||
return "480p";
|
|
||||||
}
|
|
||||||
|
|
||||||
// fall back to the old 'Auto' values elsewhere
|
|
||||||
// - this is generally 720p (but varies in a few cases)
|
|
||||||
return "Auto";
|
|
||||||
}
|
}
|
||||||
#endif // BA_OSTYPE_ANDROID
|
#endif // BA_OSTYPE_ANDROID
|
||||||
|
|
||||||
@ -2574,18 +2584,10 @@ auto RendererGL::GetAutoTextureQuality() -> TextureQuality {
|
|||||||
#if BA_OSTYPE_ANDROID
|
#if BA_OSTYPE_ANDROID
|
||||||
{
|
{
|
||||||
// Lets be cheaper in VR mode since we have to draw twice.
|
// Lets be cheaper in VR mode since we have to draw twice.
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
qual = TextureQuality::kMedium;
|
qual = TextureQuality::kHigh;
|
||||||
} else {
|
} else {
|
||||||
// On android we default to high quality mode if we support ETC2;
|
qual = TextureQuality::kHigh;
|
||||||
// otherwise go with medium.
|
|
||||||
if (g_base->graphics_server->SupportsTextureCompressionType(
|
|
||||||
TextureCompressionType::kETC2)
|
|
||||||
|| is_speedy_android_device_) {
|
|
||||||
qual = TextureQuality::kHigh;
|
|
||||||
} else {
|
|
||||||
qual = TextureQuality::kMedium;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else // BA_OSTYPE_ANDROID
|
#else // BA_OSTYPE_ANDROID
|
||||||
@ -2603,10 +2605,10 @@ auto RendererGL::GetAutoGraphicsQuality() -> GraphicsQuality {
|
|||||||
GraphicsQuality q{GraphicsQuality::kMedium};
|
GraphicsQuality q{GraphicsQuality::kMedium};
|
||||||
#if BA_OSTYPE_ANDROID
|
#if BA_OSTYPE_ANDROID
|
||||||
// lets be cheaper in VR mode since we draw twice..
|
// lets be cheaper in VR mode since we draw twice..
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
q = GraphicsQuality::kMedium;
|
q = GraphicsQuality::kMedium;
|
||||||
} else {
|
} else {
|
||||||
if (is_extra_speedy_android_device_) {
|
if (is_speedy_android_device_) {
|
||||||
q = GraphicsQuality::kHigher;
|
q = GraphicsQuality::kHigher;
|
||||||
} else {
|
} else {
|
||||||
q = GraphicsQuality::kHigh;
|
q = GraphicsQuality::kHigh;
|
||||||
@ -3262,7 +3264,7 @@ void RendererGL::CardboardDisableScissor() { glDisable(GL_SCISSOR_TEST); }
|
|||||||
void RendererGL::CardboardEnableScissor() { glEnable(GL_SCISSOR_TEST); }
|
void RendererGL::CardboardEnableScissor() { glEnable(GL_SCISSOR_TEST); }
|
||||||
|
|
||||||
void RendererGL::VREyeRenderBegin() {
|
void RendererGL::VREyeRenderBegin() {
|
||||||
assert(g_core->IsVRMode());
|
assert(g_core->vr_mode());
|
||||||
|
|
||||||
// On rift we need to turn off srgb conversion for each eye render
|
// On rift we need to turn off srgb conversion for each eye render
|
||||||
// so we can dump our linear data into oculus' srgb buffer as-is.
|
// so we can dump our linear data into oculus' srgb buffer as-is.
|
||||||
@ -3284,7 +3286,7 @@ void RendererGL::VRSyncRenderStates() {
|
|||||||
void RendererGL::RenderFrameDefEnd() {
|
void RendererGL::RenderFrameDefEnd() {
|
||||||
// Need to set some states to keep cardboard happy.
|
// Need to set some states to keep cardboard happy.
|
||||||
#if BA_CARDBOARD_BUILD
|
#if BA_CARDBOARD_BUILD
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
SyncGLState_();
|
SyncGLState_();
|
||||||
glEnable(GL_SCISSOR_TEST);
|
glEnable(GL_SCISSOR_TEST);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -261,23 +261,23 @@ class RendererGL : public Renderer {
|
|||||||
void SetBlendPremult(bool b);
|
void SetBlendPremult(bool b);
|
||||||
|
|
||||||
GraphicsQuality vignette_quality_{};
|
GraphicsQuality vignette_quality_{};
|
||||||
bool blend_ : 1 {};
|
bool blend_{};
|
||||||
bool blend_premult_ : 1 {};
|
bool blend_premult_{};
|
||||||
bool first_extension_check_ : 1 {true};
|
bool first_extension_check_{true};
|
||||||
bool is_tegra_4_ : 1 {};
|
bool is_tegra_4_{};
|
||||||
bool is_tegra_k1_ : 1 {};
|
bool is_tegra_k1_{};
|
||||||
bool is_recent_adreno_ : 1 {};
|
bool is_recent_adreno_{};
|
||||||
bool is_adreno_ : 1 {};
|
bool is_adreno_{};
|
||||||
bool enable_msaa_ : 1 {};
|
bool enable_msaa_{};
|
||||||
bool draw_at_equal_depth_ : 1 {};
|
bool draw_at_equal_depth_{};
|
||||||
bool depth_writing_enabled_ : 1 {};
|
bool depth_writing_enabled_{};
|
||||||
bool depth_testing_enabled_ : 1 {};
|
bool depth_testing_enabled_{};
|
||||||
bool data_loaded_ : 1 {};
|
bool data_loaded_{};
|
||||||
bool draw_front_ : 1 {};
|
bool draw_front_{};
|
||||||
bool got_screen_framebuffer_ : 1 {};
|
bool got_screen_framebuffer_{};
|
||||||
bool double_sided_ : 1 {};
|
bool double_sided_{};
|
||||||
bool invalidate_framebuffer_support_ : 1 {};
|
bool invalidate_framebuffer_support_{};
|
||||||
bool checked_gl_version_ : 1 {};
|
bool checked_gl_version_{};
|
||||||
GLint gl_version_major_{};
|
GLint gl_version_major_{};
|
||||||
GLint gl_version_minor_{};
|
GLint gl_version_minor_{};
|
||||||
int last_blur_res_count_{};
|
int last_blur_res_count_{};
|
||||||
@ -342,8 +342,7 @@ class RendererGL : public Renderer {
|
|||||||
static bool funky_depth_issue_set_;
|
static bool funky_depth_issue_set_;
|
||||||
static bool funky_depth_issue_;
|
static bool funky_depth_issue_;
|
||||||
#if BA_OSTYPE_ANDROID
|
#if BA_OSTYPE_ANDROID
|
||||||
static bool is_speedy_android_device_;
|
bool is_speedy_android_device_{};
|
||||||
static bool is_extra_speedy_android_device_;
|
|
||||||
#endif
|
#endif
|
||||||
ProgramGL* current_program_{};
|
ProgramGL* current_program_{};
|
||||||
std::vector<Rect> scissor_rects_;
|
std::vector<Rect> scissor_rects_;
|
||||||
|
|||||||
@ -371,7 +371,7 @@ void Graphics::DrawMiscOverlays(FrameDef* frame_def) {
|
|||||||
}
|
}
|
||||||
SimpleComponent c(pass);
|
SimpleComponent c(pass);
|
||||||
c.SetTransparent(true);
|
c.SetTransparent(true);
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
c.SetColor(1, 1, 1, 1);
|
c.SetColor(1, 1, 1, 1);
|
||||||
} else {
|
} else {
|
||||||
c.SetColor(0.8f, 0.8f, 0.8f, 1.0f);
|
c.SetColor(0.8f, 0.8f, 0.8f, 1.0f);
|
||||||
@ -379,7 +379,7 @@ void Graphics::DrawMiscOverlays(FrameDef* frame_def) {
|
|||||||
int text_elem_count = fps_text_group_->GetElementCount();
|
int text_elem_count = fps_text_group_->GetElementCount();
|
||||||
for (int e = 0; e < text_elem_count; e++) {
|
for (int e = 0; e < text_elem_count; e++) {
|
||||||
c.SetTexture(fps_text_group_->GetElementTexture(e));
|
c.SetTexture(fps_text_group_->GetElementTexture(e));
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
c.SetShadow(-0.003f * fps_text_group_->GetElementUScale(e),
|
c.SetShadow(-0.003f * fps_text_group_->GetElementUScale(e),
|
||||||
-0.003f * fps_text_group_->GetElementVScale(e), 0.0f, 1.0f);
|
-0.003f * fps_text_group_->GetElementVScale(e), 0.0f, 1.0f);
|
||||||
c.SetMaskUV2Texture(fps_text_group_->GetElementMaskUV2Texture(e));
|
c.SetMaskUV2Texture(fps_text_group_->GetElementMaskUV2Texture(e));
|
||||||
@ -540,7 +540,7 @@ void Graphics::InitInternalComponents(FrameDef* frame_def) {
|
|||||||
// Let's draw a bit bigger than screen to account for tv-border-mode.
|
// Let's draw a bit bigger than screen to account for tv-border-mode.
|
||||||
float w = pass->virtual_width();
|
float w = pass->virtual_width();
|
||||||
float h = pass->virtual_height();
|
float h = pass->virtual_height();
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
screen_mesh_->SetPositionAndSize(
|
screen_mesh_->SetPositionAndSize(
|
||||||
-(0.5f * kVRBorder) * w, (-0.5f * kVRBorder) * h, kScreenMeshZDepth,
|
-(0.5f * kVRBorder) * w, (-0.5f * kVRBorder) * h, kScreenMeshZDepth,
|
||||||
(1.0f + kVRBorder) * w, (1.0f + kVRBorder) * h);
|
(1.0f + kVRBorder) * w, (1.0f + kVRBorder) * h);
|
||||||
@ -837,7 +837,7 @@ void Graphics::BuildAndPushFrameDef() {
|
|||||||
// Sanity test: If we're in VR, the only reason we should have stuff in
|
// Sanity test: If we're in VR, the only reason we should have stuff in
|
||||||
// the flat overlay pass is if there's windows present (we want to avoid
|
// the flat overlay pass is if there's windows present (we want to avoid
|
||||||
// drawing/blitting the 2d UI buffer during gameplay for efficiency).
|
// drawing/blitting the 2d UI buffer during gameplay for efficiency).
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
if (frame_def->GetOverlayFlatPass()->HasDrawCommands()) {
|
if (frame_def->GetOverlayFlatPass()->HasDrawCommands()) {
|
||||||
if (!g_base->ui->MainMenuVisible()) {
|
if (!g_base->ui->MainMenuVisible()) {
|
||||||
BA_LOG_ONCE(LogLevel::kError,
|
BA_LOG_ONCE(LogLevel::kError,
|
||||||
@ -1518,7 +1518,7 @@ void Graphics::SetScreenResolution(float x, float y) {
|
|||||||
|
|
||||||
// Calc virtual res. In vr mode our virtual res is independent of our
|
// Calc virtual res. In vr mode our virtual res is independent of our
|
||||||
// screen size (since it gets drawn to an overlay).
|
// screen size (since it gets drawn to an overlay).
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
res_x_virtual_ = kBaseVirtualResX;
|
res_x_virtual_ = kBaseVirtualResX;
|
||||||
res_y_virtual_ = kBaseVirtualResY;
|
res_y_virtual_ = kBaseVirtualResY;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -390,32 +390,32 @@ class Graphics {
|
|||||||
int frame_def_count_filtered_{};
|
int frame_def_count_filtered_{};
|
||||||
int next_settings_index_{};
|
int next_settings_index_{};
|
||||||
TextureQuality texture_quality_placeholder_{};
|
TextureQuality texture_quality_placeholder_{};
|
||||||
bool drawing_transparent_only_ : 1 {};
|
bool drawing_transparent_only_{};
|
||||||
bool drawing_opaque_only_ : 1 {};
|
bool drawing_opaque_only_{};
|
||||||
bool internal_components_inited_ : 1 {};
|
bool internal_components_inited_{};
|
||||||
bool fade_out_ : 1 {true};
|
bool fade_out_{true};
|
||||||
bool progress_bar_ : 1 {};
|
bool progress_bar_{};
|
||||||
bool progress_bar_fade_in_ : 1 {};
|
bool progress_bar_fade_in_{};
|
||||||
bool debug_draw_ : 1 {};
|
bool debug_draw_{};
|
||||||
bool network_debug_display_enabled_ : 1 {};
|
bool network_debug_display_enabled_{};
|
||||||
bool hardware_cursor_visible_ : 1 {};
|
bool hardware_cursor_visible_{};
|
||||||
bool camera_shake_disabled_ : 1 {};
|
bool camera_shake_disabled_{};
|
||||||
bool camera_gyro_explicitly_disabled_ : 1 {};
|
bool camera_gyro_explicitly_disabled_{};
|
||||||
bool gyro_enabled_ : 1 {true};
|
bool gyro_enabled_{true};
|
||||||
bool show_fps_ : 1 {};
|
bool show_fps_{};
|
||||||
bool show_ping_ : 1 {};
|
bool show_ping_{};
|
||||||
bool show_net_info_ : 1 {};
|
bool show_net_info_{};
|
||||||
bool tv_border_ : 1 {};
|
bool tv_border_{};
|
||||||
bool floor_reflection_ : 1 {};
|
bool floor_reflection_{};
|
||||||
bool building_frame_def_ : 1 {};
|
bool building_frame_def_{};
|
||||||
bool shadow_ortho_ : 1 {};
|
bool shadow_ortho_{};
|
||||||
bool fetched_overlay_node_z_depth_ : 1 {};
|
bool fetched_overlay_node_z_depth_{};
|
||||||
bool gyro_broken_ : 1 {};
|
bool gyro_broken_{};
|
||||||
bool set_fade_start_on_next_draw_ : 1 {};
|
bool set_fade_start_on_next_draw_{};
|
||||||
bool graphics_settings_dirty_ : 1 {true};
|
bool graphics_settings_dirty_{true};
|
||||||
bool applied_app_config_ : 1 {};
|
bool applied_app_config_{};
|
||||||
bool sent_initial_graphics_settings_ : 1 {};
|
bool sent_initial_graphics_settings_{};
|
||||||
bool got_screen_resolution_ : 1 {};
|
bool got_screen_resolution_{};
|
||||||
Vector3f shadow_offset_{0.0f, 0.0f, 0.0f};
|
Vector3f shadow_offset_{0.0f, 0.0f, 0.0f};
|
||||||
Vector2f shadow_scale_{1.0f, 1.0f};
|
Vector2f shadow_scale_{1.0f, 1.0f};
|
||||||
Vector3f tint_{1.0f, 1.0f, 1.0f};
|
Vector3f tint_{1.0f, 1.0f, 1.0f};
|
||||||
|
|||||||
@ -140,16 +140,16 @@ auto GraphicsServer::WaitForRenderFrameDef_() -> FrameDef* {
|
|||||||
assert(g_base->app_adapter->InGraphicsContext());
|
assert(g_base->app_adapter->InGraphicsContext());
|
||||||
millisecs_t start_time = g_core->GetAppTimeMillisecs();
|
millisecs_t start_time = g_core->GetAppTimeMillisecs();
|
||||||
|
|
||||||
// Don't bother waiting if we can't/shouldn't render anyway.
|
|
||||||
if (!renderer_ || shutting_down_ || g_base->app_adapter->app_suspended()) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do some incremental loading every time we try to render.
|
|
||||||
g_base->assets->RunPendingGraphicsLoads();
|
|
||||||
|
|
||||||
// Spin and wait for a short bit for a frame_def to appear.
|
// Spin and wait for a short bit for a frame_def to appear.
|
||||||
while (true) {
|
while (true) {
|
||||||
|
// Stop waiting if we can't/shouldn't render anyway.
|
||||||
|
if (!renderer_ || shutting_down_ || g_base->app_adapter->app_suspended()) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do a bit of incremental loading every time through.
|
||||||
|
g_base->assets->RunPendingGraphicsLoads();
|
||||||
|
|
||||||
FrameDef* frame_def{};
|
FrameDef* frame_def{};
|
||||||
{
|
{
|
||||||
std::scoped_lock llock(frame_def_mutex_);
|
std::scoped_lock llock(frame_def_mutex_);
|
||||||
@ -166,10 +166,7 @@ auto GraphicsServer::WaitForRenderFrameDef_() -> FrameDef* {
|
|||||||
return frame_def;
|
return frame_def;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there's no frame_def for us, sleep for a bit and wait for it. But
|
// If there's no frame_def for us, sleep for a bit and wait for it.
|
||||||
// if we've been waiting for too long, give up. On some platforms such
|
|
||||||
// as Android, this frame will still get flipped whether we draw in it
|
|
||||||
// or not, so we *really* want to not skip drawing if we can help it.
|
|
||||||
millisecs_t t = g_core->GetAppTimeMillisecs() - start_time;
|
millisecs_t t = g_core->GetAppTimeMillisecs() - start_time;
|
||||||
if (t >= 1000) {
|
if (t >= 1000) {
|
||||||
if (g_buildconfig.debug_build()) {
|
if (g_buildconfig.debug_build()) {
|
||||||
@ -388,29 +385,6 @@ void GraphicsServer::UnloadRenderer() {
|
|||||||
renderer_loaded_ = false;
|
renderer_loaded_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Shouldn't have android-specific code in here.
|
|
||||||
void GraphicsServer::HandlePushAndroidRes(const std::string& android_res) {
|
|
||||||
if (g_buildconfig.ostype_android()) {
|
|
||||||
assert(renderer_);
|
|
||||||
if (renderer_ == nullptr) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// We push android res to the java layer here. We don't actually worry
|
|
||||||
// about screen-size-changed callbacks and whatnot, since those will
|
|
||||||
// happen automatically once things actually change. We just want to be
|
|
||||||
// sure that we have a renderer so we can calc what our auto res should
|
|
||||||
// be.
|
|
||||||
assert(renderer_);
|
|
||||||
std::string fin_res;
|
|
||||||
if (android_res == "Auto") {
|
|
||||||
fin_res = renderer_->GetAutoAndroidRes();
|
|
||||||
} else {
|
|
||||||
fin_res = android_res;
|
|
||||||
}
|
|
||||||
g_core->platform->AndroidSetResString(fin_res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GraphicsServer::SetTextureCompressionTypes(
|
void GraphicsServer::SetTextureCompressionTypes(
|
||||||
const std::list<TextureCompressionType>& types) {
|
const std::list<TextureCompressionType>& types) {
|
||||||
assert(g_base->app_adapter->InGraphicsContext());
|
assert(g_base->app_adapter->InGraphicsContext());
|
||||||
|
|||||||
@ -270,8 +270,6 @@ class GraphicsServer {
|
|||||||
return texture_quality_requested_;
|
return texture_quality_requested_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandlePushAndroidRes(const std::string& android_res);
|
|
||||||
|
|
||||||
auto texture_compression_types() const {
|
auto texture_compression_types() const {
|
||||||
assert(texture_compression_types_set_);
|
assert(texture_compression_types_set_);
|
||||||
return texture_compression_types_;
|
return texture_compression_types_;
|
||||||
@ -321,15 +319,15 @@ class GraphicsServer {
|
|||||||
TextureQuality texture_quality_{};
|
TextureQuality texture_quality_{};
|
||||||
GraphicsQualityRequest graphics_quality_requested_{};
|
GraphicsQualityRequest graphics_quality_requested_{};
|
||||||
GraphicsQuality graphics_quality_{};
|
GraphicsQuality graphics_quality_{};
|
||||||
bool renderer_loaded_ : 1 {};
|
bool renderer_loaded_{};
|
||||||
bool model_view_projection_matrix_dirty_ : 1 {true};
|
bool model_view_projection_matrix_dirty_{true};
|
||||||
bool model_world_matrix_dirty_ : 1 {true};
|
bool model_world_matrix_dirty_{true};
|
||||||
bool tv_border_ : 1 {};
|
bool tv_border_{};
|
||||||
bool renderer_context_lost_ : 1 {};
|
bool renderer_context_lost_{};
|
||||||
bool texture_compression_types_set_ : 1 {};
|
bool texture_compression_types_set_{};
|
||||||
bool cam_orient_matrix_dirty_ : 1 {true};
|
bool cam_orient_matrix_dirty_{true};
|
||||||
bool shutting_down_ : 1 {};
|
bool shutting_down_{};
|
||||||
bool shutdown_completed_ : 1 {};
|
bool shutdown_completed_{};
|
||||||
float res_x_{};
|
float res_x_{};
|
||||||
float res_y_{};
|
float res_y_{};
|
||||||
float res_x_virtual_{};
|
float res_x_virtual_{};
|
||||||
|
|||||||
@ -151,7 +151,7 @@ void GraphicsVR::DrawUI(FrameDef* frame_def) {
|
|||||||
void GraphicsVR::CalcVROverlayMatrices(FrameDef* frame_def) {
|
void GraphicsVR::CalcVROverlayMatrices(FrameDef* frame_def) {
|
||||||
// For VR mode, calc our overlay matrix for use in positioning overlay
|
// For VR mode, calc our overlay matrix for use in positioning overlay
|
||||||
// elements.
|
// elements.
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
Vector3f cam_target_pt(frame_def->cam_target_original());
|
Vector3f cam_target_pt(frame_def->cam_target_original());
|
||||||
Matrix44f vr_overlay_matrix{kMatrix44fIdentity};
|
Matrix44f vr_overlay_matrix{kMatrix44fIdentity};
|
||||||
Matrix44f vr_overlay_matrix_fixed{kMatrix44fIdentity};
|
Matrix44f vr_overlay_matrix_fixed{kMatrix44fIdentity};
|
||||||
@ -278,7 +278,7 @@ void GraphicsVR::DrawVROverlay(FrameDef* frame_def) {
|
|||||||
// the overlay-flat pass (otherwise it may get skipped).
|
// the overlay-flat pass (otherwise it may get skipped).
|
||||||
// This should be a safe assumption since this is pretty much just for
|
// This should be a safe assumption since this is pretty much just for
|
||||||
// widgets.
|
// widgets.
|
||||||
if (g_core->IsVRMode() && frame_def->overlay_flat_pass()->HasDrawCommands()) {
|
if (g_core->vr_mode() && frame_def->overlay_flat_pass()->HasDrawCommands()) {
|
||||||
// Draw our overlay-flat stuff into our overlay pass.
|
// Draw our overlay-flat stuff into our overlay pass.
|
||||||
SpecialComponent c(frame_def->overlay_pass(),
|
SpecialComponent c(frame_def->overlay_pass(),
|
||||||
SpecialComponent::Source::kVROverlayBuffer);
|
SpecialComponent::Source::kVROverlayBuffer);
|
||||||
@ -314,7 +314,7 @@ void GraphicsVR::DrawOverlayBounds(RenderPass* pass) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GraphicsVR::DrawVRControllers(FrameDef* frame_def) {
|
void GraphicsVR::DrawVRControllers(FrameDef* frame_def) {
|
||||||
if (!g_core->IsVRMode()) {
|
if (!g_core->vr_mode()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -126,7 +126,7 @@ void RenderPass::Render(RenderTarget* render_target, bool transparent) {
|
|||||||
case Type::kOverlayFlatPass: {
|
case Type::kOverlayFlatPass: {
|
||||||
// In vr mode we draw the flat-overlay into its own buffer so can use
|
// In vr mode we draw the flat-overlay into its own buffer so can use
|
||||||
// the full depth range (shouldn't matter but why not?...) shouldn't.
|
// the full depth range (shouldn't matter but why not?...) shouldn't.
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
// In vr mode, our overlay-flat pass is ortho-projected
|
// In vr mode, our overlay-flat pass is ortho-projected
|
||||||
// while our regular overlay is just rendered in world space using
|
// while our regular overlay is just rendered in world space using
|
||||||
// the vr-overlay matrix.
|
// the vr-overlay matrix.
|
||||||
|
|||||||
@ -21,7 +21,7 @@ void RenderTarget::OnScreenSizeChange() {
|
|||||||
|
|
||||||
auto RenderTarget::GetScissorX(float x) const -> float {
|
auto RenderTarget::GetScissorX(float x) const -> float {
|
||||||
assert(g_core);
|
assert(g_core);
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
// map -0.05f to 1.1f in logical coordinates to 0 to 1 physical ones
|
// map -0.05f to 1.1f in logical coordinates to 0 to 1 physical ones
|
||||||
float res_x_virtual = g_base->graphics_server->screen_virtual_width();
|
float res_x_virtual = g_base->graphics_server->screen_virtual_width();
|
||||||
return physical_width_
|
return physical_width_
|
||||||
@ -41,7 +41,7 @@ auto RenderTarget::GetScissorX(float x) const -> float {
|
|||||||
}
|
}
|
||||||
auto RenderTarget::GetScissorY(float y) const -> float {
|
auto RenderTarget::GetScissorY(float y) const -> float {
|
||||||
assert(g_core);
|
assert(g_core);
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
// map -0.05f to 1.1f in logical coordinates to 0 to 1 physical ones
|
// map -0.05f to 1.1f in logical coordinates to 0 to 1 physical ones
|
||||||
float res_y_virtual = g_base->graphics_server->screen_virtual_height();
|
float res_y_virtual = g_base->graphics_server->screen_virtual_height();
|
||||||
return physical_height_
|
return physical_height_
|
||||||
@ -62,7 +62,7 @@ auto RenderTarget::GetScissorY(float y) const -> float {
|
|||||||
}
|
}
|
||||||
auto RenderTarget::GetScissorScaleX() const -> float {
|
auto RenderTarget::GetScissorScaleX() const -> float {
|
||||||
assert(g_core);
|
assert(g_core);
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
float f = physical_width_ / g_base->graphics_server->screen_virtual_width();
|
float f = physical_width_ / g_base->graphics_server->screen_virtual_width();
|
||||||
return f / (1.0f + kVRBorder);
|
return f / (1.0f + kVRBorder);
|
||||||
} else {
|
} else {
|
||||||
@ -76,7 +76,7 @@ auto RenderTarget::GetScissorScaleX() const -> float {
|
|||||||
|
|
||||||
auto RenderTarget::GetScissorScaleY() const -> float {
|
auto RenderTarget::GetScissorScaleY() const -> float {
|
||||||
assert(g_core);
|
assert(g_core);
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
float f =
|
float f =
|
||||||
physical_height_ / g_base->graphics_server->screen_virtual_height();
|
physical_height_ / g_base->graphics_server->screen_virtual_height();
|
||||||
return f / (1.0f + kVRBorder);
|
return f / (1.0f + kVRBorder);
|
||||||
|
|||||||
@ -46,7 +46,7 @@ void Renderer::PreprocessFrameDef(FrameDef* frame_def) {
|
|||||||
// Some VR environments muck with render states before/after
|
// Some VR environments muck with render states before/after
|
||||||
// they call us; resync as needed....
|
// they call us; resync as needed....
|
||||||
#if BA_VR_BUILD
|
#if BA_VR_BUILD
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
VRSyncRenderStates();
|
VRSyncRenderStates();
|
||||||
}
|
}
|
||||||
#endif // BA_VR_BUILD
|
#endif // BA_VR_BUILD
|
||||||
@ -138,7 +138,7 @@ void Renderer::RenderFrameDef(FrameDef* frame_def) {
|
|||||||
#endif
|
#endif
|
||||||
backing->DrawBegin(backing_needs_clear);
|
backing->DrawBegin(backing_needs_clear);
|
||||||
|
|
||||||
bool overlays_in_3d = g_core->IsVRMode();
|
bool overlays_in_3d = g_core->vr_mode();
|
||||||
bool overlays_in_2d = !overlays_in_3d;
|
bool overlays_in_2d = !overlays_in_3d;
|
||||||
|
|
||||||
// Draw opaque stuff front-to-back.
|
// Draw opaque stuff front-to-back.
|
||||||
@ -245,7 +245,7 @@ void Renderer::FinishFrameDef(FrameDef* frame_def) {
|
|||||||
#if BA_VR_BUILD
|
#if BA_VR_BUILD
|
||||||
|
|
||||||
void Renderer::VRPreprocess(FrameDef* frame_def) {
|
void Renderer::VRPreprocess(FrameDef* frame_def) {
|
||||||
if (!g_core->IsVRMode()) {
|
if (!g_core->vr_mode()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,7 +330,7 @@ void Renderer::VRPreprocess(FrameDef* frame_def) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::VRUpdateForEyeRender(FrameDef* frame_def) {
|
void Renderer::VRUpdateForEyeRender(FrameDef* frame_def) {
|
||||||
if (!g_core->IsVRMode()) {
|
if (!g_core->vr_mode()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
VREyeRenderBegin();
|
VREyeRenderBegin();
|
||||||
@ -381,7 +381,7 @@ void Renderer::VRUpdateForEyeRender(FrameDef* frame_def) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::VRDrawOverlayFlatPass(FrameDef* frame_def) {
|
void Renderer::VRDrawOverlayFlatPass(FrameDef* frame_def) {
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
// The overlay-flat pass should generally only have commands in it
|
// The overlay-flat pass should generally only have commands in it
|
||||||
// when UI is visible; skip rendering it if not.
|
// when UI is visible; skip rendering it if not.
|
||||||
if (frame_def->overlay_flat_pass()->HasDrawCommands()) {
|
if (frame_def->overlay_flat_pass()->HasDrawCommands()) {
|
||||||
@ -437,7 +437,7 @@ void Renderer::UpdateSizesQualitiesAndColors(FrameDef* frame_def) {
|
|||||||
if (last_render_quality_ != frame_def->quality()) {
|
if (last_render_quality_ != frame_def->quality()) {
|
||||||
light_render_target_.Clear();
|
light_render_target_.Clear();
|
||||||
light_shadow_render_target_.Clear();
|
light_shadow_render_target_.Clear();
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
vr_overlay_flat_render_target_.Clear();
|
vr_overlay_flat_render_target_.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -450,7 +450,7 @@ void Renderer::UpdateSizesQualitiesAndColors(FrameDef* frame_def) {
|
|||||||
set_tint(1.5f * frame_def->tint()); // FIXME; why the 1.5?
|
set_tint(1.5f * frame_def->tint()); // FIXME; why the 1.5?
|
||||||
set_ambient_color(frame_def->ambient_color());
|
set_ambient_color(frame_def->ambient_color());
|
||||||
set_vignette_inner(frame_def->vignette_inner());
|
set_vignette_inner(frame_def->vignette_inner());
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
// In VR mode we dont want vignetting;
|
// In VR mode we dont want vignetting;
|
||||||
// just use the inner color for both in and out.
|
// just use the inner color for both in and out.
|
||||||
set_vignette_outer(frame_def->vignette_inner());
|
set_vignette_outer(frame_def->vignette_inner());
|
||||||
|
|||||||
@ -23,8 +23,8 @@ const float kPanMax = 9.0f;
|
|||||||
const float kPanMin = -9.0f;
|
const float kPanMin = -9.0f;
|
||||||
|
|
||||||
Camera::Camera()
|
Camera::Camera()
|
||||||
: lock_panning_(g_core->IsVRMode()),
|
: lock_panning_(g_core->vr_mode()),
|
||||||
pan_speed_scale_(g_core->IsVRMode() ? 0.3f : 1.0f) {}
|
pan_speed_scale_(g_core->vr_mode() ? 0.3f : 1.0f) {}
|
||||||
|
|
||||||
Camera::~Camera() = default;
|
Camera::~Camera() = default;
|
||||||
|
|
||||||
@ -201,7 +201,7 @@ void Camera::UpdatePosition() {
|
|||||||
if (explicit_bool(true)) {
|
if (explicit_bool(true)) {
|
||||||
float lr_jitter;
|
float lr_jitter;
|
||||||
{
|
{
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
lr_jitter = 0.0f;
|
lr_jitter = 0.0f;
|
||||||
} else {
|
} else {
|
||||||
lr_jitter =
|
lr_jitter =
|
||||||
@ -492,7 +492,7 @@ void Camera::UpdatePosition() {
|
|||||||
// our fixed-overlay matrix and our regular overlay matrix come out
|
// our fixed-overlay matrix and our regular overlay matrix come out
|
||||||
// the same.
|
// the same.
|
||||||
if (g_buildconfig.vr_build()) {
|
if (g_buildconfig.vr_build()) {
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
// Only apply map's X offset if camera is locked.
|
// Only apply map's X offset if camera is locked.
|
||||||
x_min = x_max =
|
x_min = x_max =
|
||||||
position_.x
|
position_.x
|
||||||
@ -614,7 +614,7 @@ void Camera::Update(millisecs_t elapsed) {
|
|||||||
auto elapsedf{static_cast<float>(elapsed)};
|
auto elapsedf{static_cast<float>(elapsed)};
|
||||||
|
|
||||||
// In normal mode we orbit; in vr mode we don't.
|
// In normal mode we orbit; in vr mode we don't.
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
heading_ = -0.3f;
|
heading_ = -0.3f;
|
||||||
} else {
|
} else {
|
||||||
heading_ += static_cast<float>(elapsed) / 10000.0f;
|
heading_ += static_cast<float>(elapsed) / 10000.0f;
|
||||||
@ -652,7 +652,7 @@ void Camera::Update(millisecs_t elapsed) {
|
|||||||
xy_constrain_blend_ = std::max(0.0f, xy_constrain_blend_);
|
xy_constrain_blend_ = std::max(0.0f, xy_constrain_blend_);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_core->IsVRMode()) {
|
if (!g_core->vr_mode()) {
|
||||||
smooth_speed_.x +=
|
smooth_speed_.x +=
|
||||||
elapsedf * rand_component
|
elapsedf * rand_component
|
||||||
* (-0.5f
|
* (-0.5f
|
||||||
@ -667,7 +667,7 @@ void Camera::Update(millisecs_t elapsed) {
|
|||||||
+ Utils::precalc_rand_3((time_ / rand_incr_3) % kPrecalcRandsCount));
|
+ Utils::precalc_rand_3((time_ / rand_incr_3) % kPrecalcRandsCount));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RandomFloat() < 0.1f && !g_core->IsVRMode()) {
|
if (RandomFloat() < 0.1f && !g_core->vr_mode()) {
|
||||||
smooth_speed_2_.x +=
|
smooth_speed_2_.x +=
|
||||||
elapsedf * rand_component * 4.0f * (-0.5f + RandomFloat());
|
elapsedf * rand_component * 4.0f * (-0.5f + RandomFloat());
|
||||||
smooth_speed_2_.y +=
|
smooth_speed_2_.y +=
|
||||||
@ -736,13 +736,13 @@ void Camera::Update(millisecs_t elapsed) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update audio position more often in vr since we can whip our head around.
|
// Update audio position more often in vr since we can whip our head around.
|
||||||
uint32_t interval = g_core->IsVRMode() ? 50 : 100;
|
uint32_t interval = g_core->vr_mode() ? 50 : 100;
|
||||||
|
|
||||||
// Occasionally, update microphone position for audio.
|
// Occasionally, update microphone position for audio.
|
||||||
if (time_ - last_listener_update_time_ > interval) {
|
if (time_ - last_listener_update_time_ > interval) {
|
||||||
last_listener_update_time_ = time_;
|
last_listener_update_time_ = time_;
|
||||||
bool do_regular_update = true;
|
bool do_regular_update = true;
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
#if BA_VR_MODE
|
#if BA_VR_MODE
|
||||||
GraphicsVR* vrgraphics = GraphicsVR::get();
|
GraphicsVR* vrgraphics = GraphicsVR::get();
|
||||||
do_regular_update = false;
|
do_regular_update = false;
|
||||||
@ -984,7 +984,7 @@ void Camera::ApplyToFrameDef(FrameDef* frame_def) {
|
|||||||
|
|
||||||
// If we're vr, apply current vr offsets.
|
// If we're vr, apply current vr offsets.
|
||||||
// FIXME: should create a VRCamera subclass or whatnot.
|
// FIXME: should create a VRCamera subclass or whatnot.
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
if (mode_ == CameraMode::kFollow) {
|
if (mode_ == CameraMode::kFollow) {
|
||||||
Vector3f cam_original = frame_def->cam_original();
|
Vector3f cam_original = frame_def->cam_original();
|
||||||
|
|
||||||
|
|||||||
@ -93,25 +93,25 @@ class Camera : public Object {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
CameraMode mode_{CameraMode::kFollow};
|
CameraMode mode_{CameraMode::kFollow};
|
||||||
bool manual_ : 1 {};
|
bool manual_{};
|
||||||
bool smooth_next_frame_ : 1 {};
|
bool smooth_next_frame_{};
|
||||||
bool have_real_areas_of_interest_ : 1 {};
|
bool have_real_areas_of_interest_{};
|
||||||
bool lock_panning_ : 1 {};
|
bool lock_panning_{};
|
||||||
|
|
||||||
// Manual stuff.
|
// Manual stuff.
|
||||||
bool panning_ : 1 {};
|
bool panning_{};
|
||||||
bool orbiting_ : 1 {};
|
bool orbiting_{};
|
||||||
bool rolling_ : 1 {};
|
bool rolling_{};
|
||||||
bool trucking_ : 1 {};
|
bool trucking_{};
|
||||||
bool alt_down_ : 1 {};
|
bool alt_down_{};
|
||||||
bool cmd_down_ : 1 {};
|
bool cmd_down_{};
|
||||||
bool ctrl_down_ : 1 {};
|
bool ctrl_down_{};
|
||||||
bool mouse_left_down_ : 1 {};
|
bool mouse_left_down_{};
|
||||||
bool mouse_middle_down_ : 1 {};
|
bool mouse_middle_down_{};
|
||||||
bool mouse_right_down_ : 1 {};
|
bool mouse_right_down_{};
|
||||||
|
|
||||||
bool happy_thoughts_mode_ : 1 {};
|
bool happy_thoughts_mode_{};
|
||||||
bool x_constrained_ : 1 {true};
|
bool x_constrained_{true};
|
||||||
float pan_speed_scale_{1.0f};
|
float pan_speed_scale_{1.0f};
|
||||||
float heading_{kInitialHeading};
|
float heading_{kInitialHeading};
|
||||||
float area_of_interest_bounds_[6]{-9999, -9999, -9999, 9999, 9999, 9999};
|
float area_of_interest_bounds_[6]{-9999, -9999, -9999, 9999, 9999, 9999};
|
||||||
|
|||||||
@ -31,7 +31,7 @@ FrameDef::~FrameDef() { assert(g_base->InLogicThread()); }
|
|||||||
|
|
||||||
auto FrameDef::GetOverlayFixedPass() -> RenderPass* {
|
auto FrameDef::GetOverlayFixedPass() -> RenderPass* {
|
||||||
assert(g_core);
|
assert(g_core);
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
return overlay_fixed_pass_.get();
|
return overlay_fixed_pass_.get();
|
||||||
} else {
|
} else {
|
||||||
return overlay_pass_.get();
|
return overlay_pass_.get();
|
||||||
@ -40,7 +40,7 @@ auto FrameDef::GetOverlayFixedPass() -> RenderPass* {
|
|||||||
|
|
||||||
auto FrameDef::GetOverlayFlatPass() -> RenderPass* {
|
auto FrameDef::GetOverlayFlatPass() -> RenderPass* {
|
||||||
assert(g_core);
|
assert(g_core);
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
return overlay_flat_pass_.get();
|
return overlay_flat_pass_.get();
|
||||||
} else {
|
} else {
|
||||||
return overlay_pass_.get();
|
return overlay_pass_.get();
|
||||||
@ -102,7 +102,7 @@ void FrameDef::Reset() {
|
|||||||
beauty_pass_bg_->Reset();
|
beauty_pass_bg_->Reset();
|
||||||
overlay_pass_->Reset();
|
overlay_pass_->Reset();
|
||||||
overlay_front_pass_->Reset();
|
overlay_front_pass_->Reset();
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
overlay_flat_pass_->Reset();
|
overlay_flat_pass_->Reset();
|
||||||
overlay_fixed_pass_->Reset();
|
overlay_fixed_pass_->Reset();
|
||||||
vr_cover_pass_->Reset();
|
vr_cover_pass_->Reset();
|
||||||
@ -120,7 +120,7 @@ void FrameDef::Complete() {
|
|||||||
beauty_pass_bg_->Complete();
|
beauty_pass_bg_->Complete();
|
||||||
overlay_pass_->Complete();
|
overlay_pass_->Complete();
|
||||||
overlay_front_pass_->Complete();
|
overlay_front_pass_->Complete();
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
overlay_fixed_pass_->Complete();
|
overlay_fixed_pass_->Complete();
|
||||||
overlay_flat_pass_->Complete();
|
overlay_flat_pass_->Complete();
|
||||||
vr_cover_pass_->Complete();
|
vr_cover_pass_->Complete();
|
||||||
|
|||||||
@ -222,11 +222,11 @@ class FrameDef {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Object::Ref<Snapshot<GraphicsSettings>> settings_snapshot_;
|
Object::Ref<Snapshot<GraphicsSettings>> settings_snapshot_;
|
||||||
bool needs_clear_ : 1 {};
|
bool needs_clear_{};
|
||||||
bool rendering_ : 1 {};
|
bool rendering_{};
|
||||||
bool orbiting_ : 1 {};
|
bool orbiting_{};
|
||||||
// bool tv_border_ : 1 {};
|
// bool tv_border_{};
|
||||||
bool shadow_ortho_ : 1 {};
|
bool shadow_ortho_{};
|
||||||
BenchmarkType benchmark_type_{BenchmarkType::kNone};
|
BenchmarkType benchmark_type_{BenchmarkType::kNone};
|
||||||
CameraMode camera_mode_{CameraMode::kFollow};
|
CameraMode camera_mode_{CameraMode::kFollow};
|
||||||
Vector3f cam_original_{0.0f, 0.0f, 0.0f};
|
Vector3f cam_original_{0.0f, 0.0f, 0.0f};
|
||||||
|
|||||||
@ -81,7 +81,7 @@ void ScreenMessages::DrawMiscOverlays(FrameDef* frame_def) {
|
|||||||
|
|
||||||
// Draw all existing.
|
// Draw all existing.
|
||||||
if (!screen_messages_.empty()) {
|
if (!screen_messages_.empty()) {
|
||||||
bool vr = g_core->IsVRMode();
|
bool vr = g_core->vr_mode();
|
||||||
|
|
||||||
// These are less disruptive in the middle for menus but at the bottom
|
// These are less disruptive in the middle for menus but at the bottom
|
||||||
// during gameplay.
|
// during gameplay.
|
||||||
|
|||||||
@ -683,7 +683,7 @@ void JoystickInput::HandleSDLEvent(const SDL_Event* e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// On our Oculus build, select presses reset the orientation.
|
// On our Oculus build, select presses reset the orientation.
|
||||||
if (e->jbutton.button == vr_reorient_button_ && g_core->IsVRMode()) {
|
if (e->jbutton.button == vr_reorient_button_ && g_core->vr_mode()) {
|
||||||
ScreenMessage(g_base->assets->GetResourceString("vrOrientationResetText"),
|
ScreenMessage(g_base->assets->GetResourceString("vrOrientationResetText"),
|
||||||
{0, 1, 0});
|
{0, 1, 0});
|
||||||
g_core->reset_vr_orientation = true;
|
g_core->reset_vr_orientation = true;
|
||||||
|
|||||||
@ -102,34 +102,34 @@ class JoystickInput : public InputDevice {
|
|||||||
// constructor)
|
// constructor)
|
||||||
SDL_Joystick* sdl_joystick_{};
|
SDL_Joystick* sdl_joystick_{};
|
||||||
|
|
||||||
bool ui_only_ : 1 {};
|
bool ui_only_{};
|
||||||
bool unassigned_buttons_run_ : 1 {true};
|
bool unassigned_buttons_run_{true};
|
||||||
bool start_button_activates_default_widget_ : 1 {true};
|
bool start_button_activates_default_widget_{true};
|
||||||
bool auto_recalibrate_analog_stick_ : 1 {};
|
bool auto_recalibrate_analog_stick_{};
|
||||||
bool did_initial_reset_ : 1 {};
|
bool did_initial_reset_{};
|
||||||
bool is_test_input_ : 1 {};
|
bool is_test_input_{};
|
||||||
bool is_remote_control_ : 1 {};
|
bool is_remote_control_{};
|
||||||
bool is_remote_app_ : 1 {};
|
bool is_remote_app_{};
|
||||||
bool is_mfi_controller_ : 1 {};
|
bool is_mfi_controller_{};
|
||||||
|
|
||||||
// For dialogs.
|
// For dialogs.
|
||||||
bool left_held_ : 1 {};
|
bool left_held_{};
|
||||||
bool right_held_ : 1 {};
|
bool right_held_{};
|
||||||
bool up_held_ : 1 {};
|
bool up_held_{};
|
||||||
bool down_held_ : 1 {};
|
bool down_held_{};
|
||||||
bool hold_position_held_ : 1 {};
|
bool hold_position_held_{};
|
||||||
bool need_to_send_held_state_ : 1 {};
|
bool need_to_send_held_state_{};
|
||||||
|
|
||||||
bool hat_held_ : 1 {};
|
bool hat_held_{};
|
||||||
bool dpad_right_held_ : 1 {};
|
bool dpad_right_held_{};
|
||||||
bool dpad_left_held_ : 1 {};
|
bool dpad_left_held_{};
|
||||||
bool dpad_up_held_ : 1 {};
|
bool dpad_up_held_{};
|
||||||
bool dpad_down_held_ : 1 {};
|
bool dpad_down_held_{};
|
||||||
|
|
||||||
bool ignore_completely_ : 1 {};
|
bool ignore_completely_{};
|
||||||
bool resetting_ : 1 {};
|
bool resetting_{};
|
||||||
bool calibrate_ : 1 {};
|
bool calibrate_{};
|
||||||
bool can_configure_ : 1 {};
|
bool can_configure_{};
|
||||||
|
|
||||||
int hat_{0};
|
int hat_{0};
|
||||||
int analog_lr_{0};
|
int analog_lr_{0};
|
||||||
|
|||||||
@ -32,15 +32,15 @@ class KeyboardInput : public InputDevice {
|
|||||||
private:
|
private:
|
||||||
void UpdateArrowKeys_(SDL_Keycode key);
|
void UpdateArrowKeys_(SDL_Keycode key);
|
||||||
void UpdateRun_(SDL_Keycode key, bool down);
|
void UpdateRun_(SDL_Keycode key, bool down);
|
||||||
bool down_held_ : 1 {};
|
bool down_held_{};
|
||||||
bool up_held_ : 1 {};
|
bool up_held_{};
|
||||||
bool left_held_ : 1 {};
|
bool left_held_{};
|
||||||
bool right_held_ : 1 {};
|
bool right_held_{};
|
||||||
bool enable_child_ : 1 {};
|
bool enable_child_{};
|
||||||
bool left_key_assigned_ : 1 {};
|
bool left_key_assigned_{};
|
||||||
bool right_key_assigned_ : 1 {};
|
bool right_key_assigned_{};
|
||||||
bool up_key_assigned_ : 1 {};
|
bool up_key_assigned_{};
|
||||||
bool down_key_assigned_ : 1 {};
|
bool down_key_assigned_{};
|
||||||
SDL_Keycode up_key_{};
|
SDL_Keycode up_key_{};
|
||||||
SDL_Keycode down_key_{};
|
SDL_Keycode down_key_{};
|
||||||
SDL_Keycode left_key_{};
|
SDL_Keycode left_key_{};
|
||||||
|
|||||||
@ -20,13 +20,13 @@ class TestInput {
|
|||||||
int lr_{};
|
int lr_{};
|
||||||
int ud_{};
|
int ud_{};
|
||||||
int join_press_count_{};
|
int join_press_count_{};
|
||||||
bool jump_pressed_ : 1 {};
|
bool jump_pressed_{};
|
||||||
bool bomb_pressed_ : 1 {};
|
bool bomb_pressed_{};
|
||||||
bool pickup_pressed_ : 1 {};
|
bool pickup_pressed_{};
|
||||||
bool punch_pressed_ : 1 {};
|
bool punch_pressed_{};
|
||||||
bool print_non_join_ : 1 {};
|
bool print_non_join_{};
|
||||||
bool print_already_did2_ : 1 {};
|
bool print_already_did2_{};
|
||||||
bool reset_ : 1 {true};
|
bool reset_{true};
|
||||||
millisecs_t next_event_time_{};
|
millisecs_t next_event_time_{};
|
||||||
millisecs_t join_start_time_{};
|
millisecs_t join_start_time_{};
|
||||||
millisecs_t join_end_time_{9999};
|
millisecs_t join_end_time_{9999};
|
||||||
|
|||||||
@ -185,10 +185,10 @@ class Input {
|
|||||||
int mouse_move_count_{};
|
int mouse_move_count_{};
|
||||||
int input_lock_count_temp_{};
|
int input_lock_count_temp_{};
|
||||||
int input_lock_count_permanent_{};
|
int input_lock_count_permanent_{};
|
||||||
bool input_active_ : 1 {};
|
bool input_active_{};
|
||||||
bool have_button_using_inputs_ : 1 {};
|
bool have_button_using_inputs_{};
|
||||||
bool have_start_activated_default_button_inputs_ : 1 {};
|
bool have_start_activated_default_button_inputs_{};
|
||||||
bool have_non_touch_inputs_ : 1 {};
|
bool have_non_touch_inputs_{};
|
||||||
millisecs_t input_idle_time_{};
|
millisecs_t input_idle_time_{};
|
||||||
millisecs_t last_get_local_active_input_device_count_check_time_{};
|
millisecs_t last_get_local_active_input_device_count_check_time_{};
|
||||||
float cursor_pos_x_{};
|
float cursor_pos_x_{};
|
||||||
|
|||||||
@ -140,13 +140,13 @@ class Logic {
|
|||||||
seconds_t recent_display_time_increments_[kDisplayTimeSampleCount]{};
|
seconds_t recent_display_time_increments_[kDisplayTimeSampleCount]{};
|
||||||
int recent_display_time_increments_index_{-1};
|
int recent_display_time_increments_index_{-1};
|
||||||
|
|
||||||
bool app_bootstrapping_complete_ : 1 {};
|
bool app_bootstrapping_complete_{};
|
||||||
bool have_pending_loads_ : 1 {};
|
bool have_pending_loads_{};
|
||||||
bool debug_log_display_time_ : 1 {};
|
bool debug_log_display_time_{};
|
||||||
bool applied_app_config_ : 1 {};
|
bool applied_app_config_{};
|
||||||
bool shutting_down_ : 1 {};
|
bool shutting_down_{};
|
||||||
bool shutdown_completed_ : 1 {};
|
bool shutdown_completed_{};
|
||||||
bool graphics_ready_ : 1 {};
|
bool graphics_ready_{};
|
||||||
Timer* process_pending_work_timer_{};
|
Timer* process_pending_work_timer_{};
|
||||||
EventLoop* event_loop_{};
|
EventLoop* event_loop_{};
|
||||||
std::unique_ptr<TimerList> display_timers_;
|
std::unique_ptr<TimerList> display_timers_;
|
||||||
|
|||||||
@ -107,7 +107,7 @@ void BasePlatform::PurchaseAck(const std::string& purchase,
|
|||||||
void BasePlatform::OpenURL(const std::string& url) {
|
void BasePlatform::OpenURL(const std::string& url) {
|
||||||
// Can't open URLs in VR - just tell the Python layer to show the url in the
|
// Can't open URLs in VR - just tell the Python layer to show the url in the
|
||||||
// gui.
|
// gui.
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
g_base->ui->ShowURL(url);
|
g_base->ui->ShowURL(url);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -119,7 +119,7 @@ class BasePlatform {
|
|||||||
virtual ~BasePlatform();
|
virtual ~BasePlatform();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool ran_base_post_init_ : 1 {};
|
bool ran_base_post_init_{};
|
||||||
PythonRef string_edit_adapter_{};
|
PythonRef string_edit_adapter_{};
|
||||||
std::string public_device_uuid_;
|
std::string public_device_uuid_;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -149,7 +149,7 @@ void PythonClassEnv::SetupType(PyTypeObject* cls) {
|
|||||||
BoolEntry_(g_core->platform->IsRunningOnTV(),
|
BoolEntry_(g_core->platform->IsRunningOnTV(),
|
||||||
"Whether the app is targeting a TV-centric experience.");
|
"Whether the app is targeting a TV-centric experience.");
|
||||||
|
|
||||||
envs["vr"] = BoolEntry_(g_core->IsVRMode(),
|
envs["vr"] = BoolEntry_(g_core->vr_mode(),
|
||||||
"Whether the app is currently running in VR.");
|
"Whether the app is currently running in VR.");
|
||||||
|
|
||||||
envs["arcade"] =
|
envs["arcade"] =
|
||||||
|
|||||||
@ -751,7 +751,7 @@ static auto PyEnv(PyObject* self) -> PyObject* {
|
|||||||
"subplatform", g_core->platform->GetSubplatformName().c_str(),
|
"subplatform", g_core->platform->GetSubplatformName().c_str(),
|
||||||
"ui_scale", ui_scale,
|
"ui_scale", ui_scale,
|
||||||
"on_tv", g_core->platform->IsRunningOnTV() ? Py_True : Py_False,
|
"on_tv", g_core->platform->IsRunningOnTV() ? Py_True : Py_False,
|
||||||
"vr_mode", g_core->IsVRMode() ? Py_True : Py_False,
|
"vr_mode", g_core->vr_mode() ? Py_True : Py_False,
|
||||||
"demo_mode", g_buildconfig.demo_build() ? Py_True : Py_False,
|
"demo_mode", g_buildconfig.demo_build() ? Py_True : Py_False,
|
||||||
"arcade_mode", g_buildconfig.arcade_build() ? Py_True : Py_False,
|
"arcade_mode", g_buildconfig.arcade_build() ? Py_True : Py_False,
|
||||||
"headless_mode", g_core->HeadlessMode() ? Py_True : Py_False,
|
"headless_mode", g_core->HeadlessMode() ? Py_True : Py_False,
|
||||||
|
|||||||
@ -349,13 +349,7 @@ static PyMethodDef PySafeColorDef = {
|
|||||||
|
|
||||||
static auto PyGetMaxGraphicsQuality(PyObject* self) -> PyObject* {
|
static auto PyGetMaxGraphicsQuality(PyObject* self) -> PyObject* {
|
||||||
BA_PYTHON_TRY;
|
BA_PYTHON_TRY;
|
||||||
// if (g_base->graphics
|
// Currently all our supported devices can go up to higher.
|
||||||
// && g_base->graphics->has_supports_high_quality_graphics_value()
|
|
||||||
// && g_base->graphics->supports_high_quality_graphics()) {
|
|
||||||
// return Py_BuildValue("s", "High");
|
|
||||||
// } else {
|
|
||||||
// return Py_BuildValue("s", "Medium");
|
|
||||||
// }
|
|
||||||
return Py_BuildValue("s", "Higher");
|
return Py_BuildValue("s", "Higher");
|
||||||
BA_PYTHON_CATCH;
|
BA_PYTHON_CATCH;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -100,7 +100,7 @@ auto BaseBuildSwitches::CreateAppAdapter() -> AppAdapter* {
|
|||||||
app_adapter = new AppAdapterApple();
|
app_adapter = new AppAdapterApple();
|
||||||
#elif BA_RIFT_BUILD
|
#elif BA_RIFT_BUILD
|
||||||
// Rift build can spin up in either VR or regular mode.
|
// Rift build can spin up in either VR or regular mode.
|
||||||
if (g_core->vr_mode) {
|
if (g_core->vr_mode()) {
|
||||||
app_adapter = new AppAdapterVR();
|
app_adapter = new AppAdapterVR();
|
||||||
} else {
|
} else {
|
||||||
app_adapter = new AppAdapterSDL();
|
app_adapter = new AppAdapterSDL();
|
||||||
|
|||||||
@ -92,13 +92,13 @@ class DevConsole {
|
|||||||
int carat_char_{0};
|
int carat_char_{0};
|
||||||
State_ state_{State_::kInactive};
|
State_ state_{State_::kInactive};
|
||||||
State_ state_prev_{State_::kInactive};
|
State_ state_prev_{State_::kInactive};
|
||||||
bool input_text_dirty_ : 1 {true};
|
bool input_text_dirty_{true};
|
||||||
bool input_enabled_ : 1 {};
|
bool input_enabled_{};
|
||||||
bool last_line_mesh_dirty_ : 1 {true};
|
bool last_line_mesh_dirty_{true};
|
||||||
bool python_terminal_visible_ : 1 {};
|
bool python_terminal_visible_{};
|
||||||
bool python_terminal_pressed_ : 1 {};
|
bool python_terminal_pressed_{};
|
||||||
bool refresh_pending_ : 1 {};
|
bool refresh_pending_{};
|
||||||
bool carat_dirty_ : 1 {true};
|
bool carat_dirty_{true};
|
||||||
float carat_x_{};
|
float carat_x_{};
|
||||||
seconds_t transition_start_{};
|
seconds_t transition_start_{};
|
||||||
millisecs_t last_carat_x_change_time_{};
|
millisecs_t last_carat_x_change_time_{};
|
||||||
|
|||||||
@ -39,7 +39,7 @@ UI::UI() {
|
|||||||
}
|
}
|
||||||
if (!force_scale_) {
|
if (!force_scale_) {
|
||||||
// Use automatic val.
|
// Use automatic val.
|
||||||
if (g_core->IsVRMode() || g_core->platform->IsRunningOnTV()) {
|
if (g_core->vr_mode() || g_core->platform->IsRunningOnTV()) {
|
||||||
// VR and TV modes always use medium.
|
// VR and TV modes always use medium.
|
||||||
scale_ = UIScale::kMedium;
|
scale_ = UIScale::kMedium;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -20,7 +20,7 @@ void StressTest::Set(bool enable, int player_count) {
|
|||||||
// If we're turning on, reset our intervals and things.
|
// If we're turning on, reset our intervals and things.
|
||||||
if (!was_stress_testing && stress_testing_) {
|
if (!was_stress_testing && stress_testing_) {
|
||||||
// So our first sample is 1 interval from now.
|
// So our first sample is 1 interval from now.
|
||||||
last_stress_test_update_time_ = g_core->GetAppTimeMillisecs();
|
// last_stress_test_update_time_ = g_core->GetAppTimeMillisecs();
|
||||||
|
|
||||||
// Reset our frames-rendered tally.
|
// Reset our frames-rendered tally.
|
||||||
if (g_base && g_base->graphics_server
|
if (g_base && g_base->graphics_server
|
||||||
@ -47,62 +47,6 @@ void StressTest::Update() {
|
|||||||
if (stress_testing_ && g_base->input) {
|
if (stress_testing_ && g_base->input) {
|
||||||
// Update our fake inputs to make our dudes run around.
|
// Update our fake inputs to make our dudes run around.
|
||||||
ProcessInputs(stress_test_player_count_);
|
ProcessInputs(stress_test_player_count_);
|
||||||
|
|
||||||
// Every 10 seconds update our stress-test stats.
|
|
||||||
millisecs_t t = g_core->GetAppTimeMillisecs();
|
|
||||||
if (t - last_stress_test_update_time_ >= 10000) {
|
|
||||||
if (stress_test_stats_file_ == nullptr) {
|
|
||||||
assert(g_core);
|
|
||||||
auto user_python_dir = g_core->GetUserPythonDirectory();
|
|
||||||
if (user_python_dir) {
|
|
||||||
std::string f_name = *user_python_dir + "/stress_test_stats.csv";
|
|
||||||
stress_test_stats_file_ =
|
|
||||||
g_core->platform->FOpen(f_name.c_str(), "wb");
|
|
||||||
if (stress_test_stats_file_ != nullptr) {
|
|
||||||
fprintf(stress_test_stats_file_,
|
|
||||||
"time,averageFps,nodes,meshes,collision_meshes,textures,"
|
|
||||||
"sounds,"
|
|
||||||
"pssMem,sharedDirtyMem,privateDirtyMem\n");
|
|
||||||
fflush(stress_test_stats_file_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (stress_test_stats_file_ != nullptr) {
|
|
||||||
// See how many frames we've rendered this past interval.
|
|
||||||
int total_frames_rendered;
|
|
||||||
if (g_base && g_base->graphics_server
|
|
||||||
&& g_base->graphics_server->renderer()) {
|
|
||||||
total_frames_rendered =
|
|
||||||
g_base->graphics_server->renderer()->total_frames_rendered();
|
|
||||||
} else {
|
|
||||||
total_frames_rendered = last_total_frames_rendered_;
|
|
||||||
}
|
|
||||||
float avg =
|
|
||||||
static_cast<float>(total_frames_rendered
|
|
||||||
- last_total_frames_rendered_)
|
|
||||||
/ (static_cast<float>(t - last_stress_test_update_time_) / 1000.0f);
|
|
||||||
last_total_frames_rendered_ = total_frames_rendered;
|
|
||||||
uint32_t mesh_count = 0;
|
|
||||||
uint32_t collision_mesh_count = 0;
|
|
||||||
uint32_t texture_count = 0;
|
|
||||||
uint32_t sound_count = 0;
|
|
||||||
uint32_t node_count = 0;
|
|
||||||
if (g_base) {
|
|
||||||
mesh_count = g_base->assets->total_mesh_count();
|
|
||||||
collision_mesh_count = g_base->assets->total_collision_mesh_count();
|
|
||||||
texture_count = g_base->assets->total_texture_count();
|
|
||||||
sound_count = g_base->assets->total_sound_count();
|
|
||||||
}
|
|
||||||
assert(g_base->logic);
|
|
||||||
std::string mem_usage = g_core->platform->GetMemUsageInfo();
|
|
||||||
fprintf(stress_test_stats_file_, "%d,%.1f,%d,%d,%d,%d,%d,%s\n",
|
|
||||||
static_cast_check_fit<int>(g_core->GetAppTimeMillisecs()), avg,
|
|
||||||
node_count, mesh_count, collision_mesh_count, texture_count,
|
|
||||||
sound_count, mem_usage.c_str());
|
|
||||||
fflush(stress_test_stats_file_);
|
|
||||||
}
|
|
||||||
last_stress_test_update_time_ = t;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -22,9 +22,9 @@ class StressTest {
|
|||||||
millisecs_t stress_test_last_leave_time_{};
|
millisecs_t stress_test_last_leave_time_{};
|
||||||
int stress_test_player_count_{8};
|
int stress_test_player_count_{8};
|
||||||
int last_total_frames_rendered_{};
|
int last_total_frames_rendered_{};
|
||||||
bool stress_testing_ : 1 {};
|
bool stress_testing_{};
|
||||||
millisecs_t last_stress_test_update_time_{};
|
// millisecs_t last_stress_test_update_time_{};
|
||||||
FILE* stress_test_stats_file_{};
|
// FILE* stress_test_stats_file_{};
|
||||||
Object::Ref<base::AppTimer> update_timer_{};
|
Object::Ref<base::AppTimer> update_timer_{};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -82,12 +82,12 @@ void CoreFeatureSet::DoImport(const CoreConfig& config) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CoreFeatureSet::CoreFeatureSet(CoreConfig config)
|
CoreFeatureSet::CoreFeatureSet(CoreConfig config)
|
||||||
: main_thread_id{std::this_thread::get_id()},
|
: main_thread_id_{std::this_thread::get_id()},
|
||||||
python{new CorePython()},
|
python{new CorePython()},
|
||||||
platform{CorePlatform::Create()},
|
platform{CorePlatform::Create()},
|
||||||
core_config_{std::move(config)},
|
core_config_{std::move(config)},
|
||||||
last_app_time_measure_microsecs_{CorePlatform::GetCurrentMicrosecs()},
|
last_app_time_measure_microsecs_{CorePlatform::GetCurrentMicrosecs()},
|
||||||
vr_mode{config.vr_mode} {
|
vr_mode_{config.vr_mode} {
|
||||||
// We're a singleton. If there's already one of us, something's wrong.
|
// We're a singleton. If there's already one of us, something's wrong.
|
||||||
assert(g_core == nullptr);
|
assert(g_core == nullptr);
|
||||||
}
|
}
|
||||||
@ -103,11 +103,6 @@ void CoreFeatureSet::PostInit() {
|
|||||||
|
|
||||||
build_src_dir_ = CalcBuildSrcDir();
|
build_src_dir_ = CalcBuildSrcDir();
|
||||||
|
|
||||||
// Note: this checks g_core->main_thread_id which is why it must run in
|
|
||||||
// PostInit and not our constructor.
|
|
||||||
// main_event_loop_ = new EventLoop(EventLoopID::kMain,
|
|
||||||
// ThreadSource::kWrapCurrent);
|
|
||||||
|
|
||||||
// On monolithic builds we need to bring up Python itself.
|
// On monolithic builds we need to bring up Python itself.
|
||||||
if (g_buildconfig.monolithic_build()) {
|
if (g_buildconfig.monolithic_build()) {
|
||||||
python->InitPython();
|
python->InitPython();
|
||||||
@ -277,7 +272,7 @@ void CoreFeatureSet::RunSanityChecks() {
|
|||||||
+ static_type_name<decltype(testrunnable)>(true) + "'");
|
+ static_type_name<decltype(testrunnable)>(true) + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vr_mode && !g_buildconfig.vr_build()) {
|
if (vr_mode_ && !g_buildconfig.vr_build()) {
|
||||||
FatalError("vr_mode enabled in core-config but we are not a vr build.");
|
FatalError("vr_mode enabled in core-config but we are not a vr build.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -308,7 +303,7 @@ auto CoreFeatureSet::HeadlessMode() -> bool {
|
|||||||
return g_buildconfig.headless_build();
|
return g_buildconfig.headless_build();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto CoreFeatureSet::IsVRMode() -> bool { return core_config_.vr_mode; }
|
// auto CoreFeatureSet::vr_mode() -> bool { return core_config_.vr_mode; }
|
||||||
|
|
||||||
static void WaitThenDie(millisecs_t wait, const std::string& action) {
|
static void WaitThenDie(millisecs_t wait, const std::string& action) {
|
||||||
CorePlatform::SleepMillisecs(wait);
|
CorePlatform::SleepMillisecs(wait);
|
||||||
|
|||||||
@ -66,13 +66,6 @@ class CoreFeatureSet {
|
|||||||
/// Apply the config set up by baenv to the engine.
|
/// Apply the config set up by baenv to the engine.
|
||||||
void ApplyBaEnvConfig();
|
void ApplyBaEnvConfig();
|
||||||
|
|
||||||
// Call this if the main thread changes.
|
|
||||||
// Fixme: Should come up with something less hacky feeling.
|
|
||||||
// void UpdateMainThreadID();
|
|
||||||
|
|
||||||
// auto* main_event_loop() const { return main_event_loop_; }
|
|
||||||
auto IsVRMode() -> bool;
|
|
||||||
|
|
||||||
/// Are we running headless?
|
/// Are we running headless?
|
||||||
auto HeadlessMode() -> bool;
|
auto HeadlessMode() -> bool;
|
||||||
|
|
||||||
@ -101,7 +94,7 @@ class CoreFeatureSet {
|
|||||||
/// considered the 'main' thread; on most platforms it is the one where
|
/// considered the 'main' thread; on most platforms it is the one where
|
||||||
/// UI calls must be run/etc.
|
/// UI calls must be run/etc.
|
||||||
auto InMainThread() -> bool {
|
auto InMainThread() -> bool {
|
||||||
return std::this_thread::get_id() == main_thread_id;
|
return std::this_thread::get_id() == main_thread_id();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Log a boot-related message (only if core_config.lifecycle_log is true).
|
/// Log a boot-related message (only if core_config.lifecycle_log is true).
|
||||||
@ -156,23 +149,17 @@ class CoreFeatureSet {
|
|||||||
CorePlatform* const platform;
|
CorePlatform* const platform;
|
||||||
|
|
||||||
// The following are misc values that should be migrated to applicable
|
// The following are misc values that should be migrated to applicable
|
||||||
// subsystem classes.
|
// subsystem classes or private vars.
|
||||||
bool event_loops_suspended{};
|
|
||||||
bool workspaces_in_use{};
|
bool workspaces_in_use{};
|
||||||
bool replay_open{};
|
bool have_incentivized_ad{false};
|
||||||
std::vector<EventLoop*> suspendable_event_loops;
|
bool reset_vr_orientation{};
|
||||||
std::mutex v1_cloud_log_mutex;
|
bool user_ran_commands{};
|
||||||
std::string v1_cloud_log;
|
|
||||||
bool did_put_v1_cloud_log{};
|
bool did_put_v1_cloud_log{};
|
||||||
bool v1_cloud_log_full{};
|
bool v1_cloud_log_full{};
|
||||||
int master_server_source{};
|
int master_server_source{};
|
||||||
int session_count{};
|
std::vector<EventLoop*> suspendable_event_loops;
|
||||||
bool have_incentivized_ad{false};
|
std::mutex v1_cloud_log_mutex;
|
||||||
bool should_pause_active_game{};
|
std::string v1_cloud_log;
|
||||||
bool reset_vr_orientation{};
|
|
||||||
bool user_ran_commands{};
|
|
||||||
std::thread::id main_thread_id{};
|
|
||||||
bool vr_mode;
|
|
||||||
std::mutex thread_name_map_mutex;
|
std::mutex thread_name_map_mutex;
|
||||||
std::unordered_map<std::thread::id, std::string> thread_name_map;
|
std::unordered_map<std::thread::id, std::string> thread_name_map;
|
||||||
|
|
||||||
@ -182,6 +169,11 @@ class CoreFeatureSet {
|
|||||||
int object_count{};
|
int object_count{};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
std::thread::id main_thread_id() const { return main_thread_id_; }
|
||||||
|
auto vr_mode() const { return vr_mode_; }
|
||||||
|
auto event_loops_suspended() const { return event_loops_suspended_; }
|
||||||
|
void set_event_loops_suspended(bool val) { event_loops_suspended_ = val; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit CoreFeatureSet(CoreConfig config);
|
explicit CoreFeatureSet(CoreConfig config);
|
||||||
static void DoImport(const CoreConfig& config);
|
static void DoImport(const CoreConfig& config);
|
||||||
@ -189,23 +181,29 @@ class CoreFeatureSet {
|
|||||||
void RunSanityChecks();
|
void RunSanityChecks();
|
||||||
void UpdateAppTime();
|
void UpdateAppTime();
|
||||||
void PostInit();
|
void PostInit();
|
||||||
|
|
||||||
|
// Note to self: don't use single bits for these as they may be owned by
|
||||||
|
// different threads.
|
||||||
|
bool event_loops_suspended_{};
|
||||||
bool tried_importing_base_{};
|
bool tried_importing_base_{};
|
||||||
// EventLoop* main_event_loop_{};
|
|
||||||
CoreConfig core_config_;
|
|
||||||
bool started_suicide_{};
|
bool started_suicide_{};
|
||||||
|
bool have_ba_env_vals_{};
|
||||||
|
bool vr_mode_{};
|
||||||
|
bool using_custom_app_python_dir_{};
|
||||||
|
|
||||||
|
std::thread::id main_thread_id_{};
|
||||||
|
CoreConfig core_config_;
|
||||||
std::string build_src_dir_;
|
std::string build_src_dir_;
|
||||||
microsecs_t app_time_microsecs_{};
|
microsecs_t app_time_microsecs_{};
|
||||||
microsecs_t last_app_time_measure_microsecs_;
|
microsecs_t last_app_time_measure_microsecs_;
|
||||||
std::mutex app_time_mutex_;
|
std::mutex app_time_mutex_;
|
||||||
std::string legacy_user_agent_string_{
|
std::string legacy_user_agent_string_{
|
||||||
"BA_USER_AGENT_UNSET (" BA_PLATFORM_STRING ")"};
|
"BA_USER_AGENT_UNSET (" BA_PLATFORM_STRING ")"};
|
||||||
bool have_ba_env_vals_{};
|
|
||||||
std::optional<std::string> ba_env_app_python_dir_;
|
std::optional<std::string> ba_env_app_python_dir_;
|
||||||
std::string ba_env_config_dir_;
|
std::string ba_env_config_dir_;
|
||||||
std::optional<std::string> ba_env_user_python_dir_;
|
std::optional<std::string> ba_env_user_python_dir_;
|
||||||
std::optional<std::string> ba_env_site_python_dir_;
|
std::optional<std::string> ba_env_site_python_dir_;
|
||||||
std::string ba_env_data_dir_;
|
std::string ba_env_data_dir_;
|
||||||
bool using_custom_app_python_dir_{};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ballistica::core
|
} // namespace ballistica::core
|
||||||
|
|||||||
@ -732,20 +732,12 @@ auto CorePlatform::DemangleCXXSymbol(const std::string& s) -> std::string {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// auto CorePlatform::NewAutoReleasePool() -> void* { throw Exception(); }
|
|
||||||
|
|
||||||
// void CorePlatform::DrainAutoReleasePool(void* pool) { throw Exception(); }
|
|
||||||
|
|
||||||
void CorePlatform::ResetAchievements() {
|
void CorePlatform::ResetAchievements() {
|
||||||
Log(LogLevel::kError, "ResetAchievements() unimplemented");
|
Log(LogLevel::kError, "ResetAchievements() unimplemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
// void CorePlatform::GameCenterLogin() { throw Exception(); }
|
|
||||||
|
|
||||||
void CorePlatform::RunEvents() {}
|
void CorePlatform::RunEvents() {}
|
||||||
|
|
||||||
auto CorePlatform::GetMemUsageInfo() -> std::string { return "0,0,0"; }
|
|
||||||
|
|
||||||
void CorePlatform::MusicPlayerPlay(PyObject* target) {
|
void CorePlatform::MusicPlayerPlay(PyObject* target) {
|
||||||
Log(LogLevel::kError, "MusicPlayerPlay() unimplemented on this platform");
|
Log(LogLevel::kError, "MusicPlayerPlay() unimplemented on this platform");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -301,9 +301,6 @@ class CorePlatform {
|
|||||||
/// return nullptr.
|
/// return nullptr.
|
||||||
virtual auto GetStackTrace() -> PlatformStackTrace*;
|
virtual auto GetStackTrace() -> PlatformStackTrace*;
|
||||||
|
|
||||||
// Called during stress testing.
|
|
||||||
virtual auto GetMemUsageInfo() -> std::string;
|
|
||||||
|
|
||||||
/// Optionally override fatal error reporting. If true is returned, default
|
/// Optionally override fatal error reporting. If true is returned, default
|
||||||
/// fatal error reporting will not run.
|
/// fatal error reporting will not run.
|
||||||
virtual auto ReportFatalError(const std::string& message,
|
virtual auto ReportFatalError(const std::string& message,
|
||||||
@ -458,13 +455,13 @@ class CorePlatform {
|
|||||||
virtual ~CorePlatform();
|
virtual ~CorePlatform();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool is_stdin_a_terminal_ : 1 {};
|
bool is_stdin_a_terminal_{};
|
||||||
bool have_has_touchscreen_value_ : 1 {};
|
bool have_has_touchscreen_value_{};
|
||||||
bool have_touchscreen_ : 1 {};
|
bool have_touchscreen_{};
|
||||||
bool is_tegra_k1_ : 1 {};
|
bool is_tegra_k1_{};
|
||||||
bool made_volatile_data_dir_ : 1 {};
|
bool made_volatile_data_dir_{};
|
||||||
bool have_device_uuid_ : 1 {};
|
bool have_device_uuid_{};
|
||||||
bool ran_base_post_init_ : 1 {};
|
bool ran_base_post_init_{};
|
||||||
millisecs_t start_time_millisecs_{};
|
millisecs_t start_time_millisecs_{};
|
||||||
std::string device_name_;
|
std::string device_name_;
|
||||||
std::string device_description_;
|
std::string device_description_;
|
||||||
|
|||||||
@ -43,7 +43,7 @@ class BaseSoftInterface {
|
|||||||
const std::string& arg) = 0;
|
const std::string& arg) = 0;
|
||||||
virtual auto IsAppStarted() const -> bool = 0;
|
virtual auto IsAppStarted() const -> bool = 0;
|
||||||
virtual auto IsAppBootstrapped() const -> bool = 0;
|
virtual auto IsAppBootstrapped() const -> bool = 0;
|
||||||
virtual auto GetReturnValue() const -> int = 0;
|
// virtual auto GetReturnValue() const -> int = 0;
|
||||||
virtual void PushMainThreadRunnable(Runnable* runnable) = 0;
|
virtual void PushMainThreadRunnable(Runnable* runnable) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -29,6 +29,23 @@ class CoreConfig {
|
|||||||
/// Enable vr mode on supported platforms.
|
/// Enable vr mode on supported platforms.
|
||||||
bool vr_mode{};
|
bool vr_mode{};
|
||||||
|
|
||||||
|
/// Log various stages/times in the bootstrapping process.
|
||||||
|
bool lifecycle_log{};
|
||||||
|
|
||||||
|
/// Normally early C++ Log() calls are held until babase has been imported
|
||||||
|
/// so that when they are pushed out to the Python logging calls they are
|
||||||
|
/// properly routed through the full engine. If you are not using babase
|
||||||
|
/// or are trying to debug early issues you can flip this off to push
|
||||||
|
/// things to Python as soon as technically possible.
|
||||||
|
bool hold_early_logs{true};
|
||||||
|
|
||||||
|
/// Let the engine know there's a debugger attached so it should do things
|
||||||
|
/// like abort() instead of exiting with error codes.
|
||||||
|
bool debugger_attached{};
|
||||||
|
|
||||||
|
/// Enables some extra timing logs/prints.
|
||||||
|
bool debug_timing{};
|
||||||
|
|
||||||
/// If set, the app should exit immediately with this return code (on
|
/// If set, the app should exit immediately with this return code (on
|
||||||
/// applicable platforms). This can be set by command-line parsing in
|
/// applicable platforms). This can be set by command-line parsing in
|
||||||
/// response to arguments such as 'version' or 'help' which are processed
|
/// response to arguments such as 'version' or 'help' which are processed
|
||||||
@ -50,23 +67,6 @@ class CoreConfig {
|
|||||||
|
|
||||||
/// Explicitly passed user-python (mods) dir.
|
/// Explicitly passed user-python (mods) dir.
|
||||||
std::optional<std::string> user_python_dir{};
|
std::optional<std::string> user_python_dir{};
|
||||||
|
|
||||||
/// Log various stages/times in the bootstrapping process.
|
|
||||||
bool lifecycle_log{};
|
|
||||||
|
|
||||||
/// Normally early C++ Log() calls are held until babase has been imported
|
|
||||||
/// so that when they are pushed out to the Python logging calls they are
|
|
||||||
/// properly routed through the full engine. If you are not using babase
|
|
||||||
/// or are trying to debug early issues you can flip this off to push
|
|
||||||
/// things to Python as soon as technically possible.
|
|
||||||
bool hold_early_logs{true};
|
|
||||||
|
|
||||||
/// Let the engine know there's a debugger attached so it should do things
|
|
||||||
/// like abort() instead of exiting with error codes.
|
|
||||||
bool debugger_attached{};
|
|
||||||
|
|
||||||
/// Enables some extra timing logs/prints.
|
|
||||||
bool debug_timing{};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ballistica::core
|
} // namespace ballistica::core
|
||||||
|
|||||||
@ -34,9 +34,9 @@ class ConnectionToHost : public Connection {
|
|||||||
std::string peer_hash_input_;
|
std::string peer_hash_input_;
|
||||||
std::string peer_hash_;
|
std::string peer_hash_;
|
||||||
// Can remove once back-compat protocol is > 29
|
// Can remove once back-compat protocol is > 29
|
||||||
bool ignore_old_attach_remote_player_packets_ : 1 {};
|
bool ignore_old_attach_remote_player_packets_{};
|
||||||
bool printed_connect_message_ : 1 {};
|
bool printed_connect_message_{};
|
||||||
bool got_host_info_ : 1 {};
|
bool got_host_info_{};
|
||||||
int protocol_version_{-1};
|
int protocol_version_{-1};
|
||||||
int build_number_{};
|
int build_number_{};
|
||||||
millisecs_t last_ping_send_time_{};
|
millisecs_t last_ping_send_time_{};
|
||||||
|
|||||||
@ -99,10 +99,10 @@ class Dynamics : public Object {
|
|||||||
int skid_sound_count_{};
|
int skid_sound_count_{};
|
||||||
int roll_sound_count_{};
|
int roll_sound_count_{};
|
||||||
int collision_count_{};
|
int collision_count_{};
|
||||||
bool in_process_ : 1 {};
|
bool in_process_{};
|
||||||
bool in_collide_message_ : 1 {};
|
bool in_collide_message_{};
|
||||||
bool collide_message_reverse_order_ : 1 {};
|
bool collide_message_reverse_order_{};
|
||||||
bool processing_collisions_ : 1 {};
|
bool processing_collisions_{};
|
||||||
dWorldID ode_world_{};
|
dWorldID ode_world_{};
|
||||||
dJointGroupID ode_contact_group_{};
|
dJointGroupID ode_contact_group_{};
|
||||||
dSpaceID ode_space_{};
|
dSpaceID ode_space_{};
|
||||||
|
|||||||
@ -48,8 +48,8 @@ class FlagNode : public Node {
|
|||||||
void UpdateSpringPoint(int p1, int p2, float rest_length);
|
void UpdateSpringPoint(int p1, int p2, float rest_length);
|
||||||
|
|
||||||
base::GraphicsQuality graphics_quality_{};
|
base::GraphicsQuality graphics_quality_{};
|
||||||
bool light_weight_ : 1 {};
|
bool light_weight_{};
|
||||||
bool have_flag_impulse_ : 1 {};
|
bool have_flag_impulse_{};
|
||||||
base::AreaOfInterest* area_of_interest_{};
|
base::AreaOfInterest* area_of_interest_{};
|
||||||
Part part_;
|
Part part_;
|
||||||
std::vector<float> color_ = {1.0f, 1.0f, 1.0f};
|
std::vector<float> color_ = {1.0f, 1.0f, 1.0f};
|
||||||
|
|||||||
@ -169,7 +169,7 @@ void GlobalsNode::SetAsForeground() {
|
|||||||
g_base->graphics->set_vignette_inner(Vector3f(vignette_inner()));
|
g_base->graphics->set_vignette_inner(Vector3f(vignette_inner()));
|
||||||
|
|
||||||
#if BA_VR_BUILD
|
#if BA_VR_BUILD
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
auto* graphics_vr = base::GraphicsVR::get();
|
auto* graphics_vr = base::GraphicsVR::get();
|
||||||
graphics_vr->set_vr_near_clip(vr_near_clip());
|
graphics_vr->set_vr_near_clip(vr_near_clip());
|
||||||
graphics_vr->set_vr_overlay_center(Vector3f(vr_overlay_center()));
|
graphics_vr->set_vr_overlay_center(Vector3f(vr_overlay_center()));
|
||||||
@ -219,7 +219,7 @@ void GlobalsNode::SetDebrisFriction(float val) {
|
|||||||
void GlobalsNode::SetVRNearClip(float val) {
|
void GlobalsNode::SetVRNearClip(float val) {
|
||||||
vr_near_clip_ = val;
|
vr_near_clip_ = val;
|
||||||
#if BA_VR_BUILD
|
#if BA_VR_BUILD
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
if (IsCurrentGlobals()) {
|
if (IsCurrentGlobals()) {
|
||||||
base::GraphicsVR::get()->set_vr_near_clip(vr_near_clip_);
|
base::GraphicsVR::get()->set_vr_near_clip(vr_near_clip_);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -211,7 +211,7 @@ void ImageNode::Draw(base::FrameDef* frame_def) {
|
|||||||
if (host_only_ && !context_ref().GetHostSession()) {
|
if (host_only_ && !context_ref().GetHostSession()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bool vr = g_core->IsVRMode();
|
bool vr = g_core->vr_mode();
|
||||||
|
|
||||||
// In vr mode we use the fixed overlay position if our scene
|
// In vr mode we use the fixed overlay position if our scene
|
||||||
// is set for that.
|
// is set for that.
|
||||||
|
|||||||
@ -84,13 +84,13 @@ class ImageNode : public Node {
|
|||||||
CENTER_LEFT
|
CENTER_LEFT
|
||||||
};
|
};
|
||||||
|
|
||||||
bool host_only_ : 1 {};
|
bool host_only_{};
|
||||||
bool front_ : 1 {};
|
bool front_{};
|
||||||
bool absolute_scale_ : 1 {true};
|
bool absolute_scale_{true};
|
||||||
bool premultiplied_ : 1 {};
|
bool premultiplied_{};
|
||||||
bool fill_screen_ : 1 {};
|
bool fill_screen_{};
|
||||||
bool has_alpha_channel_ : 1 {true};
|
bool has_alpha_channel_{true};
|
||||||
bool dirty_ : 1 {true};
|
bool dirty_{true};
|
||||||
Attach attach_{Attach::CENTER};
|
Attach attach_{Attach::CENTER};
|
||||||
|
|
||||||
float vr_depth_{};
|
float vr_depth_{};
|
||||||
|
|||||||
@ -4971,8 +4971,8 @@ void SpazNode::Draw(base::FrameDef* frame_def) {
|
|||||||
|
|
||||||
int elem_count = name_text_group_.GetElementCount();
|
int elem_count = name_text_group_.GetElementCount();
|
||||||
float s_extra =
|
float s_extra =
|
||||||
(g_core->IsVRMode() || g_base->ui->scale() == UIScale::kSmall) ? 1.2f
|
(g_core->vr_mode() || g_base->ui->scale() == UIScale::kSmall) ? 1.2f
|
||||||
: 1.0f;
|
: 1.0f;
|
||||||
|
|
||||||
for (int e = 0; e < elem_count; e++) {
|
for (int e = 0; e < elem_count; e++) {
|
||||||
// Gracefully skip unloaded textures.
|
// Gracefully skip unloaded textures.
|
||||||
|
|||||||
@ -222,7 +222,7 @@ void TerrainNode::Draw(base::FrameDef* frame_def) {
|
|||||||
if (!mesh_.Exists()) {
|
if (!mesh_.Exists()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (vr_only_ && !g_core->IsVRMode()) {
|
if (vr_only_ && !g_core->vr_mode()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
base::ObjectComponent c(overlay_ ? frame_def->overlay_3d_pass()
|
base::ObjectComponent c(overlay_ ? frame_def->overlay_3d_pass()
|
||||||
|
|||||||
@ -367,11 +367,11 @@ void TextNode::Draw(base::FrameDef* frame_def) {
|
|||||||
text_width_dirty_ = false;
|
text_width_dirty_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool vr_2d_text = (g_core->IsVRMode() && !in_world_);
|
bool vr_2d_text = (g_core->vr_mode() && !in_world_);
|
||||||
|
|
||||||
// in vr mode we use the fixed overlay position if our scene is set for
|
// in vr mode we use the fixed overlay position if our scene is set for
|
||||||
// that
|
// that
|
||||||
bool vr_use_fixed = (g_core->IsVRMode() && scene()->use_fixed_vr_overlay());
|
bool vr_use_fixed = (g_core->vr_mode() && scene()->use_fixed_vr_overlay());
|
||||||
|
|
||||||
// FIXME - in VR, fixed and front are currently mutually exclusive; need to
|
// FIXME - in VR, fixed and front are currently mutually exclusive; need to
|
||||||
// implement that.
|
// implement that.
|
||||||
@ -635,7 +635,7 @@ void TextNode::Draw(base::FrameDef* frame_def) {
|
|||||||
} else {
|
} else {
|
||||||
c.SetColor(1, 1, 1, fin_a);
|
c.SetColor(1, 1, 1, fin_a);
|
||||||
}
|
}
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
c.SetFlatness(text_group_.GetElementMaxFlatness(e));
|
c.SetFlatness(text_group_.GetElementMaxFlatness(e));
|
||||||
} else {
|
} else {
|
||||||
c.SetFlatness(
|
c.SetFlatness(
|
||||||
|
|||||||
@ -388,6 +388,10 @@ class SceneV1FeatureSet : public FeatureSetNativeComponent {
|
|||||||
// Our subcomponents.
|
// Our subcomponents.
|
||||||
SceneV1Python* const python;
|
SceneV1Python* const python;
|
||||||
|
|
||||||
|
// FIXME: should be private.
|
||||||
|
int session_count{};
|
||||||
|
bool replay_open{};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void SetupNodeMessageType_(const std::string& name, NodeMessageType val,
|
void SetupNodeMessageType_(const std::string& name, NodeMessageType val,
|
||||||
const std::string& format);
|
const std::string& format);
|
||||||
|
|||||||
@ -13,26 +13,28 @@ namespace ballistica::scene_v1 {
|
|||||||
|
|
||||||
ClientSessionNet::ClientSessionNet() {
|
ClientSessionNet::ClientSessionNet() {
|
||||||
// Sanity check: we should only ever be writing one replay at once.
|
// Sanity check: we should only ever be writing one replay at once.
|
||||||
if (g_core->replay_open) {
|
if (g_scene_v1->replay_open) {
|
||||||
Log(LogLevel::kError,
|
Log(LogLevel::kError,
|
||||||
"g_replay_open true at netclient start; shouldn't happen.");
|
"g_scene_v1->replay_open true at netclient start;"
|
||||||
|
" shouldn't happen.");
|
||||||
}
|
}
|
||||||
assert(g_base->assets_server);
|
assert(g_base->assets_server);
|
||||||
|
|
||||||
// We always write replays as the highest protocol version we support.
|
// We always write replays as the highest protocol version we support.
|
||||||
g_base->assets_server->PushBeginWriteReplayCall(kProtocolVersionMax);
|
g_base->assets_server->PushBeginWriteReplayCall(kProtocolVersionMax);
|
||||||
writing_replay_ = true;
|
writing_replay_ = true;
|
||||||
g_core->replay_open = true;
|
g_scene_v1->replay_open = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClientSessionNet::~ClientSessionNet() {
|
ClientSessionNet::~ClientSessionNet() {
|
||||||
if (writing_replay_) {
|
if (writing_replay_) {
|
||||||
// Sanity check: we should only ever be writing one replay at once.
|
// Sanity check: we should only ever be writing one replay at once.
|
||||||
if (!g_core->replay_open) {
|
if (!g_scene_v1->replay_open) {
|
||||||
Log(LogLevel::kError,
|
Log(LogLevel::kError,
|
||||||
"g_replay_open false at net-client close; shouldn't happen.");
|
"g_scene_v1->replay_open false at net-client close;"
|
||||||
|
" shouldn't happen.");
|
||||||
}
|
}
|
||||||
g_core->replay_open = false;
|
g_scene_v1->replay_open = false;
|
||||||
assert(g_base->assets_server);
|
assert(g_base->assets_server);
|
||||||
g_base->assets_server->PushEndWriteReplayCall();
|
g_base->assets_server->PushEndWriteReplayCall();
|
||||||
writing_replay_ = false;
|
writing_replay_ = false;
|
||||||
|
|||||||
@ -1070,9 +1070,9 @@ void SceneV1AppMode::Reset_() {
|
|||||||
PruneSessions_();
|
PruneSessions_();
|
||||||
|
|
||||||
// If all is well our sessions should all be dead.
|
// If all is well our sessions should all be dead.
|
||||||
if (g_core->session_count != 0) {
|
if (g_scene_v1->session_count != 0) {
|
||||||
Log(LogLevel::kError, "Session-count is non-zero ("
|
Log(LogLevel::kError, "Session-count is non-zero ("
|
||||||
+ std::to_string(g_core->session_count)
|
+ std::to_string(g_scene_v1->session_count)
|
||||||
+ ") on Logic::Reset.");
|
+ ") on Logic::Reset.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -213,16 +213,16 @@ class SceneV1AppMode : public base::AppMode {
|
|||||||
Object::WeakRef<Scene> foreground_scene_;
|
Object::WeakRef<Scene> foreground_scene_;
|
||||||
Object::WeakRef<Session> foreground_session_;
|
Object::WeakRef<Session> foreground_session_;
|
||||||
|
|
||||||
bool chat_muted_ : 1 {};
|
bool chat_muted_{};
|
||||||
bool in_update_ : 1 {};
|
bool in_update_{};
|
||||||
bool kick_idle_players_ : 1 {};
|
bool kick_idle_players_{};
|
||||||
bool public_party_enabled_ : 1 {};
|
bool public_party_enabled_{};
|
||||||
bool public_party_queue_enabled_ : 1 {true};
|
bool public_party_queue_enabled_{true};
|
||||||
bool require_client_authentication_ : 1 {};
|
bool require_client_authentication_{};
|
||||||
bool idle_exiting_ : 1 {};
|
bool idle_exiting_{};
|
||||||
bool game_roster_dirty_ : 1 {};
|
bool game_roster_dirty_{};
|
||||||
bool kick_vote_in_progress_ : 1 {};
|
bool kick_vote_in_progress_{};
|
||||||
bool kick_voting_enabled_ : 1 {true};
|
bool kick_voting_enabled_{true};
|
||||||
|
|
||||||
cJSON* game_roster_{};
|
cJSON* game_roster_{};
|
||||||
millisecs_t last_game_roster_send_time_{};
|
millisecs_t last_game_roster_send_time_{};
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
namespace ballistica::scene_v1 {
|
namespace ballistica::scene_v1 {
|
||||||
|
|
||||||
Session::Session() {
|
Session::Session() {
|
||||||
g_core->session_count++;
|
g_scene_v1->session_count++;
|
||||||
|
|
||||||
auto* appmode = SceneV1AppMode::GetActiveOrThrow();
|
auto* appmode = SceneV1AppMode::GetActiveOrThrow();
|
||||||
|
|
||||||
@ -15,7 +15,7 @@ Session::Session() {
|
|||||||
appmode->SetForegroundSession(this);
|
appmode->SetForegroundSession(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Session::~Session() { g_core->session_count--; }
|
Session::~Session() { g_scene_v1->session_count--; }
|
||||||
|
|
||||||
void Session::Update(int time_advance_millisecs, double time_advance) {}
|
void Session::Update(int time_advance_millisecs, double time_advance) {}
|
||||||
|
|
||||||
|
|||||||
@ -27,15 +27,16 @@ SessionStream::SessionStream(HostSession* host_session, bool save_replay)
|
|||||||
host_session_{host_session} {
|
host_session_{host_session} {
|
||||||
if (save_replay) {
|
if (save_replay) {
|
||||||
// Sanity check - we should only ever be writing one replay at once.
|
// Sanity check - we should only ever be writing one replay at once.
|
||||||
if (g_core->replay_open) {
|
if (g_scene_v1->replay_open) {
|
||||||
Log(LogLevel::kError,
|
Log(LogLevel::kError,
|
||||||
"g_replay_open true at replay start; shouldn't happen.");
|
"g_scene_v1->replay_open true at replay start;"
|
||||||
|
" shouldn't happen.");
|
||||||
}
|
}
|
||||||
// We always write replays as the max protocol version we support.
|
// We always write replays as the max protocol version we support.
|
||||||
assert(g_base->assets_server);
|
assert(g_base->assets_server);
|
||||||
g_base->assets_server->PushBeginWriteReplayCall(kProtocolVersionMax);
|
g_base->assets_server->PushBeginWriteReplayCall(kProtocolVersionMax);
|
||||||
writing_replay_ = true;
|
writing_replay_ = true;
|
||||||
g_core->replay_open = true;
|
g_scene_v1->replay_open = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we're the live output-stream from a host-session,
|
// If we're the live output-stream from a host-session,
|
||||||
@ -52,11 +53,12 @@ SessionStream::~SessionStream() {
|
|||||||
|
|
||||||
if (writing_replay_) {
|
if (writing_replay_) {
|
||||||
// Sanity check: We should only ever be writing one replay at once.
|
// Sanity check: We should only ever be writing one replay at once.
|
||||||
if (!g_core->replay_open) {
|
if (!g_scene_v1->replay_open) {
|
||||||
Log(LogLevel::kError,
|
Log(LogLevel::kError,
|
||||||
"g_replay_open false at replay close; shouldn't happen.");
|
"g_scene_v1->replay_open false at replay close;"
|
||||||
|
" shouldn't happen.");
|
||||||
}
|
}
|
||||||
g_core->replay_open = false;
|
g_scene_v1->replay_open = false;
|
||||||
assert(g_base->assets_server);
|
assert(g_base->assets_server);
|
||||||
g_base->assets_server->PushEndWriteReplayCall();
|
g_base->assets_server->PushEndWriteReplayCall();
|
||||||
writing_replay_ = false;
|
writing_replay_ = false;
|
||||||
@ -186,14 +188,15 @@ void SessionStream::Fail() {
|
|||||||
Log(LogLevel::kError, "Error writing replay file");
|
Log(LogLevel::kError, "Error writing replay file");
|
||||||
if (writing_replay_) {
|
if (writing_replay_) {
|
||||||
// Sanity check: We should only ever be writing one replay at once.
|
// Sanity check: We should only ever be writing one replay at once.
|
||||||
if (!g_core->replay_open) {
|
if (!g_scene_v1->replay_open) {
|
||||||
Log(LogLevel::kError,
|
Log(LogLevel::kError,
|
||||||
"g_replay_open false at replay close; shouldn't happen.");
|
"g_scene_v1->replay_open false at replay close;"
|
||||||
|
" shouldn't happen.");
|
||||||
}
|
}
|
||||||
assert(g_base->assets_server);
|
assert(g_base->assets_server);
|
||||||
g_base->assets_server->PushEndWriteReplayCall();
|
g_base->assets_server->PushEndWriteReplayCall();
|
||||||
writing_replay_ = false;
|
writing_replay_ = false;
|
||||||
g_core->replay_open = false;
|
g_scene_v1->replay_open = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
#include "ballistica/shared/python/python.h"
|
#include "ballistica/shared/python/python.h"
|
||||||
#include "ballistica/shared/python/python_command.h"
|
#include "ballistica/shared/python/python_command.h"
|
||||||
|
|
||||||
// Make sure min_sdl.h stays in here even though this file compile fine
|
// Make sure min_sdl.h stays in here even though this file compiles fine
|
||||||
// without it. On some platforms it does a bit of magic to redefine main as
|
// without it. On some platforms it does a bit of magic to redefine main as
|
||||||
// SDL_main which leads us to a tricky-to-diagnose linker error if it
|
// SDL_main which leads us to a tricky-to-diagnose linker error if it
|
||||||
// removed from here.
|
// removed from here.
|
||||||
@ -39,8 +39,8 @@ auto main(int argc, char** argv) -> int {
|
|||||||
namespace ballistica {
|
namespace ballistica {
|
||||||
|
|
||||||
// These are set automatically via script; don't modify them here.
|
// These are set automatically via script; don't modify them here.
|
||||||
const int kEngineBuildNumber = 21612;
|
const int kEngineBuildNumber = 21623;
|
||||||
const char* kEngineVersion = "1.7.29";
|
const char* kEngineVersion = "1.7.30";
|
||||||
const int kEngineApiVersion = 8;
|
const int kEngineApiVersion = 8;
|
||||||
|
|
||||||
#if BA_MONOLITHIC_BUILD
|
#if BA_MONOLITHIC_BUILD
|
||||||
@ -69,7 +69,7 @@ auto MonolithicMain(const core::CoreConfig& core_config) -> int {
|
|||||||
// If a command was passed, simply run it and exit. We want to act
|
// If a command was passed, simply run it and exit. We want to act
|
||||||
// simply as a Python interpreter in that case; we don't do any
|
// simply as a Python interpreter in that case; we don't do any
|
||||||
// environment setup (aside from the bits core does automatically such
|
// environment setup (aside from the bits core does automatically such
|
||||||
// as making our built in binary modules available).
|
// as making our built-in binary modules available).
|
||||||
if (l_core->core_config().call_command.has_value()) {
|
if (l_core->core_config().call_command.has_value()) {
|
||||||
auto gil{Python::ScopedInterpreterLock()};
|
auto gil{Python::ScopedInterpreterLock()};
|
||||||
bool success = PythonCommand(*l_core->core_config().call_command,
|
bool success = PythonCommand(*l_core->core_config().call_command,
|
||||||
@ -152,10 +152,7 @@ auto MonolithicMain(const core::CoreConfig& core_config) -> int {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (l_base) {
|
return 0;
|
||||||
return l_base->GetReturnValue();
|
|
||||||
}
|
|
||||||
return -1; // Didn't even get core; something clearly wrong.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // BA_MONOLITHIC_BUILD
|
#endif // BA_MONOLITHIC_BUILD
|
||||||
|
|||||||
@ -174,7 +174,7 @@ auto EventLoop::ThreadMainAssetsP_(void* data) -> void* {
|
|||||||
void EventLoop::PushSetSuspended(bool suspended) {
|
void EventLoop::PushSetSuspended(bool suspended) {
|
||||||
assert(g_core);
|
assert(g_core);
|
||||||
// Can be toggled from the main thread only.
|
// Can be toggled from the main thread only.
|
||||||
assert(std::this_thread::get_id() == g_core->main_thread_id);
|
assert(std::this_thread::get_id() == g_core->main_thread_id());
|
||||||
PushThreadMessage_(ThreadMessage_(suspended
|
PushThreadMessage_(ThreadMessage_(suspended
|
||||||
? ThreadMessage_::Type::kSuspend
|
? ThreadMessage_::Type::kSuspend
|
||||||
: ThreadMessage_::Type::kUnsuspend));
|
: ThreadMessage_::Type::kUnsuspend));
|
||||||
@ -538,7 +538,8 @@ void EventLoop::PushThreadMessage_(const ThreadMessage_& t) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show count periodically.
|
// Show count periodically.
|
||||||
if ((std::this_thread::get_id() == g_core->main_thread_id) && foo > 100) {
|
if ((std::this_thread::get_id() == g_core->main_thread_id())
|
||||||
|
&& foo > 100) {
|
||||||
foo = 0;
|
foo = 0;
|
||||||
log_entries.emplace_back(
|
log_entries.emplace_back(
|
||||||
LogLevel::kInfo,
|
LogLevel::kInfo,
|
||||||
@ -577,8 +578,8 @@ void EventLoop::PushThreadMessage_(const ThreadMessage_& t) {
|
|||||||
|
|
||||||
void EventLoop::SetEventLoopsSuspended(bool suspended) {
|
void EventLoop::SetEventLoopsSuspended(bool suspended) {
|
||||||
assert(g_core);
|
assert(g_core);
|
||||||
assert(std::this_thread::get_id() == g_core->main_thread_id);
|
assert(std::this_thread::get_id() == g_core->main_thread_id());
|
||||||
g_core->event_loops_suspended = suspended;
|
g_core->set_event_loops_suspended(suspended);
|
||||||
for (auto&& i : g_core->suspendable_event_loops) {
|
for (auto&& i : g_core->suspendable_event_loops) {
|
||||||
i->PushSetSuspended(suspended);
|
i->PushSetSuspended(suspended);
|
||||||
}
|
}
|
||||||
@ -587,10 +588,10 @@ void EventLoop::SetEventLoopsSuspended(bool suspended) {
|
|||||||
auto EventLoop::GetStillSuspendingEventLoops() -> std::vector<EventLoop*> {
|
auto EventLoop::GetStillSuspendingEventLoops() -> std::vector<EventLoop*> {
|
||||||
assert(g_core);
|
assert(g_core);
|
||||||
std::vector<EventLoop*> threads;
|
std::vector<EventLoop*> threads;
|
||||||
assert(std::this_thread::get_id() == g_core->main_thread_id);
|
assert(std::this_thread::get_id() == g_core->main_thread_id());
|
||||||
|
|
||||||
// Only return results if an actual suspend is in effect.
|
// Only return results if an actual suspend is in effect.
|
||||||
if (g_core->event_loops_suspended) {
|
if (g_core->event_loops_suspended()) {
|
||||||
for (auto&& i : g_core->suspendable_event_loops) {
|
for (auto&& i : g_core->suspendable_event_loops) {
|
||||||
if (!i->suspended()) {
|
if (!i->suspended()) {
|
||||||
threads.push_back(i);
|
threads.push_back(i);
|
||||||
@ -602,7 +603,7 @@ auto EventLoop::GetStillSuspendingEventLoops() -> std::vector<EventLoop*> {
|
|||||||
|
|
||||||
auto EventLoop::AreEventLoopsSuspended() -> bool {
|
auto EventLoop::AreEventLoopsSuspended() -> bool {
|
||||||
assert(g_core);
|
assert(g_core);
|
||||||
return g_core->event_loops_suspended;
|
return g_core->event_loops_suspended();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto EventLoop::NewTimer(microsecs_t length, bool repeat, Runnable* runnable)
|
auto EventLoop::NewTimer(microsecs_t length, bool repeat, Runnable* runnable)
|
||||||
|
|||||||
@ -158,11 +158,11 @@ class EventLoop {
|
|||||||
|
|
||||||
EventLoopID identifier_{EventLoopID::kInvalid};
|
EventLoopID identifier_{EventLoopID::kInvalid};
|
||||||
ThreadSource source_{};
|
ThreadSource source_{};
|
||||||
bool bootstrapped_ : 1 {};
|
bool bootstrapped_{};
|
||||||
bool writing_tally_ : 1 {};
|
bool writing_tally_{};
|
||||||
bool suspended_ : 1 {};
|
bool suspended_{};
|
||||||
bool done_ : 1 {};
|
bool done_{};
|
||||||
bool acquires_python_gil_ : 1 {};
|
bool acquires_python_gil_{};
|
||||||
std::thread::id thread_id_{};
|
std::thread::id thread_id_{};
|
||||||
std::condition_variable thread_message_cv_;
|
std::condition_variable thread_message_cv_;
|
||||||
std::condition_variable client_listener_cv_;
|
std::condition_variable client_listener_cv_;
|
||||||
|
|||||||
@ -672,12 +672,12 @@ class Object {
|
|||||||
auto operator new(size_t size) -> void* { return new char[size]; }
|
auto operator new(size_t size) -> void* { return new char[size]; }
|
||||||
void ObjectUpdateForAcquire();
|
void ObjectUpdateForAcquire();
|
||||||
|
|
||||||
bool object_is_static_allocated_ : 1 {true};
|
bool object_is_static_allocated_{true};
|
||||||
bool object_has_been_strong_reffed_ : 1 {};
|
bool object_has_been_strong_reffed_{};
|
||||||
bool object_is_ref_counted_ : 1 {};
|
bool object_is_ref_counted_{};
|
||||||
bool object_is_pending_deferred_ : 1 {};
|
bool object_is_pending_deferred_{};
|
||||||
bool object_is_unmanaged_ : 1 {};
|
bool object_is_unmanaged_{};
|
||||||
bool object_is_dead_ : 1 {};
|
bool object_is_dead_{};
|
||||||
Object* object_next_{};
|
Object* object_next_{};
|
||||||
Object* object_prev_{};
|
Object* object_prev_{};
|
||||||
ThreadOwnership thread_ownership_{ThreadOwnership::kClassDefault};
|
ThreadOwnership thread_ownership_{ThreadOwnership::kClassDefault};
|
||||||
|
|||||||
@ -173,7 +173,7 @@ void RootUI::Draw(base::FrameDef* frame_def) {
|
|||||||
draw_menu_button = false;
|
draw_menu_button = false;
|
||||||
}
|
}
|
||||||
} else if (g_buildconfig.rift_build()) {
|
} else if (g_buildconfig.rift_build()) {
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
draw_menu_button = false;
|
draw_menu_button = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -111,7 +111,7 @@ RootWidget::~RootWidget() = default;
|
|||||||
auto RootWidget::AddCover(float h_align, VAlign v_align, float x, float y,
|
auto RootWidget::AddCover(float h_align, VAlign v_align, float x, float y,
|
||||||
float w, float h, float o) -> RootWidget::Button* {
|
float w, float h, float o) -> RootWidget::Button* {
|
||||||
// Currently just not doing these in vr mode.
|
// Currently just not doing these in vr mode.
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -429,7 +429,7 @@ void TextWidget::DoDrawText_(base::RenderPass* pass, float x_offset,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// In VR, draw everything flat because it's generally harder to read.
|
// In VR, draw everything flat because it's generally harder to read.
|
||||||
if (g_core->IsVRMode()) {
|
if (g_core->vr_mode()) {
|
||||||
c.SetFlatness(text_group_->GetElementMaxFlatness(e));
|
c.SetFlatness(text_group_->GetElementMaxFlatness(e));
|
||||||
} else {
|
} else {
|
||||||
c.SetFlatness(std::min(text_group_->GetElementMaxFlatness(e), flatness_));
|
c.SetFlatness(std::min(text_group_->GetElementMaxFlatness(e), flatness_));
|
||||||
|
|||||||
@ -113,24 +113,24 @@ class TextWidget : public Widget {
|
|||||||
HAlign alignment_h_{HAlign::kLeft};
|
HAlign alignment_h_{HAlign::kLeft};
|
||||||
VAlign alignment_v_{VAlign::kTop};
|
VAlign alignment_v_{VAlign::kTop};
|
||||||
GlowType glow_type_{GlowType::kGradient};
|
GlowType glow_type_{GlowType::kGradient};
|
||||||
bool enabled_ : 1 {true};
|
bool enabled_{true};
|
||||||
bool big_ : 1 {};
|
bool big_{};
|
||||||
bool force_internal_editing_ : 1 {};
|
bool force_internal_editing_{};
|
||||||
bool always_show_carat_ : 1 {};
|
bool always_show_carat_{};
|
||||||
bool highlight_dirty_ : 1 {true};
|
bool highlight_dirty_{true};
|
||||||
bool text_translation_dirty_ : 1 {true};
|
bool text_translation_dirty_{true};
|
||||||
bool text_group_dirty_ : 1 {true};
|
bool text_group_dirty_{true};
|
||||||
bool outline_dirty_ : 1 {true};
|
bool outline_dirty_{true};
|
||||||
bool click_activate_ : 1 {};
|
bool click_activate_{};
|
||||||
bool mouse_over_ : 1 {};
|
bool mouse_over_{};
|
||||||
bool pressed_ : 1 {};
|
bool pressed_{};
|
||||||
bool pressed_activate_ : 1 {};
|
bool pressed_activate_{};
|
||||||
bool always_highlight_ : 1 {};
|
bool always_highlight_{};
|
||||||
bool editable_ : 1 {};
|
bool editable_{};
|
||||||
bool selectable_ : 1 {};
|
bool selectable_{};
|
||||||
bool clear_pressed_ : 1 {};
|
bool clear_pressed_{};
|
||||||
bool clear_mouse_over_ : 1 {};
|
bool clear_mouse_over_{};
|
||||||
bool do_clear_button_ : 1 {true};
|
bool do_clear_button_{true};
|
||||||
int carat_position_{9999};
|
int carat_position_{9999};
|
||||||
int max_chars_{99999};
|
int max_chars_{99999};
|
||||||
float res_scale_{1.0f};
|
float res_scale_{1.0f};
|
||||||
|
|||||||
@ -36,10 +36,10 @@ struct Context_ {
|
|||||||
};
|
};
|
||||||
|
|
||||||
int path_exists_(const char* path);
|
int path_exists_(const char* path);
|
||||||
int establish_connection_(const struct Context_* ctx);
|
int establish_connection_(struct Context_* ctx);
|
||||||
int calc_paths_(struct Context_* ctx);
|
int calc_paths_(struct Context_* ctx);
|
||||||
int send_command_(struct Context_* ctx, int argc, char** argv);
|
int send_command_(struct Context_* ctx, int argc, char** argv);
|
||||||
int handle_response_(const struct Context_* ctx);
|
int handle_response_(struct Context_* ctx);
|
||||||
|
|
||||||
// Read all data from a socket and return as a malloc'ed null-terminated
|
// Read all data from a socket and return as a malloc'ed null-terminated
|
||||||
// string.
|
// string.
|
||||||
@ -192,7 +192,7 @@ int path_exists_(const char* path) {
|
|||||||
return (stat(path, &file_stat) != -1);
|
return (stat(path, &file_stat) != -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int establish_connection_(const struct Context_* ctx) {
|
int establish_connection_(struct Context_* ctx) {
|
||||||
char state_file_path_full[256];
|
char state_file_path_full[256];
|
||||||
snprintf(state_file_path_full, sizeof(state_file_path_full),
|
snprintf(state_file_path_full, sizeof(state_file_path_full),
|
||||||
"%s/worker_state_%s_%d", ctx->state_dir_path, ctx->instance_prefix,
|
"%s/worker_state_%s_%d", ctx->state_dir_path, ctx->instance_prefix,
|
||||||
@ -338,7 +338,8 @@ int establish_connection_(const struct Context_* ctx) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (retry_attempt >= 10) {
|
// Let's stop at 5, which will be about a minute of waiting total.
|
||||||
|
if (retry_attempt >= 5) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Error: pcommandbatch client %s_%d (pid %d): too many "
|
"Error: pcommandbatch client %s_%d (pid %d): too many "
|
||||||
"retry attempts; giving up.\n",
|
"retry attempts; giving up.\n",
|
||||||
@ -346,6 +347,11 @@ int establish_connection_(const struct Context_* ctx) {
|
|||||||
close(sockfd);
|
close(sockfd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Am currently seeing the occasional hang in this loop. Let's flip
|
||||||
|
// into verbose if that might be happening to diagnose.
|
||||||
|
ctx->verbose = 1;
|
||||||
|
|
||||||
if (ctx->verbose) {
|
if (ctx->verbose) {
|
||||||
fprintf(
|
fprintf(
|
||||||
stderr,
|
stderr,
|
||||||
@ -493,7 +499,7 @@ int send_command_(struct Context_* ctx, int argc, char** argv) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int handle_response_(const struct Context_* ctx) {
|
int handle_response_(struct Context_* ctx) {
|
||||||
char* inbuf = read_string_from_socket_(ctx);
|
char* inbuf = read_string_from_socket_(ctx);
|
||||||
|
|
||||||
// Getting null or an empty string response imply something is broken.
|
// Getting null or an empty string response imply something is broken.
|
||||||
|
|||||||
@ -29,7 +29,7 @@ def _build_dir(arch: str, mode: str) -> str:
|
|||||||
return f'build/openal_build_android_{arch}_{mode}'
|
return f'build/openal_build_android_{arch}_{mode}'
|
||||||
|
|
||||||
|
|
||||||
def build(arch: str, mode: str) -> None:
|
def build_openal(arch: str, mode: str) -> None:
|
||||||
"""Do the thing."""
|
"""Do the thing."""
|
||||||
from efrotools import replace_exact
|
from efrotools import replace_exact
|
||||||
|
|
||||||
@ -39,6 +39,8 @@ def build(arch: str, mode: str) -> None:
|
|||||||
if mode not in MODES:
|
if mode not in MODES:
|
||||||
raise CleanError(f"Invalid mode '{mode}'.")
|
raise CleanError(f"Invalid mode '{mode}'.")
|
||||||
|
|
||||||
|
enable_oboe = True
|
||||||
|
|
||||||
# Get ndk path.
|
# Get ndk path.
|
||||||
ndk_path = (
|
ndk_path = (
|
||||||
subprocess.run(
|
subprocess.run(
|
||||||
@ -49,6 +51,7 @@ def build(arch: str, mode: str) -> None:
|
|||||||
.stdout.decode()
|
.stdout.decode()
|
||||||
.strip()
|
.strip()
|
||||||
)
|
)
|
||||||
|
# os.environ['NDK_ROOT'] = ndk_path
|
||||||
|
|
||||||
# Grab from git and build.
|
# Grab from git and build.
|
||||||
builddir = _build_dir(arch, mode)
|
builddir = _build_dir(arch, mode)
|
||||||
@ -58,9 +61,27 @@ def build(arch: str, mode: str) -> None:
|
|||||||
['git', 'clone', 'https://github.com/kcat/openal-soft.git', builddir],
|
['git', 'clone', 'https://github.com/kcat/openal-soft.git', builddir],
|
||||||
check=True,
|
check=True,
|
||||||
)
|
)
|
||||||
|
subprocess.run(['git', 'checkout', '1.23.1'], check=True, cwd=builddir)
|
||||||
|
|
||||||
commit = 'd3875f3' # Version 1.23.1
|
if enable_oboe:
|
||||||
subprocess.run(['git', 'checkout', commit], check=True, cwd=builddir)
|
builddir_oboe = f'{builddir}_oboe'
|
||||||
|
subprocess.run(['rm', '-rf', builddir_oboe], check=True)
|
||||||
|
subprocess.run(
|
||||||
|
['mkdir', '-p', os.path.dirname(builddir_oboe)], check=True
|
||||||
|
)
|
||||||
|
subprocess.run(
|
||||||
|
[
|
||||||
|
'git',
|
||||||
|
'clone',
|
||||||
|
'https://github.com/google/oboe',
|
||||||
|
builddir_oboe,
|
||||||
|
],
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
subprocess.run(
|
||||||
|
['git', 'checkout', '1.8.0'], check=True, cwd=builddir_oboe
|
||||||
|
)
|
||||||
|
print(f'FULLY GOT {builddir_oboe}')
|
||||||
|
|
||||||
# One bit of filtering: by default, openalsoft sends all sorts of
|
# One bit of filtering: by default, openalsoft sends all sorts of
|
||||||
# log messages to the android log. This is reasonable since its
|
# log messages to the android log. This is reasonable since its
|
||||||
@ -85,16 +106,38 @@ def build(arch: str, mode: str) -> None:
|
|||||||
with open(loggingpath, 'w', encoding='utf-8') as outfile:
|
with open(loggingpath, 'w', encoding='utf-8') as outfile:
|
||||||
outfile.write(txt)
|
outfile.write(txt)
|
||||||
|
|
||||||
|
android_platform = 23
|
||||||
|
|
||||||
subprocess.run(
|
subprocess.run(
|
||||||
[
|
[
|
||||||
'cmake',
|
'cmake',
|
||||||
'.',
|
'.',
|
||||||
f'-DANDROID_ABI={ARCHS[arch]}',
|
f'-DANDROID_ABI={ARCHS[arch]}',
|
||||||
'-DANDROID_NATIVE_API_LEVEL=21',
|
f'-DCMAKE_BUILD_TYPE={mode}',
|
||||||
|
'-DCMAKE_TOOLCHAIN_FILE='
|
||||||
|
f'{ndk_path}/build/cmake/android.toolchain.cmake',
|
||||||
|
f'-DANDROID_PLATFORM={android_platform}',
|
||||||
|
],
|
||||||
|
cwd=builddir_oboe,
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
subprocess.run(['make'], cwd=builddir_oboe, check=True)
|
||||||
|
|
||||||
|
subprocess.run(
|
||||||
|
[
|
||||||
|
'cmake',
|
||||||
|
'.',
|
||||||
|
f'-DANDROID_ABI={ARCHS[arch]}',
|
||||||
|
'-DALSOFT_INSTALL=0', # Prevents odd error.
|
||||||
|
'-DALSOFT_REQUIRE_OBOE=1',
|
||||||
|
'-DALSOFT_BACKEND_OPENSL=0',
|
||||||
|
'-DALSOFT_BACKEND_WAVE=0',
|
||||||
f'-DCMAKE_BUILD_TYPE={mode}',
|
f'-DCMAKE_BUILD_TYPE={mode}',
|
||||||
'-DLIBTYPE=STATIC',
|
'-DLIBTYPE=STATIC',
|
||||||
'-DCMAKE_TOOLCHAIN_FILE='
|
'-DCMAKE_TOOLCHAIN_FILE='
|
||||||
f'{ndk_path}/build/cmake/android.toolchain.cmake',
|
f'{ndk_path}/build/cmake/android.toolchain.cmake',
|
||||||
|
f'-DOBOE_SOURCE={os.path.abspath(builddir_oboe)}',
|
||||||
|
f'-DANDROID_PLATFORM={android_platform}',
|
||||||
],
|
],
|
||||||
cwd=builddir,
|
cwd=builddir,
|
||||||
check=True,
|
check=True,
|
||||||
@ -129,9 +172,13 @@ def gather() -> None:
|
|||||||
for arch, andrarch in ARCHS.items():
|
for arch, andrarch in ARCHS.items():
|
||||||
for mode in MODES:
|
for mode in MODES:
|
||||||
builddir = _build_dir(arch, mode)
|
builddir = _build_dir(arch, mode)
|
||||||
|
builddir_oboe = f'{builddir}_oboe'
|
||||||
installdir = f'{outdir}/lib/{andrarch}_{mode}'
|
installdir = f'{outdir}/lib/{andrarch}_{mode}'
|
||||||
subprocess.run(['mkdir', '-p', installdir], check=True)
|
subprocess.run(['mkdir', '-p', installdir], check=True)
|
||||||
subprocess.run(
|
subprocess.run(
|
||||||
['cp', f'{builddir}/libopenal.a', installdir], check=True
|
['cp', f'{builddir}/libopenal.a', installdir], check=True
|
||||||
)
|
)
|
||||||
|
subprocess.run(
|
||||||
|
['cp', f'{builddir_oboe}/liboboe.a', installdir], check=True
|
||||||
|
)
|
||||||
print('OpenAL gather successful!')
|
print('OpenAL gather successful!')
|
||||||
|
|||||||
@ -51,7 +51,7 @@ def sortlines() -> None:
|
|||||||
def openal_build_android() -> None:
|
def openal_build_android() -> None:
|
||||||
"""Build openalsoft for android."""
|
"""Build openalsoft for android."""
|
||||||
from efro.error import CleanError
|
from efro.error import CleanError
|
||||||
from efrotools.openalbuild import build
|
from efrotools.openalbuild import build_openal
|
||||||
|
|
||||||
pcommand.disallow_in_batch()
|
pcommand.disallow_in_batch()
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ def openal_build_android() -> None:
|
|||||||
' and one <MODE> arg: debug, release'
|
' and one <MODE> arg: debug, release'
|
||||||
)
|
)
|
||||||
|
|
||||||
build(args[0], args[1])
|
build_openal(args[0], args[1])
|
||||||
|
|
||||||
|
|
||||||
def openal_gather() -> None:
|
def openal_gather() -> None:
|
||||||
|
|||||||
@ -466,7 +466,7 @@ def build_android(rootdir: str, arch: str, debug: bool = False) -> None:
|
|||||||
# Ok; let 'er rip!
|
# Ok; let 'er rip!
|
||||||
exargs = ' --with-pydebug' if debug else ''
|
exargs = ' --with-pydebug' if debug else ''
|
||||||
subprocess.run(
|
subprocess.run(
|
||||||
f'ARCH={arch} ANDROID_API=21 ./build.sh{exargs} --without-ensurepip'
|
f'ARCH={arch} ANDROID_API=23 ./build.sh{exargs} --without-ensurepip'
|
||||||
f' --with-build-python=/home/ubuntu/.py311/bin/python3.11',
|
f' --with-build-python=/home/ubuntu/.py311/bin/python3.11',
|
||||||
shell=True,
|
shell=True,
|
||||||
check=True,
|
check=True,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user