Improved brush tool performance

This commit is contained in:
Yousef Khadadeh 2026-05-18 17:57:02 +03:00
parent 8df34da421
commit 0a474c16a0
14 changed files with 33 additions and 27 deletions

View file

@ -45,8 +45,10 @@ void BrushTool::switch_tool(DrawingProgramToolType newTool) {
}
void BrushTool::erase_component(CanvasComponentContainer::ObjInfo* erasedComp) {
if(objInfoBeingEdited == erasedComp)
if(objInfoBeingEdited == erasedComp) {
objInfoBeingEdited = nullptr;
commitUpdate = false;
}
}
void BrushTool::smooth_out_points(float smoothFactor) {
@ -171,8 +173,7 @@ void BrushTool::input_mouse_motion_callback(const InputManager::MouseMotionCallb
}
smooth_out_points(drawP.world.main.conf.tabletOptions.brushPressureSmoothingFactor);
containerPtr->send_comp_update(drawP, false);
containerPtr->commit_update(drawP);
commitUpdate = true;
}
}
@ -190,8 +191,7 @@ void BrushTool::input_pen_axis_callback(const InputManager::PenAxisCallbackArgs&
float width = toolConfig.get_relative_width_stroke_size(drawP, containerPtr->coords.inverseScale).first.value() * penWidth;
brushPoints.back().width = std::max(brushPoints.back().width, width);
smooth_out_points(drawP.world.main.conf.tabletOptions.brushPressureSmoothingFactor);
containerPtr->send_comp_update(drawP, false);
containerPtr->commit_update(drawP);
commitUpdate = true;
}
}
}
@ -222,6 +222,13 @@ bool BrushTool::extensive_point_checking_back(const BrushStrokeCanvasComponent&
void BrushTool::tool_update() {
if(!drawP.world.main.g.gui.cursor_obstructed())
drawP.world.main.input.hideCursor = true;
if(commitUpdate && objInfoBeingEdited) {
NetworkingObjects::NetObjOwnerPtr<CanvasComponentContainer>& containerPtr = objInfoBeingEdited->obj;
containerPtr->send_comp_update(drawP, false);
containerPtr->commit_update(drawP);
commitUpdate = false;
}
}
void BrushTool::commit_stroke() {
@ -237,6 +244,7 @@ void BrushTool::commit_stroke() {
components->erase(components, containerPtr->objInfo);
}
objInfoBeingEdited = nullptr;
commitUpdate = false;
}
}

View file

