#pragma once #include "../SharedTypes.hpp" #include "DrawComponent.hpp" #include "Helpers/SCollision.hpp" #include #ifndef IS_SERVER #include #endif #define DRAW_MINIMUM_LIMIT 0.3 struct DrawBrushStrokePoint { Vector2f pos; float width; template void serialize(Archive& a) { a(pos, width); } }; class DrawBrushStroke : public DrawComponent { public: virtual DrawComponentType get_type() const override; virtual void save(cereal::PortableBinaryOutputArchive& a) const override; virtual void load(cereal::PortableBinaryInputArchive& a) 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() const override; virtual std::shared_ptr deep_copy() 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 };