diff --git a/Cargo.lock b/Cargo.lock index 86f00a4..60383d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1502,6 +1502,28 @@ dependencies = [ "winit", ] +[[package]] +name = "big_space" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0237c788129417fab794b74c8d67a7bda3a967e19f530d3b03e17e36576ffe6a" +dependencies = [ + "bevy_app", + "bevy_color", + "bevy_ecs", + "bevy_input", + "bevy_log", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_render", + "bevy_tasks", + "bevy_time", + "bevy_transform", + "bevy_utils", + "smallvec", +] + [[package]] name = "bindgen" version = "0.70.1" @@ -1984,6 +2006,25 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-queue" version = "0.3.12" @@ -4505,6 +4546,26 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "read-fonts" version = "0.29.3" @@ -5106,9 +5167,11 @@ dependencies = [ "bevy", "bevy-inspector-egui", "bevy_panorbit_camera", + "big_space", "chrono", "futures", "iyes_perf_ui", + "rayon", "regex", "reqwest 0.12.23", "rhorizons", diff --git a/Cargo.toml b/Cargo.toml index 2916f7d..1414079 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,9 +7,11 @@ edition = "2024" bevy = "0.16" bevy-inspector-egui = "0.33.1" bevy_panorbit_camera = "0.26" +big_space = { version = "0.10.0", features = ["camera"] } chrono = "0.4.41" futures = "0.3.31" iyes_perf_ui = "0.5.0" +rayon = "1.11.0" regex = "1.11.1" reqwest = { version = "0.12", features = ["json"] } rhorizons = "0.5.0" diff --git a/assets/initial_state.ron b/assets/initial_state.ron index e725ad6..6f069fa 100644 --- a/assets/initial_state.ron +++ b/assets/initial_state.ron @@ -11,6 +11,10 @@ radius: 695700.0, position: (0.0, 0.0, 0.0), velocity: (0.0, 0.0, 0.0), + model: ( + path: "sun.glb", + scale: (4.016625881e-2, 4.016625881e-2, 4.016625881e-2), + ), ), ( name: "Mercury", @@ -18,6 +22,10 @@ radius: 2439.4, position: (-3.873030085256687e-01, -1.617241946342014e-01, 2.230772540124238e-02), velocity: (5.024430196457658e-03, -2.474345331076241e-02, -2.482923861184285e-03), + model: ( + path: "mercury.glb", + scale: (1.409040560e-4, 1.407730015e-4, 1.409040560e-4), + ), ), ( name: "Venus", @@ -25,6 +33,10 @@ radius: 6051.84, position: (4.534187654737982e-01, 5.622160792960551e-01, -1.844136025242647e-02), velocity: (-1.580627428004959e-02, 1.261006264179427e-02, 1.085217883057661e-03), + model: ( + path: "venus.glb", + scale: (3.494008561e-4, 3.494008561e-4, 3.494008561e-4), + ), ), ( name: "Earth", @@ -32,6 +44,10 @@ radius: 6371.01, position: (-1.786834409731047e-01, 9.669827953774551e-01, -5.109423915082682e-05), velocity: (-1.720473858166942e-02, -3.193533189307208e-03, 5.457174067040888e-09), + model: ( + path: "earth.glb", + scale: (3.686534474e-4, 3.674174368e-4, 3.686534474e-4), + ), ), ( name: "Mars", @@ -39,6 +55,10 @@ radius: 3389.92, position: (-5.216858665681381e-01, 1.525234576802456e+00, 4.475559803760917e-02), velocity: (-1.271183490340250e-02, -3.338839586395265e-03, 2.417788175776839e-04), + model: ( + path: "mars.glb", + scale: (1.964640105e-4, 1.953076135e-4, 1.964640105e-4), + ), ), ( name: "Jupiter", @@ -46,6 +66,10 @@ radius: 69911.0, position: (1.056033545576702e+00, 4.971452162023883e+00, -4.427806378454757e-02), velocity: (-7.476272400979211e-03, 1.924466075080766e-03, 1.592575331437652e-04), + model: ( + path: "jupiter.glb", + scale: (4.216764122e-3, 3.943203948e-3, 4.216764122e-3), + ), ), ( name: "Saturn", @@ -53,6 +77,10 @@ radius: 58232.0, position: (9.461067271500818e+00, -1.764614720843175e+00, -3.458764004169705e-01), velocity: (7.093807804551229e-04, 5.475097536527790e-03, -1.232345969963958e-04), + model: ( + path: "saturn.glb", + scale: (1.828302280e-3, 1.649197191e-3, 1.828302280e-3), + ), ), ( name: "Uranus", @@ -60,6 +88,10 @@ radius: 25362.0, position: (1.110362881512566e+01, 1.609448391218202e+01, -8.419833258524990e-02), velocity: (-3.273728238819980e-03, 2.053528328895527e-03, 5.008589052969062e-05), + model: ( + path: "uranus.glb", + scale: (1.486925757e-3, 1.452834462e-3, 1.486925757e-3), + ), ), ( name: "Neptune", @@ -67,6 +99,10 @@ radius: 24624.0, position: (2.987992735576156e+01, -6.341879950443392e-01, -6.754997950415415e-01), velocity: (3.941595250081164e-05, 3.160389775728832e-03, -6.636996572427530e-05), + model: ( + path: "neptune.glb", + scale: (1.437890343e-3, 1.413329272e-3, 1.437890343e-3), + ), ), ( name: "Moon", @@ -74,6 +110,10 @@ radius: 1737.53, position: (-1.776670337217189e-01, 9.646511868801392e-01, -2.560710414773878e-04), velocity: (-1.666610342674751e-02, -2.935662211368250e-03, 2.214641479437884e-05), + model: ( + path: "moon.glb", + scale: (1.003505604e-4, 1.003505604e-4, 1.003505604e-4), + ), ), ( name: "Phobos", @@ -81,6 +121,10 @@ radius: 11.1, position: (-5.216607506283159e-01, 1.525290094552813e+00, 4.474552444674667e-02), velocity: (-1.371531677510715e-02, -2.797359927923991e-03, 7.604209362929195e-04), + model: ( + path: "phobos.glb", + scale: (3.111071419e-5, 2.177749957e-5, 2.728170512e-5), + ), ), ( name: "Deimos", @@ -88,6 +132,10 @@ radius: 6.2, position: (-5.215476623931578e-01, 1.525280501692070e+00, 4.469744727198185e-02), velocity: (-1.290124900899404e-02, -2.594527535740538e-03, 3.799855876623048e-04), + model: ( + path: "deimos.glb", + scale: (3.572769492e-5, 2.336041507e-5, 2.748284533e-5), + ), ), ( name: "Io", @@ -95,6 +143,10 @@ radius: 1821.49, position: (1.053815818667817e+00, 4.969715993299296e+00, -4.437108516416628e-02), velocity: (-1.329530996368361e-03, -5.983335980023409e-03, -3.295420474951598e-05), + model: ( + path: "io.glb", + scale: (1.056204637e-4, 1.048294944e-4, 1.050431092e-4), + ), ), ( name: "Europa", @@ -102,6 +154,10 @@ radius: 1560.8, position: (1.060479105966296e+00, 4.971193788432235e+00, -4.418907806556983e-02), velocity: (-6.967074192246404e-03, 9.896683771810605e-03, 4.296001484155991e-04), + model: ( + path: "europa.glb", + scale: (9.021675214e-5, 9.003777086e-5, 9.008396592e-5), + ), ), ( name: "Ganymede", @@ -109,6 +165,10 @@ radius: 2631.2, position: (1.062520398626604e+00, 4.968458682597362e+00, -4.429967587277176e-02), velocity: (-4.841408463186764e-03, 7.634290231598638e-03, 4.147177169244575e-04), + model: ( + path: "ganymede.glb", + scale: (1.519124053e-4, 1.519124053e-4, 1.519124053e-4), + ), ), ( name: "Callisto", @@ -116,6 +176,10 @@ radius: 2410.3, position: (1.046927187861326e+00, 4.980213520221207e+00, -4.412635447845523e-02), velocity: (-1.076662893789138e-02, -1.453153071657253e-03, 9.400054299331563e-06), + model: ( + path: "callisto.glb", + scale: (1.391587430e-4, 1.391587430e-4, 1.391587430e-4), + ), ), ( name: "Mimas", @@ -123,6 +187,10 @@ radius: 198.8, position: (9.462113317387443e+00, -1.764120396234732e+00, -3.462575454806998e-01), velocity: (-3.600569225193193e-03, 1.195945377622506e-02, -3.321658418910402e-03), + model: ( + path: "mimas.glb", + scale: (3.022084638e-5, 2.771941035e-5, 2.860654604e-5), + ), ), ( name: "Enceladus", @@ -130,6 +198,10 @@ radius: 252.3, position: (9.462107070733344e+00, -1.763590731315564e+00, -3.465134777458668e-01), velocity: (-4.799068161710644e-03, 9.904458072213898e-03, -1.910803547584920e-03), + model: ( + path: "enceladus.glb", + scale: (1.481480831e-5, 1.433560737e-5, 1.451458593e-5), + ), ), ( name: "Tethys", @@ -137,6 +209,10 @@ radius: 536.3, position: (9.463028141754283e+00, -1.764725184828637e+00, -3.460263238634043e-01), velocity: (8.124741088132637e-04, 1.132977234261396e-02, -3.072248079372077e-03), + model: ( + path: "tethys.glb", + scale: (3.129428660e-5, 3.059098162e-5, 3.070722960e-5), + ), ), ( name: "Dione", @@ -144,6 +220,10 @@ radius: 562.5, position: (9.460669031566509e+00, -1.762393870120674e+00, -3.470001695782450e-01), velocity: (-4.995042476514132e-03, 4.898468069198046e-03, 7.315317142172153e-04), + model: ( + path: "dione.glb", + scale: (3.252791430e-5, 3.230852235e-5, 3.240667138e-5), + ), ), ( name: "Rhea", @@ -151,6 +231,10 @@ radius: 764.5, position: (9.463441058546145e+00, -1.766997606737125e+00, -3.448366300385151e-01), velocity: (4.307393238751094e-03, 8.273257376182423e-03, -1.932435874857194e-03), + model: ( + path: "rhea.glb", + scale: (4.416729644e-5, 4.401718616e-5, 4.405760046e-5), + ), ), ( name: "Titan", @@ -158,6 +242,10 @@ radius: 2575.5, position: (9.468440328490537e+00, -1.762284834421733e+00, -3.478122131916790e-01), velocity: (-4.611400435334967e-04, 8.260265884102586e-03, -1.443082816825538e-03), + model: ( + path: "titan.glb", + scale: (1.486763649e-4, 1.486371038e-4, 1.486549882e-4), + ), ), ( name: "Iapetus", @@ -165,6 +253,10 @@ radius: 734.5, position: (9.454548058738080e+00, -1.786906158368561e+00, -3.394196336672040e-01), velocity: (2.477125925502744e-03, 4.942920731685813e-03, -3.564738618756286e-04), + model: ( + path: "iapetus.glb", + scale: (4.305300899e-5, 4.111311500e-5, 4.305300899e-5), + ), ), ( name: "Miranda", @@ -172,6 +264,10 @@ radius: 235.8, position: (1.110338075481133e+01, 1.609470886437212e+01, -8.339848717695617e-02), velocity: (2.787135511093017e-04, 1.302160355796409e-03, 1.366210183434322e-03), + model: ( + path: "miranda.glb", + scale: (1.387950124e-5, 1.344648808e-5, 1.352154413e-5), + ), ), ( name: "Ariel", @@ -179,6 +275,10 @@ radius: 578.9, position: (1.110453239435098e+01, 1.609416926126415e+01, -8.504238243640228e-02), velocity: (-5.417334967749265e-03, 2.196892645955784e-03, -2.298152372242362e-03), + model: ( + path: "ariel.glb", + scale: (3.354982618e-5, 3.335352449e-5, 3.336507143e-5), + ), ), ( name: "Umbriel", @@ -186,6 +286,10 @@ radius: 584.7, position: (1.110253678329407e+01, 1.609490555702174e+01, -8.286998450094619e-02), velocity: (-1.219602563560983e-03, 1.849034126664038e-03, 1.801100761916168e-03), + model: ( + path: "umbriel.glb", + scale: (3.375767119e-5, 3.375767119e-5, 3.375767119e-5), + ), ), ( name: "Titania", @@ -193,6 +297,10 @@ radius: 788.9, position: (1.110510884778205e+01, 1.609382177197045e+01, -8.661833178512783e-02), velocity: (-5.032495225759578e-03, 2.280002002691279e-03, -1.088327315015861e-03), + model: ( + path: "titania.glb", + scale: (4.554716361e-5, 4.554716361e-5, 4.554716361e-5), + ), ), ( name: "Oberon", @@ -200,6 +308,10 @@ radius: 761.4, position: (1.110301190463219e+01, 1.609515778477002e+01, -8.040210462613612e-02), velocity: (-1.519780917379062e-03, 1.720169702110850e-03, 3.926675849694972e-04), + model: ( + path: "oberon.glb", + scale: (4.395945143e-5, 4.395945143e-5, 4.395945143e-5), + ), ), ( name: "Triton", @@ -207,6 +319,10 @@ radius: 1352.6, position: (2.987802053077272e+01, -6.355569689698364e-01, -6.751627943073906e-01), velocity: (-6.787804924900204e-04, 4.636375429506899e-03, 1.865945736548040e-03), + model: ( + path: "triton.glb", + scale: (7.809240196e-5, 7.809240196e-5, 7.809240196e-5), + ), ), ], ) \ No newline at end of file diff --git a/assets/models/ariel.glb b/assets/models/ariel.glb new file mode 100644 index 0000000..8b288a7 Binary files /dev/null and b/assets/models/ariel.glb differ diff --git a/assets/models/callisto.glb b/assets/models/callisto.glb new file mode 100644 index 0000000..7e0bbfa Binary files /dev/null and b/assets/models/callisto.glb differ diff --git a/assets/models/ceres.glb b/assets/models/ceres.glb new file mode 100644 index 0000000..86d0c87 Binary files /dev/null and b/assets/models/ceres.glb differ diff --git a/assets/models/charon.glb b/assets/models/charon.glb new file mode 100644 index 0000000..0f81978 Binary files /dev/null and b/assets/models/charon.glb differ diff --git a/assets/models/deimos.glb b/assets/models/deimos.glb new file mode 100644 index 0000000..b6002fd Binary files /dev/null and b/assets/models/deimos.glb differ diff --git a/assets/models/dione.glb b/assets/models/dione.glb new file mode 100644 index 0000000..f620e63 Binary files /dev/null and b/assets/models/dione.glb differ diff --git a/assets/models/earth.glb b/assets/models/earth.glb new file mode 100644 index 0000000..2c35925 Binary files /dev/null and b/assets/models/earth.glb differ diff --git a/assets/models/enceladus.glb b/assets/models/enceladus.glb new file mode 100644 index 0000000..c347923 Binary files /dev/null and b/assets/models/enceladus.glb differ diff --git a/assets/models/eris.glb b/assets/models/eris.glb new file mode 100644 index 0000000..8e3834a Binary files /dev/null and b/assets/models/eris.glb differ diff --git a/assets/models/europa.glb b/assets/models/europa.glb new file mode 100644 index 0000000..da11725 Binary files /dev/null and b/assets/models/europa.glb differ diff --git a/assets/models/ganymede.glb b/assets/models/ganymede.glb new file mode 100644 index 0000000..e39c46e Binary files /dev/null and b/assets/models/ganymede.glb differ diff --git a/assets/models/hubble.glb b/assets/models/hubble.glb new file mode 100644 index 0000000..6cc69d2 Binary files /dev/null and b/assets/models/hubble.glb differ diff --git a/assets/models/iapetus.glb b/assets/models/iapetus.glb new file mode 100644 index 0000000..4034bd3 Binary files /dev/null and b/assets/models/iapetus.glb differ diff --git a/assets/models/io.glb b/assets/models/io.glb new file mode 100644 index 0000000..0a9538a Binary files /dev/null and b/assets/models/io.glb differ diff --git a/assets/models/iss.glb b/assets/models/iss.glb new file mode 100644 index 0000000..2956715 Binary files /dev/null and b/assets/models/iss.glb differ diff --git a/assets/models/jupiter.glb b/assets/models/jupiter.glb new file mode 100644 index 0000000..fdc43f8 Binary files /dev/null and b/assets/models/jupiter.glb differ diff --git a/assets/models/makemake.glb b/assets/models/makemake.glb new file mode 100644 index 0000000..f9ec041 Binary files /dev/null and b/assets/models/makemake.glb differ diff --git a/assets/models/mars.glb b/assets/models/mars.glb new file mode 100644 index 0000000..32fda69 Binary files /dev/null and b/assets/models/mars.glb differ diff --git a/assets/models/mercury.glb b/assets/models/mercury.glb new file mode 100644 index 0000000..a6b86df Binary files /dev/null and b/assets/models/mercury.glb differ diff --git a/assets/models/mimas.glb b/assets/models/mimas.glb new file mode 100644 index 0000000..6697e10 Binary files /dev/null and b/assets/models/mimas.glb differ diff --git a/assets/models/miranda.glb b/assets/models/miranda.glb new file mode 100644 index 0000000..dea606f Binary files /dev/null and b/assets/models/miranda.glb differ diff --git a/assets/models/moon.glb b/assets/models/moon.glb new file mode 100644 index 0000000..4aa5c5f Binary files /dev/null and b/assets/models/moon.glb differ diff --git a/assets/models/neptune.glb b/assets/models/neptune.glb new file mode 100644 index 0000000..01af8c2 Binary files /dev/null and b/assets/models/neptune.glb differ diff --git a/assets/models/oberon.glb b/assets/models/oberon.glb new file mode 100644 index 0000000..646ee7a Binary files /dev/null and b/assets/models/oberon.glb differ diff --git a/assets/models/phobos.glb b/assets/models/phobos.glb new file mode 100644 index 0000000..54cf6c1 Binary files /dev/null and b/assets/models/phobos.glb differ diff --git a/assets/models/pluto.glb b/assets/models/pluto.glb new file mode 100644 index 0000000..cb694ba Binary files /dev/null and b/assets/models/pluto.glb differ diff --git a/assets/models/rhea.glb b/assets/models/rhea.glb new file mode 100644 index 0000000..50e609e Binary files /dev/null and b/assets/models/rhea.glb differ diff --git a/assets/models/saturn.glb b/assets/models/saturn.glb new file mode 100644 index 0000000..058bf04 Binary files /dev/null and b/assets/models/saturn.glb differ diff --git a/assets/models/sun.glb b/assets/models/sun.glb new file mode 100644 index 0000000..f32ba69 Binary files /dev/null and b/assets/models/sun.glb differ diff --git a/assets/models/tethys.glb b/assets/models/tethys.glb new file mode 100644 index 0000000..2ff0c7b Binary files /dev/null and b/assets/models/tethys.glb differ diff --git a/assets/models/titan.glb b/assets/models/titan.glb new file mode 100644 index 0000000..91d91d4 Binary files /dev/null and b/assets/models/titan.glb differ diff --git a/assets/models/titania.glb b/assets/models/titania.glb new file mode 100644 index 0000000..cf5f377 Binary files /dev/null and b/assets/models/titania.glb differ diff --git a/assets/models/triton.glb b/assets/models/triton.glb new file mode 100644 index 0000000..aac2786 Binary files /dev/null and b/assets/models/triton.glb differ diff --git a/assets/models/umbriel.glb b/assets/models/umbriel.glb new file mode 100644 index 0000000..9365f31 Binary files /dev/null and b/assets/models/umbriel.glb differ diff --git a/assets/models/uranus.glb b/assets/models/uranus.glb new file mode 100644 index 0000000..4cf54eb Binary files /dev/null and b/assets/models/uranus.glb differ diff --git a/assets/models/venus.glb b/assets/models/venus.glb new file mode 100644 index 0000000..7e8600a Binary files /dev/null and b/assets/models/venus.glb differ diff --git a/assets/models/voyager.glb b/assets/models/voyager.glb new file mode 100644 index 0000000..caa99da Binary files /dev/null and b/assets/models/voyager.glb differ diff --git a/assets/scale.txt b/assets/scale.txt new file mode 100644 index 0000000..483f653 --- /dev/null +++ b/assets/scale.txt @@ -0,0 +1,30 @@ +Applied scale to Deimos: 3.572769492e-5, 2.336041507e-5, 2.748284533e-5 +Applied scale to Umbriel: 3.375767119e-5, 3.375767119e-5, 3.375767119e-5 +Applied scale to Phobos: 3.111071419e-5, 2.177749957e-5, 2.728170512e-5 +Applied scale to Titania: 4.554716361e-5, 4.554716361e-5, 4.554716361e-5 +Applied scale to Oberon: 4.395945143e-5, 4.395945143e-5, 4.395945143e-5 +Applied scale to Mercury: 1.409040560e-4, 1.407730015e-4, 1.409040560e-4 +Applied scale to Callisto: 1.391587430e-4, 1.391587430e-4, 1.391587430e-4 +Applied scale to Venus: 3.494008561e-4, 3.494008561e-4, 3.494008561e-4 +Applied scale to Uranus: 1.486925757e-3, 1.452834462e-3, 1.486925757e-3 +Applied scale to Ariel: 3.354982618e-5, 3.335352449e-5, 3.336507143e-5 +Applied scale to Europa: 9.021675214e-5, 9.003777086e-5, 9.008396592e-5 +Applied scale to Pluto: 6.860653230e-5, 6.860653230e-5, 6.860653230e-5 +Applied scale to Enceladus: 1.481480831e-5, 1.433560737e-5, 1.451458593e-5 +Applied scale to Dione: 3.252791430e-5, 3.230852235e-5, 3.240667138e-5 +Applied scale to Titan: 1.486763649e-4, 1.486371038e-4, 1.486549882e-4 +Applied scale to Miranda: 1.387950124e-5, 1.344648808e-5, 1.352154413e-5 +Applied scale to Neptune: 1.437890343e-3, 1.413329272e-3, 1.437890343e-3 +Applied scale to Moon: 1.003505604e-4, 1.003505604e-4, 1.003505604e-4 +Applied scale to Rhea: 4.416729644e-5, 4.401718616e-5, 4.405760046e-5 +Applied scale to Sol: 4.016625881e-2, 4.016625881e-2, 4.016625881e-2 +Applied scale to Iapetus: 4.305300899e-5, 4.111311500e-5, 4.305300899e-5 +Applied scale to Jupiter: 4.216764122e-3, 3.943203948e-3, 4.216764122e-3 +Applied scale to Ganymede: 1.519124053e-4, 1.519124053e-4, 1.519124053e-4 +Applied scale to Earth: 3.686534474e-4, 3.674174368e-4, 3.686534474e-4 +Applied scale to Saturn: 1.828302280e-3, 1.649197191e-3, 1.828302280e-3 +Applied scale to Mimas: 3.022084638e-5, 2.771941035e-5, 2.860654604e-5 +Applied scale to Triton: 7.809240196e-5, 7.809240196e-5, 7.809240196e-5 +Applied scale to Mars: 1.964640105e-4, 1.953076135e-4, 1.964640105e-4 +Applied scale to Tethys: 3.129428660e-5, 3.059098162e-5, 3.070722960e-5 +Applied scale to Io: 1.056204637e-4, 1.048294944e-4, 1.050431092e-4 diff --git a/examples/big_space.rs b/examples/big_space.rs new file mode 100644 index 0000000..5ddd086 --- /dev/null +++ b/examples/big_space.rs @@ -0,0 +1,154 @@ +//! This example demonstrates what floating point error in rendering looks like. You can press +//! space bar to smoothly switch between enabling and disabling the floating origin. +//! +//! Instead of disabling the plugin outright, this example simply moves the floating origin +//! independently of the camera, which is equivalent to what would happen when moving far from the +//! origin when not using this plugin. + +use bevy::prelude::*; +use big_space::prelude::*; + +fn main() { + App::new() + .add_plugins(( + DefaultPlugins.build().disable::(), + BigSpaceDefaultPlugins, + )) + .add_systems(Startup, (setup_scene, setup_ui)) + .add_systems(Update, (rotator_system, toggle_plugin)) + .run(); +} + +/// You can put things really, really far away from the origin. The distance we use here is actually +/// quite small, because we want the mesh to still be visible when the floating origin is far from +/// the camera. If you go much further than this, the mesh will simply disappear in a *POOF* of +/// floating point error when we disable this plugin. +/// +/// This plugin can function much further from the origin without any issues. Try setting this to: +/// `10_000_000_000_000_000` with the default i64 feature, or +/// `10_000_000_000_000_000_000_000_000_000_000_000_000` with the i128 feature. +const DISTANCE: GridPrecision = 2_000_000; + +/// Move the floating origin back to the "true" origin when the user presses the spacebar to emulate +/// disabling the plugin. Normally you would make your active camera the floating origin to avoid +/// this issue. +fn toggle_plugin( + input: Res>, + grids: Grids, + mut text: Query<&mut Text>, + mut disabled: Local, + mut floating_origin: Query<(Entity, &mut CellCoord), With>, +) -> Result { + if input.just_pressed(KeyCode::Space) { + *disabled = !*disabled; + } + + let this_grid = grids + .parent_grid(floating_origin.single().unwrap().0) + .unwrap(); + + let mut origin_cell = floating_origin.single_mut()?.1; + let index_max = DISTANCE / this_grid.cell_edge_length() as GridPrecision; + let increment = index_max / 100; + + let msg = if *disabled { + if origin_cell.x > 0 { + origin_cell.x = 0.max(origin_cell.x - increment); + origin_cell.y = 0.max(origin_cell.y - increment); + origin_cell.z = 0.max(origin_cell.z - increment); + + "Disabling..." + } else { + "Floating Origin Disabled" + } + } else if origin_cell.x < index_max { + origin_cell.x = index_max.min(origin_cell.x.saturating_add(increment)); + origin_cell.y = index_max.min(origin_cell.y.saturating_add(increment)); + origin_cell.z = index_max.min(origin_cell.z.saturating_add(increment)); + "Enabling..." + } else { + "Floating Origin Enabled" + }; + + let dist = + index_max.saturating_sub(origin_cell.x) * this_grid.cell_edge_length() as GridPrecision; + + let thousands = |num: GridPrecision| { + num.to_string() + .as_bytes() + .rchunks(3) + .rev() + .map(core::str::from_utf8) + .collect::, _>>() + .unwrap() + .join(",") // separator + }; + + text.single_mut()?.0 = format!( + "Press Spacebar to toggle: {msg}\nCamera distance to floating origin: {}\nMesh distance from origin: {}", + thousands(dist), + thousands(DISTANCE) + ); + + Ok(()) +} + +#[derive(Component)] +struct Rotator; + +fn rotator_system(time: Res