[Bf-blender-cvs] [de4c23384fd] greasepencil-refactor: GPencil: Refactor: Add support for GPencil wireframes

Clément Foucault noreply at git.blender.org
Thu Jan 9 22:10:08 CET 2020


Commit: de4c23384fd44fee3dbf0c6720c64e9129f25642
Author: Clément Foucault
Date:   Thu Jan 9 20:43:05 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rBde4c23384fd44fee3dbf0c6720c64e9129f25642

GPencil: Refactor: Add support for GPencil wireframes

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

M	source/blender/draw/engines/overlay/overlay_engine.c
M	source/blender/draw/engines/overlay/overlay_wireframe.c
M	source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl_gpencil.c

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

diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index 19944e831dd..52173a821a8 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -190,7 +190,6 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
   OVERLAY_PrivateData *pd = data->stl->pd;
   const DRWContextState *draw_ctx = DRW_context_state_get();
   const bool is_select = DRW_state_is_select();
-  const bool is_gpencil = ob->type == OB_GPENCIL;
   const bool renderable = DRW_object_is_renderable(ob);
   const bool in_pose_mode = ob->type == OB_ARMATURE && OVERLAY_armature_is_pose_mode(ob, draw_ctx);
   const bool in_edit_mode = (ob->mode & OB_MODE_EDIT) && BKE_object_is_in_editmode(ob);
@@ -198,14 +197,15 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
   const bool in_paint_mode = (ob == draw_ctx->obact) &&
                              (draw_ctx->object_mode & OB_MODE_ALL_PAINT);
   const bool in_sculpt_mode = (ob == draw_ctx->obact) && (ob->sculpt != NULL);
-  const bool has_surface = ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_MBALL, OB_FONT);
-  const bool draw_surface = !((ob->dt < OB_WIRE) || (!renderable && (ob->dt != OB_WIRE)));
+  const bool has_surface = ELEM(
+      ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_MBALL, OB_FONT, OB_GPENCIL);
+  const bool draw_surface = (ob->dt >= OB_WIRE) && (renderable || (ob->dt == OB_WIRE));
   const bool draw_facing = draw_surface && (pd->overlay.flag & V3D_OVERLAY_FACE_ORIENTATION);
   const bool draw_bones = (pd->overlay.flag & V3D_OVERLAY_HIDE_BONES) == 0;
   const bool draw_wires = draw_surface && has_surface &&
                           (pd->wireframe_mode || !pd->hide_overlays);
-  const bool draw_outlines = !in_edit_mode && !in_paint_mode && renderable &&
-                             (has_surface || is_gpencil) && (pd->v3d_flag & V3D_SELECT_OUTLINE) &&
+  const bool draw_outlines = !in_edit_mode && !in_paint_mode && renderable && has_surface &&
+                             (pd->v3d_flag & V3D_SELECT_OUTLINE) &&
                              (ob->base_flag & BASE_SELECTED);
   const bool draw_bone_selection = (ob->type == OB_MESH) && pd->armature.do_pose_fade_geom &&
                                    !is_select;
diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.c b/source/blender/draw/engines/overlay/overlay_wireframe.c
index b52434fa6c6..964029520b3 100644
--- a/source/blender/draw/engines/overlay/overlay_wireframe.c
+++ b/source/blender/draw/engines/overlay/overlay_wireframe.c
@@ -185,7 +185,11 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
         shgrp = pd->wires_grp[is_xray][use_coloring];
       }
 
