[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