[Bf-blender-cvs] [4388bbf9d6d] greasepencil-object: Remove inverse matrix in drawing

Antonio Vazquez noreply at git.blender.org
Thu Apr 13 12:24:21 CEST 2017


Commit: 4388bbf9d6d85836eb50e888a9e64fdb62d293c8
Author: Antonio Vazquez
Date:   Thu Apr 13 12:20:34 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB4388bbf9d6d85836eb50e888a9e64fdb62d293c8

Remove inverse matrix in drawing

With new shaders, it is better to use a object global matrix and do not calculate for each point the position.

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

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 ccd249695f3..7ee9ef84dfe 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw.c
@@ -47,7 +47,7 @@
 static void gpencil_set_stroke_point(VertexBuffer *vbo, const bGPDspoint *pt, int idx,
 						    unsigned int pos_id, unsigned int color_id,
 							unsigned int thickness_id, short thickness,
-	                        const float diff_mat[4][4], const float ink[4], bool inverse)
+	                        const float ink[4], bool inverse)
 {
 	float fpt[3];
 
@@ -59,7 +59,7 @@ static void gpencil_set_stroke_point(VertexBuffer *vbo, const bGPDspoint *pt, in
 	float thick = max_ff(pt->pressure * thickness, 1.0f);
 	VertexBuffer_set_attrib(vbo, thickness_id, idx, &thick);
 
-	mul_v3_m4v3(fpt, diff_mat, &pt->x);
+	copy_v3_v3(fpt, &pt->x);
 	if (inverse) {
 		mul_v3_fl(fpt, -1.0f);
 	}
@@ -67,7 +67,7 @@ static void gpencil_set_stroke_point(VertexBuffer *vbo, const bGPDspoint *pt, in
 }
 
 /* create batch geometry data for stroke shader */
-Batch *gpencil_get_stroke_geom(bGPDstroke *gps, short thickness, const float diff_mat[4][4], const float ink[4])
+Batch *gpencil_get_stroke_geom(bGPDstroke *gps, short thickness, const float ink[4])
 {
 	bGPDspoint *points = gps->points;
 	int totpoints = gps->totpoints;
@@ -91,27 +91,27 @@ Batch *gpencil_get_stroke_geom(bGPDstroke *gps, short thickness, const float dif
 	for (int i = 0; i < totpoints; i++, pt++) {
 		/* first point for adjacency (not drawn) */
 		if (i == 0) {
-			gpencil_set_stroke_point(vbo, pt, idx, pos_id, color_id, thickness_id, thickness, diff_mat, ink, true);
+			gpencil_set_stroke_point(vbo, pt, idx, pos_id, color_id, thickness_id, thickness, ink, true);
 			++idx;
 		}
 		/* set point */
-		gpencil_set_stroke_point(vbo, pt, idx, pos_id, color_id, thickness_id, thickness, diff_mat, ink, false);
+		gpencil_set_stroke_point(vbo, pt, idx, pos_id, color_id, thickness_id, thickness, ink, false);
 		++idx;
 	}
 
 	if (gps->flag & GP_STROKE_CYCLIC && totpoints > 2) {
 		/* draw line to first point to complete the cycle */
-		gpencil_set_stroke_point(vbo, &points[0], idx, pos_id, color_id, thickness_id, thickness, diff_mat, ink, false);
+		gpencil_set_stroke_point(vbo, &points[0], idx, pos_id, color_id, thickness_id, thickness, ink, false);
 		++idx;
 		/* now add adjacency points using 2nd & 3rd point to get smooth transition */
-		gpencil_set_stroke_point(vbo, &points[1], idx, pos_id, color_id, thickness_id, thickness, diff_mat, ink, false);
+		gpencil_set_stroke_point(vbo, &points[1], idx, pos_id, color_id, thickness_id, thickness, ink, false);
 		++idx;
-		gpencil_set_stroke_point(vbo, &points[2], idx, pos_id, color_id, thickness_id, thickness, diff_mat, ink, false);
+		gpencil_set_stroke_point(vbo, &points[2], idx, pos_id, color_id, thickness_id, thickness, ink, false);
 		++idx;
 	}
 	/* last adjacency point (not drawn) */
 	else {
-		gpencil_set_stroke_point(vbo, &points[totpoints - 1], idx, pos_id, color_id, thickness_id, thickness, diff_mat, ink, true);
+		gpencil_set_stroke_point(vbo, &points[totpoints - 1], idx, pos_id, color_id, thickness_id, thickness, ink, true);
 	}
 
 	return Batch_create(PRIM_LINE_STRIP_ADJACENCY, vbo, NULL);
@@ -298,12 +298,8 @@ static void gp_triangulate_stroke_fill(bGPDstroke *gps)
 /* add a new fill point and texture coordinates to vertex buffer */
 static void gpencil_set_fill_point(VertexBuffer *vbo, int idx, bGPDspoint *pt, float uv[2],
 	unsigned int pos_id, unsigned int text_id,
-	short UNUSED(flag),	int UNUSED(offsx), int UNUSED(offsy), int UNUSED(winx), int UNUSED(winy),
-	const float diff_mat[4][4])
+	short UNUSED(flag),	int UNUSED(offsx), int UNUSED(offsy), int UNUSED(winx), int UNUSED(winy))
 {
-	float fpt[3];
-
-	mul_v3_m4v3(fpt, diff_mat, &pt->x);
 #if 0
 	/* if 2d, need conversion */
 	if (!flag & GP_STROKE_3DSPACE) {
@@ -313,12 +309,13 @@ static void gpencil_set_fill_point(VertexBuffer *vbo, int idx, bGPDspoint *pt, f
 		fpt[2] = 0.0f; /* 2d always is z=0.0f */
 	}
 #endif
-	VertexBuffer_set_attrib(vbo, pos_id, idx, fpt);
+
+	VertexBuffer_set_attrib(vbo, pos_id, idx, &pt->x);
 	VertexBuffer_set_attrib(vbo, text_id, idx, uv);
 }
 
 /* create batch geometry data for stroke shader */
-Batch *gpencil_get_fill_geom(bGPDstroke *gps, const float diff_mat[4][4], const float color[4])
+Batch *gpencil_get_fill_geom(bGPDstroke *gps, const float color[4])
 {
 	BLI_assert(gps->totpoints >= 3);
 	PaletteColor *palcolor = gps->palcolor;
@@ -350,15 +347,15 @@ Batch *gpencil_get_fill_geom(bGPDstroke *gps, const float diff_mat[4][4], const
 	for (int i = 0; i < gps->tot_triangles; i++, stroke_triangle++) {
 		gpencil_set_fill_point(vbo, idx, &gps->points[stroke_triangle->v1], stroke_triangle->uv1,
 			pos_id, text_id, gps->flag,
-			offsx, offsy, winx, winy, diff_mat);
+			offsx, offsy, winx, winy);
 		++idx;
 		gpencil_set_fill_point(vbo, idx, &gps->points[stroke_triangle->v2], stroke_triangle->uv2,
 			pos_id, text_id, gps->flag,
-			offsx, offsy, winx, winy, diff_mat);
+			offsx, offsy, winx, winy);
 		++idx;
 		gpencil_set_fill_point(vbo, idx, &gps->points[stroke_triangle->v3], stroke_triangle->uv3,
 			pos_id, text_id, gps->flag,
-			offsx, offsy, winx, winy, diff_mat);
+			offsx, offsy, winx, winy);
 		++idx;
 	}
 
@@ -366,7 +363,7 @@ Batch *gpencil_get_fill_geom(bGPDstroke *gps, const float diff_mat[4][4], const
 }
 
 /* Draw selected verts for strokes being edited */
-Batch *gpencil_get_edit_geom(bGPDstroke *gps, const float diff_mat[4][4], float alpha, short dflag)
+Batch *gpencil_get_edit_geom(bGPDstroke *gps, float alpha, short dflag)
 {
 	/* Get size of verts:
 	* - The selected state needs to be larger than the unselected state so that
@@ -407,7 +404,6 @@ Batch *gpencil_get_edit_geom(bGPDstroke *gps, const float diff_mat[4][4], float
 
 	/* Draw all the stroke points (selected or not) */
 	bGPDspoint *pt = gps->points;
-	float fpt[3];
 	int idx = 0;
 	float fcolor[4];
 	float fsize = 0;
@@ -434,9 +430,7 @@ Batch *gpencil_get_edit_geom(bGPDstroke *gps, const float diff_mat[4][4], float
 
 		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);
+		VertexBuffer_set_attrib(vbo, pos_id, idx, &pt->x);
 		++idx;
 	}
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_mode.c b/source/blender/draw/engines/gpencil/gpencil_mode.c
index 9ef1e2ad6ed..41a5a283335 100644
--- a/source/blender/draw/engines/gpencil/gpencil_mode.c
+++ b/source/blender/draw/engines/gpencil/gpencil_mode.c
@@ -246,7 +246,6 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob)
 	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];
 
@@ -262,8 +261,6 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob)
 			if (gpf == NULL)
 				continue;
 
