Merge branch 'efroemling:master' into master

This commit is contained in:
Vishal 2023-11-21 16:06:54 +05:30 committed by GitHub
commit baefe3dcba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 259 additions and 135 deletions

106
.efrocachemap generated
View File

@ -421,7 +421,7 @@
"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": "02522e0d2593baf2e57a97fbfbfe3368", "build/assets/ba_data/data/langdata.json": "229f9ecdddd777a0be2471979a0a01d6",
"build/assets/ba_data/data/languages/arabic.json": "e0001d8542c904bc3c98a174f256efd9", "build/assets/ba_data/data/languages/arabic.json": "e0001d8542c904bc3c98a174f256efd9",
"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": "4e2f4f1f38216940953fcbee4da1563e",
@ -430,31 +430,31 @@
"build/assets/ba_data/data/languages/czech.json": "93c5fe0d884d95435da6c675f64e30e0", "build/assets/ba_data/data/languages/czech.json": "93c5fe0d884d95435da6c675f64e30e0",
"build/assets/ba_data/data/languages/danish.json": "3fd69080783d5c9dcc0af737f02b6f1e", "build/assets/ba_data/data/languages/danish.json": "3fd69080783d5c9dcc0af737f02b6f1e",
"build/assets/ba_data/data/languages/dutch.json": "22b44a33bf81142ba2befad14eb5746e", "build/assets/ba_data/data/languages/dutch.json": "22b44a33bf81142ba2befad14eb5746e",
"build/assets/ba_data/data/languages/english.json": "fe32cbe79483153db283e363da039a7a", "build/assets/ba_data/data/languages/english.json": "bd43b77b1ccca059573acbde148b4767",
"build/assets/ba_data/data/languages/esperanto.json": "0e397cfa5f3fb8cef5f4a64f21cda880", "build/assets/ba_data/data/languages/esperanto.json": "0e397cfa5f3fb8cef5f4a64f21cda880",
"build/assets/ba_data/data/languages/filipino.json": "afbda3adf14555e1567ee63c32e340e7", "build/assets/ba_data/data/languages/filipino.json": "afbda3adf14555e1567ee63c32e340e7",
"build/assets/ba_data/data/languages/french.json": "49ff6d211537b8003b8241438dca661d", "build/assets/ba_data/data/languages/french.json": "49ff6d211537b8003b8241438dca661d",
"build/assets/ba_data/data/languages/german.json": "450fa41ae264f29a5d1af22143d0d0ad", "build/assets/ba_data/data/languages/german.json": "450fa41ae264f29a5d1af22143d0d0ad",
"build/assets/ba_data/data/languages/gibberish.json": "00a9f70bccdfa407043e69a42e5b944c", "build/assets/ba_data/data/languages/gibberish.json": "9aae526303a22372fe9b4cf1781520ef",
"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": "8ea0c58a44a24edb131d0e53b074d1f6", "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": "97657eb2ab75d821045387b6d7a2b52d",
"build/assets/ba_data/data/languages/italian.json": "cda5760f247500657722c279bc2f2bc7", "build/assets/ba_data/data/languages/italian.json": "cda5760f247500657722c279bc2f2bc7",
"build/assets/ba_data/data/languages/korean.json": "ca1122a9ee551da3f75ae632012bd0e2", "build/assets/ba_data/data/languages/korean.json": "ca1122a9ee551da3f75ae632012bd0e2",
"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": "4f448b29ba04f2b789329600cb7f9ab7",
"build/assets/ba_data/data/languages/polish.json": "8bb8f7baa5efcf6cdd627140d209c2b2", "build/assets/ba_data/data/languages/polish.json": "b9a58b70ed5e99d8b7fa2392b2eb0cda",
"build/assets/ba_data/data/languages/portuguese.json": "c738cc76396305060d4f94cb77db5bec", "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",
"build/assets/ba_data/data/languages/russian.json": "cdaac43afde13ab622babe403b9858a4", "build/assets/ba_data/data/languages/russian.json": "e120993371f52edd2d99f2236188933c",
"build/assets/ba_data/data/languages/serbian.json": "d7452dd72ac0e51680cb39b5ebaa1c69", "build/assets/ba_data/data/languages/serbian.json": "d7452dd72ac0e51680cb39b5ebaa1c69",
"build/assets/ba_data/data/languages/slovak.json": "27962d53dc3f7dd4e877cd40faafeeef", "build/assets/ba_data/data/languages/slovak.json": "27962d53dc3f7dd4e877cd40faafeeef",
"build/assets/ba_data/data/languages/spanish.json": "f73b0d4d534f030f95c00385bb06cbc1", "build/assets/ba_data/data/languages/spanish.json": "80ea58bd3295a0252b7fdac9154aa22f",
"build/assets/ba_data/data/languages/swedish.json": "5142a96597d17d8344be96a603da64ac", "build/assets/ba_data/data/languages/swedish.json": "5142a96597d17d8344be96a603da64ac",
"build/assets/ba_data/data/languages/tamil.json": "b4de1a2851afe4869c82e9acd94cd89c", "build/assets/ba_data/data/languages/tamil.json": "b4de1a2851afe4869c82e9acd94cd89c",
"build/assets/ba_data/data/languages/thai.json": "77755219bbf5fb7eea0d6b226684f403", "build/assets/ba_data/data/languages/thai.json": "77755219bbf5fb7eea0d6b226684f403",
"build/assets/ba_data/data/languages/turkish.json": "326bcc54b69cb6a1bda4abb732f9f56f", "build/assets/ba_data/data/languages/turkish.json": "b1e491b70cec59cfa1057b8c5e7801b2",
"build/assets/ba_data/data/languages/ukrainian.json": "e5c861187c4c6db37d1a033f4ef3dd5a", "build/assets/ba_data/data/languages/ukrainian.json": "e5c861187c4c6db37d1a033f4ef3dd5a",
"build/assets/ba_data/data/languages/venetian.json": "9fe1a58d9e5dfb00f31ce3b2eb9993f4", "build/assets/ba_data/data/languages/venetian.json": "9fe1a58d9e5dfb00f31ce3b2eb9993f4",
"build/assets/ba_data/data/languages/vietnamese.json": "921cd1e50f60fe3e101f246e172750ba", "build/assets/ba_data/data/languages/vietnamese.json": "921cd1e50f60fe3e101f246e172750ba",
@ -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": "abab400c9116a3825a5bb90d31ebe3b7", "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "19f758d463a96209e647e651c611d1b9",
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "5641927c9074dc4e759d3761a42dd3cc", "build/prefab/full/linux_arm64_gui/release/ballisticakit": "49506eff59a21d3cfb6fc55db4edeeae",
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "113eb282e6f5d7a082f8dfc2f19db078", "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "1cd9dfdc832995ba84386803c2eb3d7e",
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "cdee95f3c6bc21f7ff3016ff3c719178", "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "f9786e628a44b5d14dbd842e29f37b4d",
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "a20fb4fd648a6e66bc5395f48796a5b8", "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "a21e3ab1ec336eb8f957deeee96926e4",
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "be599ec099f2a1f4109ceda6a05a8c62", "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "e93a34b23530cf29d443529af6a42d4c",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "f22486755f0c0f2b106926d5a9ee97c9", "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "2ecbe46fb8b6ddb96340e35e53d7e73e",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "ca382a4fa963a50af3675c811526ba76", "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "37d5f679d73736214f8d12980028511d",
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "00f392858c451a8d395c7cd7958f7af7", "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "b09fbdc4f44383ed0111ac19b13371dd",
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "1f66a8a8f8d8041667a4b6cb71baffbd", "build/prefab/full/mac_arm64_gui/release/ballisticakit": "b8332772459f472a559e05002ce6921c",
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "c4153466b51a30b444d2350156a9fbb7", "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "5e0cfb078710084739280d17cbc86732",
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "91c3c980de79faee6854c1c88408bd0c", "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "6b25f48718896540a46e9aef9f993c51",
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "143bfda2b349f5505068dd874802413f", "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "940db05971335a1a8a84e96adc948a84",
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "293cb9525c241d1dda224461db34b631", "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "98ab1223c634600b44e2c407b3cee6e2",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "6dc3c9f9637d3f4e16d0a9093a59b1e7", "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "3c1be40378854bffa24a2e118979e252",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "bbce1ea501fc419f6d83882b2c283eb0", "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "a1a8830a0892b6a8ed8827241cf848aa",
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "cceac583899afd4e97e4fd7dea2611fb", "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "27b755855aa9ebe54e536ad04a82b867",
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "6ad184e11ae0b85137b37bbf2a75b331", "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "f291bcc463de9b5172904304774d1c12",
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "a1b15a12b361ba60cead3f8045bbd545", "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "16bb769fd794945b09d6ed40ab11a411",
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "1949706b21961783d428034b03982521", "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "83a5455b631ececcddf5330693c2d38a",
"build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "dc8d1e0f82fe799cbbacfd89bbf04498", "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "ac33b224e5b4e35712eb98fcc20cab5b",
"build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "c6be3757c2ee85a7f4f8a66d327a24a0", "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "81ac92010f7957feffde3573745976d2",
"build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "dc8d1e0f82fe799cbbacfd89bbf04498", "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "ac33b224e5b4e35712eb98fcc20cab5b",
"build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "c6be3757c2ee85a7f4f8a66d327a24a0", "build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "81ac92010f7957feffde3573745976d2",
"build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "859470a05f3d968031ae9843bdf818c3", "build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "1d2d67df52456863593f5a32ee591c5f",
"build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "bd8926fb9d12b7f4972870efea006d54", "build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "4360984cf0a0e1664bd052894ebc522e",
"build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "859470a05f3d968031ae9843bdf818c3", "build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "1d2d67df52456863593f5a32ee591c5f",
"build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "bd8926fb9d12b7f4972870efea006d54", "build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "4360984cf0a0e1664bd052894ebc522e",
"build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "11eeb74f8cb307ed673768c0629ca302", "build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "f86bc9554c44e6a3041ee06ff7690ae2",
"build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "5f6ed20081020d554b1866389136b712", "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "c6815480bdfcbbb30ffe06bfc25a3fd2",
"build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "11eeb74f8cb307ed673768c0629ca302", "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "f86bc9554c44e6a3041ee06ff7690ae2",
"build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "5f6ed20081020d554b1866389136b712", "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "c6815480bdfcbbb30ffe06bfc25a3fd2",
"build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "d9407d62ab82cdf25e970e3fde8971fa", "build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "8e3f285a0d05918175c6054b3841621e",
"build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "856a05aadbe4b75baee3048296aa8eef", "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "5ec40f0445bc6415d9327c5b1cb0f645",
"build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "c5eb4a9161b68775876c4d19bff1cc1b", "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "2793d3aea54fc937322393dd779412a7",
"build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "856a05aadbe4b75baee3048296aa8eef", "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "5ec40f0445bc6415d9327c5b1cb0f645",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "f297a236664bf55b81f19e5c69d81b64", "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "d254bb364aa44360cac2003934af76f6",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "9eb9f987869a87ab1280d70c8069df6a", "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "0db2f48d7a46826de315df7ce473ab52",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "f269cab8edb50101fff358735255151d", "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "5ec488e800f024c0827deb229e4e1efc",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "2631845123a868a98ef1156c786d1cff", "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "430045c8d5f966488628ab5de5452e10",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "a5f59a9cd23e6b3ec18834a169d6a6e0", "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "892c0eb2ec182ccbdcb604713d5d5ba9",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "35b984001137f4bde7dc7bf4576da320", "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "3b2917f0882ac5889c12f2ca83269063",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "cf974280198d48a836b0f433ebf84b68", "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "bef209af05f0af8ee5fe6d33246d846d",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "97260251b62485cc95da5b41aa90f9ca", "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "93a8f27c51283913e35b0e2d8b8a37b0",
"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",

