From d6df23d9d96bfefb6a0a0f3979d3440d0fef05cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 24 Feb 2018 04:45:13 +0100 Subject: Object Mode: Display meshes without faces and edges in object mode. --- source/blender/draw/modes/object_mode.c | 86 +++++++++++++++++++++++++++++---- 1 file changed, 76 insertions(+), 10 deletions(-) (limited to 'source/blender/draw/modes/object_mode.c') diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index d6c0369b0a5..ad943767da4 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -214,6 +214,14 @@ typedef struct OBJECT_PrivateData { DRWShadingGroup *wire_select; DRWShadingGroup *wire_select_group; DRWShadingGroup *wire_transform; + + /* Points */ + DRWShadingGroup *points; + DRWShadingGroup *points_active; + DRWShadingGroup *points_active_group; + DRWShadingGroup *points_select; + DRWShadingGroup *points_select_group; + DRWShadingGroup *points_transform; } OBJECT_PrivateData; /* Transient data */ static struct { @@ -571,6 +579,15 @@ static DRWShadingGroup *shgroup_wire(DRWPass *pass, const float col[4], GPUShade return grp; } +/* currently same as 'shgroup_outline', new function to avoid confustion */ +static DRWShadingGroup *shgroup_points(DRWPass *pass, const float col[4], GPUShader *sh) +{ + DRWShadingGroup *grp = DRW_shgroup_create(sh, pass); + DRW_shgroup_uniform_vec4(grp, "color", col, 1); + + return grp; +} + static DRWShadingGroup *shgroup_theme_id_to_outline_or( OBJECT_StorageList *stl, int theme_id, DRWShadingGroup *fallback) { @@ -605,6 +622,23 @@ static DRWShadingGroup *shgroup_theme_id_to_wire_or( } } +static DRWShadingGroup *shgroup_theme_id_to_point_or( + OBJECT_StorageList *stl, int theme_id, DRWShadingGroup *fallback) +{ + switch (theme_id) { + case TH_ACTIVE: + return stl->g_data->points_active; + case TH_SELECT: + return stl->g_data->points_select; + case TH_GROUP_ACTIVE: + return stl->g_data->points_select_group; + case TH_TRANSFORM: + return stl->g_data->points_transform; + default: + return fallback; + } +} + static void image_calc_aspect(Image *ima, ImageUser *iuser, float r_image_aspect[2]) { float ima_x, ima_y; @@ -981,6 +1015,25 @@ static void OBJECT_cache_init(void *vedata) stl->g_data->wire_active_group = shgroup_wire(psl->non_meshes, ts.colorGroupActive, sh); } + + { + GPUShader *sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_POINT_FIXED_SIZE_UNIFORM_COLOR); + + /* Unselected */ + stl->g_data->points = shgroup_points(psl->non_meshes, ts.colorWire, sh); + + /* Select */ + stl->g_data->points_select = shgroup_points(psl->non_meshes, ts.colorSelect, sh); + stl->g_data->points_select_group = shgroup_points(psl->non_meshes, ts.colorGroupActive, sh); + + /* Transform */ + stl->g_data->points_transform = shgroup_points(psl->non_meshes, ts.colorTransform, sh); + + /* Active */ + stl->g_data->points_active = shgroup_points(psl->non_meshes, ts.colorActive, sh); + stl->g_data->points_active_group = shgroup_points(psl->non_meshes, ts.colorGroupActive, sh); + } + { /* Metaballs Handles */ struct Gwn_Batch *geom; @@ -1845,17 +1898,30 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) switch (ob->type) { case OB_MESH: { - Mesh *me = ob->data; - if (me->totpoly == 0) { - if (ob != draw_ctx->object_edit) { - struct Gwn_Batch *geom = DRW_cache_mesh_edges_get(ob); - if (geom) { - if (theme_id == TH_UNDEFINED) { - theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL); + if (ob != draw_ctx->object_edit) { + Mesh *me = ob->data; + if (me->totpoly == 0) { + if (me->totedge == 0) { + struct Gwn_Batch *geom = DRW_cache_mesh_verts_get(ob); + if (geom) { + if (theme_id == TH_UNDEFINED) { + theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL); + } + + DRWShadingGroup *shgroup = shgroup_theme_id_to_point_or(stl, theme_id, stl->g_data->points); + DRW_shgroup_call_add(shgroup, geom, ob->obmat); + } + } + else { + struct Gwn_Batch *geom = DRW_cache_mesh_edges_get(ob); + if (geom) { + if (theme_id == TH_UNDEFINED) { + theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL); + } + + DRWShadingGroup *shgroup = shgroup_theme_id_to_wire_or(stl, theme_id, stl->g_data->wire); + DRW_shgroup_call_add(shgroup, geom, ob->obmat); } - - DRWShadingGroup *shgroup = shgroup_theme_id_to_wire_or(stl, theme_id, stl->g_data->wire); - DRW_shgroup_call_add(shgroup, geom, ob->obmat); } } } -- cgit v1.2.3