[Bf-blender-cvs] [4192c8214f7] greasepencil-object: Implement Xray mode for strokes

Antonio Vazquez noreply at git.blender.org
Fri May 19 20:29:10 CEST 2017


Commit: 4192c8214f731d5cff72361e655dca63f0d7b923
Author: Antonio Vazquez
Date:   Fri May 19 20:28:57 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB4192c8214f731d5cff72361e655dca63f0d7b923

Implement Xray mode for strokes

Now support 3 modes: Front, 3D space and Back.

Still some problems with zfighting with layers that need to be fixed

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

M	release/scripts/startup/bl_ui/properties_grease_pencil_common.py
M	source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/engines/gpencil/gpencil_engine.h
M	source/blender/draw/engines/gpencil/shaders/gpencil_fill_frag.glsl
M	source/blender/draw/engines/gpencil/shaders/gpencil_stroke_geom.glsl
M	source/blender/makesdna/DNA_gpencil_types.h
M	source/blender/makesrna/intern/rna_gpencil.c

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

diff --git a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
index 374c1a52a2b..da7db65d9cd 100644
--- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
+++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
@@ -941,6 +941,8 @@ class GreasePencilDataPanel:
         if (gpd is None) or (not gpd.layers):
             layout.operator("gpencil.layer_add", text="New Layer")
         else:
+            row = layout.row()
+            row.prop(gpd, "xray_mode", text="Xray Mode")
             self.draw_layers(context, layout, gpd)
 
         # convert to object
@@ -997,7 +999,6 @@ class GreasePencilDataPanel:
         # Layer options
         split = layout.split(percentage=0.5)
         split.active = not gpl.lock
-        split.prop(gpl, "show_x_ray")
         split.prop(gpl, "show_points")
 
         # Offsets + Parenting (where available)
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index 87d647de156..3bb7904d409 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -163,7 +163,7 @@ static GpencilBatchCache *gpencil_batch_cache_get(bGPdata *gpd, int cfra)
 }
 
  /* create shading group for filling */
