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

Cherry-picks for the 3.2 branch (future 3.2.3) - 2nd batch
This commit is contained in:
Rémi Verschelde 2020-07-13 17:31:55 +02:00 committed by GitHub
commit d0372edd6b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 195 additions and 15 deletions

126
.github/workflows/main.yml vendored Normal file
View File

@ -0,0 +1,126 @@
# Engine build CI
name: Godot CI
on:
# will build EVERY pull request
pull_request:
# will only build explicit branches
push:
branches: [ master, 3.2, 3.1, 3.0 ]
# Global Cache Settings
# SCONS_CACHE for windows must be set in the build environment
env:
SCONS_CACHE_MSVC_CONFIG: true
SCONS_CACHE_LIMIT: 8192
jobs:
windows-editor:
# Windows 10 with latest image
runs-on: "windows-latest"
# Windows Editor - checkout with the plugin
name: Windows Editor (target=release_debug, tools=yes)
steps:
- uses: actions/checkout@v2
# Upload cache on completion and check it out now
# Editing this is pretty dangerous for windows since it can break and needs properly tested with a fresh cache.
# Linux with this will work reliably, so not as bad to edit for Linux.
- name: Load .scons_cache directory
id: windows-editor-cache
uses: RevoluPowered/cache@v2.1
with:
path: /.scons_cache/
key: ${{runner.os}}-editor-${{github.sha}}
restore-keys: |
${{runner.os}}-editor-${{github.sha}}
${{runner.os}}-editor
${{runner.os}}
# Use python 3.x release (works cross platform; best to keep self contained in it's own step)
- name: Set up Python 3.x
uses: actions/setup-python@v2
with:
# Semantic version range syntax or exact version of a Python version
python-version: '3.x'
# Optional - x64 or x86 architecture, defaults to x64
architecture: 'x64'
# Setup scons, print python version and scons version info, so if anything is broken it won't run the build.
- name: Configuring Python packages
run: |
python -c "import sys; print(sys.version)"
python -m pip install scons pywin32
python --version
scons --version
# We should always be explicit with our flags usage here since it's gonna be sure to always set those flags
- name: Compilation
env:
SCONS_CACHE: /.scons_cache/
run: |
scons -j2 verbose=yes warnings=all werror=yes platform=windows tools=yes target=release_debug
# Build Product Upload (tested and working)
# sorry this is disabled until github can give us some more space as we would hit our limit very quickly
# tested this code and it works fine so just enable it to get them back
# - name: publishing godot windows-editor
# uses: actions/upload-artifact@v1
# with:
# name: windows-editor (x64)
# path: bin/godot.windows.opt.tools.64.exe
windows-template:
runs-on: "windows-latest"
name: Windows Template (target=release, tools=no)
steps:
- uses: actions/checkout@v2
# Upload cache on completion and check it out now
# Editing this is pretty dangerous for windows since it can break and needs properly tested with a fresh cache.
# Linux with this will work reliably, so not as bad to edit for Linux.
- name: Load .scons_cache directory
id: windows-template-cache
uses: RevoluPowered/cache@v2.1
with:
path: /.scons_cache/
key: ${{runner.os}}-template-${{github.sha}}
restore-keys: |
${{runner.os}}-template-${{github.sha}}
${{runner.os}}-template
${{runner.os}}
# Use python 3.x release (works cross platform)
- name: Set up Python 3.x
uses: actions/setup-python@v2
with:
# Semantic version range syntax or exact version of a Python version
python-version: '3.x'
# Optional - x64 or x86 architecture, defaults to x64
architecture: 'x64'
# You can test your matrix by printing the current Python version
- name: Configuring Python packages
run: |
python -c "import sys; print(sys.version)"
python -m pip install scons pywin32
python --version
scons --version
- name: Compilation
env:
SCONS_CACHE: /.scons_cache/
run: |
scons -j2 verbose=yes warnings=all werror=yes platform=windows target=release tools=no
# Build Product Upload (tested and working)
# sorry this is disabled until github can give us some more space as we would hit our limit very quickly
# tested this code and it works fine so just enable it to get them back
# - name: publishing godot windows-template
# uses: actions/upload-artifact@v1
# with:
# name: windows-template (x64)
# path: bin/godot.windows.opt.64.exe

View File

@ -402,6 +402,7 @@ if selected_platform in platform_list:
all_plus_warnings = ["-Wwrite-strings"] all_plus_warnings = ["-Wwrite-strings"]
if methods.using_gcc(env): if methods.using_gcc(env):
env.Append(CCFLAGS=["-Wno-misleading-indentation"])
if version[0] >= 7: if version[0] >= 7:
shadow_local_warning = ["-Wshadow-local"] shadow_local_warning = ["-Wshadow-local"]

