diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index 8fd16a3dbfa1..af08a7b754a4 100644 --- a/doc/classes/RenderingServer.xml +++ b/doc/classes/RenderingServer.xml @@ -4360,8 +4360,9 @@ + - Sets the viewport's width and height in pixels. + Sets the viewport's [param width] and [param height] in pixels. Optionally the [param view_count] can be set to increase the number of view layers for stereo rendering. diff --git a/doc/classes/SubViewport.xml b/doc/classes/SubViewport.xml index 9d41a5e36d63..4a7b9db75d80 100644 --- a/doc/classes/SubViewport.xml +++ b/doc/classes/SubViewport.xml @@ -36,6 +36,9 @@ If [code]true[/code], the 2D size override affects stretch as well. + + The number of view layers we are rendering to. Set this to [code]2[/code] to enable stereo rendering. + diff --git a/misc/extension_api_validation/4.6-stable/GH-115799.txt b/misc/extension_api_validation/4.6-stable/GH-115799.txt new file mode 100644 index 000000000000..124bfa4c1a27 --- /dev/null +++ b/misc/extension_api_validation/4.6-stable/GH-115799.txt @@ -0,0 +1,9 @@ +GH-115799 +--------- +Validate extension JSON: Error: Field 'classes/RenderingServer/methods/viewport_set_size/arguments': size changed value in new API, from 3 to 4. + +Optional argument added. Compatibility method registered. + +Validate extension JSON: Error: Field 'classes/Viewport/methods/is_using_xr': is_const changed value in new API, from false to true. + +Changed to const. Compatibility method registered. diff --git a/scene/main/viewport.compat.inc b/scene/main/viewport.compat.inc new file mode 100644 index 000000000000..b04da3604297 --- /dev/null +++ b/scene/main/viewport.compat.inc @@ -0,0 +1,45 @@ +/**************************************************************************/ +/* viewport.compat.inc */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#ifndef DISABLE_DEPRECATED + +#ifndef XR_DISABLED +bool Viewport::_is_using_xr_115799() { + return is_using_xr(); +} +#endif + +void Viewport::_bind_compatibility_methods() { +#ifndef XR_DISABLED + ClassDB::bind_compatibility_method(D_METHOD("is_using_xr"), &Viewport::_is_using_xr_115799); +#endif +} + +#endif diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 5a32764c8850..7dad32f6c853 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -29,6 +29,7 @@ /**************************************************************************/ #include "viewport.h" +#include "viewport.compat.inc" #include "core/config/project_settings.h" #include "core/debugger/engine_debugger.h" @@ -683,6 +684,17 @@ void Viewport::_notification(int p_what) { _update_viewport_path(); } break; +#ifndef XR_DISABLED + case NOTIFICATION_INTERNAL_PROCESS: { + // Note: internal process should only be enabled if use_xr is true, + // but we check anyway to be future proof. + // This is currently a polling approach. + if (use_xr) { + _check_xr_size(); + } + } break; +#endif // XR_DISABLED + #if !defined(PHYSICS_2D_DISABLED) || !defined(PHYSICS_3D_DISABLED) case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { if (!get_tree()) { @@ -1080,7 +1092,7 @@ void Viewport::set_use_oversampling(bool p_oversampling) { return; } use_font_oversampling = p_oversampling; - _set_size(_get_size(), _get_size_2d_override(), _is_size_allocated()); + _set_size(_get_size(), _get_view_count(), _get_size_2d_override(), _is_size_allocated()); } bool Viewport::is_using_oversampling() const { @@ -1094,7 +1106,7 @@ void Viewport::set_oversampling_override(float p_oversampling) { return; } font_oversampling_override = p_oversampling; - _set_size(_get_size(), _get_size_2d_override(), _is_size_allocated()); + _set_size(_get_size(), _get_view_count(), _get_size_2d_override(), _is_size_allocated()); } float Viewport::get_oversampling_override() const { @@ -1102,7 +1114,7 @@ float Viewport::get_oversampling_override() const { return font_oversampling_override; } -bool Viewport::_set_size(const Size2i &p_size, const Size2 &p_size_2d_override, bool p_allocated) { +bool Viewport::_set_size(const Size2i &p_size, const int p_view_count, const Size2 &p_size_2d_override, bool p_allocated) { Transform2D stretch_transform_new = Transform2D(); float new_font_oversampling = 1.0; if (is_size_2d_override_stretch_enabled() && p_size_2d_override.width > 0 && p_size_2d_override.height > 0) { @@ -1123,7 +1135,7 @@ bool Viewport::_set_size(const Size2i &p_size, const Size2 &p_size_2d_override, } Size2i new_size = p_size.maxi(2); - if (size == new_size && size_allocated == p_allocated && stretch_transform == stretch_transform_new && p_size_2d_override == size_2d_override && new_font_oversampling == font_oversampling) { + if (size == new_size && view_count == p_view_count && size_allocated == p_allocated && stretch_transform == stretch_transform_new && p_size_2d_override == size_2d_override && new_font_oversampling == font_oversampling) { return false; } @@ -1136,24 +1148,17 @@ bool Viewport::_set_size(const Size2i &p_size, const Size2 &p_size_2d_override, } size = new_size; + view_count = p_view_count; size_allocated = p_allocated; size_2d_override = p_size_2d_override; stretch_transform = stretch_transform_new; font_oversampling = new_font_oversampling; -#ifndef XR_DISABLED - if (!use_xr) { -#endif - - if (p_allocated) { - RS::get_singleton()->viewport_set_size(viewport, size.width, size.height); - } else { - RS::get_singleton()->viewport_set_size(viewport, 0, 0); - } - -#ifndef XR_DISABLED - } // if (!use_xr) -#endif + if (p_allocated) { + RS::get_singleton()->viewport_set_size(viewport, size.width, size.height, view_count); + } else { + RS::get_singleton()->viewport_set_size(viewport, 0, 0, 0); + } _update_global_transform(); update_configuration_warnings(); @@ -1179,20 +1184,26 @@ bool Viewport::_set_size(const Size2i &p_size, const Size2 &p_size_2d_override, return true; } -Size2i Viewport::_get_size() const { +void Viewport::_check_xr_size() { #ifndef XR_DISABLED - if (use_xr) { - if (XRServer::get_singleton() != nullptr) { - Ref xr_interface = XRServer::get_singleton()->get_primary_interface(); - if (xr_interface.is_valid() && xr_interface->is_initialized()) { - Size2 xr_size = xr_interface->get_render_target_size(); - return (Size2i)xr_size; - } + // If our viewport has the use_xr flag set, our size and layout is managed by the XRServer. + if (use_xr && XRServer::get_singleton() != nullptr) { + Ref xr_interface = XRServer::get_singleton()->get_primary_interface(); + if (xr_interface.is_valid() && xr_interface->is_initialized()) { + Size2 xr_size = xr_interface->get_render_target_size(); + int xr_view_count = xr_interface->get_view_count(); + + _set_size((Size2i)xr_size, xr_view_count, Size2i(0, 0), true); + } else { + // Set to default and prevent rendering for now (unless in editor, so we get a preview). + bool is_editor = Engine::get_singleton()->is_editor_hint(); + _set_size(is_editor ? Size2i(512, 512) : Size2i(0, 0), is_editor ? 1 : 0, Size2i(0, 0), false); } - return Size2i(); } #endif // XR_DISABLED +} +Size2i Viewport::_get_size() const { return size; } @@ -1200,6 +1211,10 @@ Size2 Viewport::_get_size_2d_override() const { return size_2d_override; } +int Viewport::_get_view_count() const { + return view_count; +} + bool Viewport::_is_size_allocated() const { return size_allocated; } @@ -4831,27 +4846,37 @@ void Viewport::_propagate_exit_world_3d(Node *p_node) { #ifndef XR_DISABLED void Viewport::set_use_xr(bool p_use_xr) { ERR_MAIN_THREAD_GUARD; + if (use_xr != p_use_xr) { use_xr = p_use_xr; - RS::get_singleton()->viewport_set_use_xr(viewport, use_xr); - if (!use_xr) { - // Set viewport to previous size when exiting XR. - if (size_allocated) { - RS::get_singleton()->viewport_set_size(viewport, size.width, size.height); - } else { - RS::get_singleton()->viewport_set_size(viewport, 0, 0); - } +#ifndef XR_DISABLED + if (use_xr) { + // Note: use_xr is ONLY used for the primary XR viewport. + // Any additional (sub)viewports for composition layers and + // other purposes should not have use_xr set. + _check_xr_size(); + + // Enable internal process as we need to check for recommended size changes each frame + // (though size changes should only happen sporadically). + set_process_internal(true); + } else +#endif // XR_DISABLED + { + // No longer check for recommended size changes in internal process. + set_process_internal(false); // Reset render target override textures. RID rt = RS::get_singleton()->viewport_get_render_target(viewport); RSG::texture_storage->render_target_set_override(rt, RID(), RID(), RID(), RID()); } + + notify_property_list_changed(); } } -bool Viewport::is_using_xr() { +bool Viewport::is_using_xr() const { ERR_READ_THREAD_GUARD_V(false); return use_xr; } @@ -5415,17 +5440,17 @@ Viewport::~Viewport() { void SubViewport::set_size(const Size2i &p_size) { ERR_MAIN_THREAD_GUARD; - _internal_set_size(p_size); + _internal_set_size(p_size, _get_view_count()); } void SubViewport::set_size_force(const Size2i &p_size) { ERR_MAIN_THREAD_GUARD; // Use only for setting the size from the parent SubViewportContainer with enabled stretch mode. // Don't expose function to scripting. - _internal_set_size(p_size, true); + _internal_set_size(p_size, _get_view_count(), true); } -void SubViewport::_internal_set_size(const Size2i &p_size, bool p_force) { +void SubViewport::_internal_set_size(const Size2i &p_size, const int p_view_count, bool p_force) { SubViewportContainer *c = Object::cast_to(get_parent()); if (!p_force && c && c->is_stretch_enabled()) { #ifdef DEBUG_ENABLED @@ -5434,7 +5459,7 @@ void SubViewport::_internal_set_size(const Size2i &p_size, bool p_force) { return; } - _set_size(p_size, _get_size_2d_override(), true); + _set_size(p_size, p_view_count, _get_size_2d_override(), true); if (c) { c->update_minimum_size(); @@ -5447,9 +5472,22 @@ Size2i SubViewport::get_size() const { return _get_size(); } +void SubViewport::set_view_count(const int p_view_count) { + ERR_MAIN_THREAD_GUARD; + + // Q: add `, _get_size_2d_override(), true` ? + _internal_set_size(_get_size(), p_view_count); +} + +int SubViewport::get_view_count() const { + ERR_READ_THREAD_GUARD_V(1); + + return _get_view_count(); +} + void SubViewport::set_size_2d_override(const Size2i &p_size) { ERR_MAIN_THREAD_GUARD; - _set_size(_get_size(), p_size, true); + _set_size(_get_size(), _get_view_count(), p_size, true); } Size2i SubViewport::get_size_2d_override() const { @@ -5467,7 +5505,7 @@ void SubViewport::set_size_2d_override_stretch(bool p_enable) { } size_2d_override_stretch = p_enable; - _set_size(_get_size(), _get_size_2d_override(), true); + _set_size(_get_size(), _get_view_count(), _get_size_2d_override(), true); } bool SubViewport::is_size_2d_override_stretch_enabled() const { @@ -5573,6 +5611,9 @@ void SubViewport::_bind_methods() { ClassDB::bind_method(D_METHOD("set_size_2d_override_stretch", "enable"), &SubViewport::set_size_2d_override_stretch); ClassDB::bind_method(D_METHOD("is_size_2d_override_stretch_enabled"), &SubViewport::is_size_2d_override_stretch_enabled); + ClassDB::bind_method(D_METHOD("set_view_count", "view_count"), &SubViewport::set_view_count); + ClassDB::bind_method(D_METHOD("get_view_count"), &SubViewport::get_view_count); + ClassDB::bind_method(D_METHOD("set_update_mode", "mode"), &SubViewport::set_update_mode); ClassDB::bind_method(D_METHOD("get_update_mode"), &SubViewport::get_update_mode); @@ -5582,6 +5623,7 @@ void SubViewport::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "size", PROPERTY_HINT_NONE, "suffix:px"), "set_size", "get_size"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "size_2d_override", PROPERTY_HINT_NONE, "suffix:px"), "set_size_2d_override", "get_size_2d_override"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "size_2d_override_stretch"), "set_size_2d_override_stretch", "is_size_2d_override_stretch_enabled"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "view_count"), "set_view_count", "get_view_count"); ADD_GROUP("Render Target", "render_target_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "render_target_clear_mode", PROPERTY_HINT_ENUM, "Always,Never,Next Frame"), "set_clear_mode", "get_clear_mode"); ADD_PROPERTY(PropertyInfo(Variant::INT, "render_target_update_mode", PROPERTY_HINT_ENUM, "Disabled,Once,When Visible,When Parent Visible,Always"), "set_update_mode", "get_update_mode"); @@ -5601,7 +5643,13 @@ void SubViewport::_validate_property(PropertyInfo &p_property) const { if (!Engine::get_singleton()->is_editor_hint()) { return; } +#ifndef XR_DISABLED + if (is_using_xr() && (p_property.name == "size" || p_property.name == "size_2d_override" || p_property.name == "size_2d_override_stretch" || p_property.name == "view_count")) { + p_property.usage = PROPERTY_USAGE_NONE; // Managed by XR + } else if (p_property.name == "size") { +#else if (p_property.name == "size") { +#endif SubViewportContainer *parent_svc = Object::cast_to(get_parent()); if (parent_svc && parent_svc->is_stretch_enabled()) { p_property.usage = PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_READ_ONLY; @@ -5612,7 +5660,7 @@ void SubViewport::_validate_property(PropertyInfo &p_property) const { } SubViewport::SubViewport() { - RS::get_singleton()->viewport_set_size(get_viewport_rid(), get_size().width, get_size().height); + RS::get_singleton()->viewport_set_size(get_viewport_rid(), get_size().width, get_size().height, get_view_count()); } ///////////////////////////////// diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 26b65856a394..ba5eba7ea7bd 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -254,6 +254,7 @@ class Viewport : public Node { Transform2D stretch_transform; Size2i size = Size2i(512, 512); + int view_count = 1; Size2 size_2d_override; bool size_allocated = false; @@ -502,10 +503,12 @@ class Viewport : public Node { void _window_start_resize(SubWindowResize p_edge, Window *p_window); protected: - bool _set_size(const Size2i &p_size, const Size2 &p_size_2d_override, bool p_allocated); + bool _set_size(const Size2i &p_size, const int p_view_count, const Size2 &p_size_2d_override, bool p_allocated); + void _check_xr_size(); Size2i _get_size() const; Size2 _get_size_2d_override() const; + int _get_view_count() const; bool _is_size_allocated() const; void _notification(int p_what); @@ -513,6 +516,9 @@ class Viewport : public Node { void _process_picking(); #endif // !defined(PHYSICS_2D_DISABLED) || !defined(PHYSICS_3D_DISABLED) static void _bind_methods(); +#ifndef DISABLE_DEPRECATED + static void _bind_compatibility_methods(); +#endif void _validate_property(PropertyInfo &p_property) const; public: @@ -856,7 +862,11 @@ class Viewport : public Node { #ifndef XR_DISABLED void set_use_xr(bool p_use_xr); - bool is_using_xr(); + bool is_using_xr() const; + +#ifndef DISABLE_DEPRECATED + bool _is_using_xr_115799(); +#endif #endif // XR_DISABLED #endif // _3D_DISABLED @@ -887,7 +897,7 @@ class SubViewport : public Viewport { ClearMode clear_mode = CLEAR_MODE_ALWAYS; bool size_2d_override_stretch = false; - void _internal_set_size(const Size2i &p_size, bool p_force = false); + void _internal_set_size(const Size2i &p_size, const int p_view_count = 1, bool p_force = false); protected: static void _bind_methods(); @@ -899,6 +909,9 @@ class SubViewport : public Viewport { Size2i get_size() const; void set_size_force(const Size2i &p_size); + void set_view_count(const int p_view_count); + int get_view_count() const; + void set_size_2d_override(const Size2i &p_size); Size2i get_size_2d_override() const; diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 55dfff3c84e3..d78eb2b228ef 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -1279,6 +1279,13 @@ void Window::_update_window_size() { void Window::_update_viewport_size() { //update the viewport part +#ifndef XR_DISABLED + // If `use_xr` set, we should skip this logic. + if (is_using_xr()) { + return; + } +#endif // XR_DISABLED + Size2i final_size; Size2 final_size_override; Rect2i attach_to_screen_rect(Point2i(), size); @@ -1396,7 +1403,7 @@ void Window::_update_viewport_size() { } bool allocate = is_inside_tree() && visible && (window_id != DisplayServer::INVALID_WINDOW_ID || embedder != nullptr); - _set_size(final_size, final_size_override, allocate); + _set_size(final_size, 1, final_size_override, allocate); if (window_id != DisplayServer::INVALID_WINDOW_ID) { RenderingServer::get_singleton()->viewport_attach_to_screen(get_viewport_rid(), attach_to_screen_rect, window_id); @@ -1411,7 +1418,7 @@ void Window::_update_viewport_size() { Viewport::set_oversampling_override(scale); Size2 s = Size2(final_size.width * scale, final_size.height * scale).ceil(); RS::get_singleton()->viewport_set_global_canvas_transform(get_viewport_rid(), global_canvas_transform * scale * content_scale_factor); - RS::get_singleton()->viewport_set_size(get_viewport_rid(), s.width, s.height); + RS::get_singleton()->viewport_set_size(get_viewport_rid(), s.width, s.height, 1); embedder->_sub_window_update(this); } } diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp index 4f8abee3ebc7..0dd27ed11a34 100644 --- a/servers/rendering/renderer_viewport.cpp +++ b/servers/rendering/renderer_viewport.cpp @@ -807,18 +807,7 @@ void RendererViewport::draw_viewports(bool p_swap_buffers) { #ifndef XR_DISABLED if (vp->use_xr) { - if (xr_interface.is_valid()) { - // Ignore update mode we have to commit frames to our XR interface - visible = true; - - // Override our size, make sure it matches our required size and is created as a stereo target - Size2 xr_size = xr_interface->get_render_target_size(); - _viewport_set_size(vp, xr_size.width, xr_size.height, xr_interface->get_view_count()); - } else { - // don't render anything - visible = false; - vp->size = Size2(); - } + visible = xr_interface.is_valid(); } else #endif // XR_DISABLED { @@ -838,7 +827,7 @@ void RendererViewport::draw_viewports(bool p_swap_buffers) { } } - visible = visible && vp->size.x > 1 && vp->size.y > 1; + visible = visible && vp->size.x > 1 && vp->size.y > 1 && vp->view_count > 0; if (visible) { vp->last_pass = draw_viewports_pass; @@ -1084,14 +1073,13 @@ void RendererViewport::viewport_set_scaling_3d_scale(RID p_viewport, float p_sca _configure_3d_render_buffers(viewport); } -void RendererViewport::viewport_set_size(RID p_viewport, int p_width, int p_height) { - ERR_FAIL_COND(p_width < 0 || p_height < 0); +void RendererViewport::viewport_set_size(RID p_viewport, int p_width, int p_height, int p_view_count) { + ERR_FAIL_COND(p_width < 0 || p_height < 0 || p_view_count < 0); Viewport *viewport = viewport_owner.get_or_null(p_viewport); ERR_FAIL_NULL(viewport); - ERR_FAIL_COND_MSG(viewport->use_xr, "Cannot set viewport size when using XR"); - _viewport_set_size(viewport, p_width, p_height, 1); + _viewport_set_size(viewport, p_width, p_height, p_view_count); } void RendererViewport::_viewport_set_size(Viewport *p_viewport, int p_width, int p_height, uint32_t p_view_count) { diff --git a/servers/rendering/renderer_viewport.h b/servers/rendering/renderer_viewport.h index 2ba1d1e4fbb8..61d05cf32812 100644 --- a/servers/rendering/renderer_viewport.h +++ b/servers/rendering/renderer_viewport.h @@ -223,7 +223,7 @@ class RendererViewport { void viewport_set_use_xr(RID p_viewport, bool p_use_xr); #endif // XR_DISABLED - void viewport_set_size(RID p_viewport, int p_width, int p_height); + void viewport_set_size(RID p_viewport, int p_width, int p_height, int p_view_count = 1); void viewport_attach_to_screen(RID p_viewport, const Rect2 &p_rect = Rect2(), DisplayServer::WindowID p_screen = DisplayServer::MAIN_WINDOW_ID); void viewport_set_render_direct_to_screen(RID p_viewport, bool p_enable); diff --git a/servers/rendering/rendering_server.compat.inc b/servers/rendering/rendering_server.compat.inc index b3ccaa2da707..c03379716272 100644 --- a/servers/rendering/rendering_server.compat.inc +++ b/servers/rendering/rendering_server.compat.inc @@ -58,6 +58,10 @@ void RenderingServer::_instance_reset_physics_interpolation_bind_compat_104269(R WARN_PRINT_ONCE("instance_reset_physics_interpolation() is deprecated."); } +void RenderingServer::_viewport_set_size_compat_115799(RID p_viewport, int p_width, int p_height) { + viewport_set_size(p_viewport, p_width, p_height, 1); +} + void RenderingServer::_bind_compatibility_methods() { ClassDB::bind_compatibility_method(D_METHOD("multimesh_allocate_data", "multimesh", "instances", "transform_format", "color_format", "custom_data_format"), &RenderingServer::_multimesh_allocate_data_bind_compat_99455, DEFVAL(false), DEFVAL(false)); ClassDB::bind_compatibility_method(D_METHOD("environment_set_fog", "env", "enable", "light_color", "light_energy", "sun_scatter", "density", "height", "height_density", "aerial_perspective", "sky_affect"), &RenderingServer::_environment_set_fog_bind_compat_84792); @@ -66,6 +70,7 @@ void RenderingServer::_bind_compatibility_methods() { ClassDB::bind_compatibility_method(D_METHOD("canvas_item_add_circle", "item", "pos", "radius", "color"), &RenderingServer::_canvas_item_add_circle_bind_compat_84523); ClassDB::bind_compatibility_method(D_METHOD("instance_set_interpolated", "instance", "interpolated"), &RenderingServer::_instance_set_interpolated_bind_compat_104269); ClassDB::bind_compatibility_method(D_METHOD("instance_reset_physics_interpolation", "instance"), &RenderingServer::_instance_reset_physics_interpolation_bind_compat_104269); + ClassDB::bind_compatibility_method(D_METHOD("viewport_set_size", "viewport", "width", "height"), &RenderingServer::_viewport_set_size_compat_115799); } #endif diff --git a/servers/rendering/rendering_server.cpp b/servers/rendering/rendering_server.cpp index 0c5ef498a12e..f3062cf06bfd 100644 --- a/servers/rendering/rendering_server.cpp +++ b/servers/rendering/rendering_server.cpp @@ -2898,7 +2898,7 @@ void RenderingServer::_bind_methods() { #ifndef XR_DISABLED ClassDB::bind_method(D_METHOD("viewport_set_use_xr", "viewport", "use_xr"), &RenderingServer::viewport_set_use_xr); #endif // XR_DISABLED - ClassDB::bind_method(D_METHOD("viewport_set_size", "viewport", "width", "height"), &RenderingServer::viewport_set_size); + ClassDB::bind_method(D_METHOD("viewport_set_size", "viewport", "width", "height", "view_count"), &RenderingServer::viewport_set_size, DEFVAL(1)); ClassDB::bind_method(D_METHOD("viewport_set_active", "viewport", "active"), &RenderingServer::viewport_set_active); ClassDB::bind_method(D_METHOD("viewport_set_parent_viewport", "viewport", "parent_viewport"), &RenderingServer::viewport_set_parent_viewport); ClassDB::bind_method(D_METHOD("viewport_attach_to_screen", "viewport", "rect", "screen"), &RenderingServer::viewport_attach_to_screen, DEFVAL(Rect2()), DEFVAL(DisplayServer::MAIN_WINDOW_ID)); diff --git a/servers/rendering/rendering_server.h b/servers/rendering/rendering_server.h index 6f14687c9654..352557d346f1 100644 --- a/servers/rendering/rendering_server.h +++ b/servers/rendering/rendering_server.h @@ -94,6 +94,7 @@ class RenderingServer : public Object { void _canvas_item_add_circle_bind_compat_84523(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color); void _instance_set_interpolated_bind_compat_104269(RID p_instance, bool p_interpolated); void _instance_reset_physics_interpolation_bind_compat_104269(RID p_instance); + void _viewport_set_size_compat_115799(RID p_viewport, int p_width, int p_height); static void _bind_compatibility_methods(); #endif @@ -1004,7 +1005,7 @@ class RenderingServer : public Object { virtual void viewport_set_use_xr(RID p_viewport, bool p_use_xr) = 0; #endif // !XR_DISABLED - virtual void viewport_set_size(RID p_viewport, int p_width, int p_height) = 0; + virtual void viewport_set_size(RID p_viewport, int p_width, int p_height, int p_view_count = 1) = 0; virtual void viewport_set_active(RID p_viewport, bool p_active) = 0; virtual void viewport_set_parent_viewport(RID p_viewport, RID p_parent_viewport) = 0; virtual void viewport_set_canvas_cull_mask(RID p_viewport, uint32_t p_canvas_cull_mask) = 0; diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h index 077c048f7ab6..aeab07bb3ad4 100644 --- a/servers/rendering/rendering_server_default.h +++ b/servers/rendering/rendering_server_default.h @@ -726,7 +726,7 @@ class RenderingServerDefault : public RenderingServer { FUNC2(viewport_set_use_xr, RID, bool) #endif // XR_DISABLED - FUNC3(viewport_set_size, RID, int, int) + FUNC4(viewport_set_size, RID, int, int, int) FUNC2(viewport_set_active, RID, bool) FUNC2(viewport_set_parent_viewport, RID, RID)