Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/render/render_internal.c
| Show First 20 Lines • Show All 1,061 Lines • ▼ Show 20 Lines | |||||
| typedef struct RenderPreview { | typedef struct RenderPreview { | ||||
| /* from wmJob */ | /* from wmJob */ | ||||
| void *owner; | void *owner; | ||||
| short *stop, *do_update; | short *stop, *do_update; | ||||
| wmJob *job; | wmJob *job; | ||||
| Scene *scene; | Scene *scene; | ||||
| Depsgraph *depsgraph; | |||||
| ScrArea *sa; | ScrArea *sa; | ||||
| ARegion *ar; | ARegion *ar; | ||||
| View3D *v3d; | View3D *v3d; | ||||
| RegionView3D *rv3d; | RegionView3D *rv3d; | ||||
| Main *bmain; | Main *bmain; | ||||
| RenderEngine *engine; | RenderEngine *engine; | ||||
| float viewmat[4][4]; | float viewmat[4][4]; | ||||
| int start_resolution_divider; | int start_resolution_divider; | ||||
| int resolution_divider; | int resolution_divider; | ||||
| bool has_freestyle; | bool has_freestyle; | ||||
| } RenderPreview; | } RenderPreview; | ||||
| static int render_view3d_disprect(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, rcti *disprect) | static int render_view3d_disprect(Scene *scene, const Depsgraph *depsgraph, | ||||
| ARegion *ar, View3D *v3d, RegionView3D *rv3d, rcti *disprect) | |||||
| { | { | ||||
| /* copied code from view3d_draw.c */ | /* copied code from view3d_draw.c */ | ||||
| rctf viewborder; | rctf viewborder; | ||||
| int draw_border; | int draw_border; | ||||
| if (rv3d->persp == RV3D_CAMOB) | if (rv3d->persp == RV3D_CAMOB) | ||||
| draw_border = (scene->r.mode & R_BORDER) != 0; | draw_border = (scene->r.mode & R_BORDER) != 0; | ||||
| else | else | ||||
| draw_border = (v3d->flag2 & V3D_RENDER_BORDER) != 0; | draw_border = (v3d->flag2 & V3D_RENDER_BORDER) != 0; | ||||
| if (draw_border) { | if (draw_border) { | ||||
| if (rv3d->persp == RV3D_CAMOB) { | if (rv3d->persp == RV3D_CAMOB) { | ||||
| ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &viewborder, false); | ED_view3d_calc_camera_border(scene, depsgraph, ar, v3d, rv3d, &viewborder, false); | ||||
| disprect->xmin = viewborder.xmin + scene->r.border.xmin * BLI_rctf_size_x(&viewborder); | disprect->xmin = viewborder.xmin + scene->r.border.xmin * BLI_rctf_size_x(&viewborder); | ||||
| disprect->ymin = viewborder.ymin + scene->r.border.ymin * BLI_rctf_size_y(&viewborder); | disprect->ymin = viewborder.ymin + scene->r.border.ymin * BLI_rctf_size_y(&viewborder); | ||||
| disprect->xmax = viewborder.xmin + scene->r.border.xmax * BLI_rctf_size_x(&viewborder); | disprect->xmax = viewborder.xmin + scene->r.border.xmax * BLI_rctf_size_x(&viewborder); | ||||
| disprect->ymax = viewborder.ymin + scene->r.border.ymax * BLI_rctf_size_y(&viewborder); | disprect->ymax = viewborder.ymin + scene->r.border.ymax * BLI_rctf_size_y(&viewborder); | ||||
| } | } | ||||
| else { | else { | ||||
| disprect->xmin = v3d->render_border.xmin * ar->winx; | disprect->xmin = v3d->render_border.xmin * ar->winx; | ||||
| disprect->xmax = v3d->render_border.xmax * ar->winx; | disprect->xmax = v3d->render_border.xmax * ar->winx; | ||||
| disprect->ymin = v3d->render_border.ymin * ar->winy; | disprect->ymin = v3d->render_border.ymin * ar->winy; | ||||
| disprect->ymax = v3d->render_border.ymax * ar->winy; | disprect->ymax = v3d->render_border.ymax * ar->winy; | ||||
| } | } | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| BLI_rcti_init(disprect, 0, 0, 0, 0); | BLI_rcti_init(disprect, 0, 0, 0, 0); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| /* returns true if OK */ | /* returns true if OK */ | ||||
| static bool render_view3d_get_rects(ARegion *ar, View3D *v3d, RegionView3D *rv3d, rctf *viewplane, RenderEngine *engine, | static bool render_view3d_get_rects( | ||||
| const Depsgraph *depsgraph, | |||||
| ARegion *ar, View3D *v3d, RegionView3D *rv3d, rctf *viewplane, RenderEngine *engine, | |||||
| float *r_clipsta, float *r_clipend, float *r_pixsize, bool *r_ortho) | float *r_clipsta, float *r_clipend, float *r_pixsize, bool *r_ortho) | ||||
| { | { | ||||
| if (ar->winx < 4 || ar->winy < 4) return false; | if (ar->winx < 4 || ar->winy < 4) return false; | ||||
| *r_ortho = ED_view3d_viewplane_get(v3d, rv3d, ar->winx, ar->winy, viewplane, r_clipsta, r_clipend, r_pixsize); | *r_ortho = ED_view3d_viewplane_get(depsgraph, v3d, rv3d, ar->winx, ar->winy, viewplane, r_clipsta, r_clipend, r_pixsize); | ||||
| engine->resolution_x = ar->winx; | engine->resolution_x = ar->winx; | ||||
| engine->resolution_y = ar->winy; | engine->resolution_y = ar->winy; | ||||
| return true; | return true; | ||||
| } | } | ||||
| static bool render_view3d_is_valid(RenderPreview *rp) | static bool render_view3d_is_valid(RenderPreview *rp) | ||||
| ▲ Show 20 Lines • Show All 90 Lines • ▼ Show 20 Lines | static void render_view3d_startjob(void *customdata, short *stop, short *do_update, float *UNUSED(progress)) | ||||
| update_flag = rp->engine->job_update_flag; | update_flag = rp->engine->job_update_flag; | ||||
| rp->engine->job_update_flag = 0; | 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); | //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; | G.is_break = false; | ||||
| if (false == render_view3d_get_rects(rp->ar, rp->v3d, rp->rv3d, &viewplane, rp->engine, &clipsta, &clipend, &pixsize, &orth)) | if (false == render_view3d_get_rects(rp->depsgraph, rp->ar, rp->v3d, rp->rv3d, &viewplane, rp->engine, &clipsta, &clipend, &pixsize, &orth)) | ||||
| return; | return; | ||||
| rp->stop = stop; | rp->stop = stop; | ||||
| rp->do_update = do_update; | rp->do_update = do_update; | ||||
| // printf("Enter previewrender\n"); | // printf("Enter previewrender\n"); | ||||
| /* ok, are we rendering all over? */ | /* ok, are we rendering all over? */ | ||||
| Show All 16 Lines | if (update_flag & PR_UPDATE_VIEW) { | ||||
| */ | */ | ||||
| for (object = rp->bmain->object.first; object; object = object->id.next) { | for (object = rp->bmain->object.first; object; object = object->id.next) { | ||||
| float mat[4][4]; | float mat[4][4]; | ||||
| mul_m4_m4m4(mat, rp->viewmat, object->obmat); | mul_m4_m4m4(mat, rp->viewmat, object->obmat); | ||||
| invert_m4_m4(object->imat_ren, mat); | invert_m4_m4(object->imat_ren, mat); | ||||
| } | } | ||||
| } | } | ||||
| use_border = render_view3d_disprect(rp->scene, rp->ar, rp->v3d, | use_border = render_view3d_disprect(rp->scene, rp->depsgraph, | ||||
| rp->rv3d, &cliprct); | rp->ar, rp->v3d, rp->rv3d, | ||||
| &cliprct); | |||||
| if ((update_flag & (PR_UPDATE_RENDERSIZE | PR_UPDATE_DATABASE | PR_UPDATE_VIEW)) || rstats->convertdone == 0) { | if ((update_flag & (PR_UPDATE_RENDERSIZE | PR_UPDATE_DATABASE | PR_UPDATE_VIEW)) || rstats->convertdone == 0) { | ||||
| RenderData rdata; | RenderData rdata; | ||||
| /* no osa, blur, seq, layers, savebuffer etc for preview render */ | /* no osa, blur, seq, layers, savebuffer etc for preview render */ | ||||
| rdata = rp->scene->r; | rdata = rp->scene->r; | ||||
| rdata.mode &= ~(R_OSA | R_MBLUR | R_BORDER | R_PANORAMA); | rdata.mode &= ~(R_OSA | R_MBLUR | R_BORDER | R_PANORAMA); | ||||
| rdata.scemode &= ~(R_DOSEQ | R_DOCOMP | R_FREE_IMAGE | R_EXR_TILE_FILE | R_FULL_SAMPLE); | rdata.scemode &= ~(R_DOSEQ | R_DOCOMP | R_FREE_IMAGE | R_EXR_TILE_FILE | R_FULL_SAMPLE); | ||||
| ▲ Show 20 Lines • Show All 106 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| static bool render_view3d_flag_changed(RenderEngine *engine, const bContext *C) | static bool render_view3d_flag_changed(RenderEngine *engine, const bContext *C) | ||||
| { | { | ||||
| RegionView3D *rv3d = CTX_wm_region_view3d(C); | RegionView3D *rv3d = CTX_wm_region_view3d(C); | ||||
| View3D *v3d = CTX_wm_view3d(C); | View3D *v3d = CTX_wm_view3d(C); | ||||
| ARegion *ar = CTX_wm_region(C); | ARegion *ar = CTX_wm_region(C); | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| Depsgraph *depsgraph = CTX_data_depsgraph(C); | |||||
| Render *re; | Render *re; | ||||
| rctf viewplane; | rctf viewplane; | ||||
| rcti disprect; | rcti disprect; | ||||
| float clipsta, clipend; | float clipsta, clipend; | ||||
| bool orth; | bool orth; | ||||
| int job_update_flag = 0; | int job_update_flag = 0; | ||||
| char name[32]; | char name[32]; | ||||
| Show All 33 Lines | if (engine->last_winx != ar->winx || engine->last_winy != ar->winy) { | ||||
| job_update_flag |= PR_UPDATE_RENDERSIZE; | job_update_flag |= PR_UPDATE_RENDERSIZE; | ||||
| } | } | ||||
| if (compare_m4m4(engine->last_viewmat, rv3d->viewmat, 0.00001f) == 0) { | if (compare_m4m4(engine->last_viewmat, rv3d->viewmat, 0.00001f) == 0) { | ||||
| copy_m4_m4(engine->last_viewmat, rv3d->viewmat); | copy_m4_m4(engine->last_viewmat, rv3d->viewmat); | ||||
| job_update_flag |= PR_UPDATE_VIEW; | job_update_flag |= PR_UPDATE_VIEW; | ||||
| } | } | ||||
| render_view3d_get_rects(ar, v3d, rv3d, &viewplane, engine, &clipsta, &clipend, NULL, &orth); | render_view3d_get_rects(depsgraph, ar, v3d, rv3d, &viewplane, engine, &clipsta, &clipend, NULL, &orth); | ||||
| if (BLI_rctf_compare(&viewplane, &engine->last_viewplane, 0.00001f) == 0) { | if (BLI_rctf_compare(&viewplane, &engine->last_viewplane, 0.00001f) == 0) { | ||||
| engine->last_viewplane = viewplane; | engine->last_viewplane = viewplane; | ||||
| job_update_flag |= PR_UPDATE_VIEW; | job_update_flag |= PR_UPDATE_VIEW; | ||||
| } | } | ||||
| render_view3d_disprect(scene, ar, v3d, rv3d, &disprect); | render_view3d_disprect(scene, depsgraph, ar, v3d, rv3d, &disprect); | ||||
| if (BLI_rcti_compare(&disprect, &engine->last_disprect) == 0) { | if (BLI_rcti_compare(&disprect, &engine->last_disprect) == 0) { | ||||
| engine->last_disprect = disprect; | engine->last_disprect = disprect; | ||||
| job_update_flag |= PR_UPDATE_RENDERSIZE; | job_update_flag |= PR_UPDATE_RENDERSIZE; | ||||
| } | } | ||||
| /* any changes? go ahead and rerender */ | /* any changes? go ahead and rerender */ | ||||
| if (job_update_flag) { | if (job_update_flag) { | ||||
| engine->job_update_flag |= job_update_flag; | engine->job_update_flag |= job_update_flag; | ||||
| return true; | return true; | ||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| static void render_view3d_do(RenderEngine *engine, const bContext *C) | static void render_view3d_do(RenderEngine *engine, const bContext *C) | ||||
| { | { | ||||
| wmJob *wm_job; | wmJob *wm_job; | ||||
| RenderPreview *rp; | RenderPreview *rp; | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| Depsgraph *depsgraph = CTX_data_depsgraph(C); | |||||
| ARegion *ar = CTX_wm_region(C); | ARegion *ar = CTX_wm_region(C); | ||||
| int width = ar->winx, height = ar->winy; | int width = ar->winx, height = ar->winy; | ||||
| int divider = BKE_render_preview_pixel_size(&scene->r); | int divider = BKE_render_preview_pixel_size(&scene->r); | ||||
| int resolution_threshold = scene->r.preview_start_resolution * | int resolution_threshold = scene->r.preview_start_resolution * | ||||
| scene->r.preview_start_resolution; | scene->r.preview_start_resolution; | ||||
| if (CTX_wm_window(C) == NULL) | if (CTX_wm_window(C) == NULL) | ||||
| return; | return; | ||||
| if (!render_view3d_flag_changed(engine, C)) | if (!render_view3d_flag_changed(engine, C)) | ||||
| return; | return; | ||||
| wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), CTX_wm_region(C), "Render Preview", | wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), CTX_wm_region(C), "Render Preview", | ||||
| WM_JOB_EXCL_RENDER, WM_JOB_TYPE_RENDER_PREVIEW); | WM_JOB_EXCL_RENDER, WM_JOB_TYPE_RENDER_PREVIEW); | ||||
| rp = MEM_callocN(sizeof(RenderPreview), "render preview"); | rp = MEM_callocN(sizeof(RenderPreview), "render preview"); | ||||
| rp->job = wm_job; | rp->job = wm_job; | ||||
| while (width * height > resolution_threshold) { | while (width * height > resolution_threshold) { | ||||
| width = max_ii(1, width / 2); | width = max_ii(1, width / 2); | ||||
| height = max_ii(1, height / 2); | height = max_ii(1, height / 2); | ||||
| divider *= 2; | divider *= 2; | ||||
| } | } | ||||
| /* customdata for preview thread */ | /* customdata for preview thread */ | ||||
| rp->scene = scene; | rp->scene = scene; | ||||
| rp->depsgraph = depsgraph; | |||||
| rp->engine = engine; | rp->engine = engine; | ||||
| rp->sa = CTX_wm_area(C); | rp->sa = CTX_wm_area(C); | ||||
| rp->ar = CTX_wm_region(C); | rp->ar = CTX_wm_region(C); | ||||
| rp->v3d = rp->sa->spacedata.first; | rp->v3d = rp->sa->spacedata.first; | ||||
| rp->rv3d = CTX_wm_region_view3d(C); | rp->rv3d = CTX_wm_region_view3d(C); | ||||
| rp->bmain = CTX_data_main(C); | rp->bmain = CTX_data_main(C); | ||||
| rp->resolution_divider = divider; | rp->resolution_divider = divider; | ||||
| rp->start_resolution_divider = divider; | rp->start_resolution_divider = divider; | ||||
| ▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | void render_view3d_draw(RenderEngine *engine, const bContext *C) | ||||
| /* Viewport render preview doesn't support multiview, view hardcoded to 0 */ | /* Viewport render preview doesn't support multiview, view hardcoded to 0 */ | ||||
| RE_AcquireResultImage(re, &rres, 0); | RE_AcquireResultImage(re, &rres, 0); | ||||
| if (rres.rectf) { | if (rres.rectf) { | ||||
| RegionView3D *rv3d = CTX_wm_region_view3d(C); | RegionView3D *rv3d = CTX_wm_region_view3d(C); | ||||
| View3D *v3d = CTX_wm_view3d(C); | View3D *v3d = CTX_wm_view3d(C); | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| Depsgraph *depsgraph = CTX_data_depsgraph(C); | |||||
| ARegion *ar = CTX_wm_region(C); | ARegion *ar = CTX_wm_region(C); | ||||
| bool force_fallback = false; | bool force_fallback = false; | ||||
| bool need_fallback = true; | bool need_fallback = true; | ||||
| float dither = scene->r.dither_intensity; | float dither = scene->r.dither_intensity; | ||||
| float scale_x, scale_y; | float scale_x, scale_y; | ||||
| rcti clip_rect; | rcti clip_rect; | ||||
| int xof, yof; | int xof, yof; | ||||
| if (render_view3d_disprect(scene, ar, v3d, rv3d, &clip_rect)) { | if (render_view3d_disprect(scene, depsgraph, ar, v3d, rv3d, &clip_rect)) { | ||||
| scale_x = (float) BLI_rcti_size_x(&clip_rect) / rres.rectx; | scale_x = (float) BLI_rcti_size_x(&clip_rect) / rres.rectx; | ||||
| scale_y = (float) BLI_rcti_size_y(&clip_rect) / rres.recty; | scale_y = (float) BLI_rcti_size_y(&clip_rect) / rres.recty; | ||||
| xof = clip_rect.xmin; | xof = clip_rect.xmin; | ||||
| yof = clip_rect.ymin; | yof = clip_rect.ymin; | ||||
| } | } | ||||
| else { | else { | ||||
| scale_x = (float) ar->winx / rres.rectx; | scale_x = (float) ar->winx / rres.rectx; | ||||
| scale_y = (float) ar->winy / rres.recty; | scale_y = (float) ar->winy / rres.recty; | ||||
| ▲ Show 20 Lines • Show All 161 Lines • Show Last 20 Lines | |||||