From b04ab122ebac6a930ed4cbf805f11d065cfce674 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Sun, 2 Mar 2025 13:34:38 -0700 Subject: [PATCH] https://godot-rust.github.io/book/intro/hello-world.html --- gd/node_2d.tscn | 3 - README.md => src/godot/README.md | 0 src/godot/Rust.gdextension | 14 ++ src/godot/gd/node_2d.tscn | 9 + icon.svg => src/godot/icon.svg | 0 icon.svg.import => src/godot/icon.svg.import | 0 project.godot => src/godot/project.godot | 1 + src/rust/Cargo.lock | 186 +++++++++++++++++++ src/rust/Cargo.toml | 4 + src/rust/src/db.rs | 111 +++++++++++ src/rust/src/lib.rs | 111 +---------- src/rust/src/player.rs | 27 +++ 12 files changed, 357 insertions(+), 109 deletions(-) delete mode 100644 gd/node_2d.tscn rename README.md => src/godot/README.md (100%) create mode 100644 src/godot/Rust.gdextension create mode 100644 src/godot/gd/node_2d.tscn rename icon.svg => src/godot/icon.svg (100%) rename icon.svg.import => src/godot/icon.svg.import (100%) rename project.godot => src/godot/project.godot (92%) create mode 100644 src/rust/src/db.rs create mode 100644 src/rust/src/player.rs diff --git a/gd/node_2d.tscn b/gd/node_2d.tscn deleted file mode 100644 index fa7240a..0000000 --- a/gd/node_2d.tscn +++ /dev/null @@ -1,3 +0,0 @@ -[gd_scene format=3 uid="uid://dg85xsdqg6wj0"] - -[node name="Node2D" type="Node2D"] diff --git a/README.md b/src/godot/README.md similarity index 100% rename from README.md rename to src/godot/README.md diff --git a/src/godot/Rust.gdextension b/src/godot/Rust.gdextension new file mode 100644 index 0000000..cd14cc6 --- /dev/null +++ b/src/godot/Rust.gdextension @@ -0,0 +1,14 @@ +[configuration] +entry_symbol = "gdext_rust_init" +compatibility_minimum = 4.1 +reloadable = true + +[libraries] +linux.debug.x86_64 = "res://../rust/target/debug/libprice_is_wrong.so" +linux.release.x86_64 = "res://../rust/target/release/libprice_is_wrong.so" +windows.debug.x86_64 = "res://../rust/target/debug/price_is_wrong.dll" +windows.release.x86_64 = "res://../rust/target/release/price_is_wrong.dll" +macos.debug = "res://../rust/target/debug/libprice_is_wrong.dylib" +macos.release = "res://../rust/target/release/libprice_is_wrong.dylib" +macos.debug.arm64 = "res://../rust/target/debug/libprice_is_wrong.dylib" +macos.release.arm64 = "res://../rust/target/release/libprice_is_wrong.dylib" diff --git a/src/godot/gd/node_2d.tscn b/src/godot/gd/node_2d.tscn new file mode 100644 index 0000000..f806a05 --- /dev/null +++ b/src/godot/gd/node_2d.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://dg85xsdqg6wj0"] + +[ext_resource type="Texture2D" uid="uid://cneqjngiworik" path="res://icon.svg" id="1_swwii"] + +[node name="Node2D" type="Node2D"] + +[node name="BreeLPlayer" type="BreeLPlayer" parent="."] +position = Vector2(556, 302) +texture = ExtResource("1_swwii") diff --git a/icon.svg b/src/godot/icon.svg similarity index 100% rename from icon.svg rename to src/godot/icon.svg diff --git a/icon.svg.import b/src/godot/icon.svg.import similarity index 100% rename from icon.svg.import rename to src/godot/icon.svg.import diff --git a/project.godot b/src/godot/project.godot similarity index 92% rename from project.godot rename to src/godot/project.godot index da2a4c0..2341871 100644 --- a/project.godot +++ b/src/godot/project.godot @@ -11,6 +11,7 @@ config_version=5 [application] config/name="price-is-wrong" +run/main_scene="res://gd/node_2d.tscn" config/features=PackedStringArray("4.3", "GL Compatibility") config/icon="res://icon.svg" diff --git a/src/rust/Cargo.lock b/src/rust/Cargo.lock index fc40f7e..d769bf3 100644 --- a/src/rust/Cargo.lock +++ b/src/rust/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "anyhow" version = "1.0.96" @@ -186,6 +195,24 @@ dependencies = [ "slab", ] +[[package]] +name = "gdextension-api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af8707eca996b28193b772a4a9a28a97364bb93c97e3c313542e812f2963fb93" + +[[package]] +name = "gensym" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913dce4c5f06c2ea40fc178c06f777ac89fc6b1383e90c254fafb1abe4ba3c82" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "uuid", +] + [[package]] name = "getrandom" version = "0.3.1" @@ -198,12 +225,101 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "glam" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779ae4bf7e8421cf91c0b3b64e7e8b40b862fba4d393f59150042de7c4965a94" + [[package]] name = "glob" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +[[package]] +name = "godot" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a29a3646d4b02bf4587fedba4ac7b44a47d45c933fd85ba7e61292408818eaa4" +dependencies = [ + "godot-core", + "godot-macros", +] + +[[package]] +name = "godot-bindings" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0014540bff93ba275031bc852f1cf9a3ff3216f02cdd51dc249745dccc8c578" +dependencies = [ + "gdextension-api", +] + +[[package]] +name = "godot-cell" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88184d525d763ebc88ff6806ffee35e19c7118d5c9e4eedbc74e70e069f8a671" + +[[package]] +name = "godot-codegen" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa72d9b8be812fef2932f2a172b80c8b3feaee030571682f8f770c3d1c348d8" +dependencies = [ + "godot-bindings", + "heck", + "nanoserde", + "proc-macro2", + "quote", + "regex", +] + +[[package]] +name = "godot-core" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ff8345372e4c990ca592d7b61490ef88ff249fc77226f5b79beca173b4a0458" +dependencies = [ + "glam", + "godot-bindings", + "godot-cell", + "godot-codegen", + "godot-ffi", +] + +[[package]] +name = "godot-ffi" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "606d08085bd590d2f9c72633d4d218fee665ab3a0760b2d9daff2d964d628def" +dependencies = [ + "gensym", + "godot-bindings", + "godot-codegen", + "libc", + "paste", +] + +[[package]] +name = "godot-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c11b3188e54ebacf88feb4c968ed19048a71a329c4cfd4a06cf374f18357a36" +dependencies = [ + "godot-bindings", + "proc-macro2", + "quote", + "venial", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "itoa" version = "1.0.14" @@ -228,6 +344,21 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "nanoserde" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de9cf844ab1e25a0353525bd74cb889843a6215fa4a0d156fd446f4857a1b99" +dependencies = [ + "nanoserde-derive", +] + +[[package]] +name = "nanoserde-derive" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e943b2c21337b7e3ec6678500687cdc741b7639ad457f234693352075c082204" + [[package]] name = "native_db" version = "0.8.1" @@ -287,6 +418,12 @@ version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -304,6 +441,7 @@ name = "price-is-wrong" version = "0.1.0" dependencies = [ "futures", + "godot", "native_db", "native_model", "serde", @@ -356,6 +494,35 @@ dependencies = [ "libc", ] +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + [[package]] name = "rustix" version = "0.38.44" @@ -506,6 +673,25 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +[[package]] +name = "uuid" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" +dependencies = [ + "getrandom", +] + +[[package]] +name = "venial" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a42528baceab6c7784446df2a10f4185078c39bf73dc614f154353f1a6b1229" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "version_check" version = "0.9.5" diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml index e53f8e7..10155b3 100644 --- a/src/rust/Cargo.toml +++ b/src/rust/Cargo.toml @@ -5,6 +5,10 @@ edition = "2024" [dependencies] futures = "0.3.31" +godot = "0.2.4" native_db = "0.8.1" native_model = "0.4.20" serde = "1.0.218" + +[lib] +crate-type = ["cdylib"] diff --git a/src/rust/src/db.rs b/src/rust/src/db.rs new file mode 100644 index 0000000..65e07aa --- /dev/null +++ b/src/rust/src/db.rs @@ -0,0 +1,111 @@ +mod main { + use {super::data}; + + pub fn main() { + let db = data::DB::new().expect("could not make db"); + } + + #[cfg(test)] + mod tests { + use super::*; + + #[test] + fn test_main() { + main(); + } + } +} + +mod data { + mod models { + use { + native_db::{ + native_db, + ToKey, + }, + native_model::{ + native_model, + Model, + }, + serde::{Deserialize, Serialize}, + }; + + pub mod v1 { + use super::*; + + #[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] + #[native_model(id = 1, version = 1)] + #[native_db] + pub struct Person { + #[primary_key] + pub name: String, + } + } + } + + use native_db::*; + + pub type Person = models::v1::Person; + + static MODELS: std::sync::LazyLock = std::sync::LazyLock::new(|| { + let mut models = Models::new(); + models.define::().expect("failed to define person"); + models + }); + + pub struct DB<'a> { + db: Database<'a>, + } + + impl<'a> DB<'a> { + pub fn new() -> Result, String> { + let db = match Builder::new().create_in_memory(&MODELS) { + Ok(db) => Ok(db), + Err(msg) => Err(msg.to_string()), + }?; + Ok(DB{ + db: db, + }) + } + + pub fn insert(self: &DB<'a>, v: T) -> Result<(), String> { + let t = match self.db.rw_transaction() { + Ok(t) => t, + Err(msg) => return Err(msg.to_string()), + }; + if let Err(msg) = t.insert(v) { + return Err(msg.to_string()); + } + if let Err(msg) = t.commit() { + return Err(msg.to_string()); + } + Ok(()) + } + + pub fn get(self: &DB<'a>, primary: S) -> Result, String> { + let t = match self.db.r_transaction() { + Ok(t) => t, + Err(msg) => return Err(msg.to_string()), + }; + match t.get().primary(primary) { + Ok(v) => Ok(v), + Err(msg) => Err(msg.to_string()), + } + } + } + + #[cfg(test)] + mod tests { + use super::*; + + #[test] + fn mvp() { + let db = DB::new().expect("could not make db"); + let person = Person{name: "me".to_string()}; + db.insert(person.clone()).expect("could not insert person"); + assert_eq!(person, db.get("me".to_string()).expect("could not get").expect("got none")); + } + } +} + + diff --git a/src/rust/src/lib.rs b/src/rust/src/lib.rs index cd38fac..68895e0 100644 --- a/src/rust/src/lib.rs +++ b/src/rust/src/lib.rs @@ -1,110 +1,9 @@ -mod main { - use {super::data}; +use godot::prelude::*; - pub fn main() { - let db = data::DB::new().expect("could not make db"); - } +struct MyExtension; - #[cfg(test)] - mod tests { - use super::*; - - #[test] - fn test_main() { - main(); - } - } -} - -mod data { - mod models { - use { - native_db::{ - native_db, - ToKey, - }, - native_model::{ - native_model, - Model, - }, - serde::{Deserialize, Serialize}, - }; - - pub mod v1 { - use super::*; - - #[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] - #[native_model(id = 1, version = 1)] - #[native_db] - pub struct Person { - #[primary_key] - pub name: String, - } - } - } - - use native_db::*; - - pub type Person = models::v1::Person; - - static MODELS: std::sync::LazyLock = std::sync::LazyLock::new(|| { - let mut models = Models::new(); - models.define::().expect("failed to define person"); - models - }); - - pub struct DB<'a> { - db: Database<'a>, - } - - impl<'a> DB<'a> { - pub fn new() -> Result, String> { - let db = match Builder::new().create_in_memory(&MODELS) { - Ok(db) => Ok(db), - Err(msg) => Err(msg.to_string()), - }?; - Ok(DB{ - db: db, - }) - } - - pub fn insert(self: &DB<'a>, v: T) -> Result<(), String> { - let t = match self.db.rw_transaction() { - Ok(t) => t, - Err(msg) => return Err(msg.to_string()), - }; - if let Err(msg) = t.insert(v) { - return Err(msg.to_string()); - } - if let Err(msg) = t.commit() { - return Err(msg.to_string()); - } - Ok(()) - } - - pub fn get(self: &DB<'a>, primary: S) -> Result, String> { - let t = match self.db.r_transaction() { - Ok(t) => t, - Err(msg) => return Err(msg.to_string()), - }; - match t.get().primary(primary) { - Ok(v) => Ok(v), - Err(msg) => Err(msg.to_string()), - } - } - } - - #[cfg(test)] - mod tests { - use super::*; - - #[test] - fn mvp() { - let db = DB::new().expect("could not make db"); - let person = Person{name: "me".to_string()}; - db.insert(person.clone()).expect("could not insert person"); - assert_eq!(person, db.get("me".to_string()).expect("could not get").expect("got none")); - } - } +#[gdextension] +unsafe impl ExtensionLibrary for MyExtension { } +pub mod player; diff --git a/src/rust/src/player.rs b/src/rust/src/player.rs new file mode 100644 index 0000000..f1b38ae --- /dev/null +++ b/src/rust/src/player.rs @@ -0,0 +1,27 @@ +use godot::{prelude::*, classes::{ISprite2D, Sprite2D}}; +#[derive(GodotClass)] +#[class(base=Sprite2D)] +struct BreeLPlayer { + base: Base +} + +#[godot_api] +impl ISprite2D for BreeLPlayer { + fn init(base: Base) -> Self { + eprintln!("init"); + BreeLPlayer{base: base} + } + + fn physics_process(&mut self, delta: f64) { + eprintln!("physics_process({delta})"); + } +} + +#[godot_api] +impl BreeLPlayer { + fn drop(&mut self) { + eprintln!("drop"); + } +} + +