diff options
Diffstat (limited to 'source/blender/render/intern/source/convertblender.c')
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 01a347e37c7..1da1a81fe95 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -577,6 +577,17 @@ static void autosmooth(Render *UNUSED(re), ObjectRen *obr, float mat[4][4], shor VlakRen *vlr; int a, totvert; + float rot[3][3]; + + /* Note: For normals, we only want rotation, not scaling component. + * Negative scales (aka mirroring) give wrong results, see T44102. */ + if (lnors) { + float mat3[3][3], size[3]; + + copy_m3_m4(mat3, mat); + mat3_to_rot_size(rot, size, mat3); + } + if (obr->totvert == 0) return; @@ -611,9 +622,8 @@ static void autosmooth(Render *UNUSED(re), ObjectRen *obr, float mat[4][4], shor ver = RE_findOrAddVert(obr, a); mul_m4_v3(mat, ver->co); if (lnors) { - mul_mat3_m4_v3(mat, ver->n); + mul_m3_v3(rot, ver->n); negate_v3(ver->n); - normalize_v3(ver->n); } } for (a = 0; a < obr->totvlak; a++) { @@ -1199,8 +1209,7 @@ static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re sd->time = 0.0f; sd->size = hasize; - copy_v3_v3(vel, state->vel); - mul_mat3_m4_v3(re->viewmat, vel); + mul_v3_mat3_m4v3(vel, re->viewmat, state->vel); normalize_v3(vel); if (part->draw & PART_DRAW_VEL_LENGTH) @@ -1258,7 +1267,7 @@ static void get_particle_uvco_mcol(short from, DerivedMesh *dm, float *fuv, int /* get mcol */ if (sd->mcol && ELEM(from, PART_FROM_FACE, PART_FROM_VOLUME)) { for (i=0; i<sd->totcol; i++) { - if (num != DMCACHE_NOTFOUND) { + if (!ELEM(num, DMCACHE_NOTFOUND, DMCACHE_ISCHILD)) { MFace *mface = dm->getTessFaceData(dm, num, CD_MFACE); MCol *mc = (MCol*)CustomData_get_layer_n(&dm->faceData, CD_MCOL, i); mc += num * 4; @@ -3270,12 +3279,13 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) for (a1=0; (a1<ob->totcol || (a1==0 && ob->totcol==0)); a1++) { ma= give_render_material(re, ob, a1+1); - + /* test for 100% transparent */ ok = 1; if ((ma->alpha == 0.0f) && (ma->spectra == 0.0f) && - (ma->filter == 0.0f) && + /* No need to test filter here, it's only active with MA_RAYTRANSP and we check against it below. */ + /* (ma->filter == 0.0f) && */ (ma->mode & MA_TRANSP) && (ma->mode & (MA_RAYTRANSP | MA_RAYMIRROR)) == 0) { @@ -3803,7 +3813,9 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) } /* set flag for spothalo en initvars */ - if (la->type==LA_SPOT && (la->mode & LA_HALO) && (la->buftype != LA_SHADBUF_DEEP)) { + if ((la->type == LA_SPOT) && (la->mode & LA_HALO) && + (!(la->mode & LA_SHAD_BUF) || la->buftype != LA_SHADBUF_DEEP)) + { if (la->haint>0.0f) { re->flag |= R_LAMPHALO; @@ -3822,7 +3834,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) lar->sh_invcampos[2]*= lar->sh_zfac; /* halfway shadow buffer doesn't work for volumetric effects */ - if (lar->buftype == LA_SHADBUF_HALFWAY) + if (ELEM(lar->buftype, LA_SHADBUF_HALFWAY, LA_SHADBUF_DEEP)) lar->buftype = LA_SHADBUF_REGULAR; } @@ -4992,7 +5004,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp * system need to have render settings set for dupli particles */ dupli_render_particle_set(re, ob, timeoffset, 0, 1); duplilist = object_duplilist(re->eval_ctx, re->scene, ob); - duplilist_apply_data = duplilist_apply(ob, duplilist); + duplilist_apply_data = duplilist_apply(ob, NULL, duplilist); dupli_render_particle_set(re, ob, timeoffset, 0, 0); for (dob= duplilist->first, i = 0; dob; dob= dob->next, ++i) { @@ -5159,8 +5171,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l * above call to BKE_scene_update_for_newframe, fixes bug. [#22702]. * following calls don't depend on 'RE_SetCamera' */ RE_SetCamera(re, camera); - - normalize_m4_m4(mat, camera->obmat); + RE_GetCameraModelMatrix(re, camera, mat); invert_m4(mat); RE_SetView(re, mat); @@ -5330,7 +5341,8 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la /* if no camera, viewmat should have been set! */ if (camera) { - normalize_m4_m4(mat, camera->obmat); + RE_GetCameraModelMatrix(re, camera, mat); + normalize_m4(mat); invert_m4(mat); RE_SetView(re, mat); } @@ -5841,9 +5853,11 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, /* renderdata setup and exceptions */ BLI_freelistN(&re->r.layers); + BLI_freelistN(&re->r.views); re->r = scene->r; BLI_duplicatelist(&re->r.layers, &scene->r.layers); - + BLI_duplicatelist(&re->r.views, &scene->r.views); + RE_init_threadcount(re); re->flag |= R_BAKING; |