[Bf-blender-cvs] [44d3c80a740] greasepencil-object: WIP: Add UV rotation for Dot texture

Antonio Vazquez noreply at git.blender.org
Tue Feb 20 17:02:18 CET 2018


Commit: 44d3c80a740f6c0a5ea4c18d01c0b43d96f511bb
Author: Antonio Vazquez
Date:   Tue Feb 20 10:07:15 2018 +0100
Branches: greasepencil-object
https://developer.blender.org/rB44d3c80a740f6c0a5ea4c18d01c0b43d96f511bb

WIP: Add UV rotation for Dot texture

Now the ramdom is fixed. Need parameters to adjust.

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

M	source/blender/draw/engines/gpencil/gpencil_geom.c
M	source/blender/draw/engines/gpencil/shaders/gpencil_point_geom.glsl
M	source/blender/editors/gpencil/gpencil_paint.c

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_geom.c b/source/blender/draw/engines/gpencil/gpencil_geom.c
index 433ab190813..4374aad75da 100644
--- a/source/blender/draw/engines/gpencil/gpencil_geom.c
+++ b/source/blender/draw/engines/gpencil/gpencil_geom.c
@@ -67,7 +67,7 @@ static void gpencil_set_stroke_point(
 	GWN_vertbuf_attr_set(vbo, color_id, idx, col);
 
 	/* transfer both values using the same shader variable */
-	float uvdata[2] = { pt->uv_fac , pt->uv_rot };
+	float uvdata[2] = { pt->uv_fac, pt->uv_rot };
 	GWN_vertbuf_attr_set(vbo, uvdata_id, idx, uvdata);
 
 	/* the thickness of the stroke must be affected by zoom, so a pixel scale is calculated */
@@ -82,11 +82,12 @@ static void gpencil_set_stroke_point(
 Gwn_Batch *DRW_gpencil_get_point_geom(bGPDstroke *gps, short thickness, const float ink[4])
 {
 	static Gwn_VertFormat format = { 0 };
-	static uint pos_id, color_id, size_id;
+	static uint pos_id, color_id, size_id, uvdata_id;
 	if (format.attrib_ct == 0) {
 		pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
 		color_id = GWN_vertformat_attr_add(&format, "color", GWN_COMP_F32, 4, GWN_FETCH_FLOAT);
 		size_id = GWN_vertformat_attr_add(&format, "thickness", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
+		uvdata_id = GWN_vertformat_attr_add(&format, "uvdata", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
 	}
 
 	Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
@@ -108,6 +109,11 @@ Gwn_Batch *DRW_gpencil_get_point_geom(bGPDstroke *gps, short thickness, const fl
 
 		GWN_vertbuf_attr_set(vbo, color_id, idx, col);
 		GWN_vertbuf_attr_set(vbo, size_id, idx, &thick);
+
+		/* transfer both values using the same shader variable */
+		float uvdata[2] = { pt->uv_fac, pt->uv_rot };
+		GWN_vertbuf_attr_set(vbo, uvdata_id, idx, uvdata);
+
 		GWN_vertbuf_attr_set(vbo, pos_id, idx, &pt->x);
 		++idx;
 	}
@@ -129,7 +135,7 @@ Gwn_Batch *DRW_gpencil_get_stroke_geom(bGPDframe *gpf, bGPDstroke *gps, short th
 		pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
 		color_id = GWN_vertformat_attr_add(&format, "color", GWN_COMP_F32, 4, GWN_FETCH_FLOAT);
 		thickness_id = GWN_vertformat_attr_add(&format, "thickness", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
-		uvdata_id = GWN_vertformat_attr_add(&format, "uvdata", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
+		uvdata_id = GWN_vertformat_attr_add(&format, "uvdata", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
 	}
 
 	Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
@@ -234,7 +240,7 @@ Gwn_Batch *DRW_gpencil_get_buffer_stroke_geom(bGPdata *gpd, float matrix[4][4],
 		pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
 		color_id = GWN_vertformat_attr_add(&format, "color", GWN_COMP_F32, 4, GWN_FETCH_FLOAT);
 		thickness_id = GWN_vertformat_attr_add(&format, "thickness", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
-		uvdata_id = GWN_vertformat_attr_add(&format, "uvdata", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
+		uvdata_id = GWN_vertformat_attr_add(&format, "uvdata", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
 	}
 
 	Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
@@ -307,7 +313,7 @@ Gwn_Batch *DRW_gpencil_get_buffer_point_geom(bGPdata *gpd, float matrix[4][4], s
 		pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
 		color_id = GWN_vertformat_attr_add(&format, "color", GWN_COMP_F32, 4, GWN_FETCH_FLOAT);
 		thickness_id = GWN_vertformat_attr_add(&format, "thickness", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
-		uvdata_id = GWN_vertformat_attr_add(&format, "uvdata", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
+		uvdata_id = GWN_vertformat_attr_add(&format, "uvdata", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
 	}
 
 	Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_point_geom.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_point_geom.glsl
index 6aff535d6ed..0abca0d31e7 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_point_geom.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_point_geom.glsl
@@ -38,6 +38,17 @@ float getZdepth(vec4 point)
 	/* in front by default */
 	return 0.0;
 }
+
+vec2 rotateUV(vec2 uv, float angle)
+{
+	/* translate center of rotation to the center of texture */
+	vec2 new_uv = uv - vec2(0.5f, 0.5f);
+	vec2 rot_uv;
+	rot_uv.x = new_uv.x * cos(angle) - new_uv.y * sin(angle);
+	rot_uv.y = new_uv.y * cos(angle) + new_uv.x * sin(angle);
+	return rot_uv + vec2(0.5f, 0.5f);
+}
+
 void main(void)
 {
 	/* receive 4 points */
@@ -46,24 +57,23 @@ void main(void)
 	
 	float size = finalThickness[0] * 0.5; 
 	float aspect = 1.0;
-
 	/* generate the triangle strip */
-	mTexCoord = vec2(0, 1);
+	mTexCoord = rotateUV(vec2(0, 1), finaluvdata[0].y);
 	mColor = finalColor[0];
 	gl_Position = vec4(vec2(sp0.x - size, sp0.y + size * aspect) / Viewport, getZdepth(P0), 1.0);
 	EmitVertex();
 
-	mTexCoord = vec2(0, 0);
+	mTexCoord = rotateUV(vec2(0, 0), finaluvdata[0].y);
 	mColor = finalColor[0];
 	gl_Position = vec4(vec2(sp0.x - size, sp0.y - size * aspect) / Viewport, getZdepth(P0), 1.0);
 	EmitVertex();
 
-	mTexCoord = vec2(1, 1);
+	mTexCoord = rotateUV(vec2(1, 1), finaluvdata[0].y);
 	mColor = finalColor[0];
 	gl_Position = vec4(vec2(sp0.x + size, sp0.y + size * aspect) / Viewport, getZdepth(P0), 1.0);
 	EmitVertex();
 
-	mTexCoord = vec2(1, 0);
+	mTexCoord = rotateUV(vec2(1, 0), finaluvdata[0].y);
 	mColor = finalColor[0];
 	gl_Position = vec4(vec2(sp0.x + size, sp0.y - size * aspect) / Viewport, getZdepth(P0), 1.0);
 	EmitVertex();
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index 29f45298718..1af8d9e2b17 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -577,6 +577,16 @@ static short gp_stroke_addpoint(
 			CLAMP(pt->pressure, GPENCIL_STRENGTH_MIN, 1.0f);
 		}
 
+		/* apply random to uv texture rotation */
+		if (BLI_frand() > 0.5f) {
+			pt->uv_rot = BLI_frand() * M_PI * -1;
+		}
+		else {
+			pt->uv_rot = BLI_frand() * M_PI_4;
+		}
+		CLAMP(pt->uv_rot, -M_PI_2, M_PI_2);
+
+
 		/* apply angle of stroke to brush size */
 		if (brush->draw_angle_factor > 0.0f) {
 			gp_brush_angle(gpd, brush, pt, mval);
@@ -685,6 +695,8 @@ static short gp_stroke_addpoint(
 			pts->time = pt->time;
 			pts->totweight = 0;
 			pts->weights = NULL;
+			pts->uv_fac = pt->uv_fac;
+			pts->uv_rot = pt->uv_rot;
 
 			/* force fill recalc */
 			gps->flag |= GP_STROKE_RECALC_CACHES;
@@ -991,6 +1003,8 @@ static void gp_stroke_newfrombuffer(tGPsdata *p)
 			pt->time = ptc->time;
 			pt->totweight = 0;
 			pt->weights = NULL;
+			pt->uv_fac = ptc->uv_fac;
+			pt->uv_rot = ptc->uv_rot;
 		}
 
 		/* subdivide and smooth the stroke */



More information about the Bf-blender-cvs mailing list