[Bf-blender-cvs] [8d6737a1681] greasepencil-refactor: GPencil: Refactor: Fix broken selection
Clément Foucault
noreply at git.blender.org
Sat Dec 14 18:58:59 CET 2019
Commit: 8d6737a16813c318e5dd9cbd47dc0109644d69c8
Author: Clément Foucault
Date: Sat Dec 14 15:48:34 2019 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB8d6737a16813c318e5dd9cbd47dc0109644d69c8
GPencil: Refactor: Fix broken selection
===================================================================
M source/blender/draw/engines/gpencil/gpencil_cache_utils.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_frag.glsl
===================================================================
diff --git a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
index 81ed4f1cab0..00a9b1c05e9 100644
--- a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
@@ -66,7 +66,7 @@ GPENCIL_tLayer *gpencil_layer_cache_add_new(GPENCIL_PrivateData *pd, Object *ob,
{
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_PREMUL;
- if (GPENCIL_3D_DRAWMODE(ob, gpd)) {
+ if (GPENCIL_3D_DRAWMODE(ob, gpd) || pd->draw_depth_only) {
/* TODO better 3D mode. */
state |= DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL;
}
@@ -75,11 +75,13 @@ GPENCIL_tLayer *gpencil_layer_cache_add_new(GPENCIL_PrivateData *pd, Object *ob,
state |= DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_GREATER;
}
- if (gpl->flag & GP_LAYER_USE_MASK) {
- state |= DRW_STATE_STENCIL_EQUAL;
- }
- else {
- state |= DRW_STATE_WRITE_STENCIL | DRW_STATE_STENCIL_ALWAYS;
+ if (!pd->draw_depth_only) {
+ if (gpl->flag & GP_LAYER_USE_MASK) {
+ state |= DRW_STATE_STENCIL_EQUAL;
+ }
+ else {
+ state |= DRW_STATE_WRITE_STENCIL | DRW_STATE_STENCIL_ALWAYS;
+ }
}
tgp_layer->geom_ps = DRW_pass_create("GPencil Layer", state);
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index f0bc2b91bea..c2df1e3ae73 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -287,8 +287,6 @@ static void GPENCIL_engine_init_new(void *ved)
stl->pd = MEM_callocN(sizeof(GPENCIL_PrivateData), "GPENCIL_PrivateData");
}
- DRW_texture_ensure_2d(&txl->dummy_texture, 1, 1, GPU_R8, 0);
-
if (txl->dummy_texture == NULL) {
float pixels[1][4] = {{1.0f, 0.0f, 1.0f, 1.0f}};
txl->dummy_texture = DRW_texture_create_2d(1, 1, GPU_RGBA8, DRW_TEX_WRAP, (float *)pixels);
@@ -309,7 +307,8 @@ static void GPENCIL_engine_init_new(void *ved)
stl->pd->last_material_pool = NULL;
stl->pd->tobjects.first = NULL;
stl->pd->tobjects.last = NULL;
- stl->pd->scene_depth_tx = dtxl->depth;
+ stl->pd->draw_depth_only = !DRW_state_is_fbo();
+ stl->pd->scene_depth_tx = stl->pd->draw_depth_only ? txl->dummy_texture : dtxl->depth;
float viewmatinv[4][4];
DRW_view_viewmat_get(NULL, viewmatinv, true);
@@ -804,7 +803,7 @@ static void gp_layer_cache_populate(bGPDlayer *gpl,
GPUUniformBuffer *ubo_mat;
gpencil_material_resources_get(iter->matpool, 0, NULL, NULL, &ubo_mat);
- const bool is_stroke_order_3d = (gpd->draw_mode == GP_DRAWMODE_3D);
+ const bool is_stroke_order_3d = (gpd->draw_mode == GP_DRAWMODE_3D) || iter->pd->draw_depth_only;
const bool is_screenspace = (gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS) != 0;
float object_scale = mat4_to_scale(iter->ob->obmat);
@@ -1176,6 +1175,10 @@ void DRW_gpencil_free_runtime_data(void *ved)
GPENCIL_Data *vedata = (GPENCIL_Data *)ved;
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+ if (stl->g_data == NULL) {
+ return;
+ }
+
/* free gpu data */
GPU_BATCH_DISCARD_SAFE(stl->g_data->batch_buffer_stroke);
MEM_SAFE_FREE(stl->g_data->batch_buffer_stroke);
@@ -1284,6 +1287,20 @@ static void drw_gpencil_select_render(GPENCIL_StorageList *stl, GPENCIL_PassList
}
}
+static void GPENCIL_draw_scene_depth_only(void *ved)
+{
+ GPENCIL_Data *vedata = (GPENCIL_Data *)ved;
+ GPENCIL_PrivateData *pd = vedata->stl->pd;
+
+ for (GPENCIL_tObject *ob = pd->tobjects.first; ob; ob = ob->next) {
+ for (GPENCIL_tLayer *layer = ob->layers.first; layer; layer = layer->next) {
+ DRW_draw_pass(layer->geom_ps);
+ }
+ }
+
+ pd->gp_object_pool = pd->gp_layer_pool = pd->gp_vfx_pool = NULL;
+}
+
static void GPENCIL_draw_scene_new(void *ved)
{
GPENCIL_Data *vedata = (GPENCIL_Data *)ved;
@@ -1293,6 +1310,11 @@ static void GPENCIL_draw_scene_new(void *ved)
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
float clear_cols[2][4] = {{0.0f, 0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f, 1.0f}};
+ if (pd->draw_depth_only) {
+ GPENCIL_draw_scene_depth_only(vedata);
+ return;
+ }
+
if (pd->tobjects.first == NULL) {
return;
}
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index ae074021138..7f7d09274eb 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -424,6 +424,8 @@ typedef struct GPENCIL_PrivateData {
GPUTexture *scene_depth_tx;
/* Current frame */
int cfra;
+ /* True in selection and auto_depth drawing */
+ bool draw_depth_only;
/* Used by the depth merge step. */
float object_depth;
int is_stroke_order_3d;
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl
index 56adb099af1..f9dff07f207 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl
@@ -55,7 +55,8 @@ void main()
}
/* Manual depth test */
- float scene_depth = texelFetch(gpSceneDepthTexture, ivec2(gl_FragCoord.xy), 0).r;
+ vec2 uvs = gl_FragCoord.xy / vec2(textureSize(gpSceneDepthTexture, 0).xy);
+ float scene_depth = texture(gpSceneDepthTexture, uvs).r;
if (gl_FragCoord.z > scene_depth) {
discard;
}
More information about the Bf-blender-cvs
mailing list