[Bf-blender-cvs] [1955607d69b] greasepencil-object: Fix pixel scale in VFX pixel

Antonio Vazquez noreply at git.blender.org
Sat Dec 9 17:10:14 CET 2017


Commit: 1955607d69b0b35437708cab2ebef0d546678414
Author: Antonio Vazquez
Date:   Sat Dec 9 16:34:34 2017 +0100
Branches: greasepencil-object
https://developer.blender.org/rB1955607d69b0b35437708cab2ebef0d546678414

Fix pixel scale in VFX pixel

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

M	source/blender/draw/engines/gpencil/gpencil_engine.h
M	source/blender/draw/engines/gpencil/gpencil_vfx.c
M	source/blender/draw/engines/gpencil/shaders/gpencil_pixel_frag.glsl

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index fba33875ac6..b40562c5f57 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -79,6 +79,7 @@ typedef struct GPencilVFXSwirl {
 } GPencilVFXSwirl;
 
 typedef struct GPencilVFXPixel {
+	float loc[3];
 	float size[2];
 	float rgba[4];
 	int lines;
diff --git a/source/blender/draw/engines/gpencil/gpencil_vfx.c b/source/blender/draw/engines/gpencil/gpencil_vfx.c
index c02ff8d5b8b..bc1e20f7a69 100644
--- a/source/blender/draw/engines/gpencil/gpencil_vfx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_vfx.c
@@ -253,7 +253,7 @@ static void DRW_gpencil_vfx_blur(
 /* Pixelate VFX */
 static void DRW_gpencil_vfx_pixel(
         ModifierData *md, int ob_idx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
-        Object *UNUSED(ob), tGPencilObjectCache *cache)
+        Object *ob, tGPencilObjectCache *cache)
 {
 	if (md == NULL) {
 		return;
@@ -264,6 +264,8 @@ static void DRW_gpencil_vfx_pixel(
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
 	GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
 	DRWShadingGroup *vfx_shgrp;
+	bGPdata *gpd = (bGPdata *)ob->data;
+
 	stl->vfx[ob_idx].vfx_pixel.size[0] = mmd->size[0];
 	stl->vfx[ob_idx].vfx_pixel.size[1] = mmd->size[1];
 	copy_v4_v4(stl->vfx[ob_idx].vfx_pixel.rgba, mmd->rgba);
@@ -279,6 +281,12 @@ static void DRW_gpencil_vfx_pixel(
 	DRW_shgroup_uniform_vec4(vfx_shgrp, "color", &stl->vfx[ob_idx].vfx_pixel.rgba[0], 1);
 	DRW_shgroup_uniform_int(vfx_shgrp, "uselines", &stl->vfx[ob_idx].vfx_pixel.lines, 1);
 
+	copy_v3_v3(stl->vfx[ob_idx].vfx_pixel.loc, &ob->loc[0]);
+	DRW_shgroup_uniform_vec3(vfx_shgrp, "loc", stl->vfx[ob_idx].vfx_pixel.loc, 1);
+	DRW_shgroup_uniform_float(vfx_shgrp, "pixsize", DRW_viewport_pixelsize_get(), 1);
+	DRW_shgroup_uniform_float(vfx_shgrp, "pixelsize", &U.pixelsize, 1);
+	DRW_shgroup_uniform_int(vfx_shgrp, "pixfactor", &gpd->pixfactor, 1);
+
 	/* set first effect sh */
 	if (cache->init_vfx_pixel_sh == NULL) {
 		cache->init_vfx_pixel_sh = vfx_shgrp;
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_pixel_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_pixel_frag.glsl
index d455b7e56e5..775106b95c4 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_pixel_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_pixel_frag.glsl
@@ -1,4 +1,5 @@
-out vec4 FragColor;
+uniform mat4 ProjectionMatrix;
+uniform mat4 ViewMatrix;
 
 uniform sampler2D strokeColor;
 uniform sampler2D strokeDepth;
@@ -7,13 +8,25 @@ uniform vec2 size;
 uniform vec4 color;
 uniform int uselines;
 
+uniform vec3 loc;
+uniform float pixsize;   /* rv3d->pixsize */
+uniform float pixelsize; /* U.pixelsize */
+uniform int pixfactor;
+
+out vec4 FragColor;
+
+float defaultpixsize = pixsize * pixelsize * float(pixfactor);
+
 /* This pixelation shader is a modified version of original Geeks3d.com code */
 void main()
 {
 	vec2 uv = vec2(gl_FragCoord.xy);
 	
-	float dx = size[0];
-	float dy = size[1];
+	float dx = (ProjectionMatrix[3][3] == 0.0) ? (size[0] / (loc.z * defaultpixsize)) : (size[0] / defaultpixsize);
+	float dy = (ProjectionMatrix[3][3] == 0.0) ? (size[1] / (loc.z * defaultpixsize)) : (size[1] / defaultpixsize);
+	dx = max(dx, 1);
+	dy = max(dy, 1);
+	
 	vec2 coord = vec2(dx * floor(uv.x / dx), dy * floor(uv.y / dy));
 	
 	float stroke_depth = texelFetch(strokeDepth, ivec2(coord), 0).r;



More information about the Bf-blender-cvs mailing list