Skip to content

Commit 99751fa

Browse files
bors[bot]B-headBromeon
authored
Merge #872
872: New syntax for #[export] methods and #[base] parameters r=Bromeon a=B-head Resolve #850 ### Feature Allows onwer argument to be omitted. ```rust #[method] fn foo(&self, a: i32, b: i32) -> i32 { a + b } ``` By adding the #[base] attribute to the argument, it is defined as the owner argument. Only the second argument can be the owner argument. Also, there is no way to define the owner argument without #[base]. ```rust #[method] fn foo(&self, #[base] base: TRef<&Node>, value: i32) { base.do_something(value); } ``` All optional parameters that can be used with the #[export] attribute can also be used with #[method]. ### Compatibility The old syntax #[export] attribute will continue to be supported. (It does _not_ support omission of the owner argument.) ```rust #[export] fn foo(&self, base: TRef<&Node>, value: i32) { base.do_something(value); } ``` The `godot_wrap_method!` macro is not compatible because its definition has changed. (Can be fixed for compatibility if needed) Written tests. (B-head#1) Co-authored-by: B_head <[email protected]> Co-authored-by: Jan Haller <[email protected]>
2 parents c69c5a0 + e175059 commit 99751fa

File tree

18 files changed

+464
-382
lines changed

18 files changed

+464
-382
lines changed

examples/dodge-the-creeps/src/hud.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ impl Hud {
1616
Hud
1717
}
1818

