[Bf-blender-cvs] [d229e5e] temp-derivedmesh-looptri: Merge branch 'master' into temp-derivedmesh-looptri

Campbell Barton noreply at git.blender.org
Thu Jul 16 08:14:36 CEST 2015


Commit: d229e5e660906cea7464fa8e6ad58fa1bdac88e6
Author: Campbell Barton
Date:   Thu Jul 16 15:53:17 2015 +1000
Branches: temp-derivedmesh-looptri
https://developer.blender.org/rBd229e5e660906cea7464fa8e6ad58fa1bdac88e6

Merge branch 'master' into temp-derivedmesh-looptri

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



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

diff --cc source/blender/editors/space_view3d/drawmesh.c
index 7d62e5a,b0250df..1cea81b
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@@ -590,78 -590,128 +590,115 @@@ static DMDrawOption draw_tface__set_dra
  
  static void update_tface_color_layer(DerivedMesh *dm, bool use_mcol)
  {
 +	const MPoly *mp = dm->getPolyArray(dm);
 +	const int mpoly_num = dm->getNumPolys(dm);
  	MTexPoly *mtexpoly = DM_get_poly_data_layer(dm, CD_MTEXPOLY);
 -	MFace *mface = dm->getTessFaceArray(dm);
 -	MCol *finalCol;
 +	MLoopCol *finalCol;
  	int i, j;
 -	MCol *mcol = NULL;
 +	MLoopCol *mloopcol = NULL;
  
+ 	/* cache material values to avoid a lot of lookups */
+ 	Material *ma = NULL;
+ 	short mat_nr_prev = -1;
+ 	enum {
+ 		COPY_CALC,
+ 		COPY_ORIG,
+ 		COPY_PREV,
+ 	} copy_mode = COPY_CALC;
+ 
  	if (use_mcol) {
 -		mcol = dm->getTessFaceDataArray(dm, CD_PREVIEW_MCOL);
 -		if (!mcol)
 -			mcol = dm->getTessFaceDataArray(dm, CD_MCOL);
 +		mloopcol = dm->getLoopDataArray(dm, CD_PREVIEW_MLOOPCOL);
 +		if (!mloopcol)
 +			mloopcol = dm->getLoopDataArray(dm, CD_MLOOPCOL);
  	}
  
 -	if (CustomData_has_layer(&dm->faceData, CD_TEXTURE_MCOL)) {
 -		finalCol = CustomData_get_layer(&dm->faceData, CD_TEXTURE_MCOL);
 +	if (CustomData_has_layer(&dm->loopData, CD_TEXTURE_MLOOPCOL)) {
 +		finalCol = CustomData_get_layer(&dm->loopData, CD_TEXTURE_MLOOPCOL);
  	}
  	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);
 +		finalCol = MEM_mallocN(sizeof(MLoopCol) * dm->numLoopData, "add_tface_color_layer");
 +		CustomData_add_layer(&dm->loopData, CD_TEXTURE_MLOOPCOL, CD_ASSIGN, finalCol, dm->numLoopData);
  	}
  
 -	for (i = 0; i < dm->getNumTessFaces(dm); i++) {
 -		const short mat_nr = mface[i].mat_nr;
 +	for (i = mpoly_num; i--; mp++) {
- 		Material *ma = give_current_material(Gtexdraw.ob, mp->mat_nr + 1);
++		const short mat_nr = mp->mat_nr;
+ 
+ 		if (UNLIKELY(mat_nr_prev != mat_nr)) {
 -			ma = give_current_material(Gtexdraw.ob, mface[i].mat_nr + 1);
++			ma = give_current_material(Gtexdraw.ob, mat_nr + 1);
+ 			copy_mode = COPY_CALC;
+ 			mat_nr_prev = mat_nr;
+ 		}
  
- 		if (ma && (ma->game.flag & GEMAT_INVISIBLE)) {
+ 		/* avoid lookups  */
+ 		if (copy_mode == COPY_ORIG) {
 -			memcpy(&finalCol[i * 4], &mcol[i * 4], sizeof(MCol) * 4);
++			memcpy(&finalCol[mp->loopstart], &mloopcol[mp->loopstart], sizeof(*finalCol) * mp->totloop);
+ 		}
+ 		else if (copy_mode == COPY_PREV) {
 -			memcpy(&finalCol[i * 4], &finalCol[(i - 1) * 4], sizeof(MCol) * 4);
++			int loop_index = mp->loopstart;
++			const MLoopCol *lcol_prev = &finalCol[(mp - 1)->loopstart];
++			for (j = 0; j < mp->totloop; j++, loop_index++) {
++				finalCol[loop_index] = *lcol_prev;
++			}
+ 		}
+ 
+ 		/* (copy_mode == COPY_CALC) */
+ 		else if (ma && (ma->game.flag & GEMAT_INVISIBLE)) {
 -			if (mcol) {
 -				memcpy(&finalCol[i * 4], &mcol[i * 4], sizeof(MCol) * 4);
 +			if (mloopcol) {
 +				memcpy(&finalCol[mp->loopstart], &mloopcol[mp->loopstart], sizeof(*finalCol) * mp->totloop);
+ 				copy_mode = COPY_ORIG;
  			}
- 			else
+ 			else {
 -				for (j = 0; j < 4; j++) {
 -					finalCol[i * 4 + j].b = 255;
 -					finalCol[i * 4 + j].g = 255;
 -					finalCol[i * 4 + j].r = 255;
 -				}
 +				memset(&finalCol[mp->loopstart], 0xff, sizeof(*finalCol) * mp->totloop);
+ 				copy_mode = COPY_PREV;
+ 			}
  		}
  		else if (mtexpoly && set_draw_settings_cached(0, mtexpoly, ma, Gtexdraw)) {
- 			int loop_index = mp->loopstart;;
 -			for (j = 0; j < 4; j++) {
 -				finalCol[i * 4 + j].b = 255;
 -				finalCol[i * 4 + j].g = 0;
 -				finalCol[i * 4 + j].r = 255;
++			int loop_index = mp->loopstart;
 +			for (j = 0; j < mp->totloop; j++, loop_index++) {
 +				finalCol[loop_index].r = 255;
 +				finalCol[loop_index].g = 0;
 +				finalCol[loop_index].b = 255;
  			}
+ 			copy_mode = COPY_PREV;
  		}
  		else if (ma && (ma->shade_flag & MA_OBCOLOR)) {
 -			for (j = 0; j < 4; j++) {
 -				finalCol[i * 4 + j].b = Gtexdraw.obcol[0];
 -				finalCol[i * 4 + j].g = Gtexdraw.obcol[1];
 -				finalCol[i * 4 + j].r = Gtexdraw.obcol[2];
 +			int loop_index = mp->loopstart;;
 +			for (j = 0; j < mp->totloop; j++, loop_index++) {
 +				copy_v3_v3_char(&finalCol[loop_index].r, (char *)Gtexdraw.obcol);
  			}
+ 			copy_mode = COPY_PREV;
  		}
- 		else if (!mloopcol) {
- 			if (mtexpoly) {
+ 		else {
 -			if (mcol) {
 -				memcpy(&finalCol[i * 4], &mcol[i * 4], sizeof(MCol) * 4);
++			if (mloopcol) {
++				memcpy(&finalCol[mp->loopstart], &mloopcol[mp->loopstart], sizeof(*finalCol) * mp->totloop);
+ 				copy_mode = COPY_ORIG;
+ 			}
+ 			else if (mtexpoly) {
 -				for (j = 0; j < 4; j++) {
 -					finalCol[i * 4 + j].b = 255;
 -					finalCol[i * 4 + j].g = 255;
 -					finalCol[i * 4 + j].r = 255;
 -				}
 +				memset(&finalCol[mp->loopstart], 0xff, sizeof(*finalCol) * mp->totloop);
+ 				copy_mode = COPY_PREV;
  			}
  			else {
 -				if (ma) {
 -					float col[3];
 -					MCol tcol;
 -
 -					if (Gtexdraw.color_profile) {
 -						linearrgb_to_srgb_v3_v3(col, &ma->r);
 -					}
 -					else {
 -						copy_v3_v3(col, &ma->r);
 -					}
 +				float col[3];
  
 -					tcol.b = FTOCHAR(col[0]);
 -					tcol.g = FTOCHAR(col[1]);
 -					tcol.r = FTOCHAR(col[2]);
 -					tcol.a = 255;
 +				if (ma) {
 +					int loop_index = mp->loopstart;
 +					MLoopCol lcol;
  
 -					for (j = 0; j < 4; j++) {
 -						finalCol[i * 4 + j] = tcol;
 +					if (Gtexdraw.color_profile) linearrgb_to_srgb_v3_v3(col, &ma->r);
 +					else copy_v3_v3(col, &ma->r);
 +					rgb_float_to_uchar((unsigned char *)&lcol.r, col);
 +					lcol.a = 255;
 +					
 +					for (j = 0; j < mp->totloop; j++, loop_index++) {
 +						finalCol[loop_index] = lcol;
  					}
  				}
- 				else
+ 				else {
 -					for (j = 0; j < 4; j++) {
 -						finalCol[i * 4 + j].b = 255;
 -						finalCol[i * 4 + j].g = 255;
 -						finalCol[i * 4 + j].r = 255;
 -					}
 +					memset(&finalCol[mp->loopstart], 0xff, sizeof(*finalCol) * mp->totloop);
+ 				}
+ 				copy_mode = COPY_PREV;
  			}
  		}
- 		else {
- 			memcpy(&finalCol[mp->loopstart], &mloopcol[mp->loopstart], sizeof(*finalCol) * mp->totloop);
- 		}
  	}
  }
  
@@@ -1295,4 -1345,4 +1332,3 @@@ void draw_mesh_paint(View3D *v3d, Regio
  		}
  	}
  }
--




More information about the Bf-blender-cvs mailing list