-      if (use_sculpt_pbvh) {
+      if (ob->type == OB_GPENCIL) {
+        /* TODO (fclem) Make GPencil objects have correct boundbox. */
+        DRW_shgroup_call_no_cull(shgrp, geom, ob);
+      }
+      else if (use_sculpt_pbvh) {
         DRW_shgroup_call_sculpt(shgrp, ob, true, false, false);
       }
       else {
diff --git a/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl
index 21f8bcf1791..9a6476ceae9 100644
--- a/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl
@@ -101,11 +101,13 @@ void wire_object_color_get(out vec3 rim_col, out vec3 wire_col)
 
 void main()
 {
+  bool no_attrib = all(equal(nor, vec3(0)));
+  vec3 wnor = no_attrib ? ViewMatrixInverse[2].xyz : normalize(normal_object_to_world(nor));
+
   vec3 wpos = point_object_to_world(pos);
-  vec3 wnor = normalize(normal_object_to_world(nor));
 
   bool is_persp = (ProjectionMatrix[3][3] == 0.0);
-  vec3 V = (is_persp) ? normalize(ViewMatrixInverse[3].xyz - wpos) : ViewMatrix[2].xyz;
+  vec3 V = (is_persp) ? normalize(ViewMatrixInverse[3].xyz - wpos) : ViewMatrixInverse[2].xyz;
 
   float facing = dot(wnor, V);
   float facing_ratio = clamp(1.0 - facing * facing, 0.0, 1.0);
@@ -144,7 +146,7 @@ void main()
 #endif
 
   /* Cull flat edges below threshold. */
-  if (get_edge_sharpness(wd) < 0.0) {
+  if (!no_attrib && (get_edge_sharpness(wd) < 0.0)) {
     edgeStart = vec2(-1.0);
   }
 
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index e50f61cd508..74b0905c485 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -807,6 +807,9 @@ GPUBatch *DRW_cache_object_face_wireframe_get(Object *ob)
       return DRW_cache_text_face_wireframe_get(ob);
     case OB_MBALL:
       return DRW_cache_mball_face_wireframe_get(ob);
+    case OB_GPENCIL: {
+      return DRW_cache_gpencil_face_wireframe_get(ob);
+    }
     default:
       return NULL;
   }
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 9736233fc35..6c0c45ccb85 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -215,8 +215,10 @@ struct GPUBatch *DRW_cache_gpencil_edit_lines_get(struct Object *ob, int cfra);
 struct GPUBatch *DRW_cache_gpencil_edit_points_get(struct Object *ob, int cfra);
 struct GPUBatch *DRW_cache_gpencil_sbuffer_stroke_get(struct Object *ob);
 struct GPUBatch *DRW_cache_gpencil_sbuffer_fill_get(struct Object *ob);
-void DRW_cache_gpencil_sbuffer_clear(struct Object *ob);
+
+struct GPUBatch *DRW_cache_gpencil_face_wireframe_get(struct Object *ob);
 
 struct bGPDstroke *DRW_cache_gpencil_sbuffer_stroke_data_get(struct Object *ob);
+void DRW_cache_gpencil_sbuffer_clear(struct Object *ob);
 
 #endif /* __DRAW_CACHE_H__ */
diff --git a/source/blender/draw/intern/draw_cache_impl_gpencil.c b/source/blender/draw/intern/draw_cache_impl_gpencil.c
index b3ad1dc4f30..4a28c3e9413 100644
--- a/source/blender/draw/intern/draw_cache_impl_gpencil.c
+++ b/source/blender/draw/intern/draw_cache_impl_gpencil.c
@@ -50,6 +50,7 @@ typedef struct GpencilBatchCache {
   /** Instancing Batches */
   GPUBatch *stroke_batch;
   GPUBatch *fill_batch;
+  GPUBatch *lines_batch;
 
   /** Edit Mode */
   GPUVertBuf *edit_vbo;
@@ -115,6 +116,7 @@ static void gpencil_batch_cache_clear(GpencilBatchCache *cache)
     return;
   }
 
+  GPU_BATCH_DISCARD_SAFE(cache->lines_batch);
   GPU_BATCH_DISCARD_SAFE(cache->fill_batch);
   GPU_BATCH_DISCARD_SAFE(cache->stroke_batch);
   GPU_VERTBUF_DISCARD_SAFE(cache->vbo);
@@ -391,6 +393,46 @@ GPUBatch *DRW_cache_gpencil_fills_get(Object *ob, int cfra)
   return cache->fill_batch;
 }
 
+static void gp_lines_indices_cb(bGPDlayer *UNUSED(gpl),
+                                bGPDframe *UNUSED(gpf),
+                                bGPDstroke *gps,
+                                void *thunk)
+{
+  GPUIndexBufBuilder *builder = (GPUIndexBufBuilder *)thunk;
+  int pts_len = gps->totpoints + gpencil_stroke_is_cyclic(gps);
+
+  int start = gps->runtime.stroke_start + 1;
+  int end = start + pts_len;
+  for (int i = start; i < end; i++) {
+    GPU_indexbuf_add_generic_vert(builder, i);
+  }
+  GPU_indexbuf_add_primitive_restart(builder);
+}
+
+GPUBatch *DRW_cache_gpencil_face_wireframe_get(Object *ob)
+{
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  int cfra = DEG_get_ctime(draw_ctx->depsgraph);
+
+  GpencilBatchCache *cache = gpencil_batch_cache_get(ob, cfra);
+  gpencil_batches_ensure(ob, cache, cfra);
+
+  if (cache->lines_batch == NULL) {
+    GPUVertBuf *vbo = cache->vbo;
+    GPUIndexBufBuilder ibo_builder;
+    GPU_indexbuf_init_ex(&ibo_builder, GPU_PRIM_LINE_STRIP, vbo->vertex_len, vbo->vertex_len);
+
+    /* IMPORTANT: Keep in sync with gpencil_edit_batches_ensure() */
+    bool do_onion = true;
+    BKE_gpencil_visible_stroke_iter(ob, NULL, gp_lines_indices_cb, &ibo_builder, do_onion, cfra);
+
+    GPUIndexBuf *ibo = GPU_indexbuf_build(&ibo_builder);
+
+    cache->lines_batch = GPU_batch_create_ex(GPU_PRIM_LINE_STRIP, vbo, ibo, GPU_BATCH_OWNS_INDEX);
+  }
+  return cache->lines_batch;
+}
+
 /** \} */
 
 /* ---------------------------------------------------------------------- */



More information about the Bf-blender-cvs mailing list