[Bf-blender-cvs] [c810fdd5df4] greasepencil-object: WIP: Add basic editing points to strokes
Antonio Vazquez
noreply at git.blender.org
Thu Apr 13 12:24:20 CEST 2017
Commit: c810fdd5df4cfa9eaae3e724d0266e74284313e3
Author: Antonio Vazquez
Date: Thu Apr 13 12:08:50 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBc810fdd5df4cfa9eaae3e724d0266e74284313e3
WIP: Add basic editing points to strokes
===================================================================
M source/blender/draw/engines/gpencil/gpencil_draw.c
M source/blender/draw/engines/gpencil/gpencil_mode.c
M source/blender/draw/engines/gpencil/gpencil_mode.h
===================================================================
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw.c b/source/blender/draw/engines/gpencil/gpencil_draw.c
index 4d1d4a9eb44..ccd249695f3 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw.c
@@ -41,6 +41,8 @@
#include "ED_gpencil.h"
+#include "UI_resources.h"
+
/* set stroke point to vbo */
static void gpencil_set_stroke_point(VertexBuffer *vbo, const bGPDspoint *pt, int idx,
unsigned int pos_id, unsigned int color_id,
@@ -362,3 +364,81 @@ Batch *gpencil_get_fill_geom(bGPDstroke *gps, const float diff_mat[4][4], const
return Batch_create(PRIM_TRIANGLES, vbo, NULL);
}
+
+/* Draw selected verts for strokes being edited */
+Batch *gpencil_get_edit_geom(bGPDstroke *gps, const float diff_mat[4][4], float alpha, short dflag)
+{
+ /* Get size of verts:
+ * - The selected state needs to be larger than the unselected state so that
+ * they stand out more.
+ * - We use the theme setting for size of the unselected verts
+ */
+ float bsize = UI_GetThemeValuef(TH_GP_VERTEX_SIZE);
+ float vsize;
+ if ((int)bsize > 8) {
+ vsize = 10.0f;
+ bsize = 8.0f;
+ }
+ else {
+ vsize = bsize + 2;
+ }
+
+ /* for now, we assume that the base color of the points is not too close to the real color */
+ /* set color using palette */
+ PaletteColor *palcolor = gps->palcolor;
+
+ float selectColor[4];
+ UI_GetThemeColor3fv(TH_GP_VERTEX_SELECT, selectColor);
+ selectColor[3] = alpha;
+
+ static VertexFormat format = { 0 };
+ static unsigned int pos_id, color_id, size_id;
+ if (format.attrib_ct == 0) {
+ pos_id = VertexFormat_add_attrib(&format, "pos", COMP_F32, 3, KEEP_FLOAT);
+ color_id = VertexFormat_add_attrib(&format, "color", COMP_F32, 4, KEEP_FLOAT);
+ size_id = VertexFormat_add_attrib(&format, "size", COMP_F32, 1, KEEP_FLOAT);
+ }
+
+ VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
+ VertexBuffer_allocate_data(vbo, gps->totpoints);
+
+ /* Draw start and end point differently if enabled stroke direction hint */
+ bool show_direction_hint = (dflag & GP_DATA_SHOW_DIRECTION) && (gps->totpoints > 1);
+
+ /* Draw all the stroke points (selected or not) */
+ bGPDspoint *pt = gps->points;
+ float fpt[3];
+ int idx = 0;
+ float fcolor[4];
+ float fsize = 0;
+
+ for (int i = 0; i < gps->totpoints; i++, pt++) {
+ if (show_direction_hint && i == 0) {
+ /* start point in green bigger */
+ ARRAY_SET_ITEMS(fcolor, 0.0f, 1.0f, 0.0f, 1.0f);
+ fsize = vsize + 4;
+ }
+ else if (show_direction_hint && (i == gps->totpoints - 1)) {
+ /* end point in red smaller */
+ ARRAY_SET_ITEMS(fcolor, 1.0f, 0.0f, 0.0f, 1.0f);
+ fsize = vsize + 1;
+ }
+ else if (pt->flag & GP_SPOINT_SELECT) {
+ copy_v4_v4(fcolor, selectColor);
+ fsize = vsize;
+ }
+ else {
+ copy_v4_v4(fcolor, palcolor->rgb);
+ fsize = bsize;
+ }
+
+ VertexBuffer_set_attrib(vbo, color_id, idx, fcolor);
+ VertexBuffer_set_attrib(vbo, size_id, idx, &fsize);
+
+ mul_v3_m4v3(fpt, diff_mat, &pt->x);
+ VertexBuffer_set_attrib(vbo, pos_id, idx, fpt);
+ ++idx;
+ }
+
+ return Batch_create(PRIM_POINTS, vbo, NULL);
+}
diff --git a/source/blender/draw/engines/gpencil/gpencil_mode.c b/source/blender/draw/engines/gpencil/gpencil_mode.c
index 4b8d272bd10..9ef1e2ad6ed 100644
--- a/source/blender/draw/engines/gpencil/gpencil_mode.c
+++ b/source/blender/draw/engines/gpencil/gpencil_mode.c
@@ -90,6 +90,7 @@ typedef struct g_data{
int t_flip;
int t_mix;
int fill_style;
+ DRWShadingGroup *shgrps_volumetric;
} g_data; /* Transient data */
static struct {
@@ -182,6 +183,16 @@ static DRWShadingGroup *GPENCIL_shgroup_stroke_create(GPENCIL_Data *vedata, DRWP
return grp;
}
+/* create shading group for volumetric */
+static DRWShadingGroup *GPENCIL_shgroup_volumetric_create(GPENCIL_Data *vedata, DRWPass *pass)
+{
+ GPENCIL_TextureList *txl = ((GPENCIL_Data *)vedata)->txl;
+ GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+
+ DRWShadingGroup *grp = DRW_shgroup_create(e_data.gpencil_volumetric_sh, pass);
+
+ return grp;
+}
static void GPENCIL_cache_init(void *vedata)
{
@@ -207,6 +218,9 @@ static void GPENCIL_cache_init(void *vedata)
memset(stl->storage->shgrps_fill, 0, sizeof(DRWShadingGroup *) * MAX_GPENCIL_MAT);
memset(stl->storage->shgrps_stroke, 0, sizeof(DRWShadingGroup *) * MAX_GPENCIL_MAT);
memset(stl->storage->materials, 0, sizeof(PaletteColor *) * MAX_GPENCIL_MAT);
+
+ /* create static shading groups */
+ stl->g_data->shgrps_volumetric = GPENCIL_shgroup_volumetric_create(vedata, psl->pass);
}
}
@@ -231,6 +245,7 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob)
DRWShadingGroup *strokegrp;
const bContext *C = DRW_get_context();
Scene *scene = CTX_data_scene(C);
+ ToolSettings *ts = CTX_data_tool_settings(C);
float diff_mat[4][4];
float ink[4];
float tcolor[4];
@@ -288,11 +303,29 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob)
struct Batch *stroke_geom = gpencil_get_stroke_geom(gps, sthickness, diff_mat, ink);
DRW_shgroup_call_add(strokegrp, stroke_geom, ob->obmat);
}
+
+ /* 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, diff_mat, ts->gp_sculpt.alpha, ob->gpd->flag);
+ DRW_shgroup_call_add(stl->g_data->shgrps_volumetric, edit_geom,ob->obmat);
+
+ }
+ }
+ }
+
}
}
}
}
+static void GPENCIL_cache_finish(void *vedata)
+{
+ GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+}
+
static void GPENCIL_draw_scene(void *vedata)
{
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
@@ -318,7 +351,7 @@ DrawEngineType draw_engine_gpencil_type = {
&GPENCIL_engine_free,
&GPENCIL_cache_init,
&GPENCIL_cache_populate,
- NULL,
+ &GPENCIL_cache_finish,
NULL,
&GPENCIL_draw_scene
};
diff --git a/source/blender/draw/engines/gpencil/gpencil_mode.h b/source/blender/draw/engines/gpencil/gpencil_mode.h
index 07bb82b3991..c3dc70923a3 100644
--- a/source/blender/draw/engines/gpencil/gpencil_mode.h
+++ b/source/blender/draw/engines/gpencil/gpencil_mode.h
@@ -30,6 +30,8 @@ struct Batch;
struct Batch *gpencil_get_stroke_geom(struct bGPDstroke *gps, short thickness, const float diff_mat[4][4], const float ink[4]);
struct Batch *gpencil_get_fill_geom(struct bGPDstroke *gps, const float diff_mat[4][4], const float color[4]);
+struct Batch *gpencil_get_edit_geom(struct bGPDstroke *gps, const float diff_mat[4][4], float alpha, short dflag);
+
bool gpencil_can_draw_stroke(const struct bGPDstroke *gps);
#endif /* __GPENCIL_MODE_H__ */
\ No newline at end of file
More information about the Bf-blender-cvs
mailing list