diff --git a/src/DrawComponents/DrawTextBox.cpp b/src/DrawComponents/DrawTextBox.cpp index 122be0a..7a8668d 100644 --- a/src/DrawComponents/DrawTextBox.cpp +++ b/src/DrawComponents/DrawTextBox.cpp @@ -105,7 +105,6 @@ void DrawTextBox::set_textbox_string(const std::string& str) { void DrawTextBox::update_contained_string(DrawingProgram& drawP) { d.currentText = textBox.get_string(); - commit_update(drawP); } Vector2f DrawTextBox::get_mouse_pos(DrawingProgram& drawP) { diff --git a/src/DrawComponents/DrawTextBox.hpp b/src/DrawComponents/DrawTextBox.hpp index 4b079cc..2bc1024 100644 --- a/src/DrawComponents/DrawTextBox.hpp +++ b/src/DrawComponents/DrawTextBox.hpp @@ -25,6 +25,7 @@ class DrawTextBox : public DrawComponent { CollabTextBox::Cursor cursor; bool editing = false; bool operator==(const Data& o) const = default; + bool operator!=(const Data& o) const = default; } d; #ifndef IS_SERVER diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index 17832bf..e1ff3fc 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -640,8 +640,10 @@ void DrawingProgram::draw(SkCanvas* canvas, const DrawData& drawData) { parallel_loop_all_components([&](auto& c) { c->obj->calculate_draw_transform(drawData); }); - for(auto& c : components.client_list()) + for(auto& c : components.client_list()) { c->obj->draw(canvas, drawData); + c->obj->drawSetupData.shouldDraw = false; + } } else { if(world.main.drawProgCache.disableDrawCache) { diff --git a/src/DrawingProgram/DrawingProgramCache.cpp b/src/DrawingProgram/DrawingProgramCache.cpp index 920c92e..b3e4f04 100644 --- a/src/DrawingProgram/DrawingProgramCache.cpp +++ b/src/DrawingProgram/DrawingProgramCache.cpp @@ -279,8 +279,13 @@ void DrawingProgramCache::refresh_all_draw_cache(const DrawData& drawData) { std::deque> nodeFlatList; // We want to render children before parents, so that parents can make use of the cached children traverse_bvh_run_function(drawData.cam.viewingAreaGenerousCollider, [&](std::shared_ptr node, const std::vector& comps) { if(node && node->coords.inverseScale <= drawData.cam.c.inverseScale) { - if(!node->drawCache) + if(!node->drawCache) { nodeFlatList.emplace_front(node); + for(auto& nodeChild : node->children) { + if(!nodeChild->drawCache) + nodeFlatList.emplace_front(nodeChild); + } + } return false; } return true; @@ -297,16 +302,17 @@ void DrawingProgramCache::refresh_draw_cache(const std::shared_ptrresolution.x(), bvhNode->resolution.y()); + sk_sp drawCacheSurface; #ifdef USE_SKIA_BACKEND_GRAPHITE - drawCache.surface = SkSurfaces::RenderTarget(drawP.world.main.window.recorder(), imgInfo, skgpu::Mipmapped::kNo, drawP.world.main.window.defaultMSAASurfaceProps); + drawCacheSurface = SkSurfaces::RenderTarget(drawP.world.main.window.recorder(), imgInfo, skgpu::Mipmapped::kNo, drawP.world.main.window.defaultMSAASurfaceProps); #elif USE_SKIA_BACKEND_GANESH - drawCache.surface = SkSurfaces::RenderTarget(drawP.world.main.window.ctx.get(), skgpu::Budgeted::kNo, imgInfo, drawP.world.main.window.defaultMSAASampleCount, &drawP.world.main.window.defaultMSAASurfaceProps); + drawCacheSurface = SkSurfaces::RenderTarget(drawP.world.main.window.ctx.get(), skgpu::Budgeted::kNo, imgInfo, drawP.world.main.window.defaultMSAASampleCount, &drawP.world.main.window.defaultMSAASurfaceProps); #endif - if(!drawCache.surface) + if(!drawCacheSurface) throw std::runtime_error("[DrawingProgramCache::refresh_draw_cache] Could not make cache surface"); - SkCanvas* cacheCanvas = drawCache.surface->getCanvas(); + SkCanvas* cacheCanvas = drawCacheSurface->getCanvas(); cacheCanvas->clear(SkColor4f{0, 0, 0, 0}); @@ -317,6 +323,7 @@ void DrawingProgramCache::refresh_draw_cache(const std::shared_ptrmakeImageSnapshot()->withDefaultMipmaps(); drawCache.lastRenderTime = std::chrono::steady_clock::now(); drawCache.attachedCache = this; @@ -374,11 +381,10 @@ void DrawingProgramCache::draw_components_to_canvas(SkCanvas* canvas, const Draw lastComponentDrawn = std::max(lastComponentDrawn, drawCache.lastDrawnComponentPlacement); - SkPaint p; - p.setBlendMode(SkBlendMode::kSrc); + SkPaint srcPaint; + srcPaint.setBlendMode(SkBlendMode::kSrc); - // Note, no mipmaps here. You might need to generate mipmaps in the future (withDefaultMipmaps) - canvas->drawImage(drawCache.surface->makeTemporaryImage(), 0, 0, {SkFilterMode::kLinear, SkMipmapMode::kLinear}, &p); + canvas->drawImage(drawCache.img, 0, 0, {SkFilterMode::kLinear, SkMipmapMode::kLinear}, &srcPaint); canvas->restore(); nextCacheToRender++; @@ -396,11 +402,10 @@ void DrawingProgramCache::draw_components_to_canvas(SkCanvas* canvas, const Draw lastComponentDrawn = std::max(lastComponentDrawn, drawCache.lastDrawnComponentPlacement); - SkPaint p; - p.setBlendMode(SkBlendMode::kSrc); + SkPaint srcPaint; + srcPaint.setBlendMode(SkBlendMode::kSrc); - // Note, no mipmaps here. You might need to generate mipmaps in the future (withDefaultMipmaps) - canvas->drawImage(drawCache.surface->makeTemporaryImage(), 0, 0, {SkFilterMode::kLinear, SkMipmapMode::kLinear}, &p); + canvas->drawImage(drawCache.img, 0, 0, {SkFilterMode::kLinear, SkMipmapMode::kLinear}, &srcPaint); canvas->restore(); } diff --git a/src/DrawingProgram/DrawingProgramCache.hpp b/src/DrawingProgram/DrawingProgramCache.hpp index e6c2f4c..217551d 100644 --- a/src/DrawingProgram/DrawingProgramCache.hpp +++ b/src/DrawingProgram/DrawingProgramCache.hpp @@ -20,7 +20,7 @@ class DrawingProgramCacheBVHNode { struct DrawCacheData { uint64_t lastDrawnComponentPlacement; uint64_t firstDrawnComponentPlacement; - sk_sp surface; + sk_sp img; std::chrono::steady_clock::time_point lastRenderTime; DrawingProgramCache* attachedCache; }; diff --git a/src/DrawingProgram/TextBoxTool.cpp b/src/DrawingProgram/TextBoxTool.cpp index 33e6d1c..d55441b 100644 --- a/src/DrawingProgram/TextBoxTool.cpp +++ b/src/DrawingProgram/TextBoxTool.cpp @@ -32,7 +32,6 @@ void TextBoxTool::reset_tool() { } bool TextBoxTool::edit_gui(const std::shared_ptr& a) { - DrawTextBox::Data oldData = a->d; Toolbar& t = drawP.world.main.toolbar; t.gui.push_id("edit tool text"); t.gui.text_label_centered("Edit Text"); @@ -45,7 +44,9 @@ bool TextBoxTool::edit_gui(const std::shared_ptr& a) { t.gui.text_label("Text Color"); }); t.gui.pop_id(); - return a->d != oldData; + bool editHappened = a->d != controls.oldData; + controls.oldData = a->d; + return editHappened; } void TextBoxTool::commit_edit_updates(const std::shared_ptr& a, std::any& prevData) { @@ -93,7 +94,6 @@ bool TextBoxTool::edit_update(const std::shared_ptr& a) { mousePointCollection.recalculate_bounds(); a->textBox.setWidth(std::abs(a->d.p2.x() - a->d.p1.x())); - a->create_collider(); InputManager& input = drawP.world.main.input; auto& textbox = a->textBox; diff --git a/src/DrawingProgram/TextBoxTool.hpp b/src/DrawingProgram/TextBoxTool.hpp index 2cde572..720ddff 100644 --- a/src/DrawingProgram/TextBoxTool.hpp +++ b/src/DrawingProgram/TextBoxTool.hpp @@ -32,6 +32,7 @@ class TextBoxTool { Vector2f endAt; int drawStage = 0; std::shared_ptr intermediateItem; + DrawTextBox::Data oldData; } controls; DrawingProgram& drawP;