-			/* calculate parent position */
-			ED_gpencil_parent_location(ob, ob->gpd, gpl, diff_mat);
 			for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
 				/* check if stroke can be drawn */
 				if (gpencil_can_draw_stroke(gps) == false) {
@@ -288,7 +285,7 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob)
 					interp_v3_v3v3(tfill, gps->palcolor->fill, gpl->tintcolor, gpl->tintcolor[3]);
 					tfill[3] = gps->palcolor->fill[3] * gpl->opacity;
 					if ((tfill[3] > GPENCIL_ALPHA_OPACITY_THRESH) || (gps->palcolor->fill_style > 0)) {
-						struct Batch *fill_geom = gpencil_get_fill_geom(gps, diff_mat, tfill);
+						struct Batch *fill_geom = gpencil_get_fill_geom(gps, tfill);
 						DRW_shgroup_call_add(fillgrp, fill_geom, ob->obmat);
 					}
 				}
@@ -300,7 +297,7 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob)
 
 				short sthickness = gps->thickness + gpl->thickness;
 				if (sthickness > 0) {
-					struct Batch *stroke_geom = gpencil_get_stroke_geom(gps, sthickness, diff_mat, ink);
+					struct Batch *stroke_geom = gpencil_get_stroke_geom(gps, sthickness, ink);
 					DRW_shgroup_call_add(strokegrp, stroke_geom, ob->obmat);
 				}
 
@@ -309,7 +306,7 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob)
 				{
 					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);
+							struct Batch *edit_geom = gpencil_get_edit_geom(gps, ts->gp_sculpt.alpha, ob->gpd->flag);
 							DRW_shgroup_call_add(stl->g_data->shgrps_volumetric, edit_geom,ob->obmat);
 
 						}
diff --git a/source/blender/draw/engines/gpencil/gpencil_mode.h b/source/blender/draw/engines/gpencil/gpencil_mode.h
index c3dc70923a3..b7690656c3f 100644
--- a/source/blender/draw/engines/gpencil/gpencil_mode.h
+++ b/source/blender/draw/engines/gpencil/gpencil_mode.h
@@ -28,9 +28,9 @@
 
 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);
+struct Batch *gpencil_get_stroke_geom(struct bGPDstroke *gps, short thickness, const float ink[4]);
+struct Batch *gpencil_get_fill_geom(struct bGPDstroke *gps, const float color[4]);
+struct Batch *gpencil_get_edit_geom(struct bGPDstroke *gps, float alpha, short dflag);
 
 bool gpencil_can_draw_stroke(const struct bGPDstroke *gps);




More information about the Bf-blender-cvs mailing list