[Bf-blender-cvs] [9c65a999592] greasepencil-object: WIP: Apply scale to strokes thickness

Antonio Vazquez noreply at git.blender.org
Tue May 2 22:57:00 CEST 2017


Commit: 9c65a99959213f7a5c87f713fe522cbec497fc38
Author: Antonio Vazquez
Date:   Tue May 2 20:37:35 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB9c65a99959213f7a5c87f713fe522cbec497fc38

WIP: Apply scale to strokes thickness

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

M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/engines/gpencil/shaders/gpencil_stroke_geom.glsl

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 1b196b4cef4..91d505f4fde 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -29,8 +29,11 @@
 #include "BKE_gpencil.h"
 #include "BKE_image.h"
 #include "ED_gpencil.h"
+#include "ED_view3d.h"
 
 #include "DNA_gpencil_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_view3d_types.h"
 
  /* If builtin shaders are needed */
 #include "GPU_shader.h"
@@ -108,6 +111,7 @@ static struct {
 	struct GPUShader *gpencil_stroke_sh;
 	struct GPUShader *gpencil_volumetric_sh;
 	struct GPUShader *gpencil_drawing_fill_sh;
+	float scale;
 } e_data = {NULL}; /* Engine data */
 
 /* *********** FUNCTIONS *********** */
@@ -223,13 +227,54 @@ static DRWShadingGroup *GPENCIL_shgroup_point_volumetric_create(GPENCIL_Data *ve
 	return grp;
 }
 
+/* calculate scale of viewport */
+static float get_view_scale(ARegion *ar, View3D *v3d)
+{
+	RegionView3D *rv3d = ar->regiondata;
+
+	double fx = rv3d->persmat[3][0];
+	double fy = rv3d->persmat[3][1];
+	double fw = rv3d->persmat[3][3];
+
+	const double wx = 0.5 * ar->winx;  /* use double precision to avoid rounding errors */
+	const double wy = 0.5 * ar->winy;
+
+	double x = wx * fx / fw;
+	double y = wy * fy / fw;
+
+	double vec4[4] = { 1.0, 1.0, 0.0, 1.0 };
+	mul_m4_v4d(rv3d->persmat, vec4);
+	fx = vec4[0];
+	fy = vec4[1];
+	fw = vec4[3];
+
+	double dx = fabs(x - wx * fx / fw);
+	if (dx == 0) dx = fabs(y - wy * fy / fw);
+
+	x += wx;
+	y += wy;
+	return dx;
+}
+
 /* create shading group for strokes */
 static DRWShadingGroup *GPENCIL_shgroup_stroke_create(GPENCIL_Data *vedata, DRWPass *pass, PaletteColor *palcolor)
 {
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	ARegion *ar = draw_ctx->ar;
+	View3D *v3d = draw_ctx->v3d;
+	const float *viewport_size = DRW_viewport_size_get();
 
+	/* TODO: need a better way to detect the scale factor */
+	float size = get_view_scale(ar, v3d);
+
+	e_data.scale = size / 100.0f;
+	if (e_data.scale < 0.001f) {
+		e_data.scale = 0.001f;
+	}
 	DRWShadingGroup *grp = DRW_shgroup_create(e_data.gpencil_stroke_sh, pass);
-	DRW_shgroup_uniform_vec2(grp, "Viewport", DRW_viewport_size_get(), 1);
+	DRW_shgroup_uniform_vec2(grp, "Viewport", viewport_size, 1);
+	DRW_shgroup_uniform_float(grp, "scale", &e_data.scale, 1);
 
 	return grp;
 }
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_geom.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_geom.glsl
index fd69f647728..931d1067db3 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_geom.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_geom.glsl
@@ -1,6 +1,6 @@
 uniform mat4 ModelViewProjectionMatrix;
 uniform vec2 Viewport;
-//uniform vec2 Offset;
+uniform float scale;
 
 layout(lines_adjacency) in;
 layout(triangle_strip, max_vertices = 7) out;
@@ -73,12 +73,12 @@ void main(void)
 		if (dot(v0, n1) > 0) {
 			mTexCoord = vec2(0, 0);
 			mColor = finalColor[1];
-			gl_Position = vec4((sp1 + finalThickness[1] * n0) / Viewport, 0.0, 1.0);
+			gl_Position = vec4((sp1 + (finalThickness[1] * scale) * n0) / Viewport, 0.0, 1.0);
 			EmitVertex();
 
 			mTexCoord = vec2(0, 0);
 			mColor = finalColor[1];
-			gl_Position = vec4((sp1 + finalThickness[1] * n1) / Viewport, 0.0, 1.0);
+			gl_Position = vec4((sp1 + (finalThickness[1] * scale) * n1) / Viewport, 0.0, 1.0);
 			EmitVertex();
 
 			mTexCoord = vec2(0, 0.5);
@@ -91,12 +91,12 @@ void main(void)
 		else {
 			mTexCoord = vec2(0, 1);
 			mColor = finalColor[1];
-			gl_Position = vec4((sp1 - finalThickness[1] * n1) / Viewport, 0.0, 1.0);
+			gl_Position = vec4((sp1 - (finalThickness[1] * scale) * n1) / Viewport, 0.0, 1.0);
 			EmitVertex();
 
 			mTexCoord = vec2(0, 1);
 			mColor = finalColor[1];
-			gl_Position = vec4((sp1 - finalThickness[1] * n0) / Viewport, 0.0, 1.0);
+			gl_Position = vec4((sp1 - (finalThickness[1] * scale) * n0) / Viewport, 0.0, 1.0);
 			EmitVertex();
 
 			mTexCoord = vec2(0, 0.5);
@@ -116,22 +116,22 @@ void main(void)
 	/* generate the triangle strip */
 	mTexCoord = vec2(0, 0);
 	mColor = finalColor[1];
-	gl_Position = vec4((sp1 + length_a * miter_a) / Viewport, 0.0, 1.0);
+	gl_Position = vec4((sp1 + (length_a * scale) * miter_a) / Viewport, 0.0, 1.0);
 	EmitVertex();
 
 	mTexCoord = vec2(0, 1);
 	mColor = finalColor[1];
-	gl_Position = vec4((sp1 - length_a * miter_a) / Viewport, 0.0, 1.0);
+	gl_Position = vec4((sp1 - (length_a * scale) * miter_a) / Viewport, 0.0, 1.0);
 	EmitVertex();
 
 	mTexCoord = vec2(0, 0);
 	mColor = finalColor[2];
-	gl_Position = vec4((sp2 + length_b * miter_b) / Viewport, 0.0, 1.0);
+	gl_Position = vec4((sp2 + (length_b * scale) * miter_b) / Viewport, 0.0, 1.0);
 	EmitVertex();
 
 	mTexCoord = vec2(0, 1);
 	mColor = finalColor[2];
-	gl_Position = vec4((sp2 - length_b * miter_b) / Viewport, 0.0, 1.0);
+	gl_Position = vec4((sp2 - (length_b * scale) * miter_b) / Viewport, 0.0, 1.0);
 	EmitVertex();
 
 	EndPrimitive();




More information about the Bf-blender-cvs mailing list