* Changing images in the UV view didnt work properly - reported as bug 7467 (own...
authorCampbell Barton <ideasman42@gmail.com>
Wed, 24 Oct 2007 18:58:26 +0000 (18:58 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 24 Oct 2007 18:58:26 +0000 (18:58 +0000)
* when setting the face, images with alpha's will set the texface's alpha option.
* added a draw even to redraw view3d and uv/image view - so the Draw Faces button redraws properly.
* made a macro for checking if the object will draw with textures
* textured meshes in editmode only draw a selected face overlay (otherwise the entire mesh would get a plue tint wich isnt
nice for viewing textures), the selected highlight is still there, this is how Face/UV mode looked.
* Alpha clipping STILL had a case where it wasnt disabled and the interface had its alpha clipped, this should be fixed now.

source/blender/include/mydevice.h
source/blender/makesdna/DNA_object_types.h
source/blender/src/buttons_editing.c
source/blender/src/drawimage.c
source/blender/src/drawmesh.c
source/blender/src/drawobject.c
source/blender/src/editmesh_mods.c
source/blender/src/space.c

index 02e7404584b6c20867d782349285b731e0ccc756..bec0e13726b0f5cbf11f491b779e138119ff695f 100644 (file)
 #define REDRAWNODE                     0x4038
 #define RECALC_COMPOSITE       0x4039
 #define REDRAWMARKER           0x4040 /* all views that display markers */
-
+#define REDRAWVIEW3D_IMAGE     0x4041
 
 #endif /* !__MYDEVICE_H__ */
 
index 25322fbe4777442808a792e32303cb529f80fe4f..cb4aa42a8478075dde475c07e3ec10283259ef64 100644 (file)
@@ -308,6 +308,9 @@ extern Object workob;
 #define OB_SHADED              4
 #define OB_TEXTURE             5
 
+/* this condition has been made more complex since editmode can draw textures */
+#define CHECK_OB_DRAWTEXTURE(vd, dt)   ((vd->drawtype==OB_TEXTURE && dt>OB_SOLID) || (vd->drawtype==OB_SOLID && vd->flag2 & V3D_SOLID_TEX))
+
 /* dtx: flags, char! */
 #define OB_AXIS                        2
 #define OB_TEXSPACE            4
index f779d4948951b87965465bf0d296ff85ac862407..7d0a920a8d06f7487963a955538d838fce2c980e 100644 (file)
@@ -4381,7 +4381,7 @@ static void editing_panel_mesh_tools1(Object *ob, Mesh *me)
        uiBlockEndAlign(block);
        
        uiBlockBeginAlign(block);
-       uiDefButBitI(block, TOG, G_DRAWFACES, REDRAWVIEW3D|REDRAWIMAGE, "Draw Faces",           955,88,150,19, &G.f, 0, 0, 0, 0, "Displays all faces as shades");
+       uiDefButBitI(block, TOG, G_DRAWFACES, REDRAWVIEW3D_IMAGE, "Draw Faces",         955,88,150,19, &G.f, 0, 0, 0, 0, "Displays all faces as shades in the 3d view and UV editor");
        uiDefButBitI(block, TOG, G_DRAWEDGES, REDRAWVIEW3D, "Draw Edges",       955,66,150,19, &G.f, 0, 0, 0, 0, "Displays selected edges using hilights");
        uiDefButBitI(block, TOG, G_DRAWCREASES, REDRAWVIEW3D, "Draw Creases",   955,44,150,19, &G.f, 0, 0, 0, 0, "Displays creases created for subsurf weighting");
        uiDefButBitI(block, TOG, G_DRAWSEAMS, REDRAWVIEW3D, "Draw Seams",       955,22,150,19, &G.f, 0, 0, 0, 0, "Displays UV unwrapping seams");
@@ -5321,9 +5321,9 @@ static void editing_panel_mesh_texface(void)
 
                uiBlockBeginAlign(block);
                uiBlockSetCol(block, TH_BUT_SETTING1);
-               uiDefButC(block, ROW, REDRAWVIEW3D, "Opaque",   600,80,60,19, &tf->transp, 2.0, 0.0, 0, 0, "Render color of textured face as color");
-               uiDefButC(block, ROW, REDRAWVIEW3D, "Add",              660,80,60,19, &tf->transp, 2.0, 1.0, 0, 0, "Render face transparent and add color of face");
-               uiDefButC(block, ROW, REDRAWVIEW3D, "Alpha",    720,80,60,19, &tf->transp, 2.0, 2.0, 0, 0, "Render polygon transparent, depending on alpha channel of the texture");
+               uiDefButC(block, ROW, REDRAWVIEW3D, "Opaque",   600,80,60,19, &tf->transp, 2.0, (float)TF_SOLID,0, 0, "Render color of textured face as color");
+               uiDefButC(block, ROW, REDRAWVIEW3D, "Add",              660,80,60,19, &tf->transp, 2.0, (float)TF_ADD,  0, 0, "Render face transparent and add color of face");
+               uiDefButC(block, ROW, REDRAWVIEW3D, "Alpha",    720,80,60,19, &tf->transp, 2.0, (float)TF_ALPHA,0, 0, "Render polygon transparent, depending on alpha channel of the texture");
        }
 }
 
