Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/render/render_opengl.c
| Show First 20 Lines • Show All 88 Lines • ▼ Show 20 Lines | |||||
| // TODO(sergey): Find better approximation of the scheduled frames. | // TODO(sergey): Find better approximation of the scheduled frames. | ||||
| // 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; | |||||
| SceneLayer *scene_layer; | SceneLayer *scene_layer; | ||||
| 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 *sl = oglrender->scene_layer; | SceneLayer *scene_layer = oglrender->scene_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, sl, v3d, ar, sizex, sizey, | &eval_ctx, scene, scene_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, sl, scene->camera, oglrender->sizex, oglrender->sizey, | &eval_ctx, scene, scene_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 210 Lines • ▼ Show 20 Lines | static bool screen_opengl_fullsample_enabled(Scene *scene) | ||||
| } | } | ||||
| } | } | ||||
| static bool screen_opengl_render_init(bContext *C, wmOperator *op) | static bool screen_opengl_render_init(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| /* new render clears all callbacks */ | /* new render clears all callbacks */ | ||||
| wmWindowManager *wm = CTX_wm_manager(C); | wmWindowManager *wm = CTX_wm_manager(C); | ||||
| wmWindow *win = CTX_wm_window(C); | wmWindow *win = CTX_wm_window(C); | ||||
| WorkSpace *workspace = CTX_wm_workspace(C); | |||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| ScrArea *prevsa = CTX_wm_area(C); | ScrArea *prevsa = CTX_wm_area(C); | ||||
| ARegion *prevar = CTX_wm_region(C); | ARegion *prevar = CTX_wm_region(C); | ||||
| GPUOffScreen *ofs; | GPUOffScreen *ofs; | ||||
| OGLRender *oglrender; | OGLRender *oglrender; | ||||
| int sizex, sizey; | int sizex, sizey; | ||||
| const int samples = (scene->r.mode & R_OSA) ? scene->r.osa : 0; | const int samples = (scene->r.mode & R_OSA) ? scene->r.osa : 0; | ||||
| ▲ Show 20 Lines • Show All 55 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->scene_layer = CTX_data_scene_layer(C); | oglrender->scene_layer = CTX_data_scene_layer(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 20 Lines | if (is_view_context) { | ||||
| if (oglrender->v3d->fx_settings.fx_flag & (GPU_FX_FLAG_DOF | GPU_FX_FLAG_SSAO)) { | if (oglrender->v3d->fx_settings.fx_flag & (GPU_FX_FLAG_DOF | GPU_FX_FLAG_SSAO)) { | ||||
| oglrender->fx = GPU_fx_compositor_create(); | oglrender->fx = GPU_fx_compositor_create(); | ||||
| } | } | ||||
| } | } | ||||
| /* create render */ | /* create render */ | ||||
| oglrender->re = RE_NewSceneRender(scene); | oglrender->re = RE_NewSceneRender(scene); | ||||
| ViewRender *view_render = BKE_viewrender_get(scene, workspace); | |||||
| RE_SetEngineByID(oglrender->re, view_render->engine_id); | |||||
| /* create image and image user */ | /* create image and image user */ | ||||
| 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, NULL, sizex, sizey, NULL); | RE_InitState(oglrender->re, NULL, &scene->r, 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 491 Lines • Show Last 20 Lines | |||||