svn merge -r41266:41287 ^/trunk/blender
authorCampbell Barton <ideasman42@gmail.com>
Wed, 26 Oct 2011 03:26:52 +0000 (03:26 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 26 Oct 2011 03:26:52 +0000 (03:26 +0000)
1  2 
CMakeLists.txt
source/blender/blenkernel/CMakeLists.txt
source/blender/blenkernel/intern/mesh_validate.c
source/blender/editors/space_view3d/drawmesh.c
source/blenderplayer/CMakeLists.txt
source/creator/CMakeLists.txt

diff --combined CMakeLists.txt
index 328db89b0280e5df15f9d262d58ce67b354dfb32,7631b24f7cd9855be48c449ac90cd72b2a4f97fc..bf370436f39f09be2a78154946352b107c84b03e
@@@ -61,6 -61,13 +61,13 @@@ set(CMAKE_BUILD_TYPE_INIT "Release"
  # quiet output for Makefiles, 'make -s' helps too
  # set_property(GLOBAL PROPERTY RULE_MESSAGES OFF)
  
+ # global compile definitions since add_definitions() adds for all.
+ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG           DEBUG _DEBUG)
+ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELEASE         NDEBUG)
+ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_MINSIZEREL      NDEBUG)
+ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELWITHDEBINFO  DEBUG _DEBUG)
  #-----------------------------------------------------------------------------
  # Set policy
  
