Merge pull request #46417 from akien-mga/3.2-cherrypicks

Cherry-picks for the 3.2 branch (future 3.2.4) - 25th batch
This commit is contained in:
Rémi Verschelde 2021-02-25 15:35:42 +01:00 committed by GitHub
commit c16e614d88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 203 additions and 68 deletions

View File

@ -992,6 +992,10 @@ void Geometry::make_atlas(const Vector<Size2i> &p_rects, Vector<Point2i> &r_resu
// 256x8192 atlas (won't work anywhere). // 256x8192 atlas (won't work anywhere).
ERR_FAIL_COND(p_rects.size() == 0); ERR_FAIL_COND(p_rects.size() == 0);
for (int i = 0; i < p_rects.size(); i++) {
ERR_FAIL_COND(p_rects[i].width <= 0);
ERR_FAIL_COND(p_rects[i].height <= 0);
}
Vector<_AtlasWorkRect> wrects; Vector<_AtlasWorkRect> wrects;
wrects.resize(p_rects.size()); wrects.resize(p_rects.size());

View File

@ -92,6 +92,7 @@ bool Thread::is_started() const {
void Thread::wait_to_finish() { void Thread::wait_to_finish() {
if (id != 0) { if (id != 0) {
ERR_FAIL_COND_MSG(id == get_caller_id(), "A Thread can't wait for itself to finish.");
thread.join(); thread.join();
std::thread empty_thread; std::thread empty_thread;
thread.swap(empty_thread); thread.swap(empty_thread);

View File

@ -34,13 +34,14 @@
#include "core/os/os.h" #include "core/os/os.h"
#include "core/project_settings.h" #include "core/project_settings.h"
// ISO 639-1 language codes, with the addition of glibc locales with their // ISO 639-1 language codes (and a couple of three-letter ISO 639-2 codes),
// regional identifiers. This list must match the language names (in English) // with the addition of glibc locales with their regional identifiers.
// of locale_names. // This list must match the language names (in English) of locale_names.
// //
// References: // References:
// - https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes // - https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
// - https://lh.2xlibre.net/locales/ // - https://lh.2xlibre.net/locales/
// - https://iso639-3.sil.org/
static const char *locale_list[] = { static const char *locale_list[] = {
"aa", // Afar "aa", // Afar
@ -95,6 +96,7 @@ static const char *locale_list[] = {
"bo", // Tibetan "bo", // Tibetan
"bo_CN", // Tibetan (China) "bo_CN", // Tibetan (China)
"bo_IN", // Tibetan (India) "bo_IN", // Tibetan (India)
"br", // Breton
"br_FR", // Breton (France) "br_FR", // Breton (France)
"brx_IN", // Bodo (India) "brx_IN", // Bodo (India)
"bs_BA", // Bosnian (Bosnia and Herzegovina) "bs_BA", // Bosnian (Bosnia and Herzegovina)
@ -196,6 +198,7 @@ static const char *locale_list[] = {
"gd_GB", // Scottish Gaelic (United Kingdom) "gd_GB", // Scottish Gaelic (United Kingdom)
"gez_ER", // Geez (Eritrea) "gez_ER", // Geez (Eritrea)
"gez_ET", // Geez (Ethiopia) "gez_ET", // Geez (Ethiopia)
"gl", // Galician
"gl_ES", // Galician (Spain) "gl_ES", // Galician (Spain)
"gu_IN", // Gujarati (India) "gu_IN", // Gujarati (India)
"gv_GB", // Manx (United Kingdom) "gv_GB", // Manx (United Kingdom)
@ -268,6 +271,7 @@ static const char *locale_list[] = {
"ml_IN", // Malayalam (India) "ml_IN", // Malayalam (India)
"mni_IN", // Manipuri (India) "mni_IN", // Manipuri (India)
"mn_MN", // Mongolian (Mongolia) "mn_MN", // Mongolian (Mongolia)
"mr", // Marathi
"mr_IN", // Marathi (India) "mr_IN", // Marathi (India)
"ms", // Malay "ms", // Malay
"ms_MY", // Malay (Malaysia) "ms_MY", // Malay (Malaysia)
@ -297,6 +301,7 @@ static const char *locale_list[] = {
"om", // Oromo "om", // Oromo
"om_ET", // Oromo (Ethiopia) "om_ET", // Oromo (Ethiopia)
"om_KE", // Oromo (Kenya) "om_KE", // Oromo (Kenya)
"or", // Oriya
"or_IN", // Oriya (India) "or_IN", // Oriya (India)
"os_RU", // Ossetian (Russia) "os_RU", // Ossetian (Russia)
"pa_IN", // Panjabi (India) "pa_IN", // Panjabi (India)
@ -381,6 +386,8 @@ static const char *locale_list[] = {
"tr_TR", // Turkish (Turkey) "tr_TR", // Turkish (Turkey)
"ts_ZA", // Tsonga (South Africa) "ts_ZA", // Tsonga (South Africa)
"tt_RU", // Tatar (Russia) "tt_RU", // Tatar (Russia)
"tzm", // Central Atlas Tamazight
"tzm_MA", // Central Atlas Tamazight (Marrocos)
"ug_CN", // Uighur (China) "ug_CN", // Uighur (China)
"uk", // Ukrainian "uk", // Ukrainian
"uk_UA", // Ukrainian (Ukraine) "uk_UA", // Ukrainian (Ukraine)
@ -463,6 +470,7 @@ static const char *locale_names[] = {
"Tibetan", "Tibetan",
"Tibetan (China)", "Tibetan (China)",
"Tibetan (India)", "Tibetan (India)",
"Breton",
"Breton (France)", "Breton (France)",
"Bodo (India)", "Bodo (India)",
"Bosnian (Bosnia and Herzegovina)", "Bosnian (Bosnia and Herzegovina)",
@ -564,6 +572,7 @@ static const char *locale_names[] = {
"Scottish Gaelic (United Kingdom)", "Scottish Gaelic (United Kingdom)",
"Geez (Eritrea)", "Geez (Eritrea)",
"Geez (Ethiopia)", "Geez (Ethiopia)",
"Galician",
"Galician (Spain)", "Galician (Spain)",
"Gujarati (India)", "Gujarati (India)",
"Manx (United Kingdom)", "Manx (United Kingdom)",
@ -636,6 +645,7 @@ static const char *locale_names[] = {
"Malayalam (India)", "Malayalam (India)",
"Manipuri (India)", "Manipuri (India)",
"Mongolian (Mongolia)", "Mongolian (Mongolia)",
"Marathi",
"Marathi (India)", "Marathi (India)",
"Malay", "Malay",
"Malay (Malaysia)", "Malay (Malaysia)",
@ -665,6 +675,7 @@ static const char *locale_names[] = {
"Oromo", "Oromo",
"Oromo (Ethiopia)", "Oromo (Ethiopia)",
"Oromo (Kenya)", "Oromo (Kenya)",
"Oriya",
"Oriya (India)", "Oriya (India)",
"Ossetian (Russia)", "Ossetian (Russia)",
"Panjabi (India)", "Panjabi (India)",
@ -749,6 +760,8 @@ static const char *locale_names[] = {
"Turkish (Turkey)", "Turkish (Turkey)",
"Tsonga (South Africa)", "Tsonga (South Africa)",
"Tatar (Russia)", "Tatar (Russia)",
"Central Atlas Tamazight",
"Central Atlas Tamazight (Marrocos)",
"Uighur (China)", "Uighur (China)",
"Ukrainian", "Ukrainian",
"Ukrainian (Ukraine)", "Ukrainian (Ukraine)",

View File

@ -48,6 +48,13 @@
The new item will be the [code]idx[/code]th child of parent, or it will be the last child if there are not enough siblings. The new item will be the [code]idx[/code]th child of parent, or it will be the last child if there are not enough siblings.
</description> </description>
</method> </method>
<method name="edit_selected">
<return type="bool">
</return>
<description>
Edits the selected tree item as if it was clicked. The item must be set editable with [method TreeItem.set_editable]. Returns [code]true[/code] if the item could be edited. Fails if no item is selected.
</description>
</method>
<method name="ensure_cursor_is_visible"> <method name="ensure_cursor_is_visible">
<return type="void"> <return type="void">
</return> </return>

View File

@ -97,12 +97,18 @@ bool InputDefault::is_joy_button_pressed(int p_device, int p_button) const {
} }
bool InputDefault::is_action_pressed(const StringName &p_action) const { bool InputDefault::is_action_pressed(const StringName &p_action) const {
#ifdef DEBUG_ENABLED
bool has_action = InputMap::get_singleton()->has_action(p_action);
ERR_FAIL_COND_V_MSG(!has_action, false, "Request for nonexistent InputMap action '" + String(p_action) + "'.");
#endif
return action_state.has(p_action) && action_state[p_action].pressed; return action_state.has(p_action) && action_state[p_action].pressed;
} }
bool InputDefault::is_action_just_pressed(const StringName &p_action) const { bool InputDefault::is_action_just_pressed(const StringName &p_action) const {
#ifdef DEBUG_ENABLED
bool has_action = InputMap::get_singleton()->has_action(p_action);
ERR_FAIL_COND_V_MSG(!has_action, false, "Request for nonexistent InputMap action '" + String(p_action) + "'.");
#endif
const Map<StringName, Action>::Element *E = action_state.find(p_action); const Map<StringName, Action>::Element *E = action_state.find(p_action);
if (!E) if (!E)
return false; return false;
@ -115,7 +121,10 @@ bool InputDefault::is_action_just_pressed(const StringName &p_action) const {
} }
bool InputDefault::is_action_just_released(const StringName &p_action) const { bool InputDefault::is_action_just_released(const StringName &p_action) const {
#ifdef DEBUG_ENABLED
bool has_action = InputMap::get_singleton()->has_action(p_action);
ERR_FAIL_COND_V_MSG(!has_action, false, "Request for nonexistent InputMap action '" + String(p_action) + "'.");
#endif
const Map<StringName, Action>::Element *E = action_state.find(p_action); const Map<StringName, Action>::Element *E = action_state.find(p_action);
if (!E) if (!E)
return false; return false;
@ -128,6 +137,10 @@ bool InputDefault::is_action_just_released(const StringName &p_action) const {
} }
float InputDefault::get_action_strength(const StringName &p_action) const { float InputDefault::get_action_strength(const StringName &p_action) const {
#ifdef DEBUG_ENABLED
bool has_action = InputMap::get_singleton()->has_action(p_action);
ERR_FAIL_COND_V_MSG(!has_action, false, "Request for nonexistent InputMap action '" + String(p_action) + "'.");
#endif
const Map<StringName, Action>::Element *E = action_state.find(p_action); const Map<StringName, Action>::Element *E = action_state.find(p_action);
if (!E) if (!E)
return 0.0f; return 0.0f;

View File

@ -0,0 +1,29 @@
<?xml version="1.0"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-godot-project">
<comment>Godot Engine project</comment>
<icon name="x-godot-project" />
<glob pattern="*.godot"/>
</mime-type>
<mime-type type="application/x-godot-resource">
<comment>Godot Engine resource</comment>
<icon name="x-godot-resource" />
<glob pattern="*.res"/>
<glob pattern="*.tres"/>
</mime-type>
<mime-type type="application/x-godot-scene">
<comment>Godot Engine scene</comment>
<icon name="x-godot-scene" />
<glob pattern="*.scn"/>
<glob pattern="*.tscn"/>
<glob pattern="*.escn"/>
</mime-type>
<mime-type type="application/x-gdscript">
<comment>GDScript script</comment>
<icon name="x-gdscript" />
<glob pattern="*.gd"/>
</mime-type>
</mime-info>

View File

@ -1,8 +0,0 @@
<?xml version="1.0"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-godot-project">
<comment>Godot Engine project</comment>
<icon name="godot" />
<glob pattern="*.godot" weight="100" />
</mime-type>
</mime-info>

View File

@ -2916,6 +2916,7 @@ public:
cmdline.push_back("-Pplugins_maven_repos=" + custom_maven_repos); // argument to specify the list of custom maven repos for the plugins dependencies. cmdline.push_back("-Pplugins_maven_repos=" + custom_maven_repos); // argument to specify the list of custom maven repos for the plugins dependencies.
cmdline.push_back("-Pperform_zipalign=" + zipalign_flag); // argument to specify whether the build should be zipaligned. cmdline.push_back("-Pperform_zipalign=" + zipalign_flag); // argument to specify whether the build should be zipaligned.
cmdline.push_back("-Pperform_signing=" + sign_flag); // argument to specify whether the build should be signed. cmdline.push_back("-Pperform_signing=" + sign_flag); // argument to specify whether the build should be signed.
cmdline.push_back("-Pgodot_editor_version=" + String(VERSION_FULL_CONFIG));
// NOTE: The release keystore is not included in the verbose logging // NOTE: The release keystore is not included in the verbose logging
// to avoid accidentally leaking sensitive information when sharing verbose logs for troubleshooting. // to avoid accidentally leaking sensitive information when sharing verbose logs for troubleshooting.

View File

@ -29,6 +29,11 @@
<!-- WARNING: This should stay on a single line until the parsing code is improved. See GH-32414. --> <!-- WARNING: This should stay on a single line until the parsing code is improved. See GH-32414. -->
<application android:label="@string/godot_project_name_string" android:allowBackup="false" tools:ignore="GoogleAppIndexingWarning" android:icon="@mipmap/icon" > <application android:label="@string/godot_project_name_string" android:allowBackup="false" tools:ignore="GoogleAppIndexingWarning" android:icon="@mipmap/icon" >
<!-- Records the version of the Godot editor used for building -->
<meta-data
android:name="org.godotengine.editor.version"
android:value="${godotEditorVersion}" />
<!-- The following metadata values are replaced when Godot exports, modifying them here has no effect. --> <!-- The following metadata values are replaced when Godot exports, modifying them here has no effect. -->
<!-- Do these changes in the export preset. Adding new ones is fine. --> <!-- Do these changes in the export preset. Adding new ones is fine. -->

View File

@ -97,6 +97,8 @@ android {
abiFilters export_abi_list abiFilters export_abi_list
} }
manifestPlaceholders = [godotEditorVersion: getGodotEditorVersion()]
// Feel free to modify the application id to your own. // Feel free to modify the application id to your own.
applicationId getExportPackageName() applicationId getExportPackageName()
versionCode getExportVersionCode() versionCode getExportVersionCode()

View File

@ -50,6 +50,55 @@ ext.getExportVersionName = { ->
return versionName return versionName
} }
ext.getGodotEditorVersion = { ->
String editorVersion = project.hasProperty("godot_editor_version") ? project.property("godot_editor_version") : ""
if (editorVersion == null || editorVersion.isEmpty()) {
// Try the library version first
editorVersion = getGodotLibraryVersion()
if (editorVersion.isEmpty()) {
// Fallback value.
editorVersion = "custom_build"
}
}
return editorVersion
}
ext.getGodotLibraryVersion = { ->
// Attempt to read the version from the `version.py` file.
String libraryVersion = ""
File versionFile = new File("../../../version.py")
if (versionFile.isFile()) {
List<String> requiredKeys = ["major", "minor", "patch", "status", "module_config"]
def map = [:]
List<String> lines = versionFile.readLines()
for (String line in lines) {
String[] keyValue = line.split("=")
String key = keyValue[0].trim()
String value = keyValue[1].trim().replaceAll("\"", "")
if (requiredKeys.contains(key)) {
if (!value.isEmpty()) {
map[key] = value
}
requiredKeys.remove(key)
}
}
if (requiredKeys.empty) {
libraryVersion = map.values().join(".")
}
}
if (libraryVersion.isEmpty()) {
// Fallback value in case we're unable to read the file.
libraryVersion = "custom_build"
}
return libraryVersion
}
final String PLUGIN_VALUE_SEPARATOR_REGEX = "\\|" final String PLUGIN_VALUE_SEPARATOR_REGEX = "\\|"
// get the list of ABIs the project should be exported to // get the list of ABIs the project should be exported to

View File

@ -165,12 +165,6 @@ task cleanGodotTemplates(type: Delete) {
// Delete the library generated AAR files // Delete the library generated AAR files
delete("lib/build/outputs/aar") delete("lib/build/outputs/aar")
// Delete the godotpayment libs directory contents
delete("plugins/godotpayment/libs")
// Delete the generated godotpayment aar
delete("plugins/godotpayment/build/outputs/aar")
// Delete the app libs directory contents // Delete the app libs directory contents
delete("app/libs") delete("app/libs")

View File

@ -7,6 +7,11 @@
<!-- TODO: Remove the 'requestLegacyExternalStorage' attribute when https://github.com/godotengine/godot/issues/38913 is resolved --> <!-- TODO: Remove the 'requestLegacyExternalStorage' attribute when https://github.com/godotengine/godot/issues/38913 is resolved -->
<application android:requestLegacyExternalStorage="true"> <application android:requestLegacyExternalStorage="true">
<!-- Records the version of the Godot library -->
<meta-data
android:name="org.godotengine.library.version"
android:value="${godotLibraryVersion}" />
<service android:name=".GodotDownloaderService" /> <service android:name=".GodotDownloaderService" />
</application> </application>

View File

@ -18,6 +18,8 @@ android {
defaultConfig { defaultConfig {
minSdkVersion versions.minSdk minSdkVersion versions.minSdk
targetSdkVersion versions.targetSdk targetSdkVersion versions.targetSdk
manifestPlaceholders = [godotLibraryVersion: getGodotLibraryVersion()]
} }
compileOptions { compileOptions {

View File

@ -575,7 +575,9 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
} }
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle) { public void onCreate(Bundle icicle) {
super.onCreate(icicle);
final Activity activity = getActivity(); final Activity activity = getActivity();
Window window = activity.getWindow(); Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
@ -687,24 +689,11 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) { if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) {
// This is where you do set up to display the download // This is where you do set up to display the download
// progress (next step) // progress (next step in onCreateView)
mDownloaderClientStub = DownloaderClientMarshaller.CreateStub(this, mDownloaderClientStub = DownloaderClientMarshaller.CreateStub(this,
GodotDownloaderService.class); GodotDownloaderService.class);
View downloadingExpansionView = return;
inflater.inflate(R.layout.downloading_expansion, container, false);
mPB = (ProgressBar)downloadingExpansionView.findViewById(R.id.progressBar);
mStatusText = (TextView)downloadingExpansionView.findViewById(R.id.statusText);
mProgressFraction = (TextView)downloadingExpansionView.findViewById(R.id.progressAsFraction);
mProgressPercent = (TextView)downloadingExpansionView.findViewById(R.id.progressAsPercentage);
mAverageSpeed = (TextView)downloadingExpansionView.findViewById(R.id.progressAverageSpeed);
mTimeRemaining = (TextView)downloadingExpansionView.findViewById(R.id.progressTimeRemaining);
mDashboard = downloadingExpansionView.findViewById(R.id.downloaderDashboard);
mCellMessage = downloadingExpansionView.findViewById(R.id.approveCellular);
mPauseButton = (Button)downloadingExpansionView.findViewById(R.id.pauseButton);
mWiFiSettingsButton = (Button)downloadingExpansionView.findViewById(R.id.wifiSettingsButton);
return downloadingExpansionView;
} }
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
@ -715,6 +704,27 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
mCurrentIntent = activity.getIntent(); mCurrentIntent = activity.getIntent();
initializeGodot(); initializeGodot();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle) {
if (mDownloaderClientStub != null) {
View downloadingExpansionView =
inflater.inflate(R.layout.downloading_expansion, container, false);
mPB = (ProgressBar)downloadingExpansionView.findViewById(R.id.progressBar);
mStatusText = (TextView)downloadingExpansionView.findViewById(R.id.statusText);
mProgressFraction = (TextView)downloadingExpansionView.findViewById(R.id.progressAsFraction);
mProgressPercent = (TextView)downloadingExpansionView.findViewById(R.id.progressAsPercentage);
mAverageSpeed = (TextView)downloadingExpansionView.findViewById(R.id.progressAverageSpeed);
mTimeRemaining = (TextView)downloadingExpansionView.findViewById(R.id.progressTimeRemaining);
mDashboard = downloadingExpansionView.findViewById(R.id.downloaderDashboard);
mCellMessage = downloadingExpansionView.findViewById(R.id.approveCellular);
mPauseButton = (Button)downloadingExpansionView.findViewById(R.id.pauseButton);
mWiFiSettingsButton = (Button)downloadingExpansionView.findViewById(R.id.wifiSettingsButton);
return downloadingExpansionView;
}
return containerLayout; return containerLayout;
} }

View File

@ -10,6 +10,16 @@
</Expand> </Expand>
</Type> </Type>
<Type Name="LocalVector&lt;*&gt;">
<Expand>
<Item Name="[size]">count</Item>
<ArrayItems>
<Size>count</Size>
<ValuePointer>data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="PoolVector&lt;*&gt;"> <Type Name="PoolVector&lt;*&gt;">
<Expand> <Expand>
<Item Name="[size]">alloc ? (alloc-&gt;size / sizeof($T1)) : 0</Item> <Item Name="[size]">alloc ? (alloc-&gt;size / sizeof($T1)) : 0</Item>

View File

@ -1342,6 +1342,9 @@ bool Tween::interpolate_property(Object *p_object, NodePath p_property, Variant
return true; return true;
} }
// Check that the target object is valid
ERR_FAIL_COND_V_MSG(p_object == nullptr, false, vformat("The Tween \"%s\"'s target node is `null`. Is the node reference correct?", get_name()));
// Get the property from the node path // Get the property from the node path
p_property = p_property.get_as_property_path(); p_property = p_property.get_as_property_path();
@ -1365,6 +1368,9 @@ bool Tween::interpolate_method(Object *p_object, StringName p_method, Variant p_
return true; return true;
} }
// Check that the target object is valid
ERR_FAIL_COND_V_MSG(p_object == nullptr, false, vformat("The Tween \"%s\"'s target node is `null`. Is the node reference correct?", get_name()));
// Convert any integers into REALs as they are better for interpolation // Convert any integers into REALs as they are better for interpolation
if (p_initial_val.get_type() == Variant::INT) p_initial_val = p_initial_val.operator real_t(); if (p_initial_val.get_type() == Variant::INT) p_initial_val = p_initial_val.operator real_t();
if (p_final_val.get_type() == Variant::INT) p_final_val = p_final_val.operator real_t(); if (p_final_val.get_type() == Variant::INT) p_final_val = p_final_val.operator real_t();

View File

@ -433,10 +433,6 @@ void Control::_resize(const Size2 &p_size) {
_size_changed(); _size_changed();
} }
void Control::_clear_size_warning() {
data.size_warning = false;
}
//moved theme configuration here, so controls can set up even if still not inside active scene //moved theme configuration here, so controls can set up even if still not inside active scene
void Control::add_child_notify(Node *p_child) { void Control::add_child_notify(Node *p_child) {
@ -488,9 +484,7 @@ void Control::_notification(int p_notification) {
case NOTIFICATION_EXIT_TREE: { case NOTIFICATION_EXIT_TREE: {
get_viewport()->_gui_remove_control(this); get_viewport()->_gui_remove_control(this);
} break;
case NOTIFICATION_READY: {
connect("ready", this, "_clear_size_warning", varray(), CONNECT_DEFERRED | CONNECT_ONESHOT);
} break; } break;
case NOTIFICATION_ENTER_CANVAS: { case NOTIFICATION_ENTER_CANVAS: {
@ -1835,11 +1829,6 @@ void Control::set_position(const Size2 &p_point, bool p_keep_margins) {
} }
void Control::_set_size(const Size2 &p_size) { void Control::_set_size(const Size2 &p_size) {
#ifdef DEBUG_ENABLED
if (data.size_warning) {
WARN_PRINT("Adjusting the size of Control nodes before they are fully initialized is unreliable. Consider deferring it with set_deferred().");
}
#endif
set_size(p_size); set_size(p_size);
} }
@ -2964,8 +2953,6 @@ void Control::_bind_methods() {
ClassDB::bind_method(D_METHOD("_override_changed"), &Control::_override_changed); ClassDB::bind_method(D_METHOD("_override_changed"), &Control::_override_changed);
ClassDB::bind_method(D_METHOD("_clear_size_warning"), &Control::_clear_size_warning);
BIND_VMETHOD(MethodInfo("_gui_input", PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent"))); BIND_VMETHOD(MethodInfo("_gui_input", PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent")));
BIND_VMETHOD(MethodInfo(Variant::VECTOR2, "_get_minimum_size")); BIND_VMETHOD(MethodInfo(Variant::VECTOR2, "_get_minimum_size"));

View File

@ -160,7 +160,6 @@ private:
float rotation; float rotation;
Vector2 scale; Vector2 scale;
Vector2 pivot_offset; Vector2 pivot_offset;
bool size_warning = true;
bool pending_resize; bool pending_resize;
@ -225,7 +224,6 @@ private:
void _change_notify_margins(); void _change_notify_margins();
void _update_minimum_size(); void _update_minimum_size();
void _clear_size_warning();
void _update_scroll(); void _update_scroll();
void _resize(const Size2 &p_size); void _resize(const Size2 &p_size);

View File

@ -4013,6 +4013,7 @@ void Tree::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_edited"), &Tree::get_edited); ClassDB::bind_method(D_METHOD("get_edited"), &Tree::get_edited);
ClassDB::bind_method(D_METHOD("get_edited_column"), &Tree::get_edited_column); ClassDB::bind_method(D_METHOD("get_edited_column"), &Tree::get_edited_column);
ClassDB::bind_method(D_METHOD("edit_selected"), &Tree::edit_selected);
ClassDB::bind_method(D_METHOD("get_custom_popup_rect"), &Tree::get_custom_popup_rect); ClassDB::bind_method(D_METHOD("get_custom_popup_rect"), &Tree::get_custom_popup_rect);
ClassDB::bind_method(D_METHOD("get_item_area_rect", "item", "column"), &Tree::_get_item_rect, DEFVAL(-1)); ClassDB::bind_method(D_METHOD("get_item_area_rect", "item", "column"), &Tree::_get_item_rect, DEFVAL(-1));
ClassDB::bind_method(D_METHOD("get_item_at_position", "position"), &Tree::get_item_at_position); ClassDB::bind_method(D_METHOD("get_item_at_position", "position"), &Tree::get_item_at_position);

View File

@ -52,6 +52,28 @@ Error MeshDataTool::create_from_surface(const Ref<ArrayMesh> &p_mesh, int p_surf
int vcount = varray.size(); int vcount = varray.size();
ERR_FAIL_COND_V(vcount == 0, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V(vcount == 0, ERR_INVALID_PARAMETER);
PoolVector<int> indices;
if (arrays[Mesh::ARRAY_INDEX].get_type() != Variant::NIL) {
indices = arrays[Mesh::ARRAY_INDEX];
} else {
//make code simpler
indices.resize(vcount);
PoolVector<int>::Write iw = indices.write();
for (int i = 0; i < vcount; i++)
iw[i] = i;
}
int icount = indices.size();
PoolVector<int>::Read r = indices.read();
ERR_FAIL_COND_V(icount == 0, ERR_INVALID_PARAMETER);
ERR_FAIL_COND_V(icount % 3, ERR_INVALID_PARAMETER);
for (int i = 0; i < icount; i++) {
ERR_FAIL_INDEX_V(r[i], vcount, ERR_INVALID_PARAMETER);
}
clear(); clear();
format = p_mesh->surface_get_format(p_surface); format = p_mesh->surface_get_format(p_surface);
material = p_mesh->surface_get_material(p_surface); material = p_mesh->surface_get_material(p_surface);
@ -121,22 +143,6 @@ Error MeshDataTool::create_from_surface(const Ref<ArrayMesh> &p_mesh, int p_surf
vertices.write[i] = v; vertices.write[i] = v;
} }
PoolVector<int> indices;
if (arrays[Mesh::ARRAY_INDEX].get_type() != Variant::NIL) {
indices = arrays[Mesh::ARRAY_INDEX];
} else {
//make code simpler
indices.resize(vcount);
PoolVector<int>::Write iw = indices.write();
for (int i = 0; i < vcount; i++)
iw[i] = i;
}
int icount = indices.size();
PoolVector<int>::Read r = indices.read();
Map<Point2i, int> edge_indices; Map<Point2i, int> edge_indices;
for (int i = 0; i < icount; i += 3) { for (int i = 0; i < icount; i += 3) {