-
-
Notifications
You must be signed in to change notification settings - Fork 217
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Dependencies between GDExtensions #615
Comments
I've been thinking about this exact issue. I've not attempted implementing this, but theoretically if you provide a header for your GDExtension API then another compiled language could use that to interface with it. Alternatively, you could use Godot objects and use the |
This might be more something for a Godot proposal than for godot-rust 🙂 But yes, we had this discussion in the GDExtension team, and I agree it would be quite valuable.
Now, I haven't tried using that Maybe we can think about ways to support this workflow better from gdext. |
Maybe worth noting, GDExtension has not really been designed for a full ecosystem, meaning there will be several challenges:
That said, we don't need to go the full route to be useful, even manually depending on extensions that were hand-selected could be a nice addition. |
Aha, that was why I need to look for Godot proposals for this ... Thanks, now that makes a lot of sense! My curiosity is fully resolved; may I close this issue? |
You can gladly start a discussion in a proposal, but maybe we can keep this open for now, for "bridge-the-gap" solutions on godot-rust side 🙂 |
After some guidance from @Bromeon, I tried using the gdext/godot-bindings/src/godot_exe.rs Line 139 in 5e9b965
After manually hardcoding the correct working directory, the next issue was fixing the error "class GDCubismEffect has unknown API type extension" being returned by this function gdext/godot-codegen/src/util.rs Lines 61 to 83 in 5e9b965
Scene thanks to @Bromeon's advice.
After that, I was able to build my godot-rust extension, but upon trying to use it with the following code, I got the following error in Godot. use godot::classes::{GdCubismUserModel, IGdCubismUserModel};
use godot::prelude::*;
#[derive(GodotClass)]
#[class(base=GdCubismUserModel)]
struct MyModel {
base: Base<GdCubismUserModel>,
}
#[godot_api]
impl IGdCubismUserModel for MyModel {
fn init(base: Base<GdCubismUserModel>) -> Self {
godot_print!("Hello, world!");
Self { base }
}
}
From here this is completely out of the range of my knowledge, hopefully someone can figure this out and get this working 🙏 |
I understand it as, extension classes are not allowed to inherit from extension classes from a different extension. That is, a rust_gdext class can inherit from either a built-in (aka if (self->extension_classes.has(parent_class_name)) {
parent_extension = &self->extension_classes[parent_class_name];
} else if (ClassDB::class_exists(parent_class_name)) {
if (ClassDB::get_api_type(parent_class_name) == ClassDB::API_EXTENSION || ClassDB::get_api_type(parent_class_name) == ClassDB::API_EDITOR_EXTENSION) {
ERR_PRINT("Unimplemented yet");
//inheriting from another extension
} else {
//inheriting from engine class
} So what you're looking to do just seems plain impossible without changes to godot itself. Note that you could look into composition instead of inheritance, that is, instead of inheriting from |
One more thing – for some reason codegen for resources (and as far as I'm aware only the resources?) derived by way explained by PikaDude returns "c_void" for its error[E0277]: the trait bound `std::ffi::c_void: godot_convert::FromGodot` is not satisfied
--> /home/irwin/apps/godot/bullet-hell-shit/bullet-hell-rust/target/debug/build/godot-core-f3565041a3c07d75/out/classes/projectile_config.rs:139:17
|
139 | < CallSig as PtrcallSignatureTuple > ::out_class_ptrcall(method_bind, "ProjectileConfig", "set_display_type", self.object_ptr, self.__checked_id(), args,)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `godot_convert::FromGodot` is not implemented for `std::ffi::c_void`, which is required by `(std::ffi::c_void, i32): signature::PtrcallSignatureTuple`
|
= help: the following other types implement trait `godot_convert::FromGodot`:
*const std::ffi::c_void
*mut std::ffi::c_void
note: required for `(std::ffi::c_void, i32)` to implement `signature::PtrcallSignatureTuple`
--> /home/irwin/apps/godot/opensource-contr/missing_docs/gdext/godot-core/src/meta/signature.rs:350:28
|
350 | impl<$R, $($Pn,)*> PtrcallSignatureTuple for ($R, $($Pn,)*)
| ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
351 | where $R: ToGodot + FromGodot + Debug,
| --------- unsatisfied trait bound introduced here
...
597 | impl_ptrcall_signature_for_tuple!(R, (p0, 0): P0);
| ------------------------------------------------- in this macro invocation
= note: this error originates in the macro `impl_ptrcall_signature_for_tuple` (in Nightly builds, run with -Z macro-backtrace for more info) |
@PikaDude could you maybe upload the custom |
The one I had made for gd_cubism? Sure. |
Important to consider the Wasm impacts. #973 is a PR with a detailed explanation of why the current approach doesn't support multiple Rust extensions in WASM. I don't think the proposed solution is mergeable as-is, but it's good at showing some problems. |
Out of mere curiosity, I wonder if there's any possibility in the future to implement dependencies between GdExtension binaries written in different languages? Being relatively new to exploring this repository, I'm not fully acquainted with the technical specifics. However, it appears that all GdExtensions register classes and methods with the engine. If the methods registered by GdExtensions are treated no differently from those of internal engine classes, wouldn't it be possible for the engine to accept classes registered by other GdExtensions at the time a Rust Extension is registered?
Of course, it's not possible to know which classes a GdExtension will register at compile time, but could we not retrieve metadata for classes already registered with the engine when a Rust GdExtension loads at runtime (based on some user-configurable flag setting), recreate bindings, and, based on this, support Rust bindings for other GdExtension Classes in the next iteration?
I'm not entirely sure, but I presume there must be a way within the engine to specify the load order between different GdExtensions. Consequently, unless a user updates their plugins, the bindings themselves would likely be deterministically generated.
The text was updated successfully, but these errors were encountered: