#pragma once #include "CanvasComponent.hpp" #include "Helpers/SCollision.hpp" #include #include #include struct DrawBrushStrokePoint { Vector2f pos; float width; template void serialize(Archive& a) { a(pos, width); } }; class CanvasComponentBrushStroke : public CanvasComponent { public: constexpr static float DRAW_MINIMUM_LIMIT = 0.3; virtual DrawComponentType get_type() const override; virtual void write_update(cereal::PortableBinaryOutputArchive& a) const override; virtual void read_update(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 #ifndef IS_SERVER virtual std::shared_ptr copy(DrawingProgram& drawP) const override; virtual std::shared_ptr deep_copy(DrawingProgram& drawP) const override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual void initialize_draw_data(DrawingProgram& drawP) override; virtual void update(DrawingProgram& drawP) override; virtual bool collides_within_coords(const SCollision::ColliderCollection& checkAgainst) override; void create_collider(); virtual void update_from_delayed_ptr(const std::shared_ptr& delayedUpdatePtr) override; virtual SCollision::AABB get_obj_coord_bounds() const override; std::shared_ptr brushPath; SCollision::AABB bounds; std::array, 2> brushPathLOD; private: std::vector every_nth_point_include_front_and_back(const std::vector& pts, size_t n); 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); std::vector get_wedge_indices(const std::vector& points); std::vector smooth_points(size_t beginIndex, size_t endIndex, unsigned numOfDivisions); std::vector smooth_points_avg(size_t beginIndex, size_t endIndex, unsigned numOfDivisions); #endif };