Skip to content

Commit fa3dfa0

Browse files
authored
Merge pull request #1591 from dsnopek/variant-object-instance-id
Directly get object instance ID from `Variant` and implement `Variant::get_validated_object()`
2 parents 7fca545 + 0602c32 commit fa3dfa0

File tree

8 files changed

+34
-6
lines changed

8 files changed

+34
-6
lines changed

gdextension/gdextension_interface.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,6 +1271,18 @@ typedef GDExtensionBool (*GDExtensionInterfaceVariantHasMember)(GDExtensionVaria
12711271
*/
12721272
typedef GDExtensionBool (*GDExtensionInterfaceVariantHasKey)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionBool *r_valid);
12731273

1274+
/**
1275+
* @name variant_get_object_instance_id
1276+
* @since 4.4
1277+
*
1278+
* Gets the object instance ID from a variant of type GDEXTENSION_VARIANT_TYPE_OBJECT.
1279+
*
1280+
* @param p_self A pointer to the Variant.
1281+
*
1282+
* @return The instance ID for the contained object.
1283+
*/
1284+
typedef GDObjectInstanceID (*GDExtensionInterfaceVariantGetObjectInstanceId)(GDExtensionConstVariantPtr p_self);
1285+
12741286
/**
12751287
* @name variant_get_type_name
12761288
* @since 4.1

include/godot_cpp/godot.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ extern "C" GDExtensionInterfaceVariantGetType gdextension_interface_variant_get_
8282
extern "C" GDExtensionInterfaceVariantHasMethod gdextension_interface_variant_has_method;
8383
extern "C" GDExtensionInterfaceVariantHasMember gdextension_interface_variant_has_member;
8484
extern "C" GDExtensionInterfaceVariantHasKey gdextension_interface_variant_has_key;
85+
extern "C" GDExtensionInterfaceVariantGetObjectInstanceId gdextension_interface_variant_get_object_instance_id;
8586
extern "C" GDExtensionInterfaceVariantGetTypeName gdextension_interface_variant_get_type_name;
8687
extern "C" GDExtensionInterfaceVariantCanConvert gdextension_interface_variant_can_convert;
8788
extern "C" GDExtensionInterfaceVariantCanConvertStrict gdextension_interface_variant_can_convert_strict;

include/godot_cpp/variant/variant.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ class Variant {
264264
operator PackedColorArray() const;
265265
operator PackedVector4Array() const;
266266

267+
Object *get_validated_object() const;
268+
267269
Variant &operator=(const Variant &other);
268270
Variant &operator=(Variant &&other);
269271
bool operator==(const Variant &other) const;

src/godot.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ GDExtensionInterfaceVariantGetType gdextension_interface_variant_get_type = null
8888
GDExtensionInterfaceVariantHasMethod gdextension_interface_variant_has_method = nullptr;
8989
GDExtensionInterfaceVariantHasMember gdextension_interface_variant_has_member = nullptr;
9090
GDExtensionInterfaceVariantHasKey gdextension_interface_variant_has_key = nullptr;
91+
GDExtensionInterfaceVariantGetObjectInstanceId gdextension_interface_variant_get_object_instance_id = nullptr;
9192
GDExtensionInterfaceVariantGetTypeName gdextension_interface_variant_get_type_name = nullptr;
9293
GDExtensionInterfaceVariantCanConvert gdextension_interface_variant_can_convert = nullptr;
9394
GDExtensionInterfaceVariantCanConvertStrict gdextension_interface_variant_can_convert_strict = nullptr;
@@ -368,6 +369,7 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
368369
LOAD_PROC_ADDRESS(variant_has_method, GDExtensionInterfaceVariantHasMethod);
369370
LOAD_PROC_ADDRESS(variant_has_member, GDExtensionInterfaceVariantHasMember);
370371
LOAD_PROC_ADDRESS(variant_has_key, GDExtensionInterfaceVariantHasKey);
372+
LOAD_PROC_ADDRESS(variant_get_object_instance_id, GDExtensionInterfaceVariantGetObjectInstanceId);
371373
LOAD_PROC_ADDRESS(variant_get_type_name, GDExtensionInterfaceVariantGetTypeName);
372374
LOAD_PROC_ADDRESS(variant_can_convert, GDExtensionInterfaceVariantCanConvert);
373375
LOAD_PROC_ADDRESS(variant_can_convert_strict, GDExtensionInterfaceVariantCanConvertStrict);

src/variant/variant.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -448,12 +448,7 @@ Variant::operator ObjectID() const {
448448
if (get_type() == Type::INT) {
449449
return ObjectID(operator uint64_t());
450450
} else if (get_type() == Type::OBJECT) {
451-
Object *obj = operator Object *();
452-
if (obj != nullptr) {
453-
return ObjectID(obj->get_instance_id());
454-
} else {
455-
return ObjectID();
456-
}
451+
return ObjectID(internal::gdextension_interface_variant_get_object_instance_id(_native_ptr()));
457452
} else {
458453
return ObjectID();
459454
}
@@ -515,6 +510,10 @@ Variant::operator PackedVector4Array() const {
515510
return PackedVector4Array(this);
516511
}
517512

513+
Object *Variant::get_validated_object() const {
514+
return ObjectDB::get_instance(operator ObjectID());
515+
}
516+
518517
Variant &Variant::operator=(const Variant &other) {
519518
clear();
520519
internal::gdextension_interface_variant_new_copy(_native_ptr(), other._native_ptr());

test/project/main.gd

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,12 @@ func _ready():
209209
assert_equal(example.test_variant_float_conversion(10.0), 10.0)
210210
assert_equal(example.test_variant_float_conversion(10), 10.0)
211211

212+
# Test checking if objects are valid.
213+
var object_of_questionable_validity = Object.new()
214+
assert_equal(example.test_object_is_valid(object_of_questionable_validity), true)
215+
object_of_questionable_validity.free()
216+
assert_equal(example.test_object_is_valid(object_of_questionable_validity), false)
217+
212218
# Test that ptrcalls from GDExtension to the engine are correctly encoding Object and RefCounted.
213219
var new_node = Node.new()
214220
example.test_add_child(new_node)

test/src/example.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ void Example::_bind_methods() {
217217
ClassDB::bind_method(D_METHOD("test_variant_vector2i_conversion", "variant"), &Example::test_variant_vector2i_conversion);
218218
ClassDB::bind_method(D_METHOD("test_variant_int_conversion", "variant"), &Example::test_variant_int_conversion);
219219
ClassDB::bind_method(D_METHOD("test_variant_float_conversion", "variant"), &Example::test_variant_float_conversion);
220+
ClassDB::bind_method(D_METHOD("test_object_is_valid", "variant"), &Example::test_object_is_valid);
220221

221222
ClassDB::bind_method(D_METHOD("test_add_child", "node"), &Example::test_add_child);
222223
ClassDB::bind_method(D_METHOD("test_set_tileset", "tilemap", "tileset"), &Example::test_set_tileset);
@@ -598,6 +599,10 @@ float Example::test_variant_float_conversion(const Variant &p_variant) const {
598599
return p_variant;
599600
}
600601

602+
bool Example::test_object_is_valid(const Variant &p_variant) const {
603+
return static_cast<bool>(p_variant.get_validated_object());
604+
}
605+
601606
void Example::test_add_child(Node *p_node) {
602607
add_child(p_node);
603608
}

test/src/example.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ class Example : public Control {
147147
Vector2i test_variant_vector2i_conversion(const Variant &p_variant) const;
148148
int test_variant_int_conversion(const Variant &p_variant) const;
149149
float test_variant_float_conversion(const Variant &p_variant) const;
150+
bool test_object_is_valid(const Variant &p_variant) const;
150151

151152
void test_add_child(Node *p_node);
152153
void test_set_tileset(TileMap *p_tilemap, const Ref<TileSet> &p_tileset) const;

0 commit comments

Comments
 (0)