|
@@ -62,6 +62,16 @@ static Transform2D _canvas_get_transform(VisualServerViewport::Viewport *p_viewp
|
|
|
return xf;
|
|
|
}
|
|
|
|
|
|
+void VisualServerViewport::_draw_3d(Viewport *p_viewport, ARVRInterface::Eyes p_eye) {
|
|
|
+ Ref<ARVRInterface> arvr_interface = ARVRServer::get_singleton()->get_primary_interface();
|
|
|
+
|
|
|
+ if (p_viewport->use_arvr && arvr_interface.is_valid()) {
|
|
|
+ VSG::scene->render_camera(arvr_interface, p_eye, p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
|
|
+ } else {
|
|
|
+ VSG::scene->render_camera(p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void VisualServerViewport::_draw_viewport(Viewport *p_viewport, ARVRInterface::Eyes p_eye) {
|
|
|
|
|
|
/* Camera should always be BEFORE any other 3D */
|
|
@@ -89,13 +99,7 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport, ARVRInterface::E
|
|
|
}
|
|
|
|
|
|
if (!scenario_draw_canvas_bg && can_draw_3d) {
|
|
|
- Ref<ARVRInterface> arvr_interface = ARVRServer::get_singleton()->get_primary_interface();
|
|
|
-
|
|
|
- if (p_viewport->use_arvr && arvr_interface.is_valid()) {
|
|
|
- VSG::scene->render_camera(arvr_interface, p_eye, p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
|
|
- } else {
|
|
|
- VSG::scene->render_camera(p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
|
|
- }
|
|
|
+ _draw_3d(p_viewport, p_eye);
|
|
|
}
|
|
|
|
|
|
if (!p_viewport->hide_canvas) {
|
|
@@ -201,17 +205,13 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport, ARVRInterface::E
|
|
|
//VSG::canvas_render->reset_canvas();
|
|
|
}
|
|
|
|
|
|
- VSG::rasterizer->restore_render_target();
|
|
|
+ VSG::rasterizer->restore_render_target(!scenario_draw_canvas_bg && can_draw_3d);
|
|
|
|
|
|
if (scenario_draw_canvas_bg && canvas_map.front() && canvas_map.front()->key().get_layer() > scenario_canvas_max_layer) {
|
|
|
- Ref<ARVRInterface> arvr_interface = ARVRServer::get_singleton()->get_primary_interface();
|
|
|
-
|
|
|
if (!can_draw_3d) {
|
|
|
VSG::scene->render_empty_scene(p_viewport->scenario, p_viewport->shadow_atlas);
|
|
|
- } else if (p_viewport->use_arvr && arvr_interface.is_valid()) {
|
|
|
- VSG::scene->render_camera(arvr_interface, p_eye, p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
|
|
} else {
|
|
|
- VSG::scene->render_camera(p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
|
|
+ _draw_3d(p_viewport, p_eye);
|
|
|
}
|
|
|
scenario_draw_canvas_bg = false;
|
|
|
}
|
|
@@ -237,14 +237,10 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport, ARVRInterface::E
|
|
|
i++;
|
|
|
|
|
|
if (scenario_draw_canvas_bg && E->key().get_layer() >= scenario_canvas_max_layer) {
|
|
|
- Ref<ARVRInterface> arvr_interface = ARVRServer::get_singleton()->get_primary_interface();
|
|
|
-
|
|
|
if (!can_draw_3d) {
|
|
|
VSG::scene->render_empty_scene(p_viewport->scenario, p_viewport->shadow_atlas);
|
|
|
- } else if (p_viewport->use_arvr && arvr_interface.is_valid()) {
|
|
|
- VSG::scene->render_camera(arvr_interface, p_eye, p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
|
|
} else {
|
|
|
- VSG::scene->render_camera(p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
|
|
+ _draw_3d(p_viewport, p_eye);
|
|
|
}
|
|
|
|
|
|
scenario_draw_canvas_bg = false;
|
|
@@ -252,14 +248,10 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport, ARVRInterface::E
|
|
|
}
|
|
|
|
|
|
if (scenario_draw_canvas_bg) {
|
|
|
- Ref<ARVRInterface> arvr_interface = ARVRServer::get_singleton()->get_primary_interface();
|
|
|
-
|
|
|
if (!can_draw_3d) {
|
|
|
VSG::scene->render_empty_scene(p_viewport->scenario, p_viewport->shadow_atlas);
|
|
|
- } else if (p_viewport->use_arvr && arvr_interface.is_valid()) {
|
|
|
- VSG::scene->render_camera(arvr_interface, p_eye, p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
|
|
} else {
|
|
|
- VSG::scene->render_camera(p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
|
|
+ _draw_3d(p_viewport, p_eye);
|
|
|
}
|
|
|
|
|
|
scenario_draw_canvas_bg = false;
|
|
@@ -308,12 +300,22 @@ void VisualServerViewport::draw_viewports() {
|
|
|
|
|
|
// render mono or left eye first
|
|
|
ARVRInterface::Eyes leftOrMono = arvr_interface->is_stereo() ? ARVRInterface::EYE_LEFT : ARVRInterface::EYE_MONO;
|
|
|
+
|
|
|
+ // check for an external texture destination for our left eye/mono
|
|
|
+ VSG::storage->render_target_set_external_texture(vp->render_target, arvr_interface->get_external_texture_for_eye(leftOrMono));
|
|
|
+
|
|
|
+ // set our render target as current
|
|
|
VSG::rasterizer->set_current_render_target(vp->render_target);
|
|
|
+
|
|
|
+ // and draw left eye/mono
|
|
|
_draw_viewport(vp, leftOrMono);
|
|
|
arvr_interface->commit_for_eye(leftOrMono, vp->render_target, vp->viewport_to_screen_rect);
|
|
|
|
|
|
// render right eye
|
|
|
if (leftOrMono == ARVRInterface::EYE_LEFT) {
|
|
|
+ // check for an external texture destination for our right eye
|
|
|
+ VSG::storage->render_target_set_external_texture(vp->render_target, arvr_interface->get_external_texture_for_eye(ARVRInterface::EYE_RIGHT));
|
|
|
+
|
|
|
// commit for eye may have changed the render target
|
|
|
VSG::rasterizer->set_current_render_target(vp->render_target);
|
|
|
|
|
@@ -324,6 +326,7 @@ void VisualServerViewport::draw_viewports() {
|
|
|
// and for our frame timing, mark when we've finished committing our eyes
|
|
|
ARVRServer::get_singleton()->_mark_commit();
|
|
|
} else {
|
|
|
+ VSG::storage->render_target_set_external_texture(vp->render_target, 0);
|
|
|
VSG::rasterizer->set_current_render_target(vp->render_target);
|
|
|
|
|
|
VSG::scene_render->set_debug_draw_mode(vp->debug_draw);
|