Fix content scale mode, closes #37941

This commit is contained in:
Juan Linietsky 2020-07-02 17:15:11 -03:00
parent 67e4082b1e
commit ac7e9479ce
4 changed files with 26 additions and 17 deletions

View file

@ -1895,10 +1895,10 @@ bool Main::start() {
Size2i stretch_size = Size2(GLOBAL_DEF("display/window/size/width", 0), GLOBAL_DEF("display/window/size/height", 0)); Size2i stretch_size = Size2(GLOBAL_DEF("display/window/size/width", 0), GLOBAL_DEF("display/window/size/height", 0));
Window::ContentScaleMode cs_sm = Window::CONTENT_SCALE_MODE_DISABLED; Window::ContentScaleMode cs_sm = Window::CONTENT_SCALE_MODE_DISABLED;
if (stretch_mode == "objects") { if (stretch_mode == "canvas_items") {
cs_sm = Window::CONTENT_SCALE_MODE_OBJECTS; cs_sm = Window::CONTENT_SCALE_MODE_CANVAS_ITEMS;
} else if (stretch_mode == "pixels") { } else if (stretch_mode == "viewport") {
cs_sm = Window::CONTENT_SCALE_MODE_PIXELS; cs_sm = Window::CONTENT_SCALE_MODE_VIEWPORT;
} }
Window::ContentScaleAspect cs_aspect = Window::CONTENT_SCALE_ASPECT_IGNORE; Window::ContentScaleAspect cs_aspect = Window::CONTENT_SCALE_ASPECT_IGNORE;
@ -1954,7 +1954,7 @@ bool Main::start() {
} else { } else {
GLOBAL_DEF("display/window/stretch/mode", "disabled"); GLOBAL_DEF("display/window/stretch/mode", "disabled");
ProjectSettings::get_singleton()->set_custom_property_info("display/window/stretch/mode", PropertyInfo(Variant::STRING, "display/window/stretch/mode", PROPERTY_HINT_ENUM, "disabled,2d,viewport")); ProjectSettings::get_singleton()->set_custom_property_info("display/window/stretch/mode", PropertyInfo(Variant::STRING, "display/window/stretch/mode", PROPERTY_HINT_ENUM, "disabled,canvas_items,viewport"));
GLOBAL_DEF("display/window/stretch/aspect", "ignore"); GLOBAL_DEF("display/window/stretch/aspect", "ignore");
ProjectSettings::get_singleton()->set_custom_property_info("display/window/stretch/aspect", PropertyInfo(Variant::STRING, "display/window/stretch/aspect", PROPERTY_HINT_ENUM, "ignore,keep,keep_width,keep_height,expand")); ProjectSettings::get_singleton()->set_custom_property_info("display/window/stretch/aspect", PropertyInfo(Variant::STRING, "display/window/stretch/aspect", PROPERTY_HINT_ENUM, "ignore,keep,keep_width,keep_height,expand"));
GLOBAL_DEF("display/window/stretch/shrink", 1.0); GLOBAL_DEF("display/window/stretch/shrink", 1.0);

View file

@ -1173,7 +1173,17 @@ Rect2 Control::get_parent_anchorable_rect() const {
if (data.parent_canvas_item) { if (data.parent_canvas_item) {
parent_rect = data.parent_canvas_item->get_anchorable_rect(); parent_rect = data.parent_canvas_item->get_anchorable_rect();
} else { } else {
#ifdef TOOLS_ENABLED
Node *edited_root = get_tree()->get_edited_scene_root();
if (edited_root && (this == edited_root || edited_root->is_a_parent_of(this))) {
parent_rect.size = Size2(ProjectSettings::get_singleton()->get("display/window/size/width"), ProjectSettings::get_singleton()->get("display/window/size/height"));
} else {
parent_rect = get_viewport()->get_visible_rect();
}
#else
parent_rect = get_viewport()->get_visible_rect(); parent_rect = get_viewport()->get_visible_rect();
#endif
} }
return parent_rect; return parent_rect;

View file

@ -624,26 +624,25 @@ void Window::_update_viewport_size() {
// Already handled above // Already handled above
//_update_font_oversampling(1.0); //_update_font_oversampling(1.0);
} break; } break;
case CONTENT_SCALE_MODE_OBJECTS: { case CONTENT_SCALE_MODE_CANVAS_ITEMS: {
final_size = screen_size; final_size = screen_size;
final_size_override = viewport_size; final_size_override = viewport_size;
attach_to_screen_rect = Rect2(margin, screen_size); attach_to_screen_rect = Rect2(margin, screen_size);
font_oversampling = screen_size.x / viewport_size.x; font_oversampling = screen_size.x / viewport_size.x;
Size2 scale = Vector2(screen_size) / Vector2(final_size_override);
stretch_transform.scale(scale);
} break; } break;
case CONTENT_SCALE_MODE_PIXELS: { case CONTENT_SCALE_MODE_VIEWPORT: {
final_size = viewport_size; final_size = viewport_size;
attach_to_screen_rect = Rect2(margin, screen_size); attach_to_screen_rect = Rect2(margin, screen_size);
} break; } break;
} }
Size2 scale = size / (Vector2(final_size) + margin * 2);
stretch_transform.scale(scale);
stretch_transform.elements[2] = margin * scale;
} }
bool allocate = is_inside_tree() && visible && (window_id != DisplayServer::INVALID_WINDOW_ID || embedder != nullptr); bool allocate = is_inside_tree() && visible && (window_id != DisplayServer::INVALID_WINDOW_ID || embedder != nullptr);
_set_size(final_size, final_size_override, attach_to_screen_rect, stretch_transform, allocate); _set_size(final_size, final_size_override, attach_to_screen_rect, stretch_transform, allocate);
if (window_id != DisplayServer::INVALID_WINDOW_ID) { if (window_id != DisplayServer::INVALID_WINDOW_ID) {
@ -1372,7 +1371,7 @@ void Window::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "max_size"), "set_max_size", "get_max_size"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "max_size"), "set_max_size", "get_max_size");
ADD_GROUP("Content Scale", "content_scale_"); ADD_GROUP("Content Scale", "content_scale_");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "content_scale_size"), "set_content_scale_size", "get_content_scale_size"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "content_scale_size"), "set_content_scale_size", "get_content_scale_size");
ADD_PROPERTY(PropertyInfo(Variant::INT, "content_scale_mode", PROPERTY_HINT_ENUM, "Disabled,Object,Pixels"), "set_content_scale_mode", "get_content_scale_mode"); ADD_PROPERTY(PropertyInfo(Variant::INT, "content_scale_mode", PROPERTY_HINT_ENUM, "Disabled,CanvasItems,Viewport"), "set_content_scale_mode", "get_content_scale_mode");
ADD_PROPERTY(PropertyInfo(Variant::INT, "content_scale_aspect", PROPERTY_HINT_ENUM, "Ignore,Keep,KeepWidth,KeepHeight,Expand"), "set_content_scale_aspect", "get_content_scale_aspect"); ADD_PROPERTY(PropertyInfo(Variant::INT, "content_scale_aspect", PROPERTY_HINT_ENUM, "Ignore,Keep,KeepWidth,KeepHeight,Expand"), "set_content_scale_aspect", "get_content_scale_aspect");
ADD_GROUP("Theme", ""); ADD_GROUP("Theme", "");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "theme", PROPERTY_HINT_RESOURCE_TYPE, "Theme"), "set_theme", "get_theme"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "theme", PROPERTY_HINT_RESOURCE_TYPE, "Theme"), "set_theme", "get_theme");
@ -1403,8 +1402,8 @@ void Window::_bind_methods() {
BIND_ENUM_CONSTANT(FLAG_MAX); BIND_ENUM_CONSTANT(FLAG_MAX);
BIND_ENUM_CONSTANT(CONTENT_SCALE_MODE_DISABLED); BIND_ENUM_CONSTANT(CONTENT_SCALE_MODE_DISABLED);
BIND_ENUM_CONSTANT(CONTENT_SCALE_MODE_OBJECTS); BIND_ENUM_CONSTANT(CONTENT_SCALE_MODE_CANVAS_ITEMS);
BIND_ENUM_CONSTANT(CONTENT_SCALE_MODE_PIXELS); BIND_ENUM_CONSTANT(CONTENT_SCALE_MODE_VIEWPORT);
BIND_ENUM_CONSTANT(CONTENT_SCALE_ASPECT_IGNORE); BIND_ENUM_CONSTANT(CONTENT_SCALE_ASPECT_IGNORE);
BIND_ENUM_CONSTANT(CONTENT_SCALE_ASPECT_KEEP); BIND_ENUM_CONSTANT(CONTENT_SCALE_ASPECT_KEEP);

View file

@ -57,8 +57,8 @@ public:
enum ContentScaleMode { enum ContentScaleMode {
CONTENT_SCALE_MODE_DISABLED, CONTENT_SCALE_MODE_DISABLED,
CONTENT_SCALE_MODE_OBJECTS, CONTENT_SCALE_MODE_CANVAS_ITEMS,
CONTENT_SCALE_MODE_PIXELS, CONTENT_SCALE_MODE_VIEWPORT,
}; };
enum ContentScaleAspect { enum ContentScaleAspect {