index c9d6b8a649b936c428e221c9132f0b953c2cfbef..859b8fd0bdee10d70ad8752a5b7025a5c1fbb00d 100644 (file)
@@ -96,6 +96,7 @@
 #include "BIF_screen.h"
 #include "BIF_toolbox.h"
 #include "BIF_transform.h"
+#include "BIF_editmesh.h"
 
 #include "BSE_drawipo.h"
 #include "BSE_drawview.h"
@@ -243,31 +244,33 @@ void calc_image_view(SpaceImage *sima, char mode)
 void what_image(SpaceImage *sima)
 {
        MTFace *activetf;
-               
+       
        if(             (sima->mode!=SI_TEXTURE) ||
                        (sima->image && sima->image->source==IMA_SRC_VIEWER) ||
-                       (G.obedit != OBACT)
+                       (G.obedit != OBACT) ||
+                       (sima->pin)
        ) {
                return;
        }
        
-       /* viewer overrides faceselect */
-       if (!sima->pin)
+       /* viewer overrides uv editmode */
+       if (EM_texFaceCheck()) {
                sima->image= NULL;
-       
-       activetf = get_active_mtface(NULL, NULL, 1); /* partially selected face is ok */
-       
-       if(activetf && activetf->mode & TF_TEX) {
-               if (!sima->pin)
-                       sima->image= activetf->tpage;
                
-               if(sima->flag & SI_EDITTILE);
-               else sima->curtile= activetf->tile;
+               activetf = get_active_mtface(NULL, NULL, 1); /* partially selected face is ok */
                
-               if(sima->image) {
-                       if(activetf->mode & TF_TILES)
-                               sima->image->tpageflag |= IMA_TILES;
-                       else sima->image->tpageflag &= ~IMA_TILES;
+               if(activetf && activetf->mode & TF_TEX) {
+                       if (!sima->pin)
+                               sima->image= activetf->tpage;
+                       
+                       if(sima->flag & SI_EDITTILE);
+                       else sima->curtile= activetf->tile;
+                       
+                       if(sima->image) {
+                               if(activetf->mode & TF_TILES)
+                                       sima->image->tpageflag |= IMA_TILES;
+                               else sima->image->tpageflag &= ~IMA_TILES;
+                       }
                }
        }
 }
@@ -293,32 +296,45 @@ void image_changed(SpaceImage *sima, Image *image)
        MTFace *tface;
        EditMesh *em = G.editMesh;
        EditFace *efa;
-
-       if(image==NULL)
+       ImBuf *ibuf = NULL;
+       short change = 0;
+       
+       if(image==NULL) {
                sima->flag &= ~SI_DRAWTOOL;
+       } else {
+               ibuf = BKE_image_get_ibuf(image, NULL);
+       }
        
-       if(sima->mode!=SI_TEXTURE || !EM_texFaceCheck())
+       if(sima->mode!=SI_TEXTURE)
                return;
-               
+       
        /* skip assigning these procedural images... */
-       if(image && (image->type==IMA_TYPE_R_RESULT || image->type==IMA_TYPE_COMPOSITE))
+       if(image && (image->type==IMA_TYPE_R_RESULT || image->type==IMA_TYPE_COMPOSITE)) {;
                return;
-
-       for (efa= em->faces.first; efa; efa= efa->next) {
-               tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-               if (efa->h==0 && efa->f & SELECT) {
-                       if (image) {
-                               tface->tpage= image;
-                               tface->mode |= TF_TEX;
-                               
-                               if(image->tpageflag & IMA_TILES) tface->mode |= TF_TILES;
-                               else tface->mode &= ~TF_TILES;
-                               
-                               if(image->id.us==0) id_us_plus(&image->id);
-                               else id_lib_extern(&image->id);
-                       } else {
-                               tface->tpage= NULL;
-                               tface->mode &= ~TF_TEX;
+       } else if (EM_texFaceCheck()) {
+               for (efa= em->faces.first; efa; efa= efa->next) {
+                       tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+                       if (efa->h==0 && efa->f & SELECT) {
+                               if (image) {
+                                       tface->tpage= image;
+                                       tface->mode |= TF_TEX;
+                                       
+                                       if(image->tpageflag & IMA_TILES) tface->mode |= TF_TILES;
+                                       else tface->mode &= ~TF_TILES;
+                                       
+                                       if(image->id.us==0) id_us_plus(&image->id);
+                                       else id_lib_extern(&image->id);
+                                       
+                                       if (tface->transp==TF_ADD) {} /* they obviously know what they are doing! - leave as is */
+                                       else if (ibuf && ibuf->depth == 32)     tface->transp = TF_ALPHA;
+                                       else                                                            tface->transp = TF_SOLID;
+                                       
+                               } else {
+                                       tface->tpage= NULL;
+                                       tface->mode &= ~TF_TEX;
+                                       tface->transp = TF_SOLID;
+                               }
+                               change = 1;
                        }
                }
        }
@@ -326,7 +342,9 @@ void image_changed(SpaceImage *sima, Image *image)
         * to check if the face is displayed in UV-localview */
        sima->image = image;
        
-       object_uvs_changed(OBACT);
+       if (change)
+               object_uvs_changed(OBACT);
+       
        allqueue(REDRAWBUTSEDIT, 0);
 }
 /*
index 36bad20d9f9af55afd8089fc524673be9819b9a5..ba20771b17927c2ba762d6e83540b9cd57652313 100644 (file)
@@ -222,7 +222,7 @@ int set_tpage(MTFace *tface)
                glDisable(GL_TEXTURE_2D);
                glDisable(GL_TEXTURE_GEN_S);
                glDisable(GL_TEXTURE_GEN_T);
-
+               glDisable ( GL_ALPHA_TEST );
                return 0;
        }
        lasttface= tface;
@@ -744,7 +744,7 @@ static void draw_tfaces3D(Object *ob, Mesh *me, DerivedMesh *dm)
                glLineWidth(1);
        }
 
-               /* Draw Selected Faces */
+       /* Draw Selected Faces */
        if(G.f & G_DRAWFACES) {
                glEnable(GL_BLEND);
                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -960,7 +960,6 @@ static void draw_textured_begin(Object *ob)
        Gtexdraw.istex = istex;
        memcpy(Gtexdraw.obcol, obcol, sizeof(obcol));
        set_draw_settings_cached(1, 0, 0, Gtexdraw.islit, 0, 0, 0);
-       glDisable ( GL_ALPHA_TEST );
        glShadeModel(GL_SMOOTH);
 }
 
index a64a49a7268d4f921ef0240cb26ad347692f39fc..556126c7518aaf4fbff11d49f5588adb88478c83 100644 (file)
@@ -2026,9 +2026,7 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *cageDM, Derived
        EM_init_index_arrays(1, 1, 1);
 
        if(dt>OB_WIRE) {
-               if(             (G.vd->drawtype==OB_TEXTURE && dt>OB_SOLID) ||
-                               (G.vd->drawtype==OB_SOLID && G.vd->flag2 & V3D_SOLID_TEX)
-               ) {
+               if( CHECK_OB_DRAWTEXTURE(G.vd, dt) ) {
                        draw_mesh_textured(ob, finalDM, 0);
                } else {
                        glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag & ME_TWOSIDED);
@@ -2066,6 +2064,10 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *cageDM, Derived
                glEnable(GL_BLEND);
                glDepthMask(0);         // disable write in zbuffer, needed for nice transp
                
+               /* dont draw unselected faces, only selected, this is MUCH nicer when texturing */
+               if CHECK_OB_DRAWTEXTURE(G.vd, dt)
+                       col1[3] = 0;
+               
                draw_dm_faces_sel(cageDM, col1, col2, col3, efa_act);
 
                glDisable(GL_BLEND);
@@ -2089,10 +2091,7 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *cageDM, Derived
        }
 
        /* here starts all fancy draw-extra over */
-       if(             (G.f & G_DRAWEDGES)==0 &&
-                       ((G.vd->drawtype==OB_TEXTURE && dt>OB_SOLID) ||
-                       (G.vd->drawtype==OB_SOLID && G.vd->flag2 & V3D_SOLID_TEX)) 
-       ) {
+       if((G.f & G_DRAWEDGES)==0 && CHECK_OB_DRAWTEXTURE(G.vd, dt)) {
                /* we are drawing textures and 'G_DRAWEDGES' is disabled, dont draw any edges */
                
                /* only draw selected edges otherwise there is no way of telling if a face is selected */
@@ -2242,8 +2241,7 @@ static void draw_mesh_fancy(Base *base, int dt, int flag)
                draw_wire = 1;
        }
        else if(        (ob==OBACT && (G.f & G_TEXTUREPAINT || FACESEL_PAINT_TEST)) ||
-                               (G.vd->drawtype==OB_TEXTURE && dt>OB_SOLID) ||
-                               (G.vd->drawtype==OB_SOLID && G.vd->flag2 & V3D_SOLID_TEX))
+                               CHECK_OB_DRAWTEXTURE(G.vd, dt))
        {
                int faceselect= (ob==OBACT && FACESEL_PAINT_TEST);
 
index c2fc725e941a9f92d76ed5808d4cba1fbd78beed..ae10cef08794b5f35ab7c51ac38add9366d936d9 100644 (file)
@@ -3440,6 +3440,7 @@ void Face_Menu() {
                        flip_editnormals();
                        DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
                        BIF_undo_push("Flip Normals");
+                       allqueue(REDRAWVIEW3D, 0);
                        break;
                case 2:
                        bevel_menu();
index 68529d656fcc26ea87987ba8e89eb3b85ce23e50..6637ddd8d7ab7e1c6afbeeedf479aed8e48037dc 100644 (file)
@@ -6036,6 +6036,12 @@ void allqueue(unsigned short event, short val)
                                        }
                                }
                                break;
+                       case REDRAWVIEW3D_IMAGE:
+                               if(sa->spacetype==SPACE_VIEW3D || sa->spacetype==SPACE_IMAGE) {
+                                       scrarea_queue_winredraw(sa);
+                                       if(val) scrarea_queue_headredraw(sa);
+                               }
+                               break;
                        case REDRAWVIEWCAM:
                                if(sa->spacetype==SPACE_VIEW3D) {
                                        v3d= sa->spacedata.first;