svn merge ^/trunk/blender -r42757:42759
authorCampbell Barton <ideasman42@gmail.com>
Tue, 20 Dec 2011 10:59:56 +0000 (10:59 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 20 Dec 2011 10:59:56 +0000 (10:59 +0000)
1  2 
source/blender/editors/space_view3d/drawmesh.c
source/blender/editors/space_view3d/drawobject.c

  
  #include "view3d_intern.h"    // own include
  
 -      EditMesh *em;
+ /* user data structures for derived mesh callbacks */
+ typedef struct drawMeshFaceSelect_userData {
+       Mesh *me;
+       EdgeHash *eh;
+ } drawMeshFaceSelect_userData;
+ typedef struct drawEMTFMapped_userData {
++      BMEditMesh *em;
+       short has_mcol;
+       short has_mtface;
+       MFace *mf;
+       MTFace *tf;
+ } drawEMTFMapped_userData;
+ typedef struct drawTFace_userData {
+       MFace *mf;
+       MTFace *tf;
+ } drawTFace_userData;
  /**************************** Face Select Mode *******************************/
  
  /* Flags for marked edges */
@@@ -531,30 -532,19 +550,30 @@@ static int draw_tface_mapped__set_draw(
  
  static int draw_em_tf_mapped__set_draw(void *userData, int index)
  {
-       struct {BMEditMesh *em; short has_mcol; short has_mtface; MFace *mf; MTFace *tf;} *data = userData;
+       drawEMTFMapped_userData *data = userData;
 -      EditMesh *em = data->em;
 -      EditFace *efa= EM_get_face_for_index(index);
 -      MTFace *tface;
 -      int matnr;
 +      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)
@@@ -698,13 -688,13 +717,13 @@@ void draw_mesh_textured_old(Scene *scen
        glColor4f(1.0f,1.0f,1.0f,1.0f);
  
        if(ob->mode & OB_MODE_EDIT) {
-               struct {BMEditMesh *em; short has_mcol; short has_mtface; MFace *mf; MTFace *tf;} data;
+               drawEMTFMapped_userData 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.mf= DM_get_face_data_layer(dm, CD_MFACE);
 -              data.tf= DM_get_face_data_layer(dm, 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);
 +              data.mf= DM_get_tessface_data_layer(dm, CD_MFACE);
 +              data.tf= DM_get_tessface_data_layer(dm, CD_MTFACE);
  
                dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, compareDrawOptionsEm, &data);
        }
@@@ -121,6 -118,48 +121,56 @@@ typedef enum eWireDrawMode 
        OBDRAW_WIRE_ON_DEPTH= 2
  } eWireDrawMode;
  
 -      void (*func)(void *userData, EditVert *eve, int x, int y, int index);
+ /* user data structures for derived mesh callbacks */
+ typedef struct foreachScreenVert_userData {
 -      void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index);
++      void (*func)(void *userData, BMVert *eve, int x, int y, int index);
+       void *userData;
+       ViewContext vc;
+       eV3DClipTest clipVerts;
+ } foreachScreenVert_userData;
+ typedef struct foreachScreenEdge_userData {
 -      void (*func)(void *userData, EditFace *efa, int x, int y, int index);
++      void (*func)(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int index);
+       void *userData;
+       ViewContext vc;
+       eV3DClipTest clipVerts;
+ } foreachScreenEdge_userData;
+ typedef struct foreachScreenFace_userData {
 -      EditVert *eve_act;
++      void (*func)(void *userData, BMFace *efa, int x, int y, int index);
+       void *userData;
+       ViewContext vc;
+ } foreachScreenFace_userData;
+ typedef struct drawDMVerts_userData {
++      BMEditMesh *em; /* BMESH BRANCH ONLY */
++
+       int sel;
 -      EditEdge *eed_act;
++      BMVert *eve_act;
+ } drawDMVerts_userData;
+ typedef struct drawDMEdgesSel_userData {
++      BMEditMesh *em; /* BMESH BRANCH ONLY */
++
+       unsigned char *baseCol, *selCol, *actCol;
 -      EditFace *efa_act;
++      BMEdge *eed_act;
+ } drawDMEdgesSel_userData;
+ typedef struct drawDMFacesSel_userData {
+       unsigned char *cols[3];
++
++      DerivedMesh *dm; /* BMESH BRANCH ONLY */
++      BMEditMesh *em;  /* BMESH BRANCH ONLY */
++
++      BMFace *efa_act;
+       int *orig_index;
+ } drawDMFacesSel_userData;
+ typedef struct bbsObmodeMeshVerts_userData {
+       void *offset;
+       MVert *mvert;
+ } bbsObmodeMeshVerts_userData;
  static void draw_bounding_volume(Scene *scene, Object *ob, char type);
  
  static void drawcube_size(float size);
