From 39f52ddafcbdb741cf7bcf209049e1f3cb9d3ad7 Mon Sep 17 00:00:00 2001 From: Mark Date: Sun, 4 Feb 2024 22:41:26 -0800 Subject: [PATCH] Fixed radar --- Cargo.lock | 388 ++++++++++---------- Cargo.toml | 8 +- content/ui/flying.rhai | 245 ++++++++++++ crates/content/src/part/config.rs | 6 +- crates/content/src/part/system.rs | 6 +- crates/render/Cargo.toml | 1 + crates/render/src/ui/api/color.rs | 2 +- crates/render/src/ui/api/config.rs | 28 ++ crates/render/src/ui/api/mod.rs | 3 + crates/render/src/ui/api/state.rs | 124 +++++-- crates/render/src/ui/api/vector.rs | 47 +++ crates/render/src/ui/executor.rs | 163 ++++++-- crates/render/src/ui/state.rs | 22 +- crates/render/src/ui/util/sprite.rs | 28 +- crates/system/src/phys/mod.rs | 8 + crates/system/src/phys/objects/ship/ship.rs | 5 + crates/util/src/lib.rs | 5 + 17 files changed, 815 insertions(+), 274 deletions(-) create mode 100644 crates/render/src/ui/api/config.rs create mode 100644 crates/render/src/ui/api/vector.rs diff --git a/Cargo.lock b/Cargo.lock index b7f6144..9efe3e1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,9 +35,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", "const-random", @@ -108,9 +108,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "2faccea4cc4ab4a667ce676a30e8ec13922a692c99bb8f5b11f1502c72e04220" [[package]] name = "anstyle-parse" @@ -142,9 +142,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.76" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59d2a3357dde987206219e78ecfbbb6e8dad06cbb65292758d3270e6254f7355" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "approx" @@ -232,9 +232,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "block" @@ -269,9 +269,9 @@ checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9" dependencies = [ "bytemuck_derive", ] @@ -284,7 +284,7 @@ checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.48", ] [[package]] @@ -331,9 +331,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.32" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41daef31d7a747c5c847246f36de49ced6f7403b4cdabc807a97b5cc184cda7a" +checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" dependencies = [ "android-tzdata", "iana-time-zone", @@ -374,7 +374,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.48", ] [[package]] @@ -503,11 +503,10 @@ dependencies = [ [[package]] name = "crossbeam" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eb9105919ca8e40d437fc9cbb8f1975d916f1bd28afe795a48aae32a2cc8920" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" dependencies = [ - "cfg-if", "crossbeam-channel", "crossbeam-deque", "crossbeam-epoch", @@ -517,54 +516,46 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a9b73a36529d9c47029b9fb3a6f0ea3cc916a261195352ba19e770fc1748b2" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.17" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc6598521bb5a83d491e8c1fe51db7296019d2ca3cb93cc6c2a20369a4d78a2" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.18" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" @@ -578,7 +569,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16e44ab292b1dddfdaf7be62cfd8877df52f2f3fde5858d95bab606be259f20" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libloading 0.8.1", "winapi", ] @@ -654,9 +645,9 @@ dependencies = [ [[package]] name = "exr" -version = "1.71.0" +version = "1.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" dependencies = [ "bit_field", "flume", @@ -670,9 +661,9 @@ dependencies = [ [[package]] name = "fdeflate" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -706,10 +697,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "fontconfig-parser" -version = "0.5.3" +name = "font-types" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "674e258f4b5d2dcd63888c01c68413c51f565e8af99d2f7701c7b81d79ef41c4" +checksum = "0bd7f3ea17572640b606b35df42cfb6ecdf003704b062580e59918692190b73d" + +[[package]] +name = "fontconfig-parser" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a595cb550439a117696039dfc69830492058211b771a2a165379f2a1a53d84d" dependencies = [ "roxmltree", ] @@ -755,7 +752,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.48", ] [[package]] @@ -772,15 +769,15 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "galactica" @@ -865,6 +862,7 @@ dependencies = [ "log", "nalgebra", "rand", + "rapier2d", "rhai", "wgpu", "winit", @@ -894,9 +892,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", @@ -934,9 +932,9 @@ dependencies = [ [[package]] name = "glow" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "886c2a30b160c4c6fec8f987430c26b526b7988ca71f664e6a699ddf6f9601e4" +checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" dependencies = [ "js-sys", "slotmap", @@ -971,7 +969,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "gpu-alloc-types", ] @@ -981,7 +979,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", ] [[package]] @@ -1004,7 +1002,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "gpu-descriptor-types", "hashbrown 0.14.3", ] @@ -1015,15 +1013,16 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", ] [[package]] name = "half" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" dependencies = [ + "cfg-if", "crunchy", ] @@ -1078,16 +1077,16 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "iana-time-zone" -version = "0.1.59" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -1101,9 +1100,9 @@ dependencies = [ [[package]] name = "image" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" dependencies = [ "bytemuck", "byteorder", @@ -1111,7 +1110,6 @@ dependencies = [ "exr", "gif", "jpeg-decoder", - "num-rational", "num-traits", "png", "qoi", @@ -1130,9 +1128,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -1173,18 +1171,18 @@ dependencies = [ [[package]] name = "jpeg-decoder" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" dependencies = [ "rayon", ] [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" dependencies = [ "wasm-bindgen", ] @@ -1220,9 +1218,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" @@ -1256,7 +1254,7 @@ version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libc", "redox_syscall 0.4.1", ] @@ -1320,9 +1318,9 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7" +checksum = "db2c024b41519440580066ba82aab04092b333e09066a5eb86c7c4890df31f22" dependencies = [ "hashbrown 0.14.3", ] @@ -1348,9 +1346,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memmap2" @@ -1385,7 +1383,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -1396,9 +1394,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", "simd-adler32", @@ -1423,10 +1421,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae585df4b6514cf8842ac0f1ab4992edc975892704835b549cf818dc0191249e" dependencies = [ "bit-set", - "bitflags 2.4.1", + "bitflags 2.4.2", "codespan-reporting", "hexf-parse", - "indexmap 2.1.0", + "indexmap 2.2.2", "log", "num-traits", "rustc-hash", @@ -1546,6 +1544,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -1616,7 +1625,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.48", ] [[package]] @@ -1666,9 +1675,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] @@ -1731,9 +1740,9 @@ dependencies = [ [[package]] name = "parry2d" -version = "0.13.5" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "104ae65232e20477a98f9f1e75ca9850eae24a2ea846a2b1a0af03ad752136ce" +checksum = "94683d8d7e785fe84b02d0a0dbe0fcf359c031c338dd6d144de958573c570c25" dependencies = [ "approx", "arrayvec", @@ -1741,7 +1750,7 @@ dependencies = [ "downcast-rs", "either", "nalgebra", - "num-derive", + "num-derive 0.4.1", "num-traits", "rustc-hash", "simba", @@ -1764,15 +1773,15 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pkg-config" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "png" -version = "0.17.10" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -1811,18 +1820,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.71" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135ede8821cf6376eb7a64148901e1690b788c11ae94dc297ae917dbc91dc0e" +checksum = "0f0f7f43585c34e4fdd7497d746bc32e14458cf11c69341cc0587b1d825dde42" [[package]] name = "qoi" @@ -1835,9 +1844,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -1897,7 +1906,7 @@ dependencies = [ "crossbeam", "downcast-rs", "nalgebra", - "num-derive", + "num-derive 0.3.3", "num-traits", "parry2d", "rustc-hash", @@ -1918,9 +1927,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" dependencies = [ "either", "rayon-core", @@ -1928,14 +1937,23 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", ] +[[package]] +name = "read-fonts" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7555e052e772f964a1c99f1434f6a2c3a47a5f8e4292236921f121a7753cb2b5" +dependencies = [ + "font-types", +] + [[package]] name = "redox_syscall" version = "0.3.5" @@ -1962,18 +1980,16 @@ checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b" [[package]] name = "rhai" -version = "1.17.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0de8df6dd1f4886ad635d7e0fc7afc086e4f6daeff129d157287b78738516b" +checksum = "f6273372244d04a8a4b0bec080ea1e710403e88c5d9d83f9808b2bfa64f0982a" dependencies = [ "ahash", - "bitflags 2.4.1", + "bitflags 2.4.2", "instant", "num-traits", "once_cell", "rhai_codegen", - "serde", - "serde_json", "smallvec", "smartstring", "thin-vec", @@ -1981,13 +1997,13 @@ dependencies = [ [[package]] name = "rhai_codegen" -version = "1.17.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89789ba6e8fd0889ae70b39c09000148431c9a1d618eb9d388373f391a55c988" +checksum = "9db7f8dc4c9d48183a17ce550574c42995252b82d267eaca3fcd1b979159856c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.48", ] [[package]] @@ -1998,12 +2014,9 @@ checksum = "cbf4a6aa5f6d6888f39e980649f3ad6b666acdce1d78e95b8a2cb076e687ae30" [[package]] name = "roxmltree" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862340e351ce1b271a378ec53f304a5558f7db87f3769dc655a8f6ecbb68b302" -dependencies = [ - "xmlparser", -] +checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f" [[package]] name = "rustc-demangle" @@ -2091,9 +2104,9 @@ checksum = "58bf37232d3bb9a2c4e641ca2a11d83b5062066f88df7fed36c28772046d65ba" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] @@ -2110,20 +2123,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.109" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0652c533506ad7a2e353cce269330d6afd8bdfb6d75e0ace5b35aacbd7b9e9" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ "itoa", "ryu", @@ -2190,12 +2203,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" -dependencies = [ - "serde", -] +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "smartstring" @@ -2204,7 +2214,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" dependencies = [ "autocfg", - "serde", "static_assertions", "version_check", ] @@ -2230,9 +2239,9 @@ dependencies = [ [[package]] name = "spade" -version = "2.5.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd774eb23cff002036706e6ea83c3f4ab4c80dad89da76fe16d49f77ab71682f" +checksum = "61addf9117b11d1f5b4bf6fe94242ba25f59d2d4b2080544b771bd647024fd00" dependencies = [ "hashbrown 0.14.3", "num-traits", @@ -2285,10 +2294,11 @@ checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2" [[package]] name = "swash" -version = "0.1.8" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7c73c813353c347272919aa1af2885068b05e625e5532b43049e4f641ae77f" +checksum = "d06ff4664af8923625604261c645f5c4cc610cc83c84bec74b50d76237089de7" dependencies = [ + "read-fonts", "yazi", "zeno", ] @@ -2306,9 +2316,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.42" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b7d0a2c048d661a1a59fcd7355baa232f7ed34e0ee4df2eef3c1c1c0d3852d8" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -2326,9 +2336,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -2338,28 +2348,25 @@ name = "thin-vec" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" -dependencies = [ - "serde", -] [[package]] name = "thiserror" -version = "1.0.51" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f11c217e1416d6f036b870f14e0413d480dbf28edbee1f877abaf0206af43bb7" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.51" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.48", ] [[package]] @@ -2374,9 +2381,9 @@ dependencies = [ [[package]] name = "tiff" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ "flate2", "jpeg-decoder", @@ -2434,14 +2441,14 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +checksum = "c6a4b9e8023eb94392d3dca65d717c53abc5dad49c07cb65bb8fcd87115fa325" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.21.0", + "toml_edit 0.21.1", ] [[package]] @@ -2459,18 +2466,18 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.2", "toml_datetime", "winnow", ] [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.2", "serde", "serde_spanned", "toml_datetime", @@ -2506,9 +2513,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-bidi-mirroring" @@ -2536,9 +2543,9 @@ checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-properties" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f91c8b21fbbaa18853c3d0801c78f4fc94cdb976699bb03e832e75f7fd22f0" +checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" [[package]] name = "unicode-script" @@ -2609,9 +2616,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2619,24 +2626,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.48", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.39" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" dependencies = [ "cfg-if", "js-sys", @@ -2646,9 +2653,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2656,22 +2663,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" [[package]] name = "wayland-client" @@ -2758,9 +2765,9 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "wgpu" @@ -2795,7 +2802,7 @@ checksum = "ef91c1d62d1e9e81c79e600131a258edf75c9531cbdbde09c44a011a47312726" dependencies = [ "arrayvec", "bit-vec", - "bitflags 2.4.1", + "bitflags 2.4.2", "codespan-reporting", "log", "naga", @@ -2820,7 +2827,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.4.1", + "bitflags 2.4.2", "block", "core-graphics-types", "d3d12", @@ -2859,16 +2866,16 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d5ed5f0edf0de351fe311c53304986315ce866f394a2e6df0c4b3c70774bcdd" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "js-sys", "web-sys", ] [[package]] name = "wide" -version = "0.7.13" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" +checksum = "89beec544f246e679fc25490e3f8e08003bc4bf612068f325120dad4cea02c1c" dependencies = [ "bytemuck", "safe_arch", @@ -2917,7 +2924,7 @@ version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" dependencies = [ - "windows-core", + "windows-core 0.51.1", "windows-targets 0.48.5", ] @@ -2930,6 +2937,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -3165,9 +3181,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.5.30" +version = "0.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b5c3db89721d50d0e2a673f5043fc4722f76dcc352d7b1ab8b8288bed4ed2c5" +checksum = "a7cad8365489051ae9f054164e459304af2e7e9bb407c958076c8bf4aef52da5" dependencies = [ "memchr", ] @@ -3195,12 +3211,6 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" -[[package]] -name = "xmlparser" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" - [[package]] name = "yaml-rust" version = "0.4.5" @@ -3239,7 +3249,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.42", + "syn 2.0.48", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 0f96a1d..f308ded 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,10 +74,4 @@ lazy_static = "1.4.0" clap = { version = "4.4.18", features = ["derive"] } log = "0.4.20" log4rs = { version = "1.2.0", features = ["console_appender"] } -rhai = { version = "1.17.0", features = [ - "f32_float", - "only_i32", - "metadata", - "no_custom_syntax", - "no_closure", -] } +rhai = { version = "1.17.1", features = ["f32_float", "no_custom_syntax"] } diff --git a/content/ui/flying.rhai b/content/ui/flying.rhai index 14be702..b5ff892 100644 --- a/content/ui/flying.rhai +++ b/content/ui/flying.rhai @@ -32,6 +32,46 @@ fn init(state) { Anchor::NorthEast ) ); + + + + + + let radar_size = 150.0; + let radar_range = 4000.0; + + add_sprite( + "radar", + "ui::radar", + Rect( + 5.0, -5.0, + radar_size, radar_size, + Anchor::NorthWest, + Anchor::NorthWest + ) + ); + + let init_pos = Rect( + (radar_size / 2.0 + 5), + (radar_size / -2.0 - 5), + 3.5, 3.5, + Anchor::Center, + Anchor::NorthWest + ); + + add_sprite("radar.frame.ne", "ui::radarframe", init_pos); + add_sprite("radar.frame.se", "ui::radarframe", init_pos); + add_sprite("radar.frame.sw", "ui::radarframe", init_pos); + add_sprite("radar.frame.nw", "ui::radarframe", init_pos); + sprite_set_angle("radar.frame.se", 90.0); + sprite_set_angle("radar.frame.sw", 180.0); + sprite_set_angle("radar.frame.nw", 270.0); + sprite_set_color("radar.frame.ne", Color(0.3, 0.3, 0.3, 1.0)); + sprite_set_color("radar.frame.se", Color(0.3, 0.3, 0.3, 1.0)); + sprite_set_color("radar.frame.sw", Color(0.3, 0.3, 0.3, 1.0)); + sprite_set_color("radar.frame.nw", Color(0.3, 0.3, 0.3, 1.0)); + + add_sprite("radar.arrow", "ui::centerarrow", init_pos); } fn event(state, event) { @@ -53,4 +93,209 @@ fn step(state) { state.player_ship().get_hull() / state.player_ship().get_total_hull() ); + + + // TODO: share variables with init(); + let radar_size = 150.0; + let radar_range = 4000.0; + let hide_range = 0.85; + let shrink_distance = 20.0; + let p_pos = state.player_ship().get_pos(); + + // Radar arrow + { + let q = Vector(0.0, 0.0) - state.player_ship().get_pos(); + let m = q.norm(); + let angle = Vector(1.0, 0.0).clockwise_angle(q); + let position = Vector(5.0 + (radar_size / 2.0), -5.0 - (radar_size / 2.0)); + let rot = Vector(0.915 * (radar_size / 2.0), 0.0); + let pos = position + rot.rotate(angle); + sprite_set_rect("radar.arrow", + Rect( + pos.x(), pos.y(), + 5.0, 5.0, + Anchor::Center, + Anchor::NorthWest + ) + ); + sprite_set_angle("radar.arrow", angle - 90.0); + sprite_set_color( + "radar.arrow", + Color( + 1.0, 1.0, 1.0, + clamp((m - 200.0) /400.0, 0.0, 1.0) + ) + ) + } + + // Ships + { + for s in state.ships() { + let uid = s.get_uid(); + let sprite_name = `radar.ship.${uid}`; + + if ( + !s.is_some() || + s.is_dead() || + s.is_landed() + ){ + if sprite_exists(sprite_name) { + remove_sprite(sprite_name); + } + continue; + } + + let color = Color(0.2, 0.2, 0.2, 1.0); + if s.is_flying() { + color = s.get_faction_color() + } + + + let size_init = s.get_size() * (1.0 / 50.0); + let pos = s.get_pos(); + let d = (pos - p_pos) / radar_range; + let m = d.norm() + (size_init / (2.0 * radar_size)); + if m < hide_range { + let size = (hide_range - m) * size_init * shrink_distance; + if size > size_init { + size = size_init; + } + if size < 1.0 { + if sprite_exists(sprite_name) { + remove_sprite(sprite_name); + } + continue; + } + + let pos = Vector(radar_size / 2.0 + 5.0, radar_size / -2.0 - 5.0); + pos = pos + (d * radar_size / 2.0); + + if !sprite_exists(sprite_name) { + add_sprite( + sprite_name, + "ui::shipblip", + Rect( + pos.x(), pos.y(), + size, size, + Anchor::Center, + Anchor::NorthWest + ) + ); + } else { + sprite_set_rect( + sprite_name, + Rect( + pos.x(), pos.y(), + size, size, + Anchor::Center, + Anchor::NorthWest + ) + ); + } + sprite_set_color(sprite_name, color); + } + } + } + + // System objects + { + for o in state.objects() { + let sprite_name = `radar.object.${o.get_label()}`; + + if !o.is_some() { + if sprite_exists(sprite_name) { + remove_sprite(sprite_name); + } + continue; + } + + let size_init = (o.get_size() / o.get_pos_z()) / (radar_range * (1.0 / 300.0)); + let pos = o.get_pos(); + let d = (pos - p_pos) / radar_range; + let m = d.norm() + (size_init / (2.0 * radar_size)); + if m < hide_range { + let size = (hide_range - m) * size_init * shrink_distance; + if size > size_init { + size = size_init; + } + if size < 1.0 { + // Don't draw tiny sprites, they flicker + if sprite_exists(sprite_name) { + remove_sprite(sprite_name); + } + continue; + } + + let pos = ( + Vector(radar_size / 2.0 + 5.0, radar_size / -2.0 - 5.0) + + (d * radar_size / 2.0) + ); + + if !sprite_exists(sprite_name) { + add_sprite( + sprite_name, + "ui::planetblip", + Rect( + pos.x(), pos.y(), + size, size, + Anchor::Center, + Anchor::NorthWest + ) + ); + } else { + sprite_set_rect( + sprite_name, + Rect( + pos.x(), pos.y(), + size, size, + Anchor::Center, + Anchor::NorthWest + ) + ); + } + } + } + } + + // Window frame + { + let dx = (((state.camera_zoom() / 2.0) * state.window_aspect()) / radar_range) * (radar_size / 2.0); + let dy = ((state.camera_zoom() / 2.0) / radar_range) * (radar_size / 2.0); + sprite_set_rect("radar.frame.ne", + Rect( + (radar_size / 2.0 + 5) - dx, + (radar_size / -2.0 - 5) + dy, + 3.5, 3.5, + Anchor::Center, + Anchor::NorthWest + ) + ); + sprite_set_rect("radar.frame.se", + Rect( + (radar_size / 2.0 + 5) - dx, + (radar_size / -2.0 - 5) - dy, + 3.5, 3.5, + Anchor::Center, + Anchor::NorthWest + ) + ); + sprite_set_rect("radar.frame.sw", + Rect( + (radar_size / 2.0 + 5) + dx, + (radar_size / -2.0 - 5) - dy, + 3.5, 3.5, + Anchor::Center, + Anchor::NorthWest + ) + ); + sprite_set_rect("radar.frame.nw", + Rect( + (radar_size / 2.0 + 5) + dx, + (radar_size / -2.0 - 5) + dy, + 3.5, 3.5, + Anchor::Center, + Anchor::NorthWest + ) + ); + } } \ No newline at end of file diff --git a/crates/content/src/part/config.rs b/crates/content/src/part/config.rs index a617443..87468a6 100644 --- a/crates/content/src/part/config.rs +++ b/crates/content/src/part/config.rs @@ -6,7 +6,7 @@ pub(crate) mod syntax { use anyhow::{bail, Context, Result}; use galactica_packer::SpriteAtlas; use galactica_util::rhai_error_to_anyhow; - use rhai::Engine; + use rhai::{Engine, OptimizationLevel}; use serde::Deserialize; use std::{ collections::HashMap, @@ -61,7 +61,9 @@ pub(crate) mod syntax { } }; - let engine = Engine::new(); + let mut engine = Engine::new_raw(); + engine.set_optimization_level(OptimizationLevel::Full); + engine.set_max_expr_depths(0, 0); let mut ui_scenes = HashMap::new(); for (n, p) in self.ui_scene { ui_scenes.insert( diff --git a/crates/content/src/part/system.rs b/crates/content/src/part/system.rs index 8e45a3a..b5e97df 100644 --- a/crates/content/src/part/system.rs +++ b/crates/content/src/part/system.rs @@ -126,9 +126,12 @@ pub struct SystemObject { /// If true, ships may land on this object pub landable: bool, - /// The display name of this object + /// The pretty display name of this object pub name: Option, + /// The system-unique label of this object + pub label: String, + /// The description of this object (shown on landed ui) pub desc: Option, @@ -259,6 +262,7 @@ impl crate::Build for System { } objects.push(SystemObject { + label: label.clone(), sprite: sprite_handle, image: image_handle, pos: resolve_position(&system.object, &obj, cycle_detector) diff --git a/crates/render/Cargo.toml b/crates/render/Cargo.toml index 9972633..fde2e5c 100644 --- a/crates/render/Cargo.toml +++ b/crates/render/Cargo.toml @@ -33,3 +33,4 @@ bytemuck = { workspace = true } glyphon = { workspace = true } log = { workspace = true } rhai = { workspace = true } +rapier2d = { workspace = true } diff --git a/crates/render/src/ui/api/color.rs b/crates/render/src/ui/api/color.rs index f75770b..8f2c743 100644 --- a/crates/render/src/ui/api/color.rs +++ b/crates/render/src/ui/api/color.rs @@ -3,7 +3,7 @@ use rhai::{CustomType, TypeBuilder}; #[derive(Debug, Clone)] pub struct Color { - pub val: Vector4, + val: Vector4, } impl Color { diff --git a/crates/render/src/ui/api/config.rs b/crates/render/src/ui/api/config.rs new file mode 100644 index 0000000..786c173 --- /dev/null +++ b/crates/render/src/ui/api/config.rs @@ -0,0 +1,28 @@ +use rhai::{CustomType, TypeBuilder}; + +#[derive(Debug, Clone)] +pub struct SceneConfig { + pub show_phys: bool, + pub show_starfield: bool, +} + +impl SceneConfig { + pub fn new() -> Self { + Self { + show_phys: false, + show_starfield: false, + } + } +} + +impl CustomType for SceneConfig { + fn build(mut builder: TypeBuilder) { + builder + .with_name("SceneConfig") + .with_fn("SceneConfig", Self::new) + .with_fn("show_phys", |s: &mut Self, x: bool| s.show_phys = x) + .with_fn("show_starfield", |s: &mut Self, x: bool| { + s.show_starfield = x + }); + } +} diff --git a/crates/render/src/ui/api/mod.rs b/crates/render/src/ui/api/mod.rs index 2951414..8934310 100644 --- a/crates/render/src/ui/api/mod.rs +++ b/crates/render/src/ui/api/mod.rs @@ -3,12 +3,14 @@ mod color; mod event; mod rect; mod state; +mod vector; pub use anchor::*; pub use color::*; pub use event::*; pub use rect::*; pub use state::*; +pub use vector::*; use rhai::{exported_module, Engine}; @@ -17,6 +19,7 @@ pub fn register_into_engine(engine: &mut Engine) { // Helpers .build_type::() .build_type::() + .build_type::() // State .build_type::() .build_type::() diff --git a/crates/render/src/ui/api/state.rs b/crates/render/src/ui/api/state.rs index cb3ef9e..5f3a753 100644 --- a/crates/render/src/ui/api/state.rs +++ b/crates/render/src/ui/api/state.rs @@ -1,13 +1,16 @@ use galactica_content::{Ship, SystemObject, SystemObjectHandle}; use galactica_system::{ - data::{self, ShipData}, - phys::PhysSimShipHandle, + data::{self}, + phys::{objects::PhysShip, PhysSimShipHandle}, }; +use galactica_util::to_degrees; use log::error; -use rhai::{CustomType, TypeBuilder}; +use rapier2d::dynamics::RigidBody; +use rhai::{Array, CustomType, Dynamic, ImmutableString, TypeBuilder}; use std::sync::Arc; -use crate::RenderInput; +use super::{Color, UiVector}; +use crate::{RenderInput, RenderState}; #[derive(Debug, Clone)] pub struct ShipState { @@ -15,10 +18,6 @@ pub struct ShipState { input: Arc, } -// TODO: remove this -unsafe impl Send for ShipState {} -unsafe impl Sync for ShipState {} - impl ShipState { fn get_content(&mut self) -> &Ship { let ship = self @@ -30,18 +29,27 @@ impl ShipState { self.input.ct.get_ship(handle) } - fn get_data(&mut self) -> &ShipData { + fn get_ship(&mut self) -> &PhysShip { let ship = self .input .phys_img .get_ship(self.ship.as_ref().unwrap()) .unwrap(); - ship.ship.get_data() + &ship.ship + } + + fn get_body(&mut self) -> &RigidBody { + let ship = self + .input + .phys_img + .get_ship(self.ship.as_ref().unwrap()) + .unwrap(); + &ship.rigidbody } fn landed_on(&mut self) -> SystemObjectState { let input = self.input.clone(); - match self.get_data().get_state() { + match self.get_ship().get_data().get_state() { data::ShipState::Landed { target } => { return SystemObjectState { input, @@ -63,31 +71,48 @@ impl CustomType for ShipState { builder .with_name("ShipState") .with_fn("is_some", |s: &mut Self| s.ship.is_some()) - .with_fn("is_dead", |s: &mut Self| s.get_data().get_state().is_dead()) + .with_fn("is_dead", |s: &mut Self| { + s.get_ship().get_data().get_state().is_dead() + }) .with_fn("is_landed", |s: &mut Self| { - s.get_data().get_state().is_landed() + s.get_ship().get_data().get_state().is_landed() }) .with_fn("is_landing", |s: &mut Self| { - s.get_data().get_state().is_landing() + s.get_ship().get_data().get_state().is_landing() }) .with_fn("is_flying", |s: &mut Self| { - s.get_data().get_state().is_flying() + s.get_ship().get_data().get_state().is_flying() }) .with_fn("is_unlanding", |s: &mut Self| { - s.get_data().get_state().is_unlanding() + s.get_ship().get_data().get_state().is_unlanding() }) .with_fn("is_collapsing", |s: &mut Self| { - s.get_data().get_state().is_collapsing() + s.get_ship().get_data().get_state().is_collapsing() }) .with_fn("name", |s: &mut Self| s.get_content().name.clone()) .with_fn("thumbnail", |s: &mut Self| s.get_content().thumb) .with_fn("landed_on", |s: &mut Self| s.landed_on()) - .with_fn("get_shields", |s: &mut Self| s.get_data().get_shields()) + .with_fn("get_shields", |s: &mut Self| { + s.get_ship().get_data().get_shields() + }) .with_fn("get_total_shields", |s: &mut Self| { - s.get_data().get_outfits().get_total_shields() + s.get_ship().get_data().get_outfits().get_total_shields() }) .with_fn("get_total_hull", |s: &mut Self| s.get_content().hull) - .with_fn("get_hull", |s: &mut Self| s.get_data().get_hull()); + .with_fn("get_hull", |s: &mut Self| { + s.get_ship().get_data().get_hull() + }) + .with_fn("get_size", |s: &mut Self| s.get_content().size) + .with_fn("get_uid", |s: &mut Self| format!("{}", s.get_ship().uid)) + .with_fn("get_pos", |s: &mut Self| { + let t = s.get_body().translation(); + UiVector::new(t.x, t.y) + }) + .with_fn("get_faction_color", |s: &mut Self| { + let h = s.get_ship().get_data().get_faction(); + let c = s.input.ct.get_faction(h).color; + Color::new(c[0], c[1], c[2], 1.0) + }); } } @@ -97,10 +122,6 @@ pub struct SystemObjectState { input: Arc, } -// TODO: remove this -unsafe impl Send for SystemObjectState {} -unsafe impl Sync for SystemObjectState {} - impl SystemObjectState { fn get_content(&mut self) -> &SystemObject { self.input.ct.get_system_object(self.object.unwrap()) @@ -146,13 +167,30 @@ impl CustomType for SystemObjectState { "".to_string() } }) - .with_fn("is_some", |s: &mut Self| s.object.is_some()); + .with_fn("is_some", |s: &mut Self| s.object.is_some()) + .with_fn("==", |a: &mut Self, b: Self| a.object == b.object) + .with_fn("get_size", |s: &mut Self| s.get_content().size) + .with_fn("get_label", |s: &mut Self| { + ImmutableString::from(&s.get_content().label) + }) + .with_fn("get_angle", |s: &mut Self| { + to_degrees(s.get_content().angle) + }) + .with_fn("get_pos", |s: &mut Self| { + let t = s.get_content().pos; + UiVector::new(t.x, t.y) + }) + .with_fn("get_pos_z", |s: &mut Self| { + let t = s.get_content().pos; + t.z + }); } } #[derive(Debug, Clone)] pub struct State { input: Arc, + window_aspect: f32, } // TODO: remove this @@ -160,8 +198,11 @@ unsafe impl Send for State {} unsafe impl Sync for State {} impl State { - pub fn new(input: Arc) -> Self { - Self { input } + pub fn new(state: &RenderState, input: Arc) -> Self { + Self { + input, + window_aspect: state.window_aspect, + } } pub fn player_ship(&mut self) -> ShipState { @@ -170,12 +211,39 @@ impl State { ship: self.input.player.ship.map(|x| PhysSimShipHandle(x)), } } + + pub fn ships(&mut self) -> Array { + let mut a = Array::new(); + for s in self.input.phys_img.iter_ships() { + a.push(Dynamic::from(ShipState { + input: self.input.clone(), + ship: Some(PhysSimShipHandle(s.ship.collider)), + })); + } + return a; + } + + pub fn objects(&mut self) -> Array { + let mut a = Array::new(); + let s = self.input.current_system; + for o in &self.input.ct.get_system(s).objects { + a.push(Dynamic::from(SystemObjectState { + input: self.input.clone(), + object: Some(o.handle), + })); + } + return a; + } } impl CustomType for State { fn build(mut builder: TypeBuilder) { builder .with_name("State") - .with_fn("player_ship", Self::player_ship); + .with_fn("player_ship", Self::player_ship) + .with_fn("ships", Self::ships) + .with_fn("objects", Self::objects) + .with_fn("window_aspect", |s: &mut Self| s.window_aspect) + .with_fn("camera_zoom", |s: &mut Self| s.input.camera_zoom); } } diff --git a/crates/render/src/ui/api/vector.rs b/crates/render/src/ui/api/vector.rs new file mode 100644 index 0000000..fc1759f --- /dev/null +++ b/crates/render/src/ui/api/vector.rs @@ -0,0 +1,47 @@ +use galactica_util::{clockwise_angle, to_degrees, to_radians}; +use nalgebra::{Rotation2, Vector2}; +use rhai::{CustomType, TypeBuilder}; + +#[derive(Debug, Clone)] +pub struct UiVector { + val: Vector2, +} + +impl UiVector { + pub fn new(x: f32, y: f32) -> Self { + Self { + val: Vector2::new(x, y), + } + } + + pub fn rotate(&mut self, angle: f32) -> Self { + return UiVector { + val: Rotation2::new(to_radians(angle)) * self.val, + }; + } + + pub fn clockwise_angle(&mut self, other: UiVector) -> f32 { + return to_degrees(clockwise_angle(&self.val, &other.val)); + } +} + +impl CustomType for UiVector { + fn build(mut builder: TypeBuilder) { + builder + .with_name("Vector") + .with_fn("Vector", Self::new) + .with_fn("rotate", Self::rotate) + .with_fn("clockwise_angle", Self::clockwise_angle) + .with_fn("+", |a: UiVector, b: UiVector| UiVector { + val: a.val + b.val, + }) + .with_fn("-", |a: UiVector, b: UiVector| UiVector { + val: a.val - b.val, + }) + .with_fn("/", |s: &mut Self, x: f32| UiVector { val: s.val / x }) + .with_fn("*", |s: &mut Self, x: f32| UiVector { val: s.val * x }) + .with_fn("x", |s: &mut Self| s.val.x) + .with_fn("y", |s: &mut Self| s.val.y) + .with_fn("norm", |s: &mut Self| s.val.magnitude()); + } +} diff --git a/crates/render/src/ui/executor.rs b/crates/render/src/ui/executor.rs index 81c5baa..5d87336 100644 --- a/crates/render/src/ui/executor.rs +++ b/crates/render/src/ui/executor.rs @@ -4,7 +4,10 @@ use galactica_system::phys::PhysSimShipHandle; use galactica_util::rhai_error_to_anyhow; use glyphon::{cosmic_text::Align, FamilyOwned, FontSystem, Style, Weight}; use log::{debug, error}; -use rhai::{Dynamic, Engine, ImmutableString, Scope}; +use rhai::{ + packages::{BasicArrayPackage, BasicStringPackage, LogicPackage, MoreStringPackage, Package}, + Dynamic, Engine, ImmutableString, Scope, +}; use std::{cell::RefCell, num::NonZeroU32, rc::Rc, sync::Arc}; use super::{ @@ -31,6 +34,18 @@ impl UiScriptExecutor { let elements = Rc::new(RefCell::new(UiState::new(ct.clone(), state))); let mut engine = Engine::new_raw(); + + // Required for array iteration + // We may need to add more packages here later. + engine.register_global_module(BasicArrayPackage::new().as_shared_module()); + engine.register_global_module(LogicPackage::new().as_shared_module()); + engine.register_global_module(BasicStringPackage::new().as_shared_module()); + engine.register_global_module(MoreStringPackage::new().as_shared_module()); + + engine.set_max_expr_depths(0, 0); + // Enables custom operators + engine.set_fast_operators(false); + api::register_into_engine(&mut engine); Self::register_api( ct.clone(), @@ -53,7 +68,7 @@ impl UiScriptExecutor { } /// Change the current scene - pub fn set_scene(&mut self, input: Arc) -> Result<()> { + pub fn set_scene(&mut self, state: &RenderState, input: Arc) -> Result<()> { let current_scene = (*self.state).borrow().get_scene().clone(); if self.last_scene == current_scene { return Ok(()); @@ -85,7 +100,7 @@ impl UiScriptExecutor { .get(current_scene.as_ref().unwrap().as_str()) .unwrap(), "init", - (State::new(input.clone()),), + (State::new(state, input.clone()),), ), ) .with_context(|| format!("while running `init()`")) @@ -104,7 +119,7 @@ impl UiScriptExecutor { .borrow_mut() .set_scene(ImmutableString::from(&ct.get_config().start_ui_scene)); } - self.set_scene(input.clone())?; + self.set_scene(state, input.clone())?; let current_scene = (*self.state).borrow().get_scene().clone(); (*self.state).borrow_mut().step(state, input.clone()); @@ -121,7 +136,7 @@ impl UiScriptExecutor { &mut self.scope, ast, "step", - (State::new(input.clone()),), + (State::new(state, input.clone()),), )) .with_context(|| format!("while calling `step()`")) .with_context(|| format!("in ui scene `{}`", current_scene.as_ref().unwrap()))?; @@ -154,7 +169,7 @@ impl UiScriptExecutor { .get(current_scene.as_ref().unwrap().as_str()) .unwrap(), "event", - (State::new(input.clone()), PlayerShipStateEvent {}), + (State::new(state, input.clone()), PlayerShipStateEvent {}), ), ) .with_context(|| format!("while handling player state change event")) @@ -214,7 +229,7 @@ impl UiScriptExecutor { .get(current_scene.as_ref().unwrap().as_str()) .unwrap(), "event", - (State::new(input.clone()), event_arg.clone()), + (State::new(state, input.clone()), event_arg.clone()), ), ) .with_context(|| format!("while handling event `{:?}`", event_arg)) @@ -222,6 +237,7 @@ impl UiScriptExecutor { } } + self.scope.rewind(0); return Ok(()); } } @@ -253,6 +269,12 @@ impl UiScriptExecutor { let mut ui_state = c.borrow_mut(); ui_state.config.show_starfield = b; }); + + engine.register_fn("print", move |d: Dynamic| { + debug!("{:?}", d); + }); + + engine.register_fn("clamp", move |x: f32, l: f32, h: f32| x.clamp(l, h)); } // Sprites @@ -263,7 +285,6 @@ impl UiScriptExecutor { "add_sprite", move |name: ImmutableString, sprite: ImmutableString, rect: Rect| { let mut ui_state = c.borrow_mut(); - let len = ui_state.len(); let sprite_handle = ct.get_sprite_handle(sprite.as_str()); if sprite_handle.is_none() { @@ -271,16 +292,35 @@ impl UiScriptExecutor { return; } - ui_state.names.insert(name.clone(), len); - ui_state.elements.push(UiElement::Sprite(Sprite::new( - &ct, + if ui_state.elements.contains_key(&name) { + error!("tried to make a sprite using an existing name `{name}`"); + return; + } + + ui_state.names.push(name.clone()); + ui_state.elements.insert( name.clone(), - sprite_handle.unwrap(), - rect, - ))); + UiElement::Sprite(Sprite::new( + &ct, + name.clone(), + sprite_handle.unwrap(), + rect, + )), + ); }, ); + let c = s.clone(); + engine.register_fn("remove_sprite", move |name: ImmutableString| { + let mut ui_state = c.borrow_mut(); + if ui_state.elements.contains_key(&name) { + ui_state.elements.remove(&name).unwrap(); + ui_state.names.retain(|x| *x != name); + } else { + error!("called `remove_sprite` on an invalid name `{name}`") + } + }); + let c = s.clone(); let ct = ct_src.clone(); engine.register_fn( @@ -299,7 +339,7 @@ impl UiScriptExecutor { } _ => { - error!("called `set_sprite_mask` on an invalid name `{name}`") + error!("called `sprite_set_mask` on an invalid name `{name}`") } } }, @@ -339,6 +379,51 @@ impl UiScriptExecutor { } }, ); + + let c = s.clone(); + engine.register_fn("sprite_set_angle", move |name: ImmutableString, x: f32| { + let mut ui_state = c.borrow_mut(); + match ui_state.get_mut_by_name(&name) { + Some(UiElement::Sprite(s)) => s.set_angle(x), + _ => { + error!("called `sprite_set_angle` on an invalid name `{name}`") + } + } + }); + + let c = s.clone(); + engine.register_fn("sprite_set_rect", move |name: ImmutableString, x: Rect| { + let mut ui_state = c.borrow_mut(); + match ui_state.get_mut_by_name(&name) { + Some(UiElement::Sprite(s)) => s.set_rect(x), + _ => { + error!("called `sprite_set_rect` on an invalid name `{name}`") + } + } + }); + + let c = s.clone(); + engine.register_fn( + "sprite_set_color", + move |name: ImmutableString, x: Color| { + let mut ui_state = c.borrow_mut(); + match ui_state.get_mut_by_name(&name) { + Some(UiElement::Sprite(s)) => s.set_color(x), + _ => { + error!("called `sprite_set_color` on an invalid name `{name}`") + } + } + }, + ); + + let c = s.clone(); + engine.register_fn("sprite_exists", move |name: ImmutableString| { + let mut ui_state = c.borrow_mut(); + match ui_state.get_mut_by_name(&name) { + Some(UiElement::Sprite(_)) => true, + _ => false, + } + }); } // Textboxes @@ -354,17 +439,24 @@ impl UiScriptExecutor { rect: Rect, color: Color| { let mut ui_state = c.borrow_mut(); - let len = ui_state.len(); - ui_state.names.insert(name.clone(), len); - ui_state.elements.push(UiElement::Text(TextBox::new( - &mut font.borrow_mut(), + if ui_state.elements.contains_key(&name) { + error!("tried to make a textbox using an existing name `{name}`"); + return; + } + + ui_state.names.push(name.clone()); + ui_state.elements.insert( name.clone(), - font_size, - line_height, - rect, - color, - ))); + UiElement::Text(TextBox::new( + &mut font.borrow_mut(), + name.clone(), + font_size, + line_height, + rect, + color, + )), + ); }, ); @@ -536,16 +628,23 @@ impl UiScriptExecutor { // TODO: fix ugly spaces move |name: ImmutableString, stroke: f32, color: Color, rect: Rect| { let mut ui_state = c.borrow_mut(); - let len = ui_state.len(); - ui_state.names.insert(name.clone(), len); - ui_state.elements.push(UiElement::RadialBar(RadialBar::new( + if ui_state.elements.contains_key(&name) { + error!("tried to make a radialbar using an existing name `{name}`"); + return; + } + + ui_state.names.push(name.clone()); + ui_state.elements.insert( name.clone(), - stroke, - color, - rect, - 1.0, - ))); + UiElement::RadialBar(RadialBar::new( + name.clone(), + stroke, + color, + rect, + 1.0, + )), + ); }, ); diff --git a/crates/render/src/ui/state.rs b/crates/render/src/ui/state.rs index 94d6ceb..9ad7265 100644 --- a/crates/render/src/ui/state.rs +++ b/crates/render/src/ui/state.rs @@ -23,8 +23,8 @@ pub(crate) struct UiConfig { } pub(crate) struct UiState { - pub names: HashMap, - pub elements: Vec, + pub elements: HashMap, + pub names: Vec, pub ct: Arc, current_scene: Option, @@ -42,8 +42,8 @@ impl UiState { pub fn new(ct: Arc, state: &mut RenderState) -> Self { Self { ct, - names: HashMap::new(), - elements: Vec::new(), + elements: HashMap::new(), + names: Vec::new(), current_scene: None, show_timings: true, @@ -79,15 +79,15 @@ impl UiState { */ pub fn get_mut_by_idx(&mut self, idx: usize) -> Option<&mut UiElement> { - self.elements.get_mut(idx) + let name = self.names.get(idx); + if name.is_none() { + return None; + } + self.elements.get_mut(name.unwrap()) } pub fn get_mut_by_name(&mut self, name: &ImmutableString) -> Option<&mut UiElement> { - let idx = self.names.get(name); - if idx.is_none() { - return None; - } - self.get_mut_by_idx(*idx.unwrap()) + self.elements.get_mut(name) } pub fn get_scene(&self) -> &Option { @@ -124,7 +124,7 @@ impl<'a> UiState { v.push(self.fps_indicator.get_textarea(input, window)) } - for t in self.elements.iter() { + for t in self.elements.values() { match &t { UiElement::Text(x) => v.push(x.get_textarea(input, window)), _ => {} diff --git a/crates/render/src/ui/util/sprite.rs b/crates/render/src/ui/util/sprite.rs index 493755e..40493c0 100644 --- a/crates/render/src/ui/util/sprite.rs +++ b/crates/render/src/ui/util/sprite.rs @@ -1,5 +1,9 @@ use super::super::api::Rect; -use crate::{ui::event::Event, vertexbuffer::types::UiInstance, RenderInput, RenderState}; +use crate::{ + ui::{api::Color, event::Event}, + vertexbuffer::types::UiInstance, + RenderInput, RenderState, +}; use galactica_content::{Content, SpriteAutomaton, SpriteHandle}; use galactica_util::to_radians; use rhai::ImmutableString; @@ -9,8 +13,12 @@ pub struct Sprite { pub anim: SpriteAutomaton, pub name: ImmutableString, + /// Sprite angle, in degrees + angle: f32, + rect: Rect, mask: Option, + color: Color, /// If true, ignore mouse events until click is released waiting_for_release: bool, @@ -24,6 +32,8 @@ impl Sprite { name, anim: SpriteAutomaton::new(&ct, sprite), rect, + angle: 0.0, + color: Color::new(1.0, 1.0, 1.0, 1.0), mask: None, has_mouse: false, has_click: false, @@ -35,6 +45,18 @@ impl Sprite { self.mask = mask; } + pub fn set_angle(&mut self, angle: f32) { + self.angle = angle; + } + + pub fn set_rect(&mut self, rect: Rect) { + self.rect = rect; + } + + pub fn set_color(&mut self, color: Color) { + self.color = color; + } + pub fn push_to_buffer(&self, input: &RenderInput, state: &mut RenderState) { let rect = self .rect @@ -46,9 +68,9 @@ impl Sprite { state.push_ui_buffer(UiInstance { position: rect.pos.into(), - angle: to_radians(90.0), + angle: to_radians(90.0 + self.angle), dim: rect.dim.into(), - color: [1.0, 1.0, 1.0, 1.0], + color: self.color.as_array(), texture_index: anim_state.texture_index(), texture_fade: anim_state.fade, mask_index: self diff --git a/crates/system/src/phys/mod.rs b/crates/system/src/phys/mod.rs index 72c9604..5145dbc 100644 --- a/crates/system/src/phys/mod.rs +++ b/crates/system/src/phys/mod.rs @@ -6,7 +6,15 @@ mod physsim; mod physwrapper; mod stepresources; +use std::sync::atomic::{AtomicU64, Ordering}; + pub use physimage::*; pub use physsim::{PhysSim, PhysSimShipHandle}; pub use physwrapper::PhysWrapper; pub use stepresources::*; + +/// A unique id given to each physics object +static PHYS_UID: AtomicU64 = AtomicU64::new(0); +fn get_phys_id() -> u64 { + PHYS_UID.fetch_add(1, Ordering::Relaxed) +} diff --git a/crates/system/src/phys/objects/ship/ship.rs b/crates/system/src/phys/objects/ship/ship.rs index c9d9bfb..5053cf3 100644 --- a/crates/system/src/phys/objects/ship/ship.rs +++ b/crates/system/src/phys/objects/ship/ship.rs @@ -14,6 +14,7 @@ use super::{autopilot, collapse::ShipCollapseSequence, controller::ShipControlle use crate::{ data::{ShipAutoPilot, ShipData, ShipPersonality, ShipState}, phys::{ + get_phys_id, objects::{PhysEffect, PhysProjectile}, physsim::NewObjects, PhysImage, PhysSimShipHandle, PhysStepResources, PhysWrapper, @@ -23,6 +24,9 @@ use crate::{ /// A ship instance in the physics system #[derive(Debug, Clone)] pub struct PhysShip { + /// This ship's unique id + pub uid: u64, + /// This ship's physics handle pub rigid_body: RigidBodyHandle, @@ -71,6 +75,7 @@ impl PhysShip { ) -> Self { let ship_ct = ct.get_ship(handle); PhysShip { + uid: get_phys_id(), anim: SpriteAutomaton::new(ct, ship_ct.sprite), rigid_body, collider, diff --git a/crates/util/src/lib.rs b/crates/util/src/lib.rs index afe7813..746ed5d 100644 --- a/crates/util/src/lib.rs +++ b/crates/util/src/lib.rs @@ -13,6 +13,11 @@ pub fn to_radians(degrees: f32) -> f32 { return (degrees / 360.0) * std::f32::consts::TAU; } +/// Convert an angle in radians to degrees +pub fn to_degrees(radians: f32) -> f32 { + return (radians / std::f32::consts::TAU) * 360.0; +} + /// Compute the clockwise angle between two vectors /// Returns a value in [-pi, pi] pub fn clockwise_angle(a: &Vector2, b: &Vector2) -> f32 {