diff options
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 2 | ||||
-rw-r--r-- | source/blender/editors/render/render_internal.c | 10 | ||||
-rw-r--r-- | source/blender/editors/render/render_opengl.c | 6 | ||||
-rw-r--r-- | source/blender/editors/render/render_preview.c | 9 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_buttons.c | 5 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 9 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 25 | ||||
-rw-r--r-- | source/blender/render/intern/source/render_result.c | 76 |
8 files changed, 52 insertions, 90 deletions
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 162f45379d8..eceb5c4ff20 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -3554,7 +3554,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_ } else if (ima->renders[ima->render_slot]) { rres = *(ima->renders[ima->render_slot]); - rres.have_combined = RE_RenderViewGetRectf(&rres, actview) != NULL; + rres.have_combined = ((RenderView *)rres.views.first)->rectf != NULL; } else memset(&rres, 0, sizeof(RenderResult)); diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 2f279122ae4..2ba1e615a9e 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -189,11 +189,15 @@ static void image_buffer_rect_update(RenderJob *rj, RenderResult *rr, ImBuf *ibu */ /* TODO(sergey): Need to check has_combined here? */ if (iuser->passtype == SCE_PASS_COMBINED) { + RenderView *rv; size_t view_id = BKE_scene_multiview_view_id_get(&scene->r, viewname); + rv = RE_RenderViewGetById(rr, view_id); + /* find current float rect for display, first case is after composite... still weak */ - rectf = RE_RenderViewGetRectf(rr, view_id); - if (rectf == NULL) { - if (RE_RenderViewGetRect32(rr, view_id)) { + if (rv->rectf) + rectf = rv->rectf; + else { + if (rv->rect32) { /* special case, currently only happens with sequencer rendering, * which updates the whole frame, so we can only mark display buffer * as invalid here (sergey) diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 164f5f4bfd7..7fbdf9dc66b 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -248,7 +248,7 @@ static void screen_opengl_render_doit(OGLRender *oglrender, RenderResult *rr) Object *camera = NULL; ImBuf *ibuf; float winmat[4][4]; - float *rectf = RE_RenderViewGetRectf(rr, oglrender->view_id); + float *rectf = RE_RenderViewGetById(rr, oglrender->view_id)->rectf; int sizex = oglrender->sizex; int sizey = oglrender->sizey; const short view_context = (v3d != NULL); @@ -446,8 +446,8 @@ static void screen_opengl_render_doit(OGLRender *oglrender, RenderResult *rr) if (rect) { int profile_to; - float *rectf = RE_RenderViewGetRectf(rr, oglrender->view_id); - + float *rectf = RE_RenderViewGetById(rr, oglrender->view_id)->rectf; + if (BKE_scene_check_color_management_enabled(scene)) profile_to = IB_PROFILE_LINEAR_RGB; else diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c index e6fbfda3067..2c353c13334 100644 --- a/source/blender/editors/render/render_preview.c +++ b/source/blender/editors/render/render_preview.c @@ -525,6 +525,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre static bool ed_preview_draw_rect(ScrArea *sa, int split, int first, rcti *rect, rcti *newrect) { Render *re; + RenderView *rv; RenderResult rres; char name[32]; int offx = 0; @@ -549,10 +550,12 @@ static bool ed_preview_draw_rect(ScrArea *sa, int split, int first, rcti *rect, /* test if something rendered ok */ re = RE_GetRender(name); + RE_AcquireResultImageViews(re, &rres); + /* material preview only needs monoscopy (view 0) */ - RE_AcquireResultImage(re, &rres, 0); + rv = RE_RenderViewGetById(&rres, 0); - if (rres.rectf) { + if (rv->rectf) { if (ABS(rres.rectx - newx) < 2 && ABS(rres.recty - newy) < 2) { @@ -577,7 +580,7 @@ static bool ed_preview_draw_rect(ScrArea *sa, int split, int first, rcti *rect, } } - RE_ReleaseResultImage(re); + RE_ReleaseResultImageViews(re, &rres); return ok; } diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c index 1c668c33597..e52eea248ed 100644 --- a/source/blender/editors/space_image/image_buttons.c +++ b/source/blender/editors/space_image/image_buttons.c @@ -312,10 +312,11 @@ static void ui_imageuser_slot_menu(bContext *UNUSED(C), uiLayout *layout, void * static const char *ui_imageuser_layer_fake_name(RenderResult *rr) { - if (RE_RenderViewGetRectf(rr, 0)) { + RenderView *rv = RE_RenderViewGetById(rr, 0); + if (rv->rectf) { return IFACE_("Composite"); } - else if (RE_RenderViewGetRect32(rr, 0)) { + else if (rv->rect32) { return IFACE_("Sequence"); } else { diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 2c3ad74c7e3..2df4cde2b27 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -138,6 +138,9 @@ typedef struct RenderResult { int rectx, recty; short crop, sample_nr; + /* the following rect32, rectf and rectz buffers are for temporary storage only, for RenderResult structs + * created in #RE_AcquireResultImage - which do not have RenderView */ + /* optional, 32 bits version of picture, used for ogl render and image curves */ int *rect32; /* if this exists, a copy of one of layers, or result of composited layers */ @@ -353,14 +356,8 @@ bool RE_allow_render_generic_object(struct Object *ob); bool RE_HasFakeLayer(RenderResult *res); bool RE_RenderResult_is_stereo(RenderResult *res); - struct RenderView *RE_RenderViewGetById(struct RenderResult *res, const int view_id); struct RenderView *RE_RenderViewGetByName(struct RenderResult *res, const char *viewname); -float *RE_RenderViewGetRectf(struct RenderResult *rr, const int view_id); -float *RE_RenderViewGetRectz(struct RenderResult *rr, const int view_id); -int *RE_RenderViewGetRect32(struct RenderResult *rr, const int view_id); -void RE_RenderViewSetRectf(struct RenderResult *res, const int view_id, float *rect); -void RE_RenderViewSetRectz(struct RenderResult *res, const int view_id, float *rect); #endif /* __RE_PIPELINE_H__ */ diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index c26a74f18c5..a4089002ba5 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -380,6 +380,8 @@ void RE_ReleaseResultImageViews(Render *re, RenderResult *rr) } /* fill provided result struct with what's currently active or done */ +/* this RenderResult struct is the only exception to the rule of a RenderResult */ +/* always having at least one RenderView */ void RE_AcquireResultImage(Render *re, RenderResult *rr, const int view_id) { memset(rr, 0, sizeof(RenderResult)); @@ -397,14 +399,14 @@ void RE_AcquireResultImage(Render *re, RenderResult *rr, const int view_id) /* actview view */ rv = RE_RenderViewGetById(re->result, view_id); - rr->rectf = rv ? rv->rectf : NULL; - rr->rectz = rv ? rv->rectz : NULL; - rr->rect32 = rv ? rv->rect32 : NULL; + rr->rectf = rv->rectf; + rr->rectz = rv->rectz; + rr->rect32 = rv->rect32; /* active layer */ rl = render_get_active_layer(re, re->result); - if (rl && rv) { + if (rl) { if (rv->rectf == NULL) rr->rectf = RE_RenderLayerGetPass(rl, SCE_PASS_COMBINED, rv->name); @@ -412,7 +414,7 @@ void RE_AcquireResultImage(Render *re, RenderResult *rr, const int view_id) rr->rectz = RE_RenderLayerGetPass(rl, SCE_PASS_Z, rv->name); } - rr->have_combined = rv ? (rv->rectf != NULL) : false; + rr->have_combined = (rv->rectf != NULL); rr->layers = re->result->layers; rr->views = re->result->views; @@ -434,9 +436,9 @@ void RE_ResultGet32(Render *re, unsigned int *rect) RenderResult rres; const size_t view_id = BKE_scene_multiview_view_id_get(&re->r, re->viewname); - RE_AcquireResultImage(re, &rres, view_id); - render_result_rect_get_pixels(&rres, rect, re->rectx, re->recty, &re->scene->view_settings, &re->scene->display_settings, 0); - RE_ReleaseResultImage(re); + RE_AcquireResultImageViews(re, &rres); + render_result_rect_get_pixels(&rres, rect, re->rectx, re->recty, &re->scene->view_settings, &re->scene->display_settings, view_id); + RE_ReleaseResultImageViews(re, &rres); } /* caller is responsible for allocating rect in correct size! */ @@ -768,11 +770,14 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, static void render_result_rescale(Render *re) { RenderResult *result = re->result; + RenderView *rv; int x, y; float scale_x, scale_y; float *src_rectf; - src_rectf = result->rectf; + rv = RE_RenderViewGetById(result, 0); + src_rectf = rv->rectf; + if (src_rectf == NULL) { RenderLayer *rl = render_get_active_layer(re, re->result); if (rl != NULL) { @@ -790,7 +795,7 @@ static void render_result_rescale(Render *re) ""); if (re->result != NULL) { - dst_rectf = re->result->rectf; + dst_rectf = RE_RenderViewGetById(re->result, 0)->rectf; if (dst_rectf == NULL) { RenderLayer *rl; rl = render_get_active_layer(re, re->result); diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c index 1668b11bd20..c8ca1105417 100644 --- a/source/blender/render/intern/source/render_result.c +++ b/source/blender/render/intern/source/render_result.c @@ -1465,12 +1465,13 @@ bool render_result_exr_file_cache_read(Render *re) ImBuf *render_result_rect_to_ibuf(RenderResult *rr, RenderData *rd, const int view_id) { ImBuf *ibuf = IMB_allocImBuf(rr->rectx, rr->recty, rd->im_format.planes, 0); - + RenderView *rv = RE_RenderViewGetById(rr, view_id); + /* if not exists, BKE_imbuf_write makes one */ - ibuf->rect = (unsigned int *) RE_RenderViewGetRect32(rr, view_id); - ibuf->rect_float = RE_RenderViewGetRectf(rr, view_id); - ibuf->zbuf_float = RE_RenderViewGetRectz(rr, view_id); - + ibuf->rect = (unsigned int *) rv->rect32; + ibuf->rect_float = rv->rectf; + ibuf->zbuf_float = rv->rectz; + /* float factor for random dither, imbuf takes care of it */ ibuf->dither = rd->dither_intensity; @@ -1528,10 +1529,6 @@ void render_result_rect_from_ibuf(RenderResult *rr, RenderData *UNUSED(rd), ImBu /* Same things as above, old rectf can hang around from previous render. */ MEM_SAFE_FREE(rv->rectf); } - - /* clean up non-view buffers */ - MEM_SAFE_FREE(rr->rect32); - MEM_SAFE_FREE(rr->rectf); } void render_result_rect_fill_zero(RenderResult *rr, const int view_id) @@ -1550,15 +1547,13 @@ void render_result_rect_get_pixels(RenderResult *rr, unsigned int *rect, int rec const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, const int view_id) { - if (rr->rect32) { - int *rect32 = RE_RenderViewGetRect32(rr, view_id); - memcpy(rect, (rect32 ? rect32 : rr->rect32), sizeof(int) * rr->rectx * rr->recty); - } - else if (rr->rectf) { - float *rectf = RE_RenderViewGetRectf(rr, view_id); - IMB_display_buffer_transform_apply((unsigned char *) rect, (rectf ? rectf : rr->rectf), rr->rectx, rr->recty, 4, + RenderView *rv = RE_RenderViewGetById(rr, view_id); + + if (rv->rect32) + memcpy(rect, rv->rect32, sizeof(int) * rr->rectx * rr->recty); + else if (rv->rectf) + IMB_display_buffer_transform_apply((unsigned char *) rect, rv->rectf, rr->rectx, rr->recty, 4, view_settings, display_settings, true); - } else /* else fill with black */ memset(rect, 0, sizeof(int) * rectx * recty); @@ -1595,56 +1590,13 @@ bool RE_RenderResult_is_stereo(RenderResult *res) RenderView *RE_RenderViewGetById(RenderResult *res, const int view_id) { RenderView *rv = BLI_findlink(&res->views, view_id); + BLI_assert(res->views.first); return rv ? rv : res->views.first; } RenderView *RE_RenderViewGetByName(RenderResult *res, const char *viewname) { RenderView *rv = BLI_findstring(&res->views, viewname, offsetof(RenderView, name)); + BLI_assert(res->views.first); return rv ? rv : res->views.first; } - -void RE_RenderViewSetRectf(RenderResult *res, const int view_id, float *rect) -{ - RenderView *rv = BLI_findlink(&res->views, view_id); - if (rv) { - rv->rectf = rect; - } -} - -void RE_RenderViewSetRectz(RenderResult *res, const int view_id, float *rect) -{ - RenderView *rv = BLI_findlink(&res->views, view_id); - if (rv) { - rv->rectz = rect; - } -} - -float *RE_RenderViewGetRectz(RenderResult *res, const int view_id) -{ - RenderView *rv = BLI_findlink(&res->views, view_id); - if (rv) { - return rv->rectz; - } - return res->rectz; -} - -float *RE_RenderViewGetRectf(RenderResult *res, const int view_id) -{ - RenderView *rv = BLI_findlink(&res->views, view_id); - if (rv) { - return rv->rectf; - } - return res->rectf; -} - -int *RE_RenderViewGetRect32(RenderResult *res, const int view_id) -{ - RenderView *rv = BLI_findlink(&res->views, view_id); - if (rv) { - return rv->rect32; - } - return res->rect32; -} - - |