#pragma once #include "CanvasComponent.hpp" #include "Helpers/SCollision.hpp" #include #include #include struct BrushStrokeCanvasComponentPoint { Vector2f pos; float width; template void serialize(Archive& a) { a(pos, width); } }; class BrushStrokeCanvasComponent : public CanvasComponent { public: constexpr static float DRAW_MINIMUM_LIMIT = 0.3; virtual CanvasComponentType get_type() const override; virtual void save(cereal::PortableBinaryOutputArchive& a) const override; virtual void load(cereal::PortableBinaryInputArchive& a) override; virtual void save_file(cereal::PortableBinaryOutputArchive& a) const override; virtual void load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version) override; struct Data { std::vector points; Vector4f color; bool hasRoundCaps; }; std::shared_ptr d = std::make_shared(); // It's a pointer here since brush strokes cant be edited virtual void set_data_from(const CanvasComponent& other) override; private: virtual void draw(SkCanvas* canvas, const DrawData& drawData) const override; virtual void initialize_draw_data(DrawingProgram& drawP) override; virtual bool collides_within_coords(const SCollision::ColliderCollection& checkAgainst) const override; void create_collider(); virtual SCollision::AABB get_obj_coord_bounds() const override; std::shared_ptr brushPath; SCollision::AABB bounds; std::array, 2> brushPathLOD; std::vector every_nth_point_include_front_and_back(const std::vector& pts, size_t n) const; void add_precheck_aabb_level(size_t level, const std::vector>& levelArray); std::vector> precheckAABBLevels; void create_triangles(const std::function& passTriangleFunc, const std::vector& smoothedPoints, size_t skipVertexCount, std::shared_ptr bPath) const; std::vector get_wedge_indices(const std::vector& points) const; std::vector smooth_points(size_t beginIndex, size_t endIndex, unsigned numOfDivisions) const; std::vector smooth_points_avg(size_t beginIndex, size_t endIndex, unsigned numOfDivisions) const; };