#pragma once #include "DrawingProgramCache.hpp" class DrawingProgram; class DrawingProgramSelection { public: DrawingProgramSelection(DrawingProgram& initDrawP); void add_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection& cC); void deselect_all(); void update(); void draw_components(SkCanvas* canvas, const DrawData& drawData); void draw_gui(SkCanvas* canvas, const DrawData& drawData); bool is_something_selected(); bool mouse_collided_with_selection(); private: bool mouse_collided_with_selection_aabb(); bool mouse_collided_with_scale_point(); bool mouse_collided_with_rotate_center_handle_point(); bool mouse_collided_with_rotate_handle_point(); void calculate_aabb(); void calculate_initial_rotate_center_location(); void rebuild_cam_space(); Vector2f get_rotation_point_pos_from_angle(double angle); SCollision::AABB initialSelectionAABB; SCollision::ColliderCollection camSpaceSelection; std::array selectionRectPoints; CoordSpaceHelper selectionTransformCoords; std::unordered_set selectedSet; DrawingProgramCache cache; DrawingProgram& drawP; enum class TransformOperation { NONE = 0, TRANSLATE, SCALE, ROTATE_RELOCATE_CENTER, ROTATE } transformOpHappening = TransformOperation::NONE; CoordSpaceHelper startingSelectionTransformCoords; struct ScaleData { WorldVec startPos; WorldVec centerPos; WorldVec currentPos; Vector2f handlePoint; } scaleData; struct RotationData { WorldVec centerPos; Vector2f centerHandlePoint; Vector2f handlePoint; double rotationAngle; } rotateData; };