@@@ -122,7 -129,7 +129,7 @@@ option(WITH_BUILDINFO     "Include extr
  option(WITH_IK_ITASC      "Enable ITASC IK solver (only disable for development & for incompatible C++ compilers)" ON)
  option(WITH_FFTW3         "Enable FFTW3 support (Used for smoke and audio effects)" OFF)
  option(WITH_BULLET        "Enable Bullet (Physics Engine)" ON)
 -option(WITH_GAMEENGINE    "Enable Game Engine" ON)
 +option(WITH_GAMEENGINE    "Enable Game Engine" OFF)  # DISABLE FOR BMESH UNTIL NAVMESH IS WORKING
  option(WITH_PLAYER        "Build Player" OFF)
  
  # GHOST Windowing Library Options
@@@ -148,7 -155,7 +155,7 @@@ else(
  endif()
  
  if(UNIX AND NOT APPLE)
-       option(WITH_X11_XINPUT "Enable X11 Xinput (tablet support)"     ON)
+       option(WITH_X11_XINPUT "Enable X11 Xinput (tablet support and unicode input)"   ON)
        option(WITH_BUILTIN_GLEW "Use GLEW OpenGL wrapper library bundled with blender" ON)
  else()
        # not an option for other OS's
@@@ -503,8 -510,8 +510,8 @@@ if(UNIX AND NOT APPLE
  
        set(PLATFORM_LINKFLAGS "-pthread")
  
-       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE")
-       set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE")
+       # lfs on glibc, all compilers should use
+       add_definitions(-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE)
  
        # GNU Compiler
        if(CMAKE_COMPILER_IS_GNUCC)
@@@ -612,21 -619,21 +619,21 @@@ elseif(WIN32
                set(CMAKE_C_FLAGS   "/nologo /J /W0 /Gd /wd4018 /wd4244 /wd4305 /wd4800 /wd4065 /wd4267 /we4013 /EHsc" CACHE STRING "MSVC MT C++ flags " FORCE)
  
                if(CMAKE_CL_64)
-                       set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE)
+                       set(CMAKE_CXX_FLAGS_DEBUG "/Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE)
                else()
-                       set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE)
+                       set(CMAKE_CXX_FLAGS_DEBUG "/Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE)
                endif()
-               set(CMAKE_CXX_FLAGS_RELEASE "/O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE)
-               set(CMAKE_CXX_FLAGS_MINSIZEREL "/O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE)
-               set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE)
+               set(CMAKE_CXX_FLAGS_RELEASE "/O2 /Ob2 /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE)
+               set(CMAKE_CXX_FLAGS_MINSIZEREL "/O1 /Ob1 /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE)
+               set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/O2 /Ob1 /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE)
                if(CMAKE_CL_64)
-                       set(CMAKE_C_FLAGS_DEBUG "/D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE)
+                       set(CMAKE_C_FLAGS_DEBUG "/Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE)
                else()
-                       set(CMAKE_C_FLAGS_DEBUG "/D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE)
+                       set(CMAKE_C_FLAGS_DEBUG "/Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE)
                endif()
-               set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE)
-               set(CMAKE_C_FLAGS_MINSIZEREL "/O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE)
-               set(CMAKE_C_FLAGS_RELWITHDEBINFO "/O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE)
+               set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE)
+               set(CMAKE_C_FLAGS_MINSIZEREL "/O1 /Ob1 /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE)
+               set(CMAKE_C_FLAGS_RELWITHDEBINFO "/O2 /Ob1 /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE)
  
                if(WITH_INTERNATIONAL)
                        set(GETTEXT ${LIBDIR}/gettext)
  
                add_definitions(-DFREE_WINDOWS)
  
-               set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG")
-               set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
                if(WITH_INTERNATIONAL)
                        set(GETTEXT ${LIBDIR}/gcc/gettext)
                        set(GETTEXT_INCLUDE_DIRS ${GETTEXT}/include)
@@@ -1217,21 -1221,6 +1221,6 @@@ endif(
  #-----------------------------------------------------------------------------
  # Extra compile flags
  
- if((NOT WIN32) AND (NOT MSVC))
-       # used for internal debug checks
-       set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
-       set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DDEBUG")
-       # assert() checks for this.
-       set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG")
-       set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -DNDEBUG")
-       set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DNDEBUG")
-       set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
-       set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
-       set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DNDEBUG")
- endif()
  if(CMAKE_COMPILER_IS_GNUCC)
  
        ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ALL -Wall)
index 83f9f014b0a6740bb4b769f82bf1160e2b55d193,1930e7223f9df28c1385fe43db1787a3e38647b4..2f2811abd7e86e6f14acc080643e8ae6bcb2f09b
  #
  # ***** END GPL LICENSE BLOCK *****
  
- if(WITH_CODEC_FFMPEG)
-       # FFMPEG gives warnigns which are hard to avoid across multiple versions.
-       remove_strict_flags()
- endif()
  set(INC 
        .
        ../avi
@@@ -39,7 -34,6 +34,7 @@@
        ../imbuf
        ../makesdna
        ../makesrna
 +      ../bmesh
        ../modifiers
        ../nodes
        ../render/extern/include
@@@ -95,7 -89,6 +90,7 @@@ set(SR
        intern/depsgraph.c
        intern/displist.c
        intern/effect.c
 +      intern/editderivedbmesh.c
        intern/fcurve.c
        intern/fluidsim.c
        intern/fmodifier.c
        intern/mesh.c
        intern/mesh_validate.c
        intern/modifier.c
 +      intern/modifiers_bmesh.c
        intern/multires.c
        intern/nla.c
        intern/node.c
        BKE_speaker.h
        BKE_subsurf.h
        BKE_suggestions.h
 +      BKE_tessmesh.h
        BKE_text.h
        BKE_texture.h
        BKE_unit.h
@@@ -308,6 -299,10 +303,10 @@@ if(WITH_CODEC_FFMPEG
                ${FFMPEG_INCLUDE_DIRS}
        )
        add_definitions(-DWITH_FFMPEG)
+       remove_strict_flags_file(
+               intern/writeffmpeg.c
+       )
  endif()
  
  if(WITH_PYTHON)
index b3a9bf98d37c011d3318c9b0962e2057e75bf113,0dac4b8cd808c251cba3d0c45d73e94942ee3b59..4fc843a394487d90f6aa58c645ef3d109cb92ab4
@@@ -115,9 -115,10 +115,10 @@@ static int search_face_cmp(const void *
  
  }
  
+ #define PRINT if(do_verbose) printf
  int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totvert, MEdge *medges, unsigned int totedge, MFace *mfaces, unsigned int totface, const short do_verbose, const short do_fixes)
  {
- #     define PRINT if(do_verbose) printf
  #     define REMOVE_EDGE_TAG(_med) { _med->v2= _med->v1; do_edge_free= 1; }
  #     define REMOVE_FACE_TAG(_mf) { _mf->v3=0; do_face_free= 1; }
  
  
        PRINT("BKE_mesh_validate: finished\n\n");
  
- #      undef PRINT
  #      undef REMOVE_EDGE_TAG
  #      undef REMOVE_FACE_TAG
  
        return (do_face_free || do_edge_free || do_edge_recalc);
  }
  
+ static int mesh_validate_customdata(CustomData *data, short do_verbose, const short do_fixes)
+ {
+       int i= 0, has_fixes= 0;
+       while(i<data->totlayer) {
+               CustomDataLayer *layer= &data->layers[i];
+               int mask= 1 << layer->type;
+               int ok= 1;
+               if((mask&CD_MASK_MESH)==0) {
+                       PRINT("CustomDataLayer type %d which isn't in CD_MASK_MESH is stored in Mehs structure\n", layer->type);
+                       if(do_fixes) {
+                               CustomData_free_layer(data, layer->type, 0, i);
+                               ok= 0;
+                               has_fixes= 1;
+                       }
+               }
+               if(ok)
+                       i++;
+       }
+       return has_fixes;
+ }
+ #undef PRINT
+ int BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata, CustomData *fdata, short do_verbose, const short do_fixes)
+ {
+       int vfixed= 0, efixed= 0, ffixed= 0;
+       vfixed= mesh_validate_customdata(vdata, do_verbose, do_fixes);
+       efixed= mesh_validate_customdata(edata, do_verbose, do_fixes);
+       ffixed= mesh_validate_customdata(fdata, do_verbose, do_fixes);
+       return vfixed || efixed || ffixed;
+ }
  int BKE_mesh_validate(Mesh *me, int do_verbose)
  {
+       int layers_fixed= 0, arrays_fixed= 0;
        if(do_verbose) {
                printf("MESH: %s\n", me->id.name+2);
        }
-       return BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, do_verbose, TRUE);
+       layers_fixed= BKE_mesh_validate_all_customdata(&me->vdata, &me->edata, &me->fdata, do_verbose, TRUE);
+       arrays_fixed= BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, do_verbose, TRUE);
+       return layers_fixed || arrays_fixed;
  }
  
  int BKE_mesh_validate_dm(DerivedMesh *dm)
  {
 -      return BKE_mesh_validate_arrays(NULL, dm->getVertArray(dm), dm->getNumVerts(dm), dm->getEdgeArray(dm), dm->getNumEdges(dm), dm->getFaceArray(dm), dm->getNumFaces(dm), TRUE, FALSE);
 +      return BKE_mesh_validate_arrays(NULL, dm->getVertArray(dm), dm->getNumVerts(dm), dm->getEdgeArray(dm), dm->getNumEdges(dm), dm->getTessFaceArray(dm), dm->getNumTessFaces(dm), TRUE, FALSE);
  }
  
  void BKE_mesh_calc_edges(Mesh *mesh, int update)
        MEdge *med, *med_orig;
        EdgeHash *eh = BLI_edgehash_new();
        int i, totedge, totface = mesh->totface;
 +      int med_index;
  
        if(mesh->totedge==0)
                update= 0;
                        BLI_edgehash_insert(eh, med->v1, med->v2, med);
        }
  
 -      for (i = 0; i < totface; i++, mf++) {
 -              if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
 -                      BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
 -              if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
 -                      BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL);
 -
 -              if (mf->v4) {
 -                      if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4))
 -                              BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL);
 -                      if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1))
 -                              BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL);
 -              } else {
 -                      if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1))
 -                              BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL);
 +      if(mesh->totpoly) {
 +              /* mesh loops (bmesh only) */
 +              MPoly *mp= mesh->mpoly;
 +              for(i=0; i < mesh->totpoly; i++, mp++) {
 +                      MLoop *l= &mesh->mloop[mp->loopstart];
 +                      int j, l_prev= (l + (mp->totloop-1))->v;
 +                      for (j=0; j < mp->totloop; j++, l++) {
 +                              if (!BLI_edgehash_haskey(eh, l_prev, l->v)) {
 +                                      BLI_edgehash_insert(eh, l_prev, l->v, NULL);
 +                              }
 +                              l_prev= l->v;
 +                      }
 +              }
 +      }
 +      else {
 +              /* regular faces (note, we could remove this for bmesh - campbell) */
 +              for (i = 0; i < totface; i++, mf++) {
 +                      if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
 +                              BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
 +                      if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
 +                              BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL);
 +
 +                      if (mf->v4) {
 +                              if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4))
 +                                      BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL);
 +                              if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1))
 +                                      BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL);
 +                      } else {
 +                              if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1))
 +                                      BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL);
 +                      }
                }
        }
  
                        BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
                        med->flag = ME_EDGEDRAW|ME_EDGERENDER|SELECT; /* select for newly created meshes which are selected [#25595] */
                }
 +
 +              /* store the new edge index in the hash value */
 +              BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(i));
        }
        BLI_edgehashIterator_free(ehi);
  
 +      if (mesh->totpoly) {
 +              /* second pass, iterate through all loops again and assign
 +                 the newly created edges to them. */
 +              MPoly *mp= mesh->mpoly;
 +              for(i=0; i < mesh->totpoly; i++, mp++) {
 +                      MLoop *l= &mesh->mloop[mp->loopstart];
 +                      MLoop *l_prev= (l + (mp->totloop-1));
 +                      int j;
 +                      for (j=0; j < mp->totloop; j++, l++) {
 +                              /* lookup hashed edge index */
 +                              med_index = GET_INT_FROM_POINTER(BLI_edgehash_lookup(eh, l_prev->v, l->v));
 +                              l_prev->e = med_index;
 +                              l_prev= l;
 +                      }
 +              }
 +      }
 +
        /* free old CustomData and assign new one */
        CustomData_free(&mesh->edata, mesh->totedge);
        mesh->edata = edata;
