[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