View File

@ -1,4 +1,16 @@
### 1.7.28 (build 21596, api 8, 2023-11-14) ### 1.7.29 (build 21612, api 8, 2023-11-20)
- Simply continued work on the big 1.7.28 update. I finally got the Mac App
Store version of the game updated (it had been stuck at 1.4!), and it turns
out that Apple AppStore submissions require the version number to increase
each time and not just the build number, so we may start seeing more minor
version bumps for that reason.
- 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
cryptic error messages such as "OpenGL function 'glActiveTexture2D' not
found".
### 1.7.28 (build 21599, api 8, 2023-11-16)
- Turning off ticket continues on all platforms. I'll be moving the game towards - Turning off ticket continues on all platforms. I'll be moving the game towards
a new monetization scheme mostly based on cosmetics and this has always felt a a new monetization scheme mostly based on cosmetics and this has always felt a

View File

@ -103,7 +103,8 @@ ctx.src_unchecked_paths = {
'ballisticakit-xcode/BallisticaKit Shared/Assets.xcassets/*/*.png', 'ballisticakit-xcode/BallisticaKit Shared/Assets.xcassets/*/*.png',
'ballisticakit-xcode/BallisticaKit Shared/Assets.xcassets/*/*/*.png', 'ballisticakit-xcode/BallisticaKit Shared/Assets.xcassets/*/*/*.png',
'ballisticakit-xcode/BallisticaKit Shared/Assets.xcassets/*/*/*/*/*.png', 'ballisticakit-xcode/BallisticaKit Shared/Assets.xcassets/*/*/*/*/*.png',
'ballisticakit-xcode/BallisticaKit.xcodeproj/xcuserdata', 'ballisticakit-xcode/BallisticaKit.xcodeproj/'
'project.xcworkspace/xcuserdata',
'ballisticakit-android/BallisticaKit/src/*/res/*/*.png', 'ballisticakit-android/BallisticaKit/src/*/res/*/*.png',
'ballisticakit-android/BallisticaKit/src/*/assets/ballistica_files', 'ballisticakit-android/BallisticaKit/src/*/assets/ballistica_files',
'ballisticakit-android/local.properties', 'ballisticakit-android/local.properties',

View File

@ -6,7 +6,7 @@ from __future__ import annotations
import hashlib import hashlib
import logging import logging
from typing import TYPE_CHECKING from typing import TYPE_CHECKING, assert_never
from efro.call import tpartial from efro.call import tpartial
from efro.error import CommunicationError from efro.error import CommunicationError
@ -199,18 +199,26 @@ class AccountV2Subsystem:
state.login_id state.login_id
) )
# Special case: if the user is already signed in but not with # Special case: if the user is already signed in but not
# this implicit login, we may want to let them know that the # with this implicit login, let them know that the 'Welcome
# 'Welcome back FOO' they likely just saw is not actually # back FOO' they likely just saw is not actually accurate.
# accurate.
if ( if (
self.primary is not None self.primary is not None
and not self.login_adapters[login_type].is_back_end_active() and not self.login_adapters[login_type].is_back_end_active()
): ):
service_str: Lstr | None
if login_type is LoginType.GPGS: if login_type is LoginType.GPGS:
service_str = Lstr(resource='googlePlayText') service_str = Lstr(resource='googlePlayText')
else: elif login_type is LoginType.GAME_CENTER:
# Note: Apparently Game Center is just called 'Game
# Center' in all languages. Can revisit if not true.
# https://developer.apple.com/forums/thread/725779
service_str = Lstr(value='Game Center')
elif login_type is LoginType.EMAIL:
# Not possible; just here for exhaustive coverage.
service_str = None service_str = None
else:
assert_never(login_type)
if service_str is not None: if service_str is not None:
_babase.apptimer( _babase.apptimer(
2.0, 2.0,

View File

@ -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 = 21596 TARGET_BALLISTICA_BUILD = 21612
TARGET_BALLISTICA_VERSION = '1.7.28' TARGET_BALLISTICA_VERSION = '1.7.29'
@dataclass @dataclass

View File

@ -66,6 +66,16 @@ class UIV1Subsystem(babase.AppSubsystem):
# a more elegant way once we revamp high level UI stuff a bit. # a more elegant way once we revamp high level UI stuff a bit.
self.selecting_private_party_playlist: bool = False self.selecting_private_party_playlist: bool = False
@property
def available(self) -> bool:
"""Can uiv1 currently be used?
Code that may run in headless mode, before the UI has been spun up,
while other ui systems are active, etc. can check this to avoid
likely erroring.
"""
return _bauiv1.is_available()
@property @property
def uiscale(self) -> babase.UIScale: def uiscale(self) -> babase.UIScale:
"""Current ui scale for the app.""" """Current ui scale for the app."""

View File

@ -654,6 +654,9 @@ class AccountSettingsWindow(bui.Window):
position=((self._sub_width - button_width) * 0.5, v - 20), position=((self._sub_width - button_width) * 0.5, v - 20),
autoselect=True, autoselect=True,
size=(button_width, 60), size=(button_width, 60),
# Note: Apparently Game Center is just called 'Game Center'
# in all languages. Can revisit if not true.
# https://developer.apple.com/forums/thread/725779
label=bui.Lstr( label=bui.Lstr(
value='${A}${B}', value='${A}${B}',
subs=[ subs=[
@ -860,7 +863,7 @@ class AccountSettingsWindow(bui.Window):
button_width = 300 button_width = 300
v -= game_service_button_space * 0.6 v -= game_service_button_space * 0.6
if game_center_active: if game_center_active:
# Update: Apparently Game Center is just called 'Game Center' # Note: Apparently Game Center is just called 'Game Center'
# in all languages. Can revisit if not true. # in all languages. Can revisit if not true.
# https://developer.apple.com/forums/thread/725779 # https://developer.apple.com/forums/thread/725779
game_service_button_label = bui.Lstr( game_service_button_label = bui.Lstr(

View File

@ -62,14 +62,11 @@ class V2ProxySignInWindow(bui.Window):
label=bui.Lstr(resource='cancelText'), label=bui.Lstr(resource='cancelText'),
on_activate_call=self._done, on_activate_call=self._done,
autoselect=True, autoselect=True,
color=(0.55, 0.5, 0.6),
textcolor=(0.75, 0.7, 0.8),
) )
if bool(False): bui.containerwidget(
bui.containerwidget( edit=self._root_widget, cancel_button=self._cancel_button
edit=self._root_widget, cancel_button=self._cancel_button )
)
self._update_timer: bui.AppTimer | None = None self._update_timer: bui.AppTimer | None = None

View File

@ -26,7 +26,7 @@ class PromoCodeWindow(bui.Window):
transition = 'in_right' transition = 'in_right'
width = 450 width = 450
height = 230 height = 330
self._modal = modal self._modal = modal
self._r = 'promoCodeWindow' self._r = 'promoCodeWindow'
@ -62,17 +62,50 @@ class PromoCodeWindow(bui.Window):
iconscale=1.2, iconscale=1.2,
) )
v = height - 74
bui.textwidget(
parent=self._root_widget,
text=bui.Lstr(resource='codesExplainText'),
maxwidth=width * 0.9,
position=(width * 0.5, v),
color=(0.7, 0.7, 0.7, 1.0),
size=(0, 0),
scale=0.8,
h_align='center',
v_align='center',
)
v -= 60
bui.textwidget(
parent=self._root_widget,
text=bui.Lstr(
resource='supportEmailText',
subs=[('${EMAIL}', 'support@froemling.net')],
),
maxwidth=width * 0.9,
position=(width * 0.5, v),
color=(0.7, 0.7, 0.7, 1.0),
size=(0, 0),
scale=0.65,
h_align='center',
v_align='center',
)
v -= 80
bui.textwidget( bui.textwidget(
parent=self._root_widget, parent=self._root_widget,
text=bui.Lstr(resource=self._r + '.codeText'), text=bui.Lstr(resource=self._r + '.codeText'),
position=(22, height - 113), position=(22, v),
color=(0.8, 0.8, 0.8, 1.0), color=(0.8, 0.8, 0.8, 1.0),
size=(90, 30), size=(90, 30),
h_align='right', h_align='right',
) )
v -= 8
self._text_field = bui.textwidget( self._text_field = bui.textwidget(
parent=self._root_widget, parent=self._root_widget,
position=(125, height - 121), position=(125, v),
size=(280, 46), size=(280, 46),
text='', text='',
h_align='left', h_align='left',
@ -86,10 +119,11 @@ class PromoCodeWindow(bui.Window):
) )
bui.widget(edit=btn, down_widget=self._text_field) bui.widget(edit=btn, down_widget=self._text_field)
v -= 79
b_width = 200 b_width = 200
self._enter_button = btn2 = bui.buttonwidget( self._enter_button = btn2 = bui.buttonwidget(
parent=self._root_widget, parent=self._root_widget,
position=(width * 0.5 - b_width * 0.5, height - 200), position=(width * 0.5 - b_width * 0.5, v),
size=(b_width, 60), size=(b_width, 60),
scale=1.0, scale=1.0,
label=bui.Lstr( label=bui.Lstr(

View File

@ -27,7 +27,10 @@ namespace ballistica::base {
class AppAdapterApple::ScopedAllowGraphics_ { class AppAdapterApple::ScopedAllowGraphics_ {
public: public:
explicit ScopedAllowGraphics_(AppAdapterApple* adapter) : adapter_{adapter} { explicit ScopedAllowGraphics_(AppAdapterApple* adapter) : adapter_{adapter} {
// We currently assume only one thread will be doing this at any given
// time; will need to add a lock if that's not always the case.
assert(!adapter_->graphics_allowed_); assert(!adapter_->graphics_allowed_);
// Keep graphics thread updated each time through since it can change.
adapter->graphics_thread_ = std::this_thread::get_id(); adapter->graphics_thread_ = std::this_thread::get_id();
adapter->graphics_allowed_ = true; adapter->graphics_allowed_ = true;
} }
@ -99,9 +102,9 @@ void AppAdapterApple::ReloadRenderer_(const GraphicsSettings* settings) {
gs->LoadRenderer(); gs->LoadRenderer();
} }
void AppAdapterApple::UpdateScreenSizes_() { // void AppAdapterApple::UpdateScreenSizes_() {
assert(g_base->app_adapter->InGraphicsContext()); // assert(g_base->app_adapter->InGraphicsContext());
} // }
auto AppAdapterApple::TryRender() -> bool { auto AppAdapterApple::TryRender() -> bool {
auto allow = ScopedAllowGraphics_(this); auto allow = ScopedAllowGraphics_(this);
@ -187,7 +190,7 @@ auto AppAdapterApple::ShouldUseCursor() -> bool {
} }
auto AppAdapterApple::HasHardwareCursor() -> bool { auto AppAdapterApple::HasHardwareCursor() -> bool {
// (mac should be only build getting called here) // Mac should be only build getting called here (see ShouldUseCursor).
assert(g_buildconfig.ostype_macos()); assert(g_buildconfig.ostype_macos());
return true; return true;

View File

@ -66,7 +66,7 @@ class AppAdapterApple : public AppAdapter {
private: private:
class ScopedAllowGraphics_; class ScopedAllowGraphics_;
void UpdateScreenSizes_(); // void UpdateScreenSizes_();
void ReloadRenderer_(const GraphicsSettings* settings); void ReloadRenderer_(const GraphicsSettings* settings);
std::thread::id graphics_thread_{}; std::thread::id graphics_thread_{};

View File

@ -239,9 +239,6 @@ void BaseFeatureSet::StartApp() {
// to avoid crashing if called early. // to avoid crashing if called early.
app_started_ = true; app_started_ = true;
// Inform anyone who wants to know that we're done starting.
platform->OnMainThreadStartAppComplete();
// As the last step of this phase, tell the logic thread to apply the app // As the last step of this phase, tell the logic thread to apply the app
// config which will kick off screen creation and otherwise get the ball // config which will kick off screen creation and otherwise get the ball
// rolling. // rolling.

View File

@ -52,7 +52,7 @@ bool g_sys_gl_inited{};
// Provide an empty implementation of this if noone provided a real one. // Provide an empty implementation of this if noone provided a real one.
#ifndef BA_HAS_SYS_GL_INIT #ifndef BA_HAS_SYS_GL_INIT
void SysGLInit() { assert(!g_sys_gl_inited); } void SysGLInit(RendererGL* renderer) { assert(!g_sys_gl_inited); }
#endif // BA_HAS_SYS_GL_INIT #endif // BA_HAS_SYS_GL_INIT

View File

@ -220,6 +220,7 @@ inline void glDepthRange(double min, double max) {
#endif #endif
namespace ballistica::base { namespace ballistica::base {
class RendererGL;
extern bool g_sys_gl_inited; extern bool g_sys_gl_inited;
@ -228,7 +229,7 @@ extern bool g_sys_gl_inited;
// called only once and then g_sys_gl_inited set. A platform that defines // called only once and then g_sys_gl_inited set. A platform that defines
// this should define BA_HAS_SYS_GL_INIT; otherwise a default empty // this should define BA_HAS_SYS_GL_INIT; otherwise a default empty
// implementation will be defined. // implementation will be defined.
void SysGLInit(); void SysGLInit(RendererGL* renderer);
} // namespace ballistica::base } // namespace ballistica::base

View File

@ -5,19 +5,22 @@
#include "SDL.h" #include "SDL.h"
#include "ballistica/base/graphics/gl/gl_sys.h" #include "ballistica/base/graphics/gl/gl_sys.h"
#include "ballistica/base/graphics/gl/renderer_gl.h"
#include "ballistica/shared/ballistica.h" #include "ballistica/shared/ballistica.h"
#pragma comment(lib, "opengl32.lib") #pragma comment(lib, "opengl32.lib")
// #pragma comment(lib, "glu32.lib")
PFNGLGETINTERNALFORMATIVPROC glGetInternalformativ{}; PFNGLGETINTERNALFORMATIVPROC glGetInternalformativ{};
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC
glGetFramebufferAttachmentParameteriv{}; glGetFramebufferAttachmentParameteriv{};
PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate{}; PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate{};
PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2DBA{};
PFNGLACTIVETEXTUREPROC glActiveTextureBA{}; PFNGLACTIVETEXTUREPROC glActiveTextureBA{};
// PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImageARB{};
// PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB{}; // PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB{};
PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB{}; PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB{};
// PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB{};
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT{}; PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT{};
PFNGLCREATEPROGRAMPROC glCreateProgram{}; PFNGLCREATEPROGRAMPROC glCreateProgram{};
PFNGLCREATESHADERPROC glCreateShader{}; PFNGLCREATESHADERPROC glCreateShader{};
@ -57,7 +60,6 @@ PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray{};
PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray{}; PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray{};
PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fv{}; PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fv{};
PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation{}; PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation{};
PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2DBA{};
PFNGLGETSHADERIVPROC glGetShaderiv{}; PFNGLGETSHADERIVPROC glGetShaderiv{};
PFNGLGETPROGRAMIVPROC glGetProgramiv{}; PFNGLGETPROGRAMIVPROC glGetProgramiv{};
PFNGLDELETESHADERPROC glDeleteShader{}; PFNGLDELETESHADERPROC glDeleteShader{};
@ -90,11 +92,16 @@ static auto GetGLFunc_(const char* name, bool required) -> void* {
#define GET2(PTRTYPE, FUNC, REQUIRED) \ #define GET2(PTRTYPE, FUNC, REQUIRED) \
FUNC##BA = (PTRTYPE)GetGLFunc_(#FUNC, REQUIRED) FUNC##BA = (PTRTYPE)GetGLFunc_(#FUNC, REQUIRED)
void SysGLInit() { void SysGLInit(RendererGL* renderer) {
assert(!g_sys_gl_inited); assert(!g_sys_gl_inited);
SDL_GL_LoadLibrary(nullptr); SDL_GL_LoadLibrary(nullptr);
// Check overall GL version here before loading any extended functions.
// We'd rather die with a 'Your OpenGL is too old' error rather than a
// 'Could not load function foofDinglePlop2XZ'.
renderer->CheckGLVersion();
void* testval{}; void* testval{};
PFNGLGETINTERNALFORMATIVPROC fptr; PFNGLGETINTERNALFORMATIVPROC fptr;
@ -104,18 +111,13 @@ void SysGLInit() {
// so we can survive without it. // so we can survive without it.
GET(PFNGLGETINTERNALFORMATIVPROC, glGetInternalformativ, false); GET(PFNGLGETINTERNALFORMATIVPROC, glGetInternalformativ, false);
// For checking srgb stuff. GET(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate, true);
GET(PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, GET(PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC,
glGetFramebufferAttachmentParameteriv, false); glGetFramebufferAttachmentParameteriv, true);
GET(PFNGLGETSTRINGIPROC, glGetStringi, true);
// Needed for VR overlay.
GET(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate, false);
GET2(PFNGLACTIVETEXTUREPROC, glActiveTexture, true); GET2(PFNGLACTIVETEXTUREPROC, glActiveTexture, true);
// GET(PFNGLCLIENTACTIVETEXTUREARBPROC, glClientActiveTextureARB, true);
GET(PFNWGLSWAPINTERVALEXTPROC, wglSwapIntervalEXT, true); GET(PFNWGLSWAPINTERVALEXTPROC, wglSwapIntervalEXT, true);
GET(PFNGLPOINTPARAMETERFVARBPROC, glPointParameterfvARB, true); GET(PFNGLPOINTPARAMETERFVARBPROC, glPointParameterfvARB, true);
// GET(PFNGLPOINTPARAMETERFARBPROC, glPointParameterfARB, true);
GET(PFNGLCREATEPROGRAMPROC, glCreateProgram, true); GET(PFNGLCREATEPROGRAMPROC, glCreateProgram, true);
GET(PFNGLCREATESHADERPROC, glCreateShader, true); GET(PFNGLCREATESHADERPROC, glCreateShader, true);
GET(PFNGLSHADERSOURCEPROC, glShaderSource, true); GET(PFNGLSHADERSOURCEPROC, glShaderSource, true);
@ -159,7 +161,6 @@ void SysGLInit() {
GET(PFNGLDETACHSHADERPROC, glDetachShader, true); GET(PFNGLDETACHSHADERPROC, glDetachShader, true);
GET(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog, true); GET(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog, true);
GET(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog, true); GET(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog, true);
GET(PFNGLGETSTRINGIPROC, glGetStringi, true);
GET(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray, true); GET(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray, true);
GET(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays, true); GET(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays, true);
GET(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays, true); GET(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays, true);

View File

@ -31,9 +31,13 @@ extern PFNGLGETINTERNALFORMATIVPROC glGetInternalformativ;
extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC
glGetFramebufferAttachmentParameteriv; glGetFramebufferAttachmentParameteriv;
extern PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate; extern PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate;
// Hopefully can switch this back if SDL gets fixed.
extern PFNGLACTIVETEXTUREPROC glActiveTextureBA; extern PFNGLACTIVETEXTUREPROC glActiveTextureBA;
extern PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2DBA;
// extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB; // extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
// extern PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB; // extern PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB;
extern PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB; extern PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB;
extern PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT; extern PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT;
extern PFNGLCREATEPROGRAMPROC glCreateProgram; extern PFNGLCREATEPROGRAMPROC glCreateProgram;
@ -74,7 +78,6 @@ extern PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
extern PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; extern PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray;
extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fv; extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fv;
extern PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation; extern PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation;
extern PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2DBA;
extern PFNGLGETSHADERIVPROC glGetShaderiv; extern PFNGLGETSHADERIVPROC glGetShaderiv;
extern PFNGLGETPROGRAMIVPROC glGetProgramiv; extern PFNGLGETPROGRAMIVPROC glGetProgramiv;
extern PFNGLDELETESHADERPROC glDeleteShader; extern PFNGLDELETESHADERPROC glDeleteShader;

View File

@ -72,7 +72,7 @@ RendererGL::RendererGL() {
// Run any one-time setup the platform might need to do // Run any one-time setup the platform might need to do
// (grabbing function pointers, etc.) // (grabbing function pointers, etc.)
if (!g_sys_gl_inited) { if (!g_sys_gl_inited) {
SysGLInit(); SysGLInit(this);
g_sys_gl_inited = true; g_sys_gl_inited = true;
} }
@ -152,10 +152,33 @@ static auto CheckGLExtension(const std::vector<std::string>& exts,
return false; return false;
} }
// This is split into its own call because systems that load GL calls
// dynamically may want to run the check before trying to load said GL
// calls. It's better to die with a 'Your OpenGL is too old' error rather
// than a 'Could not load function foofDinglePlop2XZ'.
void RendererGL::CheckGLVersion() {
if (checked_gl_version_) {
return;
}
const char* version_str = (const char*)glGetString(GL_VERSION);
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.
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;
}
void RendererGL::CheckGLCapabilities_() { void RendererGL::CheckGLCapabilities_() {
BA_DEBUG_CHECK_GL_ERROR; BA_DEBUG_CHECK_GL_ERROR;
assert(g_base->app_adapter->InGraphicsContext()); assert(g_base->app_adapter->InGraphicsContext());
// Die if our overall GL version is too old.
CheckGLVersion();
const char* renderer = (const char*)glGetString(GL_RENDERER); const char* renderer = (const char*)glGetString(GL_RENDERER);
BA_PRECONDITION_FATAL(renderer); BA_PRECONDITION_FATAL(renderer);
const char* vendor = (const char*)glGetString(GL_VENDOR); const char* vendor = (const char*)glGetString(GL_VENDOR);
@ -163,15 +186,9 @@ void RendererGL::CheckGLCapabilities_() {
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.
if (version_str[0] != '3' && version_str[0] != '4') {
FatalError(std::string("Invalid OpenGL version found (") + version_str
+ "). We require 3.0 or later.");
}
// Now fetch exact major/minor versions. This query requires version 3.0 // Now fetch exact major/minor versions. This query requires version 3.0
// or newer which is why we checked that above. // or newer which is why we checked overall version in CheckGLVersion()
// above.
glGetError(); // Clear any existing error so we don't die on it here. glGetError(); // Clear any existing error so we don't die on it here.
glGetIntegerv(GL_MAJOR_VERSION, &gl_version_major_); glGetIntegerv(GL_MAJOR_VERSION, &gl_version_major_);
BA_PRECONDITION_FATAL(glGetError() == GL_NO_ERROR); BA_PRECONDITION_FATAL(glGetError() == GL_NO_ERROR);

View File

@ -64,6 +64,7 @@ class RendererGL : public Renderer {
class ProgramSpriteGL; class ProgramSpriteGL;
public: public:
void CheckGLVersion();
static void CheckGLError(const char* file, int line); static void CheckGLError(const char* file, int line);
static auto GLErrorToString(GLenum err) -> std::string; static auto GLErrorToString(GLenum err) -> std::string;
static auto GetGLTextureFormat(TextureFormat f) -> GLenum; static auto GetGLTextureFormat(TextureFormat f) -> GLenum;
@ -259,22 +260,24 @@ class RendererGL : public Renderer {
void SetBlend(bool b); void SetBlend(bool b);
void SetBlendPremult(bool b); void SetBlendPremult(bool b);
bool blend_{}; GraphicsQuality vignette_quality_{};
bool blend_premult_{}; bool blend_ : 1 {};
bool first_extension_check_{true}; bool blend_premult_ : 1 {};
bool is_tegra_4_{}; bool first_extension_check_ : 1 {true};
bool is_tegra_k1_{}; bool is_tegra_4_ : 1 {};
bool is_recent_adreno_{}; bool is_tegra_k1_ : 1 {};
bool is_adreno_{}; bool is_recent_adreno_ : 1 {};
bool enable_msaa_{}; bool is_adreno_ : 1 {};
bool draw_at_equal_depth_{}; bool enable_msaa_ : 1 {};
bool depth_writing_enabled_{}; bool draw_at_equal_depth_ : 1 {};
bool depth_testing_enabled_{}; bool depth_writing_enabled_ : 1 {};
bool data_loaded_{}; bool depth_testing_enabled_ : 1 {};
bool draw_front_{}; bool data_loaded_ : 1 {};
bool got_screen_framebuffer_{}; bool draw_front_ : 1 {};
bool double_sided_{}; bool got_screen_framebuffer_ : 1 {};
bool invalidate_framebuffer_support_{}; bool double_sided_ : 1 {};
bool invalidate_framebuffer_support_ : 1 {};
bool checked_gl_version_ : 1 {};
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_{};
@ -291,7 +294,6 @@ class RendererGL : public Renderer {
GLint screen_framebuffer_{}; GLint screen_framebuffer_{};
GLuint random_tex_{}; GLuint random_tex_{};
GLuint vignette_tex_{}; GLuint vignette_tex_{};
GraphicsQuality vignette_quality_{};
GLint viewport_x_{}; GLint viewport_x_{};
GLint viewport_y_{}; GLint viewport_y_{};
GLint viewport_width_{}; GLint viewport_width_{};

View File

@ -165,8 +165,6 @@ void BasePlatform::SetupInterruptHandling() {
#endif #endif
} }
void BasePlatform::OnMainThreadStartAppComplete() {}
void BasePlatform::OnAppStart() { assert(g_base->InLogicThread()); } void BasePlatform::OnAppStart() { assert(g_base->InLogicThread()); }
void BasePlatform::OnAppPause() { assert(g_base->InLogicThread()); } void BasePlatform::OnAppPause() { assert(g_base->InLogicThread()); }
void BasePlatform::OnAppResume() { assert(g_base->InLogicThread()); } void BasePlatform::OnAppResume() { assert(g_base->InLogicThread()); }

View File

@ -24,10 +24,6 @@ class BasePlatform {
#pragma mark APP EVENTS / LIFECYCLE -------------------------------------------- #pragma mark APP EVENTS / LIFECYCLE --------------------------------------------
/// Called to inform the platform that all subsystems are up and running
/// and it can start talking to them.
virtual void OnMainThreadStartAppComplete();
// Logic thread callbacks. // Logic thread callbacks.
virtual void OnAppStart(); virtual void OnAppStart();
virtual void OnAppPause(); virtual void OnAppPause();

View File

@ -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 = 21596; const int kEngineBuildNumber = 21612;
const char* kEngineVersion = "1.7.28"; const char* kEngineVersion = "1.7.29";
const int kEngineApiVersion = 8; const int kEngineApiVersion = 8;
#if BA_MONOLITHIC_BUILD #if BA_MONOLITHIC_BUILD

View File

@ -2821,7 +2821,7 @@ static PyMethodDef PyIsPartyIconVisibleDef = {
"(internal)", "(internal)",
}; };
// ------------------------ is_party_icon_visible ------------------------------ // ----------------------------- toolbar_test ----------------------------------
static auto PyToolbarTest(PyObject* self) -> PyObject* { static auto PyToolbarTest(PyObject* self) -> PyObject* {
BA_PYTHON_TRY; BA_PYTHON_TRY;
@ -2843,6 +2843,31 @@ static PyMethodDef PyToolbarTestDef = {
"(internal)", "(internal)",
}; };
// ----------------------------- is_available ----------------------------------
static auto PyIsAvailable(PyObject* self) -> PyObject* {
BA_PYTHON_TRY;
BA_PRECONDITION(g_base->InLogicThread());
// Consider ourself available if the active ui delegate is us.
if (dynamic_cast<UIV1FeatureSet*>(g_base->ui->delegate()) != nullptr) {
Py_RETURN_TRUE;
} else {
Py_RETURN_FALSE;
}
BA_PYTHON_CATCH;
}
static PyMethodDef PyIsAvailableDef = {
"is_available", // name
(PyCFunction)PyIsAvailable, // method
METH_NOARGS, // flags
"is_available() -> bool\n"
"\n"
"(internal)",
};
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
auto PythonMethodsUIV1::GetMethods() -> std::vector<PyMethodDef> { auto PythonMethodsUIV1::GetMethods() -> std::vector<PyMethodDef> {
@ -2877,6 +2902,7 @@ auto PythonMethodsUIV1::GetMethods() -> std::vector<PyMethodDef> {
PyGetTextureDef, PyGetTextureDef,
PyGetMeshDef, PyGetMeshDef,
PyToolbarTestDef, PyToolbarTestDef,
PyIsAvailableDef,
}; };
} }

View File

@ -309,7 +309,22 @@ class ResourcesMakefileGenerator:
] ]
for size in sizes: for size in sizes:
res = int(size[0] * size[1]) res = int(size[0] * size[1])
src = os.path.join('icon', 'icon_clipped_mac.png') # The largest size gets used by the Mac App Store, and lots
# of games seem to fill their entire icon canvas instead of
# sticking with the big-sur icon size, so ours looks kinda
# small next to those if we don't do the same. Strangely,
# iOS apps in the Mac App Store also show up large like that
# (as of Nov 2023). So we use a separate as-big-as-possible
# icon for our largest size only. The downside of this is
# our icon changes in appearance if someone cranks the
# finder view options icon size slider all the way up, but
# who actually does that?
srcname = (
'icon_clipped_mac_app_store.png'
if size[0] == 512
else 'icon_clipped_mac.png'
)
src = os.path.join('icon', srcname)
dst = os.path.join( dst = os.path.join(
ROOT_DIR, ROOT_DIR,
f'{self.namel}-xcode', f'{self.namel}-xcode',

View File

@ -42,7 +42,7 @@ OPENSSL_VER_ANDROID = '3.0.12'
LIBFFI_VER_APPLE = '3.4.4' LIBFFI_VER_APPLE = '3.4.4'
BZIP2_VER_APPLE = '1.0.8' BZIP2_VER_APPLE = '1.0.8'
XZ_VER_APPLE = '5.4.5' XZ_VER_APPLE = '5.4.4'
# Android repo doesn't seem to be getting updated much so manually # Android repo doesn't seem to be getting updated much so manually
# bumping various versions to keep things up to date. # bumping various versions to keep things up to date.