[Bf-blender-cvs] [2209f6e23a2] greasepencil-object: Add functions to draw strokes with one point only
Antonio Vazquez
noreply at git.blender.org
Sun Apr 23 11:24:51 CEST 2017
Commit: 2209f6e23a2333b796cf917ed0cc21adb6559a8e
Author: Antonio Vazquez
Date: Sun Apr 23 11:24:23 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB2209f6e23a2333b796cf917ed0cc21adb6559a8e
Add functions to draw strokes with one point only
===================================================================
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 4e43b9ad655..55984183343 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw.c
@@ -18,7 +18,7 @@
* The Original Code is Copyright (C) 2008, Blender Foundation
* This is a new part of Blender
*
- * Contributor(s): Joshua Leung, Antonio Vazquez
+ * Contributor(s): Antonio Vazquez
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -70,6 +70,33 @@ static void gpencil_set_stroke_point(VertexBuffer *vbo, const bGPDspoint *pt, in
VertexBuffer_set_attrib(vbo, pos_id, idx, fpt);
}
+/* create batch geometry data for one point stroke shader */
+Batch *gpencil_get_point_geom(bGPDspoint *pt, short thickness, const float ink[4])
+{
+ 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, 1);
+
+ float alpha = ink[3] * pt->strength;
+ CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f);
+ float col[4] = { ink[0], ink[1], ink[2], alpha };
+ VertexBuffer_set_attrib(vbo, color_id, 0, col);
+
+ float thick = max_ff(pt->pressure * thickness, 1.0f);
+ VertexBuffer_set_attrib(vbo, size_id, 0, &thick);
+
+ VertexBuffer_set_attrib(vbo, pos_id, 0, &pt->x);
+
+ return Batch_create(PRIM_POINTS, vbo, NULL);
+}
+
/* create batch geometry data for stroke shader */
Batch *gpencil_get_stroke_geom(bGPDstroke *gps, short thickness, const float ink[4])
{
@@ -147,6 +174,8 @@ static void gpencil_stroke_convertcoords(Scene *scene, ARegion *ar, ScrArea *sa,
zero_v3(out);
}
}
+
+/* convert 2d tGPspoint to 3d bGPDspoint */
void gpencil_tpoint_to_point(Scene *scene, ARegion *ar, ScrArea *sa, const tGPspoint *tpt, bGPDspoint *pt)
{
float p3d[3];
@@ -158,6 +187,46 @@ void gpencil_tpoint_to_point(Scene *scene, ARegion *ar, ScrArea *sa, const tGPsp
pt->strength = tpt->strength;
}
+/* create batch geometry data for current buffer for one point stroke shader */
+Batch *gpencil_get_buffer_point_geom(bGPdata *gpd, short thickness)
+{
+ const struct bContext *C = DRW_get_context();
+ Scene *scene = CTX_data_scene(C);
+ ScrArea *sa = CTX_wm_area(C);
+ ARegion *ar = CTX_wm_region(C);
+
+ const tGPspoint *tpt = gpd->sbuffer;
+ bGPDspoint pt;
+ float ink[4];
+ copy_v4_v4(ink, gpd->scolor);
+
+ 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, 1);
+
+ /* convert to 3D */
+ gpencil_tpoint_to_point(scene, ar, sa, tpt, &pt);
+
+ float alpha = ink[3] * pt.strength;
+ CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f);
+ float col[4] = { ink[0], ink[1], ink[2], alpha };
+ VertexBuffer_set_attrib(vbo, color_id, 0, col);
+
+ float thick = max_ff(pt.pressure * thickness, 1.0f);
+ VertexBuffer_set_attrib(vbo, size_id, 0, &thick);
+
+ VertexBuffer_set_attrib(vbo, pos_id, 0, &pt.x);
+
+ return Batch_create(PRIM_POINTS, vbo, NULL);
+}
+
/* create batch geometry data for current buffer stroke shader */
Batch *gpencil_get_buffer_stroke_geom(bGPdata *gpd, short thickness)
{
diff --git a/source/blender/draw/engines/gpencil/gpencil_mode.c b/source/blender/draw/engines/gpencil/gpencil_mode.c
index b750afbd2db..5ee3d244ab1 100644
--- a/source/blender/draw/engines/gpencil/gpencil_mode.c
+++ b/source/blender/draw/engines/gpencil/gpencil_mode.c
@@ -98,6 +98,7 @@ typedef struct GPENCIL_Data {
/* *********** STATIC *********** */
typedef struct g_data{
DRWShadingGroup *shgrps_edit_volumetric;
+ DRWShadingGroup *shgrps_point_volumetric;
DRWShadingGroup *shgrps_drawing_stroke;
DRWShadingGroup *shgrps_drawing_fill;
} g_data; /* Transient data */
@@ -106,7 +107,6 @@ static struct {
struct GPUShader *gpencil_fill_sh;
struct GPUShader *gpencil_stroke_sh;
struct GPUShader *gpencil_volumetric_sh;
- struct GPUShader *gpencil_drawing_point_sh;
struct GPUShader *gpencil_drawing_fill_sh;
} e_data = {NULL}; /* Engine data */
@@ -118,18 +118,21 @@ static void GPENCIL_engine_init(void *vedata)
GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+ /* normal fill shader */
e_data.gpencil_fill_sh = DRW_shader_create(datatoc_gpencil_fill_vert_glsl, NULL,
datatoc_gpencil_fill_frag_glsl,
NULL);
+
+ /* normal stroke shader using geometry to display lines */
e_data.gpencil_stroke_sh = DRW_shader_create(datatoc_gpencil_stroke_vert_glsl,
datatoc_gpencil_stroke_geom_glsl,
datatoc_gpencil_stroke_frag_glsl,
NULL);
+ /* used for edit points or strokes with one point only */
e_data.gpencil_volumetric_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR);
- e_data.gpencil_drawing_point_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR);
-
+ /* used to filling during drawing */
e_data.gpencil_drawing_fill_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_SMOOTH_COLOR);
if (!stl->storage) {
@@ -173,7 +176,7 @@ static DRWShadingGroup *GPENCIL_shgroup_fill_create(GPENCIL_Data *vedata, DRWPas
stl->storage->t_flip[id] = palcolor->flag & PAC_COLOR_FLIP_FILL ? 1 : 0;
DRW_shgroup_uniform_int(grp, "t_flip", &stl->storage->t_flip[id], 1);
- /* TODO: image texture */
+ /* image texture */
if ((palcolor->fill_style == FILL_STYLE_TEXTURE) || (palcolor->flag & PAC_COLOR_TEX_MIX)) {
ImBuf *ibuf;
Image *image = palcolor->ima;
@@ -192,6 +195,7 @@ static DRWShadingGroup *GPENCIL_shgroup_fill_create(GPENCIL_Data *vedata, DRWPas
txl->texture = GPU_texture_from_blender(palcolor->ima, &iuser, GL_TEXTURE_2D, true, 0.0, 0);
DRW_shgroup_uniform_texture(grp, "myTexture", txl->texture, 0);
+ // TODO: How apply these parameters
//if (flag & PAC_COLOR_TEX_CLAMP) {
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
@@ -208,6 +212,17 @@ static DRWShadingGroup *GPENCIL_shgroup_fill_create(GPENCIL_Data *vedata, DRWPas
return grp;
}
+/* create shading group for volumetric points */
+static DRWShadingGroup *GPENCIL_shgroup_point_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;
+}
+
/* create shading group for strokes */
static DRWShadingGroup *GPENCIL_shgroup_stroke_create(GPENCIL_Data *vedata, DRWPass *pass, PaletteColor *palcolor)
{
@@ -219,7 +234,7 @@ static DRWShadingGroup *GPENCIL_shgroup_stroke_create(GPENCIL_Data *vedata, DRWP
return grp;
}
-/* create shading group for volumetric */
+/* create shading group for edit points using volumetric */
static DRWShadingGroup *GPENCIL_shgroup_edit_volumetric_create(GPENCIL_Data *vedata, DRWPass *pass)
{
GPENCIL_TextureList *txl = ((GPENCIL_Data *)vedata)->txl;
@@ -230,7 +245,7 @@ static DRWShadingGroup *GPENCIL_shgroup_edit_volumetric_create(GPENCIL_Data *ved
return grp;
}
-/* create shading group for drawing strokes */
+/* create shading group for drawing strokes in buffer */
static DRWShadingGroup *GPENCIL_shgroup_drawing_stroke_create(GPENCIL_Data *vedata, DRWPass *pass, PaletteColor *palcolor)
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
@@ -240,7 +255,7 @@ static DRWShadingGroup *GPENCIL_shgroup_drawing_stroke_create(GPENCIL_Data *veda
return grp;
}
-/* create shading group for drawing fill */
+/* create shading group for drawing fill in buffer */
static DRWShadingGroup *GPENCIL_shgroup_drawing_fill_create(GPENCIL_Data *vedata, DRWPass *pass, PaletteColor *palcolor)
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
@@ -275,6 +290,7 @@ 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);
+ stl->g_data->shgrps_point_volumetric = GPENCIL_shgroup_point_volumetric_create(vedata, psl->stroke_pass);
/* edit pass */
psl->edit_pass = DRW_pass_create("Gpencil Edit Pass", state);
@@ -300,6 +316,7 @@ static int GPENCIL_shgroup_find(GPENCIL_Storage *storage, PaletteColor *palcolor
return -1;
}
+/* main function to draw strokes */
static void gpencil_draw_strokes(void *vedata, ToolSettings *ts, Object *ob,
bGPDlayer *gpl, bGPDframe *gpf,
const float opacity, const float tintcolor[4], const bool onion, const bool custonion)
@@ -338,18 +355,19 @@ static void gpencil_draw_strokes(void *vedata, ToolSettings *ts, Object *ob,
continue;
}
/* try to find shader group or create a new one */
- int id = GPENCIL_shgroup_find(stl->storage, gps->palcolor);
- if (id == -1) {
- id = stl->storage->pal_id;
- stl->storage->materials[id] = gps->palcolor;
- stl->storage->shgrps_fill[id] = GPENCIL_shgroup_fill_create(vedata, psl->fill_pass, gps->palcolor, id);
- stl->storage->shgrps_stroke[id] = GPENCIL_shgroup_stroke_create(vedata, psl->stroke_pass, gps->palcolor);
- ++stl->storage->pal_id;
- }
-
- fillgrp = stl->storage->shgrps_fill[id];
- strokegrp = stl->storage->shgrps_stroke[id];
+ if (gps->totpoints > 1) {
+ int id = GPENCIL_shgroup_find(stl->storage, gps->palcolor);
+ if (id == -1) {
+ id = stl->storage->pal_id;
+ stl->storage->materials[id]
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list