[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48867] trunk/blender/source/blender/ editors/space_view3d/drawmesh.c: Fix #31988: VBOs Textured solid : no update of material in 3Dview

Sergey Sharybin sergey.vfx at gmail.com
Thu Jul 12 18:08:23 CEST 2012


Revision: 48867
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48867
Author:   nazgul
Date:     2012-07-12 16:08:22 +0000 (Thu, 12 Jul 2012)
Log Message:
-----------
Fix #31988: VBOs Textured solid : no update of material in 3Dview

Issue was caused by VBOs using CD_TEXTURE_MCOL for faces colors. This
layer was creating on mesh display (from draw_tface_mapped__set_draw)
in cases there's no such a layer.

If material settings are changing, this layer wasn't updated and old
colors were used.

Fixed by performing an update of this layer in cases it's already
exists. This would give some % of slowdown, but don't think it'll
be dramatically bad.

Would be nice to find a nice way to update such a layer in cases
material is actually changes only, or get completely rid of it/

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_view3d/drawmesh.c

Modified: trunk/blender/source/blender/editors/space_view3d/drawmesh.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawmesh.c	2012-07-12 15:36:22 UTC (rev 48866)
+++ trunk/blender/source/blender/editors/space_view3d/drawmesh.c	2012-07-12 16:08:22 UTC (rev 48867)
@@ -466,7 +466,8 @@
 		return DM_DRAW_OPTION_NORMAL; /* Set color from mcol */
 	}
 }
-static void add_tface_color_layer(DerivedMesh *dm)
+
+static void update_tface_color_layer(DerivedMesh *dm)
 {
 	MTFace *tface = DM_get_tessface_data_layer(dm, CD_MTFACE);
 	MFace *mface = dm->getTessFaceArray(dm);
@@ -476,7 +477,15 @@
 	if (!mcol)
 		mcol = dm->getTessFaceDataArray(dm, CD_MCOL);
 
-	finalCol = MEM_mallocN(sizeof(MCol) * 4 * dm->getNumTessFaces(dm), "add_tface_color_layer");
+	if (CustomData_has_layer(&dm->faceData, CD_TEXTURE_MCOL)) {
+		finalCol = CustomData_get_layer(&dm->faceData, CD_TEXTURE_MCOL);
+	}
+	else {
+		finalCol = MEM_mallocN(sizeof(MCol) * 4 * dm->getNumTessFaces(dm), "add_tface_color_layer");
+
+		CustomData_add_layer(&dm->faceData, CD_TEXTURE_MCOL, CD_ASSIGN, finalCol, dm->numTessFaceData);
+	}
+
 	for (i = 0; i < dm->getNumTessFaces(dm); i++) {
 		Material *ma = give_current_material(Gtexdraw.ob, mface[i].mat_nr + 1);
 
@@ -542,7 +551,6 @@
 			}
 		}
 	}
-	CustomData_add_layer(&dm->faceData, CD_TEXTURE_MCOL, CD_ASSIGN, finalCol, dm->numTessFaceData);
 }
 
 static DMDrawOption draw_tface_mapped__set_draw(void *userData, int index)
@@ -797,8 +805,7 @@
 		else {
 			drawTFace_userData userData;
 
-			if (!CustomData_has_layer(&dm->faceData, CD_TEXTURE_MCOL))
-				add_tface_color_layer(dm);
+			update_tface_color_layer(dm);
 
 			userData.mf = DM_get_tessface_data_layer(dm, CD_MFACE);
 			userData.tf = DM_get_tessface_data_layer(dm, CD_MTFACE);




More information about the Bf-blender-cvs mailing list