-static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, PaletteColor *palcolor, int id)
+static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, bGPdata *gpd, PaletteColor *palcolor, int id)
 {
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
 
@@ -191,6 +191,8 @@ static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(GPENCIL_Data *vedata, DR
 	stl->storage->t_flip[id] = palcolor->flag & PAC_COLOR_FLIP_FILL ? 1 : 0;
 	DRW_shgroup_uniform_int(grp, "t_flip", &stl->storage->t_flip[id], 1);
 
+	DRW_shgroup_uniform_int(grp, "xraymode", &gpd->xray_mode, 1);
+
 	/* image texture */
 	if ((palcolor->fill_style == FILL_STYLE_TEXTURE) || (palcolor->flag & PAC_COLOR_TEX_MIX)) {
 		ImBuf *ibuf;
@@ -229,7 +231,7 @@ DRWShadingGroup *DRW_gpencil_shgroup_point_volumetric_create(DRWPass *pass, GPUS
 }
 
 /* create shading group for strokes */
-DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader)
+DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, bGPdata *gpd)
 {
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
 
@@ -247,6 +249,14 @@ DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(GPENCIL_Data *vedata, DRWPass
 	stl->storage->is_persp = rv3d->is_persp ? 1 : 0;
 	DRW_shgroup_uniform_int(grp, "is_persp", &stl->storage->is_persp, 1);
 
+	if (gpd) {
+		DRW_shgroup_uniform_int(grp, "xraymode", &gpd->xray_mode, 1);
+	}
+	else {
+		/* for drawing always on front */
+		DRW_shgroup_uniform_int(grp, "xraymode", &stl->storage->xray, 1);
+	}
+
 	return grp;
 }
 
@@ -326,8 +336,8 @@ static void gpencil_draw_strokes(GpencilBatchCache *cache, GPENCIL_e_data *e_dat
 			if (id == -1) {
 				id = stl->storage->pal_id;
 				stl->storage->materials[id] = gps->palcolor;
-				stl->storage->shgrps_fill[id] = DRW_gpencil_shgroup_fill_create(vedata, psl->stroke_pass, e_data->gpencil_fill_sh, gps->palcolor, id);
-				stl->storage->shgrps_stroke[id] = DRW_gpencil_shgroup_stroke_create(vedata, psl->stroke_pass, e_data->gpencil_stroke_sh);
+				stl->storage->shgrps_fill[id] = DRW_gpencil_shgroup_fill_create(vedata, psl->stroke_pass, e_data->gpencil_fill_sh, gpd, gps->palcolor, id);
+				stl->storage->shgrps_stroke[id] = DRW_gpencil_shgroup_stroke_create(vedata, psl->stroke_pass, e_data->gpencil_stroke_sh, gpd);
 				++stl->storage->pal_id;
 			}
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 64192b09633..bce4cf9537b 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -120,6 +120,7 @@ static void GPENCIL_cache_init(void *vedata)
 		/* Alloc transient pointers */
 		stl->g_data = MEM_mallocN(sizeof(g_data), "g_data");
 		stl->g_data->scene_draw = false;
+		stl->storage->xray = GP_XRAY_FRONT; /* used for drawing */
 	}
 
 	{
@@ -139,7 +140,7 @@ static void GPENCIL_cache_init(void *vedata)
 
 		/* drawing buffer pass */
 		psl->drawing_pass = DRW_pass_create("Gpencil Drawing Pass", state);
-		stl->g_data->shgrps_drawing_stroke = DRW_gpencil_shgroup_stroke_create(vedata, psl->drawing_pass, e_data.gpencil_stroke_sh);
+		stl->g_data->shgrps_drawing_stroke = DRW_gpencil_shgroup_stroke_create(vedata, psl->drawing_pass, e_data.gpencil_stroke_sh, NULL);
 		stl->g_data->shgrps_drawing_fill = DRW_gpencil_shgroup_drawing_fill_create(psl->drawing_pass, e_data.gpencil_drawing_fill_sh);
 	}
 }
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 606a91ba815..96735435c69 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -43,6 +43,7 @@ typedef struct GPENCIL_Storage {
 	DRWShadingGroup *shgrps_stroke[MAX_GPENCIL_MAT];
 	float unit_matrix[4][4];
 	int is_persp;   /* rv3d->is_persp (1-yes) */
+	int xray;
 } GPENCIL_Storage;
 
 /* keep it under MAX_STORAGE */
@@ -118,7 +119,7 @@ typedef struct GpencilBatchCache {
 	int cache_idx;   /* current slot index */
 } GpencilBatchCache;
 
-struct DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(struct GPENCIL_Data *vedata, struct DRWPass *pass, struct GPUShader *shader);
+struct DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(struct GPENCIL_Data *vedata, struct DRWPass *pass, struct GPUShader *shader, bGPdata *gpd);
 struct DRWShadingGroup *DRW_gpencil_shgroup_point_volumetric_create(struct DRWPass *pass, struct GPUShader *shader);
 struct DRWShadingGroup *DRW_gpencil_shgroup_edit_volumetric_create(struct DRWPass *pass, struct GPUShader *shader);
 struct DRWShadingGroup *DRW_gpencil_shgroup_drawing_fill_create(struct DRWPass *pass, struct GPUShader *shader);
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_fill_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_fill_frag.glsl
index 44a3a4da5b0..e81cb0bb0dc 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_fill_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_fill_frag.glsl
@@ -14,6 +14,7 @@ uniform vec2 t_shift;
 uniform int t_mix;
 uniform int t_flip;
 uniform float t_opacity;
+uniform int xraymode;
 
 uniform sampler2D myTexture;
 uniform int t_clamp;
@@ -25,6 +26,10 @@ uniform int t_clamp;
 #define CHESS 3
 #define TEXTURE 4
 
+#define GP_XRAY_FRONT 0
+#define GP_XRAY_SPACE 1
+#define GP_XRAY_BACK  2
+
 in vec4 finalColor;
 in vec2 texCoord_interp;
 out vec4 fragColor;
@@ -170,4 +175,16 @@ void main()
 			fragColor = text_color;
 		}
 	}
