Compare commits

...

5 Commits

Author SHA1 Message Date
44c3f6a55a Merge pull request #112776 from m4gr3d/add_android_xr_support_4_5_1
[4.5] [Android editor] Add support for Android XR devices to the Godot XR Editor
2025-11-19 12:43:58 +01:00
bc382d11de Add support for Android XR devices to the Godot XR Editor 2025-11-14 11:47:57 -08:00
6d411f0c0d Merge pull request #112103 from akien-mga/4.5-fix-gcc-warnings
[4.5] Core: Sidestep MinGW-GCC false-positive warnings
2025-10-28 17:10:56 +01:00
20c59d6924 Core: Sidestep GCC false-positive warnings
(cherry picked from commits acdb8667b5
and 6733345f73)

Adds some more fixes for 4.5.

Co-authored-by: Lukas Tenbrink <lukas.tenbrink@gmail.com>
Co-authored-by: Rémi Verschelde <rverschelde@gmail.com>
2025-10-28 14:07:12 +01:00
8351a28101 Bump version to 4.5.2-rc 2025-10-15 11:15:29 -05:00
21 changed files with 102 additions and 29 deletions

View File

@ -2357,6 +2357,12 @@ void Image::initialize_data(const char **p_xpm) {
} break; } break;
case READING_PIXELS: { case READING_PIXELS: {
int y = line - colormap_size - 1; int y = line - colormap_size - 1;
#ifdef __MINGW32__
// False positive only with MinGW-GCC. Don't silence for regular GCC/Clang
// as this is code that _could_ exhibit actual overflow bugs.
GODOT_GCC_WARNING_PUSH
GODOT_GCC_PRAGMA(GCC diagnostic warning "-Wstringop-overflow=0")
#endif
for (int x = 0; x < size_width; x++) { for (int x = 0; x < size_width; x++) {
char pixelstr[6] = { 0, 0, 0, 0, 0, 0 }; char pixelstr[6] = { 0, 0, 0, 0, 0, 0 };
for (int i = 0; i < pixelchars; i++) { for (int i = 0; i < pixelchars; i++) {
@ -2371,6 +2377,9 @@ void Image::initialize_data(const char **p_xpm) {
} }
_put_pixelb(x, y, pixel_size, data_write, pixel); _put_pixelb(x, y, pixel_size, data_write, pixel);
} }
#ifdef __MINGW32__
GODOT_GCC_WARNING_POP
#endif
if (y == (size_height - 1)) { if (y == (size_height - 1)) {
status = DONE; status = DONE;

View File

@ -30,7 +30,9 @@
#include "geometry_2d.h" #include "geometry_2d.h"
GODOT_GCC_WARNING_PUSH_AND_IGNORE("-Walloc-zero")
#include "thirdparty/clipper2/include/clipper2/clipper.h" #include "thirdparty/clipper2/include/clipper2/clipper.h"
GODOT_GCC_WARNING_POP
#include "thirdparty/misc/polypartition.h" #include "thirdparty/misc/polypartition.h"
#define STB_RECT_PACK_IMPLEMENTATION #define STB_RECT_PACK_IMPLEMENTATION
#include "thirdparty/misc/stb_rect_pack.h" #include "thirdparty/misc/stb_rect_pack.h"

View File

@ -5855,6 +5855,15 @@ String String::unquote() const {
return substr(1, length() - 2); return substr(1, length() - 2);
} }
// MinGW-GCC false positives because CharStringT::length() is int (so possibly < 0).
// Don't silence for regular GCC/Clang as this is code that _could_ exhibit actual overflow bugs.
#ifdef __MINGW32__
GODOT_GCC_WARNING_PUSH
GODOT_GCC_PRAGMA(GCC diagnostic warning "-Wstringop-overflow=0")
GODOT_GCC_WARNING_IGNORE("-Warray-bounds")
GODOT_GCC_WARNING_IGNORE("-Wrestrict")
#endif
Vector<uint8_t> String::to_ascii_buffer() const { Vector<uint8_t> String::to_ascii_buffer() const {
const String *s = this; const String *s = this;
if (s->is_empty()) { if (s->is_empty()) {
@ -5903,6 +5912,10 @@ Vector<uint8_t> String::to_utf16_buffer() const {
return retval; return retval;
} }
#ifdef __MINGW32__
GODOT_GCC_WARNING_POP
#endif
Vector<uint8_t> String::to_utf32_buffer() const { Vector<uint8_t> String::to_utf32_buffer() const {
const String *s = this; const String *s = this;
if (s->is_empty()) { if (s->is_empty()) {

View File

@ -32,6 +32,8 @@
#include "core/templates/span.h" #include "core/templates/span.h"
GODOT_GCC_WARNING_PUSH_AND_IGNORE("-Warray-bounds")
/** /**
* A high performance Vector of fixed capacity. * A high performance Vector of fixed capacity.
* Especially useful if you need to create an array on the stack, to * Especially useful if you need to create an array on the stack, to
@ -163,3 +165,5 @@ public:
_FORCE_INLINE_ constexpr const T *begin() const { return ptr(); } _FORCE_INLINE_ constexpr const T *begin() const { return ptr(); }
_FORCE_INLINE_ constexpr const T *end() const { return ptr() + _size; } _FORCE_INLINE_ constexpr const T *end() const { return ptr() + _size; }
}; };
GODOT_GCC_WARNING_POP

View File

@ -19,11 +19,11 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>4.5.1</string> <string>4.5.2</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>GODO</string> <string>GODO</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>4.5.1</string> <string>4.5.2</string>
<key>NSMicrophoneUsageDescription</key> <key>NSMicrophoneUsageDescription</key>
<string>Microphone access is required to capture audio.</string> <string>Microphone access is required to capture audio.</string>
<key>NSCameraUsageDescription</key> <key>NSCameraUsageDescription</key>

View File

@ -1,5 +1,5 @@
#define MyAppName "Godot Engine" #define MyAppName "Godot Engine"
#define MyAppVersion "4.5.1" #define MyAppVersion "4.5.2"
#define MyAppPublisher "Godot Engine contributors" #define MyAppPublisher "Godot Engine contributors"
#define MyAppURL "https://godotengine.org/" #define MyAppURL "https://godotengine.org/"
#define MyAppExeName "godot.exe" #define MyAppExeName "godot.exe"

View File

@ -7,7 +7,7 @@
<Authors>Godot Engine contributors</Authors> <Authors>Godot Engine contributors</Authors>
<PackageId>Godot.NET.Sdk</PackageId> <PackageId>Godot.NET.Sdk</PackageId>
<Version>4.5.1</Version> <Version>4.5.2</Version>
<PackageVersion>$(PackageVersion_Godot_NET_Sdk)</PackageVersion> <PackageVersion>$(PackageVersion_Godot_NET_Sdk)</PackageVersion>
<RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/editor/Godot.NET.Sdk</RepositoryUrl> <RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/editor/Godot.NET.Sdk</RepositoryUrl>
<PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl> <PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl>

View File

@ -10,7 +10,7 @@
<Authors>Godot Engine contributors</Authors> <Authors>Godot Engine contributors</Authors>
<PackageId>Godot.SourceGenerators</PackageId> <PackageId>Godot.SourceGenerators</PackageId>
<Version>4.5.1</Version> <Version>4.5.2</Version>
<PackageVersion>$(PackageVersion_Godot_SourceGenerators)</PackageVersion> <PackageVersion>$(PackageVersion_Godot_SourceGenerators)</PackageVersion>
<RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators</RepositoryUrl> <RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators</RepositoryUrl>
<PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl> <PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl>

View File

@ -19,7 +19,7 @@
<Authors>Godot Engine contributors</Authors> <Authors>Godot Engine contributors</Authors>
<PackageId>GodotSharp</PackageId> <PackageId>GodotSharp</PackageId>
<Version>4.5.1</Version> <Version>4.5.2</Version>
<PackageVersion>$(PackageVersion_GodotSharp)</PackageVersion> <PackageVersion>$(PackageVersion_GodotSharp)</PackageVersion>
<RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/glue/GodotSharp/GodotSharp</RepositoryUrl> <RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/glue/GodotSharp/GodotSharp</RepositoryUrl>
<PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl> <PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl>

View File

@ -15,7 +15,7 @@
<Authors>Godot Engine contributors</Authors> <Authors>Godot Engine contributors</Authors>
<PackageId>GodotSharpEditor</PackageId> <PackageId>GodotSharpEditor</PackageId>
<Version>4.5.1</Version> <Version>4.5.2</Version>
<PackageVersion>$(PackageVersion_GodotSharp)</PackageVersion> <PackageVersion>$(PackageVersion_GodotSharp)</PackageVersion>
<RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/glue/GodotSharp/GodotSharpEditor</RepositoryUrl> <RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/glue/GodotSharp/GodotSharpEditor</RepositoryUrl>
<PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl> <PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl>

View File

@ -15,7 +15,7 @@ ext.versions = [
// Also update 'platform/android/detect.py#get_ndk_version()' when this is updated. // Also update 'platform/android/detect.py#get_ndk_version()' when this is updated.
ndkVersion : '28.1.13356709', ndkVersion : '28.1.13356709',
splashscreenVersion: '1.0.1', splashscreenVersion: '1.0.1',
openxrVendorsVersion: '4.1.1-stable' openxrVendorsVersion: '4.2.0-stable',
] ]

View File

@ -192,6 +192,8 @@ dependencies {
implementation "androidx.constraintlayout:constraintlayout:2.2.1" implementation "androidx.constraintlayout:constraintlayout:2.2.1"
implementation "org.bouncycastle:bcprov-jdk15to18:1.78" implementation "org.bouncycastle:bcprov-jdk15to18:1.78"
// Android XR dependencies
androidImplementation "org.godotengine:godot-openxr-vendors-androidxr:$versions.openxrVendorsVersion"
// Meta dependencies // Meta dependencies
horizonosImplementation "org.godotengine:godot-openxr-vendors-meta:$versions.openxrVendorsVersion" horizonosImplementation "org.godotengine:godot-openxr-vendors-meta:$versions.openxrVendorsVersion"
// Pico dependencies // Pico dependencies

View File

@ -0,0 +1,42 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-feature
android:name="android.software.xr.api.openxr"
android:required="false" />
<!-- 6dof motion controllers -->
<uses-feature android:name="android.hardware.xr.input.controller" android:required="false" />
<!-- Eye tracking -->
<uses-feature android:name="android.hardware.xr.input.eye_tracking" android:required="false" />
<uses-permission android:name="android.permission.EYE_TRACKING_FINE" />
<!-- Hand tracking -->
<uses-feature android:name="android.hardware.xr.input.hand_tracking" android:required="false" />
<uses-permission android:name="android.permission.HAND_TRACKING" />
<application>
<uses-native-library android:name="libopenxr.google.so" android:required="false" />
<property
android:name="android.window.PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED"
android:value="XR_BOUNDARY_TYPE_NO_RECOMMENDATION" />
<activity
android:name=".GodotXRGame"
android:exported="false"
tools:node="merge">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="org.khronos.openxr.intent.category.IMMERSIVE_HMD" />
</intent-filter>
<property
android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE"
android:value="XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED" />
</activity>
</application>
</manifest>

View File

@ -33,6 +33,16 @@ package org.godotengine.editor
/** /**
* Primary window of the Godot Editor. * Primary window of the Godot Editor.
* *
* This is the implementation of the editor used when running on regular Android devices. * This is the implementation of the editor used when running on Android devices.
*/ */
open class GodotEditor : BaseGodotEditor() open class GodotEditor : BaseGodotEditor() {
override fun getXRRuntimePermissions(): MutableSet<String> {
val xrRuntimePermissions = super.getXRRuntimePermissions()
xrRuntimePermissions.add("android.permission.EYE_TRACKING_FINE")
xrRuntimePermissions.add("android.permission.HAND_TRACKING")
return xrRuntimePermissions
}
}

View File

@ -110,6 +110,7 @@
android:configChanges="layoutDirection|locale|orientation|keyboardHidden|screenSize|smallestScreenSize|density|keyboard|navigation|screenLayout|uiMode" android:configChanges="layoutDirection|locale|orientation|keyboardHidden|screenSize|smallestScreenSize|density|keyboard|navigation|screenLayout|uiMode"
android:process=":GodotXRGame" android:process=":GodotXRGame"
android:launchMode="singleTask" android:launchMode="singleTask"
android:taskAffinity=":xr"
android:icon="@mipmap/ic_play_window" android:icon="@mipmap/ic_play_window"
android:label="@string/godot_game_activity_name" android:label="@string/godot_game_activity_name"
android:exported="false" android:exported="false"

View File

@ -68,11 +68,7 @@ import org.godotengine.godot.error.Error
import org.godotengine.godot.utils.DialogUtils import org.godotengine.godot.utils.DialogUtils
import org.godotengine.godot.utils.PermissionsUtil import org.godotengine.godot.utils.PermissionsUtil
import org.godotengine.godot.utils.ProcessPhoenix import org.godotengine.godot.utils.ProcessPhoenix
import org.godotengine.godot.utils.isNativeXRDevice import org.godotengine.openxr.vendors.utils.*
import org.godotengine.godot.xr.HybridMode
import org.godotengine.godot.xr.getHybridAppLaunchMode
import org.godotengine.godot.xr.HYBRID_APP_PANEL_CATEGORY
import org.godotengine.godot.xr.HYBRID_APP_IMMERSIVE_CATEGORY
import kotlin.math.min import kotlin.math.min
/** /**
@ -712,12 +708,8 @@ abstract class BaseGodotEditor : GodotActivity(), GameMenuFragment.GameMenuListe
return isNativeXRDevice(applicationContext) return isNativeXRDevice(applicationContext)
} }
if (featureTag == "horizonos") { if (featureTag == BuildConfig.FLAVOR) {
return BuildConfig.FLAVOR == "horizonos" return true
}
if (featureTag == "picoos") {
return BuildConfig.FLAVOR == "picoos"
} }
return super.supportsFeature(featureTag) return super.supportsFeature(featureTag)

View File

@ -38,8 +38,7 @@ import org.godotengine.godot.GodotLib
import org.godotengine.godot.editor.utils.GameMenuUtils import org.godotengine.godot.editor.utils.GameMenuUtils
import org.godotengine.godot.utils.PermissionsUtil import org.godotengine.godot.utils.PermissionsUtil
import org.godotengine.godot.utils.ProcessPhoenix import org.godotengine.godot.utils.ProcessPhoenix
import org.godotengine.godot.xr.HYBRID_APP_FEATURE import org.godotengine.openxr.vendors.utils.*
import org.godotengine.godot.xr.isHybridAppEnabled
/** /**
* Base class for the Godot play windows. * Base class for the Godot play windows.

View File

@ -43,11 +43,8 @@ import org.godotengine.editor.embed.GameMenuFragment
import org.godotengine.godot.GodotLib import org.godotengine.godot.GodotLib
import org.godotengine.godot.editor.utils.GameMenuUtils import org.godotengine.godot.editor.utils.GameMenuUtils
import org.godotengine.godot.utils.ProcessPhoenix import org.godotengine.godot.utils.ProcessPhoenix
import org.godotengine.godot.utils.isHorizonOSDevice
import org.godotengine.godot.utils.isNativeXRDevice
import org.godotengine.godot.xr.HYBRID_APP_PANEL_FEATURE
import org.godotengine.godot.xr.XRMode import org.godotengine.godot.xr.XRMode
import org.godotengine.godot.xr.isHybridAppEnabled import org.godotengine.openxr.vendors.utils.*
/** /**
* Drives the 'run project' window of the Godot Editor. * Drives the 'run project' window of the Godot Editor.

View File

@ -151,6 +151,7 @@ Error MultiplayerPeerExtension::get_packet(const uint8_t **r_buffer, int &r_buff
} }
Error MultiplayerPeerExtension::put_packet(const uint8_t *p_buffer, int p_buffer_size) { Error MultiplayerPeerExtension::put_packet(const uint8_t *p_buffer, int p_buffer_size) {
ERR_FAIL_COND_V(p_buffer_size < 0, ERR_INVALID_PARAMETER);
Error err; Error err;
if (GDVIRTUAL_CALL(_put_packet, p_buffer, p_buffer_size, err)) { if (GDVIRTUAL_CALL(_put_packet, p_buffer, p_buffer_size, err)) {
return err; return err;

View File

@ -158,6 +158,7 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const {
const NodeData *nd = &nodes[0]; const NodeData *nd = &nodes[0];
Node **ret_nodes = (Node **)alloca(sizeof(Node *) * nc); Node **ret_nodes = (Node **)alloca(sizeof(Node *) * nc);
ret_nodes[0] = nullptr; // Sidesteps "maybe uninitialized" false-positives on GCC.
bool gen_node_path_cache = p_edit_state != GEN_EDIT_STATE_DISABLED && node_path_cache.is_empty(); bool gen_node_path_cache = p_edit_state != GEN_EDIT_STATE_DISABLED && node_path_cache.is_empty();

View File

@ -2,8 +2,8 @@ short_name = "godot"
name = "Godot Engine" name = "Godot Engine"
major = 4 major = 4
minor = 5 minor = 5
patch = 1 patch = 2
status = "stable" status = "rc"
module_config = "" module_config = ""
website = "https://godotengine.org" website = "https://godotengine.org"
docs = "4.5" docs = "4.5"