Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2019-02-14 22:24:13 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-02-18 16:17:57 +0300
commit9ab99ff26b57b2f0c898356d365636697d67e345 (patch)
treeec792dde760c6af0346693a161a34c3c44a0a123 /source/blender/draw
parent2cccffd20b67beecb5743e8871dbda779d1e03f1 (diff)
Sculpt Draw: Add support for wireframe geometry
This introduce the wireframe batches. Creating the indices buffer does not seems to slow down the sculpt in my testing (but it is kind of hard to test reliably) This includes a bit of cleanup in gpu_buffers.c.
Diffstat (limited to 'source/blender/draw')
-rw-r--r--source/blender/draw/intern/DRW_render.h1
-rw-r--r--source/blender/draw/intern/draw_manager_data.c34
-rw-r--r--source/blender/draw/modes/overlay_mode.c12
-rw-r--r--source/blender/draw/modes/sculpt_mode.c2
-rw-r--r--source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl2
5 files changed, 42 insertions, 9 deletions
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 8f78953cb52..259605b4707 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -378,6 +378,7 @@ void DRW_shgroup_call_instances_add(
void DRW_shgroup_call_object_instances_add(
DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, uint *count);
void DRW_shgroup_call_sculpt_add(DRWShadingGroup *shgroup, struct Object *ob, float (*obmat)[4]);
+void DRW_shgroup_call_sculpt_wires_add(DRWShadingGroup *shgroup, struct Object *ob, float (*obmat)[4]);
void DRW_shgroup_call_generate_add(
DRWShadingGroup *shgroup, DRWCallGenerateFn *geometry_fn, void *user_data, float (*obmat)[4]);
void DRW_shgroup_call_dynamic_add_array(DRWShadingGroup *shgroup, const void *attr[], uint attr_len);
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 73825c700d5..54456d43ef7 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -581,7 +581,34 @@ static void sculpt_draw_cb(
if (pbvh) {
BKE_pbvh_draw_cb(
- pbvh, NULL, NULL, fast_mode, false,
+ pbvh, NULL, NULL, fast_mode, false, false,
+ (void (*)(void *, GPUBatch *))draw_fn, shgroup);
+ }
+}
+
+static void sculpt_draw_wires_cb(
+ DRWShadingGroup *shgroup,
+ void (*draw_fn)(DRWShadingGroup *shgroup, GPUBatch *geom),
+ void *user_data)
+{
+ Object *ob = user_data;
+
+ /* XXX should be ensured before but sometime it's not... go figure (see T57040). */
+ PBVH *pbvh = BKE_sculpt_object_pbvh_ensure(DST.draw_ctx.depsgraph, ob);
+
+ const DRWContextState *drwctx = DRW_context_state_get();
+ int fast_mode = 0;
+
+ if (drwctx->evil_C != NULL) {
+ Paint *p = BKE_paint_get_active_from_context(drwctx->evil_C);
+ if (p && (p->flags & PAINT_FAST_NAVIGATE)) {
+ fast_mode = drwctx->rv3d->rflag & RV3D_NAVIGATING;
+ }
+ }
+
+ if (pbvh) {
+ BKE_pbvh_draw_cb(
+ pbvh, NULL, NULL, fast_mode, true, false,
(void (*)(void *, GPUBatch *))draw_fn, shgroup);
}
}
@@ -591,6 +618,11 @@ void DRW_shgroup_call_sculpt_add(DRWShadingGroup *shgroup, Object *ob, float (*o
DRW_shgroup_call_generate_add(shgroup, sculpt_draw_cb, ob, obmat);
}
+void DRW_shgroup_call_sculpt_wires_add(DRWShadingGroup *shgroup, Object *ob, float (*obmat)[4])
+{
+ DRW_shgroup_call_generate_add(shgroup, sculpt_draw_wires_cb, ob, obmat);
+}
+
void DRW_shgroup_call_dynamic_add_array(DRWShadingGroup *shgroup, const void *attr[], uint attr_len)
{
#ifdef USE_GPU_SELECT
diff --git a/source/blender/draw/modes/overlay_mode.c b/source/blender/draw/modes/overlay_mode.c
index ea502e176f1..9929e4ca6e4 100644
--- a/source/blender/draw/modes/overlay_mode.c
+++ b/source/blender/draw/modes/overlay_mode.c
@@ -319,11 +319,11 @@ static void overlay_cache_populate(void *vedata, Object *ob)
if (geom || is_sculpt_mode) {
shgrp = DRW_shgroup_create_sub(pd->face_wires_shgrp);
- static float all_wires_param = 10.0f;
- DRW_shgroup_uniform_float(
- shgrp, "wireStepParam",
- (all_wires || is_sculpt_mode) ? &all_wires_param : &pd->wire_step_param,
- 1);
+ float wire_step_param = 10.0f;
+ if (!is_sculpt_mode) {
+ wire_step_param = (all_wires) ? 1.0f : pd->wire_step_param;
+ }
+ DRW_shgroup_uniform_float_copy(shgrp, "wireStepParam", wire_step_param);
if (!(DRW_state_is_select() || DRW_state_is_depth())) {
DRW_shgroup_stencil_mask(shgrp, stencil_mask);
@@ -332,7 +332,7 @@ static void overlay_cache_populate(void *vedata, Object *ob)
}
if (is_sculpt_mode) {
- DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat);
+ DRW_shgroup_call_sculpt_wires_add(shgrp, ob, ob->obmat);
}
else {
DRW_shgroup_call_add(shgrp, geom, ob->obmat);
diff --git a/source/blender/draw/modes/sculpt_mode.c b/source/blender/draw/modes/sculpt_mode.c
index 76312942613..546270f8a18 100644
--- a/source/blender/draw/modes/sculpt_mode.c
+++ b/source/blender/draw/modes/sculpt_mode.c
@@ -177,7 +177,7 @@ static void sculpt_draw_mask_cb(
if (pbvh) {
BKE_pbvh_draw_cb(
- pbvh, NULL, NULL, false, true,
+ pbvh, NULL, NULL, false, false, true,
(void (*)(void *, struct GPUBatch *))draw_fn, shgroup);
}
}
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
index 2a328a71366..8cb4db23b7e 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
@@ -10,7 +10,7 @@ uniform float ofs;
#ifndef USE_SCULPT
float get_edge_sharpness(float wd)
{
- return (wd == 1.0) ? 1.0 : ((wd == 0.0) ? -1.0 : (wd + wireStepParam));
+ return ((wd == 1.0) ? 1.0 : ((wd == 0.0) ? -1.5 : wd)) + wireStepParam;
}
#else
float get_edge_sharpness(float wd) { return 1.0; }