[Bf-blender-cvs] [b4988d01cbe] blender2.8: DwM: Option to use final material over mode shading

Campbell Barton noreply at git.blender.org
Wed Jul 12 17:50:40 CEST 2017


Commit: b4988d01cbe9c850a365604967bd3a5e03fc9a72
Author: Campbell Barton
Date:   Thu Jul 13 00:27:06 2017 +1000
Branches: blender2.8
https://developer.blender.org/rBb4988d01cbe9c850a365604967bd3a5e03fc9a72

DwM: Option to use final material over mode shading

Support using full material shading in sculpt & paint modes mode.

Access 'Full Shading' from the display panel when in paint modes.

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

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/paint.c
M	source/blender/draw/engines/clay/clay_engine.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl.h
M	source/blender/draw/intern/draw_cache_impl_mesh.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/paint_texture_mode.c
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/makesrna/intern/rna_space.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index b3792686fc4..cac7066f762 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3266,6 +3266,9 @@ class VIEW3D_PT_view3d_display(Panel):
         col.prop(view, "show_only_render")
         col.prop(view, "show_world")
 
+        if context.mode in {'PAINT_WEIGHT', 'PAINT_VERTEX', 'PAINT_TEXTURE', 'SCULPT'}:
+            col.prop(view, "show_mode_shade_override")
+
         col = layout.column()
         display_all = not view.show_only_render
         col.active = display_all
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index e6893dca928..9a94b9513f4 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -407,6 +407,7 @@ enum {
 	BKE_MESH_BATCH_DIRTY_SELECT,
 	BKE_MESH_BATCH_DIRTY_NOCHECK,
 	BKE_MESH_BATCH_DIRTY_SHADING,
+	BKE_MESH_BATCH_DIRTY_SCULPT_COORDS,
 };
 void BKE_mesh_batch_cache_dirty(struct Mesh *me, int mode);
 void BKE_mesh_batch_cache_free(struct Mesh *me);
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 00efa4aa732..c798a1587ee 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -929,6 +929,9 @@ void BKE_sculpt_update_mesh_elements(Scene *scene, Sculpt *sd, Object *ob,
 			}
 		}
 	}
+
+	/* 2.8x - avoid full mesh update! */
+	BKE_mesh_batch_cache_dirty(me, BKE_MESH_BATCH_DIRTY_SCULPT_COORDS);
 }
 
 int BKE_sculpt_mask_layers_ensure(Object *ob, MultiresModifierData *mmd)
