cvs server: Diffing blender/makesdna Index: blender/makesdna/DNA_lamp_types.h =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/makesdna/DNA_lamp_types.h,v retrieving revision 1.18 diff -u -r1.18 DNA_lamp_types.h --- blender/makesdna/DNA_lamp_types.h 15 Oct 2006 11:50:45 -0000 1.18 +++ blender/makesdna/DNA_lamp_types.h 6 May 2007 12:08:58 -0000 @@ -112,6 +112,11 @@ /* Since it is used with LOCAL lamp, can't use LA_SHAD */ #define LA_YF_SOFT 16384 +/* Overloaded mode bits for hemi decay dimensions. */ +#define LA_HEMI_DX LA_QUAD +#define LA_HEMI_DY LA_SPHERE +#define LA_HEMI_DZ LA_SQUARE + /* buftype, no flag */ #define LA_SHADBUF_REGULAR 0 #define LA_SHADBUF_IRREGULAR 1 Index: blender/makesdna/DNA_object_types.h =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/makesdna/DNA_object_types.h,v retrieving revision 1.61 diff -u -r1.61 DNA_object_types.h --- blender/makesdna/DNA_object_types.h 14 Apr 2007 10:37:58 -0000 1.61 +++ blender/makesdna/DNA_object_types.h 6 May 2007 12:08:58 -0000 @@ -142,7 +142,7 @@ float mass, damping, inertia; /* The form factor k is introduced to give the user more control * and to fix incompatibility problems. - * For rotational symmetric objects, the inertia value can be + * For rotational symmetric objects, the inertia value can be * expressed as: Theta = k * m * r^2 * where m = Mass, r = Radius * For a Sphere, the form factor is by default = 0.4 cvs server: Diffing blender/render/intern/source Index: blender/render/intern/source/convertblender.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/render/intern/source/convertblender.c,v retrieving revision 1.94 diff -u -r1.94 convertblender.c --- blender/render/intern/source/convertblender.c 3 May 2007 21:37:52 -0000 1.94 +++ blender/render/intern/source/convertblender.c 6 May 2007 12:08:59 -0000 @@ -2223,7 +2223,6 @@ lar->mode= la->mode; lar->energy= la->energy; - lar->energy= la->energy; if(la->mode & LA_NEG) lar->energy= -lar->energy; lar->vec[0]= -mat[2][0]; Index: blender/render/intern/source/pixelshading.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/render/intern/source/pixelshading.c,v retrieving revision 1.44 diff -u -r1.44 pixelshading.c --- blender/render/intern/source/pixelshading.c 4 Apr 2007 13:18:30 -0000 1.44 +++ blender/render/intern/source/pixelshading.c 6 May 2007 12:08:59 -0000 @@ -86,22 +86,41 @@ if(lar->mode & LA_LAYER) if((lar->lay & har->lay)==0) continue; /* lampdist cacluation */ - if(lar->type==LA_SUN || lar->type==LA_HEMI) { + if(lar->type==LA_SUN || (lar->type==LA_HEMI + && (lar->mode & (LA_HEMI_DX|LA_HEMI_DY|LA_HEMI_DZ))==0 )) { VECCOPY(lv, lar->vec); - lampdist= 1.0; + lampdist= 1.0f; } else { - lv[0]= rco[0]-lar->co[0]; - lv[1]= rco[1]-lar->co[1]; - lv[2]= rco[2]-lar->co[2]; - ld= sqrt(lv[0]*lv[0]+lv[1]*lv[1]+lv[2]*lv[2]); - lv[0]/= ld; - lv[1]/= ld; - lv[2]/= ld; + VECSUB(lv, rco, lar->co); + ld= sqrt( INPR(lv, lv)); + VECMUL(lv, 1.0f/ld); /* ld is re-used further on (texco's) */ - if(lar->mode & LA_QUAD) { + if(lar->type==LA_HEMI) { + float lco[3], oco[3]; + float dx2, dy2, dz2; + + /* rotate view to lampspace */ + VECCOPY(lco, lar->co); + MTC_Mat3MulVecfl(lar->imat, lco); + VECCOPY(oco, rco); + MTC_Mat3MulVecfl(lar->imat, oco); + VECSUB(lv, oco, lco); + if (lar->mode & LA_HEMI_DX) { + dx2 = lv[0]*lv[0]; + } else { dx2 = 0.0f; } + if (lar->mode & LA_HEMI_DY) { + dy2 = lv[1]*lv[1]; + } else { dy2 = 0.0f; } + if (lar->mode & LA_HEMI_DZ) { + dz2 = lv[2]*lv[2]; + } else { dz2 = 0.0f; } + ld = sqrt (dx2 + dy2 + dz2); + VECCOPY(lv, lar->vec); + lampdist= (lar->dist/(lar->dist+ld)); + } else if(lar->mode & LA_QUAD) { t= 1.0; if(lar->ld1>0.0) t= lar->dist/(lar->dist+lar->ld1*ld); @@ -114,7 +133,7 @@ lampdist= (lar->dist/(lar->dist+ld)); } - if(lar->mode & LA_SPHERE) { + if(lar->type != LA_HEMI && (lar->mode & LA_SPHERE)) { t= lar->dist - ld; if(t<0.0) continue; @@ -138,7 +157,7 @@ if(lar->type==LA_SPOT) { if(lar->mode & LA_SQUARE) { - if(lv[0]*lar->vec[0]+lv[1]*lar->vec[1]+lv[2]*lar->vec[2]>0.0) { + if(INPR(lv, lar->vec)>0.0f) { float x, lvrot[3]; /* rotate view to lampspace */ @@ -153,7 +172,7 @@ else inpr= 0.0; } else { - inpr= lv[0]*lar->vec[0]+lv[1]*lar->vec[1]+lv[2]*lar->vec[2]; + inpr= INPR(lv, lar->vec); } t= lar->spotsi; @@ -195,7 +214,7 @@ /* dot product and reflectivity*/ - inp= 1.0-fabs(vn[0]*lv[0] + vn[1]*lv[1] + vn[2]*lv[2]); + inp= 1.0-fabs(INPR(vn, lv)); /* inp= cos(0.5*M_PI-acos(inp)); */ @@ -231,8 +250,7 @@ colf[0]*= ir; colf[1]*= ig; - colf[2]*= ib; - + colf[2]*= ib; } Index: blender/render/intern/source/shadeinput.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/render/intern/source/shadeinput.c,v retrieving revision 1.14 diff -u -r1.14 shadeinput.c --- blender/render/intern/source/shadeinput.c 3 May 2007 21:37:52 -0000 1.14 +++ blender/render/intern/source/shadeinput.c 6 May 2007 12:08:59 -0000 @@ -190,7 +190,7 @@ { /* to prevent storing new tfaces or vcols, we check a split runtime */ /* 4---3 4---3 */ - /* |\ 1| or |1 /| */ + /* |\ 1| or |1 /| */ /* |0\ | |/ 0| */ /* 1---2 1---2 0 = orig face, 1 = new face */ Index: blender/render/intern/source/shadeoutput.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/render/intern/source/shadeoutput.c,v retrieving revision 1.18 diff -u -r1.18 shadeoutput.c --- blender/render/intern/source/shadeoutput.c 3 May 2007 21:37:52 -0000 1.18 +++ blender/render/intern/source/shadeoutput.c 6 May 2007 12:09:00 -0000 @@ -397,7 +397,7 @@ if(fac==0.0f) return 1.0f; - t1= (view[0]*vn[0] + view[1]*vn[1] + view[2]*vn[2]); + t1= INPR(view, vn); if(t1>0.0f) t2= 1.0f+t1; else t2= 1.0f-t1; @@ -445,10 +445,10 @@ Normalize_d(cross[3]); /* angles */ - rad[0]= vec[0][0]*vec[1][0]+ vec[0][1]*vec[1][1]+ vec[0][2]*vec[1][2]; - rad[1]= vec[1][0]*vec[2][0]+ vec[1][1]*vec[2][1]+ vec[1][2]*vec[2][2]; - rad[2]= vec[2][0]*vec[3][0]+ vec[2][1]*vec[3][1]+ vec[2][2]*vec[3][2]; - rad[3]= vec[3][0]*vec[0][0]+ vec[3][1]*vec[0][1]+ vec[3][2]*vec[0][2]; + rad[0]= INPR(vec[0], vec[1]); + rad[1]= INPR(vec[1], vec[2]); + rad[2]= INPR(vec[2], vec[3]); + rad[3]= INPR(vec[3], vec[0]); rad[0]= saacos_d(rad[0]); rad[1]= saacos_d(rad[1]); @@ -456,10 +456,10 @@ rad[3]= saacos_d(rad[3]); /* Stoke formula */ - fac= rad[0]*(vn[0]*cross[0][0]+ vn[1]*cross[0][1]+ vn[2]*cross[0][2]); - fac+= rad[1]*(vn[0]*cross[1][0]+ vn[1]*cross[1][1]+ vn[2]*cross[1][2]); - fac+= rad[2]*(vn[0]*cross[2][0]+ vn[1]*cross[2][1]+ vn[2]*cross[2][2]); - fac+= rad[3]*(vn[0]*cross[3][0]+ vn[1]*cross[3][1]+ vn[2]*cross[3][2]); + fac= rad[0]*INPR(vn, cross[0]); + fac+= rad[1]*INPR(vn, cross[1]); + fac+= rad[2]*INPR(vn, cross[2]); + fac+= rad[3]*INPR(vn, cross[3]); if(fac<=0.0) return 0.0; return pow(fac*lar->areasize, lar->k); // corrected for buttons size and lar->dist^2 @@ -568,21 +568,21 @@ h[2]= v[2]+l[2]; Normalize(h); - nh= n[0]*h[0]+n[1]*h[1]+n[2]*h[2]; /* Dot product between surface normal and half-way vector */ + nh= INPR(n, h); /* Dot product between surface normal and half-way vector */ if(tangent) nh= sasqrt(1.0f - nh*nh); else if(nh<0.0f) return 0.0f; - nv= n[0]*v[0]+n[1]*v[1]+n[2]*v[2]; /* Dot product between surface normal and view vector */ + nv= INPR(n, v); /* Dot product between surface normal and view vector */ if(tangent) nv= sasqrt(1.0f - nv*nv); if(nv<=0.01f) nv= 0.01f; /* hrms... */ - nl= n[0]*l[0]+n[1]*l[1]+n[2]*l[2]; /* Dot product between surface normal and light vector */ + nl= INPR(n, l); /* Dot product between surface normal and light vector */ if(tangent) nl= sasqrt(1.0f - nl*nl); if(nl<=0.01f) { return 0.0f; } - vh= v[0]*h[0]+v[1]*h[1]+v[2]*h[2]; /* Dot product between view vector and half-way vector */ + vh= INPR(v, h); /* Dot product between view vector and half-way vector */ if(vh<=0.0f) vh= 0.01f; a = 1.0f; @@ -615,7 +615,7 @@ h[2] = l[2] + v[2]; Normalize(h); - rslt = h[0]*n[0] + h[1]*n[1] + h[2]*n[2]; + rslt = INPR(h, n); if(tangent) rslt = sasqrt(1.0f - rslt*rslt); ang = saacos( rslt ); @@ -639,15 +639,15 @@ h[2] = l[2] + v[2]; Normalize(h); - nh = n[0]*h[0]+n[1]*h[1]+n[2]*h[2]; /* Dot product between surface normal and half-way vector */ + nh = INPR(n, h); /* Dot product between surface normal and half-way vector */ if(tangent) nh = sasqrt(1.0f - nh*nh); if(nh<=0.0f) nh = 0.001f; - nv = n[0]*v[0]+n[1]*v[1]+n[2]*v[2]; /* Dot product between surface normal and view vector */ + nv = INPR(n, v); /* Dot product between surface normal and view vector */ if(tangent) nv = sasqrt(1.0f - nv*nv); if(nv<=0.0f) nv = 0.001f; - nl = n[0]*l[0]+n[1]*l[1]+n[2]*l[2]; /* Dot product between surface normal and light vector */ + nl = INPR(n, l); /* Dot product between surface normal and light vector */ if(tangent) nl = sasqrt(1.0f - nl*nl); if(nl<=0.0f) nl = 0.001f; @@ -664,7 +664,7 @@ { float rslt, ang; - rslt = n[0]*l[0] + n[1]*l[1] + n[2]*l[2]; + rslt = INPR(n, l); ang = saacos( (double)(rslt) ); @@ -690,17 +690,17 @@ h[2]= v[2]+l[2]; Normalize(h); - nh= n[0]*h[0]+n[1]*h[1]+n[2]*h[2]; /* Dot product between surface normal and half-way vector */ + nh= INPR(n, h); /* Dot product between surface normal and half-way vector */ if(nh<0.0f) nh = 0.0f; - nv= n[0]*v[0]+n[1]*v[1]+n[2]*v[2]; /* Dot product between surface normal and view vector */ + nv= INPR(n, v); /* Dot product between surface normal and view vector */ if(nv<=0.0f) nv= 0.0f; - realnl= n[0]*l[0]+n[1]*l[1]+n[2]*l[2]; /* Dot product between surface normal and light vector */ + realnl= INPR(n, l); /* Dot product between surface normal and light vector */ if(realnl<=0.0f) return 0.0f; if(nl<0.0f) return 0.0f; /* value from area light */ - vh= v[0]*h[0]+v[1]*h[1]+v[2]*h[2]; /* Dot product between view vector and halfway vector */ + vh= INPR(v, h); /* Dot product between view vector and halfway vector */ if(vh<=0.0f) vh= 0.0f; Lit_A = saacos(realnl); @@ -716,7 +716,7 @@ View_B[2] = v[2] - (nv * n[2]); Normalize( View_B ); - t = Lit_B[0]*View_B[0] + Lit_B[1]*View_B[1] + Lit_B[2]*View_B[2]; + t = INPR(Lit_B, View_B); if( t < 0 ) t = 0; if( Lit_A > View_A ) { @@ -749,7 +749,7 @@ return 0.0f; /* nv = dot product between surface normal and view vector */ - nv = n[0]*v[0]+n[1]*v[1]+n[2]*v[2]; + nv = INPR(n, v); if (nv < 0.0f) nv = 0.0f; @@ -951,7 +951,7 @@ fac= is; break; case MA_RAMP_IN_NOR: - fac= shi->view[0]*shi->vn[0] + shi->view[1]*shi->vn[1] + shi->view[2]*shi->vn[2]; + fac= INPR(shi->view, shi->vn); break; } @@ -1034,7 +1034,9 @@ /* lampdistance and spot angle, writes in lv and dist */ float lamp_get_visibility(LampRen *lar, float *co, float *lv, float *dist) { - if(lar->type==LA_SUN || lar->type==LA_HEMI) { + /* Special case where HEMI lamp distance of less than one means "no falloff at all". */ + if(lar->type==LA_SUN || (lar->type==LA_HEMI + && (lar->mode & (LA_HEMI_DX|LA_HEMI_DY|LA_HEMI_DZ))==0 )) { *dist= 1.0f; VECCOPY(lv, lar->vec); return 1.0f; @@ -1042,10 +1044,33 @@ else { float visifac= 1.0f, t; - VECSUB(lv, co, lar->co); - *dist= sqrt( INPR(lv, lv)); - t= 1.0f/dist[0]; - VECMUL(lv, t); + if (lar->type==LA_HEMI) { + float lco[3], oco[3]; + float dx2, dy2, dz2; + + /* rotate view to lampspace */ + VECCOPY(lco, lar->co); + MTC_Mat3MulVecfl(lar->imat, lco); + VECCOPY(oco, co); + MTC_Mat3MulVecfl(lar->imat, oco); + VECSUB(lv, oco, lco); + if (lar->mode & LA_HEMI_DX) { + dx2 = lv[0]*lv[0]; + } else { dx2 = 0.0f; } + if (lar->mode & LA_HEMI_DY) { + dy2 = lv[1]*lv[1]; + } else { dy2 = 0.0f; } + if (lar->mode & LA_HEMI_DZ) { + dz2 = lv[2]*lv[2]; + } else { dz2 = 0.0f; } + VECSUB(lv, co, lar->co); + *dist = sqrt (dx2 + dy2 + dz2); + } else { + VECSUB(lv, co, lar->co); + *dist= sqrt( INPR(lv, lv)); + t= 1.0f/dist[0]; + VECMUL(lv, t); + } /* area type has no quad or sphere option */ if(lar->type==LA_AREA) { @@ -1055,6 +1080,17 @@ else visifac= 0.0f; } + else if (lar->type==LA_HEMI) { + /* Let HEMI lamps decay just like docs say they do, but take axes + into account. This makes LA_HEMI single-sided, too. */ + visifac= (lar->dist/(lar->dist+dist[0])); + if ((lar->mode & (LA_HEMI_DX|LA_HEMI_DY|LA_HEMI_DZ))!=0) { + if(INPR(lv, lar->vec) <= 0.0f) { + visifac = 0.0f; + } + } + VECCOPY(lv, lar->vec); + } else { if(lar->mode & LA_QUAD) { if(lar->ld1>0.0f) @@ -1079,7 +1115,7 @@ float inpr; if(lar->mode & LA_SQUARE) { - if(lv[0]*lar->vec[0]+lv[1]*lar->vec[1]+lv[2]*lar->vec[2]>0.0f) { + if(INPR(lv, lar->vec)>0.0f) { float lvrot[3], x; /* rotate view to lampspace */ @@ -1094,7 +1130,7 @@ else inpr= 0.0f; } else { - inpr= lv[0]*lar->vec[0]+lv[1]*lar->vec[1]+lv[2]*lar->vec[2]; + inpr= INPR(lv, lar->vec); } t= lar->spotsi; @@ -1174,7 +1210,7 @@ /* dot product and reflectivity */ /* inp = dotproduct, is = shader result, i = lamp energy (with shadow), i_noshad = i without shadow */ - inp= vn[0]*lv[0] + vn[1]*lv[1] + vn[2]*lv[2]; + inp= INPR(vn, lv); /* phong threshold to prevent backfacing faces having artefacts on ray shadow (terminator problem) */ /* this complex construction screams for a nicer implementation! (ton) */ @@ -1293,13 +1329,14 @@ Normalize(lv); - t= vn[0]*lv[0]+vn[1]*lv[1]+vn[2]*lv[2]; + t= INPR(vn, lv); if(lar->type==LA_HEMI) { t= 0.5*t+0.5; } - t= shadfac[3]*shi->spec*spec(t, shi->har); + /* visifac can be < 1.0f if distance falloff is set. */ + t= shadfac[3]*shi->spec*visifac*spec(t, shi->har); shr->spec[0]+= t*(lacol[0] * shi->specr); shr->spec[1]+= t*(lacol[1] * shi->specg); cvs server: Diffing blender/src Index: blender/src/buttons_shading.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/src/buttons_shading.c,v retrieving revision 1.242 diff -u -r1.242 buttons_shading.c --- blender/src/buttons_shading.c 4 May 2007 09:17:46 -0000 1.242 +++ blender/src/buttons_shading.c 6 May 2007 12:09:00 -0000 @@ -2668,6 +2668,11 @@ uiBlockSetCol(block, TH_BUT_SETTING1); uiDefButBitS(block, TOG, LA_QUAD, B_LAMPPRV,"Quad", 10,150,100,19,&la->mode, 0, 0, 0, 0, "Uses inverse quadratic proportion for light attenuation"); uiDefButBitS(block, TOG, LA_SPHERE, REDRAWVIEW3D,"Sphere", 10,130,100,19,&la->mode, 0, 0, 0, 0, "Sets light intensity to zero for objects beyond the distance value"); + } else if (la->type == LA_HEMI) { + uiBlockSetCol(block, TH_BUT_SETTING1); + uiDefButBitS(block, TOG, LA_HEMI_DX, REDRAWVIEW3D,"X ", 10,150,100,19,&la->mode, 0, 0, 0, 0, "Decay in Lamp's X dimension"); + uiDefButBitS(block, TOG, LA_HEMI_DY, REDRAWVIEW3D,"Y ", 10,130,100,19,&la->mode, 0, 0, 0, 0, "Decay in Lamp's Y dimension"); + uiDefButBitS(block, TOG, LA_HEMI_DZ, REDRAWVIEW3D,"Z ", 10,110,100,19,&la->mode, 0, 0, 0, 0, "Decay in Lamp's Z dimension"); } uiBlockBeginAlign(block); [tiemann@localhost source]$