diff --git a/godot-3.x/doc/classes/EditorFileDialog.xml b/godot-3.x/doc/classes/EditorFileDialog.xml
index c93704a..675fb06 100644
--- a/godot-3.x/doc/classes/EditorFileDialog.xml
+++ b/godot-3.x/doc/classes/EditorFileDialog.xml
@@ -40,13 +40,13 @@
The location from which the user may select a file, including [code]res://[/code], [code]user://[/code], and the local file system.
-
+
The currently occupied directory.
-
+
The currently selected file.
-
+
The file system path in the address bar.
diff --git a/godot-3.x/doc/classes/FileDialog.xml b/godot-3.x/doc/classes/FileDialog.xml
index b2b3c7d..68881a1 100644
--- a/godot-3.x/doc/classes/FileDialog.xml
+++ b/godot-3.x/doc/classes/FileDialog.xml
@@ -56,13 +56,13 @@
The file system access scope. See enum [code]Access[/code] constants.
[b]Warning:[/b] Currently, in sandboxed environments such as HTML5 builds or sandboxed macOS apps, FileDialog cannot access the host file system. See [url=https://github.com/godotengine/godot-proposals/issues/1123]godot-proposals#1123[/url].
-
+
The current working directory of the file dialog.
-
+
The currently selected file of the file dialog.
-
+
The currently selected file path of the file dialog.
diff --git a/godot-3.x/editor/editor_file_dialog.cpp b/godot-3.x/editor/editor_file_dialog.cpp
index b298f25..6ce03be 100644
--- a/godot-3.x/editor/editor_file_dialog.cpp
+++ b/godot-3.x/editor/editor_file_dialog.cpp
@@ -1402,9 +1402,9 @@ void EditorFileDialog::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::INT, "access", PROPERTY_HINT_ENUM, "Resources,User data,File system"), "set_access", "get_access");
ADD_PROPERTY(PropertyInfo(Variant::INT, "display_mode", PROPERTY_HINT_ENUM, "Thumbnails,List"), "set_display_mode", "get_display_mode");
ADD_PROPERTY(PropertyInfo(Variant::INT, "mode", PROPERTY_HINT_ENUM, "Open one,Open many,Open folder,Open any,Save"), "set_mode", "get_mode");
- ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_dir", PROPERTY_HINT_DIR), "set_current_dir", "get_current_dir");
- ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_file", PROPERTY_HINT_FILE, "*"), "set_current_file", "get_current_file");
- ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_path"), "set_current_path", "get_current_path");
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_dir", PROPERTY_HINT_DIR, "", 0), "set_current_dir", "get_current_dir");
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_file", PROPERTY_HINT_FILE, "*", 0), "set_current_file", "get_current_file");
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_path", PROPERTY_HINT_NONE, "", 0), "set_current_path", "get_current_path");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "show_hidden_files"), "set_show_hidden_files", "is_showing_hidden_files");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disable_overwrite_warning"), "set_disable_overwrite_warning", "is_overwrite_warning_disabled");
diff --git a/godot-3.x/editor/editor_inspector.cpp b/godot-3.x/editor/editor_inspector.cpp
index 6059282..21b20e6 100644
--- a/godot-3.x/editor/editor_inspector.cpp
+++ b/godot-3.x/editor/editor_inspector.cpp
@@ -835,7 +835,7 @@ void EditorProperty::_menu_option(int p_option) {
emit_changed(property, EditorNode::get_singleton()->get_inspector()->get_property_clipboard());
} break;
case MENU_COPY_PROPERTY_PATH: {
- OS::get_singleton()->set_clipboard(property);
+ OS::get_singleton()->set_clipboard(property_path);
} break;
}
}
@@ -1325,6 +1325,7 @@ void EditorInspector::_parse_added_editors(VBoxContainer *current_vbox, Refget().properties.size() == 1) {
//since it's one, associate:
ep->property = F->get().properties[0];
+ ep->property_path = property_prefix + F->get().properties[0];
ep->property_usage = 0;
}
@@ -1705,6 +1706,7 @@ void EditorInspector::update_tree() {
if (F->get().properties.size() == 1) {
//since it's one, associate:
ep->property = F->get().properties[0];
+ ep->property_path = property_prefix + F->get().properties[0];
ep->property_usage = p.usage;
//and set label?
}
diff --git a/godot-3.x/editor/editor_inspector.h b/godot-3.x/editor/editor_inspector.h
index 6353b7c..82982dd 100644
--- a/godot-3.x/editor/editor_inspector.h
+++ b/godot-3.x/editor/editor_inspector.h
@@ -64,6 +64,7 @@ private:
friend class EditorInspector;
Object *object;
StringName property;
+ String property_path;
int property_usage;
diff --git a/godot-3.x/editor/plugins/spatial_editor_plugin.cpp b/godot-3.x/editor/plugins/spatial_editor_plugin.cpp
index 8ce2ceb..c982091 100644
--- a/godot-3.x/editor/plugins/spatial_editor_plugin.cpp
+++ b/godot-3.x/editor/plugins/spatial_editor_plugin.cpp
@@ -2757,27 +2757,29 @@ void SpatialEditorViewport::_notification(int p_what) {
}
}
-static void draw_indicator_bar(Control &surface, real_t fill, const Ref icon, const Ref font, const String &text) {
+static void draw_indicator_bar(Control &p_surface, real_t p_fill, const Ref p_icon, const Ref p_font, const String &p_text, const Color &p_color) {
// Adjust bar size from control height
- const Vector2 surface_size = surface.get_size();
+ const Vector2 surface_size = p_surface.get_size();
const real_t h = surface_size.y / 2.0;
const real_t y = (surface_size.y - h) / 2.0;
const Rect2 r(10 * EDSCALE, y, 6 * EDSCALE, h);
- const real_t sy = r.size.y * fill;
+ const real_t sy = r.size.y * p_fill;
// Note: because this bar appears over the viewport, it has to stay readable for any background color
// Draw both neutral dark and bright colors to account this
- surface.draw_rect(r, Color(1, 1, 1, 0.2));
- surface.draw_rect(Rect2(r.position.x, r.position.y + r.size.y - sy, r.size.x, sy), Color(1, 1, 1, 0.6));
- surface.draw_rect(r.grow(1), Color(0, 0, 0, 0.7), false, Math::round(EDSCALE));
+ p_surface.draw_rect(r, p_color * Color(1, 1, 1, 0.2));
+ p_surface.draw_rect(Rect2(r.position.x, r.position.y + r.size.y - sy, r.size.x, sy), p_color * Color(1, 1, 1, 0.6));
+ p_surface.draw_rect(r.grow(1), Color(0, 0, 0, 0.7), false, Math::round(EDSCALE));
- const Vector2 icon_size = icon->get_size();
+ const Vector2 icon_size = p_icon->get_size();
const Vector2 icon_pos = Vector2(r.position.x - (icon_size.x - r.size.x) / 2, r.position.y + r.size.y + 2 * EDSCALE);
- surface.draw_texture(icon, icon_pos);
+ p_surface.draw_texture(p_icon, icon_pos, p_color);
+ // Draw a shadow for the text to make it easier to read.
+ p_surface.draw_string(p_font, Vector2(icon_pos.x + EDSCALE, icon_pos.y + icon_size.y + 17 * EDSCALE), p_text, Color(0, 0, 0));
// Draw text below the bar (for speed/zoom information).
- surface.draw_string(font, Vector2(icon_pos.x, icon_pos.y + icon_size.y + 16 * EDSCALE), text);
+ p_surface.draw_string(p_font, Vector2(icon_pos.x, icon_pos.y + icon_size.y + 16 * EDSCALE), p_text, p_color);
}
void SpatialEditorViewport::_draw() {
@@ -2894,7 +2896,8 @@ void SpatialEditorViewport::_draw() {
1.0 - logscale_t,
get_icon("ViewportSpeed", "EditorIcons"),
get_font("font", "Label"),
- vformat("%s u/s", String::num(freelook_speed).pad_decimals(precision)));
+ vformat("%s u/s", String::num(freelook_speed).pad_decimals(precision)),
+ Color(1.0, 0.95, 0.7));
}
} else {
@@ -2915,7 +2918,8 @@ void SpatialEditorViewport::_draw() {
logscale_t,
get_icon("ViewportZoom", "EditorIcons"),
get_font("font", "Label"),
- vformat("%s u", String::num(cursor.distance).pad_decimals(precision)));
+ vformat("%s u", String::num(cursor.distance).pad_decimals(precision)),
+ Color(0.7, 0.95, 1.0));
}
}
}
diff --git a/godot-3.x/editor/plugins/tile_map_editor_plugin.cpp b/godot-3.x/editor/plugins/tile_map_editor_plugin.cpp
index 8058f3b..c566afe 100644
--- a/godot-3.x/editor/plugins/tile_map_editor_plugin.cpp
+++ b/godot-3.x/editor/plugins/tile_map_editor_plugin.cpp
@@ -832,9 +832,12 @@ void TileMapEditor::_draw_grid(Control *p_viewport, const Rect2 &p_rect) const {
const Size2 screen_size = p_viewport->get_size();
Rect2 rect;
rect.position = node->world_to_map(xform_inv.xform(Vector2()));
- rect.expand_to(node->world_to_map(xform_inv.xform(Vector2(0, screen_size.height))));
- rect.expand_to(node->world_to_map(xform_inv.xform(Vector2(screen_size.width, 0))));
- rect.expand_to(node->world_to_map(xform_inv.xform(screen_size)));
+ rect.expand_to(node->world_to_map(xform_inv.xform(Vector2(0, screen_size.height))) + Vector2(0, 1));
+ rect.expand_to(node->world_to_map(xform_inv.xform(Vector2(screen_size.width, 0))) + Vector2(1, 0));
+ rect.expand_to(node->world_to_map(xform_inv.xform(screen_size)) + Vector2(1, 1));
+ if (node->get_half_offset() != TileMap::HALF_OFFSET_DISABLED) {
+ rect.grow_by(1); // So it won't matter whether corners are on an odd or even row/column.
+ }
clipped = rect.clip(si);
}
clipped.position -= si.position; // Relative to the fade rect, in grid unit.
@@ -878,15 +881,16 @@ void TileMapEditor::_draw_grid(Control *p_viewport, const Rect2 &p_rect) const {
const Color color = (x + si.position.x == 0) ? axis_color : grid_color;
const float line_opacity = _lerp_fade(si.size.x, fade, x);
- for (int y = clipped.position.y; y < cell_count; y++) {
+ for (int y = clipped.position.y; y < clipped_end.y; y++) {
Vector2 ofs;
if (ABS(si.position.y + y) & 1) {
ofs = cell_xf[0] * half_offset;
}
- points.write[y * 2 + 0] = xform.xform(ofs + node->map_to_world(si.position + Vector2(x, y), true));
- points.write[y * 2 + 1] = xform.xform(ofs + node->map_to_world(si.position + Vector2(x, y + 1), true));
- colors.write[y * 2 + 0] = Color(color.r, color.g, color.b, color.a * line_opacity * _lerp_fade(si.size.y, fade, y));
- colors.write[y * 2 + 1] = Color(color.r, color.g, color.b, color.a * line_opacity * _lerp_fade(si.size.y, fade, y + 1));
+ const int index = (y - clipped.position.y) * 2;
+ points.write[index + 0] = xform.xform(ofs + node->map_to_world(si.position + Vector2(x, y), true));
+ points.write[index + 1] = xform.xform(ofs + node->map_to_world(si.position + Vector2(x, y + 1), true));
+ colors.write[index + 0] = Color(color.r, color.g, color.b, color.a * line_opacity * _lerp_fade(si.size.y, fade, y));
+ colors.write[index + 1] = Color(color.r, color.g, color.b, color.a * line_opacity * _lerp_fade(si.size.y, fade, y + 1));
}
p_viewport->draw_multiline_colors(points, colors, 1);
}
@@ -923,15 +927,16 @@ void TileMapEditor::_draw_grid(Control *p_viewport, const Rect2 &p_rect) const {
const Color color = (y + si.position.y == 0) ? axis_color : grid_color;
const float line_opacity = _lerp_fade(si.size.y, fade, y);
- for (int x = clipped.position.x; x < cell_count; x++) {
+ for (int x = clipped.position.x; x < clipped_end.x; x++) {
Vector2 ofs;
if (ABS(si.position.x + x) & 1) {
ofs = cell_xf[1] * half_offset;
}
- points.write[x * 2 + 0] = xform.xform(ofs + node->map_to_world(si.position + Vector2(x, y), true));
- points.write[x * 2 + 1] = xform.xform(ofs + node->map_to_world(si.position + Vector2(x + 1, y), true));
- colors.write[x * 2 + 0] = Color(color.r, color.g, color.b, color.a * line_opacity * _lerp_fade(si.size.x, fade, x));
- colors.write[x * 2 + 1] = Color(color.r, color.g, color.b, color.a * line_opacity * _lerp_fade(si.size.x, fade, x + 1));
+ const int index = (x - clipped.position.x) * 2;
+ points.write[index + 0] = xform.xform(ofs + node->map_to_world(si.position + Vector2(x, y), true));
+ points.write[index + 1] = xform.xform(ofs + node->map_to_world(si.position + Vector2(x + 1, y), true));
+ colors.write[index + 0] = Color(color.r, color.g, color.b, color.a * line_opacity * _lerp_fade(si.size.x, fade, x));
+ colors.write[index + 1] = Color(color.r, color.g, color.b, color.a * line_opacity * _lerp_fade(si.size.x, fade, x + 1));
}
p_viewport->draw_multiline_colors(points, colors, 1);
}
diff --git a/godot-3.x/modules/gdscript/gdscript_function.cpp b/godot-3.x/modules/gdscript/gdscript_function.cpp
index 850d75a..40a2466 100644
--- a/godot-3.x/modules/gdscript/gdscript_function.cpp
+++ b/godot-3.x/modules/gdscript/gdscript_function.cpp
@@ -509,7 +509,11 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
#ifdef DEBUG_ENABLED
if (!nc) {
- err_text = "Right operand of 'is' is not a class (type: '" + obj_B->get_class() + "').";
+ if (obj_B) {
+ err_text = "Right operand of 'is' is not a class (type: '" + obj_B->get_class() + "').";
+ } else {
+ err_text = "Right operand of 'is' is null.";
+ }
OPCODE_BREAK;
}
#endif
diff --git a/godot-3.x/platform/x11/detect_prime.cpp b/godot-3.x/platform/x11/detect_prime.cpp
index f68a131..2ac1388 100644
--- a/godot-3.x/platform/x11/detect_prime.cpp
+++ b/godot-3.x/platform/x11/detect_prime.cpp
@@ -175,7 +175,7 @@ int detect_prime() {
close(fdset[0]);
} else {
- // In child, exit() here will not quit the engine.
+ // In child, killing this process will not quit the engine.
char string[201];
@@ -203,7 +203,7 @@ int detect_prime() {
print_verbose("Couldn't write vendor/renderer string.");
}
close(fdset[1]);
- exit(0);
+ raise(SIGINT);
}
}
diff --git a/godot-3.x/scene/gui/file_dialog.cpp b/godot-3.x/scene/gui/file_dialog.cpp
index 486a436..c1e3378 100644
--- a/godot-3.x/scene/gui/file_dialog.cpp
+++ b/godot-3.x/scene/gui/file_dialog.cpp
@@ -822,9 +822,9 @@ void FileDialog::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::INT, "access", PROPERTY_HINT_ENUM, "Resources,User data,File system"), "set_access", "get_access");
ADD_PROPERTY(PropertyInfo(Variant::POOL_STRING_ARRAY, "filters"), "set_filters", "get_filters");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "show_hidden_files"), "set_show_hidden_files", "is_showing_hidden_files");
- ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_dir"), "set_current_dir", "get_current_dir");
- ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_file"), "set_current_file", "get_current_file");
- ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_path"), "set_current_path", "get_current_path");
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_dir", PROPERTY_HINT_DIR, "", 0), "set_current_dir", "get_current_dir");
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_file", PROPERTY_HINT_FILE, "*", 0), "set_current_file", "get_current_file");
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_path", PROPERTY_HINT_NONE, "", 0), "set_current_path", "get_current_path");
ADD_SIGNAL(MethodInfo("file_selected", PropertyInfo(Variant::STRING, "path")));
ADD_SIGNAL(MethodInfo("files_selected", PropertyInfo(Variant::POOL_STRING_ARRAY, "paths")));
diff --git a/godot-3.x/scene/gui/rich_text_label.cpp b/godot-3.x/scene/gui/rich_text_label.cpp
index 50a4b31..7ad48a2 100644
--- a/godot-3.x/scene/gui/rich_text_label.cpp
+++ b/godot-3.x/scene/gui/rich_text_label.cpp
@@ -591,21 +591,24 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
draw_rect(Rect2(p_ofs.x + pofs, p_ofs.y + y, cw, lh), selection_bg);
}
- if (p_font_color_shadow.a > 0) {
+ const Color char_color = selected && override_selected_font_color ? selection_fg : fx_color;
+ const Color shadow_color = p_font_color_shadow * Color(1, 1, 1, char_color.a);
+
+ if (shadow_color.a > 0) {
const Point2 shadow_base_pos = p_ofs + Point2(align_ofs + pofs, y + lh - line_descent);
- font->draw_char(ci, shadow_base_pos + shadow_ofs + fx_offset, fx_char, c[i + 1], p_font_color_shadow);
+ font->draw_char(ci, shadow_base_pos + shadow_ofs + fx_offset, fx_char, c[i + 1], shadow_color);
if (p_shadow_as_outline) {
- font->draw_char(ci, shadow_base_pos + Vector2(-shadow_ofs.x, shadow_ofs.y) + fx_offset, fx_char, c[i + 1], p_font_color_shadow);
- font->draw_char(ci, shadow_base_pos + Vector2(shadow_ofs.x, -shadow_ofs.y) + fx_offset, fx_char, c[i + 1], p_font_color_shadow);
- font->draw_char(ci, shadow_base_pos + Vector2(-shadow_ofs.x, -shadow_ofs.y) + fx_offset, fx_char, c[i + 1], p_font_color_shadow);
+ font->draw_char(ci, shadow_base_pos + Vector2(-shadow_ofs.x, shadow_ofs.y) + fx_offset, fx_char, c[i + 1], shadow_color);
+ font->draw_char(ci, shadow_base_pos + Vector2(shadow_ofs.x, -shadow_ofs.y) + fx_offset, fx_char, c[i + 1], shadow_color);
+ font->draw_char(ci, shadow_base_pos + Vector2(-shadow_ofs.x, -shadow_ofs.y) + fx_offset, fx_char, c[i + 1], shadow_color);
}
}
if (selected) {
- drawer.draw_char(ci, p_ofs + Point2(align_ofs + pofs, y + lh - line_descent), fx_char, c[i + 1], override_selected_font_color ? selection_fg : fx_color);
+ drawer.draw_char(ci, p_ofs + Point2(align_ofs + pofs, y + lh - line_descent), fx_char, c[i + 1], char_color);
} else {
- cw = drawer.draw_char(ci, p_ofs + Point2(align_ofs + pofs, y + lh - line_descent) + fx_offset, fx_char, c[i + 1], fx_color);
+ cw = drawer.draw_char(ci, p_ofs + Point2(align_ofs + pofs, y + lh - line_descent) + fx_offset, fx_char, c[i + 1], char_color);
}
} else if (previously_visible && c[i] != '\t') {
backtrack += font->get_char_size(fx_char, c[i + 1]).x;