[Bf-blender-cvs] [a9c8eab4b64] tmp-overlay-engine: Overlay Engine: Loose Edges/Verts
Clément Foucault
noreply at git.blender.org
Tue Nov 19 00:45:31 CET 2019
Commit: a9c8eab4b64e08ead7d9bdfb35a32ce023eedaac
Author: Clément Foucault
Date: Mon Nov 18 23:05:39 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rBa9c8eab4b64e08ead7d9bdfb35a32ce023eedaac
Overlay Engine: Loose Edges/Verts
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/overlay/overlay_engine.c
M source/blender/draw/engines/overlay/overlay_extra.c
M source/blender/draw/engines/overlay/overlay_private.h
M source/blender/draw/engines/overlay/overlay_shader.c
M source/blender/draw/engines/overlay/overlay_wireframe.c
A source/blender/draw/engines/overlay/shaders/extra_loose_point_frag.glsl
A source/blender/draw/engines/overlay/shaders/extra_loose_point_vert.glsl
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index ec823c92358..d433b7f1811 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -409,6 +409,8 @@ data_to_c_simple(engines/overlay/shaders/edit_particle_strand_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/edit_particle_point_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/extra_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/extra_groundline_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/extra_loose_point_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/extra_loose_point_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/extra_point_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/extra_wire_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/extra_wire_vert.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index d1093ce28e2..7efd8943eee 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -178,10 +178,10 @@ 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 draw_facing = draw_surface && (pd->overlay.flag & V3D_OVERLAY_FACE_ORIENTATION);
- const bool draw_wires = draw_surface && ((pd->overlay.flag & V3D_OVERLAY_WIREFRAMES) ||
- (ob->dtx & OB_DRAWWIRE) || (ob->dt == OB_WIRE));
+ const bool draw_wires = draw_surface && has_surface;
const bool draw_outlines = !in_edit_mode && !in_paint_mode && renderable &&
(pd->v3d_flag & V3D_SELECT_OUTLINE) &&
((ob->base_flag & BASE_SELECTED) ||
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index d73c22f28fe..cb0b06c3acb 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -203,6 +203,12 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
cb->extra_wire = grp = DRW_shgroup_create(sh, extra_ps);
DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
}
+ {
+ sh = OVERLAY_shader_extra_loose_point();
+
+ cb->extra_loose_points = grp = DRW_shgroup_create(sh, extra_ps);
+ DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+ }
{
format = formats->pos;
sh = OVERLAY_shader_extra_point();
@@ -258,6 +264,20 @@ OVERLAY_ExtraCallBuffers *OVERLAY_extra_call_buffer_get(OVERLAY_Data *vedata, Ob
return &pd->extra_call_buffers[do_in_front];
}
+void OVERLAY_extra_loose_points(OVERLAY_ExtraCallBuffers *cb,
+ struct GPUBatch *geom,
+ const float mat[4][4],
+ const float color[4])
+{
+ float draw_mat[4][4];
+ copy_m4_m4(draw_mat, mat);
+ draw_mat[0][3] = color[0];
+ draw_mat[1][3] = color[1];
+ draw_mat[2][3] = color[2];
+ draw_mat[3][3] = color[3];
+ DRW_shgroup_call_obmat(cb->extra_loose_points, geom, draw_mat);
+}
+
void OVERLAY_extra_wire(OVERLAY_ExtraCallBuffers *cb,
struct GPUBatch *geom,
const float mat[4][4],
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 566901ec65b..d7650612468 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -164,6 +164,7 @@ typedef struct OVERLAY_ExtraCallBuffers {
DRWCallBuffer *speaker;
DRWShadingGroup *extra_wire;
+ DRWShadingGroup *extra_loose_points;
} OVERLAY_ExtraCallBuffers;
typedef struct OVERLAY_ArmatureCallBuffers {
@@ -404,6 +405,10 @@ void OVERLAY_empty_shape(OVERLAY_ExtraCallBuffers *cb,
const float draw_size,
const char draw_type,
const float color[4]);
+void OVERLAY_extra_loose_points(OVERLAY_ExtraCallBuffers *cb,
+ struct GPUBatch *geom,
+ const float mat[4][4],
+ const float color[4]);
void OVERLAY_extra_wire(OVERLAY_ExtraCallBuffers *cb,
struct GPUBatch *geom,
const float mat[4][4],
@@ -490,6 +495,7 @@ GPUShader *OVERLAY_shader_edit_particle_point(void);
GPUShader *OVERLAY_shader_extra(void);
GPUShader *OVERLAY_shader_extra_groundline(void);
GPUShader *OVERLAY_shader_extra_wire(bool use_object);
+GPUShader *OVERLAY_shader_extra_loose_point(void);
GPUShader *OVERLAY_shader_extra_point(void);
GPUShader *OVERLAY_shader_facing(void);
GPUShader *OVERLAY_shader_grid(void);
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index 0c7bb917f7f..d916467073a 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -64,6 +64,8 @@ extern char datatoc_edit_particle_strand_vert_glsl[];
extern char datatoc_edit_particle_point_vert_glsl[];
extern char datatoc_extra_vert_glsl[];
extern char datatoc_extra_groundline_vert_glsl[];
+extern char datatoc_extra_loose_point_vert_glsl[];
+extern char datatoc_extra_loose_point_frag_glsl[];
extern char datatoc_extra_point_vert_glsl[];
extern char datatoc_extra_wire_frag_glsl[];
extern char datatoc_extra_wire_vert_glsl[];
@@ -146,6 +148,7 @@ typedef struct OVERLAY_Shaders {
GPUShader *extra_groundline;
GPUShader *extra_wire[2];
GPUShader *extra_point;
+ GPUShader *extra_loose_point;
GPUShader *facing;
GPUShader *grid;
GPUShader *image;
@@ -786,6 +789,27 @@ GPUShader *OVERLAY_shader_extra_wire(bool use_object)
return sh_data->extra_wire[use_object];
}
+GPUShader *OVERLAY_shader_extra_loose_point(void)
+{
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
+ OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
+ if (!sh_data->extra_loose_point) {
+ sh_data->extra_loose_point = GPU_shader_create_from_arrays({
+ .vert = (const char *[]){sh_cfg->lib,
+ datatoc_common_globals_lib_glsl,
+ datatoc_common_view_lib_glsl,
+ datatoc_extra_loose_point_vert_glsl,
+ NULL},
+ .frag = (const char *[]){datatoc_common_globals_lib_glsl,
+ datatoc_extra_loose_point_frag_glsl,
+ NULL},
+ .defs = (const char *[]){sh_cfg->def, NULL},
+ });
+ }
+ return sh_data->extra_loose_point;
+}
+
GPUShader *OVERLAY_shader_extra_point(void)
{
const DRWContextState *draw_ctx = DRW_context_state_get();
diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.c b/source/blender/draw/engines/overlay/overlay_wireframe.c
index 57347598088..7717d803df9 100644
--- a/source/blender/draw/engines/overlay/overlay_wireframe.c
+++ b/source/blender/draw/engines/overlay/overlay_wireframe.c
@@ -167,9 +167,14 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
OVERLAY_Data *data = vedata;
OVERLAY_StorageList *stl = data->stl;
OVERLAY_PrivateData *pd = stl->pd;
- const bool use_wire = (pd->overlay.flag & V3D_OVERLAY_WIREFRAMES) != 0;
const DRWContextState *draw_ctx = DRW_context_state_get();
View3D *v3d = draw_ctx->v3d;
+ const bool all_wires = (ob->dtx & OB_DRAW_ALL_EDGES);
+ const bool is_wire = (ob->dt < OB_SOLID);
+ const bool is_xray = (ob->dtx & OB_DRAWXRAY);
+ const bool is_mesh = ob->type == OB_MESH;
+ const bool use_wire = (pd->overlay.flag & V3D_OVERLAY_WIREFRAMES) || (ob->dtx & OB_DRAWWIRE) ||
+ (ob->dt == OB_WIRE);
/* Fast path for duplis. */
if (dupli && !init_dupli) {
@@ -187,7 +192,7 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
const bool is_edit_mode = BKE_object_is_in_editmode(ob);
bool has_edit_mesh_cage = false;
- if (ob->type == OB_MESH) {
+ if (is_mesh && is_edit_mode) {
/* TODO: Should be its own function. */
Mesh *me = (Mesh *)ob->data;
BMEditMesh *embm = me->edit_mesh;
@@ -197,13 +202,9 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
}
/* Don't do that in edit Mesh mode, unless there is a modifier preview. */
- if (!use_wire || (((ob != draw_ctx->object_edit) && !is_edit_mode) || has_edit_mesh_cage) ||
- ob->type != OB_MESH) {
+ if (use_wire && (!is_mesh || (!is_edit_mode || has_edit_mesh_cage))) {
const bool use_sculpt_pbvh = BKE_sculptsession_use_pbvh_draw(ob, draw_ctx->v3d) &&
!DRW_state_is_image_render();
- const bool all_wires = (ob->dtx & OB_DRAW_ALL_EDGES);
- const bool is_wire = (ob->dt < OB_SOLID);
- const bool is_xray = (ob->dtx & OB_DRAWXRAY);
const bool use_coloring = (use_wire && !is_edit_mode && !use_sculpt_pbvh &&
!has_edit_mesh_cage);
DRWShadingGroup *shgrp = NULL;
@@ -245,6 +246,26 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
dupli->wire_geom = geom;
}
}
+ else if (is_mesh && (!is_edit_mode || has_edit_mesh_cage)) {
+ OVERLAY_ExtraCallBuffers *cb = OVERLAY_extra_call_buffer_get(vedata, ob);
+ Mesh *me = ob->data;
+ float *color;
+ DRW_object_wire_theme_get(ob, draw_ctx->view_layer, &color);
+
+ /* Draw loose geometry. */
+ if (me->totedge > 0 || has_edit_mesh_cage) {
+ struct GPUBatch *geom = DRW_cache_mesh_loose_edges_get(ob);
+ if (geom)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list