[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50827] trunk/blender/source/blender: Fix #32522: Object's diffuse color not showing in Sculpt Mode

Sergey Sharybin sergey.vfx at gmail.com
Sun Sep 23 16:16:52 CEST 2012


Revision: 50827
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50827
Author:   nazgul
Date:     2012-09-23 14:16:52 +0000 (Sun, 23 Sep 2012)
Log Message:
-----------
Fix #32522: Object's diffuse color not showing in Sculpt Mode

It was missing since sculpting mask implementation.

Now object's color would be multiplied by sculpt mask value.

For VBOs it's done by storing final color in VertexBufferFormat and
mimic behavior of setMaterial callback for getting current diffuse
color.

For non-VBOs diffuse color is getting from current OpenGL context.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/intern/pbvh.c
    trunk/blender/source/blender/gpu/GPU_buffers.h
    trunk/blender/source/blender/gpu/GPU_draw.h
    trunk/blender/source/blender/gpu/intern/gpu_buffers.c
    trunk/blender/source/blender/gpu/intern/gpu_draw.c

Modified: trunk/blender/source/blender/blenlib/intern/pbvh.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/pbvh.c	2012-09-23 10:30:39 UTC (rev 50826)
+++ trunk/blender/source/blender/blenlib/intern/pbvh.c	2012-09-23 14:16:52 UTC (rev 50827)
@@ -1169,10 +1169,14 @@
 					break;
 				case PBVH_FACES:
 					GPU_update_mesh_buffers(node->draw_buffers,
+					                        bvh->faces,
+					                        node->prim_indices,
+					                        node->totprim,
 					                        bvh->verts,
 					                        node->vert_indices,
 					                        node->uniq_verts +
 					                        node->face_verts,
+					                        node->face_vert_indices,
 					                        CustomData_get_layer(bvh->vdata,
 					                                             CD_PAINT_MASK));
 					break;

Modified: trunk/blender/source/blender/gpu/GPU_buffers.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_buffers.h	2012-09-23 10:30:39 UTC (rev 50826)
+++ trunk/blender/source/blender/gpu/GPU_buffers.h	2012-09-23 14:16:52 UTC (rev 50827)
@@ -162,8 +162,9 @@
                                     struct MFace *mface, struct MVert *mvert,
                                     int *face_indices, int totface);
 
-void GPU_update_mesh_buffers(GPU_Buffers *buffers, struct MVert *mvert,
-                             int *vert_indices, int totvert, const float *vmask);
+void GPU_update_mesh_buffers(GPU_Buffers *buffers, struct MFace *mface, int *face_indices, int totface,
+                             struct MVert *mvert, int *vert_indices, int totvert,
+                             int (*face_vert_indices)[4], const float *vmask);
 
 GPU_Buffers *GPU_build_grid_buffers(int *grid_indices, int totgrid,
                                     unsigned int **grid_hidden, int gridsize);

Modified: trunk/blender/source/blender/gpu/GPU_draw.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_draw.h	2012-09-23 10:30:39 UTC (rev 50826)
+++ trunk/blender/source/blender/gpu/GPU_draw.h	2012-09-23 14:16:52 UTC (rev 50827)
@@ -75,6 +75,8 @@
 int GPU_enable_material(int nr, void *attribs);
 void GPU_disable_material(void);
 
+void GPU_material_diffuse_get(int nr, float diff[4]);
+
 void GPU_set_material_alpha_blend(int alphablend);
 int GPU_get_material_alpha_blend(void);
 

Modified: trunk/blender/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2012-09-23 10:30:39 UTC (rev 50826)
+++ trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2012-09-23 14:16:52 UTC (rev 50827)
@@ -54,6 +54,7 @@
 #include "DNA_userdef_types.h"
 
 #include "GPU_buffers.h"
