[Bf-blender-cvs] [cbe57acddf9] blender2.8: Workbench: Integration VertexPaint and WeightPaint modes

Jeroen Bakker noreply at git.blender.org
Mon Apr 30 15:54:52 CEST 2018


Commit: cbe57acddf9554d11988718758096f9d847e9c95
Author: Jeroen Bakker
Date:   Mon Apr 30 15:50:08 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBcbe57acddf9554d11988718758096f9d847e9c95

Workbench: Integration VertexPaint and WeightPaint modes

 - Disable VertexPaint and WeightPaint for OB_MATERIAL and OB_RENDER. Users want to see the final result
 - When in OB_SOLID, the active object should be rendered without any color. The lighting information is multiplied with the VertexPaint/WeightPaint color
 - Removed the use_shading flag from VertexPaint and WeightPaint
 - add method to check if render engine should draw without color (DRW_object_in_only_lighting_mode)

Reviewers: fclem

Tags: #code_quest

Maniphest Tasks: T54894

Differential Revision: https://developer.blender.org/D3191

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

M	release/scripts/startup/bl_ui/space_topbar.py
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/paint_vertex_mode.c
M	source/blender/draw/modes/paint_weight_mode.c

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

diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py
index 7529a9dcd4a..9c0acfd7a6a 100644
--- a/release/scripts/startup/bl_ui/space_topbar.py
+++ b/release/scripts/startup/bl_ui/space_topbar.py
@@ -150,7 +150,7 @@ class TOPBAR_HT_lower_bar(Header):
             layout.popover_group(space_type='VIEW_3D', region_type='TOOLS', context=".dummy", category="")
             layout.popover_group(space_type='VIEW_3D', region_type='TOOLS', context=".vertexpaint", category="")
         elif mode == 'PAINT_WEIGHT':
-            layout.popover_group(space_type='VIEW_3D', region_type='TOOLS', context="", category="")
+            layout.popover_group(space_type='VIEW_3D', region_type='TOOLS', context=".dummy", category="")
         elif mode == 'PAINT_TEXTURE':
             layout.popover_group(space_type='VIEW_3D', region_type='TOOLS', context="", category="")
 
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index ae864539fb2..5dd2c1e9c01 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -174,7 +174,11 @@ static void workbench_init_object_data(ObjectEngineData *engine_data)
 
 static void get_material_solid_color(WORKBENCH_PrivateData *wpd, WORKBENCH_ObjectData *engine_object_data, Object *ob, float *color, float hsv_saturation, float hsv_value)
 {
-	if (wpd->drawtype_options & V3D_DRAWOPTION_RANDOMIZE) {
+	static float default_color[] = {1.0f, 1.0f, 1.0f};
+	if (DRW_object_is_paint_mode(ob)) {
+		copy_v3_v3(color, default_color);
+	}
+	else if (wpd->drawtype_options & V3D_DRAWOPTION_RANDOMIZE) {
 		float offset = fmodf(engine_object_data->object_id * M_GOLDEN_RATION_CONJUGATE, 1.0);
 		float hsv[3] = {offset, hsv_saturation, hsv_value};
 		hsv_to_rgb_v(hsv, color);
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 12003adf80a..e287bcc99df 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -458,6 +458,7 @@ bool DRW_object_is_renderable(struct Object *ob);
 bool DRW_check_object_visible_within_active_context(struct Object *ob);
 bool DRW_object_is_flat_normal(const struct Object *ob);
 int  DRW_object_is_mode_shade(const struct Object *ob);
+int  DRW_object_is_paint_mode(const struct Object *ob);
 
 /* Draw commands */
 void DRW_draw_pass(DRWPass *pass);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index e1f4cdacdb4..cdc598d01b0 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -196,7 +196,10 @@ int DRW_object_is_mode_shade(const Object *ob)
 	BLI_assert(ob == DST.draw_ctx.obact);
 	UNUSED_VARS_NDEBUG(ob);
 	if ((DST.draw_ctx.object_mode & OB_MODE_EDIT) == 0) {
-		if (DST.draw_ctx.object_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) {
+		if ((DST.draw_ctx.object_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT)) > 0) {
+			return !(ELEM(DST.draw_ctx.v3d->drawtype, OB_MATERIAL, OB_RENDER));
+		}
+		else if (DST.draw_ctx.object_mode & (OB_MODE_TEXTURE_PAINT)) {
 			if ((DST.draw_ctx.v3d->flag2 & V3D_SHOW_MODE_SHADE_OVERRIDE) == 0) {
 				return true;
 			}
@@ -208,6 +211,16 @@ int DRW_object_is_mode_shade(const Object *ob)
 	return -1;
 }
 
+int DRW_object_is_paint_mode(const Object *ob)
+{
+	if (ob == DST.draw_ctx.obact) {
+		if ((DST.draw_ctx.object_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT)) > 0) {
+			return true;
+		}
+	}
+	return false;
+}
+
 /** \} */
 
 
diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c
index 835fefdee26..2c963571302 100644
--- a/source/blender/draw/modes/paint_vertex_mode.c
+++ b/source/blender/draw/modes/paint_vertex_mode.c
@@ -96,8 +96,6 @@ static void PAINT_VERTEX_engine_init(void *UNUSED(vedata))
 	}
 }
 
-static float world_light;
-
 static void PAINT_VERTEX_cache_init(void *vedata)
 {
 	PAINT_VERTEX_PassList *psl = ((PAINT_VERTEX_Data *)vedata)->psl;
@@ -112,12 +110,13 @@ static void PAINT_VERTEX_cache_init(void *vedata)
 		/* Create a pass */
 		psl->vcolor_faces = DRW_pass_create(
 		        "Vert Color Pass",
-		        DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
+		        DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_MULTIPLY);
 
 		stl->g_data->fvcolor_shgrp = DRW_shgroup_create(e_data.vcolor_face_shader, psl->vcolor_faces);
 
 		static float light[3] = {-0.3f, 0.5f, 1.0f};
 		static float alpha = 1.0f;
+		static float world_light = 1.0f;
 		DRW_shgroup_uniform_vec3(stl->g_data->fvcolor_shgrp, "light", light, 1);
 		DRW_shgroup_uniform_float(stl->g_data->fvcolor_shgrp, "alpha", &alpha, 1);
 		DRW_shgroup_uniform_float(stl->g_data->fvcolor_shgrp, "global", &world_light, 1);
@@ -156,8 +155,6 @@ static void PAINT_VERTEX_cache_populate(void *vedata, Object *ob)
 		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;
-
 		if (use_surface) {
 			geom = DRW_cache_mesh_surface_vert_colors_get(ob);
 			DRW_shgroup_call_add(stl->g_data->fvcolor_shgrp, geom, ob->obmat);
@@ -195,7 +192,6 @@ void PAINT_VERTEX_collection_settings_create(IDProperty *properties)
 	           properties->type == IDP_GROUP &&
 	           properties->subtype == IDP_GROUP_SUB_MODE_PAINT_VERTEX);
 
-	BKE_collection_engine_property_add_bool(properties, "use_shading", true);
 	BKE_collection_engine_property_add_bool(properties, "use_wire", false);
 }
 
diff --git a/source/blender/draw/modes/paint_weight_mode.c b/source/blender/draw/modes/paint_weight_mode.c
index 3cc2ad63ed4..a5a9f355dc6 100644
--- a/source/blender/draw/modes/paint_weight_mode.c
+++ b/source/blender/draw/modes/paint_weight_mode.c
@@ -118,8 +118,6 @@ static void PAINT_WEIGHT_engine_init(void *UNUSED(vedata))
 	}
 }
 
