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;
+}
+
/** \} */
/* ---------------------------------------------------------------------- */
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs