diff --git a/source/blender/blenkernel/BKE_grease_pencil.hh b/source/blender/blenkernel/BKE_grease_pencil.hh index 39db44d8739..44ddc9db263 100644 --- a/source/blender/blenkernel/BKE_grease_pencil.hh +++ b/source/blender/blenkernel/BKE_grease_pencil.hh @@ -61,8 +61,6 @@ class DrawingRuntime { * Triangle cache for all the strokes in the drawing. */ mutable SharedCache> triangles_cache; - - StrokeCache stroke_cache; }; class Drawing : public ::GreasePencilDrawing { @@ -78,11 +76,6 @@ class Drawing : public ::GreasePencilDrawing { */ Span triangles() const; void tag_positions_changed(); - /** - * A buffer for a single stroke while drawing. - */ - Span stroke_buffer() const; - bool has_stroke_buffer() const; }; class LayerGroup; @@ -382,10 +375,17 @@ class GreasePencilRuntime { * Allocated and freed by the drawing code. See `DRW_grease_pencil_batch_cache_*` functions. */ void *batch_cache = nullptr; + bke::greasepencil::StrokeCache stroke_cache; public: GreasePencilRuntime() {} ~GreasePencilRuntime() {} + + /** + * A buffer for a single stroke while drawing. + */ + Span stroke_buffer() const; + bool has_stroke_buffer() const; }; } // namespace blender::bke diff --git a/source/blender/blenkernel/intern/grease_pencil.cc b/source/blender/blenkernel/intern/grease_pencil.cc index 4612ece7d3d..485009da380 100644 --- a/source/blender/blenkernel/intern/grease_pencil.cc +++ b/source/blender/blenkernel/intern/grease_pencil.cc @@ -346,16 +346,6 @@ void Drawing::tag_positions_changed() this->runtime->triangles_cache.tag_dirty(); } -bool Drawing::has_stroke_buffer() const -{ - return this->runtime->stroke_cache.points.size() > 0; -} - -Span Drawing::stroke_buffer() const -{ - return this->runtime->stroke_cache.points.as_span(); -} - TreeNode::TreeNode() { this->next = this->prev = nullptr; @@ -986,6 +976,23 @@ void BKE_grease_pencil_batch_cache_free(GreasePencil *grease_pencil) /** \} */ +/* ------------------------------------------------------------------- */ +/** \name Grease Pencil runtime API + * \{ */ + +bool blender::bke::GreasePencilRuntime::has_stroke_buffer() const +{ + return this->stroke_cache.points.size() > 0; +} + +blender::Span blender::bke::GreasePencilRuntime:: + stroke_buffer() const +{ + return this->stroke_cache.points.as_span(); +} + +/** \} */ + /* ------------------------------------------------------------------- */ /** \name Grease Pencil data-block API * \{ */ diff --git a/source/blender/draw/intern/draw_cache_impl_grease_pencil.cc b/source/blender/draw/intern/draw_cache_impl_grease_pencil.cc index e731a3c2d32..a8db94bf0ac 100644 --- a/source/blender/draw/intern/draw_cache_impl_grease_pencil.cc +++ b/source/blender/draw/intern/draw_cache_impl_grease_pencil.cc @@ -222,11 +222,6 @@ static void grease_pencil_geom_batch_ensure(GreasePencil &grease_pencil, int cfr int verts_start_offsets_size = curves.curves_num(); int tris_start_offsets_size = curves.curves_num(); - if (drawing->has_stroke_buffer()) { - verts_start_offsets_size++; - /* TODO: triangles for stroke buffer. */ - // tris_start_offsets_size++; - } Array verts_start_offsets(verts_start_offsets_size); Array tris_start_offsets(tris_start_offsets_size); @@ -258,19 +253,17 @@ static void grease_pencil_geom_batch_ensure(GreasePencil &grease_pencil, int cfr total_triangles_num += (curves.points_num() + num_cyclic) * 2; total_triangles_num += drawing->triangles().size(); - if (drawing->has_stroke_buffer()) { - const int num_buffer_points = drawing->stroke_buffer().size(); - total_verts_num += 1 + num_buffer_points + 1; - total_triangles_num += num_buffer_points * 2; - verts_start_offsets[curves.curves_range().size()] = v_offset; - /* TODO: triangles for stroke buffer. */ - v_offset += 1 + num_buffer_points + 1; - } - verts_start_offsets_per_visible_drawing.append(std::move(verts_start_offsets)); tris_start_offsets_per_visible_drawing.append(std::move(tris_start_offsets)); } + if (grease_pencil.runtime->has_stroke_buffer()) { + const int num_buffer_points = grease_pencil.runtime->stroke_buffer().size(); + total_verts_num += 1 + num_buffer_points + 1; + total_triangles_num += num_buffer_points * 2; + /* TODO: triangles for stroke buffer. */ + } + static GPUVertFormat format_edit_points_pos = {0}; if (format_edit_points_pos.attr_len == 0) { GPU_vertformat_attr_add(&format_edit_points_pos, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); @@ -432,51 +425,51 @@ static void grease_pencil_geom_batch_ensure(GreasePencil &grease_pencil, int cfr verts_slice.last().mat = -1; } }); + } - if (drawing.has_stroke_buffer()) { - Span points = drawing.stroke_buffer(); - const int verts_start_offset = verts_start_offsets.last(); - const int num_verts = 1 + points.size() + 1; - IndexRange verts_range = IndexRange(verts_start_offset, num_verts); - MutableSpan verts_slice = verts.slice(verts_range); - MutableSpan cols_slice = cols.slice(verts_range); - const int material_nr = drawing.runtime->stroke_cache.mat; + if (grease_pencil.runtime->has_stroke_buffer()) { + Span points = grease_pencil.runtime->stroke_buffer(); + const int verts_start_offset = v_offset; + const int num_verts = 1 + points.size() + 1; + IndexRange verts_range = IndexRange(verts_start_offset, num_verts); + MutableSpan verts_slice = verts.slice(verts_range); + MutableSpan cols_slice = cols.slice(verts_range); + const int material_nr = grease_pencil.runtime->stroke_cache.mat; - verts_slice.first().mat = -1; - for (const int i : IndexRange(points.size())) { - const int idx = i + 1; - GreasePencilStrokeVert &s_vert = verts_slice[idx]; - GreasePencilColorVert &c_vert = cols_slice[idx]; - const bke::greasepencil::StrokePoint &point = points[i]; + verts_slice.first().mat = -1; + for (const int i : IndexRange(points.size())) { + const int idx = i + 1; + GreasePencilStrokeVert &s_vert = verts_slice[idx]; + GreasePencilColorVert &c_vert = cols_slice[idx]; + const bke::greasepencil::StrokePoint &point = points[i]; - copy_v3_v3(s_vert.pos, point.position); - s_vert.radius = point.radius; - s_vert.opacity = point.opacity; - s_vert.point_id = verts_range[idx]; - s_vert.stroke_id = verts_range.first(); - s_vert.mat = material_nr; + copy_v3_v3(s_vert.pos, point.position); + s_vert.radius = point.radius; + s_vert.opacity = point.opacity; + s_vert.point_id = verts_range[idx]; + s_vert.stroke_id = verts_range.first(); + s_vert.mat = material_nr; - /* TODO */ - s_vert.packed_asp_hard_rot = pack_rotation_aspect_hardness(0.0f, 1.0f, 1.0f); - /* TODO */ - s_vert.u_stroke = 0; - /* TODO */ - s_vert.uv_fill[0] = s_vert.uv_fill[1] = 0; + /* TODO */ + s_vert.packed_asp_hard_rot = pack_rotation_aspect_hardness(0.0f, 1.0f, 1.0f); + /* TODO */ + s_vert.u_stroke = 0; + /* TODO */ + s_vert.uv_fill[0] = s_vert.uv_fill[1] = 0; - /* TODO */ - copy_v4_v4(c_vert.vcol, float4(0.0f, 0.0f, 0.0f, 0.0f)); - copy_v4_v4(c_vert.fcol, float4(0.0f, 0.0f, 0.0f, 0.0f)); + /* TODO */ + copy_v4_v4(c_vert.vcol, float4(0.0f, 0.0f, 0.0f, 0.0f)); + copy_v4_v4(c_vert.fcol, float4(0.0f, 0.0f, 0.0f, 0.0f)); - /* TODO */ - c_vert.fcol[3] = (int(c_vert.fcol[3] * 10000.0f) * 10.0f) + 1.0f; + /* TODO */ + c_vert.fcol[3] = (int(c_vert.fcol[3] * 10000.0f) * 10.0f) + 1.0f; - int v_mat = (verts_range[idx] << GP_VERTEX_ID_SHIFT) | GP_IS_STROKE_VERTEX_BIT; - GPU_indexbuf_add_tri_verts(&ibo, v_mat + 0, v_mat + 1, v_mat + 2); - GPU_indexbuf_add_tri_verts(&ibo, v_mat + 2, v_mat + 1, v_mat + 3); - } - - verts_slice.last().mat = -1; + int v_mat = (verts_range[idx] << GP_VERTEX_ID_SHIFT) | GP_IS_STROKE_VERTEX_BIT; + GPU_indexbuf_add_tri_verts(&ibo, v_mat + 0, v_mat + 1, v_mat + 2); + GPU_indexbuf_add_tri_verts(&ibo, v_mat + 2, v_mat + 1, v_mat + 3); } + + verts_slice.last().mat = -1; } /* Mark last 2 verts as invalid. */ diff --git a/source/blender/editors/sculpt_paint/grease_pencil_paint.cc b/source/blender/editors/sculpt_paint/grease_pencil_paint.cc index 89112d91008..347eba7ba8e 100644 --- a/source/blender/editors/sculpt_paint/grease_pencil_paint.cc +++ b/source/blender/editors/sculpt_paint/grease_pencil_paint.cc @@ -72,7 +72,7 @@ struct PaintOperationExecutor { bke::greasepencil::StrokePoint new_point{ proj_pos, stroke_extension.pressure * 100.0f, 1.0f, float4(1.0f)}; - drawing.runtime->stroke_cache.points.append(std::move(new_point)); + grease_pencil.runtime->stroke_cache.points.append(std::move(new_point)); BKE_grease_pencil_batch_cache_dirty_tag(&grease_pencil, BKE_GREASEPENCIL_BATCH_DIRTY_ALL); } @@ -106,7 +106,8 @@ void PaintOperation::on_stroke_done(const bContext &C) bke::greasepencil::Drawing &drawing_eval = reinterpret_cast(grease_pencil_eval.drawings()[index_eval])->wrap(); - const Span stroke_points = drawing_eval.stroke_buffer(); + const Span stroke_points = + grease_pencil_eval.runtime->stroke_buffer(); CurvesGeometry &curves = drawing_orig.geometry.wrap(); int num_old_curves = curves.curves_num(); @@ -162,7 +163,7 @@ void PaintOperation::on_stroke_done(const bContext &C) return true; }); - drawing_eval.runtime->stroke_cache.clear(); + grease_pencil_eval.runtime->stroke_cache.clear(); drawing_orig.tag_positions_changed(); radii.finish();