diff --git a/source/blender/draw/engines/clay/clay_engine.c b/source/blender/draw/engines/clay/clay_engine.c
index 00cc93a9db2..61edc7fa318 100644
--- a/source/blender/draw/engines/clay/clay_engine.c
+++ b/source/blender/draw/engines/clay/clay_engine.c
@@ -771,7 +771,7 @@ static void CLAY_cache_populate(void *vedata, Object *ob)
 	const DRWContextState *draw_ctx = DRW_context_state_get();
 	const bool is_active = (ob == draw_ctx->obact);
 	if (is_active) {
-		if (ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) {
+		if (DRW_object_is_mode_shade(ob) == true) {
 			return;
 		}
 	}
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index dd45d87b6e1..1f178fb1302 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -86,7 +86,7 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
 	const DRWContextState *draw_ctx = DRW_context_state_get();
 	const bool is_active = (ob == draw_ctx->obact);
 	if (is_active) {
-		if (ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) {
+		if (DRW_object_is_mode_shade(ob) == true) {
 			return;
 		}
 	}
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 57015e8a582..8b94ffb34c3 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -27,6 +27,7 @@
 
 #include "DNA_world_types.h"
 #include "DNA_modifier_types.h"
+#include "DNA_view3d_types.h"
 
 #include "BLI_dynstr.h"
 #include "BLI_ghash.h"
@@ -719,7 +720,7 @@ void EEVEE_materials_cache_init(EEVEE_Data *vedata)
 }
 
 #define ADD_SHGROUP_CALL(shgrp, ob, geom) do { \
-	if (is_sculpt_mode) { \
+	if (is_sculpt_mode_draw) { \
 		DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat); \
 	} \
 	else { \
@@ -927,11 +928,12 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
 	const bool do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling");
 	const bool is_active = (ob == draw_ctx->obact);
 	const bool is_sculpt_mode = is_active && (ob->mode & OB_MODE_SCULPT) != 0;
+	const bool is_sculpt_mode_draw = is_sculpt_mode && (draw_ctx->v3d->flag2 & V3D_SHOW_MODE_SHADE_OVERRIDE) == 0;
 	const bool is_default_mode_shader = is_sculpt_mode;
 
 	/* First get materials for this mesh. */
 	if (ELEM(ob->type, OB_MESH)) {
-		const int materials_len = MAX2(1, (is_sculpt_mode ? 1 : ob->totcol));
+		const int materials_len = MAX2(1, (is_sculpt_mode_draw ? 1 : ob->totcol));
 
 		struct DRWShadingGroup **shgrp_array = BLI_array_alloca(shgrp_array, materials_len);
 		struct DRWShadingGroup **shgrp_depth_array = BLI_array_alloca(shgrp_depth_array, materials_len);
@@ -943,13 +945,20 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
 		bool use_flat_nor = false;
 
 		if (is_default_mode_shader) {
-			if (is_sculpt_mode) {
+			if (is_sculpt_mode_draw) {
 				use_flat_nor = DRW_object_is_flat_normal(ob);
 			}
 		}
 
 		for (int i = 0; i < materials_len; ++i) {
-			Material *ma = give_current_material(ob, i + 1);
+			Material *ma;
+
+			if (is_sculpt_mode_draw) {
+				ma = NULL;
+			}
+			else {
+				ma = give_current_material(ob, i + 1);
+			}
 
 			gpumat_array[i] = NULL;
 			gpumat_depth_array[i] = NULL;
@@ -980,6 +989,10 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
 			}
 		}
 
+		if (is_sculpt_mode && is_sculpt_mode_draw == false) {
+			DRW_cache_mesh_sculpt_coords_ensure(ob);
+		}
+
 		/* Get per-material split surface */
 		struct Gwn_Batch **mat_geom = DRW_cache_object_surface_material_get(ob, gpumat_array, materials_len);
 		if (mat_geom) {
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 51145b15237..ee1e14f8898 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -356,7 +356,8 @@ void DRW_lamp_engine_data_free(struct LampEngineData *led);
 
 /* Settings */
 bool DRW_object_is_renderable(struct Object *ob);
-bool DRW_object_is_flat_normal(struct Object *ob);
+bool DRW_object_is_flat_normal(const struct Object *ob);
+int  DRW_object_is_mode_shade(const struct Object *ob);
 
 /* Draw commands */
 void DRW_draw_pass(DRWPass *pass);
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index b62559fdb0e..c0338de3d54 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -2287,6 +2287,14 @@ Gwn_Batch *DRW_cache_mesh_verts_weight_overlay_get(Object *ob)
 	return DRW_mesh_batch_cache_get_weight_overlay_verts(me);
 }
 
+void DRW_cache_mesh_sculpt_coords_ensure(Object *ob)
+{
+	BLI_assert(ob->type == OB_MESH);
+
+	Mesh *me = ob->data;
+	DRW_mesh_cache_sculpt_coords_ensure(me);
+}
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 21fa652778b..ac7062b3cc8 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -125,6 +125,8 @@ struct Gwn_Batch **DRW_cache_mesh_surface_shaded_get(
 struct Gwn_Batch **DRW_cache_mesh_surface_texpaint_get(struct Object *ob);
 struct Gwn_Batch *DRW_cache_mesh_surface_texpaint_single_get(struct Object *ob);
 
+void DRW_cache_mesh_sculpt_coords_ensure(struct Object *ob);
+
 /* Curve */
 struct Gwn_Batch *DRW_cache_curve_surface_get(struct Object *ob);
 struct Gwn_Batch *DRW_cache_curve_surface_verts_get(struct Object *ob);
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index 9328f6f6314..f8feeb37b82 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -96,6 +96,8 @@ struct Gwn_Batch *DRW_mesh_batch_cache_get_overlay_loose_edges_nor(struct Mesh *
 struct Gwn_Batch *DRW_mesh_batch_cache_get_overlay_loose_verts(struct Mesh *me);
 struct Gwn_Batch *DRW_mesh_batch_cache_get_overlay_facedots(struct Mesh *me);
 
+void DRW_mesh_cache_sculpt_coords_ensure(struct Mesh *me);
+
 /* Particles */
 struct Gwn_Batch *DRW_particles_batch_cache_get_hair(struct ParticleSystem *psys, struct ModifierData *md);
 struct Gwn_Batch *DRW_particles_batch_cache_get_dots(struct ParticleSystem *psys);
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index ae0e62809bb..f48d739f11b 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -1494,6 +1494,9 @@ typedef struct MeshBatchCache {
 	int vert_len;
 	int mat_len;
 	bool is_editmode;
+
+	/* XXX, only keep for as long as sculpt mode uses shaded drawing. */
+	bool is_sculpt_points_tag;
 } MeshBatchCache;
 
 /* Gwn_Batch cache management. */
@@ -1603,6 +1606,9 @@ void DRW_mesh_batch_cache_dirty(Mesh *me, int mode)
 			 * and not free the entire cache. */
 			cache->is_really_dirty = true;
 			break;
+		case BKE_MESH_BATCH_DIRTY_SCULPT_COORDS:
+			cache->is_sculpt_points_tag = true;
+			break;
 		default:
 			BLI_assert(0);
 	}
@@ -3433,6 +3439,34 @@ Gwn_Batch *DRW_mesh_batch_cache_get_weight_overlay_verts(Mesh *me)
 	return cache->overlay_weight_verts;
 }
 
+/**
+ * Needed for when we draw with shaded data.
+ */
+void DRW_mesh_cache_sculpt_coords_ensure(Mesh *me)
+{
+	if (me->batch_cache) {
+		MeshBatchCache *cache = mesh_batch_cache_get(me);
+		if (cache && cache->pos_with_normals && cache->is_sculpt_points_tag) {
+
+			const int datatype = MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY;
+			MeshRenderData *rdata = mesh_render_data_create(me, datatype);
+
+			Gwn_VertBuf *pos_with_normals = cache->pos_with_normals;
+			cache->pos_with_normals = NULL;
+			GWN_vertbuf_clear(pos_with_normals);
+			Gwn_VertBuf *vbo = mesh_batch_cache_get_tri_pos_and_normals(rdata, cache);
+			*pos_with_normals = *vbo;
+			GWN_vertformat_copy(&pos_with_normals->format, &vbo->format);
+
+			free(vbo);
+			cache->pos_with_normals = pos_with_normals;
+
+			mesh_render_data_free(rdata);
+		}
+		cache->is_sculpt_points_tag = false;
+	}
+}
+
 /** \} */
 
 #undef MESH_RENDER_FUNCTION
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 812280319e9..b93b7e21df2 100644
--- a/so

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list