Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/intern/image.c2
-rw-r--r--source/blender/editors/render/render_internal.c10
-rw-r--r--source/blender/editors/render/render_opengl.c6
-rw-r--r--source/blender/editors/render/render_preview.c9
-rw-r--r--source/blender/editors/space_image/image_buttons.c5
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h9
-rw-r--r--source/blender/render/intern/source/pipeline.c25
-rw-r--r--source/blender/render/intern/source/render_result.c76
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;
-}
-
-