diff options
Diffstat (limited to 'source/blender/render/intern/render_result.cc')
-rw-r--r-- | source/blender/render/intern/render_result.cc | 123 |
1 files changed, 14 insertions, 109 deletions
diff --git a/source/blender/render/intern/render_result.cc b/source/blender/render/intern/render_result.cc index 8b7a07e2b3f..1cd95831ddf 100644 --- a/source/blender/render/intern/render_result.cc +++ b/source/blender/render/intern/render_result.cc @@ -169,7 +169,7 @@ static void render_layer_allocate_pass(RenderResult *rr, RenderPass *rp) return; } - const size_t rectsize = ((size_t)rr->rectx) * rr->recty * rp->channels; + const size_t rectsize = size_t(rr->rectx) * rr->recty * rp->channels; rp->rect = MEM_cnew_array<float>(rectsize, rp->name); if (STREQ(rp->name, RE_PASSNAME_VECTOR)) { @@ -251,8 +251,6 @@ RenderResult *render_result_new(Render *re, rr = MEM_cnew<RenderResult>("new render result"); rr->rectx = rectx; rr->recty = recty; - rr->renrect.xmin = 0; - rr->renrect.xmax = rectx; /* tilerect is relative coordinates within render disprect. do not subtract crop yet */ rr->tilerect.xmin = partrct->xmin - re->disprect.xmin; @@ -264,7 +262,7 @@ RenderResult *render_result_new(Render *re, render_result_views_new(rr, &re->r); - /* check renderdata for amount of layers */ + /* Check render-data for amount of layers. */ FOREACH_VIEW_LAYER_TO_RENDER_BEGIN (re, view_layer) { if (layername && layername[0]) { if (!STREQ(view_layer->name, layername)) { @@ -292,90 +290,8 @@ RenderResult *render_result_new(Render *re, } } -#define RENDER_LAYER_ADD_PASS_SAFE(rr, rl, channels, name, viewname, chan_id) \ - do { \ - if (render_layer_add_pass(rr, rl, channels, name, viewname, chan_id, false) == nullptr) { \ - render_result_free(rr); \ - return nullptr; \ - } \ - } while (false) - /* A render-layer should always have a "Combined" pass. */ render_layer_add_pass(rr, rl, 4, "Combined", view, "RGBA", false); - - if (view_layer->passflag & SCE_PASS_Z) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_Z, view, "Z"); - } - if (view_layer->passflag & SCE_PASS_VECTOR) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 4, RE_PASSNAME_VECTOR, view, "XYZW"); - } - if (view_layer->passflag & SCE_PASS_NORMAL) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_NORMAL, view, "XYZ"); - } - if (view_layer->passflag & SCE_PASS_POSITION) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_POSITION, view, "XYZ"); - } - if (view_layer->passflag & SCE_PASS_UV) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_UV, view, "UVA"); - } - if (view_layer->passflag & SCE_PASS_EMIT) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_EMIT, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_AO) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_AO, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_ENVIRONMENT) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_ENVIRONMENT, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_SHADOW) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SHADOW, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_INDEXOB) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_INDEXOB, view, "X"); - } - if (view_layer->passflag & SCE_PASS_INDEXMA) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_INDEXMA, view, "X"); - } - if (view_layer->passflag & SCE_PASS_MIST) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_MIST, view, "Z"); - } - if (view_layer->passflag & SCE_PASS_DIFFUSE_DIRECT) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_DIFFUSE_DIRECT, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_DIFFUSE_INDIRECT) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_DIFFUSE_INDIRECT, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_DIFFUSE_COLOR) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_DIFFUSE_COLOR, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_GLOSSY_DIRECT) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_GLOSSY_DIRECT, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_GLOSSY_INDIRECT) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_GLOSSY_INDIRECT, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_GLOSSY_COLOR) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_GLOSSY_COLOR, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_TRANSM_DIRECT) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_TRANSM_DIRECT, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_TRANSM_INDIRECT) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_TRANSM_INDIRECT, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_TRANSM_COLOR) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_TRANSM_COLOR, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_SUBSURFACE_DIRECT) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SUBSURFACE_DIRECT, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_SUBSURFACE_INDIRECT) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SUBSURFACE_INDIRECT, view, "RGB"); - } - if (view_layer->passflag & SCE_PASS_SUBSURFACE_COLOR) { - RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SUBSURFACE_COLOR, view, "RGB"); - } -#undef RENDER_LAYER_ADD_PASS_SAFE } } FOREACH_VIEW_LAYER_TO_RENDER_END; @@ -405,7 +321,7 @@ RenderResult *render_result_new(Render *re, rl->layflag = SCE_LAY_FLAG_DEFAULT; rl->passflag = SCE_PASS_COMBINED; - re->active_view_layer = 0; + re->single_view_layer[0] = '\0'; } /* Border render; calculate offset for use in compositor. compo is centralized coords. */ @@ -413,11 +329,6 @@ RenderResult *render_result_new(Render *re, rr->xof = re->disprect.xmin + BLI_rcti_cent_x(&re->disprect) - (re->winx / 2); rr->yof = re->disprect.ymin + BLI_rcti_cent_y(&re->disprect) - (re->winy / 2); - /* Preview does not support deferred render result allocation. */ - if (re->r.scemode & R_BUTS_PREVIEW) { - render_result_passes_allocated_ensure(rr); - } - return rr; } @@ -654,8 +565,8 @@ static int order_render_passes(const void *a, const void *b) /* 1 if `a` is after `b`. */ RenderPass *rpa = (RenderPass *)a; RenderPass *rpb = (RenderPass *)b; - unsigned int passtype_a = passtype_from_name(rpa->name); - unsigned int passtype_b = passtype_from_name(rpb->name); + uint passtype_a = passtype_from_name(rpa->name); + uint passtype_b = passtype_from_name(rpb->name); /* Render passes with default type always go first. */ if (passtype_b && !passtype_a) { @@ -780,7 +691,7 @@ static void do_merge_tile( copylen = tilex = rrpart->rectx; tiley = rrpart->recty; - ofs = (((size_t)rrpart->tilerect.ymin) * rr->rectx + rrpart->tilerect.xmin); + ofs = (size_t(rrpart->tilerect.ymin) * rr->rectx + rrpart->tilerect.xmin); target += pixsize * ofs; copylen *= sizeof(float) * pixsize; @@ -857,8 +768,8 @@ void render_result_single_layer_end(Render *re) /* reconstruct render result layers */ int nr = 0; - LISTBASE_FOREACH (ViewLayer *, view_layer, &re->view_layers) { - if (nr == re->active_view_layer) { + LISTBASE_FOREACH (ViewLayer *, view_layer, &re->scene->view_layers) { + if (STREQ(view_layer->name, re->single_view_layer)) { BLI_addtail(&re->result->layers, rl); } else { @@ -964,7 +875,7 @@ static void render_result_exr_file_cache_path(Scene *sce, sce->id.name + 2, path_hexdigest); - BLI_join_dirfile(r_path, FILE_CACHE_MAX, root, filename_full); + BLI_path_join(r_path, FILE_CACHE_MAX, root, filename_full); if (BLI_path_is_rel(r_path)) { BLI_path_abs(r_path, dirname); } @@ -1026,7 +937,7 @@ ImBuf *RE_render_result_rect_to_ibuf(RenderResult *rr, RenderView *rv = RE_RenderViewGetById(rr, view_id); /* if not exists, BKE_imbuf_write makes one */ - ibuf->rect = (unsigned int *)rv->rect32; + ibuf->rect = (uint *)rv->rect32; ibuf->rect_float = rv->rectf; ibuf->zbuf_float = rv->rectz; @@ -1055,7 +966,7 @@ ImBuf *RE_render_result_rect_to_ibuf(RenderResult *rr, /* Color -> gray-scale. */ /* editing directly would alter the render view */ - if (imf->planes == R_IMF_PLANES_BW) { + if (imf->planes == R_IMF_PLANES_BW && imf->imtype != R_IMF_IMTYPE_MULTILAYER) { ImBuf *ibuf_bw = IMB_dupImBuf(ibuf); IMB_color_to_bw(ibuf_bw); IMB_freeImBuf(ibuf); @@ -1112,7 +1023,7 @@ void render_result_rect_fill_zero(RenderResult *rr, const int view_id) } void render_result_rect_get_pixels(RenderResult *rr, - unsigned int *rect, + uint *rect, int rectx, int recty, const ColorManagedViewSettings *view_settings, @@ -1125,14 +1036,8 @@ void render_result_rect_get_pixels(RenderResult *rr, memcpy(rect, rv->rect32, sizeof(int) * rr->rectx * rr->recty); } else if (rv && rv->rectf) { - IMB_display_buffer_transform_apply((unsigned char *)rect, - rv->rectf, - rr->rectx, - rr->recty, - 4, - view_settings, - display_settings, - true); + IMB_display_buffer_transform_apply( + (uchar *)rect, rv->rectf, rr->rectx, rr->recty, 4, view_settings, display_settings, true); } else { /* else fill with black */ |