+#include "GPU_draw.h"
 
 typedef enum {
 	GPU_BUFFER_VERTEX_STATE = 1,
@@ -1280,6 +1281,8 @@
 	char pad[2];
 	
 	unsigned char color[3];
+	float accum_color[3];
+	int tot_color;
 } VertexBufferFormat;
 
 struct GPU_Buffers {
@@ -1327,24 +1330,24 @@
 
 static float gpu_color_from_mask(float mask)
 {
-	return (1.0f - mask) * 0.5f + 0.25f;
+	return 1.0f - mask;
 }
 
-static void gpu_color_from_mask_copy(float mask, unsigned char out[3])
+static void gpu_color_from_mask_copy(float mask, const float diffuse_color[4], unsigned char out[3])
 {
-	unsigned char color;
-	
-	color = gpu_color_from_mask(mask) * 255.0f;
+	float mask_color;
 
-	out[0] = color;
-	out[1] = color;
-	out[2] = color;
+	mask_color = gpu_color_from_mask(mask) * 255.0f;
+
+	out[0] = diffuse_color[0] * mask_color;
+	out[1] = diffuse_color[1] * mask_color;
+	out[2] = diffuse_color[2] * mask_color;
 }
 
-static void gpu_color_from_mask_set(float mask)
+static void gpu_color_from_mask_set(float mask, float diffuse_color[4])
 {
 	float color = gpu_color_from_mask(mask);
-	glColor3f(color, color, color);
+	glColor3f(diffuse_color[0] * color, diffuse_color[1] * color, diffuse_color[2] * color);
 }
 
 static float gpu_color_from_mask_quad(const CCGKey *key,
@@ -1360,29 +1363,32 @@
 static void gpu_color_from_mask_quad_copy(const CCGKey *key,
                                           CCGElem *a, CCGElem *b,
                                           CCGElem *c, CCGElem *d,
+                                          const float *diffuse_color,
                                           unsigned char out[3])
 {
-	unsigned char color =
+	float mask_color =
 	    gpu_color_from_mask((*CCG_elem_mask(key, a) +
 	                         *CCG_elem_mask(key, b) +
 	                         *CCG_elem_mask(key, c) +
 	                         *CCG_elem_mask(key, d)) * 0.25f) * 255.0f;
 
-	out[0] = color;
-	out[1] = color;
-	out[2] = color;
+	out[0] = diffuse_color[0] * mask_color;
+	out[1] = diffuse_color[1] * mask_color;
+	out[2] = diffuse_color[2] * mask_color;
 }
 
 static void gpu_color_from_mask_quad_set(const CCGKey *key,
                                          CCGElem *a, CCGElem *b,
-                                         CCGElem *c, CCGElem *d)
+                                         CCGElem *c, CCGElem *d,
+                                         float diffuse_color[4])
 {
 	float color = gpu_color_from_mask_quad(key, a, b, c, d);
-	glColor3f(color, color, color);
+	glColor3f(diffuse_color[0] * color, diffuse_color[1] * color, diffuse_color[2] * color);
 }
 
-void GPU_update_mesh_buffers(GPU_Buffers *buffers, MVert *mvert,
-                             int *vert_indices, int totvert, const float *vmask)
+void GPU_update_mesh_buffers(GPU_Buffers *buffers, MFace *mface, int *face_indices, int totface,
+                             MVert *mvert, int *vert_indices, int totvert,
+                             int (*face_vert_indices)[4], const float *vmask)
 {
 	VertexBufferFormat *vert_data;
 	int i;
@@ -1404,10 +1410,42 @@
 
 				copy_v3_v3(out->co, v->co);
 				memcpy(out->no, v->no, sizeof(short) * 3);
-				gpu_color_from_mask_copy(vmask[vert_indices[i]],
-				                         out->color);
+				zero_v3(out->accum_color);
+				out->tot_color = 0;
 			}
 
+#define UPDATE_VERTEX(face, vertex, index, diffuse_color) \
+			{ \
+				VertexBufferFormat *out = vert_data + face_vert_indices[face][index]; \
+				add_v3_v3(out->accum_color, diffuse_color);	\
+				out->tot_color++; \
+			} (void)0
+
+			for (i = 0; i < totface; ++i) {
+				MFace *f = mface + face_indices[i];
+				float diffuse_color[4];
+
+				GPU_material_diffuse_get(f->mat_nr + 1, diffuse_color);
+
+				UPDATE_VERTEX(i, f->v1, 0, diffuse_color);
+				UPDATE_VERTEX(i, f->v2, 1, diffuse_color);
+				UPDATE_VERTEX(i, f->v3, 2, diffuse_color);
+				if (f->v4)
+					UPDATE_VERTEX(i, f->v4, 3, diffuse_color);
+			}
+#undef UPDATE_VERTEX
+
+			for (i = 0; i < totvert; ++i) {
+				VertexBufferFormat *out = vert_data + i;
+				if (out->tot_color) {
+					float diffuse_color[4];
+
+					mul_v3_v3fl(diffuse_color, out->accum_color, 1.0f / out->tot_color);
+
+					gpu_color_from_mask_copy(vmask[vert_indices[i]], diffuse_color, out->color);
+				}
+			}
+
 			glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
 		}
 		else {
@@ -1517,18 +1555,20 @@
 			for (i = 0; i < totgrid; ++i) {
 				VertexBufferFormat *vd = vert_data;
 				CCGElem *grid = grids[grid_indices[i]];
+				const DMFlagMat *flags = &grid_flag_mats[grid_indices[i]];
+				float diffuse_color[4];
 
+				GPU_material_diffuse_get(flags->mat_nr + 1, diffuse_color);
+
 				for (y = 0; y < key->grid_size; y++) {
 					for (x = 0; x < key->grid_size; x++) {
 						CCGElem *elem = CCG_grid_elem(key, grid, x, y);
 						
 						copy_v3_v3(vd->co, CCG_elem_co(key, elem));
 						if (smooth) {
-							normal_float_to_short_v3(vd->no,
-							                         CCG_elem_no(key, elem));
+							normal_float_to_short_v3(vd->no, CCG_elem_no(key, elem));
 
-							gpu_color_from_mask_copy(*CCG_elem_mask(key, elem),
-							                         vd->color);
+							gpu_color_from_mask_copy(*CCG_elem_mask(key, elem), diffuse_color, vd->color);
 						}
 						vd++;
 					}
@@ -1561,6 +1601,7 @@
 							                              elems[1],
 							                              elems[2],
 							                              elems[3],
+							                              diffuse_color,
 							                              vd->color);
 						}
 					}
