[Bf-blender-cvs] [0ec6ad027e2] blender2.8: Fix weight drawing in Edit Mode by using the Weight Paint shader.

Alexander Gavrilov noreply at git.blender.org
Tue Oct 2 11:41:23 CEST 2018


Commit: 0ec6ad027e29b7740b53a3ec8723ddf50e5c2f90
Author: Alexander Gavrilov
Date:   Tue Oct 2 12:34:31 2018 +0300
Branches: blender2.8
https://developer.blender.org/rB0ec6ad027e29b7740b53a3ec8723ddf50e5c2f90

Fix weight drawing in Edit Mode by using the Weight Paint shader.

After rB3da46a8d8df2 the vertex color shader can't draw the raw
weight data produced by DRW_cache_mesh_surface_weights_get.

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

M	source/blender/draw/modes/edit_mesh_mode.c

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

diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index fee7dd92342..aa19769bcac 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -46,6 +46,11 @@
 extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */
 extern struct GlobalsUboStorage ts; /* draw_common.c */
 
+extern struct GPUTexture *globals_weight_ramp; /* draw_common.c */
+
+extern char datatoc_paint_weight_vert_glsl[];
+extern char datatoc_paint_weight_frag_glsl[];
+
 extern char datatoc_edit_mesh_overlay_common_lib_glsl[];
 extern char datatoc_edit_mesh_overlay_frag_glsl[];
 extern char datatoc_edit_mesh_overlay_vert_glsl[];
@@ -66,7 +71,7 @@ extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
 
 /* *********** LISTS *********** */
 typedef struct EDIT_MESH_PassList {
-	struct DRWPass *vcolor_faces;
+	struct DRWPass *weight_faces;
 	struct DRWPass *depth_hidden_wire;
 	struct DRWPass *ghost_clear_depth;
 	struct DRWPass *edit_face_overlay;
@@ -97,8 +102,8 @@ typedef struct EDIT_MESH_Data {
 #define MAX_SHADERS 16
 
 static struct {
-	/* weight/vert-color */
-	GPUShader *vcolor_face_shader;
+	/* weight */
+	GPUShader *weight_face_shader;
 
 	/* Geometry */
 	GPUShader *overlay_tri_sh_cache[MAX_SHADERS];
@@ -119,8 +124,8 @@ static struct {
 } e_data = {NULL}; /* Engine data */
 
 typedef struct EDIT_MESH_PrivateData {
-	/* weight/vert-color */
-	DRWShadingGroup *fvcolor_shgrp;
+	/* weight */
+	DRWShadingGroup *fweights_shgrp;
 	DRWShadingGroup *depth_shgrp_hidden_wire;
 
 	DRWShadingGroup *fnormals_shgrp;
@@ -258,8 +263,11 @@ static void EDIT_MESH_engine_init(void *vedata)
 		GPU_ATTACHMENT_TEXTURE(e_data.occlude_wire_color_tx)
 	});
 
-	if (!e_data.vcolor_face_shader) {
-		e_data.vcolor_face_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR_ALPHA);
+	if (!e_data.weight_face_shader) {
+		e_data.weight_face_shader = DRW_shader_create_with_lib(
+		        datatoc_paint_weight_vert_glsl, NULL,
+		        datatoc_paint_weight_frag_glsl,
+		        datatoc_common_globals_lib_glsl, NULL);
 	}
 
 	if (!e_data.overlay_vert_sh) {
@@ -437,18 +445,16 @@ static void EDIT_MESH_cache_init(void *vedata)
 	}
 
 	{
-		psl->vcolor_faces = DRW_pass_create(
-		        "Vert Color Pass",
+		psl->weight_faces = DRW_pass_create(
+		        "Weight Pass",
 		        DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL);
 
-		stl->g_data->fvcolor_shgrp = DRW_shgroup_create(e_data.vcolor_face_shader, psl->vcolor_faces);
+		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;  /* XXX, see: paint_vertex_mode.c */
-		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);
+		DRW_shgroup_uniform_float(stl->g_data->fweights_shgrp, "opacity", &alpha, 1);
+		DRW_shgroup_uniform_texture(stl->g_data->fweights_shgrp, "colorramp", globals_weight_ramp);
+		DRW_shgroup_uniform_block(stl->g_data->fweights_shgrp, "globalsBlock", globals_ubo);
 	}
 
 	{
@@ -593,7 +599,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
 
 			if (do_show_weight) {
 				geom = DRW_cache_mesh_surface_weights_get(ob, tsettings, false);
-				DRW_shgroup_call_add(stl->g_data->fvcolor_shgrp, geom, ob->obmat);
+				DRW_shgroup_call_add(stl->g_data->fweights_shgrp, geom, ob->obmat);
 			}
 
 			if (do_occlude_wire) {
@@ -667,7 +673,7 @@ static void EDIT_MESH_draw_scene(void *vedata)
 	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
 	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
 
-	DRW_draw_pass(psl->vcolor_faces);
+	DRW_draw_pass(psl->weight_faces);
 
 	DRW_draw_pass(psl->depth_hidden_wire);
 
@@ -718,6 +724,8 @@ static void EDIT_MESH_draw_scene(void *vedata)
 
 static void EDIT_MESH_engine_free(void)
 {
+	DRW_SHADER_FREE_SAFE(e_data.weight_face_shader);
+
 	DRW_SHADER_FREE_SAFE(e_data.overlay_vert_sh);
 	DRW_SHADER_FREE_SAFE(e_data.overlay_facedot_sh);
 	DRW_SHADER_FREE_SAFE(e_data.overlay_mix_sh);



More information about the Bf-blender-cvs mailing list