static void render_update_resolution(Render *re, const RenderPreview *rp, bool use_border, const rcti *clip_rect) { int winx = rp->ar->winx / rp->resolution_divider; int winy = rp->ar->winy / rp->resolution_divider; if (use_border) { rcti scaled_cliprct; rcti_scale_coords(&scaled_cliprct, clip_rect, 1.0f / rp->resolution_divider); RE_ChangeResolution(re, winx, winy, &scaled_cliprct); } else { RE_ChangeResolution(re, winx, winy, NULL); } if (rp->has_freestyle) { if (rp->resolution_divider == 1) { RE_ChangeModeFlag(re, R_EDGE_FRS, false); } else { RE_ChangeModeFlag(re, R_EDGE_FRS, true); } } }
static void render_view3d_startjob(void *customdata, short *stop, short *do_update, float *UNUSED(progress)) { RenderPreview *rp = customdata; Render *re; RenderStats *rstats; rctf viewplane; rcti cliprct; float clipsta, clipend, pixsize; bool orth, restore = 0; char name[32]; int update_flag; update_flag = rp->engine->job_update_flag; rp->engine->job_update_flag = 0; //printf("ma %d res %d view %d db %d\n", update_flag & PR_UPDATE_MATERIAL, update_flag & PR_UPDATE_RENDERSIZE, update_flag & PR_UPDATE_VIEW, update_flag & PR_UPDATE_DATABASE); G.is_break = false; if (false == render_view3d_get_rects(rp->ar, rp->v3d, rp->rv3d, &viewplane, rp->engine, &clipsta, &clipend, &pixsize, &orth)) return; rp->stop = stop; rp->do_update = do_update; // printf("Enter previewrender\n"); /* ok, are we rendering all over? */ sprintf(name, "View3dPreview %p", (void *)rp->ar); re = rp->engine->re = RE_GetRender(name); /* set this always, rp is different for each job */ RE_test_break_cb(re, rp, render_view3d_break); RE_display_update_cb(re, rp, render_view3d_display_update); RE_stats_draw_cb(re, rp, render_view3d_renderinfo_cb); rstats = RE_GetStats(re); if (update_flag & PR_UPDATE_VIEW) { rp->resolution_divider = START_RESOLUTION_DIVIDER; } if ((update_flag & (PR_UPDATE_RENDERSIZE | PR_UPDATE_DATABASE)) || rstats->convertdone == 0) { RenderData rdata; int winx = rp->ar->winx / rp->resolution_divider, winy = rp->ar->winy / rp->resolution_divider; /* no osa, blur, seq, layers, etc for preview render */ rdata = rp->scene->r; rdata.mode &= ~(R_OSA | R_MBLUR | R_BORDER | R_PANORAMA); rdata.scemode &= ~(R_DOSEQ | R_DOCOMP | R_FREE_IMAGE); rdata.scemode |= R_VIEWPORT_PREVIEW; /* we do use layers, but only active */ rdata.scemode |= R_SINGLE_LAYER; /* initalize always */ if (render_view3d_disprect(rp->scene, rp->ar, rp->v3d, rp->rv3d, &cliprct)) { rdata.mode |= R_BORDER; RE_InitState(re, NULL, &rdata, NULL, winx, winy, &cliprct); } else RE_InitState(re, NULL, &rdata, NULL, winx, winy, NULL); } else if (update_flag & PR_UPDATE_VIEW) { int winx = rp->ar->winx / rp->resolution_divider, winy = rp->ar->winy / rp->resolution_divider; RE_ChangeResolution(re, winx, winy, NULL); } if (orth) RE_SetOrtho(re, &viewplane, clipsta, clipend); else RE_SetWindow(re, &viewplane, clipsta, clipend); RE_SetPixelSize(re, pixsize); if ((update_flag & PR_UPDATE_DATABASE) || rstats->convertdone == 0) { unsigned int lay = rp->scene->lay; /* allow localview render for objects with lights in normal layers */ if (rp->v3d->lay & 0xFF000000) lay |= rp->v3d->lay; else lay = rp->v3d->lay; RE_SetView(re, rp->viewmat); /* copying blender data while main thread is locked, to avoid crashes */ WM_job_main_thread_lock_acquire(rp->job); RE_Database_Free(re); RE_Database_FromScene(re, rp->bmain, rp->scene, lay, 0); // 0= dont use camera view WM_job_main_thread_lock_release(rp->job); /* do preprocessing like building raytree, shadows, volumes, SSS */ RE_Database_Preprocess(re); /* conversion not completed, need to do it again */ if (!rstats->convertdone) { if (render_view3d_is_valid(rp)) { rp->engine->job_update_flag |= PR_UPDATE_DATABASE; } } // printf("dbase update\n"); } else { // printf("dbase rotate\n"); RE_DataBase_IncrementalView(re, rp->viewmat, 0); restore = 1; } RE_DataBase_ApplyWindow(re); /* OK, can we enter render code? */ if (rstats->convertdone) { for (;;) { RE_TileProcessor(re); if (!*stop && rp->resolution_divider > 1) { int winx, winy; rp->resolution_divider /= 2; winx = rp->ar->winx / rp->resolution_divider; winy = rp->ar->winy / rp->resolution_divider; *do_update = 1; RE_ChangeResolution(re, winx, winy, NULL); /* Otherwise shadows are incorrect. */ if (orth) { RE_SetOrtho(re, &viewplane, clipsta, clipend); } else { RE_SetWindow(re, &viewplane, clipsta, clipend); } } else { break; } } /* always rotate back */ if (restore) RE_DataBase_IncrementalView(re, rp->viewmat, 1); } }