Skip to content

Commit

Permalink
Merge pull request #1321 from dsnopek/postinitialize
Browse files Browse the repository at this point in the history
Send NOTIFICATION_POSTINITIALIZE to extension classes
  • Loading branch information
akien-mga authored Nov 30, 2023
2 parents f3143c7 + 20c4e84 commit 11b2700
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/classes/wrapped.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ void Wrapped::_postinitialize() {
godot::internal::gdextension_interface_object_set_instance(_owner, reinterpret_cast<GDExtensionConstStringNamePtr>(extension_class), this);
}
godot::internal::gdextension_interface_object_set_instance_binding(_owner, godot::internal::token, this, _get_bindings_callbacks());
if (extension_class) {
Object *obj = dynamic_cast<Object *>(this);
if (obj) {
obj->notification(Object::NOTIFICATION_POSTINITIALIZE);
}
}
}

Wrapped::Wrapped(const StringName p_godot_class) {
Expand Down
5 changes: 5 additions & 0 deletions test/project/main.gd
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,11 @@ func _ready():
get_viewport().push_input(event)
assert_equal(custom_signal_emitted, ["_input: H", 72])

# Check NOTIFICATION_POST_INITIALIZED, both when created from GDScript and godot-cpp.
var new_example_ref = ExampleRef.new()
assert_equal(new_example_ref.was_post_initialized(), true)
assert_equal(example.test_post_initialize(), true)

exit_with_status()

func _on_Example_custom_signal(signal_name, value):
Expand Down
15 changes: 15 additions & 0 deletions test/src/example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,18 @@ int ExampleRef::get_id() const {
return id;
}

void ExampleRef::_notification(int p_what) {
if (p_what == NOTIFICATION_POSTINITIALIZE) {
post_initialized = true;
}
}

void ExampleRef::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_id", "id"), &ExampleRef::set_id);
ClassDB::bind_method(D_METHOD("get_id"), &ExampleRef::get_id);

ClassDB::bind_method(D_METHOD("was_post_initialized"), &ExampleRef::was_post_initialized);

ADD_PROPERTY(PropertyInfo(Variant::INT, "id"), "set_id", "get_id");
}

Expand Down Expand Up @@ -220,6 +228,7 @@ void Example::_bind_methods() {

ClassDB::bind_method(D_METHOD("def_args", "a", "b"), &Example::def_args, DEFVAL(100), DEFVAL(200));
ClassDB::bind_method(D_METHOD("callable_bind"), &Example::callable_bind);
ClassDB::bind_method(D_METHOD("test_post_initialize"), &Example::test_post_initialize);

ClassDB::bind_static_method("Example", D_METHOD("test_static", "a", "b"), &Example::test_static);
ClassDB::bind_static_method("Example", D_METHOD("test_static2"), &Example::test_static2);
Expand Down Expand Up @@ -597,6 +606,12 @@ Vector4 Example::get_v4() const {
return Vector4(1.2, 3.4, 5.6, 7.8);
}

bool Example::test_post_initialize() const {
Ref<ExampleRef> new_example_ref;
new_example_ref.instantiate();
return new_example_ref->was_post_initialized();
}

// Virtual function override.
bool Example::_has_point(const Vector2 &point) const {
Label *label = get_node<Label>("Label");
Expand Down
7 changes: 7 additions & 0 deletions test/src/example.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,21 @@ class ExampleRef : public RefCounted {
static int last_id;

int id;
bool post_initialized = false;

protected:
static void _bind_methods();

void _notification(int p_what);

public:
ExampleRef();
~ExampleRef();

void set_id(int p_id);
int get_id() const;

bool was_post_initialized() const { return post_initialized; }
};

class ExampleMin : public Control {
Expand Down Expand Up @@ -167,6 +172,8 @@ class Example : public Control {
Vector2 get_custom_position() const;
Vector4 get_v4() const;

bool test_post_initialize() const;

// Static method.
static int test_static(int p_a, int p_b);
static void test_static2();
Expand Down

0 comments on commit 11b2700

Please sign in to comment.