@ -54,6 +54,7 @@ class BrushTool : public DrawingProgramToolBase {
float penWidth = 1.0f;
bool addedTemporaryPoint = false;
bool commitUpdate = false;
CanvasComponentContainer::ObjInfo* objInfoBeingEdited = nullptr;

View file

@ -318,10 +318,8 @@ bool EditTool::is_editable(CanvasComponentContainer::ObjInfo* comp) {
void EditTool::tool_update() {
if(objInfoBeingEdited) {
compEditTool->edit_update();
objInfoBeingEdited->obj->send_comp_update(drawP, false);
bool shouldNotReset = compEditTool->edit_update();
if(!shouldNotReset)
switch_tool(get_type());
}
}

View file

@ -36,7 +36,7 @@ void BrushEditTool::edit_gui(Toolbar& t) {
auto& a = static_cast<BrushStrokeCanvasComponent&>(comp->obj->get_comp());
auto& gui = drawP.world.main.g.gui;
auto commit_update_func = [&] { comp->obj->commit_update(drawP); };
auto commit_update_func = [&] { commitUpdate = true; };
gui.new_id("edit tool brush", [&] {
text_label_centered(gui, "Edit Brush Stroke");
@ -53,7 +53,7 @@ void BrushEditTool::gui_phone_toolbox(PhoneDrawingProgramScreen& t) {
auto& a = static_cast<BrushStrokeCanvasComponent&>(comp->obj->get_comp());
auto& gui = drawP.world.main.g.gui;
auto commit_update_func = [&] { comp->obj->commit_update(drawP); };
auto commit_update_func = [&] { commitUpdate = true; };
gui.new_id("edit tool brush", [&] {
left_to_right_line_layout(gui, [&]() {
@ -78,6 +78,9 @@ void BrushEditTool::edit_start(EditTool& editTool, std::any& prevData) {
void BrushEditTool::commit_edit_updates(std::any& prevData) {
}
bool BrushEditTool::edit_update() {
return true;
void BrushEditTool::edit_update() {
if(commitUpdate) {
comp->obj->commit_update(drawP);
commitUpdate = false;
}
}

View file

@ -28,10 +28,11 @@ class BrushEditTool : public DrawingProgramEditToolBase {
BrushEditTool(DrawingProgram& initDrawP, CanvasComponentContainer::ObjInfo* initComp);
virtual void edit_start(EditTool& editTool, std::any& prevData) override;
virtual void commit_edit_updates(std::any& prevData) override;
virtual bool edit_update() override;
virtual void edit_update() override;
virtual void edit_gui(Toolbar& t) override;
virtual void gui_phone_toolbox(PhoneDrawingProgramScreen& t) override;
virtual Vector4f* color_picker_color(Vector4f* oldColor) override;
private:
bool commitUpdate = false;
Vector4f oldColor;
};

View file

@ -30,7 +30,7 @@ class DrawingProgramEditToolBase {
DrawingProgramEditToolBase(DrawingProgram& initDrawP, CanvasComponentContainer::ObjInfo* initComp);
virtual void edit_start(EditTool& editTool, std::any& prevData) = 0;
virtual void commit_edit_updates(std::any& prevData) = 0;
virtual bool edit_update() = 0;
virtual void edit_update() = 0;
virtual void edit_gui(Toolbar& t) = 0;
virtual void gui_phone_toolbox(PhoneDrawingProgramScreen& t) = 0;
virtual void right_click_popup_gui(Toolbar& t, Vector2f popupPos);

View file

@ -122,6 +122,5 @@ void EllipseDrawEditTool::edit_start(EditTool& editTool, std::any& prevData) {
void EllipseDrawEditTool::commit_edit_updates(std::any& prevData) {
}
bool EllipseDrawEditTool::edit_update() {
return true;
void EllipseDrawEditTool::edit_update() {
}

View file

@ -31,11 +31,10 @@ class EllipseDrawEditTool : public DrawingProgramEditToolBase {
virtual void edit_start(EditTool& editTool, std::any& prevData) override;
virtual void gui_phone_toolbox(PhoneDrawingProgramScreen& t) override;
virtual void commit_edit_updates(std::any& prevData) override;
virtual bool edit_update() override;
virtual void edit_update() override;
virtual void edit_gui(Toolbar& t) override;
virtual Vector4f* color_picker_color(Vector4f* oldColor) override;
private:
void commit();
std::optional<EllipseCanvasComponent::Data> oldData;
};

View file

@ -59,8 +59,7 @@ void ImageEditTool::commit_edit_updates(std::any& prevData) {
comp->obj->commit_update(drawP);
}
bool ImageEditTool::edit_update() {
return true;
void ImageEditTool::edit_update() {
}
void ImageEditTool::edit_gui(Toolbar& t) {

View file

@ -27,7 +27,7 @@ class ImageEditTool : public DrawingProgramEditToolBase {
ImageEditTool(DrawingProgram& initDrawP, CanvasComponentContainer::ObjInfo* initComp);
virtual void edit_start(EditTool& editTool, std::any& prevData) override;
virtual void commit_edit_updates(std::any& prevData) override;
virtual bool edit_update() override;
virtual void edit_update() override;
virtual void edit_gui(Toolbar& t) override;
virtual void gui_phone_toolbox(PhoneDrawingProgramScreen& t) override;
};

View file

@ -120,6 +120,5 @@ void RectDrawEditTool::edit_start(EditTool& editTool, std::any& prevData) {
void RectDrawEditTool::commit_edit_updates(std::any& prevData) {
}
bool RectDrawEditTool::edit_update() {
return true;
void RectDrawEditTool::edit_update() {
}

View file

@ -29,7 +29,7 @@ class RectDrawEditTool : public DrawingProgramEditToolBase {
RectDrawEditTool(DrawingProgram& initDrawP, CanvasComponentContainer::ObjInfo* initComp);
virtual void edit_start(EditTool& editTool, std::any& prevData) override;
virtual void commit_edit_updates(std::any& prevData) override;
virtual bool edit_update() override;
virtual void edit_update() override;
virtual void edit_gui(Toolbar& t) override;
virtual void gui_phone_toolbox(PhoneDrawingProgramScreen& t) override;
virtual Vector4f* color_picker_color(Vector4f* oldColor) override;

View file

@ -796,6 +796,5 @@ void TextBoxEditTool::edit_start(EditTool& editTool, std::any& prevData) {
CustomEvents::emit_event(CustomEvents::RefreshTextBoxInputEvent{});
}
bool TextBoxEditTool::edit_update() {
return true;
void TextBoxEditTool::edit_update() {
}

View file

@ -31,7 +31,7 @@ class TextBoxEditTool : public DrawingProgramEditToolBase {
virtual void edit_start(EditTool& editTool, std::any& prevData) override;
virtual void commit_edit_updates(std::any& prevData) override;
virtual bool edit_update() override;
virtual void edit_update() override;
virtual void edit_gui(Toolbar& t) override;
virtual void gui_phone_toolbox(PhoneDrawingProgramScreen& t) override;
virtual void right_click_popup_gui(Toolbar& t, Vector2f popupPos) override;