View File

@ -482,6 +482,14 @@ Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bo
_load_settings_text(custom_settings); _load_settings_text(custom_settings);
} }
} }
// Using GLOBAL_GET on every block for compressing can be slow, so assigning here.
Compression::zstd_long_distance_matching = GLOBAL_GET("compression/formats/zstd/long_distance_matching");
Compression::zstd_level = GLOBAL_GET("compression/formats/zstd/compression_level");
Compression::zstd_window_log_size = GLOBAL_GET("compression/formats/zstd/window_log_size");
Compression::zlib_level = GLOBAL_GET("compression/formats/zlib/compression_level");
Compression::gzip_level = GLOBAL_GET("compression/formats/gzip/compression_level");
return err; return err;
} }
@ -997,6 +1005,8 @@ void ProjectSettings::_bind_methods() {
} }
ProjectSettings::ProjectSettings() { ProjectSettings::ProjectSettings() {
// Initialization of engine variables should be done in the setup() method,
// so that the values can be overridden from project.godot or project.binary.
singleton = this; singleton = this;
last_order = NO_BUILTIN_ORDER_BASE; last_order = NO_BUILTIN_ORDER_BASE;
@ -1200,18 +1210,17 @@ ProjectSettings::ProjectSettings() {
GLOBAL_DEF("debug/settings/profiler/max_functions", 16384); GLOBAL_DEF("debug/settings/profiler/max_functions", 16384);
custom_prop_info["debug/settings/profiler/max_functions"] = PropertyInfo(Variant::INT, "debug/settings/profiler/max_functions", PROPERTY_HINT_RANGE, "128,65535,1"); custom_prop_info["debug/settings/profiler/max_functions"] = PropertyInfo(Variant::INT, "debug/settings/profiler/max_functions", PROPERTY_HINT_RANGE, "128,65535,1");
//assigning here, because using GLOBAL_GET on every block for compressing can be slow GLOBAL_DEF("compression/formats/zstd/long_distance_matching", Compression::zstd_long_distance_matching);
Compression::zstd_long_distance_matching = GLOBAL_DEF("compression/formats/zstd/long_distance_matching", false);
custom_prop_info["compression/formats/zstd/long_distance_matching"] = PropertyInfo(Variant::BOOL, "compression/formats/zstd/long_distance_matching"); custom_prop_info["compression/formats/zstd/long_distance_matching"] = PropertyInfo(Variant::BOOL, "compression/formats/zstd/long_distance_matching");
Compression::zstd_level = GLOBAL_DEF("compression/formats/zstd/compression_level", 3); GLOBAL_DEF("compression/formats/zstd/compression_level", Compression::zstd_level);
custom_prop_info["compression/formats/zstd/compression_level"] = PropertyInfo(Variant::INT, "compression/formats/zstd/compression_level", PROPERTY_HINT_RANGE, "1,22,1"); custom_prop_info["compression/formats/zstd/compression_level"] = PropertyInfo(Variant::INT, "compression/formats/zstd/compression_level", PROPERTY_HINT_RANGE, "1,22,1");
Compression::zstd_window_log_size = GLOBAL_DEF("compression/formats/zstd/window_log_size", 27); GLOBAL_DEF("compression/formats/zstd/window_log_size", Compression::zstd_window_log_size);
custom_prop_info["compression/formats/zstd/window_log_size"] = PropertyInfo(Variant::INT, "compression/formats/zstd/window_log_size", PROPERTY_HINT_RANGE, "10,30,1"); custom_prop_info["compression/formats/zstd/window_log_size"] = PropertyInfo(Variant::INT, "compression/formats/zstd/window_log_size", PROPERTY_HINT_RANGE, "10,30,1");
Compression::zlib_level = GLOBAL_DEF("compression/formats/zlib/compression_level", Z_DEFAULT_COMPRESSION); GLOBAL_DEF("compression/formats/zlib/compression_level", Compression::zlib_level);
custom_prop_info["compression/formats/zlib/compression_level"] = PropertyInfo(Variant::INT, "compression/formats/zlib/compression_level", PROPERTY_HINT_RANGE, "-1,9,1"); custom_prop_info["compression/formats/zlib/compression_level"] = PropertyInfo(Variant::INT, "compression/formats/zlib/compression_level", PROPERTY_HINT_RANGE, "-1,9,1");
Compression::gzip_level = GLOBAL_DEF("compression/formats/gzip/compression_level", Z_DEFAULT_COMPRESSION); GLOBAL_DEF("compression/formats/gzip/compression_level", Compression::gzip_level);
custom_prop_info["compression/formats/gzip/compression_level"] = PropertyInfo(Variant::INT, "compression/formats/gzip/compression_level", PROPERTY_HINT_RANGE, "-1,9,1"); custom_prop_info["compression/formats/gzip/compression_level"] = PropertyInfo(Variant::INT, "compression/formats/gzip/compression_level", PROPERTY_HINT_RANGE, "-1,9,1");
// Would ideally be defined in an Android-specific file, but then it doesn't appear in the docs // Would ideally be defined in an Android-specific file, but then it doesn't appear in the docs

View File

@ -55,6 +55,27 @@ void EditorAssetInstaller::_update_subitems(TreeItem *p_item, bool p_check, bool
} }
} }
void EditorAssetInstaller::_uncheck_parent(TreeItem *p_item) {
if (!p_item) {
return;
}
bool any_checked = false;
TreeItem *item = p_item->get_children();
while (item) {
if (item->is_checked(0)) {
any_checked = true;
break;
}
item = item->get_next();
}
if (!any_checked) {
p_item->set_checked(0, false);
_uncheck_parent(p_item->get_parent());
}
}
void EditorAssetInstaller::_item_edited() { void EditorAssetInstaller::_item_edited() {
if (updating) if (updating)
@ -67,7 +88,7 @@ void EditorAssetInstaller::_item_edited() {
String path = item->get_metadata(0); String path = item->get_metadata(0);
updating = true; updating = true;
if (path == String()) { //a dir if (path == String() || item == tree->get_root()) { //a dir or root
_update_subitems(item, item->is_checked(0), true); _update_subitems(item, item->is_checked(0), true);
} }
@ -76,6 +97,8 @@ void EditorAssetInstaller::_item_edited() {
item->set_checked(0, true); item->set_checked(0, true);
item = item->get_parent(); item = item->get_parent();
} }
} else {
_uncheck_parent(item->get_parent());
} }
updating = false; updating = false;
} }

