2025-07-06 20:43:53 +03:00
# include "EraserTool.hpp"
2025-12-26 10:40:58 +03:00
# include "../DrawingProgram.hpp"
# include "../../MainProgram.hpp"
# include "../../DrawData.hpp"
2025-11-18 18:15:50 +03:00
# include <include/core/SkPathBuilder.h>
2025-07-06 20:43:53 +03:00
EraserTool : : EraserTool ( DrawingProgram & initDrawP ) :
2025-08-02 20:10:33 +03:00
DrawingProgramToolBase ( initDrawP )
{ }
DrawingProgramToolType EraserTool : : get_type ( ) {
return DrawingProgramToolType : : ERASER ;
2025-07-06 20:43:53 +03:00
}
void EraserTool : : gui_toolbox ( ) {
Toolbar & t = drawP . world . main . toolbar ;
t . gui . push_id ( " eraser tool " ) ;
t . gui . text_label_centered ( " Eraser " ) ;
t . gui . slider_scalar_field ( " relwidth " , " Size " , & drawP . controls . relativeWidth , 3.0f , 40.0f ) ;
2025-12-28 17:34:33 +03:00
t . gui . text_label ( " Erase from: " ) ;
if ( t . gui . radio_button_field ( " layer edited " , " Layer being edited " , drawP . controls . layerSelector = = DrawingProgramLayerManager : : LayerSelector : : LAYER_BEING_EDITED ) )
drawP . controls . layerSelector = DrawingProgramLayerManager : : LayerSelector : : LAYER_BEING_EDITED ;
if ( t . gui . radio_button_field ( " all visible " , " All visible layers " , drawP . controls . layerSelector = = DrawingProgramLayerManager : : LayerSelector : : ALL_VISIBLE_LAYERS ) )
drawP . controls . layerSelector = DrawingProgramLayerManager : : LayerSelector : : ALL_VISIBLE_LAYERS ;
2025-07-06 20:43:53 +03:00
t . gui . pop_id ( ) ;
}
2025-12-01 17:33:14 +03:00
bool EraserTool : : right_click_popup_gui ( Vector2f popupPos ) {
Toolbar & t = drawP . world . main . toolbar ;
t . paint_popup ( popupPos ) ;
return true ;
}
2025-12-15 15:36:42 +03:00
void EraserTool : : erase_component ( const CanvasComponentContainer : : ObjInfoSharedPtr & erasedComp ) {
erasedComponents . erase ( erasedComp ) ;
}
2025-08-02 20:39:21 +03:00
void EraserTool : : switch_tool ( DrawingProgramToolType newTool ) {
2025-12-28 17:34:33 +03:00
drawP . layerMan . erase_component_set ( erasedComponents ) ;
2025-07-23 16:04:16 +03:00
}
void EraserTool : : tool_update ( ) {
if ( drawP . controls . cursorHoveringOverCanvas )
drawP . world . main . input . hideCursor = true ;
if ( drawP . controls . leftClickHeld ) {
const Vector2f & prevMousePos = drawP . controls . leftClick ? drawP . world . main . input . mouse . pos : drawP . world . main . input . mouse . lastPos ;
SCollision : : ColliderCollection < float > cC ;
SCollision : : generate_wide_line ( cC , prevMousePos , drawP . world . main . input . mouse . pos , drawP . controls . relativeWidth * 2.0f , true ) ;
auto cCWorld = drawP . world . drawData . cam . c . collider_to_world < SCollision : : ColliderCollection < WorldScalar > , SCollision : : ColliderCollection < float > > ( cC ) ;
2025-12-28 17:34:33 +03:00
drawP . drawCache . traverse_bvh_erase_function ( cCWorld . bounds , [ & ] ( const auto & bvhNode , auto & comps ) {
2025-07-23 16:04:16 +03:00
if ( bvhNode & &
SCollision : : collide ( cC , drawP . world . drawData . cam . c . to_space ( bvhNode - > bounds . min ) ) & &
SCollision : : collide ( cC , drawP . world . drawData . cam . c . to_space ( bvhNode - > bounds . max ) ) & &
SCollision : : collide ( cC , drawP . world . drawData . cam . c . to_space ( bvhNode - > bounds . top_right ( ) ) ) & &
SCollision : : collide ( cC , drawP . world . drawData . cam . c . to_space ( bvhNode - > bounds . bottom_left ( ) ) ) ) {
2025-12-28 17:34:33 +03:00
drawP . drawCache . invalidate_cache_at_aabb ( bvhNode - > bounds ) ;
drawP . drawCache . move_components_from_bvh_node_to_set ( erasedComponents , bvhNode ) ;
2025-07-06 20:43:53 +03:00
return true ;
}
2025-07-23 16:04:16 +03:00
std : : erase_if ( comps , [ & ] ( auto & c ) {
2025-12-28 17:34:33 +03:00
if ( drawP . layerMan . component_passes_layer_selector ( c , drawP . controls . layerSelector ) & & c - > obj - > collides_with ( drawP . world . drawData . cam . c , cCWorld , cC ) ) {
2025-07-23 16:04:16 +03:00
erasedComponents . emplace ( c ) ;
2025-12-28 17:34:33 +03:00
drawP . drawCache . invalidate_cache_at_aabb ( c - > obj - > get_world_bounds ( ) ) ;
2025-07-23 16:04:16 +03:00
return true ;
}
return false ;
} ) ;
return false ;
2025-07-06 20:43:53 +03:00
} ) ;
}
2025-07-23 16:04:16 +03:00
else
2025-08-02 20:39:21 +03:00
switch_tool ( get_type ( ) ) ;
2025-07-23 16:04:16 +03:00
}
2025-07-27 16:53:22 +03:00
bool EraserTool : : prevent_undo_or_redo ( ) {
return drawP . controls . leftClickHeld ;
}
2025-07-06 20:43:53 +03:00
void EraserTool : : draw ( SkCanvas * canvas , const DrawData & drawData ) {
if ( ! drawData . main - > toolbar . io - > hoverObstructed ) {
2025-12-16 23:06:46 +03:00
SkColor4f c = drawP . world . canvasTheme . get_tool_front_color ( ) ;
2025-07-06 20:43:53 +03:00
c . fA = 0.5f ;
SkPaint linePaint ;
linePaint . setColor4f ( c ) ;
linePaint . setStyle ( SkPaint : : kStroke_Style ) ;
linePaint . setStrokeCap ( SkPaint : : kRound_Cap ) ;
linePaint . setStrokeWidth ( drawP . controls . relativeWidth * 2.0f ) ;
2025-11-18 18:15:50 +03:00
SkPathBuilder erasePath ;
2025-07-06 20:43:53 +03:00
erasePath . moveTo ( convert_vec2 < SkPoint > ( drawData . main - > input . mouse . lastPos ) ) ;
erasePath . lineTo ( convert_vec2 < SkPoint > ( drawData . main - > input . mouse . pos ) ) ;
2025-11-18 18:15:50 +03:00
canvas - > drawPath ( erasePath . detach ( ) , linePaint ) ;
2025-07-06 20:43:53 +03:00
}
}