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
                }
        }
  }
--

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to