Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion doc/classes/RenderSceneBuffersConfiguration.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
Bias applied to mipmaps.
</member>
<member name="view_count" type="int" setter="set_view_count" getter="get_view_count" default="1">
The number of views we're rendering.
The number of views we're rendering. If larger than [code]1[/code] this will enable multiview rendering for stereoscopic or multiscopic views.
</member>
</members>
</class>
23 changes: 18 additions & 5 deletions doc/classes/RenderingServer.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3915,15 +3915,17 @@
<method name="viewport_get_render_target" qualifiers="const">
<return type="RID" />
<param index="0" name="viewport" type="RID" />
<param index="1" name="layer" type="int" default="0" />
<description>
Returns the render target for the viewport.
Returns the render target for the [param layer] of the viewport.
</description>
</method>
<method name="viewport_get_texture" qualifiers="const">
<return type="RID" />
<param index="0" name="viewport" type="RID" />
<param index="1" name="layer" type="int" default="0" />
<description>
Returns the viewport's last rendered frame.
Returns the viewport's last rendered frame for a [param layer].
</description>
</method>
<method name="viewport_get_update_mode" qualifiers="const">
Expand Down Expand Up @@ -4062,6 +4064,15 @@
Sets the viewport's global transformation matrix.
</description>
</method>
<method name="viewport_set_layer_count">
<return type="void" />
<param index="0" name="viewport" type="RID" />
<param index="1" name="layer_count" type="int" />
<description>
Sets the number of layers for this viewport. Each layer will be rendered separately.
[b]Note:[/b] This is an XR feature only, in other use cases the output of additional layers is discarded.
</description>
</method>
<method name="viewport_set_measure_render_time">
<return type="void" />
<param index="0" name="viewport" type="RID" />
Expand Down Expand Up @@ -4180,10 +4191,12 @@
<method name="viewport_set_size">
<return type="void" />
<param index="0" name="viewport" type="RID" />
<param index="1" name="width" type="int" />
<param index="2" name="height" type="int" />
<param index="1" name="layer" type="int" />
<param index="2" name="width" type="int" />
<param index="3" name="height" type="int" />
<param index="4" name="view_count" type="int" />
<description>
Sets the viewport's width and height in pixels.
Sets the viewport's [param width], [param height] in pixels and the [param view_count] for the specified [param layer].
</description>
</method>
<method name="viewport_set_snap_2d_transforms_to_pixel">
Expand Down
3 changes: 3 additions & 0 deletions doc/classes/SubViewport.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@
<member name="size_2d_override_stretch" type="bool" setter="set_size_2d_override_stretch" getter="is_size_2d_override_stretch_enabled" default="false">
If [code]true[/code], the 2D size override affects stretch as well.
</member>
<member name="view_count" type="int" setter="set_view_count" getter="get_view_count" default="1">
The number of views we're rendering. If larger than [code]1[/code] this will enable multiview rendering for stereoscopic or multiscopic views.
</member>
</members>
<constants>
<constant name="CLEAR_MODE_ALWAYS" value="0" enum="ClearMode">
Expand Down
22 changes: 16 additions & 6 deletions doc/classes/XRInterface.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@
Returns a combination of [enum Capabilities] flags providing information about the capabilities of this interface.
</description>
</method>
<method name="get_layer_count">
<return type="int" />
<description>
Returns the number of layers we require for rendering. Each layer may have different resolution, view count and camera data.
</description>
</method>
<method name="get_name" qualifiers="const">
<return type="StringName" />
<description>
Expand All @@ -37,16 +43,18 @@
</method>
<method name="get_projection_for_view">
<return type="Projection" />
<param index="0" name="view" type="int" />
<param index="1" name="aspect" type="float" />
<param index="2" name="near" type="float" />
<param index="3" name="far" type="float" />
<param index="0" name="layer" type="int" />
<param index="1" name="view" type="int" />
<param index="2" name="aspect" type="float" />
<param index="3" name="near" type="float" />
<param index="4" name="far" type="float" />
<description>
Returns the projection matrix for a view/eye.
</description>
</method>
<method name="get_render_target_size">
<return type="Vector2" />
<param index="0" name="layer" type="int" default="0" />
<description>
Returns the resolution at which we should render our intermediate results before things like lens distortion are applied by the VR platform.
</description>
Expand All @@ -72,8 +80,9 @@
</method>
<method name="get_transform_for_view">
<return type="Transform3D" />
<param index="0" name="view" type="int" />
<param index="1" name="cam_transform" type="Transform3D" />
<param index="0" name="layer" type="int" />
<param index="1" name="view" type="int" />
<param index="2" name="cam_transform" type="Transform3D" />
<description>
Returns the transform for a view/eye.
[param view] is the view/eye index.
Expand All @@ -82,6 +91,7 @@
</method>
<method name="get_view_count">
<return type="int" />
<param index="0" name="layer" type="int" default="0" />
<description>
Returns the number of views that need to be rendered for this device. 1 for Monoscopic, 2 for Stereoscopic.
</description>
Expand Down
38 changes: 38 additions & 0 deletions doc/classes/XRInterfaceExtension.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,29 @@
Return color texture into which to render (if applicable).
</description>
</method>
<method name="_get_color_texture2" qualifiers="virtual">
<return type="RID" />
<param index="0" name="layer" type="int" />
<description>
</description>
</method>
<method name="_get_depth_texture" qualifiers="virtual">
<return type="RID" />
<description>
Return depth texture into which to render (if applicable).
</description>
</method>
<method name="_get_depth_texture2" qualifiers="virtual">
<return type="RID" />
<param index="0" name="layer" type="int" />
<description>
</description>
</method>
<method name="_get_layer_count" qualifiers="virtual">
<return type="int" />
<description>
</description>
</method>
<method name="_get_name" qualifiers="virtual const">
<return type="StringName" />
<description>
Expand Down Expand Up @@ -86,6 +103,12 @@
Returns the size of our render target for this interface, this overrides the size of the [Viewport] marked as the xr viewport.
</description>
</method>
<method name="_get_render_target_size2" qualifiers="virtual">
<return type="Vector2" />
<param index="0" name="layer" type="int" />
<description>
</description>
</method>
<method name="_get_suggested_pose_names" qualifiers="virtual const">
<return type="PackedStringArray" />
<param index="0" name="tracker_name" type="StringName" />
Expand Down Expand Up @@ -125,12 +148,24 @@
Return velocity texture into which to render (if applicable).
</description>
</method>
<method name="_get_velocity_texture2" qualifiers="virtual">
<return type="RID" />
<param index="0" name="layer" type="int" />
<description>
</description>
</method>
<method name="_get_view_count" qualifiers="virtual">
<return type="int" />
<description>
Returns the number of views this interface requires, 1 for mono, 2 for stereoscopic.
</description>
</method>
<method name="_get_view_count2" qualifiers="virtual">
<return type="int" />
<param index="0" name="layer" type="int" />
<description>
</description>
</method>
<method name="_get_vrs_texture" qualifiers="virtual">
<return type="RID" />
<description>
Expand Down Expand Up @@ -239,11 +274,13 @@
</method>
<method name="get_color_texture">
<return type="RID" />
<param index="0" name="layer" type="int" default="0" />
<description>
</description>
</method>
<method name="get_depth_texture">
<return type="RID" />
<param index="0" name="layer" type="int" default="0" />
<description>
</description>
</method>
Expand All @@ -256,6 +293,7 @@
</method>
<method name="get_velocity_texture">
<return type="RID" />
<param index="0" name="layer" type="int" default="0" />
<description>
</description>
</method>
Expand Down
2 changes: 1 addition & 1 deletion drivers/gles3/storage/texture_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2548,7 +2548,7 @@ Size2i TextureStorage::render_target_get_size(RID p_render_target) const {
return rt->size;
}

