2025-07-24 16:35:48 +03:00
|
|
|
#pragma once
|
|
|
|
|
#include "DrawingProgramCache.hpp"
|
|
|
|
|
|
|
|
|
|
class DrawingProgram;
|
|
|
|
|
|
|
|
|
|
class DrawingProgramSelection {
|
|
|
|
|
public:
|
|
|
|
|
DrawingProgramSelection(DrawingProgram& initDrawP);
|
|
|
|
|
void add_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection<float>& cC);
|
|
|
|
|
void deselect_all();
|
|
|
|
|
void update();
|
2025-07-24 19:35:51 +03:00
|
|
|
void draw_components(SkCanvas* canvas, const DrawData& drawData);
|
|
|
|
|
void draw_gui(SkCanvas* canvas, const DrawData& drawData);
|
2025-07-24 16:35:48 +03:00
|
|
|
bool is_something_selected();
|
2025-07-24 20:36:40 +03:00
|
|
|
bool mouse_collided_with_selection();
|
2025-07-26 21:20:14 +03:00
|
|
|
bool is_selected(const CollabListType::ObjectInfoPtr& objToCheck);
|
|
|
|
|
const std::unordered_set<CollabListType::ObjectInfoPtr>& get_selected_set();
|
2025-07-24 16:35:48 +03:00
|
|
|
private:
|
2025-07-24 20:36:40 +03:00
|
|
|
bool mouse_collided_with_selection_aabb();
|
|
|
|
|
bool mouse_collided_with_scale_point();
|
2025-07-25 10:00:39 +03:00
|
|
|
bool mouse_collided_with_rotate_center_handle_point();
|
|
|
|
|
bool mouse_collided_with_rotate_handle_point();
|
2025-07-24 20:36:40 +03:00
|
|
|
|
2025-07-24 16:35:48 +03:00
|
|
|
void calculate_aabb();
|
2025-07-25 10:00:39 +03:00
|
|
|
void calculate_initial_rotate_center_location();
|
2025-07-24 19:35:51 +03:00
|
|
|
void rebuild_cam_space();
|
|
|
|
|
|
2025-07-25 10:00:39 +03:00
|
|
|
Vector2f get_rotation_point_pos_from_angle(double angle);
|
|
|
|
|
|
2025-07-24 19:35:51 +03:00
|
|
|
SCollision::AABB<WorldScalar> initialSelectionAABB;
|
|
|
|
|
SCollision::ColliderCollection<float> camSpaceSelection;
|
|
|
|
|
|
2025-07-25 10:00:39 +03:00
|
|
|
std::array<WorldVec, 4> selectionRectPoints;
|
2025-07-24 16:35:48 +03:00
|
|
|
|
|
|
|
|
CoordSpaceHelper selectionTransformCoords;
|
|
|
|
|
std::unordered_set<CollabListType::ObjectInfoPtr> selectedSet;
|
|
|
|
|
DrawingProgramCache cache;
|
|
|
|
|
DrawingProgram& drawP;
|
2025-07-24 19:35:51 +03:00
|
|
|
|
2025-07-24 20:36:40 +03:00
|
|
|
enum class TransformOperation {
|
|
|
|
|
NONE = 0,
|
|
|
|
|
TRANSLATE,
|
|
|
|
|
SCALE,
|
2025-07-25 10:00:39 +03:00
|
|
|
ROTATE_RELOCATE_CENTER,
|
2025-07-24 20:36:40 +03:00
|
|
|
ROTATE
|
2025-07-25 10:00:39 +03:00
|
|
|
} transformOpHappening = TransformOperation::NONE;
|
|
|
|
|
|
|
|
|
|
CoordSpaceHelper startingSelectionTransformCoords;
|
2025-07-24 20:36:40 +03:00
|
|
|
|
|
|
|
|
struct ScaleData {
|
|
|
|
|
WorldVec startPos;
|
|
|
|
|
WorldVec centerPos;
|
|
|
|
|
WorldVec currentPos;
|
|
|
|
|
Vector2f handlePoint;
|
|
|
|
|
} scaleData;
|
2025-07-25 10:00:39 +03:00
|
|
|
|
|
|
|
|
struct RotationData {
|
|
|
|
|
WorldVec centerPos;
|
|
|
|
|
Vector2f centerHandlePoint;
|
|
|
|
|
Vector2f handlePoint;
|
|
|
|
|
double rotationAngle;
|
|
|
|
|
} rotateData;
|
2025-07-24 16:35:48 +03:00
|
|
|
};
|