[Bf-blender-cvs] [0bfc90a] multiview: Multiview: refactor of UV/Image editor and image flags
Dalai Felinto
noreply at git.blender.org
Sat May 10 20:18:20 CEST 2014
Commit: 0bfc90a317d040179353b817c640e7487e62d03a
Author: Dalai Felinto
Date: Sat May 10 15:00:03 2014 -0300
https://developer.blender.org/rB0bfc90a317d040179353b817c640e7487e62d03a
Multiview: refactor of UV/Image editor and image flags
* showing 3d only when image is 3d and show 3d is on
* improve logic in 3dview to only handle 3d when in camera
* setting show_stereo as default mode for image editor
* image and Imageuser flags re-arranged
* image IMA_IS_STEREO flag set when opening image =)
* missing: rendered image needs to be tagged as IMA_IS_STEREO too
* also in some cases I need to force to see a different render layer to
get everything working
===================================================================
M release/scripts/startup/bl_ui/space_image.py
M source/blender/blenkernel/intern/image.c
M source/blender/blenloader/intern/versioning_270.c
M source/blender/editors/space_image/image_buttons.c
M source/blender/editors/space_image/image_draw.c
M source/blender/editors/space_image/image_ops.c
M source/blender/editors/space_image/space_image.c
M source/blender/editors/space_view3d/view3d_draw.c
M source/blender/imbuf/intern/openexr/openexr_api.cpp
M source/blender/makesdna/DNA_image_types.h
M source/blender/makesrna/intern/rna_image.c
M source/blender/makesrna/intern/rna_space.c
M source/blender/render/intern/source/render_result.c
M source/blender/windowmanager/WM_api.h
M source/blender/windowmanager/intern/wm_draw.c
M source/blender/windowmanager/intern/wm_stereo.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index f19e77e..0277b7e 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -430,6 +430,10 @@ class IMAGE_HT_header(Header):
if ima:
# layers
+ if sima.is_stereo:
+ row = layout.row()
+ row.prop(sima, "show_stereo", text="")
+
layout.template_image_layers(ima, iuser)
# draw options
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 1545d66..926570e 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -2379,20 +2379,33 @@ 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);
+
+ view = is_stereo ? iuser->eye : iuser->view;
for (rl = rr->layers.first; rl; rl = rl->next, rl_index++) {
rp_index = 0;
- for (rpass = rl->passes.first; rpass; rpass = rpass->next, index++, rp_index++)
- if (iuser->layer == rl_index && iuser->pass == rp_index)
+
+ for (rpass = rl->passes.first; rpass; rpass = rpass->next, index++, rp_index++) {
+ if (iuser->layer == rl_index &&
+ iuser->passtype == rpass->passtype &&
+ view == rpass->view_id) {
break;
+ }
+ }
if (rpass)
break;
}
- if (rpass)
+ if (rpass) {
iuser->multi_index = index;
- else
+ iuser->pass = rp_index;
+ }
+ else {
iuser->multi_index = 0;
+ iuser->pass = 0;
+ }
}
if (rpass == NULL) {
rl = rr->layers.first;
@@ -2467,6 +2480,19 @@ static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr)
ima->rr->framenr = framenr;
}
+static void image_check_stereo(Image *ima)
+{
+ if (!ima->rr) {
+ ima->flag &= ~IMA_IS_STEREO;
+ return;
+ }
+
+ if (RE_HasStereo3D(ima->rr))
+ ima->flag |= IMA_IS_STEREO;
+ else
+ ima->flag &= ~IMA_IS_STEREO;
+}
+
/* common stuff to do with images after loading */
static void image_initialize_after_load(Image *ima, ImBuf *ibuf)
{
@@ -2484,6 +2510,8 @@ static void image_initialize_after_load(Image *ima, ImBuf *ibuf)
ima->ok = IMA_OK_LOADED;
+ /* set proper stereo 3d flag */
+ image_check_stereo(ima);
}
static int imbuf_alpha_flags_for_image(Image *ima)
@@ -2782,7 +2810,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
pass = iuser->pass;
actview = iuser->view;
- if (iuser->flag & IMA_STEREO3D) {
+ if ((iuser->flag & IMA_SHOW_STEREO) && (ima->flag & IMA_IS_STEREO)) {
/* view == 0 shows stereo */
if (actview == 0)
actview = iuser->eye;
diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index a50d753..4de22ed 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -43,6 +43,7 @@
#include "DNA_mesh_types.h"
#include "DNA_modifier_types.h"
#include "DNA_camera_types.h"
+#include "DNA_view3d_types.h"
#include "DNA_genfile.h"
@@ -285,6 +286,7 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
Scene *scene;
SceneRenderView *srv;
Camera *cam;
+ bScreen *screen;
if (!DNA_struct_elem_find(fd->filesdna, "RenderData", "ListBase", "views")) {
for (scene = main->scene.first; scene; scene = scene->id.next) {
@@ -298,6 +300,30 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
}
}
+ for (screen = main->screen.first; screen; screen = screen->id.next) {
+ ScrArea *sa;
+ for (sa = screen->areabase.first; sa; sa = sa->next) {
+ SpaceLink *sl;
+
+ for (sl = sa->spacedata.first; sl; sl= sl->next) {
+ switch (sl->spacetype) {
+ case SPACE_VIEW3D:
+ {
+ View3D *v3d = (View3D*) sl;
+ v3d->stereo_camera = STEREO_3D_ID;
+ break;
+ }
+ case SPACE_IMAGE:
+ {
+ SpaceImage *sima = (SpaceImage *) sl;
+ sima->iuser.flag |= IMA_SHOW_STEREO;
+ break;
+ }
+ }
+ }
+ }
+ }
+
if (!DNA_struct_elem_find(fd->filesdna, "Camera", "CameraStereoSettings", "stereo")) {
for (cam = main->camera.first; cam; cam = cam->id.next) {
cam->stereo.interocular_distance = 0.065;
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index 1a4619c..108e32e 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -393,7 +393,7 @@ static void ui_imageuser_pass_menu(bContext *UNUSED(C), uiLayout *layout, void *
fake_name = ui_imageuser_pass_fake_name(rl);
if (fake_name) {
- BLI_strncpy(rpass_fake.internal_name, fake_name, sizeof(rpass_fake.name));
+ BLI_strncpy(rpass_fake.internal_name, fake_name, sizeof(rpass_fake.internal_name));
nr += 1;
}
@@ -408,7 +408,7 @@ static void ui_imageuser_pass_menu(bContext *UNUSED(C), uiLayout *layout, void *
final:
uiDefButS(block, BUTM, B_NOP, IFACE_(rpass->internal_name), 0, 0,
- UI_UNIT_X * 5, UI_UNIT_X, &iuser->pass, (float) nr, 0.0, 0, -1, "");
+ UI_UNIT_X * 5, UI_UNIT_X, &iuser->passtype, (float) rpass->passtype, 0.0, 0, -1, "");
}
if (fake_name) {
@@ -449,100 +449,15 @@ static void ui_imageuser_view_menu(bContext *UNUSED(C), uiLayout *layout, void *
BLI_assert(nr == -1);
}
-/* get the view for the current eye */
-static int get_view_from_renderesult(RenderResult *rr, const char *viewname)
-{
- RenderView *rv;
- int nr;
-
- for (nr=0, rv = (RenderView *)rr->views.first; rv; rv=rv->next, nr++) {
-
- if (strcmp(rv->name, viewname) == 0)
- return nr;
- }
-
- return 0;
-}
-
-/* return the real pass id */
-/* similar to get_multiview_pass_id in image_ops.c */
-static int get_pass_id(RenderResult *rr, ImageUser *iuser)
-{
- RenderLayer *rl;
- RenderPass *rpass = NULL;
- int passtype;
- short rl_index = 0, rp_index;
- int view_id = iuser->view;
-
- int view_left, view_right;
- int show_stereo3d = false;
-
- if (rr == NULL || iuser == NULL)
- return 0;
-
- if (BLI_countlist(&rr->views) < 2)
- return iuser->pass_tmp;
-
- /* view == 0 shows stereo */
- if ((iuser->flag & IMA_STEREO3D)) {
- if(view_id-- == 0)
- show_stereo3d = true;
- }
-
- if (show_stereo3d) {
- view_right = get_view_from_renderesult(rr, STEREO_RIGHT_NAME);
- view_left = get_view_from_renderesult(rr, STEREO_LEFT_NAME);
- }
-
- if (RE_HasFakeLayer(rr))
- rl_index ++; /* fake compo/sequencer layer */
-
- rl = BLI_findlink(&rr->layers, rl_index);
- if (!rl) return iuser->pass_tmp;
-
- rp_index = 0;
- passtype = 0;
- for (rpass = rl->passes.first; rpass; rpass = rpass->next, rp_index++) {
- if (iuser->pass_tmp == rp_index)
- passtype = rpass->passtype;
-
- if (rpass->passtype == passtype) {
- if (show_stereo3d == false) {
- if (rpass->view_id == view_id)
- return rp_index;
- }
- else {
- if (rpass->view_id == view_right)
- iuser->pass_right = rp_index;
- else if (rpass->view_id == view_left)
- iuser->pass_left = rp_index;
- }
- }
- }
-
- if (show_stereo3d == true) {
- iuser->pass = iuser->pass_right;
- BKE_image_multilayer_index(rr, iuser);
- iuser->multi_index_right = iuser->multi_index;
-
- iuser->pass = iuser->pass_left;
- BKE_image_multilayer_index(rr, iuser);
- iuser->multi_index_left = iuser->multi_index;
- }
-
- return iuser->pass_tmp;
-}
-
/* 5 layer button callbacks... */
static void image_multi_cb(bContext *C, void *rr_v, void *iuser_v)
{
ImageUser *iuser = iuser_v;
- iuser->pass = get_pass_id(rr_v, iuser);
-
BKE_image_multilayer_index(rr_v, iuser);
WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
}
+
static void image_multi_inclay_cb(bContext *C, void *rr_v, void *iuser_v)
{
RenderResult *rr = rr_v;
@@ -666,13 +581,13 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, Image
fake_name = ui_imageuser_pass_fake_name(rl);
rpass = (rl ? BLI_findlink(&rl->passes, iuser->pass - (fake_name ? 1 : 0)) : NULL);
- display_name = rpass ? rpass->name : (fake_name ? fake_name : "");
+ display_name = rpass ? rpass->internal_name : (fake_name ? fake_name : "");
but = uiDefMenuBut(block, ui_imageuser_pass_menu, rnd_pt, display_name, 0, 0, wmenu3, UI_UNIT_Y, TIP_("Select Pass"));
uiButSetFunc(but, image_multi_cb, rr, iuser);
uiButSetMenuFromPulldown(but);
/* view */
- if (BLI_countlist(&rr->views) > 1) {
+ if (BLI_countlist(&rr->views) > 1 && ((iuser->flag & IMA_SHOW_STEREO) == 0)) {
rview = BLI_findlink(&rr->views, iuser->view);
display_name = rview ? rview->name : "";
@@ -680,8 +595,6 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, Image
uiButSetFunc(but, image_multi_cb, rr, iuser);
uiButSetMenuFromPulldown(but);
}
- else
- iuser->flag &= ~IMA_STEREO3D;
}
}
diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c
index 45d4086..74fc3f5 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -801,7 +801,7 @@ void draw_image_main(const bContext *C, ARegion *ar)
Image *ima;
ImBuf *ibuf;
float zoomx, zoomy;
- bool show_viewer, show_render, show_paint;
+ bool show_viewer, show_render, show_paint, show_stereo3d;
void *lock;
/* XXX can we do this in refresh? */
@@ -831,6 +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));
if (show_viewer) {
/* use locked draw for drawing viewer image buffer since the compositor
@@ -841,18 +842,9 @@ void draw_image_main(const bContext *C, ARegion *ar)
BLI_lock_thread(LOCK_DRAW_IMAGE);
}
- /
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list