+
+	/* set zdepth */
+	if (xraymode == GP_XRAY_FRONT) {
+		gl_FragDepth = 0.0;
+	}
+	if (xraymode == GP_XRAY_SPACE) {
+		gl_FragDepth = gl_FragCoord.z;
+	}
+	if  (xraymode == GP_XRAY_BACK) {
+		gl_FragDepth = 1.0;
+	}
+
 }
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 ef1280f91c6..622f7b4ca4d 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_geom.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_geom.glsl
@@ -1,5 +1,6 @@
 uniform mat4 ModelViewProjectionMatrix;
 uniform vec2 Viewport;
+uniform int xraymode;
 
 layout(lines_adjacency) in;
 layout(triangle_strip, max_vertices = 7) out;
@@ -10,6 +11,10 @@ in float finalThickness[4];
 out vec4 mColor;
 out vec2 mTexCoord;
 
+#define GP_XRAY_FRONT 0
+#define GP_XRAY_SPACE 1
+#define GP_XRAY_BACK  2
+
 /* project 3d point to 2d on screen space */
 vec2 toScreenSpace(vec4 vertex)
 {
@@ -19,10 +24,19 @@ vec2 toScreenSpace(vec4 vertex)
 /* get zdepth value (0 Near, 1 Far) */
 float getZdepth(vec4 point)
 {
-	/* TODO: add xray support */
-	return point.z / point.w;
-}
+	if (xraymode == GP_XRAY_FRONT) {
+		return 0.0;
+	}
+	if (xraymode == GP_XRAY_SPACE) {
+		return point.z / point.w;
+	}
+	if  (xraymode == GP_XRAY_BACK) {
+		return 1.0;
+	}
 
+	/* in front by default */
+	return 0.0;
+}
 void main(void)
 {
 	float MiterLimit = 0.75;
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index 8188f62e903..a1a377ae9d9 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -284,6 +284,13 @@ typedef enum eGPDlayer_Flag {
 	GP_LAYER_USE_LOCATION = (1 << 14),
 } eGPDlayer_Flag;
 
+/* xray modes */
+typedef enum eGP_Xraymodes_Types {
+	GP_XRAY_FRONT = 0,
+	GP_XRAY_SPACE = 1,
+	GP_XRAY_BACK  = 2
+} eGP_Xraymodes_Types;
+
 /* Grease-Pencil Annotations - 'DataBlock' */
 typedef struct bGPdata {
 	ID id;					/* Grease Pencil data is a datablock */
@@ -305,7 +312,8 @@ typedef struct bGPdata {
 	short sflag;                /* settings for palette color */
 	short bstroke_style;        /* buffer style for drawing strokes (used to select shader type) */
 	short bfill_style;          /* buffer style for filling areas (used to select shader type) */
-	char  pad[2];               /* padding for compiler alignment error */
+
+	short xray_mode;            /* xray mode for strokes */
 
 	/* saved palettes */
 	ListBase palettes;
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c
index c0b9c7529f5..c1b9f8ee20b 100644
--- a/source/blender/makesrna/intern/rna_gpencil.c
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -54,6 +54,12 @@ static EnumPropertyItem parent_type_items[] = {
 	{0, NULL, 0, NULL, NULL}
 };
 
+EnumPropertyItem rna_enum_gpencil_xraymodes_items[] = {
+	{ GP_XRAY_FRONT, "GP_XRAY_FRONT", 0, "Front", "Draw all strokes in front" },
+	{ GP_XRAY_SPACE, "GP_XRAY_SPACE", 0, "Space", "Draw strokes relative to other objects in space" },
+	{ GP

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list