diff options
Diffstat (limited to 'source/blender/render/intern')
-rw-r--r-- | source/blender/render/intern/include/render_types.h | 1 | ||||
-rw-r--r-- | source/blender/render/intern/include/rendercore.h | 4 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 74 | ||||
-rw-r--r-- | source/blender/render/intern/source/rayshade.c | 10 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeinput.c | 6 | ||||
-rw-r--r-- | source/blender/render/intern/source/texture.c | 28 |
6 files changed, 31 insertions, 92 deletions
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index 2aa6cc10468..22fb2e70d87 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -497,6 +497,7 @@ typedef struct LampRen { #define R_GLOB_NOPUNOFLIP 16 #define R_NEED_TANGENT 32 #define R_SKIP_MULTIRES 64 +#define R_BAKE_TRACE 128 /* vlakren->flag (vlak = face in dutch) char!!! */ #define R_SMOOTH 1 diff --git a/source/blender/render/intern/include/rendercore.h b/source/blender/render/intern/include/rendercore.h index cf1eeae58ec..cdc348279e5 100644 --- a/source/blender/render/intern/include/rendercore.h +++ b/source/blender/render/intern/include/rendercore.h @@ -40,8 +40,8 @@ /* vector defines */ -#define CROSS(dest, a, b) dest[0]= a[1] * b[2] - a[2] * b[1]; dest[1]= a[2] * b[0] - a[0] * b[2]; dest[2]= a[0] * b[1] - a[1] * b[0] -#define VECMUL(dest, f) dest[0]*= f; dest[1]*= f; dest[2]*= f +#define CROSS(dest, a, b) { dest[0]= a[1] * b[2] - a[2] * b[1]; dest[1]= a[2] * b[0] - a[0] * b[2]; dest[2]= a[0] * b[1] - a[1] * b[0]; } +#define VECMUL(dest, f) { dest[0]*= f; dest[1]*= f; dest[2]*= f; } struct HaloRen; struct ShadeInput; diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 933125202be..42191ff35ad 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -451,77 +451,6 @@ static void calc_edge_stress(Render *re, ObjectRen *obr, Mesh *me) MEM_freeN(accum); } -void tangent_from_uv(float *uv1, float *uv2, float *uv3, float *co1, float *co2, float *co3, float *n, float *tang) -{ - float tangv[3], ct[3], e1[3], e2[3], s1, t1, s2, t2, det; - - s1= uv2[0] - uv1[0]; - s2= uv3[0] - uv1[0]; - t1= uv2[1] - uv1[1]; - t2= uv3[1] - uv1[1]; - det= 1.0f / (s1 * t2 - s2 * t1); - - /* normals in render are inversed... */ - VecSubf(e1, co1, co2); - VecSubf(e2, co1, co3); - tang[0] = (t2*e1[0] - t1*e2[0])*det; - tang[1] = (t2*e1[1] - t1*e2[1])*det; - tang[2] = (t2*e1[2] - t1*e2[2])*det; - tangv[0] = (s1*e2[0] - s2*e1[0])*det; - tangv[1] = (s1*e2[1] - s2*e1[1])*det; - tangv[2] = (s1*e2[2] - s2*e1[2])*det; - Crossf(ct, tang, tangv); - - /* check flip */ - if ((ct[0]*n[0] + ct[1]*n[1] + ct[2]*n[2]) < 0.0f) - VecMulf(tang, -1.0f); -} - -/* For normal map tangents we need to detect uv boundaries, and only average - * tangents in case the uvs are connected. Alternative would be to store 1 - * tangent per face rather than 4 per face vertex, but that's not compatible - * with games */ - -typedef struct VertexTangent { - float tang[3], uv[2]; - struct VertexTangent *next; -} VertexTangent; - -static void sum_or_add_vertex_tangent(MemArena *arena, VertexTangent **vtang, float *tang, float *uv) -{ - VertexTangent *vt; - - /* find a tangent with connected uvs */ - for(vt= *vtang; vt; vt=vt->next) { - if(fabs(uv[0]-vt->uv[0]) < STD_UV_CONNECT_LIMIT && fabs(uv[1]-vt->uv[1]) < STD_UV_CONNECT_LIMIT) { - VECADD(vt->tang, vt->tang, tang); - return; - } - } - - /* if not found, append a new one */ - vt= BLI_memarena_alloc(arena, sizeof(VertexTangent)); - VECCOPY(vt->tang, tang); - vt->uv[0]= uv[0]; - vt->uv[1]= uv[1]; - - if(*vtang) - vt->next= *vtang; - *vtang= vt; -} - -static float *find_vertex_tangent(VertexTangent *vtang, float *uv) -{ - VertexTangent *vt; - static float nulltang[3] = {0.0f, 0.0f, 0.0f}; - - for(vt= vtang; vt; vt=vt->next) - if(fabs(uv[0]-vt->uv[0]) < STD_UV_CONNECT_LIMIT && fabs(uv[1]-vt->uv[1]) < STD_UV_CONNECT_LIMIT) - return vt->tang; - - return nulltang; /* shouldn't happen, except for nan or so */ -} - /* gets tangent from tface or orco */ static void calc_tangent_vector(ObjectRen *obr, VertexTangent **vtangents, MemArena *arena, VlakRen *vlr, int do_nmap_tangent, int do_tangent) { @@ -5318,7 +5247,6 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce) ListBase oldtable= {NULL, NULL}, newtable= {NULL, NULL}; ListBase strandsurface; int step; - ModifierData *md = NULL; re->i.infostr= "Calculating previous vectors"; re->r.mode |= R_SPEED; @@ -5453,6 +5381,8 @@ void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob) re->excludeob= actob; if(type == RE_BAKE_LIGHT) re->flag |= R_SKIP_MULTIRES; + if(actob) + re->flag |= R_BAKE_TRACE; if(type==RE_BAKE_NORMALS && re->r.bake_normal_space==R_BAKE_SPACE_TANGENT) re->flag |= R_NEED_TANGENT; diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c index d0f9be3fd79..d423abefe96 100644 --- a/source/blender/render/intern/source/rayshade.c +++ b/source/blender/render/intern/source/rayshade.c @@ -82,6 +82,11 @@ static int vlr_check_intersect(Isect *is, int ob, RayFace *face) ObjectInstanceRen *obi= RAY_OBJECT_GET((Render*)is->userdata, ob); VlakRen *vlr = (VlakRen*)face; + /* for baking selected to active non-traceable materials might still + * be in the raytree */ + if(!(vlr->mat->mode & MA_TRACEBLE)) + return 0; + /* I know... cpu cycle waste, might do smarter once */ if(is->mode==RE_RAY_MIRROR) return !(vlr->mat->mode & MA_ONLYCAST); @@ -125,7 +130,8 @@ void makeraytree(Render *re) for(v=0;v<obr->totvlak;v++) { if((v & 255)==0) vlr= obr->vlaknodes[v>>8].vlak; else vlr++; - if(vlr->mat->mode & MA_TRACEBLE) { + /* baking selected to active needs non-traceable too */ + if((re->flag & R_BAKE_TRACE) || (vlr->mat->mode & MA_TRACEBLE)) { if((vlr->mat->mode & MA_WIRE)==0) { VECCOPY(co1, vlr->v1->co); VECCOPY(co2, vlr->v2->co); @@ -186,7 +192,7 @@ void makeraytree(Render *re) } else vlr++; - if(vlr->mat->mode & MA_TRACEBLE) + if((re->flag & R_BAKE_TRACE) || (vlr->mat->mode & MA_TRACEBLE)) if((vlr->mat->mode & MA_WIRE)==0) RE_ray_tree_add_face(re->raytree, RAY_OBJECT_SET(re, obi), vlr); } diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index bedce5e36ee..35e0815cc69 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -826,9 +826,9 @@ void shade_input_set_shade_texco(ShadeInput *shi) else { /* qdn: flat faces have tangents too, could pick either one, using average here */ - tl= 1.0f; - tu= 1.0f/3.0f; - tv= 1.0f/3.0f; + tl= 1.0f/3.0f; + tu= -1.0f/3.0f; + tv= -1.0f/3.0f; } shi->tang[0]= shi->tang[1]= shi->tang[2]= 0.0f; diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c index 377d72325f0..6af3b711028 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -2488,21 +2488,29 @@ int externtex(MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *t void render_realtime_texture(ShadeInput *shi, Image *ima) { TexResult texr; - static Tex tex1, tex2; // threadsafe + static Tex imatex[BLENDER_MAX_THREADS]; // threadsafe static int firsttime= 1; Tex *tex; float texvec[3], dx[2], dy[2]; ShadeInputUV *suv= &shi->uv[shi->actuv]; + int a; if(firsttime) { - firsttime= 0; - default_tex(&tex1); - default_tex(&tex2); - tex1.type= TEX_IMAGE; - tex2.type= TEX_IMAGE; + BLI_lock_thread(LOCK_IMAGE); + if(firsttime) { + for(a=0; a<BLENDER_MAX_THREADS; a++) { + memset(&imatex[a], 0, sizeof(Tex)); + default_tex(&imatex[a]); + imatex[a].type= TEX_IMAGE; + } + + firsttime= 0; + } + BLI_unlock_thread(LOCK_IMAGE); } - if(shi->ys & 1) tex= &tex1; else tex= &tex2; // threadsafe + tex= &imatex[shi->thread]; + tex->iuser.ok= ima->ok; texvec[0]= 0.5+0.5*suv->uv[0]; texvec[1]= 0.5+0.5*suv->uv[1]; @@ -2519,12 +2527,6 @@ void render_realtime_texture(ShadeInput *shi, Image *ima) if(shi->osatex) imagewraposa(tex, ima, NULL, texvec, dx, dy, &texr); else imagewrap(tex, ima, NULL, texvec, &texr); - if (tex->ima && tex->ima->flag & IMA_DO_PREMUL) { - texr.tr *= texr.ta; - texr.tg *= texr.ta; - texr.tb *= texr.ta; - } - shi->vcol[0]*= texr.tr; shi->vcol[1]*= texr.tg; shi->vcol[2]*= texr.tb; |