From 5fee6cd0537cd0268ec65c3c4a321961f9deeecf Mon Sep 17 00:00:00 2001 From: Mark Hoekveen Date: Mon, 20 Jan 2025 00:27:44 +0100 Subject: [PATCH] initial commit --- .gitignore | 2 + godot/base.tscn | 47 +++++++ godot/icon.svg | 1 + godot/icon.svg.import | 37 ++++++ godot/planet_3d.gd | 12 ++ godot/planets.gdextension | 8 ++ godot/project.godot | 16 +++ rust/Cargo.lock | 265 ++++++++++++++++++++++++++++++++++++++ rust/Cargo.toml | 10 ++ rust/src/lib.rs | 40 ++++++ rust/src/planet.rs | 11 ++ 11 files changed, 449 insertions(+) create mode 100644 .gitignore create mode 100644 godot/base.tscn create mode 100644 godot/icon.svg create mode 100644 godot/icon.svg.import create mode 100644 godot/planet_3d.gd create mode 100644 godot/planets.gdextension create mode 100644 godot/project.godot create mode 100644 rust/Cargo.lock create mode 100644 rust/Cargo.toml create mode 100644 rust/src/lib.rs create mode 100644 rust/src/planet.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..171d8ee --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +godot/.godot +rust/target diff --git a/godot/base.tscn b/godot/base.tscn new file mode 100644 index 0000000..d81e0a2 --- /dev/null +++ b/godot/base.tscn @@ -0,0 +1,47 @@ +[gd_scene load_steps=7 format=3 uid="uid://n27yc3x148vc"] + +[ext_resource type="Script" path="res://planet_3d.gd" id="1_ah6ru"] + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_mbisb"] + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_vev0a"] +seamless = true +noise = SubResource("FastNoiseLite_mbisb") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w5x05"] +albedo_texture = SubResource("NoiseTexture2D_vev0a") + +[sub_resource type="SphereMesh" id="SphereMesh_wit1y"] +material = SubResource("StandardMaterial3D_w5x05") + +[sub_resource type="SphereShape3D" id="SphereShape3D_chv0q"] + +[node name="Base" type="Node3D"] + +[node name="RigidBody3D" type="RigidBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.36111, 0, -2.81404) +visible = false +gravity_scale = 0.0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="RigidBody3D"] +mesh = SubResource("SphereMesh_wit1y") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D"] +shape = SubResource("SphereShape3D_chv0q") + +[node name="Planet3D" type="Planet3D" parent="."] +rotational_speed = 100.0 +mass = 900000.0 +gravity_scale = 0.0 +linear_damp_mode = 1 +angular_damp_mode = 1 +script = ExtResource("1_ah6ru") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Planet3D"] +mesh = SubResource("SphereMesh_wit1y") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Planet3D"] +shape = SubResource("SphereShape3D_chv0q") + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.92237) diff --git a/godot/icon.svg b/godot/icon.svg new file mode 100644 index 0000000..9d8b7fa --- /dev/null +++ b/godot/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/godot/icon.svg.import b/godot/icon.svg.import new file mode 100644 index 0000000..ff3268a --- /dev/null +++ b/godot/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://0dupmuupwgch" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/godot/planet_3d.gd b/godot/planet_3d.gd new file mode 100644 index 0000000..68a38f9 --- /dev/null +++ b/godot/planet_3d.gd @@ -0,0 +1,12 @@ +extends Planet3D + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + sync() + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass diff --git a/godot/planets.gdextension b/godot/planets.gdextension new file mode 100644 index 0000000..d13a02f --- /dev/null +++ b/godot/planets.gdextension @@ -0,0 +1,8 @@ +[configuration] +entry_symbol = "gdext_rust_init" +compatibility_minimum = 4.1 +reloadable = true + +[libraries] +linux.debug.x86_64 = "res://../rust/target/debug/librust.so" +linux.release.x86_64 = "res://../rust/target/release/librust.so" diff --git a/godot/project.godot b/godot/project.godot new file mode 100644 index 0000000..a6617a8 --- /dev/null +++ b/godot/project.godot @@ -0,0 +1,16 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="New Game Project" +run/main_scene="res://base.tscn" +config/features=PackedStringArray("4.3", "Forward Plus") +config/icon="res://icon.svg" diff --git a/rust/Cargo.lock b/rust/Cargo.lock new file mode 100644 index 0000000..c4c5126 --- /dev/null +++ b/rust/Cargo.lock @@ -0,0 +1,265 @@ +# This file is automatically @generated by Cargo. +# 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 = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[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.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "glam" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779ae4bf7e8421cf91c0b3b64e7e8b40b862fba4d393f59150042de7c4965a94" + +[[package]] +name = "godot" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1ef36742c735d052653908691bc7d3379c468201c40737b1cef418e41973ca" +dependencies = [ + "godot-core", + "godot-macros", +] + +[[package]] +name = "godot-bindings" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b6d1fa1835f22e22e76e0f31d5bc60b5546a51fafc1968c89ca873079e2aac0" +dependencies = [ + "gdextension-api", +] + +[[package]] +name = "godot-cell" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059990edd2ff438b242658aee04767a8416216198ad2e7cfff487556a3b641e2" + +[[package]] +name = "godot-codegen" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "981fb5e3c11f9dadb45328e5564feca2ede77cb3f1b0f143ddaaeed7d6196165" +dependencies = [ + "godot-bindings", + "heck", + "nanoserde", + "proc-macro2", + "quote", + "regex", +] + +[[package]] +name = "godot-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91f35b2e4490b8f4cb223e67488e9884abef7d25ed4bf696a03ee864e278576" +dependencies = [ + "glam", + "godot-bindings", + "godot-cell", + "godot-codegen", + "godot-ffi", +] + +[[package]] +name = "godot-ffi" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bea403db67ace1c1c41f96839a7f270be50e499af6aa2d2e9925f6933db0e583" +dependencies = [ + "gensym", + "godot-bindings", + "godot-codegen", + "libc", + "paste", +] + +[[package]] +name = "godot-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06424dae5bc4d417b8570c97d169af3fa15f80393bfbd26fe385be8eba7bf00a" +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 = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "memchr" +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 = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[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 = "rust" +version = "0.1.0" +dependencies = [ + "godot", +] + +[[package]] +name = "syn" +version = "2.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "uuid" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744018581f9a3454a9e15beb8a33b017183f1e7c0cd170232a2d1453b23a51c4" +dependencies = [ + "getrandom", +] + +[[package]] +name = "venial" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6816bc32f30bf8dd1b3adb04de8406c7bf187d2f923bd9e4c0b99365d012613f" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" diff --git a/rust/Cargo.toml b/rust/Cargo.toml new file mode 100644 index 0000000..4b1264f --- /dev/null +++ b/rust/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "rust" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] # Compile this crate to a dynamic C library. + +[dependencies] +godot = "0.2.2" diff --git a/rust/src/lib.rs b/rust/src/lib.rs new file mode 100644 index 0000000..5697766 --- /dev/null +++ b/rust/src/lib.rs @@ -0,0 +1,40 @@ +use godot::classes::IRigidBody3D; +use godot::classes::RigidBody3D; +use godot::prelude::*; + +#[derive(GodotClass)] +#[class(base=RigidBody3D)] +struct Planet3D { + #[export] + name: GString, + #[export] + rotational_speed: f32, + base: Base, +} + +#[godot_api] +impl IRigidBody3D for Planet3D { + fn init(base: Base) -> Self { + Self { + name: GString::new(), + rotational_speed: 1.0, + base, + } + } +} + +#[godot_api] +impl Planet3D { + #[func] + fn sync(&mut self) { + godot_print!("H.."); + let speed = self.rotational_speed; + self.base_mut() + .set_angular_velocity(Vector3::new(0.0, 0.5 * speed, 0.0)); + } +} + +struct MyExtension; + +#[gdextension] +unsafe impl ExtensionLibrary for MyExtension {} diff --git a/rust/src/planet.rs b/rust/src/planet.rs new file mode 100644 index 0000000..1494a73 --- /dev/null +++ b/rust/src/planet.rs @@ -0,0 +1,11 @@ +use godot::classes::RigidBody3D; +use godot::prelude::*; + +#[derive(GodotClass)] +#[class(base=RigidBody3D)] +struct Planet3D { + size: f64, + rotational_speed: f64, + + base: Base, +}