[Bf-blender-cvs] [9c2dd85] multiview: Image Editor fixup, now ImageUser is always initialized properly, stereo image loads right away and render images also display correctly
Dalai Felinto
noreply at git.blender.org
Fri May 23 15:14:44 CEST 2014
Commit: 9c2dd855eac5c7b21ef1cf1ff2a547259b0e29be
Author: Dalai Felinto
Date: Mon May 12 11:28:28 2014 +0200
https://developer.blender.org/rB9c2dd855eac5c7b21ef1cf1ff2a547259b0e29be
Image Editor fixup, now ImageUser is always initialized properly, stereo
image loads right away and render images also display correctly
===================================================================
M release/scripts/startup/bl_ui/space_image.py
M source/blender/blenkernel/BKE_image.h
M source/blender/blenkernel/intern/image.c
M source/blender/editors/space_image/image_draw.c
M source/blender/editors/space_image/image_ops.c
M source/blender/makesdna/DNA_image_types.h
M source/blender/makesrna/intern/rna_space.c
M source/blender/render/extern/include/RE_pipeline.h
M source/blender/render/intern/source/pipeline.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 0277b7e..1215aaa 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -430,9 +430,9 @@ class IMAGE_HT_header(Header):
if ima:
# layers
- if sima.is_stereo:
+ if ima.is_stereo_3d:
row = layout.row()
- row.prop(sima, "show_stereo", text="")
+ row.prop(sima, "show_stereo_3d", text="")
layout.template_image_layers(ima, iuser)
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index b2ac64b..e84ace9 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -170,6 +170,7 @@ struct Image *BKE_image_add_generated(
struct Image *BKE_image_add_from_imbuf(struct ImBuf *ibuf);
/* for reload, refresh, pack */
+void BKE_image_init_imageuser(struct Image *ima, struct ImageUser *iuser);
void BKE_image_signal(struct Image *ima, struct ImageUser *iuser, int signal);
void BKE_image_walk_all_users(const struct Main *mainp, void *customdata,
@@ -195,6 +196,7 @@ struct RenderPass *BKE_image_multilayer_index(struct RenderResult *rr, struct Im
struct RenderPass *BKE_image_multiview_index(struct RenderResult *rr, struct ImageUser *iuser);
/* for multilayer images as well as for render-viewer */
+bool BKE_image_is_stereo(struct Scene *scene, struct Image *ima);
struct RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, struct Image *ima);
void BKE_image_release_renderresult(struct Scene *scene, struct Image *ima);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 926570e..1741745 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -2248,6 +2248,36 @@ static void image_tag_frame_recalc(Image *ima, ImageUser *iuser, void *customdat
}
}
+static void image_init_imageuser(Image *ima, ImageUser *iuser)
+{
+ RenderResult *rr = ima->rr;
+
+ iuser->multi_index = 0;
+ iuser->layer = iuser->pass = iuser->view = 0;
+ iuser->passtype = SCE_PASS_COMBINED;
+
+ if (rr) {
+ RenderLayer *rl = rr->layers.first;
+
+ if (rl) {
+ RenderPass *rp = rl->passes.first;
+
+ if (rp)
+ iuser->passtype = rp->passtype;
+ }
+
+ BKE_image_multilayer_index(rr, iuser);
+ }
+ else {
+ iuser->flag &= ~IMA_SHOW_STEREO;
+ }
+}
+
+void BKE_image_init_imageuser(Image *ima, ImageUser *iuser)
+{
+ return image_init_imageuser(ima, iuser);
+}
+
void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
{
if (ima == NULL)
@@ -2335,8 +2365,7 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
iuser->ok = 1;
if (ima->source == IMA_SRC_FILE || ima->source == IMA_SRC_SEQUENCE) {
if (ima->type == IMA_TYPE_MULTILAYER) {
- iuser->multi_index = 0;
- iuser->layer = iuser->pass = 0;
+ image_init_imageuser(ima, iuser);
}
}
}
@@ -2380,7 +2409,7 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
if (iuser) {
short index = 0, rl_index = 0, rp_index;
short view;
- bool is_stereo = RE_HasStereo3D(rr) && (iuser->flag & IMA_SHOW_STEREO);
+ bool is_stereo = RE_RenderResult_is_stereo(rr) && (iuser->flag & IMA_SHOW_STEREO);
view = is_stereo ? iuser->eye : iuser->view;
@@ -2416,19 +2445,47 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
return rpass;
}
-RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima)
+bool BKE_image_is_stereo(Scene *scene, Image *ima)
{
if (ima->rr) {
- return ima->rr;
+ return (ima->flag & IMA_IS_STEREO) != 0;
}
else if (ima->type == IMA_TYPE_R_RESULT) {
+ RenderResult *rr;
if (ima->render_slot == ima->last_render_slot)
- return RE_AcquireResultRead(RE_GetRender(scene->id.name));
+ rr = RE_AcquireResultRead(RE_GetRender(scene->id.name));
else
- return ima->renders[ima->render_slot];
+ rr = ima->renders[ima->render_slot];
+
+ return RE_RenderResult_is_stereo(rr);
}
else
- return NULL;
+ return false;
+}
+
+static void image_set_stereo_flag(Image *ima, RenderResult *rr)
+{
+ if (rr && RE_RenderResult_is_stereo(rr))
+ ima->flag |= IMA_IS_STEREO;
+ else
+ ima->flag &= ~IMA_IS_STEREO;
+}
+
+RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima)
+{
+ RenderResult *rr = NULL;
+ if (ima->rr) {
+ rr = ima->rr;
+ }
+ else if (ima->type == IMA_TYPE_R_RESULT) {
+ if (ima->render_slot == ima->last_render_slot)
+ rr = RE_AcquireResultRead(RE_GetRender(scene->id.name));
+ else
+ rr = ima->renders[ima->render_slot];
+ }
+
+ image_set_stereo_flag(ima, rr);
+ return rr;
}
void BKE_image_release_renderresult(Scene *scene, Image *ima)
@@ -2478,6 +2535,8 @@ static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr)
ibuf->userdata = NULL;
if (ima->rr)
ima->rr->framenr = framenr;
+
+ image_set_stereo_flag(ima, ima->rr);
}
static void image_check_stereo(Image *ima)
@@ -2487,7 +2546,7 @@ static void image_check_stereo(Image *ima)
return;
}
- if (RE_HasStereo3D(ima->rr))
+ if (RE_RenderResult_is_stereo(ima->rr))
ima->flag |= IMA_IS_STEREO;
else
ima->flag &= ~IMA_IS_STEREO;
@@ -2790,7 +2849,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
float *rectf, *rectz;
unsigned int *rect;
float dither;
- int channels, layer, pass;
+ int channels, layer, passtype;
ImBuf *ibuf;
int from_render = (ima->render_slot == ima->last_render_slot);
int actview;
@@ -2807,16 +2866,11 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
channels = 4;
layer = iuser->layer;
- pass = iuser->pass;
+ passtype = iuser->passtype;
actview = iuser->view;
- if ((iuser->flag & IMA_SHOW_STEREO) && (ima->flag & IMA_IS_STEREO)) {
- /* view == 0 shows stereo */
- if (actview == 0)
- actview = iuser->eye;
- else
- actview = actview - 1;
- }
+ if ((ima->flag & IMA_IS_STEREO) && (iuser->flag & IMA_SHOW_STEREO))
+ actview = iuser->eye;
if (from_render) {
RE_AcquireResultImage(re, &rres, actview);
@@ -2863,9 +2917,12 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
if (rl) {
RenderPass *rpass;
- /* "there's no combined pass, is in renderlayer itself" */
- /* -Now it does, no need to do pass - 1 (dfelinto) */
- rpass = BLI_findlink(&rl->passes, pass);
+ for (rpass = rl->passes.first; rpass; rpass = rpass->next) {
+ if (passtype == rpass->passtype &&
+ actview == rpass->view_id)
+ break;
+ }
+
if (rpass) {
channels = rpass->channels;
rectf = rpass->rect;
diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c
index 74fc3f5..f513b63 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -831,7 +831,7 @@ void draw_image_main(const bContext *C, ARegion *ar)
show_viewer = (ima && ima->source == IMA_SRC_VIEWER) != 0;
show_render = (show_viewer && ima->type == IMA_TYPE_R_RESULT) != 0;
show_paint = (ima && (sima->mode == SI_MODE_PAINT) && (show_viewer == false) && (show_render == false));
- show_stereo3d = (ima && ima->rr && (ima->flag & IMA_IS_STEREO) && (sima->iuser.flag & IMA_SHOW_STEREO));
+ show_stereo3d = (ima && (ima->flag & IMA_IS_STEREO) && (sima->iuser.flag & IMA_SHOW_STEREO));
if (show_viewer) {
/* use locked draw for drawing viewer image buffer since the compositor
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 01ba259..526e908 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1108,6 +1108,7 @@ static int image_open_exec(bContext *C, wmOperator *op)
iuser->framenr = 1;
iuser->offset = frame_ofs - 1;
iuser->fie_ima = 2;
+ BKE_image_init_imageuser(ima, iuser);
}
/* XXX unpackImage frees image buffers */
@@ -1631,6 +1632,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
RenderView *rv;
int i, orig_multi_index = sima->iuser.multi_index;
short orig_pass = sima->iuser.pass;
+ short orig_flag = sima->iuser.flag;
short orig_view = sima->iuser.view;
unsigned char planes = ibuf->planes;
@@ -1639,6 +1641,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
for (i=0, rv = (RenderView *)rr->views.first; rv; rv = rv->next, i++) {
sima->iuser.pass = get_multiview_pass_id(rr, &sima->iuser, i);
sima->iuser.view = i;
+ sima->iuser.flag &= ~IMA_SHOW_STEREO;
BKE_image_multilayer_index(rr, &sima->iuser);
srv = BLI_findstring(&scene->r.views, rv->name, offsetof(SceneRenderView, name));
@@ -1662,6 +1665,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
}
sima->iuser.pass = orig_pass;
+ sima->iuser.flag = orig_flag;
sima->iuser.view = orig_view;
sima->iuser.multi_index = orig_multi_index;
}
diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h
index 200b249..52ce1fd 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -64,12 +64,14 @@ typedef struct ImageUser {
} ImageUser;
-/* iuser->flag */
-#define IMA_ANIM_ALWAYS 1
-#define IMA_ANIM_REFRESHED 2
-/* #define IMA_DO_PREMUL 4 */
-#define IMA_NEED_FRAME_RECALC 8
-#define IMA_SHOW_STEREO 16
+/* ImageUser.flag */
+enum {
+ IMA_ANIM_ALWAYS = (1 << 0),
+ IMA_ANIM_REFRESHED = (1 << 1),
+/* IMA_DO_PREMUL = (1 << 2), */
+ IMA_NEED_FRAME_RECALC = (1 << 3),
+ IMA_SHOW_STEREO = (1 << 4),
+};
typedef struct Image {
ID id;
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 52fec76..4340541 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -688,12 +688,6 @@ static void rna_SpaceImageEditor_show_stereo_update(Main *U
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list