void TextureStorage::render_target_set_override(RID p_render_target, RID p_color_texture, RID p_depth_texture, RID p_velocity_texture, RID p_velocity_depth_texture) {
void TextureStorage::render_target_set_override(RID p_render_target, int p_index, RID p_color_texture, RID p_depth_texture, RID p_velocity_texture, RID p_velocity_depth_texture) {
RenderTarget *rt = render_target_owner.get_or_null(p_render_target);
ERR_FAIL_NULL(rt);
ERR_FAIL_COND(rt->direct_to_screen);
Expand Down
2 changes: 1 addition & 1 deletion drivers/gles3/storage/texture_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@ class TextureStorage : public RendererTextureStorage {
virtual void render_target_set_vrs_texture(RID p_render_target, RID p_texture) override {}
virtual RID render_target_get_vrs_texture(RID p_render_target) const override { return RID(); }

virtual void render_target_set_override(RID p_render_target, RID p_color_texture, RID p_depth_texture, RID p_velocity_texture, RID p_velocity_depth_texture) override;
virtual void render_target_set_override(RID p_render_target, int p_index, RID p_color_texture, RID p_depth_texture, RID p_velocity_texture, RID p_velocity_depth_texture) override;
virtual RID render_target_get_override_color(RID p_render_target) const override;
virtual RID render_target_get_override_depth(RID p_render_target) const override;
virtual RID render_target_get_override_velocity(RID p_render_target) const override;
Expand Down
2 changes: 1 addition & 1 deletion editor/animation/animation_player_editor_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1683,7 +1683,7 @@ void AnimationPlayerEditor::_allocate_onion_layers() {
// Each capture is a viewport with a canvas item attached that renders a full-size rect with the contents of the main viewport.
onion.captures[i] = RS::get_singleton()->viewport_create();

RS::get_singleton()->viewport_set_size(onion.captures[i], capture_size.width, capture_size.height);
RS::get_singleton()->viewport_set_size(onion.captures[i], 0, capture_size.width, capture_size.height, 1);
RS::get_singleton()->viewport_set_update_mode(onion.captures[i], RS::VIEWPORT_UPDATE_ALWAYS);
RS::get_singleton()->viewport_set_transparent_background(onion.captures[i], !is_present);
RS::get_singleton()->viewport_attach_canvas(onion.captures[i], onion.capture.canvas);
Expand Down
2 changes: 1 addition & 1 deletion editor/editor_interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ Vector<Ref<Texture2D>> EditorInterface::make_mesh_previews(const Vector<Ref<Mesh
RID viewport = RS::get_singleton()->viewport_create();
RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ALWAYS);
RS::get_singleton()->viewport_set_scenario(viewport, scenario);
RS::get_singleton()->viewport_set_size(viewport, size, size);
RS::get_singleton()->viewport_set_size(viewport, 0, size, size, 1);
RS::get_singleton()->viewport_set_transparent_background(viewport, true);
RS::get_singleton()->viewport_set_active(viewport, true);
RID viewport_texture = RS::get_singleton()->viewport_get_texture(viewport);
Expand Down
6 changes: 3 additions & 3 deletions editor/inspector/editor_preview_plugins.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ EditorMaterialPreviewPlugin::EditorMaterialPreviewPlugin() {
viewport = RS::get_singleton()->viewport_create();
RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_DISABLED);
RS::get_singleton()->viewport_set_scenario(viewport, scenario);
RS::get_singleton()->viewport_set_size(viewport, 128, 128);
RS::get_singleton()->viewport_set_size(viewport, 0, 128, 128, 1);
RS::get_singleton()->viewport_set_transparent_background(viewport, true);
RS::get_singleton()->viewport_set_active(viewport, true);
viewport_texture = RS::get_singleton()->viewport_get_texture(viewport);
Expand Down Expand Up @@ -775,7 +775,7 @@ EditorMeshPreviewPlugin::EditorMeshPreviewPlugin() {
viewport = RS::get_singleton()->viewport_create();
RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_DISABLED);
RS::get_singleton()->viewport_set_scenario(viewport, scenario);
RS::get_singleton()->viewport_set_size(viewport, 128, 128);
RS::get_singleton()->viewport_set_size(viewport, 0, 128, 128, 1);
RS::get_singleton()->viewport_set_transparent_background(viewport, true);
RS::get_singleton()->viewport_set_active(viewport, true);
viewport_texture = RS::get_singleton()->viewport_get_texture(viewport);
Expand Down Expand Up @@ -890,7 +890,7 @@ Ref<Texture2D> EditorFontPreviewPlugin::generate(const Ref<Resource> &p_from, co
EditorFontPreviewPlugin::EditorFontPreviewPlugin() {
viewport = RS::get_singleton()->viewport_create();
RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_DISABLED);
RS::get_singleton()->viewport_set_size(viewport, 128, 128);
RS::get_singleton()->viewport_set_size(viewport, 0, 128, 128, 1);
RS::get_singleton()->viewport_set_active(viewport, true);
viewport_texture = RS::get_singleton()->viewport_get_texture(viewport);

Expand Down
2 changes: 1 addition & 1 deletion main/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2756,7 +2756,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
GLOBAL_DEF_RST_BASIC("xr/openxr/enabled", false);
GLOBAL_DEF_BASIC(PropertyInfo(Variant::STRING, "xr/openxr/default_action_map", PROPERTY_HINT_FILE, "*.tres"), "res://openxr_action_map.tres");
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "xr/openxr/form_factor", PROPERTY_HINT_ENUM, "Head Mounted,Handheld"), "0");
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "xr/openxr/view_configuration", PROPERTY_HINT_ENUM, "Mono,Stereo"), "1"); // "Mono,Stereo,Quad,Observer"
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "xr/openxr/view_configuration", PROPERTY_HINT_ENUM, "Mono,Stereo,Quad,Observer"), "1");
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "xr/openxr/reference_space", PROPERTY_HINT_ENUM, "Local,Stage,Local Floor"), "1");
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "xr/openxr/environment_blend_mode", PROPERTY_HINT_ENUM, "Opaque,Additive,Alpha"), "0");
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "xr/openxr/foveation_level", PROPERTY_HINT_ENUM, "Off,Low,Medium,High"), "0");
Expand Down
14 changes: 9 additions & 5 deletions modules/mobile_vr/mobile_vr_interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@ void MobileVRInterface::set_vrs_strength(float p_vrs_strength) {
xr_vrs.set_vrs_strength(p_vrs_strength);
}