View File

@ -43,6 +43,7 @@ class EditorAssetInstaller : public ConfirmationDialog {
Map<String, TreeItem *> status_map; Map<String, TreeItem *> status_map;
bool updating; bool updating;
void _update_subitems(TreeItem *p_item, bool p_check, bool p_first = false); void _update_subitems(TreeItem *p_item, bool p_check, bool p_first = false);
void _uncheck_parent(TreeItem *p_item);
void _item_edited(); void _item_edited();
virtual void ok_pressed(); virtual void ok_pressed();

View File

@ -201,14 +201,15 @@ void unregister_module_types() {
def convert_custom_modules_path(path): def convert_custom_modules_path(path):
if not path: if not path:
return path return path
path = os.path.realpath(os.path.expanduser(os.path.expandvars(path)))
err_msg = "Build option 'custom_modules' must %s" err_msg = "Build option 'custom_modules' must %s"
if not os.path.isdir(path): if not os.path.isdir(path):
raise ValueError(err_msg % "point to an existing directory.") raise ValueError(err_msg % "point to an existing directory.")
if os.path.realpath(path) == os.path.realpath("modules"): if path == os.path.realpath("modules"):
raise ValueError(err_msg % "be a directory other than built-in `modules` directory.") raise ValueError(err_msg % "be a directory other than built-in `modules` directory.")
if is_module(path): if is_module(path):
raise ValueError(err_msg % "point to a directory with modules, not a single module.") raise ValueError(err_msg % "point to a directory with modules, not a single module.")
return os.path.realpath(os.path.expanduser(path)) return path
def disable_module(self): def disable_module(self):

View File

@ -128,7 +128,7 @@
Enforce ordered packets when using [constant NetworkedMultiplayerPeer.TRANSFER_MODE_UNRELIABLE] (thus behaving similarly to [constant NetworkedMultiplayerPeer.TRANSFER_MODE_UNRELIABLE_ORDERED]). This is the only way to use ordering with the RPC system. Enforce ordered packets when using [constant NetworkedMultiplayerPeer.TRANSFER_MODE_UNRELIABLE] (thus behaving similarly to [constant NetworkedMultiplayerPeer.TRANSFER_MODE_UNRELIABLE_ORDERED]). This is the only way to use ordering with the RPC system.
</member> </member>
<member name="channel_count" type="int" setter="set_channel_count" getter="get_channel_count" default="3"> <member name="channel_count" type="int" setter="set_channel_count" getter="get_channel_count" default="3">
The number of channels to be used by ENet. Channels are used to separate different kinds of data. In reliable or ordered mode, for example, the packet delivery order is ensured on a per channel basis. The number of channels to be used by ENet. Channels are used to separate different kinds of data. In reliable or ordered mode, for example, the packet delivery order is ensured on a per-channel basis. This is done to combat latency and reduces ordering restrictions on packets. The delivery status of a packet in one channel won't stall the delivery of other packets in another channel.
</member> </member>
<member name="compression_mode" type="int" setter="set_compression_mode" getter="get_compression_mode" enum="NetworkedMultiplayerENet.CompressionMode" default="0"> <member name="compression_mode" type="int" setter="set_compression_mode" getter="get_compression_mode" enum="NetworkedMultiplayerENet.CompressionMode" default="0">
The compression method used for network packets. These have different tradeoffs of compression speed versus bandwidth, you may need to test which one works best for your use case if you use compression at all. The compression method used for network packets. These have different tradeoffs of compression speed versus bandwidth, you may need to test which one works best for your use case if you use compression at all.
@ -141,7 +141,7 @@
Enable or disable the server feature that notifies clients of other peers' connection/disconnection, and relays messages between them. When this option is [code]false[/code], clients won't be automatically notified of other peers and won't be able to send them packets through the server. Enable or disable the server feature that notifies clients of other peers' connection/disconnection, and relays messages between them. When this option is [code]false[/code], clients won't be automatically notified of other peers and won't be able to send them packets through the server.
</member> </member>
<member name="transfer_channel" type="int" setter="set_transfer_channel" getter="get_transfer_channel" default="-1"> <member name="transfer_channel" type="int" setter="set_transfer_channel" getter="get_transfer_channel" default="-1">
Set the default channel to be used to transfer data. By default, this value is [code]-1[/code] which means that ENet will only use 2 channels, one for reliable and one for unreliable packets. Channel [code]0[/code] is reserved, and cannot be used. Setting this member to any value between [code]0[/code] and [member channel_count] (excluded) will force ENet to use that channel for sending data. Set the default channel to be used to transfer data. By default, this value is [code]-1[/code] which means that ENet will only use 2 channels: one for reliable packets, and one for unreliable packets. The channel [code]0[/code] is reserved and cannot be used. Setting this member to any value between [code]0[/code] and [member channel_count] (excluded) will force ENet to use that channel for sending data. See [member channel_count] for more information about ENet channels.
</member> </member>
<member name="transfer_mode" type="int" setter="set_transfer_mode" getter="get_transfer_mode" override="true" enum="NetworkedMultiplayerPeer.TransferMode" default="2" /> <member name="transfer_mode" type="int" setter="set_transfer_mode" getter="get_transfer_mode" override="true" enum="NetworkedMultiplayerPeer.TransferMode" default="2" />
<member name="use_dtls" type="bool" setter="set_dtls_enabled" getter="is_dtls_enabled" default="false"> <member name="use_dtls" type="bool" setter="set_dtls_enabled" getter="is_dtls_enabled" default="false">

View File

@ -849,10 +849,22 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) {
r.size *= zoom; r.size *= zoom;
bool in_box = r.intersects(box_selecting_rect); bool in_box = r.intersects(box_selecting_rect);
if (in_box) if (in_box) {
if (!gn->is_selected() && box_selection_mode_additive) {
emit_signal("node_selected", gn);
} else if (gn->is_selected() && !box_selection_mode_additive) {
emit_signal("node_unselected", gn);
}
gn->set_selected(box_selection_mode_additive); gn->set_selected(box_selection_mode_additive);
else } else {
gn->set_selected(previus_selected.find(gn) != NULL); bool select = (previus_selected.find(gn) != NULL);
if (gn->is_selected() && !select) {
emit_signal("node_unselected", gn);
} else if (!gn->is_selected() && select) {
emit_signal("node_selected", gn);
}
gn->set_selected(select);
}
} }
top_layer->update(); top_layer->update();
@ -870,7 +882,13 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) {
if (!gn) if (!gn)
continue; continue;
gn->set_selected(previus_selected.find(gn) != NULL); bool select = (previus_selected.find(gn) != NULL);
if (gn->is_selected() && !select) {
emit_signal("node_unselected", gn);
} else if (!gn->is_selected() && select) {
emit_signal("node_selected", gn);
}
gn->set_selected(select);
} }
top_layer->update(); top_layer->update();
} else { } else {
@ -893,6 +911,7 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) {
Rect2 r = gn->get_rect(); Rect2 r = gn->get_rect();
r.size *= zoom; r.size *= zoom;
if (r.has_point(b->get_position())) { if (r.has_point(b->get_position())) {
emit_signal("node_unselected", gn);
gn->set_selected(false); gn->set_selected(false);
} }
} }