diff options
Diffstat (limited to 'source/blender/editors/render')
-rw-r--r-- | source/blender/editors/render/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/blender/editors/render/SConscript | 4 | ||||
-rw-r--r-- | source/blender/editors/render/render_intern.h | 2 | ||||
-rw-r--r-- | source/blender/editors/render/render_internal.c | 8 | ||||
-rw-r--r-- | source/blender/editors/render/render_opengl.c | 94 | ||||
-rw-r--r-- | source/blender/editors/render/render_shading.c | 6 | ||||
-rw-r--r-- | source/blender/editors/render/render_update.c | 18 | ||||
-rw-r--r-- | source/blender/editors/render/render_view.c | 12 |
8 files changed, 69 insertions, 77 deletions
diff --git a/source/blender/editors/render/CMakeLists.txt b/source/blender/editors/render/CMakeLists.txt index 42dafc076ed..971ab9f3458 100644 --- a/source/blender/editors/render/CMakeLists.txt +++ b/source/blender/editors/render/CMakeLists.txt @@ -20,10 +20,10 @@ set(INC ../include - ../../blenfont ../../blenkernel ../../blenlib ../../blenloader + ../../blentranslation ../../gpu ../../imbuf ../../bmesh diff --git a/source/blender/editors/render/SConscript b/source/blender/editors/render/SConscript index cbb7988695b..24270ca2324 100644 --- a/source/blender/editors/render/SConscript +++ b/source/blender/editors/render/SConscript @@ -39,6 +39,7 @@ incs = [ '../../blenkernel', '../../blenlib', '../../blenloader', + '../../blentranslation', '../../bmesh', '../../gpu', '../../imbuf', @@ -49,7 +50,8 @@ incs = [ ] incs = ' '.join(incs) -defs = env['BF_GL_DEFINITIONS'] +defs = [] +defs += env['BF_GL_DEFINITIONS'] if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc', 'win64-mingw'): incs += ' ' + env['BF_PTHREADS_INC'] diff --git a/source/blender/editors/render/render_intern.h b/source/blender/editors/render/render_intern.h index 54429f9f066..26f313cb3fe 100644 --- a/source/blender/editors/render/render_intern.h +++ b/source/blender/editors/render/render_intern.h @@ -93,7 +93,7 @@ void render_view3d_update(struct RenderEngine *engine, const struct bContext *C) void render_view3d_draw(struct RenderEngine *engine, const struct bContext *C); /* render_view.c */ -struct ScrArea *render_view_open(struct bContext *C, int mx, int my); +struct ScrArea *render_view_open(struct bContext *C, int mx, int my, struct ReportList *reports); void RENDER_OT_view_show(struct wmOperatorType *ot); void RENDER_OT_view_cancel(struct wmOperatorType *ot); diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index ec3f199174d..4c10c07e189 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -42,7 +42,7 @@ #include "PIL_time.h" -#include "BLF_translation.h" +#include "BLT_translation.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -190,7 +190,7 @@ static void image_buffer_rect_update(RenderJob *rj, RenderResult *rr, ImBuf *ibu * - sergey - */ /* TODO(sergey): Need to check has_combined here? */ - if (iuser->passtype == SCE_PASS_COMBINED) { + if (iuser->pass == 0) { RenderView *rv; size_t view_id = BKE_scene_multiview_view_id_get(&scene->r, viewname); rv = RE_RenderViewGetById(rr, view_id); @@ -525,6 +525,7 @@ static void render_image_update_pass_and_layer(RenderJob *rj, RenderResult *rr, } } + iuser->pass = sima->iuser.pass; iuser->layer = sima->iuser.layer; RE_ReleaseResult(rj->re); @@ -876,7 +877,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even // store spare /* ensure at least 1 area shows result */ - sa = render_view_open(C, event->x, event->y); + sa = render_view_open(C, event->x, event->y, op->reports); jobflag = WM_JOB_EXCL_RENDER | WM_JOB_PRIORITY | WM_JOB_PROGRESS; @@ -898,7 +899,6 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even rj->write_still = is_write_still && !is_animation; rj->iuser.scene = scene; rj->iuser.ok = 1; - rj->iuser.passtype = SCE_PASS_COMBINED; rj->reports = op->reports; rj->orig_layer = 0; rj->last_layer = 0; diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index c718dfa9229..51c4e8bc16e 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -96,6 +96,7 @@ typedef struct OGLRender { ImageUser iuser; GPUOffScreen *ofs; + int ofs_samples; GPUFX *fx; int sizex, sizey; int write_still; @@ -228,13 +229,8 @@ static void screen_opengl_views_setup(OGLRender *oglrender) } BLI_lock_thread(LOCK_DRAW_IMAGE); - if (is_multiview && BKE_scene_multiview_is_stereo3d(rd)) { - oglrender->ima->flag |= IMA_IS_STEREO; - } - else { - oglrender->ima->flag &= ~IMA_IS_STEREO; + if (!(is_multiview && BKE_scene_multiview_is_stereo3d(rd))) oglrender->iuser.flag &= ~IMA_SHOW_STEREO; - } BLI_unlock_thread(LOCK_DRAW_IMAGE); /* will only work for non multiview correctly */ @@ -279,6 +275,9 @@ static void screen_opengl_render_doit(OGLRender *oglrender, RenderResult *rr) &context); context.view_id = BKE_scene_multiview_view_id_get(&scene->r, viewname); + context.gpu_offscreen = oglrender->ofs; + context.gpu_samples = oglrender->ofs_samples; + ibuf = BKE_sequencer_give_ibuf(&context, CFRA, chanshown); if (ibuf) { @@ -375,63 +374,23 @@ static void screen_opengl_render_doit(OGLRender *oglrender, RenderResult *rr) rect = MEM_mallocN(sizex * sizey * sizeof(unsigned char) * 4, "offscreen rect"); - if ((scene->r.mode & R_OSA) == 0) { - ED_view3d_draw_offscreen( - scene, v3d, ar, sizex, sizey, NULL, winmat, - draw_bgpic, draw_sky, is_persp, - oglrender->ofs, oglrender->fx, &fx_settings, viewname); - GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect); - } - else { - /* simple accumulation, less hassle then FSAA FBO's */ - static float jit_ofs[32][2]; - float winmat_jitter[4][4]; - int *accum_buffer = MEM_mallocN(sizex * sizey * sizeof(int) * 4, "accum1"); - int i, j; - - BLI_jitter_init(jit_ofs, scene->r.osa); - - /* first sample buffer, also initializes 'rv3d->persmat' */ - ED_view3d_draw_offscreen( - scene, v3d, ar, sizex, sizey, NULL, winmat, - draw_bgpic, draw_sky, is_persp, - oglrender->ofs, oglrender->fx, &fx_settings, viewname); - GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect); - - for (i = 0; i < sizex * sizey * 4; i++) - accum_buffer[i] = rect[i]; - - /* skip the first sample */ - for (j = 1; j < scene->r.osa; j++) { - copy_m4_m4(winmat_jitter, winmat); - window_translate_m4(winmat_jitter, rv3d->persmat, - (jit_ofs[j][0] * 2.0f) / sizex, - (jit_ofs[j][1] * 2.0f) / sizey); - - ED_view3d_draw_offscreen( - scene, v3d, ar, sizex, sizey, NULL, winmat_jitter, - draw_bgpic, draw_sky, is_persp, - oglrender->ofs, oglrender->fx, &fx_settings, viewname); - GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect); - - for (i = 0; i < sizex * sizey * 4; i++) - accum_buffer[i] += rect[i]; - } - - for (i = 0; i < sizex * sizey * 4; i++) - rect[i] = accum_buffer[i] / scene->r.osa; - - MEM_freeN(accum_buffer); - } + ED_view3d_draw_offscreen( + scene, v3d, ar, sizex, sizey, NULL, winmat, + draw_bgpic, draw_sky, is_persp, viewname, + oglrender->fx, &fx_settings, + oglrender->ofs); + GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect); GPU_offscreen_unbind(oglrender->ofs, true); /* unbind */ } else { /* shouldnt suddenly give errors mid-render but possible */ char err_out[256] = "unknown"; - ImBuf *ibuf_view = ED_view3d_draw_offscreen_imbuf_simple(scene, scene->camera, oglrender->sizex, oglrender->sizey, - IB_rect, OB_SOLID, false, true, true, - (draw_sky) ? R_ADDSKY : R_ALPHAPREMUL, viewname, err_out); + ImBuf *ibuf_view = ED_view3d_draw_offscreen_imbuf_simple( + scene, scene->camera, oglrender->sizex, oglrender->sizey, + IB_rect, OB_SOLID, false, true, true, + (draw_sky) ? R_ADDSKY : R_ALPHAPREMUL, oglrender->ofs_samples, viewname, + oglrender->ofs, err_out); camera = scene->camera; if (ibuf_view) { @@ -541,6 +500,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) GPUOffScreen *ofs; OGLRender *oglrender; int sizex, sizey; + const int samples = (scene->r.mode & R_OSA) ? scene->r.osa : 0; bool is_view_context = RNA_boolean_get(op->ptr, "view_context"); const bool is_animation = RNA_boolean_get(op->ptr, "animation"); const bool is_sequencer = RNA_boolean_get(op->ptr, "sequencer"); @@ -585,7 +545,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) sizey = (scene->r.size * scene->r.ysch) / 100; /* corrects render size with actual size, not every card supports non-power-of-two dimensions */ - ofs = GPU_offscreen_create(sizex, sizey, err_out); + ofs = GPU_offscreen_create(sizex, sizey, samples, err_out); if (!ofs) { BKE_reportf(op->reports, RPT_ERROR, "Failed to create OpenGL off-screen buffer, %s", err_out); @@ -597,6 +557,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) op->customdata = oglrender; oglrender->ofs = ofs; + oglrender->ofs_samples = samples; oglrender->sizex = sizex; oglrender->sizey = sizey; oglrender->bmain = CTX_data_main(C); @@ -706,7 +667,7 @@ static void screen_opengl_render_cancel(bContext *C, wmOperator *op) } /* share between invoke and exec */ -static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op) +static bool screen_opengl_render_anim_initialize(bContext *C, wmOperator *op) { /* initialize animation */ OGLRender *oglrender; @@ -722,9 +683,16 @@ static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op) size_t i, width, height; BKE_scene_multiview_videos_dimensions_get(&scene->r, oglrender->sizex, oglrender->sizey, &width, &height); - oglrender->movie_ctx_arr = MEM_mallocN(sizeof(void *) * oglrender->totvideos, "Movies"); oglrender->mh = BKE_movie_handle_get(scene->r.im_format.imtype); + if (oglrender->mh == NULL) { + BKE_report(oglrender->reports, RPT_ERROR, "Movie format unsupported"); + screen_opengl_render_end(C, oglrender); + return false; + } + + oglrender->movie_ctx_arr = MEM_mallocN(sizeof(void *) * oglrender->totvideos, "Movies"); + for (i = 0; i < oglrender->totvideos; i++) { const char *suffix = BKE_scene_multiview_view_id_suffix_get(&scene->r, i); @@ -733,7 +701,7 @@ static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op) oglrender->sizey, oglrender->reports, PRVRANGEON != 0, suffix)) { screen_opengl_render_end(C, oglrender); - return 0; + return false; } } } @@ -742,7 +710,7 @@ static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op) oglrender->nfra = PSFRA; scene->r.cfra = PSFRA; - return 1; + return true; } static bool screen_opengl_render_anim_step(bContext *C, wmOperator *op) @@ -904,7 +872,7 @@ static int screen_opengl_render_invoke(bContext *C, wmOperator *op, const wmEven } oglrender = op->customdata; - render_view_open(C, event->x, event->y); + render_view_open(C, event->x, event->y, op->reports); /* view may be changed above (R_OUTPUT_WINDOW) */ oglrender->win = CTX_wm_window(C); diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c index c451cc82592..2e07e19e366 100644 --- a/source/blender/editors/render/render_shading.c +++ b/source/blender/editors/render/render_shading.c @@ -45,7 +45,7 @@ #include "BLI_listbase.h" #include "BLI_math_vector.h" -#include "BLF_translation.h" +#include "BLT_translation.h" #include "BKE_animsys.h" #include "BKE_context.h" @@ -480,7 +480,7 @@ static int new_material_exec(bContext *C, wmOperator *UNUSED(op)) if (prop) { /* when creating new ID blocks, use is already 1, but RNA - * pointer se also increases user, so this compensates it */ + * pointer use also increases user, so this compensates it */ ma->id.us--; RNA_id_pointer_create(&ma->id, &idptr); @@ -1620,7 +1620,7 @@ void TEXTURE_OT_envmap_save(wmOperatorType *ot) RNA_def_property_flag(prop, PROP_HIDDEN); WM_operator_properties_filesel(ot, FILE_TYPE_FOLDER | FILE_TYPE_IMAGE | FILE_TYPE_MOVIE, FILE_SPECIAL, FILE_SAVE, - WM_FILESEL_FILEPATH, FILE_DEFAULTDISPLAY); + WM_FILESEL_FILEPATH, FILE_DEFAULTDISPLAY, FILE_SORT_ALPHA); } static int envmap_clear_exec(bContext *C, wmOperator *UNUSED(op)) diff --git a/source/blender/editors/render/render_update.c b/source/blender/editors/render/render_update.c index dedcbb144aa..f11a8177bf8 100644 --- a/source/blender/editors/render/render_update.c +++ b/source/blender/editors/render/render_update.c @@ -52,6 +52,7 @@ #include "BKE_material.h" #include "BKE_node.h" #include "BKE_paint.h" +#include "BKE_scene.h" #include "GPU_material.h" #include "GPU_buffers.h" @@ -142,6 +143,23 @@ void ED_render_scene_update(Main *bmain, Scene *scene, int updated) recursive_check = false; } +void ED_render_scene_update_pre(Main *bmain, Scene *scene, bool time) +{ + /* Blender internal might access to the data which is gonna to be freed + * by the scene update functions. This applies for example to simulation + * data like smoke and fire. + */ + if (time && !BKE_scene_use_new_shading_nodes(scene)) { + bScreen *sc; + ScrArea *sa; + for (sc = bmain->screen.first; sc; sc = sc->id.next) { + for (sa = sc->areabase.first; sa; sa = sa->next) { + ED_render_engine_area_exit(bmain, sa); + } + } + } +} + void ED_render_engine_area_exit(Main *bmain, ScrArea *sa) { /* clear all render engines in this area */ diff --git a/source/blender/editors/render/render_view.c b/source/blender/editors/render/render_view.c index f6690296890..4e36303d829 100644 --- a/source/blender/editors/render/render_view.c +++ b/source/blender/editors/render/render_view.c @@ -38,6 +38,7 @@ #include "BKE_image.h" #include "BKE_global.h" #include "BKE_screen.h" +#include "BKE_report.h" #include "WM_api.h" #include "WM_types.h" @@ -125,7 +126,7 @@ static ScrArea *find_area_image_empty(bContext *C) /********************** open image editor for render *************************/ /* new window uses x,y to set position */ -ScrArea *render_view_open(bContext *C, int mx, int my) +ScrArea *render_view_open(bContext *C, int mx, int my, ReportList *reports) { wmWindow *win = CTX_wm_window(C); Scene *scene = CTX_data_scene(C); @@ -155,7 +156,10 @@ ScrArea *render_view_open(bContext *C, int mx, int my) rect.ymax = rect.ymin + sizey; /* changes context! */ - WM_window_open_temp(C, &rect, WM_WINDOW_RENDER); + if (WM_window_open_temp(C, &rect, WM_WINDOW_RENDER) == NULL) { + BKE_report(reports, RPT_ERROR, "Failed to open window!"); + return NULL; + } sa = CTX_wm_area(C); } @@ -292,7 +296,7 @@ void RENDER_OT_view_cancel(struct wmOperatorType *ot) /************************* show render viewer *****************/ -static int render_view_show_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event) +static int render_view_show_invoke(bContext *C, wmOperator *op, const wmEvent *event) { wmWindow *wincur = CTX_wm_window(C); @@ -341,7 +345,7 @@ static int render_view_show_invoke(bContext *C, wmOperator *UNUSED(op), const wm } } else { - render_view_open(C, event->x, event->y); + render_view_open(C, event->x, event->y, op->reports); } } |