Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/render/render_opengl.c
| Show First 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | |||||
| // For really highres renders it might fail still. | // For really highres renders it might fail still. | ||||
| #define MAX_SCHEDULED_FRAMES 8 | #define MAX_SCHEDULED_FRAMES 8 | ||||
| typedef struct OGLRender { | typedef struct OGLRender { | ||||
| Main *bmain; | Main *bmain; | ||||
| Render *re; | Render *re; | ||||
| Scene *scene; | Scene *scene; | ||||
| WorkSpace *workspace; | WorkSpace *workspace; | ||||
| SceneLayer *scene_layer; | ViewLayer *view_layer; | ||||
| Depsgraph *depsgraph; | Depsgraph *depsgraph; | ||||
| View3D *v3d; | View3D *v3d; | ||||
| RegionView3D *rv3d; | RegionView3D *rv3d; | ||||
| ARegion *ar; | ARegion *ar; | ||||
| ScrArea *prevsa; | ScrArea *prevsa; | ||||
| ARegion *prevar; | ARegion *prevar; | ||||
| ▲ Show 20 Lines • Show All 157 Lines • ▼ Show 20 Lines | static void screen_opengl_views_setup(OGLRender *oglrender) | ||||
| } | } | ||||
| RE_ReleaseResult(oglrender->re); | RE_ReleaseResult(oglrender->re); | ||||
| } | } | ||||
| static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, RenderResult *rr) | static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, RenderResult *rr) | ||||
| { | { | ||||
| Scene *scene = oglrender->scene; | Scene *scene = oglrender->scene; | ||||
| SceneLayer *scene_layer = oglrender->scene_layer; | ViewLayer *view_layer = oglrender->view_layer; | ||||
| ARegion *ar = oglrender->ar; | ARegion *ar = oglrender->ar; | ||||
| View3D *v3d = oglrender->v3d; | View3D *v3d = oglrender->v3d; | ||||
| RegionView3D *rv3d = oglrender->rv3d; | RegionView3D *rv3d = oglrender->rv3d; | ||||
| Object *camera = NULL; | Object *camera = NULL; | ||||
| int sizex = oglrender->sizex; | int sizex = oglrender->sizex; | ||||
| int sizey = oglrender->sizey; | int sizey = oglrender->sizey; | ||||
| const short view_context = (v3d != NULL); | const short view_context = (v3d != NULL); | ||||
| bool draw_bgpic = true; | bool draw_bgpic = true; | ||||
| ▲ Show 20 Lines • Show All 68 Lines • ▼ Show 20 Lines | static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, RenderResult *rr) | ||||
| else { | else { | ||||
| /* shouldnt suddenly give errors mid-render but possible */ | /* shouldnt suddenly give errors mid-render but possible */ | ||||
| char err_out[256] = "unknown"; | char err_out[256] = "unknown"; | ||||
| ImBuf *ibuf_view; | ImBuf *ibuf_view; | ||||
| const int alpha_mode = (draw_sky) ? R_ADDSKY : R_ALPHAPREMUL; | const int alpha_mode = (draw_sky) ? R_ADDSKY : R_ALPHAPREMUL; | ||||
| if (view_context) { | if (view_context) { | ||||
| ibuf_view = ED_view3d_draw_offscreen_imbuf( | ibuf_view = ED_view3d_draw_offscreen_imbuf( | ||||
| &eval_ctx, scene, scene_layer, v3d, ar, sizex, sizey, | &eval_ctx, scene, view_layer, v3d, ar, sizex, sizey, | ||||
| IB_rect, draw_bgpic, | IB_rect, draw_bgpic, | ||||
| alpha_mode, oglrender->ofs_samples, oglrender->ofs_full_samples, viewname, | alpha_mode, oglrender->ofs_samples, oglrender->ofs_full_samples, viewname, | ||||
| oglrender->fx, oglrender->ofs, err_out); | oglrender->fx, oglrender->ofs, err_out); | ||||
| /* for stamp only */ | /* for stamp only */ | ||||
| if (rv3d->persp == RV3D_CAMOB && v3d->camera) { | if (rv3d->persp == RV3D_CAMOB && v3d->camera) { | ||||
| camera = BKE_camera_multiview_render(oglrender->scene, v3d->camera, viewname); | camera = BKE_camera_multiview_render(oglrender->scene, v3d->camera, viewname); | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| ibuf_view = ED_view3d_draw_offscreen_imbuf_simple( | ibuf_view = ED_view3d_draw_offscreen_imbuf_simple( | ||||
| &eval_ctx, scene, scene_layer, scene->camera, oglrender->sizex, oglrender->sizey, | &eval_ctx, scene, view_layer, scene->camera, oglrender->sizex, oglrender->sizey, | ||||
| IB_rect, OB_SOLID, false, true, true, | IB_rect, OB_SOLID, false, true, true, | ||||
| alpha_mode, oglrender->ofs_samples, oglrender->ofs_full_samples, viewname, | alpha_mode, oglrender->ofs_samples, oglrender->ofs_full_samples, viewname, | ||||
| oglrender->fx, oglrender->ofs, err_out); | oglrender->fx, oglrender->ofs, err_out); | ||||
| camera = scene->camera; | camera = scene->camera; | ||||
| } | } | ||||
| if (ibuf_view) { | if (ibuf_view) { | ||||
| ibuf_result = ibuf_view; | ibuf_result = ibuf_view; | ||||
| ▲ Show 20 Lines • Show All 283 Lines • ▼ Show 20 Lines | static bool screen_opengl_render_init(bContext *C, wmOperator *op) | ||||
| oglrender->ofs = ofs; | oglrender->ofs = ofs; | ||||
| oglrender->ofs_samples = samples; | oglrender->ofs_samples = samples; | ||||
| oglrender->ofs_full_samples = full_samples; | oglrender->ofs_full_samples = full_samples; | ||||
| oglrender->sizex = sizex; | oglrender->sizex = sizex; | ||||
| oglrender->sizey = sizey; | oglrender->sizey = sizey; | ||||
| oglrender->bmain = CTX_data_main(C); | oglrender->bmain = CTX_data_main(C); | ||||
| oglrender->scene = scene; | oglrender->scene = scene; | ||||
| oglrender->workspace = workspace; | oglrender->workspace = workspace; | ||||
| oglrender->scene_layer = CTX_data_scene_layer(C); | oglrender->view_layer = CTX_data_view_layer(C); | ||||
| oglrender->depsgraph = CTX_data_depsgraph(C); | oglrender->depsgraph = CTX_data_depsgraph(C); | ||||
| oglrender->cfrao = scene->r.cfra; | oglrender->cfrao = scene->r.cfra; | ||||
| oglrender->write_still = is_write_still && !is_animation; | oglrender->write_still = is_write_still && !is_animation; | ||||
| oglrender->is_animation = is_animation; | oglrender->is_animation = is_animation; | ||||
| oglrender->views_len = BKE_scene_multiview_num_views_get(&scene->r); | oglrender->views_len = BKE_scene_multiview_num_views_get(&scene->r); | ||||
| Show All 32 Lines | static bool screen_opengl_render_init(bContext *C, wmOperator *op) | ||||
| oglrender->ima = BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); | oglrender->ima = BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); | ||||
| BKE_image_signal(oglrender->ima, NULL, IMA_SIGNAL_FREE); | BKE_image_signal(oglrender->ima, NULL, IMA_SIGNAL_FREE); | ||||
| BKE_image_backup_render(oglrender->scene, oglrender->ima, true); | BKE_image_backup_render(oglrender->scene, oglrender->ima, true); | ||||
| oglrender->iuser.scene = scene; | oglrender->iuser.scene = scene; | ||||
| oglrender->iuser.ok = 1; | oglrender->iuser.ok = 1; | ||||
| /* create render result */ | /* create render result */ | ||||
| RE_InitState(oglrender->re, NULL, &scene->r, &scene->render_layers, scene->active_layer, view_render, NULL, sizex, sizey, NULL); | RE_InitState(oglrender->re, NULL, &scene->r, &scene->view_layers, scene->active_view_layer, view_render, NULL, sizex, sizey, NULL); | ||||
| /* create render views */ | /* create render views */ | ||||
| screen_opengl_views_setup(oglrender); | screen_opengl_views_setup(oglrender); | ||||
| /* wm vars */ | /* wm vars */ | ||||
| oglrender->wm = wm; | oglrender->wm = wm; | ||||
| oglrender->win = win; | oglrender->win = win; | ||||
| ▲ Show 20 Lines • Show All 81 Lines • ▼ Show 20 Lines | if (oglrender->mh) { | ||||
| if (oglrender->movie_ctx_arr) { | if (oglrender->movie_ctx_arr) { | ||||
| MEM_freeN(oglrender->movie_ctx_arr); | MEM_freeN(oglrender->movie_ctx_arr); | ||||
| } | } | ||||
| } | } | ||||
| if (oglrender->timer) { /* exec will not have a timer */ | if (oglrender->timer) { /* exec will not have a timer */ | ||||
| Depsgraph *depsgraph = oglrender->depsgraph; | Depsgraph *depsgraph = oglrender->depsgraph; | ||||
| SceneLayer *scene_layer = oglrender->scene_layer; | ViewLayer *view_layer = oglrender->view_layer; | ||||
| scene->r.cfra = oglrender->cfrao; | scene->r.cfra = oglrender->cfrao; | ||||
| BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); | BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, view_layer); | ||||
| WM_event_remove_timer(oglrender->wm, oglrender->win, oglrender->timer); | WM_event_remove_timer(oglrender->wm, oglrender->win, oglrender->timer); | ||||
| } | } | ||||
| WM_cursor_modal_restore(oglrender->win); | WM_cursor_modal_restore(oglrender->win); | ||||
| WM_event_add_notifier(C, NC_SCENE | ND_RENDER_RESULT, oglrender->scene); | WM_event_add_notifier(C, NC_SCENE | ND_RENDER_RESULT, oglrender->scene); | ||||
| ▲ Show 20 Lines • Show All 183 Lines • ▼ Show 20 Lines | static bool schedule_write_result(OGLRender *oglrender, RenderResult *rr) | ||||
| return true; | return true; | ||||
| } | } | ||||
| static bool screen_opengl_render_anim_step(bContext *C, wmOperator *op) | static bool screen_opengl_render_anim_step(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Main *bmain = CTX_data_main(C); | Main *bmain = CTX_data_main(C); | ||||
| OGLRender *oglrender = op->customdata; | OGLRender *oglrender = op->customdata; | ||||
| Scene *scene = oglrender->scene; | Scene *scene = oglrender->scene; | ||||
| SceneLayer *scene_layer = oglrender->scene_layer; | ViewLayer *view_layer = oglrender->view_layer; | ||||
| Depsgraph *depsgraph = oglrender->depsgraph; | Depsgraph *depsgraph = oglrender->depsgraph; | ||||
| char name[FILE_MAX]; | char name[FILE_MAX]; | ||||
| bool ok = false; | bool ok = false; | ||||
| const bool view_context = (oglrender->v3d != NULL); | const bool view_context = (oglrender->v3d != NULL); | ||||
| bool is_movie; | bool is_movie; | ||||
| RenderResult *rr; | RenderResult *rr; | ||||
| /* go to next frame */ | /* go to next frame */ | ||||
| if (CFRA < oglrender->nfra) | if (CFRA < oglrender->nfra) | ||||
| CFRA++; | CFRA++; | ||||
| while (CFRA < oglrender->nfra) { | while (CFRA < oglrender->nfra) { | ||||
| BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); | BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, view_layer); | ||||
| CFRA++; | CFRA++; | ||||
| } | } | ||||
| is_movie = BKE_imtype_is_movie(scene->r.im_format.imtype); | is_movie = BKE_imtype_is_movie(scene->r.im_format.imtype); | ||||
| if (!is_movie) { | if (!is_movie) { | ||||
| BKE_image_path_from_imformat( | BKE_image_path_from_imformat( | ||||
| name, scene->r.pic, oglrender->bmain->name, scene->r.cfra, | name, scene->r.pic, oglrender->bmain->name, scene->r.cfra, | ||||
| &scene->r.im_format, (scene->r.scemode & R_EXTENSION) != 0, true, NULL); | &scene->r.im_format, (scene->r.scemode & R_EXTENSION) != 0, true, NULL); | ||||
| if ((scene->r.mode & R_NO_OVERWRITE) && BLI_exists(name)) { | if ((scene->r.mode & R_NO_OVERWRITE) && BLI_exists(name)) { | ||||
| BLI_spin_lock(&oglrender->reports_lock); | BLI_spin_lock(&oglrender->reports_lock); | ||||
| BKE_reportf(op->reports, RPT_INFO, "Skipping existing frame \"%s\"", name); | BKE_reportf(op->reports, RPT_INFO, "Skipping existing frame \"%s\"", name); | ||||
| BLI_spin_unlock(&oglrender->reports_lock); | BLI_spin_unlock(&oglrender->reports_lock); | ||||
| ok = true; | ok = true; | ||||
| goto finally; | goto finally; | ||||
| } | } | ||||
| } | } | ||||
| WM_cursor_time(oglrender->win, scene->r.cfra); | WM_cursor_time(oglrender->win, scene->r.cfra); | ||||
| BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); | BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, view_layer); | ||||
| if (view_context) { | if (view_context) { | ||||
| if (oglrender->rv3d->persp == RV3D_CAMOB && oglrender->v3d->camera && oglrender->v3d->scenelock) { | if (oglrender->rv3d->persp == RV3D_CAMOB && oglrender->v3d->camera && oglrender->v3d->scenelock) { | ||||
| /* since BKE_scene_graph_update_for_newframe() is used rather | /* since BKE_scene_graph_update_for_newframe() is used rather | ||||
| * then ED_update_for_newframe() the camera needs to be set */ | * then ED_update_for_newframe() the camera needs to be set */ | ||||
| if (BKE_scene_camera_switch_update(scene)) { | if (BKE_scene_camera_switch_update(scene)) { | ||||
| oglrender->v3d->camera = scene->camera; | oglrender->v3d->camera = scene->camera; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 161 Lines • Show Last 20 Lines | |||||