diff options
author | Antonioya <blendergit@gmail.com> | 2019-04-18 17:59:01 +0300 |
---|---|---|
committer | Antonioya <blendergit@gmail.com> | 2019-04-18 17:59:18 +0300 |
commit | d6f93791494bb04f3ddf5ca1e6a5fe17fb7f22fb (patch) | |
tree | ae1cfba49ddf3abbad843b1543714fa727f42a0b | |
parent | 84d237ee97716a51e46dfbe11ffc2e26c666834a (diff) |
GPencil: Fix Drawing Path follow error while drawing
The strokes was aligned to drawing path only when the stroke was completed. Now, the stroke is aligned while drawing too.
-rw-r--r-- | source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c | 75 |
1 files changed, 72 insertions, 3 deletions
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c index 9e71791fbf3..ea33c004191 100644 --- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c +++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c @@ -71,6 +71,40 @@ static void gpencil_set_stroke_point(GPUVertBuf *vbo, GPU_vertbuf_attr_set(vbo, pos_id, idx, &pt->x); } +/* Helper to add buffer_stroke point to vbo */ +static void gpencil_set_buffer_stroke_point(GPUVertBuf *vbo, + const bGPDspoint *pt, + int idx, + uint pos_id, + uint color_id, + uint thickness_id, + uint uvdata_id, + uint prev_pos_id, + float ref_pt[3], + short thickness, + const float ink[4]) +{ + + float alpha = ink[3] * pt->strength; + CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f); + float col[4]; + ARRAY_SET_ITEMS(col, ink[0], ink[1], ink[2], alpha); + + GPU_vertbuf_attr_set(vbo, color_id, idx, col); + + /* transfer both values using the same shader variable */ + float uvdata[2] = {pt->uv_fac, pt->uv_rot}; + GPU_vertbuf_attr_set(vbo, uvdata_id, idx, uvdata); + + /* the thickness of the stroke must be affected by zoom, so a pixel scale is calculated */ + float thick = max_ff(pt->pressure * thickness, 1.0f); + GPU_vertbuf_attr_set(vbo, thickness_id, idx, &thick); + + GPU_vertbuf_attr_set(vbo, pos_id, idx, &pt->x); + /* reference point to follow drawing path */ + GPU_vertbuf_attr_set(vbo, prev_pos_id, idx, ref_pt); +} + /* Helper to add a new fill point and texture coordinates to vertex buffer */ static void gpencil_set_fill_point(GPUVertBuf *vbo, int idx, @@ -433,12 +467,13 @@ GPUBatch *DRW_gpencil_get_buffer_point_geom(bGPdata *gpd, short thickness) int totpoints = gpd->runtime.sbuffer_size; static GPUVertFormat format = {0}; - static uint pos_id, color_id, thickness_id, uvdata_id; + static uint pos_id, color_id, thickness_id, uvdata_id, prev_pos_id; if (format.attr_len == 0) { pos_id = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); color_id = GPU_vertformat_attr_add(&format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT); thickness_id = GPU_vertformat_attr_add(&format, "thickness", GPU_COMP_F32, 1, GPU_FETCH_FLOAT); uvdata_id = GPU_vertformat_attr_add(&format, "uvdata", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); + prev_pos_id = GPU_vertformat_attr_add(&format, "prev_pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); } GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format); @@ -458,9 +493,43 @@ GPUBatch *DRW_gpencil_get_buffer_point_geom(bGPdata *gpd, short thickness) ED_gpencil_tpoint_to_point(ar, origin, tpt, &pt); ED_gp_project_point_to_plane(scene, ob, rv3d, origin, ts->gp_sculpt.lock_axis - 1, &pt); + /* use previous point to determine stroke direction (drawing path) */ + bGPDspoint pt2; + float ref_pt[3]; + + if (i == 0) { + if (totpoints > 1) { + /* extrapolate a point before first point */ + tGPspoint *tpt2 = &points[1]; + ED_gpencil_tpoint_to_point(ar, origin, tpt2, &pt2); + ED_gp_project_point_to_plane(scene, ob, rv3d, origin, ts->gp_sculpt.lock_axis - 1, &pt2); + + interp_v3_v3v3(ref_pt, &pt2.x, &pt.x, 1.5f); + } + else { + copy_v3_v3(ref_pt, &pt.x); + } + } + else { + tGPspoint *tpt2 = &points[i - 1]; + ED_gpencil_tpoint_to_point(ar, origin, tpt2, &pt2); + ED_gp_project_point_to_plane(scene, ob, rv3d, origin, ts->gp_sculpt.lock_axis - 1, &pt2); + + copy_v3_v3(ref_pt, &pt2.x); + } + /* set point */ - gpencil_set_stroke_point( - vbo, &pt, idx, pos_id, color_id, thickness_id, uvdata_id, thickness, gpd->runtime.scolor); + gpencil_set_buffer_stroke_point(vbo, + &pt, + idx, + pos_id, + color_id, + thickness_id, + uvdata_id, + prev_pos_id, + ref_pt, + thickness, + gpd->runtime.scolor); idx++; } |