diff options
author | Rémi Verschelde <remi@verschelde.fr> | 2021-06-17 18:15:11 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-17 18:15:11 +0200 |
commit | 13c4796693c3c32993cd49b226fc9c78ad376f6d (patch) | |
tree | b7aa900f5ba2f65586f5f6451e6b288041dc3ff8 /servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp | |
parent | 17ded9a152f41d3e9ef7aa567065fe13f8e0e33d (diff) | |
parent | 94d31ac327a8fe6ff7c007b34cb25772bf96d17e (diff) | |
download | redot-engine-13c4796693c3c32993cd49b226fc9c78ad376f6d.tar.gz |
Merge pull request #49685 from reduz/implement-drawing-animation-slices-in-canvas
Implement animation slice drawing in CanvasItem
Diffstat (limited to 'servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp')
-rw-r--r-- | servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index 9d325fe69b..fe6d3be82e 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -464,8 +464,15 @@ void RendererCanvasRenderRD::_render_item(RD::DrawListID p_draw_list, RID p_rend RID last_texture; Size2 texpixel_size; + bool skipping = false; + const Item::Command *c = p_item->commands; while (c) { + if (skipping && c->type != Item::Command::TYPE_ANIMATION_SLICE) { + c = c->next; + continue; + } + push_constant.flags = base_flags | (push_constant.flags & (FLAGS_DEFAULT_NORMAL_MAP_USED | FLAGS_DEFAULT_SPECULAR_MAP_USED)); //reset on each command for sanity, keep canvastexture binding config switch (c->type) { @@ -879,6 +886,14 @@ void RendererCanvasRenderRD::_render_item(RD::DrawListID p_draw_list, RID p_rend } } break; + case Item::Command::TYPE_ANIMATION_SLICE: { + const Item::CommandAnimationSlice *as = static_cast<const Item::CommandAnimationSlice *>(c); + double current_time = RendererCompositorRD::singleton->get_total_time(); + double local_time = Math::fposmod(current_time - as->offset, as->animation_length); + skipping = !(local_time >= as->slice_begin && local_time < as->slice_end); + + RenderingServerDefault::redraw_request(); // animation visible means redraw request + } break; } c = c->next; |