index ec114fbfcde16dbbc4dc452eba958fd9dde8558b,670943afdd3374c8b879de25863f9505eea9b0ef..91088e35405cca73b4627515802b5d30789bdab4
@@@ -32,7 -32,6 +32,7 @@@
  
  #include "MEM_guardedalloc.h"
  
 +#include "BLI_utildefines.h"
  #include "BLI_blenlib.h"
  #include "BLI_math.h"
  #include "BLI_edgehash.h"
@@@ -45,7 -44,6 +45,7 @@@
  #include "DNA_scene_types.h"
  #include "DNA_screen_types.h"
  #include "DNA_view3d_types.h"
 +#include "DNA_windowmanager_types.h"
  #include "DNA_object_types.h"
  
  #include "BKE_DerivedMesh.h"
@@@ -54,7 -52,6 +54,7 @@@
  #include "BKE_material.h"
  #include "BKE_paint.h"
  #include "BKE_property.h"
 +#include "BKE_tessmesh.h"
  
  #include "BIF_gl.h"
  #include "BIF_glutil.h"
@@@ -227,7 -224,7 +227,7 @@@ static int set_draw_settings_cached(in
        static int c_lit;
  
        Object *litob = NULL; //to get mode to turn off mipmap in painting mode
-       int backculled = 0;
+       int backculled = GEMAT_BACKCULL;
        int alphablend = 0;
        int textured = 0;
        int lit = 0;
@@@ -421,15 -418,15 +421,15 @@@ static int draw_tface__set_draw(MTFace 
  static void add_tface_color_layer(DerivedMesh *dm)
  {
        MTFace *tface = DM_get_face_data_layer(dm, CD_MTFACE);
 -      MFace *mface = DM_get_face_data_layer(dm, CD_MFACE);
 +      MFace *mface = dm->getTessFaceArray(dm);
        MCol *finalCol;
        int i,j;
 -      MCol *mcol = dm->getFaceDataArray(dm, CD_WEIGHT_MCOL);
 +      MCol *mcol = dm->getTessFaceDataArray(dm, CD_WEIGHT_MCOL);
        if(!mcol)
 -              mcol = dm->getFaceDataArray(dm, CD_MCOL);
 +              mcol = dm->getTessFaceDataArray(dm, CD_MCOL);
  
 -      finalCol = MEM_mallocN(sizeof(MCol)*4*dm->getNumFaces(dm),"add_tface_color_layer");
 -      for(i=0;i<dm->getNumFaces(dm);i++) {
 +      finalCol = MEM_mallocN(sizeof(MCol)*4*dm->getNumTessFaces(dm),"add_tface_color_layer");
 +      for(i=0;i<dm->getNumTessFaces(dm);i++) {
                Material *ma= give_current_material(Gtexdraw.ob, mface[i].mat_nr+1);
  
                if (ma && (ma->game.flag&GEMAT_INVISIBLE)) {
  static int draw_tface_mapped__set_draw(void *userData, int index)
  {
        Mesh *me = (Mesh*)userData;
 -      MTFace *tface = (me->mtface)? &me->mtface[index]: NULL;
 -      MFace *mface = &me->mface[index];
 -      const int matnr = mface->mat_nr;
 -      if (mface->flag & ME_HIDE) return 0;
 -      return draw_tface__set_draw(tface, (me->mcol != NULL), matnr);
 +      MTexPoly *tpoly = (me->mtpoly)? &me->mtpoly[index]: NULL;
 +      MPoly *mpoly = (me->mpoly)? &me->mpoly[index]: NULL;
 +      MTFace mtf;
 +      int matnr = me->mpoly[index].mat_nr;
 +
 +      if (mpoly && mpoly->flag&ME_HIDE) return 0;
 +
 +      memset(&mtf, 0, sizeof(mtf));
 +      if (tpoly) {
 +              mtf.flag = tpoly->flag;
 +              mtf.tpage = tpoly->tpage;
 +              mtf.transp = tpoly->transp;
 +              mtf.mode = tpoly->mode;
 +              mtf.tile = tpoly->tile;
 +              mtf.unwrap = tpoly->unwrap;
 +      }
 +
 +      return draw_tface__set_draw(&mtf, (me->mcol != NULL), matnr);
  }
  
  static int draw_em_tf_mapped__set_draw(void *userData, int index)
  {
 -      struct {EditMesh *em; short has_mcol; short has_mtface;} *data = userData;
 -      EditMesh *em = data->em;
 -      EditFace *efa= EM_get_face_for_index(index);
 -      MTFace *tface;
 -      int matnr;
 +      struct {BMEditMesh *em; short has_mcol; short has_mtface;} *data = userData;
 +      BMEditMesh *em = data->em;
 +      BMFace *efa= EDBM_get_face_for_index(em, index);
  
 -      if (efa->h)
 +      if (efa==NULL || BM_TestHFlag(efa, BM_HIDDEN)) {
                return 0;
 +      }
 +      else {
 +              MTFace mtf= {{{0}}};
 +              int matnr = efa->mat_nr;
 +
 +              if (data->has_mtface) {
 +                      MTexPoly *tpoly = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
 +                      mtf.flag = tpoly->flag;
 +                      mtf.tpage = tpoly->tpage;
 +                      mtf.transp = tpoly->transp;
 +                      mtf.mode = tpoly->mode;
 +                      mtf.tile = tpoly->tile;
 +                      mtf.unwrap = tpoly->unwrap;
  
 -      tface = data->has_mtface ? CustomData_em_get(&em->fdata, efa->data, CD_MTFACE) : NULL;
 -      matnr = efa->mat_nr;
 +              }
  
 -      return draw_tface__set_draw_legacy(tface, data->has_mcol, matnr);
 +              return draw_tface__set_draw_legacy(&mtf, data->has_mcol, matnr);
 +      }
  }
  
  static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r)
@@@ -660,11 -633,11 +660,11 @@@ void draw_mesh_textured(Scene *scene, V
        glColor4f(1.0f,1.0f,1.0f,1.0f);
  
        if(ob->mode & OB_MODE_EDIT) {
 -              struct {EditMesh *em; short has_mcol; short has_mtface;} data;
 +              struct {BMEditMesh *em; short has_mcol; short has_mtface;} data;
  
 -              data.em= me->edit_mesh;
 -              data.has_mcol= CustomData_has_layer(&me->edit_mesh->fdata, CD_MCOL);
 -              data.has_mtface= CustomData_has_layer(&me->edit_mesh->fdata, CD_MTFACE);
 +              data.em= me->edit_btmesh;
 +              data.has_mcol= CustomData_has_layer(&me->edit_btmesh->bm->ldata, CD_MLOOPCOL);
 +              data.has_mtface= CustomData_has_layer(&me->edit_btmesh->bm->pdata, CD_MTEXPOLY);
  
                dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, &data);
        }
index 8442045b91f4c9de8928fb2a142d133b2a4ad84f,701ad244fc12e3bd899b4100398b70025a1846e6..963f521c7814c4cfb5fa9760f2cedb4bab96d3ca
@@@ -100,7 -100,6 +100,7 @@@ endif(
                bf_intern_string 
                bf_intern_ghost
                bf_rna
 +              bf_bmesh
                bf_blenkernel
                bf_blenloader 
                bf_blenpluginapi 
                bf_blenfont
                bf_intern_audaspace
                blenkernel_blc
 +              bf_bmesh
                extern_binreloc
                extern_minilzo
                bf_intern_ghost # duplicate for linking
                list(APPEND BLENDER_SORTED_LIBS extern_lzma)
        endif()
  
+       list(APPEND BLENDER_SORTED_LIBS extern_colamd)
        if(WITH_MOD_DECIMATE)
                list(APPEND BLENDER_SORTED_LIBS bf_intern_decimate)
        endif()
index 217135360da881831c2442038a6fd0f1a1495dd0,867ea37e0a15535ee71481ed4b83019cdd327d99..1be424d93aafbe6325c59f5f61087da8e9c3e0f7
@@@ -784,7 -784,6 +784,7 @@@ endif(
                bf_python_ext
                bf_python_mathutils
                bf_ikplugin
 +              bf_bmesh
                bf_modifiers
                bf_blenkernel
                bf_nodes
                bf_intern_smoke
                extern_minilzo
                extern_lzma
+               extern_colamd
                ge_logic_ketsji
                extern_recastnavigation
                ge_phys_common