#pragma once #include "../SharedTypes.hpp" #include "DrawComponent.hpp" #include "Helpers/SCollision.hpp" #include #ifndef IS_SERVER #include #endif #define DRAW_MINIMUM_LIMIT 0.75 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; virtual void create_collider() override; virtual void update_from_delayed_ptr() override; virtual SCollision::AABB get_obj_coord_bounds() const override; sk_sp vertices; std::array, 3> verticesMipMap; SCollision::AABB bounds; private: 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& points, unsigned skipVertexCount); void vertices_to_draw_data(sk_sp& vertexDataPtr, const std::vector& vertexData); 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 };