diff options
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 4 | ||||
-rw-r--r-- | source/blender/imbuf/IMB_imbuf.h | 1 | ||||
-rw-r--r-- | source/blender/imbuf/intern/filter.c | 30 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_texture_types.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 14 | ||||
-rw-r--r-- | source/blender/render/intern/source/imagetexture.c | 25 | ||||
-rw-r--r-- | source/blender/src/buttons_shading.c | 23 |
7 files changed, 62 insertions, 37 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index cb441d746e8..83e72d95c14 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -5286,6 +5286,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } if(main->versionfile <= 241) { + Tex *tex; Scene *sce; bArmature *arm; bNodeTree *ntree; @@ -5333,6 +5334,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main) for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) ntree_version_241(ntree); +// for(tex= main->tex.first; tex; tex= tex->id.next) +// tex->imaflag |= TEX_GAUSS_MIP; + //Object *ob; /* for empty drawsize and drawtype */ diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index e78ee5901e9..744c3b66345 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -284,6 +284,7 @@ void IMB_antialias(struct ImBuf * ibuf); * @attention Defined in filter.c */ void IMB_filter(struct ImBuf *ibuf); +void IMB_filterN(struct ImBuf *out, struct ImBuf *in); /** * diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c index 810e012761b..8c5bc430aea 100644 --- a/source/blender/imbuf/intern/filter.c +++ b/source/blender/imbuf/intern/filter.c @@ -203,6 +203,36 @@ void imb_filterx(struct ImBuf *ibuf) } } +void IMB_filterN(ImBuf *out, ImBuf *in) +{ + register char *row1, *row2, *row3; + register char *cp; + int rowlen, x, y; + + rowlen= in->x; + + for(y=2; y<in->y; y++) { + /* setup rows */ + row1= (char *)(in->rect + (y-2)*rowlen); + row2= row1 + 4*rowlen; + row3= row2 + 4*rowlen; + + cp= (char *)(out->rect + (y-1)*rowlen); + cp[0]= row2[0]; + cp[1]= row2[1]; + cp[2]= row2[2]; + cp[3]= row2[3]; + cp+= 4; + + for(x=2; x<rowlen; x++) { + cp[0]= (row1[0] + 2*row1[4] + row1[8] + 2*row2[0] + 4*row2[4] + 2*row2[8] + row3[0] + 2*row3[4] + row3[8])>>4; + cp[1]= (row1[1] + 2*row1[5] + row1[9] + 2*row2[1] + 4*row2[5] + 2*row2[9] + row3[1] + 2*row3[5] + row3[9])>>4; + cp[2]= (row1[2] + 2*row1[6] + row1[10] + 2*row2[2] + 4*row2[6] + 2*row2[10] + row3[2] + 2*row3[6] + row3[10])>>4; + cp[3]= (row1[3] + 2*row1[7] + row1[11] + 2*row2[3] + 4*row2[7] + 2*row2[11] + row3[3] + 2*row3[7] + row3[11])>>4; + cp+=4; row1+=4; row2+=4; row3+=4; + } + } +} void IMB_filter(struct ImBuf *ibuf) { diff --git a/source/blender/makesdna/DNA_texture_types.h b/source/blender/makesdna/DNA_texture_types.h index 3cb37dff29e..7aad3ee6e37 100644 --- a/source/blender/makesdna/DNA_texture_types.h +++ b/source/blender/makesdna/DNA_texture_types.h @@ -238,8 +238,8 @@ typedef struct TexMapping { #define TEX_ANTISCALE 512 #define TEX_STD_FIELD 1024 #define TEX_NORMALMAP 2048 +#define TEX_GAUSS_MIP 4096 -#define TEX_LASOPPATCH 8192 #define TEX_MORKPATCH 16384 /* flag */ diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 45a3e6c9b80..fe03dd5ed20 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -2581,20 +2581,6 @@ void RE_Database_Free(Render *re) re->totvlak=re->totvert=re->totlamp=re->tothalo= 0; re->i.convertdone= 0; - - { - int curmap; - Image *ima; - for(ima= G.main->image.first; ima; ima= ima->id.next) { - if(ima->ibuf) - printf("%s %d %d ref %d\n", ima->id.name+2, ima->ibuf->x, ima->ibuf->y, ima->ibuf->encodedsize); - for(curmap=0; curmap<BLI_ARRAY_NELEMS(ima->mipmap); curmap++) { - if(ima->mipmap[curmap]) { - printf("%s %d %d ref %d\n", ima->id.name+2, ima->mipmap[curmap]->x, ima->mipmap[curmap]->y, ima->mipmap[curmap]->encodedsize); - } - } - } - } } /* per face check if all samples should be taken. diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c index 6e93acde5bd..e1868eda917 100644 --- a/source/blender/render/intern/source/imagetexture.c +++ b/source/blender/render/intern/source/imagetexture.c @@ -566,20 +566,24 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max } } -static void makemipmap(Image *ima) +static void makemipmap(Tex *tex, Image *ima) { - struct ImBuf *ibuf; + struct ImBuf *ibuf, *nbuf; int minsize, curmap=0; ibuf= ima->ibuf; minsize= MIN2(ibuf->x, ibuf->y); - while(minsize>3 && curmap<BLI_ARRAY_NELEMS(ima->mipmap)) { - - ibuf= IMB_dupImBuf(ibuf); - IMB_filter(ibuf); - ima->mipmap[curmap]= (struct ImBuf *)IMB_onehalf(ibuf); - IMB_freeImBuf(ibuf); + while(minsize>10 && curmap<BLI_ARRAY_NELEMS(ima->mipmap)) { + if(tex->imaflag & TEX_GAUSS_MIP) { + nbuf= IMB_allocImBuf(ibuf->x, ibuf->y, 32, IB_rect, 0); + IMB_filterN(nbuf, ibuf); + ima->mipmap[curmap]= (struct ImBuf *)IMB_onehalf(nbuf); + IMB_freeImBuf(nbuf); + } + else { + ima->mipmap[curmap]= (struct ImBuf *)IMB_onehalf(ibuf); + } ibuf= ima->mipmap[curmap]; curmap++; @@ -617,7 +621,7 @@ int imagewraposa(Tex *tex, Image *ima, float *texvec, float *dxt, float *dyt, Te if(tex->imaflag & TEX_MIPMAP) { if(ima->mipmap[0]==NULL) { if(load_ibuf_lock) SDL_mutexP(load_ibuf_lock); - if(ima->mipmap[0]==NULL) makemipmap(ima); + if(ima->mipmap[0]==NULL) makemipmap(tex, ima); if(load_ibuf_lock) SDL_mutexV(load_ibuf_lock); } } @@ -800,9 +804,8 @@ int imagewraposa(Tex *tex, Image *ima, float *texvec, float *dxt, float *dyt, Te pixsize= 1.0f / (float)MIN2(ibuf->x, ibuf->y); /* this used to be 1.0 */ curmap++; } - ibuf->encodedsize++; + if(previbuf!=ibuf || (tex->imaflag & TEX_INTERPOL)) { - previbuf->encodedsize++; /* sample at least 1 pixel */ if (minx < 0.5f / ima->ibuf->x) minx = 0.5f / ima->ibuf->x; if (miny < 0.5f / ima->ibuf->y) miny = 0.5f / ima->ibuf->y; diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index 52cc8843594..87a4481fa18 100644 --- a/source/blender/src/buttons_shading.c +++ b/source/blender/src/buttons_shading.c @@ -986,17 +986,18 @@ static void texture_panel_image(Tex *tex) /* types */ uiBlockBeginAlign(block); - uiDefButBitS(block, TOG, TEX_INTERPOL, 0, "InterPol", 10, 180, 75, 18, &tex->imaflag, 0, 0, 0, 0, "Interpolates pixels of the Image to fit texture mapping"); - uiDefButBitS(block, TOG, TEX_USEALPHA, B_TEXPRV, "UseAlpha", 85, 180, 75, 18, &tex->imaflag, 0, 0, 0, 0, "Click to use Image's alpha channel"); - uiDefButBitS(block, TOG, TEX_CALCALPHA, B_TEXPRV, "CalcAlpha", 160, 180, 75, 18, &tex->imaflag, 0, 0, 0, 0, "Click to calculate an alpha channel based on Image RGB values"); - uiDefButBitS(block, TOG, TEX_NEGALPHA, B_TEXPRV, "NegAlpha", 235, 180, 75, 18, &tex->flag, 0, 0, 0, 0, "Click to invert the alpha values"); - - uiDefButBitS(block, TOG, TEX_MIPMAP, B_IMAPTEST, "MipMap", 10, 160, 60, 18, &tex->imaflag, 0, 0, 0, 0, "Generates a series of pictures to use for mipmapping"); - uiDefButBitS(block, TOG, TEX_FIELDS, B_IMAPTEST, "Fields", 70, 160, 50, 18, &tex->imaflag, 0, 0, 0, 0, "Click to enable use of fields in Image"); - uiDefButBitS(block, TOG, TEX_IMAROT, B_TEXPRV, "Rot90", 120, 160, 50, 18, &tex->imaflag, 0, 0, 0, 0, "Actually flips X and Y for rendering, rotates and mirrors"); - uiDefButBitS(block, TOG, TEX_ANIM5, B_RELOADIMA, "Movie", 170, 160, 50, 18, &tex->imaflag, 0, 0, 0, 0, "Click to enable movie frames as Images"); - uiDefButBitS(block, TOG, TEX_ANTIALI, 0, "Anti", 220, 160, 40, 18, &tex->imaflag, 0, 0, 0, 0, "Toggles Image anti-aliasing"); - uiDefButBitS(block, TOG, TEX_STD_FIELD, 0, "StField", 260, 160, 50, 18, &tex->imaflag, 0, 0, 0, 0, "Standard Field Toggle"); + uiDefButBitS(block, TOG, TEX_MIPMAP, B_IMAPTEST, "MipMap", 10, 180, 60, 18, &tex->imaflag, 0, 0, 0, 0, "Generates and uses mipmaps"); + uiDefButBitS(block, TOG, TEX_GAUSS_MIP, 0, "Gauss", 70, 180, 50, 18, &tex->imaflag, 0, 0, 0, 0, "Enable Gauss filter to sample down mipmaps"); + uiDefButBitS(block, TOG, TEX_INTERPOL, 0, "Interpol", 120, 180, 60, 18, &tex->imaflag, 0, 0, 0, 0, "Interpolates pixels using Area filter"); + uiDefButBitS(block, TOG, TEX_IMAROT, B_TEXPRV, "Rot90", 180, 180, 40, 18, &tex->imaflag, 0, 0, 0, 0, "Actually flips X and Y for rendering, rotates and mirrors"); + uiDefButBitS(block, TOG, TEX_ANTIALI, 0, "Anti", 220, 180, 40, 18, &tex->imaflag, 0, 0, 0, 0, "Toggles Image anti-aliasing"); + uiDefButBitS(block, TOG, TEX_ANIM5, B_RELOADIMA, "Movie", 260, 180, 50, 18, &tex->imaflag, 0, 0, 0, 0, "Click to enable movie frames as Images"); + + uiDefButBitS(block, TOG, TEX_USEALPHA, B_TEXPRV, "UseAlpha", 10, 160, 70, 18, &tex->imaflag, 0, 0, 0, 0, "Click to use Image's alpha channel"); + uiDefButBitS(block, TOG, TEX_CALCALPHA, B_TEXPRV, "CalcAlpha", 80, 160, 70, 18, &tex->imaflag, 0, 0, 0, 0, "Click to calculate an alpha channel based on Image RGB values"); + uiDefButBitS(block, TOG, TEX_NEGALPHA, B_TEXPRV, "NegAlpha", 150, 160, 60, 18, &tex->flag, 0, 0, 0, 0, "Click to invert the alpha values"); + uiDefButBitS(block, TOG, TEX_FIELDS, B_IMAPTEST, "Fields", 210, 160, 60, 18, &tex->imaflag, 0, 0, 0, 0, "Click to enable use of fields in Image"); + uiDefButBitS(block, TOG, TEX_STD_FIELD, 0, "Odd", 270, 160, 40, 18, &tex->imaflag, 0, 0, 0, 0, "Standard Field Toggle"); uiBlockEndAlign(block); /* file input */ |