[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56466] trunk/blender/source/blender/gpu/ intern/gpu_buffers.c: avoid per-vertex mask layer lookups for dyntopo.

Campbell Barton ideasman42 at gmail.com
Thu May 2 08:09:06 CEST 2013


Revision: 56466
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56466
Author:   campbellbarton
Date:     2013-05-02 06:09:05 +0000 (Thu, 02 May 2013)
Log Message:
-----------
avoid per-vertex mask layer lookups for dyntopo.

Modified Paths:
--------------
    trunk/blender/source/blender/gpu/intern/gpu_buffers.c

Modified: trunk/blender/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2013-05-02 04:59:52 UTC (rev 56465)
+++ trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2013-05-02 06:09:05 UTC (rev 56466)
@@ -1872,26 +1872,28 @@
  * index '*v_index' in the 'vert_data' array and '*v_index' is
  * incremented.
  */
-static void gpu_bmesh_vert_to_buffer_copy(BMVert *v, BMesh *bm,
-										  VertexBufferFormat *vert_data,
-										  int *v_index,
-										  const float fno[3],
-										  const float *fmask)
+static void gpu_bmesh_vert_to_buffer_copy(BMVert *v,
+                                          VertexBufferFormat *vert_data,
+                                          int *v_index,
+                                          const float fno[3],
+                                          const float *fmask,
+                                          const int cd_vert_mask_offset)
 {
-	VertexBufferFormat *vd = &vert_data[*v_index];
-	float *mask;
+	if (!BM_elem_flag_test(v, BM_ELEM_HIDDEN)) {
+		VertexBufferFormat *vd = &vert_data[*v_index];
 
-	if (!BM_elem_flag_test(v, BM_ELEM_HIDDEN)) {
 		/* TODO: should use material color */
 		float diffuse_color[4] = {0.8f, 0.8f, 0.8f, 1.0f};
 
 		/* Set coord, normal, and mask */
 		copy_v3_v3(vd->co, v->co);
 		normal_float_to_short_v3(vd->no, fno ? fno : v->no);
-		mask = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_PAINT_MASK);
-		gpu_color_from_mask_copy(fmask ? *fmask : *mask,
-								 diffuse_color,
-								 vd->color);
+
+		gpu_color_from_mask_copy(
+		        fmask ? *fmask :
+		                BM_ELEM_CD_GET_FLOAT(v, cd_vert_mask_offset),
+		        diffuse_color,
+		        vd->color);
 		
 
 		/* Assign index for use in the triangle index buffer */
@@ -1950,6 +1952,9 @@
 	void *tri_data;
 	int tottri, totvert, maxvert = 0;
 
+	/* TODO, make mask layer optional for bmesh buffer */
+	const int cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK);
+
 	if (!buffers->vert_buf || (buffers->smooth && !buffers->index_buf))
 		return;
 
@@ -1982,12 +1987,14 @@
 
 			GHASH_ITER (gh_iter, bm_unique_verts) {
 				gpu_bmesh_vert_to_buffer_copy(BLI_ghashIterator_getKey(&gh_iter),
-											  bm, vert_data, &v_index, NULL, NULL);
+				                              vert_data, &v_index, NULL, NULL,
+				                              cd_vert_mask_offset);
 			}
 
 			GHASH_ITER (gh_iter, bm_other_verts) {
 				gpu_bmesh_vert_to_buffer_copy(BLI_ghashIterator_getKey(&gh_iter),
-											  bm, vert_data, &v_index, NULL, NULL);
+				                              vert_data, &v_index, NULL, NULL,
+				                              cd_vert_mask_offset);
 			}
 
 			maxvert = v_index;
@@ -2008,15 +2015,14 @@
 
 					/* Average mask value */
 					for (i = 0; i < 3; i++) {
-						fmask += *((float*)CustomData_bmesh_get(&bm->vdata,
-						                                        v[i]->head.data,
-						                                        CD_PAINT_MASK));
+						fmask += BM_ELEM_CD_GET_FLOAT(v[i], cd_vert_mask_offset);
 					}
 					fmask /= 3.0f;
 					
 					for (i = 0; i < 3; i++) {
-						gpu_bmesh_vert_to_buffer_copy(v[i], bm, vert_data,
-						                              &v_index, f->no, &fmask);
+						gpu_bmesh_vert_to_buffer_copy(v[i], vert_data,
+						                              &v_index, f->no, &fmask,
+						                              cd_vert_mask_offset);
 					}
 				}
 			}




More information about the Bf-blender-cvs mailing list