19-
#[export]
20-
pub fn show_message(&self, owner: &CanvasLayer, text: String) {
19+
#[godot]
20+
pub fn show_message(&self, #[base] owner: &CanvasLayer, text: String) {
2121
let message_label = unsafe { owner.get_node_as::<Label>("message_label").unwrap() };
2222
message_label.set_text(text);
2323
message_label.show();
@@ -37,21 +37,21 @@ impl Hud {
3737
button.show();
3838
}
3939

40-
#[export]
41-
pub fn update_score(&self, owner: &CanvasLayer, score: i64) {
40+
#[godot]
41+
pub fn update_score(&self, #[base] owner: &CanvasLayer, score: i64) {
4242
let label = unsafe { owner.get_node_as::<Label>("score_label").unwrap() };
4343
label.set_text(score.to_string());
4444
}
4545

46-
#[export]
47-
fn on_start_button_pressed(&self, owner: &CanvasLayer) {
46+
#[godot]
47+
fn on_start_button_pressed(&self, #[base] owner: &CanvasLayer) {
4848
let button = unsafe { owner.get_node_as::<Button>("start_button").unwrap() };
4949
button.hide();
5050
owner.emit_signal("start_game", &[]);
5151
}
5252

53-
#[export]
54-
fn on_message_timer_timeout(&self, owner: &CanvasLayer) {
53+
#[godot]
54+
fn on_message_timer_timeout(&self, #[base] owner: &CanvasLayer) {
5555
let message_label = unsafe { owner.get_node_as::<Label>("message_label").unwrap() };
5656
message_label.hide()
5757
}

examples/dodge-the-creeps/src/main_scene.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ impl Main {
2424
}
2525
}
2626

27-
#[export]
28-
fn game_over(&self, owner: &Node) {
27+
#[godot]
28+
fn game_over(&self, #[base] owner: &Node) {
2929
let score_timer = unsafe { owner.get_node_as::<Timer>("score_timer").unwrap() };
3030
let mob_timer = unsafe { owner.get_node_as::<Timer>("mob_timer").unwrap() };
3131

@@ -38,8 +38,8 @@ impl Main {
3838
.unwrap_or_else(|| godot_print!("Unable to get hud"));
3939
}
4040

41-
#[export]
42-
fn new_game(&mut self, owner: &Node) {
41+
#[godot]
42+
fn new_game(&mut self, #[base] owner: &Node) {
4343
let start_position = unsafe { owner.get_node_as::<Position2D>("start_position").unwrap() };
4444
let player = unsafe {
4545
owner
@@ -66,16 +66,16 @@ impl Main {
6666
.unwrap_or_else(|| godot_print!("Unable to get hud"));
6767
}
6868

69-
#[export]
70-
fn on_start_timer_timeout(&self, owner: &Node) {
69+
#[godot]
70+
fn on_start_timer_timeout(&self, #[base] owner: &Node) {
7171
let mob_timer = unsafe { owner.get_node_as::<Timer>("mob_timer").unwrap() };
7272
let score_timer = unsafe { owner.get_node_as::<Timer>("score_timer").unwrap() };
7373
mob_timer.start(0.0);
7474
score_timer.start(0.0);
7575
}
7676

77-
#[export]
78-
fn on_score_timer_timeout(&mut self, owner: &Node) {
77+
#[godot]
78+
fn on_score_timer_timeout(&mut self, #[base] owner: &Node) {
7979
self.score += 1;
8080

8181
let hud = unsafe { owner.get_node_as_instance::<hud::Hud>("hud").unwrap() };
@@ -84,8 +84,8 @@ impl Main {
8484
.unwrap_or_else(|| godot_print!("Unable to get hud"));
8585
}
8686

87-
#[export]
88-
fn on_mob_timer_timeout(&self, owner: &Node) {
87+
#[godot]
88+
fn on_mob_timer_timeout(&self, #[base] owner: &Node) {
8989
let mob_spawn_location = unsafe {
9090
owner
9191
.get_node_as::<PathFollow2D>("mob_path/mob_spawn_locations")

examples/dodge-the-creeps/src/mob.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ impl Mob {
4040
}
4141
}
4242

43-
#[export]
44-
fn _ready(&mut self, owner: &RigidBody2D) {
43+
#[godot]
44+
fn _ready(&mut self, #[base] owner: &RigidBody2D) {
4545
let mut rng = rand::thread_rng();
4646
let animated_sprite = unsafe {
4747
owner
@@ -51,15 +51,15 @@ impl Mob {
5151
animated_sprite.set_animation(MOB_TYPES.choose(&mut rng).unwrap().to_str())
5252
}
5353

54-
#[export]
55-
fn on_visibility_screen_exited(&self, owner: &RigidBody2D) {
54+
#[godot]
55+
fn on_visibility_screen_exited(&self, #[base] owner: &RigidBody2D) {
5656
unsafe {
5757
owner.assume_unique().queue_free();
5858
}
5959
}
6060

61-
#[export]
62-
fn on_start_game(&self, owner: &RigidBody2D) {
61+
#[godot]
62+
fn on_start_game(&self, #[base] owner: &RigidBody2D) {
6363
unsafe {
6464
owner.assume_unique().queue_free();
6565
}

examples/dodge-the-creeps/src/player.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@ impl Player {
2626
}
2727
}
2828

29-
#[export]
30-
fn _ready(&mut self, owner: &Area2D) {
29+
#[godot]
30+
fn _ready(&mut self, #[base] owner: &Area2D) {
3131
let viewport = owner.get_viewport_rect();
3232
self.screen_size = viewport.size;
3333
owner.hide();
3434
}
3535

36-
#[export]
37-
fn _process(&mut self, owner: &Area2D, delta: f32) {
36+
#[godot]
37+
fn _process(&mut self, #[base] owner: &Area2D, delta: f32) {
3838
let animated_sprite = unsafe {
3939
owner
4040
.get_node_as::<AnimatedSprite>("animated_sprite")
@@ -88,8 +88,8 @@ impl Player {
8888
owner.set_global_position(position);
8989
}
9090

91-
#[export]
92-
fn on_player_body_entered(&self, owner: &Area2D, _body: Ref<PhysicsBody2D>) {
91+
#[godot]
92+
fn on_player_body_entered(&self, #[base] owner: &Area2D, _body: Ref<PhysicsBody2D>) {
9393
owner.hide();
9494
owner.emit_signal("hit", &[]);
9595

@@ -102,8 +102,8 @@ impl Player {
102102
collision_shape.set_deferred("disabled", true);
103103
}
104104

105-
#[export]
106-
pub fn start(&self, owner: &Area2D, pos: Vector2) {
105+
#[godot]
106+
pub fn start(&self, #[base] owner: &Area2D, pos: Vector2) {
107107
owner.set_global_position(pos);
108108
owner.show();
109109

examples/hello-world/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ impl HelloWorld {
1010
HelloWorld
1111
}
1212

13-
#[export]
14-
fn _ready(&self, _owner: &Node) {
13+
#[godot]
14+
fn _ready(&self) {
1515
godot_print!("hello, world.")
1616
}
1717
}

examples/native-plugin/src/lib.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ impl CustomNode {
1414
CustomNode
1515
}
1616

17-
#[export]
18-
fn _enter_tree(&self, owner: TRef<EditorPlugin>) {
17+
#[godot]
18+
fn _enter_tree(&self, #[base] owner: TRef<EditorPlugin>) {
1919
// Initialization of the plugin goes here.
2020
// Add the new type with a name, a parent type, a script and an icon.
2121
let script = unsafe { load::<Script>("res://my_button.gdns", "Script").unwrap() };
@@ -25,8 +25,8 @@ impl CustomNode {
2525
owner.add_custom_type("MyButton", "Button", script, texture);
2626
}
2727

28-
#[export]
29-
fn _exit_tree(&self, owner: TRef<EditorPlugin>) {
28+
#[godot]
29+
fn _exit_tree(&self, #[base] owner: TRef<EditorPlugin>) {
3030
// Clean-up of the plugin goes here.
3131
// Always remember to remove it from the engine when deactivated.
3232
owner.remove_custom_type("MyButton");
@@ -43,15 +43,15 @@ impl MyButton {
4343
MyButton
4444
}
4545

46-
#[export]
47-
fn _enter_tree(&self, owner: TRef<Button>) {
46+
#[godot]
47+
fn _enter_tree(&self, #[base] owner: TRef<Button>) {
4848
owner
4949
.connect("pressed", owner, "clicked", VariantArray::new_shared(), 0)
5050
.unwrap();
5151
}
5252

53-
#[export]
54-
fn clicked(&self, _owner: TRef<Button>) {
53+
#[godot]
54+
fn clicked(&self) {
5555
godot_print!("You clicked me!");
5656
}
5757
}

examples/resource/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ impl Greeter {
3737
}
3838
}
3939

40-
#[export]
41-
fn _ready(&self, _owner: &Node) {
40+
#[godot]
41+
fn _ready(&self) {
4242
if let Some(greeting_resource) = self.greeting_resource.as_ref() {
4343
let greeting_resource = unsafe { greeting_resource.assume_safe() };
4444
greeting_resource.map(|s, o| s.say_hello(&*o)).unwrap();

examples/rpc/src/client.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ impl ServerPuppet {
1717
Self
1818
}
1919

20-
#[export]
21-
fn _ready(&mut self, owner: TRef<Node>) {
20+
#[godot]
21+
fn _ready(&mut self, #[base] owner: TRef<Node>) {
2222
let peer = NetworkedMultiplayerENet::new();
2323
peer.create_client(
2424
GodotString::from(ADDRESS),
@@ -44,13 +44,13 @@ impl ServerPuppet {
4444
.unwrap();
4545
}
4646

47-
#[export]
48-
fn on_connected_to_server(&mut self, owner: TRef<Node>) {
47+
#[godot]
48+
fn on_connected_to_server(&mut self, #[base] owner: TRef<Node>) {
4949
owner.rpc("greet_server", &[Variant::new("hello")]);
5050
}
5151

52-
#[export(rpc = "puppet")]
53-
fn return_greeting(&mut self, _owner: &Node, msg: GodotString) {
52+
#[godot(rpc = "puppet")]
53+
fn return_greeting(&mut self, msg: GodotString) {
5454
godot_print!("Server says: {}", msg);
5555
}
5656
}

examples/rpc/src/server.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ impl Server {
1616
Self
1717
}
1818

19-
#[export]
20-
fn _ready(&mut self, owner: &Node) {
19+
#[godot]
20+
fn _ready(&mut self, #[base] owner: &Node) {
2121
let peer = NetworkedMultiplayerENet::new();
2222
peer.create_server(PORT, MAX_CLIENTS, IN_BANDWIDTH, OUT_BANDWIDTH)
2323
.unwrap();
@@ -28,8 +28,8 @@ impl Server {
2828
tree.set_network_peer(peer);
2929
}
3030

31-
#[export(rpc = "master")]
32-
fn greet_server(&mut self, owner: &Node, msg: GodotString) {
31+
#[godot(rpc = "master")]
32+
fn greet_server(&mut self, #[base] owner: &Node, msg: GodotString) {
3333
godot_print!("Client says: {}", msg);
3434

3535
let tree = owner.get_tree().expect("could not retreive Scene Tree");

examples/scene-create/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,17 @@ impl SceneCreate {
3333
}
3434
}
3535

36-
#[gdnative::derive::export]
37-
fn _ready(&mut self, _owner: &Spatial) {
36+
#[gdnative::derive::godot]
37+
fn _ready(&mut self) {
3838
self.template = load_scene("res://Child_scene.tscn");
3939
match &self.template {
4040
Some(_scene) => godot_print!("Loaded child scene successfully!"),
4141
None => godot_print!("Could not load child scene. Check name."),
4242
}
4343
}
4444

45-
#[gdnative::derive::export]
46-
fn spawn_one(&mut self, owner: &Spatial, message: GodotString) {
45+
#[gdnative::derive::godot]
46+
fn spawn_one(&mut self, #[base] owner: &Spatial, message: GodotString) {
4747
godot_print!("Called spawn_one({})", message.to_string());
4848

4949
let template = if let Some(template) = &self.template {
@@ -77,8 +77,8 @@ impl SceneCreate {
7777
update_panel(owner, num_children);
7878
}
7979

80-
#[gdnative::derive::export]
81-
fn remove_one(&mut self, owner: &Spatial, str: GodotString) {
80+
#[gdnative::derive::godot]
81+
fn remove_one(&mut self, #[base] owner: &Spatial, str: GodotString) {
8282
godot_print!("Called remove_one({})", str);
8383
let num_children = owner.get_child_count();
8484
if num_children <= 0 {

examples/signals/src/lib.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ impl SignalEmitter {
2828
}
2929
}
3030

31-
#[export]
32-
fn _process(&mut self, owner: &Node, delta: f64) {
31+
#[godot]
32+
fn _process(&mut self, #[base] owner: &Node, delta: f64) {
3333
if self.timer < 1.0 {
3434
self.timer += delta;
3535
return;
@@ -57,8 +57,8 @@ impl SignalSubscriber {
5757
SignalSubscriber { times_received: 0 }
5858
}
5959

60-
#[export]
61-
fn _ready(&mut self, owner: TRef<Label>) {
60+
#[godot]
61+
fn _ready(&mut self, #[base] owner: TRef<Label>) {
6262
let emitter = &mut owner.get_node("../SignalEmitter").unwrap();
6363
let emitter = unsafe { emitter.assume_safe() };
6464

@@ -76,16 +76,16 @@ impl SignalSubscriber {
7676
.unwrap();
7777
}
7878

79-
#[export]
80-
fn notify(&mut self, owner: &Label) {
79+
#[godot]
80+
fn notify(&mut self, #[base] owner: &Label) {
8181
self.times_received += 1;
8282
let msg = format!("Received signal \"tick\" {} times", self.times_received);
8383

8484
owner.set_text(msg);
8585
}
8686

87-
#[export]
88-
fn notify_with_data(&mut self, owner: &Label, data: Variant) {
87+
#[godot]
88+
fn notify_with_data(&mut self, #[base] owner: &Label, data: Variant) {
8989
let msg = format!(
9090
"Received signal \"tick_with_data\" with data {}",
9191
data.try_to::<u64>().unwrap()

examples/spinning-cube/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ impl RustTest {
4646
}
4747
}
4848

49-
#[export]
50-
fn _ready(&mut self, owner: &MeshInstance) {
49+
#[godot]
50+
fn _ready(&mut self, #[base] owner: &MeshInstance) {
5151
owner.set_physics_process(true);
5252
}
5353

54-
#[export]
55-
fn _physics_process(&mut self, owner: &MeshInstance, delta: f64) {
54+
#[godot]
55+
fn _physics_process(&mut self, #[base] owner: &MeshInstance, delta: f64) {
5656
use gdnative::api::SpatialMaterial;
5757

5858
self.time += delta as f32;

0 commit comments

Comments
 (0)