Initial Grease Pencil 3.0 stage #106848

Merged
Falk David merged 224 commits from filedescriptor/blender:grease-pencil-v3 into main 2023-05-30 11:14:22 +02:00
4 changed files with 28 additions and 11 deletions
Showing only changes of commit 4949aa74ee - Show all commits

View File

@ -225,6 +225,9 @@ void legacy_gpencil_to_grease_pencil(GreasePencil &grease_pencil, bGPdata &gpd);
} // namespace greasepencil } // namespace greasepencil
/**
* A single point for a stroke that is currently being drawn.
*/
struct StrokePoint { struct StrokePoint {
float3 position; float3 position;
float radius; float radius;
@ -232,16 +235,30 @@ struct StrokePoint {
float4 color; float4 color;
}; };
/**
* Stroke cache for a stroke that is currently being drawn.
*/
struct StrokeCache {
Vector<StrokePoint> points = {};
Vector<uint3> triangles = {};
int mat = 0;
void clear()
{
this->points.clear_and_shrink();
this->triangles.clear_and_shrink();
filedescriptor marked this conversation as resolved Outdated

Since the map will have to change to store more than just an index as the value, make sure to update the comment too.

Since the map will have to change to store more than just an index as the value, make sure to update the comment too.
this->mat = 0;
}
};
class GreasePencilDrawingRuntime { class GreasePencilDrawingRuntime {
public: public:
/**
* Triangle cache for all the strokes in the drawing.
*/
mutable SharedCache<Vector<uint3>> triangles_cache; mutable SharedCache<Vector<uint3>> triangles_cache;
/** StrokeCache stroke_cache;
* Stroke cache for a stroke that is currently being drawn.
*/
Vector<StrokePoint> stroke_cache = {};
Vector<uint3> stroke_triangle_cache = {};
int stroke_mat = 0;
}; };
class GreasePencilRuntime { class GreasePencilRuntime {

View File

@ -740,12 +740,12 @@ void GreasePencilDrawing::tag_positions_changed()
bool GreasePencilDrawing::has_stroke_buffer() bool GreasePencilDrawing::has_stroke_buffer()
{ {
return this->runtime->stroke_cache.size() > 0; return this->runtime->stroke_cache.points.size() > 0;
} }
blender::Span<blender::bke::StrokePoint> GreasePencilDrawing::stroke_buffer() blender::Span<blender::bke::StrokePoint> GreasePencilDrawing::stroke_buffer()
{ {
return this->runtime->stroke_cache.as_span(); return this->runtime->stroke_cache.points.as_span();
} }
/** \} */ /** \} */

View File

@ -363,7 +363,7 @@ static void grease_pencil_batches_ensure(GreasePencil &grease_pencil, int cfra)
IndexRange verts_range = IndexRange(verts_start_offset, num_verts); IndexRange verts_range = IndexRange(verts_start_offset, num_verts);
MutableSpan<GreasePencilStrokeVert> verts_slice = verts.slice(verts_range); MutableSpan<GreasePencilStrokeVert> verts_slice = verts.slice(verts_range);
MutableSpan<GreasePencilColorVert> cols_slice = cols.slice(verts_range); MutableSpan<GreasePencilColorVert> cols_slice = cols.slice(verts_range);
const int material_nr = drawing.runtime->stroke_mat; const int material_nr = drawing.runtime->stroke_cache.mat;
verts_slice.first().mat = -1; verts_slice.first().mat = -1;
for (const int i : IndexRange(points.size())) { for (const int i : IndexRange(points.size())) {

View File

@ -64,7 +64,7 @@ struct PaintOperationExecutor {
StrokePoint new_point{proj_pos, stroke_extension.pressure * 100.0f, 1.0f, float4(1.0f)}; StrokePoint new_point{proj_pos, stroke_extension.pressure * 100.0f, 1.0f, float4(1.0f)};
drawing.runtime->stroke_cache.append(std::move(new_point)); drawing.runtime->stroke_cache.points.append(std::move(new_point));
BKE_grease_pencil_batch_cache_dirty_tag(&grease_pencil, BKE_GREASEPENCIL_BATCH_DIRTY_ALL); BKE_grease_pencil_batch_cache_dirty_tag(&grease_pencil, BKE_GREASEPENCIL_BATCH_DIRTY_ALL);
} }
@ -151,7 +151,7 @@ void PaintOperation::on_stroke_done(const bContext &C)
return true; return true;
}); });
drawing_eval.runtime->stroke_cache.clear_and_shrink(); drawing_eval.runtime->stroke_cache.clear();
drawing_orig.tag_positions_changed(); drawing_orig.tag_positions_changed();
radii.finish(); radii.finish();