Commit: 661f5a24d16191336b5067d554648ff0e58013f2
Author: Campbell Barton
Date:   Fri Jul 14 16:45:47 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB661f5a24d16191336b5067d554648ff0e58013f2

DwM: Show face-mask overlay even with full-shading

Without this face selection would be used but invisible,
display this over fully shaded surface.

===================================================================

M       source/blender/draw/intern/draw_manager.c
M       source/blender/draw/modes/paint_texture_mode.c
M       source/blender/draw/modes/paint_vertex_mode.c
M       source/blender/draw/modes/paint_weight_mode.c

===================================================================

diff --git a/source/blender/draw/intern/draw_manager.c 
b/source/blender/draw/intern/draw_manager.c
index 32dc1434715..8f1a2bd888d 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -2836,9 +2836,7 @@ static void DRW_engines_enable(const Scene *scene, 
SceneLayer *sl)
 
        if (DRW_state_draw_support()) {
                DRW_engines_enable_from_object_mode();
-               if ((obact == NULL) || (DRW_object_is_mode_shade(obact) != 
false)) {
-                       DRW_engines_enable_from_mode(mode);
-               }
+               DRW_engines_enable_from_mode(mode);
        }
 }
 
diff --git a/source/blender/draw/modes/paint_texture_mode.c 
b/source/blender/draw/modes/paint_texture_mode.c
index ae6ee12ee7d..65ab9fd9286 100644
--- a/source/blender/draw/modes/paint_texture_mode.c
+++ b/source/blender/draw/modes/paint_texture_mode.c
@@ -211,7 +211,7 @@ static void PAINT_TEXTURE_cache_init(void *vedata)
                Object *ob = draw_ctx->obact;
                if (ob && ob->type == OB_MESH) {
                        Scene *scene = draw_ctx->scene;
-                       bool use_material_slots = 
(scene->toolsettings->imapaint.mode == IMAGEPAINT_MODE_MATERIAL);
+                       const bool use_material_slots = 
(scene->toolsettings->imapaint.mode == IMAGEPAINT_MODE_MATERIAL);
                        const Mesh *me = ob->data;
 
                        stl->g_data->shgroup_image_array = MEM_mallocN(
@@ -285,41 +285,44 @@ static void PAINT_TEXTURE_cache_populate(void *vedata, 
Object *ob)
                /* Get geometry cache */
                const Mesh *me = ob->data;
                Scene *scene = draw_ctx->scene;
-               bool use_material_slots = (scene->toolsettings->imapaint.mode 
== IMAGEPAINT_MODE_MATERIAL);
+               const bool use_surface = DRW_object_is_mode_shade(ob) == true;
+               const bool use_material_slots = 
(scene->toolsettings->imapaint.mode == IMAGEPAINT_MODE_MATERIAL);
                bool ok = false;
 
-               if (me->mloopuv != NULL) {
-                       if (use_material_slots) {
-                               struct Gwn_Batch **geom_array = me->totcol ? 
DRW_cache_mesh_surface_texpaint_get(ob) : NULL;
-                               if ((me->totcol == 0) || (geom_array == NULL)) {
-                                       struct Gwn_Batch *geom = 
DRW_cache_mesh_surface_get(ob);
-                                       
DRW_shgroup_call_add(stl->g_data->shgroup_fallback, geom, ob->obmat);
-                                       ok = true;
+               if (use_surface) {
+                       if (me->mloopuv != NULL) {
+                               if (use_material_slots) {
+                                       struct Gwn_Batch **geom_array = 
me->totcol ? DRW_cache_mesh_surface_texpaint_get(ob) : NULL;
+                                       if ((me->totcol == 0) || (geom_array == 
NULL)) {
+                                               struct Gwn_Batch *geom = 
DRW_cache_mesh_surface_get(ob);
+                                               
DRW_shgroup_call_add(stl->g_data->shgroup_fallback, geom, ob->obmat);
+                                               ok = true;
+                                       }
+                                       else {
+                                               for (int i = 0; i < me->totcol; 
i++) {
+                                                       if 
(stl->g_data->shgroup_image_array[i]) {
+                                                               
DRW_shgroup_call_add(stl->g_data->shgroup_image_array[i], geom_array[i], 
ob->obmat);
+                                                       }
+                                                       else {
+                                                               
DRW_shgroup_call_add(stl->g_data->shgroup_fallback, geom_array[i], ob->obmat);
+                                                       }
+                                                       ok = true;
+                                               }
+                                       }
                                }
                                else {
-                                       for (int i = 0; i < me->totcol; i++) {
-                                               if 
(stl->g_data->shgroup_image_array[i]) {
-                                                       
DRW_shgroup_call_add(stl->g_data->shgroup_image_array[i], geom_array[i], 
ob->obmat);
-                                               }
-                                               else {
-                                                       
DRW_shgroup_call_add(stl->g_data->shgroup_fallback, geom_array[i], ob->obmat);
-                                               }
+                                       struct Gwn_Batch *geom = 
DRW_cache_mesh_surface_texpaint_single_get(ob);
+                                       if (geom && 
stl->g_data->shgroup_image_array[0]) {
+                                               
DRW_shgroup_call_add(stl->g_data->shgroup_image_array[0], geom, ob->obmat);
                                                ok = true;
                                        }
                                }
                        }
-                       else {
-                               struct Gwn_Batch *geom = 
DRW_cache_mesh_surface_texpaint_single_get(ob);
-                               if (geom && 
stl->g_data->shgroup_image_array[0]) {
-                                       
DRW_shgroup_call_add(stl->g_data->shgroup_image_array[0], geom, ob->obmat);
-                                       ok = true;
-                               }
-                       }
-               }
 
-               if (!ok) {
-                       struct Gwn_Batch *geom = DRW_cache_mesh_surface_get(ob);
-                       DRW_shgroup_call_add(stl->g_data->shgroup_fallback, 
geom, ob->obmat);
+                       if (!ok) {
+                               struct Gwn_Batch *geom = 
DRW_cache_mesh_surface_get(ob);
+                               
DRW_shgroup_call_add(stl->g_data->shgroup_fallback, geom, ob->obmat);
+                       }
                }
 
                /* Face Mask */
diff --git a/source/blender/draw/modes/paint_vertex_mode.c 
b/source/blender/draw/modes/paint_vertex_mode.c
index ac3b82e9418..3d75068c4f2 100644
--- a/source/blender/draw/modes/paint_vertex_mode.c
+++ b/source/blender/draw/modes/paint_vertex_mode.c
@@ -144,15 +144,18 @@ static void PAINT_VERTEX_cache_populate(void *vedata, 
Object *ob)
 
        if ((ob->type == OB_MESH) && (ob == draw_ctx->obact)) {
                IDProperty *ces_mode_pw = 
BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_PAINT_VERTEX, "");
-               bool use_wire = 
BKE_collection_engine_property_value_get_bool(ces_mode_pw, "use_wire");
                const Mesh *me = ob->data;
+               const bool use_wire = 
BKE_collection_engine_property_value_get_bool(ces_mode_pw, "use_wire");
+               const bool use_surface = DRW_object_is_mode_shade(ob) == true;
                const bool use_face_sel = (me->editflag & 
ME_EDIT_PAINT_FACE_SEL) != 0;
                struct Gwn_Batch *geom;
 
                world_light = 
BKE_collection_engine_property_value_get_bool(ces_mode_pw, "use_shading") ? 
0.5f : 1.0f;
 
-               geom = DRW_cache_mesh_surface_vert_colors_get(ob);
-               DRW_shgroup_call_add(stl->g_data->fvcolor_shgrp, geom, 
ob->obmat);
+               if (use_surface) {
+                       geom = DRW_cache_mesh_surface_vert_colors_get(ob);
+                       DRW_shgroup_call_add(stl->g_data->fvcolor_shgrp, geom, 
ob->obmat);
+               }
 
                if (use_face_sel || use_wire) {
                        geom = DRW_cache_mesh_edges_paint_overlay_get(ob, 
use_wire, use_face_sel);
diff --git a/source/blender/draw/modes/paint_weight_mode.c 
b/source/blender/draw/modes/paint_weight_mode.c
index 6a46acd869b..809be5ef8b1 100644
--- a/source/blender/draw/modes/paint_weight_mode.c
+++ b/source/blender/draw/modes/paint_weight_mode.c
@@ -180,16 +180,19 @@ static void PAINT_WEIGHT_cache_populate(void *vedata, 
Object *ob)
 
        if ((ob->type == OB_MESH) && (ob == draw_ctx->obact)) {
                IDProperty *ces_mode_pw = 
BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_PAINT_WEIGHT, "");
-               bool use_wire = 
BKE_collection_engine_property_value_get_bool(ces_mode_pw, "use_wire");
                const Mesh *me = ob->data;
+               const bool use_wire = 
BKE_collection_engine_property_value_get_bool(ces_mode_pw, "use_wire");
+               const bool use_surface = DRW_object_is_mode_shade(ob) == true;
                const bool use_face_sel = (me->editflag & 
ME_EDIT_PAINT_FACE_SEL) != 0;
                const bool use_vert_sel = (me->editflag & 
ME_EDIT_PAINT_VERT_SEL) != 0;
                struct Gwn_Batch *geom;
 
                world_light = 
BKE_collection_engine_property_value_get_bool(ces_mode_pw, "use_shading") ? 
0.5f : 1.0f;
 
-               geom = DRW_cache_mesh_surface_weights_get(ob);
-               DRW_shgroup_call_add(stl->g_data->fweights_shgrp, geom, 
ob->obmat);
+               if (use_surface) {
+                       geom = DRW_cache_mesh_surface_weights_get(ob);
+                       DRW_shgroup_call_add(stl->g_data->fweights_shgrp, geom, 
ob->obmat);
+               }
 
                if (use_face_sel || use_wire) {
                        geom = DRW_cache_mesh_edges_paint_overlay_get(ob, 
use_wire, use_face_sel);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to