fix for re->partx/re->party values being different for RE_Database_FromScene() then the main render loop.

This commit is contained in:
Campbell Barton 2012-11-21 10:20:38 +00:00
parent 7ea3c5ed6d
commit 6033127324
5 changed files with 43 additions and 31 deletions

@ -40,8 +40,9 @@ struct Object;
void free_sample_tables(Render *re); void free_sample_tables(Render *re);
void make_sample_tables(Render *re); void make_sample_tables(Render *re);
void initparts(Render *re, int do_crop); void RE_parts_clamp(Render *re);
void freeparts(Render *re); void RE_parts_init(Render *re, int do_crop);
void RE_parts_free(Render *re);
#endif /* __INITRENDER_H__ */ #endif /* __INITRENDER_H__ */

@ -376,7 +376,7 @@ int RE_engine_render(Render *re, int do_all)
if ((re->r.scemode & (R_NO_FRAME_UPDATE | R_PREVIEWBUTS)) == 0) if ((re->r.scemode & (R_NO_FRAME_UPDATE | R_PREVIEWBUTS)) == 0)
BKE_scene_update_for_newframe(re->main, re->scene, re->lay); BKE_scene_update_for_newframe(re->main, re->scene, re->lay);
initparts(re, FALSE); RE_parts_init(re, FALSE);
engine->tile_x = re->partx; engine->tile_x = re->partx;
engine->tile_y = re->party; engine->tile_y = re->party;
@ -407,7 +407,7 @@ int RE_engine_render(Render *re, int do_all)
BLI_rw_mutex_unlock(&re->resultmutex); BLI_rw_mutex_unlock(&re->resultmutex);
} }
freeparts(re); RE_parts_free(re);
if (BKE_reports_contain(re->reports, RPT_ERROR)) if (BKE_reports_contain(re->reports, RPT_ERROR))
G.is_break = TRUE; G.is_break = TRUE;

@ -525,7 +525,7 @@ void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, flo
/* ~~~~~~~~~~~~~~~~ part (tile) calculus ~~~~~~~~~~~~~~~~~~~~~~ */ /* ~~~~~~~~~~~~~~~~ part (tile) calculus ~~~~~~~~~~~~~~~~~~~~~~ */
void freeparts(Render *re) void RE_parts_free(Render *re)
{ {
RenderPart *part = re->parts.first; RenderPart *part = re->parts.first;
@ -537,12 +537,19 @@ void freeparts(Render *re)
BLI_freelistN(&re->parts); BLI_freelistN(&re->parts);
} }
void initparts(Render *re, int do_crop) void RE_parts_clamp(Render *re)
{
/* part size */
re->partx = min_ii(re->r.tilex, re->rectx);
re->party = min_ii(re->r.tiley, re->recty);
}
void RE_parts_init(Render *re, int do_crop)
{ {
int nr, xd, yd, partx, party, xparts, yparts; int nr, xd, yd, partx, party, xparts, yparts;
int xminb, xmaxb, yminb, ymaxb; int xminb, xmaxb, yminb, ymaxb;
freeparts(re); RE_parts_free(re);
/* this is render info for caller, is not reset when parts are freed! */ /* this is render info for caller, is not reset when parts are freed! */
re->i.totpart = 0; re->i.totpart = 0;
@ -555,13 +562,10 @@ void initparts(Render *re, int do_crop)
xmaxb = re->disprect.xmax; xmaxb = re->disprect.xmax;
ymaxb = re->disprect.ymax; ymaxb = re->disprect.ymax;
/* part size */ RE_parts_clamp(re);
partx = min_ii(re->r.tilex, re->rectx);
party = min_ii(re->r.tiley, re->recty);
re->partx = partx;
re->party = party;
partx = re->partx;
party = re->party;
/* part count */ /* part count */
xparts = (re->rectx + partx - 1) / partx; xparts = (re->rectx + partx - 1) / partx;
yparts = (re->recty + party - 1) / party; yparts = (re->recty + party - 1) / party;

@ -693,7 +693,7 @@ static void *do_part_thread(void *pa_v)
/* calculus for how much 1 pixel rendered should rotate the 3d geometry */ /* calculus for how much 1 pixel rendered should rotate the 3d geometry */
/* is not that simple, needs to be corrected for errors of larger viewplane sizes */ /* is not that simple, needs to be corrected for errors of larger viewplane sizes */
/* called in initrender.c, initparts() and convertblender.c, for speedvectors */ /* called in initrender.c, RE_parts_init() and convertblender.c, for speedvectors */
float panorama_pixel_rot(Render *re) float panorama_pixel_rot(Render *re)
{ {
float psize, phi, xfac; float psize, phi, xfac;
@ -836,7 +836,7 @@ static void threaded_tile_processor(Render *re)
/* warning; no return here without closing exr file */ /* warning; no return here without closing exr file */
initparts(re, TRUE); RE_parts_init(re, TRUE);
if (re->result->do_exr_tile) if (re->result->do_exr_tile)
render_result_exr_file_begin(re); render_result_exr_file_begin(re);
@ -928,7 +928,7 @@ static void threaded_tile_processor(Render *re)
g_break = 0; g_break = 0;
BLI_end_threads(&threads); BLI_end_threads(&threads);
freeparts(re); RE_parts_free(re);
re->viewplane = viewplane; /* restore viewplane, modified by pano render */ re->viewplane = viewplane; /* restore viewplane, modified by pano render */
} }
@ -947,6 +947,7 @@ static void do_render_3d(Render *re)
return; return;
/* internal */ /* internal */
RE_parts_clamp(re);
// re->cfra= cfra; /* <- unused! */ // re->cfra= cfra; /* <- unused! */
re->scene->r.subframe = re->mblur_offs + re->field_offs; re->scene->r.subframe = re->mblur_offs + re->field_offs;

@ -1179,18 +1179,23 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
/* -------------------------- operations on entire database ----------------------- */ /* -------------------------- operations on entire database ----------------------- */
/* ugly function for halos in panorama */ /* ugly function for halos in panorama */
static int panotestclip(Render *re, int do_pano, float *v) static int panotestclip(Render *re, int do_pano, float v[4])
{ {
/* to be used for halos en infos */ /* part size (ensure we run RE_parts_clamp first) */
float abs4; BLI_assert(re->partx == min_ii(re->r.tilex, re->rectx));
short c=0; BLI_assert(re->party == min_ii(re->r.tiley, re->recty));
int xparts = (re->rectx + re->partx - 1) / re->partx;
if (do_pano == FALSE) { if (do_pano == FALSE) {
return testclip(v); return testclip(v);
} }
else {
/* to be used for halos en infos */
float abs4;
short c = 0;
abs4= fabs(v[3]); int xparts = (re->rectx + re->partx - 1) / re->partx;
abs4= fabsf(v[3]);
if (v[2]< -abs4) c=16; /* this used to be " if (v[2]<0) ", see clippz() */ if (v[2]< -abs4) c=16; /* this used to be " if (v[2]<0) ", see clippz() */
else if (v[2]> abs4) c+= 32; else if (v[2]> abs4) c+= 32;
@ -1204,6 +1209,7 @@ static int panotestclip(Render *re, int do_pano, float *v)
return c; return c;
} }
}
/** /**
* This adds the hcs coordinates to vertices. It iterates over all * This adds the hcs coordinates to vertices. It iterates over all