@@ -1769,7 +1810,10 @@
 {
 	const MVert *mvert = buffers->mvert;
 	int i, j;
+	float diffuse_color[4] = {0.8f, 0.8f, 0.8f, 1.0f};
 
+	glGetMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse_color);
+
 	gpu_colors_enable(VBO_DISABLED);
 
 	for (i = 0; i < buffers->totface; ++i) {
@@ -1784,7 +1828,7 @@
 
 		if (smooth) {
 			for (j = 0; j < S; j++) {
-				gpu_color_from_mask_set(buffers->vmask[fv[j]]);
+				gpu_color_from_mask_set(buffers->vmask[fv[j]], diffuse_color);
 				glNormal3sv(mvert[fv[j]].no);
 				glVertex3fv(mvert[fv[j]].co);
 			}
@@ -1809,7 +1853,7 @@
 				fmask = (fmask + buffers->vmask[fv[3]]) * 0.25;
 			else
 				fmask /= 3.0f;
-			gpu_color_from_mask_set(fmask);
+			gpu_color_from_mask_set(fmask, diffuse_color);
 			
 			for (j = 0; j < S; j++)
 				glVertex3fv(mvert[fv[j]].co);
@@ -1825,7 +1869,10 @@
 {
 	const CCGKey *key = &buffers->gridkey;
 	int i, j, x, y, gridsize = buffers->gridkey.grid_size;
+	float diffuse_color[4] = {0.8f, 0.8f, 0.8f, 1.0f};
 
+	glGetMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse_color);
+
 	gpu_colors_enable(VBO_DISABLED);
 
 	for (i = 0; i < buffers->totgrid; ++i) {
@@ -1853,7 +1900,7 @@
 
 					if (smooth) {
 						for (j = 0; j < 4; j++) {
-							gpu_color_from_mask_set(*CCG_elem_mask(key, e[j]));
+							gpu_color_from_mask_set(*CCG_elem_mask(key, e[j]), diffuse_color);
 							glNormal3fv(CCG_elem_no(key, e[j]));
 							glVertex3fv(CCG_elem_co(key, e[j]));
 						}
@@ -1866,7 +1913,7 @@
 						               CCG_elem_co(key, e[2]),
 						               CCG_elem_co(key, e[3]));
 						glNormal3fv(fno);
-						gpu_color_from_mask_quad_set(key, e[0], e[1], e[2], e[3]);
+						gpu_color_from_mask_quad_set(key, e[0], e[1], e[2], e[3], diffuse_color);
 
 						for (j = 0; j < 4; j++)
 							glVertex3fv(CCG_elem_co(key, e[j]));
@@ -1883,10 +1930,10 @@
 					CCGElem *a = CCG_grid_elem(key, grid, x, y);
 					CCGElem *b = CCG_grid_elem(key, grid, x, y + 1);
 
-					gpu_color_from_mask_set(*CCG_elem_mask(key, a));
+					gpu_color_from_mask_set(*CCG_elem_mask(key, a), diffuse_color);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list