uint32_t MobileVRInterface::get_view_count() {
uint32_t MobileVRInterface::get_view_count(uint32_t p_layer) {
// needs stereo...
return 2;
}
Expand Down Expand Up @@ -431,9 +431,11 @@ bool MobileVRInterface::set_play_area_mode(XRInterface::PlayAreaMode p_mode) {
return p_mode == XR_PLAY_AREA_3DOF;
}

Size2 MobileVRInterface::get_render_target_size() {
Size2 MobileVRInterface::get_render_target_size(uint32_t p_layer) {
_THREAD_SAFE_METHOD_

ERR_FAIL_COND_V(p_layer > 0, Size2());

// we use half our window size
Size2 target_size = DisplayServer::get_singleton()->window_get_size();

Expand Down Expand Up @@ -464,8 +466,9 @@ Transform3D MobileVRInterface::get_camera_transform() {
return transform_for_eye;
}

Transform3D MobileVRInterface::get_transform_for_view(uint32_t p_view, const Transform3D &p_cam_transform) {
Transform3D MobileVRInterface::get_transform_for_view(uint32_t p_layer, uint32_t p_view, const Transform3D &p_cam_transform) {
_THREAD_SAFE_METHOD_
ERR_FAIL_COND_V(p_layer > 0, Transform3D());

Transform3D transform_for_eye;

Expand Down Expand Up @@ -498,8 +501,9 @@ Transform3D MobileVRInterface::get_transform_for_view(uint32_t p_view, const Tra
return transform_for_eye;
}

Projection MobileVRInterface::get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) {
Projection MobileVRInterface::get_projection_for_view(uint32_t p_layer, uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) {
_THREAD_SAFE_METHOD_
ERR_FAIL_COND_V(p_layer > 0, Projection());

Projection eye;

Expand Down Expand Up @@ -580,7 +584,7 @@ RID MobileVRInterface::get_vrs_texture() {
uint32_t view_count = get_view_count();

for (uint32_t v = 0; v < view_count; v++) {
Projection cm = get_projection_for_view(v, aspect_ratio, 0.1, 1000.0);
Projection cm = get_projection_for_view(0, v, aspect_ratio, 0.1, 1000.0);
Vector3 center = cm.xform(Vector3(0.0, 0.0, 999.0));

eye_foci.push_back(Vector2(center.x, center.y));
Expand Down
8 changes: 4 additions & 4 deletions modules/mobile_vr/mobile_vr_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,11 +160,11 @@ class MobileVRInterface : public XRInterface {
virtual XRInterface::PlayAreaMode get_play_area_mode() const override;
virtual bool set_play_area_mode(XRInterface::PlayAreaMode p_mode) override;

virtual Size2 get_render_target_size() override;
virtual uint32_t get_view_count() override;
virtual Size2 get_render_target_size(uint32_t p_layer = 0) override;
virtual uint32_t get_view_count(uint32_t p_layer = 0) override;
virtual Transform3D get_camera_transform() override;
virtual Transform3D get_transform_for_view(uint32_t p_view, const Transform3D &p_cam_transform) override;
virtual Projection get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) override;
virtual Transform3D get_transform_for_view(uint32_t p_layer, uint32_t p_view, const Transform3D &p_cam_transform) override;
virtual Projection get_projection_for_view(uint32_t p_layer, uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) override;
virtual Vector<BlitToScreen> post_draw_viewport(RID p_render_target, const Rect2 &p_screen_rect) override;

virtual void process() override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ void OpenXRViewportCompositionLayerProvider::set_viewport(RID p_viewport, Size2i
if (subviewport.viewport != p_viewport) {
if (subviewport.viewport.is_valid()) {
RID rt = rs->viewport_get_render_target(subviewport.viewport);
RSG::texture_storage->render_target_set_override(rt, RID(), RID(), RID(), RID());
RSG::texture_storage->render_target_set_override(rt, 0, RID(), RID(), RID(), RID());
}

subviewport.viewport = p_viewport;
Expand Down Expand Up @@ -333,7 +333,7 @@ void OpenXRViewportCompositionLayerProvider::on_pre_render() {
if (update_and_acquire_swapchain(update_mode == RS::VIEWPORT_UPDATE_ONCE)) {
// Render to our XR swapchain image.
RID rt = rs->viewport_get_render_target(subviewport.viewport);
RSG::texture_storage->render_target_set_override(rt, get_current_swapchain_texture(), RID(), RID(), RID());
RSG::texture_storage->render_target_set_override(rt, 0, get_current_swapchain_texture(), RID(), RID(), RID());
}
}
}
Expand Down
Loading
Loading