[Bf-blender-cvs] [534c715bf5b] greasepencil-object: Merge branch 'blender2.8' into greasepencil-object

Antonio Vazquez noreply at git.blender.org
Sun Jul 8 16:18:55 CEST 2018


Commit: 534c715bf5b1a7746b8dbd94d1ea79d7e21254bb
Author: Antonio Vazquez
Date:   Sun Jul 8 16:17:35 2018 +0200
Branches: greasepencil-object
https://developer.blender.org/rB534c715bf5b1a7746b8dbd94d1ea79d7e21254bb

Merge branch 'blender2.8' into greasepencil-object

 Conflicts:
	source/blender/editors/gpencil/drawgpencil.c
	source/blender/editors/gpencil/gpencil_brush.c

===================================================================



===================================================================

diff --cc source/blender/editors/gpencil/drawgpencil.c
index 9d84a05435a,ec4310213ef..5178d91af62
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@@ -559,128 -493,73 +559,128 @@@ static void gp_triangulate_stroke_fill(
  	}
  
  	/* clear memory */
 -	if (tmp_triangles) MEM_freeN(tmp_triangles);
 -	if (points2d) MEM_freeN(points2d);
 +	MEM_SAFE_FREE(tmp_triangles);
 +	MEM_SAFE_FREE(points2d);
 +	MEM_SAFE_FREE(uv);
  }
  
 -
 -/* draw fills for shapes */
 -static void gp_draw_stroke_fill(
 -        bGPdata *gpd, bGPDstroke *gps,
 -        int offsx, int offsy, int winx, int winy, const float diff_mat[4][4], const float color[4])
 +/* add a new fill point and texture coordinates to vertex buffer */
 +static void gp_add_filldata_tobuffer(
 +        const bGPDspoint *pt, const float uv[2], uint pos, unsigned texcoord, short flag,
 +        int offsx, int offsy, int winx, int winy, const float diff_mat[4][4])
  {
  	float fpt[3];
 +	float co[2];
  
 -	BLI_assert(gps->totpoints >= 3);
 +	mul_v3_m4v3(fpt, diff_mat, &pt->x);
 +	/* if 2d, need conversion */
 +	if (!flag & GP_STROKE_3DSPACE) {
 +		gp_calc_2d_stroke_fxy(fpt, flag, offsx, offsy, winx, winy, co);
 +		copy_v2_v2(fpt, co);
 +		fpt[2] = 0.0f; /* 2d always is z=0.0f */
 +	}
  
 -	bGPDpalettecolor *palcolor = ED_gpencil_stroke_getcolor(gpd, gps);
 +	immAttrib2f(texcoord, uv[0], uv[1]); /* texture coordinates */
 +	immVertex3fv(pos, fpt); /* position */
 +}
  
 -	/* Triangulation fill if high quality flag is enabled */
 -	if (palcolor->flag & PC_COLOR_HQ_FILL) {
 -		/* Calculate triangles cache for filling area (must be done only after changes) */
 -		if ((gps->flag & GP_STROKE_RECALC_CACHES) || (gps->tot_triangles == 0) || (gps->triangles == NULL)) {
 -			gp_triangulate_stroke_fill(gps);
 -		}
 -		BLI_assert(gps->tot_triangles >= 1);
 +#if 0 /* GPXX disabled, not used in annotations */
 +/* assign image texture for filling stroke */
 +static int gp_set_filling_texture(Image *image, short flag)
 +{
 +	ImBuf *ibuf;
 +	unsigned int *bind = &image->bindcode[TEXTARGET_TEXTURE_2D];
 +	int error = GL_NO_ERROR;
 +	ImageUser iuser = { NULL };
 +	void *lock;
  
 -		uint pos;
 -		if (gps->flag & GP_STROKE_3DSPACE) {
 -			pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
 -			immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
 -		}
 -		else {
 -			pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
 -			immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
 -		}
 +	iuser.ok = true;
  
 -		immUniformColor4fv(color);
 +	ibuf = BKE_image_acquire_ibuf(image, &iuser, &lock);
  
 -		/* Draw all triangles for filling the polygon (cache must be calculated before) */
 -		immBegin(GWN_PRIM_TRIS, gps->tot_triangles * 3);
 -		/* TODO: use batch instead of immediate mode, to share vertices */
 +	if (ibuf == NULL || ibuf->rect == NULL) {
 +		BKE_image_release_ibuf(image, ibuf, NULL);
 +		return (int)GL_INVALID_OPERATION;
 +	}
  
 -		bGPDtriangle *stroke_triangle = gps->triangles;
 -		bGPDspoint *pt;
 +	GPU_create_gl_tex(bind, ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y, GL_TEXTURE_2D,
 +		false, false, image);
  
 -		if (gps->flag & GP_STROKE_3DSPACE) {
 -			for (int i = 0; i < gps->tot_triangles; i++, stroke_triangle++) {
 -				for (int j = 0; j < 3; j++) {
 -					pt = &gps->points[stroke_triangle->verts[j]];
 -					mul_v3_m4v3(fpt, diff_mat, &pt->x);
 -					immVertex3fv(pos, fpt);
 -				}
 -			}
 -		}
 -		else {
 -			for (int i = 0; i < gps->tot_triangles; i++, stroke_triangle++) {
 -				for (int j = 0; j < 3; j++) {
 -					float co[2];
 -					pt = &gps->points[stroke_triangle->verts[j]];
 -					mul_v3_m4v3(fpt, diff_mat, &pt->x);
 -					gp_calc_2d_stroke_fxy(fpt, gps->flag, offsx, offsy, winx, winy, co);
 -					immVertex3fv(pos, fpt);
 -				}
 -			}
 -		}
 +	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 +	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 +	if (flag & GP_STYLE_COLOR_TEX_CLAMP) {
 +		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
 +		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
 +	}
 +	else {
 +		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 +		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 +	}
 +	BKE_image_release_ibuf(image, ibuf, NULL);
  
 -		immEnd();
 -		immUnbindProgram();
 +	return error;
 +}
 +#endif
 +
 +/* draw fills for shapes */
 +static void gp_draw_stroke_fill(
 +        bGPdata *gpd, bGPDstroke *gps,
 +        int offsx, int offsy, int winx, int winy, const float diff_mat[4][4], const float color[4])
 +{
 +	BLI_assert(gps->totpoints >= 3);
 +	Material *ma = gpd->mat[gps->mat_nr];
 +	MaterialGPencilStyle *gp_style = ma->gp_style;
 +
 +	/* Calculate triangles cache for filling area (must be done only after changes) */
 +	if ((gps->flag & GP_STROKE_RECALC_CACHES) || (gps->tot_triangles == 0) || (gps->triangles == NULL)) {
 +		gp_triangulate_stroke_fill(gps);
 +	}
 +	BLI_assert(gps->tot_triangles >= 1);
 +
 +	Gwn_VertFormat *format = immVertexFormat();
- 	unsigned pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
- 	unsigned texcoord = GWN_vertformat_attr_add(format, "texCoord", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
++	uint pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
++	unit texcoord = GWN_vertformat_attr_add(format, "texCoord", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
 +	immBindBuiltinProgram(GPU_SHADER_GPENCIL_FILL);
 +
 +	immUniformColor4fv(color);
 +	immUniform4fv("color2", gp_style->mix_rgba);
 +	immUniform1i("fill_type", gp_style->fill_style);
 +	immUniform1f("mix_factor", gp_style->mix_factor);
 +
 +	immUniform1f("gradient_angle", gp_style->gradient_angle);
 +	immUniform1f("gradient_radius", gp_style->gradient_radius);
 +	immUniform1f("pattern_gridsize", gp_style->pattern_gridsize);
 +	immUniform2fv("gradient_scale", gp_style->gradient_scale);
 +	immUniform2fv("gradient_shift", gp_style->gradient_shift);
 +
 +	immUniform1f("texture_angle", gp_style->texture_angle);
 +	immUniform2fv("texture_scale", gp_style->texture_scale);
 +	immUniform2fv("texture_offset", gp_style->texture_offset);
 +	immUniform1f("texture_opacity", gp_style->texture_opacity);
 +	immUniform1i("t_mix", gp_style->flag & GP_STYLE_COLOR_TEX_MIX ? 1 : 0);
 +	immUniform1i("t_flip", gp_style->flag & GP_STYLE_COLOR_FLIP_FILL ? 1 : 0);
 +#if 0 /* GPXX disabled, not used in annotations */
 +	/* image texture */
 +	if ((gp_style->fill_style == GP_STYLE_FILL_STYLE_TEXTURE) || (gp_style->flag & GP_STYLE_COLOR_TEX_MIX)) {
 +		gp_set_filling_texture(gp_style->ima, gp_style->flag);
 +	}
 +#endif
 +	/* Draw all triangles for filling the polygon (cache must be calculated before) */
 +	immBegin(GWN_PRIM_TRIS, gps->tot_triangles * 3);
 +	/* TODO: use batch instead of immediate mode, to share vertices */
 +
 +	const bGPDtriangle *stroke_triangle = gps->triangles;
 +	for (int i = 0; i < gps->tot_triangles; i++, stroke_triangle++) {
 +		for (int j = 0; j < 3; j++) {
 +			gp_add_filldata_tobuffer(
 +			        &gps->points[stroke_triangle->verts[j]], stroke_triangle->uv[j],
 +			        pos, texcoord, gps->flag,
 +			        offsx, offsy, winx, winy, diff_mat);
 +		}
  	}
 +
 +	immEnd();
 +	immUnbindProgram();
  }
  
  /* ----- Existing Strokes Drawing (3D and Point) ------ */
@@@ -722,35 -601,29 +722,35 @@@ static void gp_draw_stroke_point
  	immUnbindProgram();
  }
  
 -/* draw a given stroke in 3d (i.e. in 3d-space), using simple ogl lines */
 -static void gp_draw_stroke_3d(const bGPDspoint *points, int totpoints, short thickness, bool UNUSED(debug),
 -                              short UNUSED(sflag), const float diff_mat[4][4], const float ink[4], bool cyclic)
 +/* draw a given stroke in 3d (i.e. in 3d-space) */
 +static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4], bool cyclic)
  {
 +	bGPDspoint *points = tgpw->gps->points;
 +	int totpoints = tgpw->gps->totpoints;
 +
 +	const float viewport[2] = { (float)tgpw->winx, (float)tgpw->winy };
  	float curpressure = points[0].pressure;
  	float fpt[3];
 -	float cyclic_fpt[3];
 -	int draw_points = 0;
 -
 -	/* if cyclic needs one vertex more */
 -	int cyclic_add = 0;
 -	if (cyclic) {
 -		++cyclic_add;
 -	}
  
 +	/* if cyclic needs more vertex */
 +	int cyclic_add = (cyclic) ? 1 : 0;
  
  	Gwn_VertFormat *format = immVertexFormat();
- 	unsigned pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
- 	unsigned color = GWN_vertformat_attr_add(format, "color", GWN_COMP_U8, 4, GWN_FETCH_INT_TO_FLOAT_UNIT);
- 	unsigned thickattrib = GWN_vertformat_attr_add(format, "thickness", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
+ 	uint pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
+ 	uint color = GWN_vertformat_attr_add(format, "color", GWN_COMP_U8, 4, GWN_FETCH_INT_TO_FLOAT_UNIT);
++	uint thickattrib = GWN_vertformat_attr_add(format, "thickness", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
  
 -	immBindBuiltinProgram(GPU_SHADER_3D_SMOOTH_COLOR);
 +	immBindBuiltinProgram(GPU_SHADER_GPENCIL_STROKE);
 +	immUniform2fv("Viewport", viewport);
 +	immUniform1f("pixsize", tgpw->rv3d->pixsize);
 +	immUniform1f("pixelsize", U.pixelsize);
 +	float obj_scale = (tgpw->ob->size[0] + tgpw->ob->size[1] + tgpw->ob->size[2]) / 3.0f;
  
 -	/* TODO: implement this with a geometry shader to draw one continuous tapered stroke */
 +	immUniform1f("objscale", obj_scale);
 +	int keep_size = (int)((tgpw->gpd) && (tgpw->gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS));
 +	immUniform1i("keep_size", keep_size);
 +	immUniform1i("pixfactor", tgpw->gpd->pixfactor);
 +	immUniform1i("xraymode", tgpw->gpd->xray_mode);
  
  	/* draw stroke curve */
  	GPU_line_width(max_ff(curpressure * thickness, 1.0f));
@@@ -1280,9 -1151,9 +1280,9 @@@ static void gp_draw_strokes_edit
  		selectColor[3] = alpha;
  
  		Gwn_VertFormat *format = immVertexFormat();
- 		unsigned int pos; /* specified later */
- 		unsigned int size = GWN_vertformat_attr_add(format, "size", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
- 		unsigned int color = GWN_vertformat_attr_add(format, "color", GWN_COMP_U8, 3, GWN_FETCH_INT_TO_FLO

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list