From 7c4a6a885e8b425e1ae568bbacaed9418bacc766 Mon Sep 17 00:00:00 2001 From: ModZero Date: Mon, 1 Jun 2020 21:25:40 +0200 Subject: [PATCH] Use nalgebra --- Cargo.lock | 105 ++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 1 + src/simulation.rs | 51 ++++++++++----------- src/state.rs | 2 + templates/stuff.tera | 13 +++--- 5 files changed, 136 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e7d9d0b..e37670a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,6 +9,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "approx" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3" +dependencies = [ + "num-traits", +] + [[package]] name = "arc-swap" version = "0.4.6" @@ -69,7 +78,7 @@ dependencies = [ "block-padding", "byte-tools", "byteorder", - "generic-array", + "generic-array 0.12.3", ] [[package]] @@ -124,6 +133,7 @@ version = "0.1.0" dependencies = [ "futures", "legion", + "nalgebra", "rand 0.7.3", "serde", "serde_json", @@ -262,7 +272,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "generic-array", + "generic-array 0.12.3", ] [[package]] @@ -421,6 +431,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "generic-array" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed1e761351b56f54eb9dcd0cfaca9fd0daecf93918e1cfc01c8a3d26ee7adcd" +dependencies = [ + "typenum", +] + [[package]] name = "getrandom" version = "0.1.14" @@ -678,6 +697,12 @@ version = "0.2.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" +[[package]] +name = "libm" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" + [[package]] name = "lock_api" version = "0.3.4" @@ -717,6 +742,15 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +[[package]] +name = "matrixmultiply" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4f7ec66360130972f34830bfad9ef05c6610a43938a467bcc9ab9369ab3478f" +dependencies = [ + "rawpointer", +] + [[package]] name = "maybe-uninit" version = "2.0.0" @@ -857,6 +891,24 @@ dependencies = [ "twoway", ] +[[package]] +name = "nalgebra" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d630f146ae751cfb43db9e0ad6bd73819a546a38baa5d4a9de69823c389c78a1" +dependencies = [ + "approx", + "generic-array 0.13.2", + "matrixmultiply", + "num-complex", + "num-rational", + "num-traits", + "rand 0.7.3", + "rand_distr", + "simba", + "typenum", +] + [[package]] name = "net2" version = "0.2.34" @@ -868,6 +920,16 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg 1.0.0", + "num-traits", +] + [[package]] name = "num-integer" version = "0.1.42" @@ -878,6 +940,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg 1.0.0", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.11" @@ -885,6 +958,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" dependencies = [ "autocfg 1.0.0", + "libm", ] [[package]] @@ -1222,6 +1296,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rand_distr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96977acbdd3a6576fb1d27391900035bf3863d4a16422973a409b488cf29ffb2" +dependencies = [ + "rand 0.7.3", +] + [[package]] name = "rand_hc" version = "0.1.0" @@ -1293,6 +1376,12 @@ dependencies = [ "rand_core 0.3.1", ] +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + [[package]] name = "rayon" version = "1.3.0" @@ -1494,6 +1583,18 @@ dependencies = [ "libc", ] +[[package]] +name = "simba" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d771bffb178827708f83829713e3a214bc8a9879a8f27ca548965bd849ed130" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", +] + [[package]] name = "siphasher" version = "0.2.3" diff --git a/Cargo.toml b/Cargo.toml index 59dee60..c962678 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ license = "AGPL-3.0-or-later" [dependencies] futures = { version = "0.3", default-features = false, features = ["alloc"] } legion = "0.2.1" +nalgebra = "0.21" rand = "0.7.3" serde = { version = "1.0", features= ["derive"] } serde_json = "1.0" diff --git a/src/simulation.rs b/src/simulation.rs index 6b73a8f..a9f47ff 100644 --- a/src/simulation.rs +++ b/src/simulation.rs @@ -1,27 +1,23 @@ use std::time::{Duration, Instant}; use legion::prelude::*; +use nalgebra::{Vector3, Point3}; use rand::prelude::*; use tokio::{sync::watch, time}; use crate::state::{Object, State}; #[derive(Clone, Debug, PartialEq)] -struct Name { - name: String, -} +struct Name (String); -#[derive(Clone, Copy, Debug, PartialEq)] -struct Position { - x: f64, - y: f64, -} +#[derive(Clone, Debug, PartialEq)] +struct Id (u64); -#[derive(Clone, Copy, Debug, PartialEq)] -struct Velocity { - dx: f64, - dy: f64, -} +#[derive(Clone, Debug, PartialEq)] +struct Position (Point3); + +#[derive(Clone, Debug, PartialEq)] +struct Velocity (Vector3); pub struct Simulation { world: World, @@ -34,11 +30,13 @@ pub struct Simulation { fn render(world: &mut World) -> Vec { let mut result = vec![]; - for (name, pos) in <(Read, Read)>::query().iter(world) { + for (id, name, pos) in <(Read, Read, Read)>::query().iter(world) { result.push(Object { - name: name.name.clone(), - x: pos.x, - y: pos.y, + id: id.0, + name: name.0.clone(), + x: pos.0.x, + y: pos.0.y, + z: pos.0.z }); } @@ -55,14 +53,14 @@ impl Simulation { (), (0..999).map(|n| { ( - Name { - name: format!("Entity {}", n), - }, - Position { x: 0.0, y: 0.0 }, - Velocity { - dx: rng.gen_range(0.0, 1.0), - dy: rng.gen_range(0.0, 1.0), - }, + Id(n), + Name (format!("Entity {}", n)), + Position(Point3::new(0.0, 0.0, 0.0)), + Velocity(Vector3::new( + rng.gen_range(-1.0, 1.0), + rng.gen_range(-1.0, 1.0), + rng.gen_range(-1.0, 1.0), + )), ) }), ); @@ -80,8 +78,7 @@ impl Simulation { let now = Instant::now(); let dt = now.duration_since(self.last); for (mut pos, vel) in update_query.iter(&mut self.world) { - pos.x += vel.dx * dt.as_secs_f64(); - pos.y += vel.dy * dt.as_secs_f64(); + pos.0 += vel.0 * dt.as_secs_f64(); } self.last = now; self.iteration += 1; diff --git a/src/state.rs b/src/state.rs index 4bdc8b5..bfc18a0 100644 --- a/src/state.rs +++ b/src/state.rs @@ -3,8 +3,10 @@ use serde::Serialize; #[derive(Clone, Debug, Serialize)] pub struct Object { pub name: String, + pub id: u64, pub x: f64, pub y: f64, + pub z: f64, } #[derive(Clone, Debug, Serialize)] diff --git a/templates/stuff.tera b/templates/stuff.tera index 3b9cfd4..1604d2e 100644 --- a/templates/stuff.tera +++ b/templates/stuff.tera @@ -6,10 +6,10 @@

Hello, world!

-

Iteration: {{ iteration }}

+

Iteration: {{ iteration }} messages 0.

    {% for object in objects %} -
  • {{ object.name }} @ {{ object.x }}, {{ object.y }}
  • +
  • {{ object.name }} @ {{ object.x }}, {{ object.y }}
  • {% endfor %}
@@ -21,18 +21,17 @@ console.log("Connected"); ws.send("MOAR"); } + let messages = 0; ws.onmessage = function(e) { const data = JSON.parse(e.data); + messages += 1; - document.getElementById("iteration").innerText = `Iteration: ${data.iteration}`; - const ul = document.getElementById("objects"); - while(ul.firstChild) { ul.removeChild(ul.lastChild) } + document.getElementById("iteration").innerText = `Iteration: ${data.iteration} messages ${messages}.`; for (n in data.objects) { const ob = data.objects[n]; - const li = document.createElement("li"); + const li = document.getElementById(`object-${ob.id}`); li.innerText = `${ob.name} @ ${ob.x}, ${ob.y}`; - ul.append(li); } ws.send("MOAR"); };