[Bf-blender-cvs] [0ba3a1a6863] blender2.8: Sculpt: Optimize Mask Overlay drawing
Clément Foucault
noreply at git.blender.org
Fri Aug 24 16:47:03 CEST 2018
Commit: 0ba3a1a6863a4b5960933df7d5a12d158da5d0d0
Author: Clément Foucault
Date: Fri Aug 24 16:46:42 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB0ba3a1a6863a4b5960933df7d5a12d158da5d0d0
Sculpt: Optimize Mask Overlay drawing
* Remove support for diffuse color in the pbvh buffers.
* Upload raw data to GPU.
* Only draw nodes that have mask data when drawing the overlay.
This should fix T56466
===================================================================
M source/blender/blenkernel/BKE_pbvh.h
M source/blender/blenkernel/intern/pbvh.c
M source/blender/draw/CMakeLists.txt
M source/blender/draw/intern/draw_manager_data.c
M source/blender/draw/modes/sculpt_mode.c
A source/blender/draw/modes/shaders/sculpt_mask_vert.glsl
M source/blender/gpu/GPU_buffers.h
M source/blender/gpu/intern/gpu_buffers.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index 095f442ca50..a0c8cab10fc 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -130,7 +130,7 @@ bool BKE_pbvh_node_find_nearest_to_ray(
/* Drawing */
void BKE_pbvh_draw_cb(
- PBVH *bvh, float (*planes)[4], float (*fnors)[3], bool fast,
+ PBVH *bvh, float (*planes)[4], float (*fnors)[3], bool fast, bool only_mask,
void (*draw_fn)(void *user_data, struct GPUBatch *batch), void *user_data);
/* PBVH Access */
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 3e7a9b7ce24..00d6fa96856 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -1107,7 +1107,6 @@ void pbvh_update_BB_redraw(PBVH *bvh, PBVHNode **nodes, int totnode, int flag)
static int pbvh_get_buffers_update_flags(PBVH *bvh)
{
int update_flags = 0;
- update_flags |= bvh->show_diffuse_color ? GPU_PBVH_BUFFERS_SHOW_DIFFUSE_COLOR : 0;
update_flags |= bvh->show_mask ? GPU_PBVH_BUFFERS_SHOW_MASK : 0;
return update_flags;
}
@@ -2053,33 +2052,11 @@ bool BKE_pbvh_node_planes_exclude_AABB(PBVHNode *node, void *data)
return test_planes_aabb(bb_min, bb_max, data) != ISECT_INSIDE;
}
-static void pbvh_node_check_diffuse_changed(PBVH *bvh, PBVHNode *node)
-{
- if (!node->draw_buffers)
- return;
-
- if (GPU_pbvh_buffers_diffuse_changed(node->draw_buffers, node->bm_faces, bvh->show_diffuse_color))
- node->flag |= PBVH_UpdateDrawBuffers;
-}
-
-/* TODO: not needed anymore in 2.8? */
-#if 0
-static void pbvh_node_check_mask_changed(PBVH *bvh, PBVHNode *node)
-{
- if (!node->draw_buffers) {
- return;
- }
- if (GPU_pbvh_buffers_mask_changed(node->draw_buffers, bvh->show_mask)) {
- node->flag |= PBVH_UpdateDrawBuffers;
- }
-}
-#endif
-
struct PBVHNodeDrawCallbackData {
-
void (*draw_fn)(void *user_data, GPUBatch *batch);
void *user_data;
bool fast;
+ bool only_mask; /* Only draw nodes that have mask data. */
};
static void pbvh_node_draw_cb(PBVHNode *node, void *data_v)
@@ -2088,8 +2065,11 @@ static void pbvh_node_draw_cb(PBVHNode *node, void *data_v)
if (!(node->flag & PBVH_FullyHidden)) {
GPUBatch *triangles = GPU_pbvh_buffers_batch_get(node->draw_buffers, data->fast);
- if (triangles != NULL) {
- data->draw_fn(data->user_data, triangles);
+ bool show_mask = GPU_pbvh_buffers_has_mask(node->draw_buffers);
+ if (!data->only_mask || show_mask) {
+ if (triangles != NULL) {
+ data->draw_fn(data->user_data, triangles);
+ }
}
}
}
@@ -2098,10 +2078,11 @@ static void pbvh_node_draw_cb(PBVHNode *node, void *data_v)
* Version of #BKE_pbvh_draw that runs a callback.
*/
void BKE_pbvh_draw_cb(
- PBVH *bvh, float (*planes)[4], float (*fnors)[3], bool fast,
+ PBVH *bvh, float (*planes)[4], float (*fnors)[3], bool fast, bool only_mask,
void (*draw_fn)(void *user_data, GPUBatch *batch), void *user_data)
{
struct PBVHNodeDrawCallbackData draw_data = {
+ .only_mask = only_mask,
.fast = fast,
.draw_fn = draw_fn,
.user_data = user_data,
@@ -2109,9 +2090,6 @@ void BKE_pbvh_draw_cb(
PBVHNode **nodes;
int totnode;
- for (int a = 0; a < bvh->totnode; a++)
- pbvh_node_check_diffuse_changed(bvh, &bvh->nodes[a]);
-
BKE_pbvh_search_gather(bvh, update_search_cb, SET_INT_IN_POINTER(PBVH_UpdateNormals | PBVH_UpdateDrawBuffers),
&nodes, &totnode);
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 035a5b9295b..bac3a2f02fb 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -311,6 +311,7 @@ data_to_c_simple(modes/shaders/paint_wire_vert.glsl SRC)
data_to_c_simple(modes/shaders/paint_vert_frag.glsl SRC)
data_to_c_simple(modes/shaders/particle_strand_frag.glsl SRC)
data_to_c_simple(modes/shaders/particle_strand_vert.glsl SRC)
+data_to_c_simple(modes/shaders/sculpt_mask_vert.glsl SRC)
data_to_c_simple(modes/shaders/volume_velocity_vert.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/gpencil_fill_vert.glsl SRC)
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 08045687795..96e862d2439 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -539,7 +539,7 @@ static void sculpt_draw_cb(
if (pbvh) {
BKE_pbvh_draw_cb(
- pbvh, NULL, NULL, false,
+ pbvh, NULL, NULL, false, false,
(void (*)(void *, GPUBatch *))draw_fn, shgroup);
}
}
diff --git a/source/blender/draw/modes/sculpt_mode.c b/source/blender/draw/modes/sculpt_mode.c
index 56b5898a6cf..c80fd40cf27 100644
--- a/source/blender/draw/modes/sculpt_mode.c
+++ b/source/blender/draw/modes/sculpt_mode.c
@@ -43,6 +43,10 @@
#include "draw_mode_engines.h"
+extern char datatoc_sculpt_mask_vert_glsl[];
+extern char datatoc_gpu_shader_flat_color_frag_glsl[];
+extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
+
/* *********** LISTS *********** */
/* All lists are per viewport specific datas.
* They are all free when viewport changes engines
@@ -121,26 +125,14 @@ static void SCULPT_engine_init(void *vedata)
UNUSED_VARS(txl, fbl, stl);
- /* Init Framebuffers like this: order is attachment order (for color texs) */
- /*
- * DRWFboTexture tex[2] = {{&txl->depth, GPU_DEPTH_COMPONENT24, 0},
- * {&txl->color, GPU_RGBA8, DRW_TEX_FILTER}};
- */
-
- /* DRW_framebuffer_init takes care of checking if
- * the framebuffer is valid and has the right size*/
- /*
- * float *viewport_size = DRW_viewport_size_get();
- * DRW_framebuffer_init(&fbl->occlude_wire_fb,
- * (int)viewport_size[0], (int)viewport_size[1],
- * tex, 2);
- */
-
if (!e_data.shader_flat) {
- e_data.shader_flat = GPU_shader_get_builtin_shader(GPU_SHADER_3D_FLAT_COLOR);
+ e_data.shader_flat = DRW_shader_create(datatoc_sculpt_mask_vert_glsl, NULL,
+ datatoc_gpu_shader_flat_color_frag_glsl,
+ "#define SHADE_FLAT");
}
if (!e_data.shader_smooth) {
- e_data.shader_smooth = GPU_shader_get_builtin_shader(GPU_SHADER_3D_SMOOTH_COLOR);
+ e_data.shader_smooth = DRW_shader_create(datatoc_sculpt_mask_vert_glsl, NULL,
+ datatoc_gpu_shader_3D_smooth_color_frag_glsl, NULL);
}
}
@@ -183,6 +175,21 @@ static bool object_is_flat(const Object *ob)
}
}
+static void sculpt_draw_mask_cb(
+ DRWShadingGroup *shgroup,
+ void (*draw_fn)(DRWShadingGroup *shgroup, struct GPUBatch *geom),
+ void *user_data)
+{
+ Object *ob = user_data;
+ PBVH *pbvh = ob->sculpt->pbvh;
+
+ if (pbvh) {
+ BKE_pbvh_draw_cb(
+ pbvh, NULL, NULL, false, true,
+ (void (*)(void *, struct GPUBatch *))draw_fn, shgroup);
+ }
+}
+
/* Add geometry to shadingGroups. Execute for each objects */
static void SCULPT_cache_populate(void *vedata, Object *ob)
{
@@ -210,8 +217,7 @@ static void SCULPT_cache_populate(void *vedata, Object *ob)
/* Get geometry cache */
DRWShadingGroup *shgroup = object_is_flat(ob) ? stl->g_data->group_flat : stl->g_data->group_smooth;
- /* Add geom to a shading group */
- DRW_shgroup_call_sculpt_add(shgroup, ob, ob->obmat);
+ DRW_shgroup_call_generate_add(shgroup, sculpt_draw_mask_cb, ob, ob->obmat);
}
}
}
@@ -260,7 +266,8 @@ static void SCULPT_draw_scene(void *vedata)
* Mostly used for freeing shaders */
static void SCULPT_engine_free(void)
{
- // DRW_SHADER_FREE_SAFE(custom_shader);
+ DRW_SHADER_FREE_SAFE(e_data.shader_flat);
+ DRW_SHADER_FREE_SAFE(e_data.shader_smooth);
}
static const DrawEngineDataSize SCULPT_data_size = DRW_VIEWPORT_DATA_SIZE(SCULPT_Data);
diff --git a/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl b/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl
new file mode 100644
index 00000000000..e76d21eb43a
--- /dev/null
+++ b/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl
@@ -0,0 +1,19 @@
+
+uniform mat4 ModelViewProjectionMatrix;
+
+in vec3 pos;
+in float msk;
+
+#ifdef SHADE_FLAT
+flat out vec4 finalColor;
+#else
+out vec4 finalColor;
+#endif
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+
+ float mask = 1.0 - msk * 0.75;
+ finalColor = vec4(mask, mask, mask, 1.0);
+}
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 77801256463..e60b5d60c30 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -66,7 +66,6 @@ GPU_PBVH_Buffers *GPU_pbvh_bmesh_buffers_build(bool smooth_shading);
/* update */
enum {
- GPU_PBVH_BUFFERS_SHOW_DIFFUSE_COLOR = (1 << 0),
GPU_PBVH_BUFFERS_SHOW_MASK = (1 << 1),
};
@@ -93,12 +92,11 @@ void GPU_pbvh_grid_buffers_update(
/* draw */
struct GPUBatch *GPU_pbvh_buffers_batch_get(GPU_PBVH_Buffers *buffers, bool fast);
+bool GPU_pbvh_buffers_has_mask(GPU_PBVH_Buffers *buffers);
+
/* debug PBVH draw */
void GPU_pbvh_BB_draw(float min[3], float max[3], bool leaf, unsigned int pos);
-bool GPU_pbvh_buffers_diffuse_changed(GPU_PBVH_Buffers *buffers, struct GSet *bm_faces, bool show_diffuse_color);
-bool GPU_pbvh_buffers_mask_changed(GPU_PBVH_Buffers *buffers, bool show_mask);
-
void GPU_pbvh_buffers_free(GPU_PBVH_Buffers *buffers);
void GPU_pbvh_multires_buffers_free(struct GridCommonGPUBuffer **grid_common_gpu_buffer);
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 16590785af6..458486584a7 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -85,7 +85,6 @@ struct GPU_PBVH_Buffers {
const int *face_indices;
int face_indices_len;
- const float *vmask;
/* grid pointers */
CCGKey gridkey;
@@ -105,25 +104,13 @@ struct GPU_PBVH_Buffers {
* smooth-shaded or all faces are flat-shaded */
bool smooth;
- bool show_diffuse_color;
bool show_mask;
-
- float diffuse_color[4];
};
static struct {
- uint pos, nor, col;
+ uint pos, nor, msk;
} g_vbo_id = {0};
-st
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list