@ -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 ) ;