diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-01-07 18:41:24 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-01-07 18:41:24 +0300 |
commit | f01cac08e782aa1037dfd2b11eb6df7c3ab8418c (patch) | |
tree | 5a0265913b571fae9d9cccd8a90e3570c403c605 /source | |
parent | c8e0ca44a3c5d49be01f90a49b98a9ee8f875d36 (diff) |
Fix #25078: texture mapping options (e.g. size) not working correctly with bump.
This problem was in both new bump and new new bump. The derivatives used for
bump mapping did not include the mapping, which gave mismatched offset for the
taps, now just do the mapping beforehand.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/render/intern/source/texture.c | 53 |
1 files changed, 24 insertions, 29 deletions
diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c index 75ad38e381b..a2b0b817d7c 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -1818,7 +1818,6 @@ void do_material_tex(ShadeInput *shi) if(texres.nor && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) { TexResult ttexr = {0, 0, 0, 0, 0, texres.talpha, NULL}; // temp TexResult - float texv[3]; const int fromrgb = ((tex->type == TEX_IMAGE) || ((tex->flag & TEX_COLORBAND)!=0)); const float Hscale = 0.016f * Tnor*stencilTin*mtex->norfac; // factor 0.016 proved to look like the previous bump code @@ -1837,12 +1836,14 @@ void do_material_tex(ShadeInput *shi) float STll[3], STlr[3], STul[3]; float Hll, Hlr, Hul; + texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt); + for(c=0; c<nr_channels; c++) { // dx contains the derivatives (du/dx, dv/dx) // dy contains the derivatives (du/dy, dv/dy) - STll[c] = co[c]; - STlr[c] = co[c]+dx[c]; - STul[c] = co[c]+dy[c]; + STll[c] = texvec[c]; + STlr[c] = texvec[c]+dxt[c]; + STul[c] = texvec[c]+dyt[c]; } // clear unused derivatives @@ -1852,18 +1853,15 @@ void do_material_tex(ShadeInput *shi) STul[c] = 0.0f; } - // use texres and texvec for the center sample, set rgbnor - texco_mapping(shi, tex, mtex, STll, dx, dy, texvec, dxt, dyt); - rgbnor = multitex_mtex(shi, mtex, texvec, dxt, dyt, &texres); + // use texres for the center sample, set rgbnor + rgbnor = multitex_mtex(shi, mtex, STll, dxt, dyt, &texres); Hll = (fromrgb)? (texres.tr + texres.tg + texres.tb)*0.33333333f: texres.tin; - // use texv and ttexr for the other 2 taps - texco_mapping(shi, tex, mtex, STlr, dx, dy, texv, dxt, dyt); - multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr); + // use ttexr for the other 2 taps + multitex_mtex(shi, mtex, STlr, dxt, dyt, &ttexr); Hlr = (fromrgb)? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f: ttexr.tin; - texco_mapping(shi, tex, mtex, STul, dx, dy, texv, dxt, dyt); - multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr); + multitex_mtex(shi, mtex, STul, dxt, dyt, &ttexr); Hul = (fromrgb)? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f: ttexr.tin; dHdx = Hscale*(Hlr - Hll); @@ -1874,12 +1872,14 @@ void do_material_tex(ShadeInput *shi) float STc[3], STl[3], STr[3], STd[3], STu[3]; float Hc, Hl, Hr, Hd, Hu; + texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt); + for(c=0; c<nr_channels; c++) { - STc[c] = co[c]; - STl[c] = co[c] - 0.5f*dx[c]; - STr[c] = co[c] + 0.5f*dx[c]; - STd[c] = co[c] - 0.5f*dy[c]; - STu[c] = co[c] + 0.5f*dy[c]; + STc[c] = texvec[c]; + STl[c] = texvec[c] - 0.5f*dxt[c]; + STr[c] = texvec[c] + 0.5f*dxt[c]; + STd[c] = texvec[c] - 0.5f*dyt[c]; + STu[c] = texvec[c] + 0.5f*dyt[c]; } // clear unused derivatives @@ -1891,23 +1891,18 @@ void do_material_tex(ShadeInput *shi) STu[c] = 0.0f; } - // use texres and texvec for the center sample, set rgbnor - texco_mapping(shi, tex, mtex, STc, dx, dy, texvec, dxt, dyt); - rgbnor = multitex_mtex(shi, mtex, texvec, dxt, dyt, &texres); + // use texres for the center sample, set rgbnor + rgbnor = multitex_mtex(shi, mtex, STc, dxt, dyt, &texres); Hc = (fromrgb)? (texres.tr + texres.tg + texres.tb)*0.33333333f: texres.tin; - // use texv and ttexr for the other taps - texco_mapping(shi, tex, mtex, STl, dx, dy, texv, dxt, dyt); - multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr); + // use ttexr for the other taps + multitex_mtex(shi, mtex, STl, dxt, dyt, &ttexr); Hl = (fromrgb)? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f: ttexr.tin; - texco_mapping(shi, tex, mtex, STr, dx, dy, texv, dxt, dyt); - multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr); + multitex_mtex(shi, mtex, STr, dxt, dyt, &ttexr); Hr = (fromrgb)? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f: ttexr.tin; - texco_mapping(shi, tex, mtex, STd, dx, dy, texv, dxt, dyt); - multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr); + multitex_mtex(shi, mtex, STd, dxt, dyt, &ttexr); Hd = (fromrgb)? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f: ttexr.tin; - texco_mapping(shi, tex, mtex, STu, dx, dy, texv, dxt, dyt); - multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr); + multitex_mtex(shi, mtex, STu, dxt, dyt, &ttexr); Hu = (fromrgb)? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f: ttexr.tin; dHdx = Hscale*(Hr - Hl); |