diff options
Diffstat (limited to 'servers/rendering/renderer_viewport.cpp')
-rw-r--r-- | servers/rendering/renderer_viewport.cpp | 71 |
1 files changed, 61 insertions, 10 deletions
diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp index 445a1b265e..31d5a9074c 100644 --- a/servers/rendering/renderer_viewport.cpp +++ b/servers/rendering/renderer_viewport.cpp @@ -31,6 +31,7 @@ #include "renderer_viewport.h" #include "core/config/project_settings.h" +#include "core/math/transform_interpolator.h" #include "core/object/worker_thread_pool.h" #include "renderer_canvas_cull.h" #include "renderer_scene_cull.h" @@ -220,6 +221,7 @@ void RendererViewport::_configure_3d_render_buffers(Viewport *p_viewport) { } void RendererViewport::_draw_3d(Viewport *p_viewport) { +#ifndef _3D_DISABLED RENDER_TIMESTAMP("> Render 3D Scene"); Ref<XRInterface> xr_interface; @@ -246,6 +248,7 @@ void RendererViewport::_draw_3d(Viewport *p_viewport) { RSG::scene->render_camera(p_viewport->render_buffers, p_viewport->camera, p_viewport->scenario, p_viewport->self, p_viewport->internal_size, p_viewport->jitter_phase_count, screen_mesh_lod_threshold, p_viewport->shadow_atlas, xr_interface, &p_viewport->render_info); RENDER_TIMESTAMP("< Render 3D Scene"); +#endif // _3D_DISABLED } void RendererViewport::_draw_viewport(Viewport *p_viewport) { @@ -337,7 +340,14 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { if (!F->enabled) { continue; } - F->xform_cache = xf * F->xform; + + if (!RSG::canvas->_interpolation_data.interpolation_enabled || !F->interpolated) { + F->xform_cache = xf * F->xform_curr; + } else { + real_t f = Engine::get_singleton()->get_physics_interpolation_fraction(); + TransformInterpolator::interpolate_transform_2d(F->xform_prev, F->xform_curr, F->xform_cache, f); + F->xform_cache = xf * F->xform_cache; + } if (sdf_rect.intersects_transformed(F->xform_cache, F->aabb_cache)) { F->next = occluders; @@ -376,7 +386,14 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { Vector2 offset = tsize / 2.0; cl->rect_cache = Rect2(-offset + cl->texture_offset, tsize); - cl->xform_cache = xf * cl->xform; + + if (!RSG::canvas->_interpolation_data.interpolation_enabled || !cl->interpolated) { + cl->xform_cache = xf * cl->xform_curr; + } else { + real_t f = Engine::get_singleton()->get_physics_interpolation_fraction(); + TransformInterpolator::interpolate_transform_2d(cl->xform_prev, cl->xform_curr, cl->xform_cache, f); + cl->xform_cache = xf * cl->xform_cache; + } if (clip_rect.intersects_transformed(cl->xform_cache, cl->rect_cache)) { cl->filter_next_ptr = lights; @@ -384,7 +401,7 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { Transform2D scale; scale.scale(cl->rect_cache.size); scale.columns[2] = cl->rect_cache.position; - cl->light_shader_xform = xf * cl->xform * scale; + cl->light_shader_xform = cl->xform_cache * scale; if (cl->use_shadow) { cl->shadows_next_ptr = lights_with_shadow; if (lights_with_shadow == nullptr) { @@ -404,7 +421,13 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { if (cl->enabled) { cl->filter_next_ptr = directional_lights; directional_lights = cl; - cl->xform_cache = xf * cl->xform; + if (!RSG::canvas->_interpolation_data.interpolation_enabled || !cl->interpolated) { + cl->xform_cache = xf * cl->xform_curr; + } else { + real_t f = Engine::get_singleton()->get_physics_interpolation_fraction(); + TransformInterpolator::interpolate_transform_2d(cl->xform_prev, cl->xform_curr, cl->xform_cache, f); + cl->xform_cache = xf * cl->xform_cache; + } cl->xform_cache.columns[2] = Vector2(); //translation is pointless if (cl->use_shadow) { cl->shadows_next_ptr = directional_lights_with_shadow; @@ -439,7 +462,13 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { if (!F->enabled) { continue; } - F->xform_cache = xf * F->xform; + if (!RSG::canvas->_interpolation_data.interpolation_enabled || !F->interpolated) { + F->xform_cache = xf * F->xform_curr; + } else { + real_t f = Engine::get_singleton()->get_physics_interpolation_fraction(); + TransformInterpolator::interpolate_transform_2d(F->xform_prev, F->xform_curr, F->xform_cache, f); + F->xform_cache = xf * F->xform_cache; + } if (shadow_rect.intersects_transformed(F->xform_cache, F->aabb_cache)) { F->next = occluders; occluders = F; @@ -519,7 +548,13 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { if (!F->enabled) { continue; } - F->xform_cache = xf * F->xform; + if (!RSG::canvas->_interpolation_data.interpolation_enabled || !F->interpolated) { + F->xform_cache = xf * F->xform_curr; + } else { + real_t f = Engine::get_singleton()->get_physics_interpolation_fraction(); + TransformInterpolator::interpolate_transform_2d(F->xform_prev, F->xform_curr, F->xform_cache, f); + F->xform_cache = xf * F->xform_cache; + } Transform2D localizer = F->xform_cache.affine_inverse(); for (int j = 0; j < point_count; j++) { @@ -629,6 +664,7 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { void RendererViewport::draw_viewports(bool p_swap_buffers) { timestamp_vp_map.clear(); +#ifndef _3D_DISABLED // get our xr interface in case we need it Ref<XRInterface> xr_interface; XRServer *xr_server = XRServer::get_singleton(); @@ -639,6 +675,7 @@ void RendererViewport::draw_viewports(bool p_swap_buffers) { // retrieve the interface responsible for rendering xr_interface = xr_server->get_primary_interface(); } +#endif // _3D_DISABLED if (Engine::get_singleton()->is_editor_hint()) { set_default_clear_color(GLOBAL_GET("rendering/environment/defaults/default_clear_color")); @@ -671,6 +708,7 @@ void RendererViewport::draw_viewports(bool p_swap_buffers) { bool visible = vp->viewport_to_screen_rect != Rect2(); +#ifndef _3D_DISABLED if (vp->use_xr) { if (xr_interface.is_valid()) { // Ignore update mode we have to commit frames to our XR interface @@ -684,7 +722,9 @@ void RendererViewport::draw_viewports(bool p_swap_buffers) { visible = false; vp->size = Size2(); } - } else { + } else +#endif // _3D_DISABLED + { if (vp->update_mode == RS::VIEWPORT_UPDATE_ALWAYS || vp->update_mode == RS::VIEWPORT_UPDATE_ONCE) { visible = true; } @@ -722,6 +762,7 @@ void RendererViewport::draw_viewports(bool p_swap_buffers) { RENDER_TIMESTAMP("> Render Viewport " + itos(i)); RSG::texture_storage->render_target_set_as_unused(vp->render_target); +#ifndef _3D_DISABLED if (vp->use_xr && xr_interface.is_valid()) { // Inform XR interface we're about to render its viewport, // if this returns false we don't render. @@ -758,9 +799,9 @@ void RendererViewport::draw_viewports(bool p_swap_buffers) { RSG::rasterizer->end_viewport(p_swap_buffers && blits.size() > 0); } } - } else { - RSG::texture_storage->render_target_set_override(vp->render_target, RID(), RID(), RID()); - + } else +#endif // _3D_DISABLED + { RSG::scene->set_debug_draw_mode(vp->debug_draw); // render standard mono camera @@ -1019,6 +1060,13 @@ void RendererViewport::viewport_set_update_mode(RID p_viewport, RS::ViewportUpda viewport->update_mode = p_mode; } +RS::ViewportUpdateMode RendererViewport::viewport_get_update_mode(RID p_viewport) const { + Viewport *viewport = viewport_owner.get_or_null(p_viewport); + ERR_FAIL_NULL_V(viewport, RS::VIEWPORT_UPDATE_DISABLED); + + return viewport->update_mode; +} + RID RendererViewport::viewport_get_render_target(RID p_viewport) const { const Viewport *viewport = viewport_owner.get_or_null(p_viewport); ERR_FAIL_NULL_V(viewport, RID()); @@ -1148,6 +1196,9 @@ void RendererViewport::viewport_set_canvas_transform(RID p_viewport, RID p_canva void RendererViewport::viewport_set_transparent_background(RID p_viewport, bool p_enabled) { Viewport *viewport = viewport_owner.get_or_null(p_viewport); ERR_FAIL_NULL(viewport); + if (viewport->transparent_bg == p_enabled) { + return; + } RSG::texture_storage->render_target_set_transparent(viewport->render_target, p_enabled); viewport->transparent_bg = p_enabled; |