rblx_godot/
lib.rs

1#![allow(dead_code)]
2
3#![feature(trait_upcasting)]
4#![feature(ptr_metadata)]
5#![feature(arbitrary_self_types)]
6#![feature(negative_impls)]
7#![feature(variant_count)]
8#![feature(panic_always_abort)]
9
10#![allow(internal_features)]
11#![feature(core_intrinsics)]
12
13#[rustversion::not(nightly)]
14compile_error!("This crate can only be built with nightly rust due to the use of unstable features.");
15
16pub mod core;
17pub mod instance;
18pub mod userdata;
19mod godot_vm_bindings;
20
21use core::verify_gdext_api_compat;
22
23pub use godot_vm_bindings::RobloxVMNode;
24
25use godot::prelude::*;
26use rustversion_detect::RUST_VERSION;
27
28#[cfg(debug_assertions)]
29macro_rules! godot_debug {
30    ($fmt:literal $(, $args:expr)* $(,)?) => {
31        godot::prelude::godot_print_rich!("[color=cyan]{}[/color]\n[color=gray]stack traceback:\n{}[/color]", 
32            format!($fmt, $(, $args)*), 
33            std::backtrace::Backtrace::force_capture()
34        );
35    };
36    ($thing:expr) => {
37        godot::prelude::godot_print_rich!("[color=cyan]{}[/color]\n[color=gray]stack traceback:\n{}[/color]", 
38            format!("{} = {:?}", stringify!($thing), $thing), 
39            std::backtrace::Backtrace::force_capture()
40        );
41    };
42    (backtrace $thing:expr) => {
43        godot::prelude::godot_print_rich!("[color=gray]stack traceback:\n{}[/color]", $thing);
44    };
45}
46#[cfg(not(debug_assertions))]
47macro_rules! godot_debug {
48    ($fmt:literal $(, $args:expr)* $(,)?) => {};
49    ($thing:expr) => {};
50}
51pub(crate) use godot_debug;
52
53struct RobloxToGodotProjectExtension;
54
55#[gdextension]
56unsafe impl ExtensionLibrary for RobloxToGodotProjectExtension {
57    fn min_level() -> InitLevel {
58        InitLevel::Scene
59    }
60
61    fn on_level_init(level: InitLevel) {
62        
63        match level {
64            InitLevel::Scene => {
65                verify_gdext_api_compat();
66
67                // Currently, rust panicking leaves Luau in a corrupted state.
68                // I am unsure if this is due to mlua or due to task scheduler's exec raw.
69                std::panic::always_abort();
70
71                godot_print!("Roblox To Godot Project v{} (Rust runtime v{}) by {}\n", env!("CARGO_PKG_VERSION"), RUST_VERSION, {
72                    let authors: &'static str = env!("CARGO_PKG_AUTHORS");
73                    authors.replace(":", ", ")
74                });
75                /*
76                let mut roblox_vm = RobloxVM::new(None);
77                let env = roblox_vm.get_mut().get_main_state().create_env_from_global().unwrap();
78                roblox_vm.get_mut()
79                    .get_main_state()
80                    .compile_jit("test.lua", include_str!("test.lua"), env).unwrap()
81                    .call::<()>(()).unwrap();
82                */
83                
84            }
85            _ => ()
86        }
87    }
88}