[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34157] trunk/blender: Revert bump mapping patch for now, backwards compatibility is not good enough,

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Jan 7 19:19:36 CET 2011


Hi,

I made a new patch: http://www.pasteall.org/18104/diff

This one has all methods included for easier testing, and a different
scale factor to be more compatible.

Brecht.

On Fri, Jan 7, 2011 at 5:55 PM, Brecht Van Lommel
<brechtvanlommel at pandora.be> wrote:
> Revision: 34157
>          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34157
> Author:   blendix
> Date:     2011-01-07 16:55:56 +0000 (Fri, 07 Jan 2011)
> Log Message:
> -----------
> Revert bump mapping patch for now, backwards compatibility is not good enough,
> we may need to preserve the previous method.
>
> Modified Paths:
> --------------
>    trunk/blender/release/scripts/ui/properties_texture.py
>    trunk/blender/source/blender/makesdna/DNA_texture_types.h
>    trunk/blender/source/blender/makesrna/intern/rna_material.c
>    trunk/blender/source/blender/render/intern/source/texture.c
>
> Modified: trunk/blender/release/scripts/ui/properties_texture.py
> ===================================================================
> --- trunk/blender/release/scripts/ui/properties_texture.py      2011-01-07 15:41:24 UTC (rev 34156)
> +++ trunk/blender/release/scripts/ui/properties_texture.py      2011-01-07 16:55:56 UTC (rev 34157)
> @@ -995,7 +995,7 @@
>         col.prop(tex, "color", text="")
>
>         if isinstance(idblock, bpy.types.Material):
> -            sub = col.row()
> +            sub = layout.row()
>             sub.prop(tex, "bump_method", text="Bump Method")
>             sub.active = tex.use_map_normal
>
>
> Modified: trunk/blender/source/blender/makesdna/DNA_texture_types.h
> ===================================================================
> --- trunk/blender/source/blender/makesdna/DNA_texture_types.h   2011-01-07 15:41:24 UTC (rev 34156)
> +++ trunk/blender/source/blender/makesdna/DNA_texture_types.h   2011-01-07 16:55:56 UTC (rev 34157)
> @@ -455,7 +455,6 @@
>  #define MTEX_DUPLI_MAPTO       32
>  #define MTEX_OB_DUPLI_ORIG     64
>  #define MTEX_NEW_BUMP          128
> -#define MTEX_5TAP_BUMP         256
>
>  /* blendtype */
>  #define MTEX_BLEND             0
>
> Modified: trunk/blender/source/blender/makesrna/intern/rna_material.c
> ===================================================================
> --- trunk/blender/source/blender/makesrna/intern/rna_material.c 2011-01-07 15:41:24 UTC (rev 34156)
> +++ trunk/blender/source/blender/makesrna/intern/rna_material.c 2011-01-07 16:55:56 UTC (rev 34157)
> @@ -368,9 +368,8 @@
>                {0, NULL, 0, NULL, NULL}};
>
>        static EnumPropertyItem prop_bump_method_items[] = {
> -               {0, "BUMP_OLD", 0, "Old Bump", ""},
> -               {MTEX_NEW_BUMP, "BUMP_3_TAP", 0, "3-Tap", ""},
> -               {MTEX_NEW_BUMP|MTEX_5TAP_BUMP, "BUMP_5_TAP", 0, "5-Tap", ""},
> +               {0, "BUMP_ORIGINAL", 0, "Original", ""},
> +               {MTEX_NEW_BUMP, "BUMP_IMPROVED", 0, "Improved", ""},
>                {0, NULL, 0, NULL, NULL}};
>
>        srna= RNA_def_struct(brna, "MaterialTextureSlot", "TextureSlot");
>
> Modified: trunk/blender/source/blender/render/intern/source/texture.c
> ===================================================================
> --- trunk/blender/source/blender/render/intern/source/texture.c 2011-01-07 15:41:24 UTC (rev 34156)
> +++ trunk/blender/source/blender/render/intern/source/texture.c 2011-01-07 16:55:56 UTC (rev 34157)
> @@ -1677,12 +1677,9 @@
>        float fact, facm, factt, facmm, stencilTin=1.0;
>        float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], warpvec[3]={0.0f, 0.0f, 0.0f}, Tnor=1.0;
>        int tex_nr, rgbnor= 0, warpdone=0;
> +       float nu[3] = {0,0,0}, nv[3] = {0,0,0}, nn[3] = {0,0,0}, dudnu = 1.f, dudnv = 0.f, dvdnu = 0.f, dvdnv = 1.f; // bump mapping
>        int nunvdone= 0, newbump;
> -       // bumpmapping
> -       float vNacc[3]; // original surface normal minus the surface gradient of every bump map which is encountered
> -       float vR1[3], vR2[3]; // cross products (sigma_y, original_normal), (original_normal, sigma_x)
> -       float sgn_det=0.0f; // sign of the determinant of the matrix {sigma_x, sigma_y, original_normal}
> -
> +
>        if (R.r.scemode & R_NO_TEX) return;
>        /* here: test flag if there's a tex (todo) */
>
> @@ -1708,9 +1705,7 @@
>                                        dyt[0]= dyt[1]= dyt[2]= 0.0f;
>                                }
>                                else {
> -                                       co= shi->lo;
> -                                       dx= shi->dxlo;
> -                                       dy= shi->dylo;
> +                                       co= shi->lo; dx= shi->dxlo; dy= shi->dylo;
>                                }
>                        }
>                        else if(mtex->texco==TEXCO_STICKY) {
> @@ -1773,8 +1768,59 @@
>
>                                        co= suv->uv;
>                                        dx= suv->dxuv;
> -                                       dy= suv->dyuv;
> +                                       dy= suv->dyuv;
>
> +                                       // uvmapping only, calculation of normal tangent u/v partial derivatives
> +                                       // (should not be here, dudnu, dudnv, dvdnu & dvdnv should probably be part of ShadeInputUV struct,
> +                                       //  nu/nv in ShadeInput and this calculation should then move to shadeinput.c, shade_input_set_shade_texco() func.)
> +                                       // NOTE: test for shi->obr->ob here, since vlr/obr/obi can be 'fake' when called from fastshade(), another reason to move it..
> +                                       // NOTE: shi->v1 is NULL when called from displace_render_vert, assigning verts in this case is not trivial because the shi quad face side is not know.
> +                                       if ((mtex->texflag & MTEX_NEW_BUMP) && shi->obr && shi->obr->ob && shi->v1) {
> +                                               if(mtex->mapto & (MAP_NORM|MAP_WARP) && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) {
> +                                                       MTFace* tf = RE_vlakren_get_tface(shi->obr, shi->vlr, i, NULL, 0);
> +                                                       int j1 = shi->i1, j2 = shi->i2, j3 = shi->i3;
> +
> +                                                       vlr_set_uv_indices(shi->vlr, &j1, &j2, &j3);
> +
> +                                                       // compute ortho basis around normal
> +                                                       if(!nunvdone) {
> +                                                               // render normal is negated
> +                                                               nn[0] = -shi->vn[0];
> +                                                               nn[1] = -shi->vn[1];
> +                                                               nn[2] = -shi->vn[2];
> +                                                               ortho_basis_v3v3_v3( nu, nv,nn);
> +                                                               nunvdone= 1;
> +                                                       }
> +
> +                                                       if (tf) {
> +                                                               float *uv1 = tf->uv[j1], *uv2 = tf->uv[j2], *uv3 = tf->uv[j3];
> +                                                               const float an[3] = {fabsf(nn[0]), fabsf(nn[1]), fabsf(nn[2])};
> +                                                               const int a1 = (an[0] > an[1] && an[0] > an[2]) ? 1 : 0;
> +                                                               const int a2 = (an[2] > an[0] && an[2] > an[1]) ? 1 : 2;
> +                                                               const float dp1_a1 = shi->v1->co[a1] - shi->v3->co[a1];
> +                                                               const float dp1_a2 = shi->v1->co[a2] - shi->v3->co[a2];
> +                                                               const float dp2_a1 = shi->v2->co[a1] - shi->v3->co[a1];
> +                                                               const float dp2_a2 = shi->v2->co[a2] - shi->v3->co[a2];
> +                                                               const float du1 = uv1[0] - uv3[0], du2 = uv2[0] - uv3[0];
> +                                                               const float dv1 = uv1[1] - uv3[1], dv2 = uv2[1] - uv3[1];
> +                                                               const float dpdu_a1 = dv2*dp1_a1 - dv1*dp2_a1;
> +                                                               const float dpdu_a2 = dv2*dp1_a2 - dv1*dp2_a2;
> +                                                               const float dpdv_a1 = du1*dp2_a1 - du2*dp1_a1;
> +                                                               const float dpdv_a2 = du1*dp2_a2 - du2*dp1_a2;
> +                                                               float d = dpdu_a1*dpdv_a2 - dpdv_a1*dpdu_a2;
> +                                                               float uvd = du1*dv2 - dv1*du2;
> +
> +                                                               if (uvd == 0.f) uvd = 1e-5f;
> +                                                               if (d == 0.f) d = 1e-5f;
> +                                                               d = uvd / d;
> +
> +                                                               dudnu = (dpdv_a2*nu[a1] - dpdv_a1*nu[a2])*d;
> +                                                               dvdnu = (dpdu_a1*nu[a2] - dpdu_a2*nu[a1])*d;
> +                                                               dudnv = (dpdv_a2*nv[a1] - dpdv_a1*nv[a2])*d;
> +                                                               dvdnv = (dpdu_a1*nv[a2] - dpdu_a2*nv[a1])*d;
> +                                                       }
> +                                               }
> +                                       }
>                                }
>                        }
>                        else if(mtex->texco==TEXCO_WINDOW) {
> @@ -1808,140 +1854,142 @@
>                        else texres.nor= NULL;
>
>                        if(warpdone) {
> -                               VECADD(tempvec, co, warpvec)
> +                               VECADD(tempvec, co, warpvec);
>                                co= tempvec;
>                        }
>
>                        /* XXX texture node trees don't work for this yet */
>                        if(newbump) {
> +                               // compute ortho basis around normal
> +                               if(!nunvdone) {
> +                                       // render normal is negated
> +                                       nn[0] = -shi->vn[0];
> +                                       nn[1] = -shi->vn[1];
> +                                       nn[2] = -shi->vn[2];
> +                                       ortho_basis_v3v3_v3( nu, nv,nn);
> +                                       nunvdone= 1;
> +                               }
>
>                                if(texres.nor && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) {
> -
>                                        TexResult ttexr = {0, 0, 0, 0, 0, texres.talpha, NULL}; // temp TexResult
> -
> +                                       float tco[3], texv[3], cd, ud, vd, du, dv, idu, idv;
>                                        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
> -
> -                                       // 2 channels for 2D texture and 3 for 3D textures.
> -                                       const int nr_channels = (mtex->texco == TEXCO_UV)? 2 : 3;
> -                                       int c;
> -                                       float dHdx, dHdy;
> -
> -                                       // disable internal bump eval in sampler, save pointer
> -                                       float *nvec = texres.nor;
> +                                       const float bf = 0.04f*Tnor*stencilTin*mtex->norfac;
> +                                       // disable internal bump eval
> +                                       float* nvec = texres.nor;
>                                        texres.nor = NULL;
> +                                       // du & dv estimates, constant value defaults
> +                                       du = dv = 0.01f;
>
> -                                       if(!(mtex->texflag & MTEX_5TAP_BUMP)) {
> -                                               // compute height derivatives with respect to output image pixel coordinates x and y
> -                                               float STll[3], STlr[3], STul[3];
> -                                               float Hll, Hlr, Hul;
> +                                       // two methods, either constant based on main image resolution,
> +                                       // (which also works without osa, though of course not always good (or even very bad) results),
> +                                       // or based on tex derivative max values (osa only). Not sure which is best...
>
> -                                               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] = texvec[c];
> -                                                       STlr[c] = texvec[c]+dxt[c];
> -                                                       STul[c] = texvec[c]+dyt[c];
> +                                       if (!shi->osatex && (tex->type == TEX_IMAGE) && tex->ima) {
> +                                               // in case we have no proper derivatives, fall back to
> +                                               // computing du/dv it based on image size
> +                                               ImBuf* ibuf = BKE_image_get_ibuf(tex->ima, &tex->iuser);
> +                                               if (ibuf) {
> +                                                       du = 1.f/(float)ibuf->x;
> +                                                       dv = 1.f/(float)ibuf->y;
>                                                }
> -
> -                                               // clear unused derivatives
> -                                               for(c=nr_channels; c<3; c++) {
> -                                                       STll[c] = 0.0f;
> -                                                       STlr[c] = 0.0f;
> -                                                       STul[c] = 0.0f;
> +                                       }
> +                                       else if (shi->osatex) {
> +                                               // we have derivatives, can compute proper du/dv
> +                                               if (tex->type == TEX_IMAGE) {   // 2d image, use u & v max. of dx/dy 2d vecs
> +                                                       const float adx[2] = {fabsf(dx[0]), fabsf(dx[1])};
> +                                                       const float ady[2] = {fabsf(dy[0]), fabsf(dy[1])};
> +                                                       du = MAX2(adx[0], ady[0]);
> +                                                       dv = MAX2(adx[1], ady[1]);
>                                                }
> -
> -                                               // 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 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;
> -
> -                                               multitex_mtex(shi, mtex, STul, dxt, dyt, &ttexr);
> -                                               Hul = (fromrgb)? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f: ttexr.tin;
> -
> -                                               dHdx = Hscale*(Hlr - Hll);
> -                                               dHdy = Hscale*(Hul - Hll);
> +                                               else {  // 3d procedural, estimate from all dx/dy elems
> +                                                       const float adx[3] = {fabsf(dx[0]), fabsf(dx[1]), fabsf(dx[2])};
> +                                                       const float ady[3] = {fabsf(dy[0]), fabsf(dy[1]), fabsf(dy[2])};
> +                                                       du = MAX3(adx[0], adx[1], adx[2]);
> +                                                       dv = MAX3(ady[1], ady[1], ady[2]);
> +                                               }
>                                        }
> +
> +                                       // center, main return value
> +                                       texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
> +                                       rgbnor = multitex_mtex(shi, mtex, texvec, dxt, dyt, &texres);
> +                                       cd = fromrgb ? (texres.tr + texres.tg + texres.tb)*0.33333333f : texres.tin;
> +
> +                                       if (mtex->texco == TEXCO_UV) {
> +                                               // for the uv case, use the same value for both du/dv,
>
> @@ Diff output truncated at 10240 characters. @@
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>


More information about the Bf-blender-cvs mailing list