[Bf-blender-cvs] [b2c28127e24] greasepencil-object: Fix some errors in onion skins
Antonio Vazquez
noreply at git.blender.org
Sat Apr 15 15:14:55 CEST 2017
Commit: b2c28127e249e88eb91fa7e7149b7dd8d10a0e4c
Author: Antonio Vazquez
Date: Sat Apr 15 15:14:24 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBb2c28127e249e88eb91fa7e7149b7dd8d10a0e4c
Fix some errors in onion skins
===================================================================
M source/blender/draw/engines/gpencil/gpencil_draw.c
M source/blender/draw/engines/gpencil/gpencil_mode.c
===================================================================
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw.c b/source/blender/draw/engines/gpencil/gpencil_draw.c
index 7b2bced4f2b..c52d4ded62d 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw.c
@@ -317,7 +317,7 @@ static void gpencil_set_fill_point(VertexBuffer *vbo, int idx, bGPDspoint *pt, f
}
/* create batch geometry data for stroke shader */
-Batch *gpencil_get_fill_geom(bGPDstroke *gps, const float color[4])
+Batch *gpencil_get_fill_geom(bGPDstroke *gps, float color[4])
{
BLI_assert(gps->totpoints >= 3);
int offsx = 0;
@@ -347,15 +347,15 @@ Batch *gpencil_get_fill_geom(bGPDstroke *gps, const float color[4])
bGPDtriangle *stroke_triangle = gps->triangles;
int idx = 0;
for (int i = 0; i < gps->tot_triangles; i++, stroke_triangle++) {
- gpencil_set_fill_point(vbo, idx, &gps->points[stroke_triangle->v1], gps->palcolor->fill, stroke_triangle->uv1,
+ gpencil_set_fill_point(vbo, idx, &gps->points[stroke_triangle->v1], color, stroke_triangle->uv1,
pos_id, color_id, text_id, gps->flag,
offsx, offsy, winx, winy);
++idx;
- gpencil_set_fill_point(vbo, idx, &gps->points[stroke_triangle->v2], gps->palcolor->fill, stroke_triangle->uv2,
+ gpencil_set_fill_point(vbo, idx, &gps->points[stroke_triangle->v2], color, stroke_triangle->uv2,
pos_id, color_id, text_id, gps->flag,
offsx, offsy, winx, winy);
++idx;
- gpencil_set_fill_point(vbo, idx, &gps->points[stroke_triangle->v3], gps->palcolor->fill, stroke_triangle->uv3,
+ gpencil_set_fill_point(vbo, idx, &gps->points[stroke_triangle->v3], color, stroke_triangle->uv3,
pos_id, color_id, text_id, gps->flag,
offsx, offsy, winx, winy);
++idx;
diff --git a/source/blender/draw/engines/gpencil/gpencil_mode.c b/source/blender/draw/engines/gpencil/gpencil_mode.c
index 6b0840a4255..1ce7189b313 100644
--- a/source/blender/draw/engines/gpencil/gpencil_mode.c
+++ b/source/blender/draw/engines/gpencil/gpencil_mode.c
@@ -333,13 +333,15 @@ static void gpencil_draw_strokes(void *vedata, ToolSettings *ts, Object *ob,
}
/* edit points (only in edit mode) */
- if ((gpl->flag & GP_LAYER_LOCKED) == 0 && (ob->gpd->flag & GP_DATA_STROKE_EDITMODE))
- {
- if (gps->flag & GP_STROKE_SELECT) {
- if ((gpl->flag & GP_LAYER_UNLOCK_COLOR) || ((gps->palcolor->flag & PC_COLOR_LOCKED) == 0)) {
- struct Batch *edit_geom = gpencil_get_edit_geom(gps, ts->gp_sculpt.alpha, ob->gpd->flag);
- DRW_shgroup_call_add(stl->g_data->shgrps_edit_volumetric, edit_geom, gpf->matrix);
+ if (!onion) {
+ if ((gpl->flag & GP_LAYER_LOCKED) == 0 && (ob->gpd->flag & GP_DATA_STROKE_EDITMODE))
+ {
+ if (gps->flag & GP_STROKE_SELECT) {
+ if ((gpl->flag & GP_LAYER_UNLOCK_COLOR) || ((gps->palcolor->flag & PC_COLOR_LOCKED) == 0)) {
+ struct Batch *edit_geom = gpencil_get_edit_geom(gps, ts->gp_sculpt.alpha, ob->gpd->flag);
+ DRW_shgroup_call_add(stl->g_data->shgrps_edit_volumetric, edit_geom, gpf->matrix);
+ }
}
}
}
@@ -354,6 +356,80 @@ static void gpencil_draw_strokes(void *vedata, ToolSettings *ts, Object *ob,
}
}
+/* draw onion-skinning for a layer */
+static void gpencil_draw_onionskins(void *vedata, ToolSettings *ts, Object *ob,bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf)
+{
+ const float default_color[3] = { UNPACK3(U.gpencil_new_layer_col) };
+ const float alpha = 1.0f;
+ float color[4];
+
+ /* 1) Draw Previous Frames First */
+ if (gpl->flag & GP_LAYER_GHOST_PREVCOL) {
+ copy_v3_v3(color, gpl->gcolor_prev);
+ }
+ else {
+ copy_v3_v3(color, default_color);
+ }
+
+ if (gpl->gstep > 0) {
+ /* draw previous frames first */
+ for (bGPDframe *gf = gpf->prev; gf; gf = gf->prev) {
+ /* check if frame is drawable */
+ if ((gpf->framenum - gf->framenum) <= gpl->gstep) {
+ /* alpha decreases with distance from curframe index */
+ float fac = 1.0f - ((float)(gpf->framenum - gf->framenum) / (float)(gpl->gstep + 1));
+ color[3] = alpha * fac * 0.66f;
+ gpencil_draw_strokes(vedata, ts, ob, gpl, gf, 1.0f, color, true, gpl->flag & GP_LAYER_GHOST_PREVCOL);
+ }
+ else
+ break;
+ }
+ }
+ else if (gpl->gstep == 0) {
+ /* draw the strokes for the ghost frames (at half of the alpha set by user) */
+ if (gpf->prev) {
+ color[3] = (alpha / 7);
+ gpencil_draw_strokes(vedata, ts, ob, gpl, gpf->prev, 1.0f, color, true, gpl->flag & GP_LAYER_GHOST_PREVCOL);
+ }
+ }
+ else {
+ /* don't draw - disabled */
+ }
+
+ /* 2) Now draw next frames */
+ if (gpl->flag & GP_LAYER_GHOST_NEXTCOL) {
+ copy_v3_v3(color, gpl->gcolor_next);
+ }
+ else {
+ copy_v3_v3(color, default_color);
+ }
+
+ if (gpl->gstep_next > 0) {
+ /* now draw next frames */
+ for (bGPDframe *gf = gpf->next; gf; gf = gf->next) {
+ /* check if frame is drawable */
+ if ((gf->framenum - gpf->framenum) <= gpl->gstep_next) {
+ /* alpha decreases with distance from curframe index */
+ float fac = 1.0f - ((float)(gf->framenum - gpf->framenum) / (float)(gpl->gstep_next + 1));
+ color[3] = alpha * fac * 0.66f;
+ gpencil_draw_strokes(vedata, ts, ob, gpl, gf, 1.0f, color, true, gpl->flag & GP_LAYER_GHOST_NEXTCOL);
+ }
+ else
+ break;
+ }
+ }
+ else if (gpl->gstep_next == 0) {
+ /* draw the strokes for the ghost frames (at half of the alpha set by user) */
+ if (gpf->next) {
+ color[3] = (alpha / 4);
+ gpencil_draw_strokes(vedata, ts, ob, gpl, gpf->next, 1.0f, color, true, gpl->flag & GP_LAYER_GHOST_NEXTCOL);
+ }
+ }
+ else {
+ /* don't draw - disabled */
+ }
+}
+
static void GPENCIL_cache_populate(void *vedata, Object *ob)
{
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
@@ -374,6 +450,11 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob)
if (gpf == NULL)
continue;
+ /* draw onion skins */
+ if ((gpl->flag & GP_LAYER_ONIONSKIN) || (gpl->flag & GP_LAYER_GHOST_ALWAYS))
+ {
+ gpencil_draw_onionskins(vedata, ts, ob, ob->gpd, gpl, gpf);
+ }
/* draw normal strokes */
gpencil_draw_strokes(vedata, ts, ob, gpl, gpf, gpl->opacity, gpl->tintcolor, false, false);
}
More information about the Bf-blender-cvs
mailing list