[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