[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