@@@ -1917,11 -1956,10 +1967,10 @@@ static void drawlattice(Scene *scene, V
   * use the object matrix in the useual way */
  static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
  {
-       struct { void (*func)(void *userData, BMVert *eve, int x, int y, int index);
-                void *userData; ViewContext vc; eV3DClipTest clipVerts; float pmat[4][4], vmat[4][4]; } *data = userData;
+       foreachScreenVert_userData *data = userData;
 -      EditVert *eve = EM_get_vert_for_index(index);
 +      BMVert *eve = EDBM_get_vert_for_index(data->vc.em, index);
  
 -      if (eve->h==0) {
 +      if (!BM_TestHFlag(eve, BM_HIDDEN)) {
                short s[2]= {IS_CLIPPED, 0};
  
                if (data->clipVerts != V3D_CLIP_TEST_OFF) {
  
  void mesh_foreachScreenVert(
          ViewContext *vc,
 -        void (*func)(void *userData, EditVert *eve, int x, int y, int index),
 +        void (*func)(void *userData, BMVert *eve, int x, int y, int index),
          void *userData, eV3DClipTest clipVerts)
  {
-       struct { void (*func)(void *userData, BMVert *eve, int x, int y, int index);
-                void *userData; ViewContext vc; eV3DClipTest clipVerts; float pmat[4][4], vmat[4][4]; } data;
+       foreachScreenVert_userData data;
 -      DerivedMesh *dm = editmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
 +      DerivedMesh *dm = editbmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
        
        data.vc= *vc;
        data.func = func;
@@@ -1997,13 -2032,11 +2045,12 @@@ static int is_co_in_region(ARegion *ar
  }
  static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0co, float *v1co)
  {
-       struct { void (*func)(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int index);
-                void *userData; ViewContext vc; eV3DClipTest clipVerts; float pmat[4][4], vmat[4][4]; } *data = userData;
+       foreachScreenEdge_userData *data = userData;
 -      EditEdge *eed = EM_get_edge_for_index(index);
 -      short s[2][2];
 +      BMEdge *eed = EDBM_get_edge_for_index(data->vc.em, index);
 +
 +      if (!BM_TestHFlag(eed, BM_HIDDEN)) {
 +              short s[2][2];
  
 -      if (eed->h==0) {
                if (data->clipVerts == V3D_CLIP_TEST_RV3D_CLIPPING) {
                        view3d_project_short_clip(data->vc.ar, v0co, s[0], 1);
                        view3d_project_short_clip(data->vc.ar, v1co, s[1], 1);
  
  void mesh_foreachScreenEdge(
          ViewContext *vc,
 -        void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index),
 +        void (*func)(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int index),
          void *userData, eV3DClipTest clipVerts)
  {
-       struct { void (*func)(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int index);
-                void *userData; ViewContext vc; int clipVerts; float pmat[4][4], vmat[4][4]; } data;
+       foreachScreenEdge_userData data;
 -      DerivedMesh *dm = editmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
 +      DerivedMesh *dm = editbmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
  
        data.vc= *vc;
        data.func = func;
  
  static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *cent, float *UNUSED(no))
  {
-       struct { void (*func)(void *userData, BMFace *efa, int x, int y, int index); void *userData; ViewContext vc; float pmat[4][4], vmat[4][4]; } *data = userData;
+       foreachScreenFace_userData *data = userData;
 -      EditFace *efa = EM_get_face_for_index(index);
 -      short s[2];
 +      BMFace *efa = EDBM_get_face_for_index(data->vc.em, index);
 +
 +      if (efa && !BM_TestHFlag(efa, BM_HIDDEN)) {
 +              float cent2[3];
 +              short s[2];
  
 -      if (efa && efa->h==0 && efa->fgonf!=EM_FGON) {
 -              view3d_project_short_clip(data->vc.ar, cent, s, 1);
 +              mul_v3_m4v3(cent2, data->vc.obedit->obmat, cent);
 +              project_short(data->vc.ar, cent2, s);
  
                if (s[0] != IS_CLIPPED) {
                        data->func(data->userData, efa, s[0], s[1], index);
  
  void mesh_foreachScreenFace(
          ViewContext *vc,
 -        void (*func)(void *userData, EditFace *efa, int x, int y, int index),
 +        void (*func)(void *userData, BMFace *efa, int x, int y, int index),
          void *userData)
  {
-       struct { void (*func)(void *userData, BMFace *efa, int x, int y, int index); void *userData; ViewContext vc; float pmat[4][4], vmat[4][4]; } data;
+       foreachScreenFace_userData data;
 -      DerivedMesh *dm = editmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
 +      DerivedMesh *dm = editbmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
  
        data.vc= *vc;
        data.func = func;
@@@ -2228,13 -2243,13 +2274,13 @@@ static void draw_dm_vert_normals(BMEdit
        glEnd();
  }
  
 -      /* Draw verts with color set based on selection */
 +/* Draw verts with color set based on selection */
  static void draw_dm_verts__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
  {
-       struct { BMEditMesh *em; int sel; BMVert *eve_act; } *data = userData;
+       drawDMVerts_userData * data = userData;
 -      EditVert *eve = EM_get_vert_for_index(index);
 +      BMVert *eve = EDBM_get_vert_for_index(data->em, index);
  
 -      if (eve->h==0 && (eve->f&SELECT)==data->sel) {
 +      if (!BM_TestHFlag(eve, BM_HIDDEN) && BM_TestHFlag(eve, BM_SELECT)==data->sel) {
                /* draw active larger - need to stop/start point drawing for this :/ */
                if (eve==data->eve_act) {
                        float size = UI_GetThemeValuef(TH_VERTEX_SIZE);
        }
  }
  
 -static void draw_dm_verts(DerivedMesh *dm, int sel, EditVert *eve_act)
 +static void draw_dm_verts(BMEditMesh *em, DerivedMesh *dm, int sel, BMVert *eve_act)
  {
-       struct { BMEditMesh *em; int sel; BMVert *eve_act; } data;
+       drawDMVerts_userData data;
        data.sel = sel;
        data.eve_act = eve_act;
 +      data.em = em;
  
        bglBegin(GL_POINTS);
        dm->foreachMappedVert(dm, draw_dm_verts__mapFunc, &data);
        /* Draw edges with color set based on selection */
  static int draw_dm_edges_sel__setDrawOptions(void *userData, int index)
  {
 -      EditEdge *eed = EM_get_edge_for_index(index);
 +      BMEdge *eed;
        //unsigned char **cols = userData, *col;
-       struct { BMEditMesh *em; unsigned char *baseCol, *selCol, *actCol; BMEdge *eed_act; } * data = userData;
+       drawDMEdgesSel_userData * data = userData;
        unsigned char *col;
  
 -      if (eed->h==0) {
 +      eed = EDBM_get_edge_for_index(data->em, index);
 +
 +      if (!BM_TestHFlag(eed, BM_HIDDEN)) {
                if (eed==data->eed_act) {
                        glColor4ubv(data->actCol);
                } else {
                return 0;
        }
  }
 -static void draw_dm_edges_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol, unsigned char *actCol, EditEdge *eed_act) 
 +static void draw_dm_edges_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *baseCol, 
 +                            unsigned char *selCol, unsigned char *actCol, BMEdge *eed_act) 
  {
-       struct { BMEditMesh *em; unsigned char *baseCol, *selCol, *actCol; BMEdge *eed_act; } data;
+       drawDMEdgesSel_userData data;
        
        data.baseCol = baseCol;
        data.selCol = selCol;
@@@ -2375,14 -2385,11 +2421,14 @@@ static void draw_dm_edges_sharp(BMEditM
         * return 2 for the active face so it renders with stipple enabled */
  static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *UNUSED(drawSmooth_r))
  {
-       struct { DerivedMesh *dm; unsigned char *cols[3]; BMEditMesh *em; BMFace *efa_act; int *orig_index;} *data = userData;
+       drawDMFacesSel_userData * data = userData;
 -      EditFace *efa = EM_get_face_for_index(index);
 +      BMFace *efa = EDBM_get_face_for_index(data->em, index);
        unsigned char *col;
        
 -      if (efa->h==0) {
 +      if (!efa)
 +              return 0;
 +      
 +      if (!BM_TestHFlag(efa, BM_HIDDEN)) {
                if (efa == data->efa_act) {
                        glColor4ubv(data->cols[2]);
                        return 2; /* stipple */
  
  static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int next_index)
  {
-       struct { DerivedMesh *dm; unsigned char *cols[3]; BMEditMesh *em; BMFace *efa_act; int *orig_index; } * data = userData;
 +
 -      EditFace *efa;
 -      EditFace *next_efa;
+       drawDMFacesSel_userData *data = userData;
 +      BMFace *efa;
 +      BMFace *next_efa;
 +
        unsigned char *col, *next_col;
  
        if(!data->orig_index)
  }
  
  /* also draws the active face */
 -static void draw_dm_faces_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol, unsigned char *actCol, EditFace *efa_act) 
 +static void draw_dm_faces_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *baseCol, 
 +                            unsigned char *selCol, unsigned char *actCol, BMFace *efa_act)
  {
-       struct { DerivedMesh *dm; unsigned char *cols[3]; BMEditMesh *em; BMFace *efa_act; int *orig_index; } data;
+       drawDMFacesSel_userData data;
 +      data.dm= dm;
        data.cols[0] = baseCol;
 +      data.em = em;
        data.cols[1] = selCol;
        data.cols[2] = actCol;
        data.efa_act = efa_act;