From a9af3a9b17a7889cfa361bccc447d38d01c6b337 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Tue, 26 Aug 2025 17:41:08 +0300 Subject: [PATCH] Added brush LODs for SkPath brush stroke implementation --- src/DrawComponents/DrawBrushStroke.cpp | 28 ++++++++++++++++++++++---- src/DrawComponents/DrawBrushStroke.hpp | 5 ++++- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/DrawComponents/DrawBrushStroke.cpp b/src/DrawComponents/DrawBrushStroke.cpp index 99a95ff..e2bbf67 100644 --- a/src/DrawComponents/DrawBrushStroke.cpp +++ b/src/DrawComponents/DrawBrushStroke.cpp @@ -42,6 +42,7 @@ std::shared_ptr DrawBrushStroke::deep_copy() const { a->coords = coords; // Just copy pointers over, brush strokes cant be edited so they can share the same memory a->brushPath = brushPath; + a->brushPathLOD = brushPathLOD; a->bounds = bounds; return a; @@ -80,7 +81,10 @@ void DrawBrushStroke::draw(SkCanvas* canvas, const DrawData& drawData) { canvas->save(); paint.setColor4f(SkColor4f{d->color.x(), d->color.y(), d->color.z(), d->color.w()}); canvas_do_calculated_transform(canvas); - canvas->drawPath(*brushPath, paint); + if(drawSetupData.mipmapLevel == 0) + canvas->drawPath(*brushPath, paint); + else + canvas->drawPath(*brushPathLOD[drawSetupData.mipmapLevel - 1], paint); //SkPaint p2(SkColor4f{1, 0, 0, 1}); //p2.setStroke(true); //SkPaint p3(SkColor4f{0, 1, 0, 1}); @@ -102,8 +106,12 @@ void DrawBrushStroke::initialize_draw_data(DrawingProgram& drawP) { }; brushPath = std::make_shared(); + brushPathLOD[0] = std::make_shared(); + brushPathLOD[1] = std::make_shared(); create_triangles(triangleFunc, points, 0, brushPath); + create_triangles(triangleFunc, points, 4, brushPathLOD[0]); + create_triangles(triangleFunc, points, 30, brushPathLOD[1]); } create_collider(); } @@ -196,10 +204,21 @@ std::vector DrawBrushStroke::smooth_points_avg(size_t begi return toRet; } -void DrawBrushStroke::create_triangles(const std::function& passTriangleFunc, const std::vector& points, unsigned skipVertexCount, std::shared_ptr bPath) { +std::vector DrawBrushStroke::every_nth_point_include_front_and_back(const std::vector& pts, size_t n) { + if(pts.size() <= 3 || n == 0) + return pts; + std::vector toRet; + toRet.emplace_back(pts.front()); + for(size_t i = n; i < pts.size() - 1; i += n) + toRet.emplace_back(pts[i]); + toRet.emplace_back(pts.back()); + return toRet; +} + +void DrawBrushStroke::create_triangles(const std::function& passTriangleFunc, const std::vector& smoothedPoints, size_t skipVertexCount, std::shared_ptr bPath) { const int ARC_SMOOTHNESS = 10; const int CIRCLE_SMOOTHNESS = 20; - std::vector& pointsN = d->points; + const std::vector& pointsN = d->points; std::vector topPoints; std::vector bottomPoints; @@ -217,6 +236,8 @@ void DrawBrushStroke::create_triangles(const std::function wedgeIndices = get_wedge_indices(points); for(size_t i = 0; i < wedgeIndices.size() - 1; i++) { @@ -250,7 +271,6 @@ void DrawBrushStroke::create_triangles(const std::function= pointsEnd) j = pointsEnd - 1; diff --git a/src/DrawComponents/DrawBrushStroke.hpp b/src/DrawComponents/DrawBrushStroke.hpp index 8e50a2d..bed14ee 100644 --- a/src/DrawComponents/DrawBrushStroke.hpp +++ b/src/DrawComponents/DrawBrushStroke.hpp @@ -49,10 +49,13 @@ class DrawBrushStroke : public DrawComponent { 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& points, unsigned skipVertexCount, std::shared_ptr bPath); + 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);