[Bf-blender-cvs] [1111b21] multiview: Support image views format change in the image panel - so user can drag&drop images and change their type afterwards
Dalai Felinto
noreply at git.blender.org
Thu Sep 11 15:45:15 CEST 2014
Commit: 1111b2101e9d845cc5a369de94171e536e1d1fd6
Author: Dalai Felinto
Date: Thu Sep 11 15:45:16 2014 +0200
Branches: multiview
https://developer.blender.org/rB1111b2101e9d845cc5a369de94171e536e1d1fd6
Support image views format change in the image panel - so user can drag&drop images and change their type afterwards
===================================================================
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_ops.c
M source/blender/makesrna/intern/rna_image.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 47dca2f..3dd6ee4 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -675,7 +675,8 @@ class IMAGE_PT_stereo_3d_properties(Panel):
def poll(cls, context):
sima = context.space_data
image = sima.image if sima else None
- return (sima and image and image.type == 'IMAGE' and image.is_multiview and image.views_format == 'STEREO_3D')
+ return (sima and image and image.type == 'IMAGE' and \
+ context.scene.render.use_multiple_views)
def draw(self, context):
layout = self.layout
@@ -683,7 +684,12 @@ class IMAGE_PT_stereo_3d_properties(Panel):
sima = context.space_data
ima = sima.image
- box = layout.box()
+ col = layout
+ col.label(text="Views Format:")
+ col.row().prop(ima, "views_format", expand=True)
+
+ box = col.box()
+ box.active = ima.views_format == 'STEREO_3D'
box.template_image_stereo_3d(ima.stereo_3d_format)
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 068ad6a..53b129e 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -203,6 +203,9 @@ struct RenderPass *BKE_image_multilayer_index(struct RenderResult *rr, struct Im
/* sets index offset for multiview files */
void BKE_image_multiview_index(struct Image *ima, struct ImageUser *iuser);
+/* called on image settings change (in ui) */
+void BKE_image_update_views_format(struct Scene *scene, struct Image *ima);
+
/* for multilayer images as well as for render-viewer */
bool BKE_image_is_multilayer(struct Image *ima);
struct RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, struct Image *ima);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index cb131f9..7bfb843 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -4215,3 +4215,108 @@ ImBuf *BKE_image_get_first_ibuf(Image *image)
return ibuf;
}
+
+void BKE_image_update_views_format(Scene *scene, Image *ima)
+{
+ SceneRenderView *srv;
+ ImageView *iv;
+ const bool is_multiview = (scene->r.scemode & R_MULTIVIEW) != 0;
+
+ /* reset the image views */
+ BKE_image_free_views(ima);
+
+ if (!is_multiview) {
+ goto monoview;
+ }
+ else if (ima->views_format == R_IMF_VIEWS_STEREO_3D) {
+ size_t i;
+ const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
+
+ ima->flag |= IMA_IS_MULTIVIEW;
+ ima->flag |= IMA_IS_STEREO;
+
+ for (i = 0; i < 2; i++) {
+ iv = MEM_mallocN(sizeof(ImageView), "Image View Stereo (open)");
+ BLI_strncpy(iv->name, names[i], sizeof(iv->name));
+ BLI_strncpy(iv->filepath, ima->name, sizeof(iv->filepath));
+ BLI_addtail(&ima->views, iv);
+ }
+
+ ima->views_format = R_IMF_VIEWS_STEREO_3D;
+ return;
+ }
+ else {
+ /* R_IMF_VIEWS_INDIVIDUAL */
+ char prefix[FILE_MAX] = {'\0'};
+ char *name = ima->name;
+ char *ext;
+
+ size_t index_act;
+ char *suf_act;
+ const char delims[] = {'.', '\0'};
+
+ /* begin of extension */
+ index_act = BLI_str_rpartition(name, delims, &ext, &suf_act);
+ BLI_assert(index_act > 0);
+
+ for (srv = scene->r.views.first; srv; srv = srv->next) {
+ if (BKE_scene_render_view_active(&scene->r, srv)) {
+ size_t len = strlen(srv->suffix);
+ if (STREQLEN(ext - len, srv->suffix, len)) {
+ BLI_strncpy(prefix, name, strlen(name) - strlen(ext) - len + 1);
+ break;
+ }
+ }
+ }
+
+ if (prefix[0] == '\0') {
+ goto monoview;
+ }
+
+ /* create all the image views */
+ for (srv = scene->r.views.first; srv; srv = srv->next) {
+ if (BKE_scene_render_view_active(&scene->r, srv)) {
+ iv = MEM_mallocN(sizeof(ImageView), "Image View (open)");
+ BLI_strncpy(iv->name, srv->name, sizeof(iv->name));
+
+ sprintf(iv->filepath, "%s%s%s", prefix, srv->suffix, ext);
+ BLI_addtail(&ima->views, iv);
+ }
+ }
+
+ /* check if the files are all available */
+ for (iv = ima->views.first; iv; iv = iv->next) {
+ int file;
+ char str[FILE_MAX];
+
+ BLI_strncpy(str, iv->filepath, sizeof(str));
+ BLI_path_abs(str, G.main->name);
+
+ /* exists? */
+ file = BLI_open(str, O_BINARY | O_RDONLY, 0);
+ if (file == -1) {
+ ImageView *iv_del = iv;
+ iv = iv_del->prev;
+ BLI_remlink(&ima->views, iv_del);
+ MEM_freeN(iv_del);
+ }
+ close(file);
+ }
+
+ /* all good */
+ if (BLI_countlist(&ima->views) > 1) {
+ ima->flag |= IMA_IS_MULTIVIEW;
+ if (BKE_scene_is_stereo3d(&scene->r))
+ ima->flag |= IMA_IS_STEREO;
+ }
+ else {
+monoview:
+ ima->flag &= IMA_IS_STEREO;
+ ima->flag &= IMA_IS_MULTIVIEW;
+ BKE_image_free_views(ima);
+ }
+
+ /* monoview and multiview rely on individual images */
+ ima->views_format = R_IMF_VIEWS_INDIVIDUAL;
+ }
+}
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index c4954aa..31731fc 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1044,112 +1044,6 @@ static int image_sequence_get_len(ListBase *frames, int *ofs)
return 0;
}
-/* handle the individual views case */
-static void image_open_multiview(wmOperator *op, Scene *scene, Image *ima)
-{
- SceneRenderView *srv;
- ImageView *iv;
- ImageOpenData *iod = op->customdata;
- ImageFormatData *imf = &iod->im_format;
- const bool is_multiview = RNA_boolean_get(op->ptr, "use_multiple_views");
-
- if (!is_multiview) {
- goto monoview;
- }
- else if (imf->views_format == R_IMF_VIEWS_STEREO_3D) {
- size_t i;
- const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
-
- ima->flag |= IMA_IS_MULTIVIEW;
- ima->flag |= IMA_IS_STEREO;
-
- for (i = 0; i < 2; i++) {
- iv = MEM_mallocN(sizeof(ImageView), "Image View Stereo (open)");
- BLI_strncpy(iv->name, names[i], sizeof(iv->name));
- BLI_strncpy(iv->filepath, ima->name, sizeof(iv->filepath));
- BLI_addtail(&ima->views, iv);
- }
-
- *ima->stereo3d_format = imf->stereo3d_format;
- ima->views_format = R_IMF_VIEWS_STEREO_3D;
- return;
- }
- else {
- /* R_IMF_VIEWS_INDIVIDUAL */
- char prefix[FILE_MAX] = {'\0'};
- char *name = ima->name;
- char *ext;
-
- size_t index_act;
- char *suf_act;
- const char delims[] = {'.', '\0'};
-
- /* begin of extension */
- index_act = BLI_str_rpartition(name, delims, &ext, &suf_act);
- BLI_assert(index_act > 0);
-
- for (srv = scene->r.views.first; srv; srv = srv->next) {
- if (BKE_scene_render_view_active(&scene->r, srv)) {
- size_t len = strlen(srv->suffix);
- if (STREQLEN(ext - len, srv->suffix, len)) {
- BLI_strncpy(prefix, name, strlen(name) - strlen(ext) - len + 1);
- break;
- }
- }
- }
-
- if (prefix[0] == '\0') {
- goto monoview;
- }
-
- /* create all the image views */
- for (srv = scene->r.views.first; srv; srv = srv->next) {
- if (BKE_scene_render_view_active(&scene->r, srv)) {
- iv = MEM_mallocN(sizeof(ImageView), "Image View (open)");
- BLI_strncpy(iv->name, srv->name, sizeof(iv->name));
-
- sprintf(iv->filepath, "%s%s%s", prefix, srv->suffix, ext);
- BLI_addtail(&ima->views, iv);
- }
- }
-
- /* check if the files are all available */
- for (iv = ima->views.first; iv; iv = iv->next) {
- int file;
- char str[FILE_MAX];
-
- BLI_strncpy(str, iv->filepath, sizeof(str));
- BLI_path_abs(str, G.main->name);
-
- /* exists? */
- file = BLI_open(str, O_BINARY | O_RDONLY, 0);
- if (file == -1) {
- ImageView *iv_del = iv;
- iv = iv_del->prev;
- BLI_remlink(&ima->views, iv_del);
- MEM_freeN(iv_del);
- }
- close(file);
- }
-
- /* all good */
- if (BLI_countlist(&ima->views) > 1) {
- ima->flag |= IMA_IS_MULTIVIEW;
- if (BKE_scene_is_stereo3d(&scene->r))
- ima->flag |= IMA_IS_STEREO;
- }
- else {
- monoview:
- ima->flag &= IMA_IS_STEREO;
- ima->flag &= IMA_IS_MULTIVIEW;
- BKE_image_free_views(ima);
- }
-
- /* monoview and multiview rely on individual images */
- ima->views_format = R_IMF_VIEWS_INDIVIDUAL;
- }
-}
-
static int image_open_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
@@ -1157,7 +1051,7 @@ static int image_open_exec(bContext *C, wmOperator *op)
Scene *scene = CTX_data_scene(C);
Object *obedit = CTX_data_edit_object(C);
ImageUser *iuser = NULL;
- ImageOpenData *iod;
+ ImageOpenData *iod = op->customdata;
PointerRNA idptr;
Image *ima = NULL;
char path[FILE_MAX];
@@ -1194,7 +1088,22 @@ static int image_open_exec(bContext *C, wmOperator *op)
image_open_init(C, op);
/* handle multiview images */
- image_open_multiview(op, scene, ima);
+ if (RNA_boolean_get(op->ptr, "use_multiple_views")) {
+ ImageFormatData *imf = &iod->im_format;
+
+ ima->views_format = imf->views_format;
+ *ima->stereo3d_format = imf->stereo3d_format;
+
+ BKE_image_update_views_format(scene, ima);
+ }
+ else {
+ ima->flag &= IMA_IS_STEREO;
+ ima->flag &= IMA_IS_MULTIVIEW;
+ BKE_image_free_views(ima);
+
+ /* monoview and multiview rely on individual images */
+ ima->views_format = R_IMF_VIEWS_INDIVIDUAL;
+ }
/* only image path after save, never ibuf */
if (is_relative_path) {
diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c
index 7d0c70a..0f02e0f 100644
--- a/source/blender/makesrna/intern/rna_image.c
+++ b/source/blender/makesrna/intern/rna_image.c
@@ -138,6 +138,22 @@ static void rna_Image_colormanage_update(Main *UNUSED(bmain), Scene *UNUSED(scen
WM_main_add_notifier(NC_IMAGE | NA_EDITED, &ima->id);
}
+static void rna_Image_views_format_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
+{
+ Image *ima = ptr->id.data;
+ ImBuf *ibuf;
+ void *lock;
+
+ ibuf = BKE_image_acquire_ibuf(ima, NULL, &lock);
+
+ if (ibuf) {
+ BKE_image_update_views_format(scene, ima);
+ BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE);
+ }
+
+ BKE_image_release_ibuf(ima, ibuf, lock);
+}
+
static void rna_ImageUser_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
{
ImageUser *iuser = ptr->data;
@@ -788,7 +804,7 @@ static void rna_def_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list