Merge pull request #117087 from YYF233333/variant-caster

Split `VariantCaster` from `binder_common.h`
This commit is contained in:
Rémi Verschelde 2026-03-10 12:40:45 +01:00 committed by GitHub
commit c7dd329293
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
39 changed files with 255 additions and 207 deletions

View file

@ -32,7 +32,7 @@
#include "core/crypto/crypto_core.h"
#include "core/object/ref_counted.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
class AESContext : public RefCounted {
GDCLASS(AESContext, RefCounted);

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/object/ref_counted.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
class HashingContext : public RefCounted {
GDCLASS(HashingContext, RefCounted);

View file

@ -34,6 +34,8 @@
#include "core/os/main_loop.h"
#include "core/os/os.h"
#include <cstdio>
struct LocalDebugger::ScriptsProfiler {
struct ProfileInfoSort {
bool operator()(const ScriptLanguage::ProfilingInfo &A, const ScriptLanguage::ProfilingInfo &B) const {

View file

@ -36,6 +36,8 @@
#include "core/os/os.h"
#include "core/string/ustring.h"
#include <cstdio>
// Optional physics interpolation warnings try to include the path to the relevant node.
#if defined(DEBUG_ENABLED) && defined(TOOLS_ENABLED)
#include "core/config/project_settings.h"

View file

@ -36,7 +36,7 @@
#include "core/os/memory.h"
#include "core/string/ustring.h"
#include "core/typedefs.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
/**
* Multi-Platform abstraction for accessing to files.

View file

@ -36,7 +36,7 @@
#include "core/object/gdvirtual.gen.h"
#include "core/string/ustring.h"
#include "core/templates/list.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
class ImageLoader;

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/io/ip_address.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
template <typename T>
class TypedArray;

View file

@ -39,6 +39,8 @@
#include "modules/modules_enabled.gen.h" // For regex.
#include <cstdio>
#ifdef MODULE_REGEX_ENABLED
#include "modules/regex/regex.h"
#endif // MODULE_REGEX_ENABLED

View file

@ -33,7 +33,7 @@
#include "core/object/ref_counted.h"
#include "core/string/ustring.h"
#include "core/templates/vector.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
/*
Based on irrXML (see their zlib license). Added mainly for compatibility with their Collada loader.

View file

@ -197,7 +197,9 @@ def run(target, source, env):
#pragma once
#include "core/object/script_instance.h"
#include "core/variant/binder_common.h"
#include "core/variant/method_ptrcall.h"
#include "core/variant/variant_caster.h"
#include "core/variant/variant_internal.h"
inline constexpr uintptr_t _INVALID_GDVIRTUAL_FUNC_ADDR = static_cast<uintptr_t>(-1);

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/object/ref_counted.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
class UndoRedo : public Object {
GDCLASS(UndoRedo, Object);

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/object/object.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
#include "time_enums.h"
// This Time class conforms with as many of the ISO 8601 standards as possible.

View file

@ -50,6 +50,8 @@ STATIC_ASSERT_INCOMPLETE_TYPE(class, Object);
#include "thirdparty/grisu2/grisu2.h"
#include <cstdio>
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS // to disable build-time warning which suggested to use strcpy_s instead strcpy
#endif

View file

@ -36,115 +36,11 @@
#include "core/variant/method_ptrcall.h"
#include "core/variant/type_info.h"
#include "core/variant/variant.h"
#include "core/variant/variant_caster.h"
#include "core/variant/variant_internal.h"
#include <cstdio>
enum class HatDir;
enum class HatMask;
enum class JoyAxis;
enum class JoyButton;
enum class MIDIMessage;
enum class MouseButton;
enum class MouseButtonMask;
enum class Key;
enum class KeyModifierMask;
enum class KeyLocation;
// Variant cannot define an implicit cast operator for every Object subclass, so the
// casting is done here, to allow binding methods with parameters more specific than Object *
template <typename T>
struct VariantCaster {
static _FORCE_INLINE_ T cast(const Variant &p_variant) {
using TStripped = std::remove_pointer_t<T>;
if constexpr (std::is_base_of_v<Object, TStripped>) {
return Object::cast_to<TStripped>(p_variant);
} else {
return p_variant;
}
}
};
template <typename T>
struct VariantCaster<T &> {
static _FORCE_INLINE_ T cast(const Variant &p_variant) {
using TStripped = std::remove_pointer_t<T>;
if constexpr (std::is_base_of_v<Object, TStripped>) {
return Object::cast_to<TStripped>(p_variant);
} else {
return p_variant;
}
}
};
template <typename T>
struct VariantCaster<const T &> {
static _FORCE_INLINE_ T cast(const Variant &p_variant) {
using TStripped = std::remove_pointer_t<T>;
if constexpr (std::is_base_of_v<Object, TStripped>) {
return Object::cast_to<TStripped>(p_variant);
} else {
return p_variant;
}
}
};
#define VARIANT_ENUM_CAST(m_enum) MAKE_ENUM_TYPE_INFO(m_enum, m_enum)
#define VARIANT_BITFIELD_CAST(m_enum) MAKE_BITFIELD_TYPE_INFO(m_enum, m_enum)
// Use only for backwards compatibility when the location of an enum changes.
#define VARIANT_ENUM_CAST_EXT(m_enum, m_bound_name) MAKE_ENUM_TYPE_INFO(m_enum, m_bound_name)
#define VARIANT_BITFIELD_CAST_EXT(m_enum, m_bound_name) MAKE_BITFIELD_TYPE_INFO(m_enum, m_bound_name)
// Object enum casts must go here
VARIANT_ENUM_CAST(Object::ConnectFlags);
VARIANT_ENUM_CAST(Vector2::Axis);
VARIANT_ENUM_CAST(Vector2i::Axis);
VARIANT_ENUM_CAST(Vector3::Axis);
VARIANT_ENUM_CAST(Vector3i::Axis);
VARIANT_ENUM_CAST(Vector4::Axis);
VARIANT_ENUM_CAST(Vector4i::Axis);
VARIANT_ENUM_CAST(EulerOrder);
VARIANT_ENUM_CAST(Projection::Planes);
VARIANT_ENUM_CAST(Error);
VARIANT_ENUM_CAST(Side);
VARIANT_ENUM_CAST(ClockDirection);
VARIANT_ENUM_CAST(Corner);
VARIANT_ENUM_CAST(HatDir);
VARIANT_BITFIELD_CAST(HatMask);
VARIANT_ENUM_CAST(JoyAxis);
VARIANT_ENUM_CAST(JoyButton);
VARIANT_ENUM_CAST(MIDIMessage);
VARIANT_ENUM_CAST(MouseButton);
VARIANT_BITFIELD_CAST(MouseButtonMask);
VARIANT_ENUM_CAST(Orientation);
VARIANT_ENUM_CAST(HorizontalAlignment);
VARIANT_ENUM_CAST(VerticalAlignment);
VARIANT_ENUM_CAST(InlineAlignment);
VARIANT_ENUM_CAST(PropertyHint);
VARIANT_BITFIELD_CAST(PropertyUsageFlags);
VARIANT_ENUM_CAST(Variant::Type);
VARIANT_ENUM_CAST(Variant::Operator);
// Key
VARIANT_ENUM_CAST(Key);
VARIANT_BITFIELD_CAST(KeyModifierMask);
VARIANT_ENUM_CAST(KeyLocation);
template <>
struct VariantCaster<char32_t> {
static _FORCE_INLINE_ char32_t cast(const Variant &p_variant) {
return (char32_t)p_variant.operator int();
}
};
template <>
struct PtrToArg<char32_t> {
_FORCE_INLINE_ static char32_t convert(const void *p_ptr) {
@ -156,80 +52,6 @@ struct PtrToArg<char32_t> {
}
};
template <typename T>
struct VariantObjectClassChecker {
static _FORCE_INLINE_ bool check(const Variant &p_variant) {
using TStripped = std::remove_pointer_t<T>;
if constexpr (std::is_base_of_v<Object, TStripped>) {
Object *obj = p_variant;
return Object::cast_to<TStripped>(p_variant) || !obj;
} else {
return true;
}
}
};
template <typename T>
class Ref;
template <typename T>
struct VariantObjectClassChecker<const Ref<T> &> {
static _FORCE_INLINE_ bool check(const Variant &p_variant) {
Object *obj = p_variant;
const Ref<T> node = p_variant;
return node.ptr() || !obj;
}
};
#ifdef DEBUG_ENABLED
template <typename T>
struct VariantCasterAndValidate {
static _FORCE_INLINE_ T cast(const Variant **p_args, uint32_t p_arg_idx, Callable::CallError &r_error) {
Variant::Type argtype = GetTypeInfo<T>::VARIANT_TYPE;
if (!Variant::can_convert_strict(p_args[p_arg_idx]->get_type(), argtype) ||
!VariantObjectClassChecker<T>::check(*p_args[p_arg_idx])) {
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
r_error.argument = p_arg_idx;
r_error.expected = argtype;
}
return VariantCaster<T>::cast(*p_args[p_arg_idx]);
}
};
template <typename T>
struct VariantCasterAndValidate<T &> {
static _FORCE_INLINE_ T cast(const Variant **p_args, uint32_t p_arg_idx, Callable::CallError &r_error) {
Variant::Type argtype = GetTypeInfo<T>::VARIANT_TYPE;
if (!Variant::can_convert_strict(p_args[p_arg_idx]->get_type(), argtype) ||
!VariantObjectClassChecker<T>::check(*p_args[p_arg_idx])) {
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
r_error.argument = p_arg_idx;
r_error.expected = argtype;
}
return VariantCaster<T>::cast(*p_args[p_arg_idx]);
}
};
template <typename T>
struct VariantCasterAndValidate<const T &> {
static _FORCE_INLINE_ T cast(const Variant **p_args, uint32_t p_arg_idx, Callable::CallError &r_error) {
Variant::Type argtype = GetTypeInfo<T>::VARIANT_TYPE;
if (!Variant::can_convert_strict(p_args[p_arg_idx]->get_type(), argtype) ||
!VariantObjectClassChecker<T>::check(*p_args[p_arg_idx])) {
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
r_error.argument = p_arg_idx;
r_error.expected = argtype;
}
return VariantCaster<T>::cast(*p_args[p_arg_idx]);
}
};
#endif // DEBUG_ENABLED
template <typename T, typename... P, size_t... Is>
void call_with_variant_args_helper(T *p_instance, void (T::*p_method)(P...), const Variant **p_args, Callable::CallError &r_error, IndexSequence<Is...>) {
r_error.error = Callable::CallError::CALL_OK;

View file

@ -31,9 +31,10 @@
#pragma once
#include "core/math/audio_frame.h"
#include "core/variant/binder_common.h"
#include "core/variant/method_ptrcall.h"
#include "core/variant/type_info.h"
#include "core/variant/variant_caster.h"
#include "core/variant/variant_internal.h"
template <typename T>
struct GDExtensionConstPtr {

View file

@ -290,6 +290,13 @@ inline StringName __constant_get_bitfield_name(T param) {
}
#define CLASS_INFO(m_type) (GetTypeInfo<m_type *>::get_class_info())
#define VARIANT_ENUM_CAST(m_enum) MAKE_ENUM_TYPE_INFO(m_enum, m_enum)
#define VARIANT_BITFIELD_CAST(m_enum) MAKE_BITFIELD_TYPE_INFO(m_enum, m_enum)
// Use only for backwards compatibility when the location of an enum changes.
#define VARIANT_ENUM_CAST_EXT(m_enum, m_bound_name) MAKE_ENUM_TYPE_INFO(m_enum, m_bound_name)
#define VARIANT_BITFIELD_CAST_EXT(m_enum, m_bound_name) MAKE_BITFIELD_TYPE_INFO(m_enum, m_bound_name)
// No initialization by default, except for scalar types.
template <typename T>
struct ZeroInitializer {

View file

@ -0,0 +1,206 @@
/**************************************************************************/
/* variant_caster.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
#pragma once
#include "core/object/object.h"
#include "core/variant/type_info.h"
enum class HatDir;
enum class HatMask;
enum class JoyAxis;
enum class JoyButton;
enum class MIDIMessage;
enum class MouseButton;
enum class MouseButtonMask;
enum class Key;
enum class KeyModifierMask;
enum class KeyLocation;
// Variant cannot define an implicit cast operator for every Object subclass, so the
// casting is done here, to allow binding methods with parameters more specific than Object *
template <typename T>
struct VariantCaster {
static _FORCE_INLINE_ T cast(const Variant &p_variant) {
using TStripped = std::remove_pointer_t<T>;
if constexpr (std::is_base_of_v<Object, TStripped>) {
return Object::cast_to<TStripped>(p_variant);
} else {
return p_variant;
}
}
};
template <typename T>
struct VariantCaster<T &> {
static _FORCE_INLINE_ T cast(const Variant &p_variant) {
using TStripped = std::remove_pointer_t<T>;
if constexpr (std::is_base_of_v<Object, TStripped>) {
return Object::cast_to<TStripped>(p_variant);
} else {
return p_variant;
}
}
};
template <typename T>
struct VariantCaster<const T &> {
static _FORCE_INLINE_ T cast(const Variant &p_variant) {
using TStripped = std::remove_pointer_t<T>;
if constexpr (std::is_base_of_v<Object, TStripped>) {
return Object::cast_to<TStripped>(p_variant);
} else {
return p_variant;
}
}
};
// Object enum casts must go here
VARIANT_ENUM_CAST(Object::ConnectFlags);
VARIANT_ENUM_CAST(Vector2::Axis);
VARIANT_ENUM_CAST(Vector2i::Axis);
VARIANT_ENUM_CAST(Vector3::Axis);
VARIANT_ENUM_CAST(Vector3i::Axis);
VARIANT_ENUM_CAST(Vector4::Axis);
VARIANT_ENUM_CAST(Vector4i::Axis);
VARIANT_ENUM_CAST(EulerOrder);
VARIANT_ENUM_CAST(Projection::Planes);
VARIANT_ENUM_CAST(Error);
VARIANT_ENUM_CAST(Side);
VARIANT_ENUM_CAST(ClockDirection);
VARIANT_ENUM_CAST(Corner);
VARIANT_ENUM_CAST(HatDir);
VARIANT_BITFIELD_CAST(HatMask);
VARIANT_ENUM_CAST(JoyAxis);
VARIANT_ENUM_CAST(JoyButton);
VARIANT_ENUM_CAST(MIDIMessage);
VARIANT_ENUM_CAST(MouseButton);
VARIANT_BITFIELD_CAST(MouseButtonMask);
VARIANT_ENUM_CAST(Orientation);
VARIANT_ENUM_CAST(HorizontalAlignment);
VARIANT_ENUM_CAST(VerticalAlignment);
VARIANT_ENUM_CAST(InlineAlignment);
VARIANT_ENUM_CAST(PropertyHint);
VARIANT_BITFIELD_CAST(PropertyUsageFlags);
VARIANT_ENUM_CAST(Variant::Type);
VARIANT_ENUM_CAST(Variant::Operator);
// Key
VARIANT_ENUM_CAST(Key);
VARIANT_BITFIELD_CAST(KeyModifierMask);
VARIANT_ENUM_CAST(KeyLocation);
template <>
struct VariantCaster<char32_t> {
static _FORCE_INLINE_ char32_t cast(const Variant &p_variant) {
return (char32_t)p_variant.operator int();
}
};
template <typename T>
struct VariantObjectClassChecker {
static _FORCE_INLINE_ bool check(const Variant &p_variant) {
using TStripped = std::remove_pointer_t<T>;
if constexpr (std::is_base_of_v<Object, TStripped>) {
Object *obj = p_variant;
return Object::cast_to<TStripped>(p_variant) || !obj;
} else {
return true;
}
}
};
template <typename T>
class Ref;
template <typename T>
struct VariantObjectClassChecker<const Ref<T> &> {
static _FORCE_INLINE_ bool check(const Variant &p_variant) {
Object *obj = p_variant;
const Ref<T> node = p_variant;
return node.ptr() || !obj;
}
};
#ifdef DEBUG_ENABLED
template <typename T>
struct VariantCasterAndValidate {
static _FORCE_INLINE_ T cast(const Variant **p_args, uint32_t p_arg_idx, Callable::CallError &r_error) {
Variant::Type argtype = GetTypeInfo<T>::VARIANT_TYPE;
if (!Variant::can_convert_strict(p_args[p_arg_idx]->get_type(), argtype) ||
!VariantObjectClassChecker<T>::check(*p_args[p_arg_idx])) {
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
r_error.argument = p_arg_idx;
r_error.expected = argtype;
}
return VariantCaster<T>::cast(*p_args[p_arg_idx]);
}
};
template <typename T>
struct VariantCasterAndValidate<T &> {
static _FORCE_INLINE_ T cast(const Variant **p_args, uint32_t p_arg_idx, Callable::CallError &r_error) {
Variant::Type argtype = GetTypeInfo<T>::VARIANT_TYPE;
if (!Variant::can_convert_strict(p_args[p_arg_idx]->get_type(), argtype) ||
!VariantObjectClassChecker<T>::check(*p_args[p_arg_idx])) {
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
r_error.argument = p_arg_idx;
r_error.expected = argtype;
}
return VariantCaster<T>::cast(*p_args[p_arg_idx]);
}
};
template <typename T>
struct VariantCasterAndValidate<const T &> {
static _FORCE_INLINE_ T cast(const Variant **p_args, uint32_t p_arg_idx, Callable::CallError &r_error) {
Variant::Type argtype = GetTypeInfo<T>::VARIANT_TYPE;
if (!Variant::can_convert_strict(p_args[p_arg_idx]->get_type(), argtype) ||
!VariantObjectClassChecker<T>::check(*p_args[p_arg_idx])) {
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
r_error.argument = p_arg_idx;
r_error.expected = argtype;
}
return VariantCaster<T>::cast(*p_args[p_arg_idx]);
}
};
#endif // DEBUG_ENABLED

View file

@ -37,6 +37,7 @@
#include "core/io/compression.h"
#include "core/templates/a_hash_map.h"
#include "core/templates/local_vector.h"
#include "core/variant/binder_common.h"
#include "core/variant/native_ptr.h"
#include "core/variant/variant_internal.h"

View file

@ -33,7 +33,7 @@
class EditorExportPlatform;
#include "core/object/ref_counted.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
class EditorExportPreset : public RefCounted {
GDCLASS(EditorExportPreset, RefCounted);

View file

@ -32,7 +32,7 @@
#include "core/object/object.h"
#include "core/templates/hash_map.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
#define PERF_WARN_OFFLINE_FUNCTION
#define PERF_WARN_PROCESS_SYNC

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/object/object.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
#include "core/variant/variant.h"
class JSONRPC : public Object {

View file

@ -32,7 +32,6 @@
#include "2d/nav_base_iteration_2d.h"
#include "core/os/rw_lock.h"
#include "core/variant/binder_common.h"
#include "nav_base_2d.h"
#include "nav_utils_2d.h"

View file

@ -33,7 +33,6 @@
#include "upnp_device.h"
#include "core/object/ref_counted.h"
#include "core/variant/binder_common.h"
class UPNP : public RefCounted {
GDCLASS(UPNP, RefCounted);

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/object/ref_counted.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
class UPNPDevice : public RefCounted {
GDCLASS(UPNPDevice, RefCounted);

View file

@ -49,6 +49,7 @@
#include <execinfo.h>
#include <link.h>
#include <csignal>
#include <cstdio>
#include <cstdlib>
static void handle_crash(int sig) {

View file

@ -39,6 +39,7 @@
#include "main/main.h"
#include <unistd.h>
#include <cstdio>
#if defined(DEBUG_ENABLED)
#define CRASH_HANDLER_ENABLED 1

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/object/ref_counted.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
class Tween;
class Node;

View file

@ -34,7 +34,7 @@
#include "core/object/ref_counted.h"
#include "core/os/thread_safe.h"
#include "core/templates/rid.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
/**
The camera server is a singleton object that gives access to the various

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/object/object.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
#include "servers/display/accessibility_server_enums.h"
#include "servers/display/display_server_enums.h"

View file

@ -30,6 +30,7 @@
#pragma once
#include "core/input/input_enums.h"
#include "core/io/image.h"
#include "core/io/resource.h"
#include "core/object/object.h"

View file

@ -32,8 +32,8 @@
#include "core/object/object.h"
#include "core/os/keyboard.h"
#include "core/variant/binder_common.h"
#include "core/variant/callable.h"
#include "core/variant/type_info.h"
class Texture2D;

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/object/ref_counted.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
#include "servers/navigation_2d/navigation_constants_2d.h"
class NavigationPathQueryParameters2D : public RefCounted {

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/object/ref_counted.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
#include "core/variant/typed_array.h"
#include "servers/navigation_2d/navigation_constants_2d.h"

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/object/ref_counted.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
#include "servers/navigation_3d/navigation_constants_3d.h"
class NavigationPathQueryParameters3D : public RefCounted {

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/object/ref_counted.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
#include "core/variant/typed_array.h"
#include "servers/navigation_3d/navigation_constants_3d.h"

View file

@ -36,7 +36,7 @@
#include "core/templates/local_vector.h"
#include "core/templates/rb_map.h"
#include "core/templates/rid_owner.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
#include "core/variant/typed_array.h"
#include "servers/display/display_server_enums.h"
#include "servers/rendering/rendering_device_commons.h"

View file

@ -32,7 +32,7 @@
#include "core/object/ref_counted.h"
#include "core/os/thread_safe.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
/**
The XR interface is a template class on top of which we build interface to different AR, VR and tracking SDKs.

View file

@ -31,7 +31,7 @@
#pragma once
#include "core/object/ref_counted.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
class XRPose : public RefCounted {
GDCLASS(XRPose, RefCounted);

View file

@ -32,7 +32,7 @@
#include "core/object/ref_counted.h"
#include "core/os/thread_safe.h"
#include "core/variant/binder_common.h"
#include "core/variant/type_info.h"
#include "core/variant/variant.h"
class XRInterface;