浏览代码

Merge pull request #1306 from dsnopek/4.1-cherrypicks-6

Cherry-picks for the godot-cpp 4.1 branch - 6th batch
Rémi Verschelde 1 年之前
父节点
当前提交
631cd5fe37
共有 4 个文件被更改,包括 129 次插入105 次删除
  1. 4 0
      .gitignore
  2. 97 89
      include/godot_cpp/classes/wrapped.hpp
  3. 19 7
      tools/android.py
  4. 9 9
      tools/godotcpp.py

+ 4 - 0
.gitignore

@@ -191,3 +191,7 @@ godot.creator.*
 
 # compile commands (https://clang.llvm.org/docs/JSONCompilationDatabase.html)
 compile_commands.json
+
+# Python development
+.venv
+venv

+ 97 - 89
include/godot_cpp/classes/wrapped.hpp

@@ -325,97 +325,105 @@ public:
 		_gde_binding_create_callback,                                                                                                                                                  \
 		_gde_binding_free_callback,                                                                                                                                                    \
 		_gde_binding_reference_callback,                                                                                                                                               \
-	};
+	};                                                                                                                                                                                 \
+                                                                                                                                                                                       \
+private:
 
 // Don't use this for your classes, use GDCLASS() instead.
-#define GDEXTENSION_CLASS_ALIAS(m_class, m_alias_for, m_inherits)                                                          \
-private:                                                                                                                   \
-	inline static ::godot::internal::EngineClassRegistration<m_class> _gde_engine_class_registration_helper;               \
-	void operator=(const m_class &p_rval) {}                                                                               \
-                                                                                                                           \
-protected:                                                                                                                 \
-	virtual const GDExtensionInstanceBindingCallbacks *_get_bindings_callbacks() const override {                          \
-		return &_gde_binding_callbacks;                                                                                    \
-	}                                                                                                                      \
-                                                                                                                           \
-	m_class(const char *p_godot_class) : m_inherits(p_godot_class) {}                                                      \
-	m_class(GodotObject *p_godot_object) : m_inherits(p_godot_object) {}                                                   \
-                                                                                                                           \
-	static void (*_get_bind_methods())() {                                                                                 \
-		return nullptr;                                                                                                    \
-	}                                                                                                                      \
-                                                                                                                           \
-	static void (Wrapped::*_get_notification())(int) {                                                                     \
-		return nullptr;                                                                                                    \
-	}                                                                                                                      \
-                                                                                                                           \
-	static bool (Wrapped::*_get_set())(const ::godot::StringName &p_name, const Variant &p_property) {                     \
-		return nullptr;                                                                                                    \
-	}                                                                                                                      \
-                                                                                                                           \
-	static bool (Wrapped::*_get_get())(const ::godot::StringName &p_name, Variant &r_ret) const {                          \
-		return nullptr;                                                                                                    \
-	}                                                                                                                      \
-                                                                                                                           \
-	static void (Wrapped::*_get_get_property_list())(List<PropertyInfo> * p_list) const {                                  \
-		return nullptr;                                                                                                    \
-	}                                                                                                                      \
-                                                                                                                           \
-	static bool (Wrapped::*_get_property_can_revert())(const ::godot::StringName &p_name) const {                          \
-		return nullptr;                                                                                                    \
-	}                                                                                                                      \
-                                                                                                                           \
-	static bool (Wrapped::*_get_property_get_revert())(const ::godot::StringName &p_name, Variant &) const {               \
-		return nullptr;                                                                                                    \
-	}                                                                                                                      \
-                                                                                                                           \
-	static String (Wrapped::*_get_to_string())() const {                                                                   \
-		return nullptr;                                                                                                    \
-	}                                                                                                                      \
-                                                                                                                           \
-public:                                                                                                                    \
-	typedef m_class self_type;                                                                                             \
-                                                                                                                           \
-	static void initialize_class() {}                                                                                      \
-                                                                                                                           \
-	static ::godot::StringName &get_class_static() {                                                                       \
-		static ::godot::StringName string_name = ::godot::StringName(#m_alias_for);                                        \
-		return string_name;                                                                                                \
-	}                                                                                                                      \
-                                                                                                                           \
-	static ::godot::StringName &get_parent_class_static() {                                                                \
-		return m_inherits::get_class_static();                                                                             \
-	}                                                                                                                      \
-                                                                                                                           \
-	static GDExtensionObjectPtr create(void *data) {                                                                       \
-		return nullptr;                                                                                                    \
-	}                                                                                                                      \
-                                                                                                                           \
-	static GDExtensionClassInstancePtr recreate(void *data, GDExtensionObjectPtr obj) {                                    \
-		return nullptr;                                                                                                    \
-	}                                                                                                                      \
-                                                                                                                           \
-	static void free(void *data, GDExtensionClassInstancePtr ptr) {                                                        \
-	}                                                                                                                      \
-                                                                                                                           \
-	static void *_gde_binding_create_callback(void *p_token, void *p_instance) {                                           \
-		/* Do not call memnew here, we don't want the post-initializer to be called */                                     \
-		return new ("") m_class((GodotObject *)p_instance);                                                                \
-	}                                                                                                                      \
-	static void _gde_binding_free_callback(void *p_token, void *p_instance, void *p_binding) {                             \
-		/* Explicitly call the deconstructor to ensure proper lifecycle for non-trivial members */                         \
-		reinterpret_cast<m_class *>(p_binding)->~m_class();                                                                \
-		Memory::free_static(reinterpret_cast<m_class *>(p_binding));                                                       \
-	}                                                                                                                      \
-	static GDExtensionBool _gde_binding_reference_callback(void *p_token, void *p_instance, GDExtensionBool p_reference) { \
-		return true;                                                                                                       \
-	}                                                                                                                      \
-	static constexpr GDExtensionInstanceBindingCallbacks _gde_binding_callbacks = {                                        \
-		_gde_binding_create_callback,                                                                                      \
-		_gde_binding_free_callback,                                                                                        \
-		_gde_binding_reference_callback,                                                                                   \
-	};                                                                                                                     \
-	m_class() : m_class(#m_alias_for) {}
+#define GDEXTENSION_CLASS_ALIAS(m_class, m_alias_for, m_inherits) /******************************************************************************************************************/ \
+private:                                                                                                                                                                               \
+	inline static ::godot::internal::EngineClassRegistration<m_class> _gde_engine_class_registration_helper;                                                                           \
+	void operator=(const m_class &p_rval) {}                                                                                                                                           \
+                                                                                                                                                                                       \
+protected:                                                                                                                                                                             \
+	virtual const GDExtensionInstanceBindingCallbacks *_get_bindings_callbacks() const override {                                                                                      \
+		return &_gde_binding_callbacks;                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	m_class(const char *p_godot_class) : m_inherits(p_godot_class) {}                                                                                                                  \
+	m_class(GodotObject *p_godot_object) : m_inherits(p_godot_object) {}                                                                                                               \
+                                                                                                                                                                                       \
+	static void (*_get_bind_methods())() {                                                                                                                                             \
+		return nullptr;                                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void (Wrapped::*_get_notification())(int) {                                                                                                                                 \
+		return nullptr;                                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static bool (Wrapped::*_get_set())(const ::godot::StringName &p_name, const Variant &p_property) {                                                                                 \
+		return nullptr;                                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static bool (Wrapped::*_get_get())(const ::godot::StringName &p_name, Variant &r_ret) const {                                                                                      \
+		return nullptr;                                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static inline bool has_get_property_list() {                                                                                                                                       \
+		return false;                                                                                                                                                                  \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void (Wrapped::*_get_get_property_list())(List<PropertyInfo> * p_list) const {                                                                                              \
+		return nullptr;                                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static bool (Wrapped::*_get_property_can_revert())(const ::godot::StringName &p_name) const {                                                                                      \
+		return nullptr;                                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static bool (Wrapped::*_get_property_get_revert())(const ::godot::StringName &p_name, Variant &) const {                                                                           \
+		return nullptr;                                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void (Wrapped::*_get_validate_property())(::godot::PropertyInfo & p_property) const {                                                                                       \
+		return nullptr;                                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static String (Wrapped::*_get_to_string())() const {                                                                                                                               \
+		return nullptr;                                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+public:                                                                                                                                                                                \
+	typedef m_class self_type;                                                                                                                                                         \
+                                                                                                                                                                                       \
+	static void initialize_class() {}                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static ::godot::StringName &get_class_static() {                                                                                                                                   \
+		static ::godot::StringName string_name = ::godot::StringName(#m_alias_for);                                                                                                    \
+		return string_name;                                                                                                                                                            \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static ::godot::StringName &get_parent_class_static() {                                                                                                                            \
+		return m_inherits::get_class_static();                                                                                                                                         \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static GDExtensionObjectPtr create(void *data) {                                                                                                                                   \
+		return nullptr;                                                                                                                                                                \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void free(void *data, GDExtensionClassInstancePtr ptr) {                                                                                                                    \
+	}                                                                                                                                                                                  \
+                                                                                                                                                                                       \
+	static void *_gde_binding_create_callback(void *p_token, void *p_instance) {                                                                                                       \
+		/* Do not call memnew here, we don't want the post-initializer to be called */                                                                                                 \
+		return new ("") m_class((GodotObject *)p_instance);                                                                                                                            \
+	}                                                                                                                                                                                  \
+	static void _gde_binding_free_callback(void *p_token, void *p_instance, void *p_binding) {                                                                                         \
+		/* Explicitly call the deconstructor to ensure proper lifecycle for non-trivial members */                                                                                     \
+		reinterpret_cast<m_class *>(p_binding)->~m_class();                                                                                                                            \
+		Memory::free_static(reinterpret_cast<m_class *>(p_binding));                                                                                                                   \
+	}                                                                                                                                                                                  \
+	static GDExtensionBool _gde_binding_reference_callback(void *p_token, void *p_instance, GDExtensionBool p_reference) {                                                             \
+		return true;                                                                                                                                                                   \
+	}                                                                                                                                                                                  \
+	static constexpr GDExtensionInstanceBindingCallbacks _gde_binding_callbacks = {                                                                                                    \
+		_gde_binding_create_callback,                                                                                                                                                  \
+		_gde_binding_free_callback,                                                                                                                                                    \
+		_gde_binding_reference_callback,                                                                                                                                               \
+	};                                                                                                                                                                                 \
+	m_class() : m_class(#m_alias_for) {}                                                                                                                                               \
+                                                                                                                                                                                       \
+private:
 
 // Don't use this for your classes, use GDCLASS() instead.
 #define GDEXTENSION_CLASS(m_class, m_inherits) GDEXTENSION_CLASS_ALIAS(m_class, m_class, m_inherits)

+ 19 - 7
tools/android.py

@@ -11,20 +11,32 @@ def options(opts):
         "18" if "32" in ARGUMENTS.get("arch", "arm64") else "21",
     )
     opts.Add(
-        "ANDROID_NDK_ROOT",
-        "Path to your Android NDK installation. By default, uses ANDROID_NDK_ROOT from your defined environment variables.",
-        os.environ.get("ANDROID_NDK_ROOT", None),
+        "ANDROID_HOME",
+        "Path to your Android SDK installation. By default, uses ANDROID_HOME from your defined environment variables.",
+        os.environ.get("ANDROID_HOME", os.environ.get("ANDROID_SDK_ROOT")),
     )
 
 
 def exists(env):
-    return "ANDROID_NDK_ROOT" in os.environ or "ANDROID_NDK_ROOT" in ARGUMENTS
+    return get_android_ndk_root(env) is not None
+
+
+# This must be kept in sync with the value in https://github.com/godotengine/godot/blob/master/platform/android/detect.py#L58.
+def get_ndk_version():
+    return "23.2.8568313"
+
+
+def get_android_ndk_root(env):
+    if env["ANDROID_HOME"]:
+        return env["ANDROID_HOME"] + "/ndk/" + get_ndk_version()
+    else:
+        return os.environ.get("ANDROID_NDK_ROOT")
 
 
 def generate(env):
-    if "ANDROID_NDK_ROOT" not in env:
+    if get_android_ndk_root(env) is None:
         raise ValueError(
-            "To build for Android, ANDROID_NDK_ROOT must be defined. Please set ANDROID_NDK_ROOT to the root folder of your Android NDK installation."
+            "To build for Android, the path to the NDK must be defined. Please set ANDROID_HOME to the root folder of your Android SDK installation."
         )
 
     if env["arch"] not in ("arm64", "x86_64", "arm32", "x86_32"):
@@ -42,7 +54,7 @@ def generate(env):
         api_level = 21
 
     # Setup toolchain
-    toolchain = env["ANDROID_NDK_ROOT"] + "/toolchains/llvm/prebuilt/"
+    toolchain = get_android_ndk_root(env) + "/toolchains/llvm/prebuilt/"
     if sys.platform == "win32" or sys.platform == "msys":
         toolchain += "windows"
         import platform as pltfm

+ 9 - 9
tools/godotcpp.py

@@ -239,6 +239,15 @@ def generate(env):
 
     print("Building for architecture " + env["arch"] + " on platform " + env["platform"])
 
+    tool = Tool(env["platform"], toolpath=["tools"])
+
+    if tool is None or not tool.exists(env):
+        raise ValueError("Required toolchain not found for platform " + env["platform"])
+
+    tool.generate(env)
+    target_tool = Tool("targets", toolpath=["tools"])
+    target_tool.generate(env)
+
     # Disable exception handling. Godot doesn't use exceptions anywhere, and this
     # saves around 20% of binary size and very significant build time.
     if env["disable_exceptions"]:
@@ -249,15 +258,6 @@ def generate(env):
     elif env.get("is_msvc", False):
         env.Append(CXXFLAGS=["/EHsc"])
 
-    tool = Tool(env["platform"], toolpath=["tools"])
-
-    if tool is None or not tool.exists(env):
-        raise ValueError("Required toolchain not found for platform " + env["platform"])
-
-    tool.generate(env)
-    target_tool = Tool("targets", toolpath=["tools"])
-    target_tool.generate(env)
-
     # Require C++17
     if env.get("is_msvc", False):
         env.Append(CXXFLAGS=["/std:c++17"])