From Bromeon:

"Small API change with https://github.com/godot-rust/gdext/pull/370.

There is no more implicit base in user methods, to make a clearer separation between the Rust object (self) and the Godot one (self.base).

fn method(&self) {
    // instead of:
    let pos = self.get_position();
    // now:
    let pos = self.base.get_position();
}

On the other hand, Gd now always has Deref and DerefMut, not only for Godot objects.

fn free_function() {
    let obj: Gd = ...;

    // instead of:
    let pos = obj.bind().get_position(); // or
    let pos = obj.upcast::().get_position();
    // now:
    let pos = obj.get_position();
}

I also improved some safety around the internal instance storage in the process.

In the near future, we need to observe whether the slightly more verbose self.base instead of self is a real issue in practice. However, it comes with quite a few advantages:

  • It’s easier to keep the user object self and the Godot object self.base apart, when not all symbols are in one namespace.
  • It’s less tempting to do gd.bind_mut().get_position().
    • Now it would be gd.bind_mut().base.get_position() – however one can as well do gd.get_position() directly. The user is encouraged in the right direction.
  • Users can implement their own custom Deref/DerefMut on T, we don’t impose an implementation.
  • We don’t cause compilation errors due to orphan rule, if T lives in another crate.

So if you want to update, keep in mind that this has not yet fully settled and may see some changes again 😉"