-static float world_light;
-
 static void PAINT_WEIGHT_cache_init(void *vedata)
 {
 	PAINT_WEIGHT_PassList *psl = ((PAINT_WEIGHT_Data *)vedata)->psl;
@@ -134,12 +132,13 @@ static void PAINT_WEIGHT_cache_init(void *vedata)
 		/* Create a pass */
 		psl->weight_faces = DRW_pass_create(
 		        "Weight Pass",
-		        DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
+		        DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_MULTIPLY);
 
 		stl->g_data->fweights_shgrp = DRW_shgroup_create(e_data.weight_face_shader, psl->weight_faces);
 
 		static float light[3] = {-0.3f, 0.5f, 1.0f};
 		static float alpha = 1.0f;
+		static float world_light = 1.0f;
 		DRW_shgroup_uniform_vec3(stl->g_data->fweights_shgrp, "light", light, 1);
 		DRW_shgroup_uniform_float(stl->g_data->fweights_shgrp, "alpha", &alpha, 1);
 		DRW_shgroup_uniform_float(stl->g_data->fweights_shgrp, "global", &world_light, 1);
@@ -187,8 +186,6 @@ static void PAINT_WEIGHT_cache_populate(void *vedata, Object *ob)
 		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;
-
 		if (use_surface) {
 			geom = DRW_cache_mesh_surface_weights_get(ob);
 			DRW_shgroup_call_add(stl->g_data->fweights_shgrp, geom, ob->obmat);
@@ -233,7 +230,6 @@ void PAINT_WEIGHT_collection_settings_create(IDProperty *properties)
 	           properties->type == IDP_GROUP &&
 	           properties->subtype == IDP_GROUP_SUB_MODE_PAINT_WEIGHT);
 
-	BKE_collection_engine_property_add_bool(properties, "use_shading", true);
 	BKE_collection_engine_property_add_bool(properties, "use_wire", false);
 }



More information about the Bf-blender-cvs mailing list