Compare commits
4 Commits
a977f2b7a5
...
1087e7e8a1
Author | SHA1 | Date |
---|---|---|
忘忧の | 1087e7e8a1 | |
David Snopek | 36847f6af0 | |
MJacred | 8a535d0ecc | |
DaylilyZeleen | 29d19fbed1 |
|
@ -58,7 +58,7 @@ first-party `godot-cpp` extension.
|
||||||
Some compatibility breakage is to be expected as GDExtension and `godot-cpp`
|
Some compatibility breakage is to be expected as GDExtension and `godot-cpp`
|
||||||
get more used, documented, and critical issues get resolved. See the
|
get more used, documented, and critical issues get resolved. See the
|
||||||
[Godot issue tracker](https://github.com/godotengine/godot/issues?q=is%3Aissue+is%3Aopen+label%3Atopic%3Agdextension)
|
[Godot issue tracker](https://github.com/godotengine/godot/issues?q=is%3Aissue+is%3Aopen+label%3Atopic%3Agdextension)
|
||||||
and the [godot-cpp issue tracker](https://github.com/godotengine/godot/issues)
|
and the [godot-cpp issue tracker](https://github.com/godotengine/godot-cpp/issues)
|
||||||
for a list of known issues, and be sure to provide feedback on issues and PRs
|
for a list of known issues, and be sure to provide feedback on issues and PRs
|
||||||
which affect your use of this extension.
|
which affect your use of this extension.
|
||||||
|
|
||||||
|
|
|
@ -964,8 +964,20 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
|
||||||
result.append(method_signature + "{")
|
result.append(method_signature + "{")
|
||||||
|
|
||||||
method_call = "\t"
|
method_call = "\t"
|
||||||
|
need_additional_right_bracke = False
|
||||||
if "return_type" in method:
|
if "return_type" in method:
|
||||||
method_call += f'return internal::_call_builtin_method_ptr_ret<{correct_type(method["return_type"])}>('
|
return_type = method["return_type"]
|
||||||
|
if not is_variant(return_type) and not is_pod_type(return_type) and not is_enum(return_type):
|
||||||
|
if is_refcounted(return_type):
|
||||||
|
# RefCounted
|
||||||
|
method_call += f"return Ref<{return_type}>::_gde_internal_constructor("
|
||||||
|
need_additional_right_bracke = True
|
||||||
|
else:
|
||||||
|
# Object
|
||||||
|
method_call += f"return "
|
||||||
|
method_call += f"internal::_call_builtin_method_ptr_ret_obj<{return_type}>("
|
||||||
|
else:
|
||||||
|
method_call += f"return internal::_call_builtin_method_ptr_ret<{correct_type(return_type)}>("
|
||||||
else:
|
else:
|
||||||
method_call += "internal::_call_builtin_method_ptr_no_ret("
|
method_call += "internal::_call_builtin_method_ptr_no_ret("
|
||||||
method_call += f'_method_bindings.method_{method["name"]}, '
|
method_call += f'_method_bindings.method_{method["name"]}, '
|
||||||
|
@ -986,7 +998,10 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
|
||||||
result += encode
|
result += encode
|
||||||
arguments.append(arg_name)
|
arguments.append(arg_name)
|
||||||
method_call += ", ".join(arguments)
|
method_call += ", ".join(arguments)
|
||||||
method_call += ");"
|
if need_additional_right_bracke:
|
||||||
|
method_call += "));"
|
||||||
|
else:
|
||||||
|
method_call += ");"
|
||||||
|
|
||||||
result.append(method_call)
|
result.append(method_call)
|
||||||
result.append("}")
|
result.append("}")
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#define GODOT_BUILTIN_PTRCALL_HPP
|
#define GODOT_BUILTIN_PTRCALL_HPP
|
||||||
|
|
||||||
#include <gdextension_interface.h>
|
#include <gdextension_interface.h>
|
||||||
|
#include <godot_cpp/core/object.hpp>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
|
@ -39,6 +40,17 @@ namespace godot {
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
|
template <class O, class... Args>
|
||||||
|
O *_call_builtin_method_ptr_ret_obj(const GDExtensionPtrBuiltInMethod method, GDExtensionTypePtr base, const Args &...args) {
|
||||||
|
GodotObject *ret = nullptr;
|
||||||
|
std::array<GDExtensionConstTypePtr, sizeof...(Args)> call_args = { { (GDExtensionConstTypePtr)args... } };
|
||||||
|
method(base, call_args.data(), &ret, sizeof...(Args));
|
||||||
|
if (ret == nullptr) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return reinterpret_cast<O *>(internal::get_object_instance_binding(ret));
|
||||||
|
}
|
||||||
|
|
||||||
template <class... Args>
|
template <class... Args>
|
||||||
void _call_builtin_constructor(const GDExtensionPtrConstructor constructor, GDExtensionTypePtr base, Args... args) {
|
void _call_builtin_constructor(const GDExtensionPtrConstructor constructor, GDExtensionTypePtr base, Args... args) {
|
||||||
std::array<GDExtensionConstTypePtr, sizeof...(Args)> call_args = { { (GDExtensionConstTypePtr)args... } };
|
std::array<GDExtensionConstTypePtr, sizeof...(Args)> call_args = { { (GDExtensionConstTypePtr)args... } };
|
||||||
|
|
Loading…
Reference in New Issue