[Bf-blender-cvs] [483b953] multiview: Store StereoDisplay in the image dna to use when re-saving the image
Dalai Felinto
noreply at git.blender.org
Sun Sep 7 01:17:50 CEST 2014
Commit: 483b9532a584131e44f7780ad94b2d189a10b7c8
Author: Dalai Felinto
Date: Sat Sep 6 17:11:26 2014 +0200
Branches: multiview
https://developer.blender.org/rB483b9532a584131e44f7780ad94b2d189a10b7c8
Store StereoDisplay in the image dna to use when re-saving the image
===================================================================
M source/blender/blenkernel/intern/image.c
M source/blender/blenkernel/intern/scene.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/versioning_270.c
M source/blender/blenloader/intern/writefile.c
M source/blender/editors/space_image/image_ops.c
M source/blender/makesdna/DNA_image_types.h
===================================================================
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 11efe53..3fdc281 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -322,6 +322,7 @@ void BKE_image_free(Image *ima)
}
image_free_views(ima);
+ MEM_freeN(ima->stereo_format);
}
/* only image block itself */
@@ -345,7 +346,9 @@ static Image *image_alloc(Main *bmain, const char *name, short source, short typ
ima->flag |= IMA_VIEW_AS_RENDER;
BKE_color_managed_colorspace_settings_init(&ima->colorspace_settings);
+ ima->stereo_format = MEM_mallocN(sizeof(StereoDisplay), "Image Stereo Format");
}
+
return ima;
}
@@ -376,6 +379,18 @@ static void image_assign_ibuf(Image *ima, ImBuf *ibuf, int index, int frame)
}
}
+static void copy_image_views(ListBase *lbn, ListBase *lbo)
+{
+ ImageView *iv, *ivn;
+ lbn->first = lbn->last = NULL;
+ iv = lbo->first;
+ while(iv) {
+ ivn = MEM_dupallocN(iv);
+ BLI_addtail(lbn, ivn);
+ iv = iv->next;
+ }
+}
+
/* empty image block, of similar type and filename */
Image *BKE_image_copy(Main *bmain, Image *ima)
{
@@ -400,6 +415,9 @@ Image *BKE_image_copy(Main *bmain, Image *ima)
if (ima->packedfile)
nima->packedfile = dupPackedFile(ima->packedfile);
+ nima->stereo_format = MEM_dupallocN(ima->stereo_format);
+ copy_image_views(&nima->views, &ima->views);
+
return nima;
}
@@ -2662,8 +2680,7 @@ static size_t image_num_files(Image *ima)
if (!is_multiview) {
return 1;
}
- else if(false){
- /* XXX MV not supported yet R_IMF_VIEWS_STEREO_3D */
+ else if(ima->views_format == R_IMF_VIEWS_STEREO_3D){
return 1;
}
/* R_IMF_VIEWS_INDIVIDUAL */
@@ -2747,10 +2764,12 @@ static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int frame)
ima->ok = 0;
}
- /** XXX MV S3D LOAD STEREO IMAGES
- * this will mean we will use ibuf[0] and make ibuf[0] = left, ibuf[1] = right
- * so from that point on we use totviews instead of totfiles for ibufs
- */
+ if (ima->views_format == R_IMF_VIEWS_STEREO_3D) {
+ /** XXX MV S3D LOAD STEREO IMAGES
+ * this will mean we will use ibuf[0] and make ibuf[0] = left, ibuf[1] = right
+ * so from that point on we use totviews instead of totfiles for ibufs
+ */
+ }
if (assign) {
if (!is_multiview)
@@ -2969,10 +2988,12 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
ima->ok = 0;
}
- /** XXX MV S3D LOAD STEREO IMAGES
- * this will mean we will use ibuf[0] and make ibuf[0] = left, ibuf[1] = right
- * so from that point on we use totviews instead of totfiles for ibufs
- */
+ if (ima->views_format == R_IMF_VIEWS_STEREO_3D) {
+ /** XXX MV S3D LOAD STEREO IMAGES
+ * this will mean we will use ibuf[0] and make ibuf[0] = left, ibuf[1] = right
+ * so from that point on we use totviews instead of totfiles for ibufs
+ */
+ }
if (assign) {
if (!is_multiview)
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index e41948e..753e0b2 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -2231,4 +2231,3 @@ size_t BKE_scene_num_videos(const RenderData *rd)
return BKE_scene_num_views(rd);
}
}
-
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 2ef9509..5957002 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3335,6 +3335,7 @@ static void direct_link_image(FileData *fd, Image *ima)
ima->packedfile = direct_link_packedfile(fd, ima->packedfile);
ima->preview = direct_link_preview_image(fd, ima->preview);
+ ima->stereo_format = newdataadr(fd, ima->stereo_format);
ima->ok = 1;
}
diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index a4f73e9..8f1c520 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -66,6 +66,7 @@
#include "readfile.h"
+#include "MEM_guardedalloc.h"
static void do_version_constraints_radians_degrees_270_1(ListBase *lb)
{
@@ -430,10 +431,10 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
}
}
- if (!DNA_struct_elem_find(fd->filesdna, "Image", "ListBase", "views")) {
+ if (!DNA_struct_elem_find(fd->filesdna, "Image", "StereoDisplay", "*stereo_format")) {
Image *ima;
for (ima = main->image.first; ima; ima = ima->id.next) {
- ima->views.first = ima->views.last = NULL;
+ ima->stereo_format = MEM_mallocN(sizeof(StereoDisplay), "Image Stereo Format");
}
}
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index e97ba3f..3c0ccbd 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2102,10 +2102,12 @@ static void write_images(WriteData *wd, ListBase *idbase)
writedata(wd, DATA, pf->size, pf->data);
}
+ write_previews(wd, ima->preview);
+
for (iv = ima->views.first; iv; iv = iv->next)
writestruct(wd, DATA, "ImageView", 1, iv);
+ writestruct(wd, DATA, "StereoDisplay", 1, ima->stereo_format);
- write_previews(wd, ima->preview);
}
ima= ima->id.next;
}
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 00398cb..9dafe7d 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1045,14 +1045,40 @@ static int image_sequence_get_len(ListBase *frames, int *ofs)
}
/* handle the individual views case */
-static bool image_open_multiview(Scene *scene, Image *ima, ReportList *reports)
+static void image_open_multiview(wmOperator *op, Scene *scene, Image *ima)
{
SceneRenderView *srv;
char prefix[FILE_MAX] = {'\0'};
char *name = ima->name;
char *ext;
ImageView *iv;
- bool ok = true;
+ 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_output == 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->stereo_format = imf->stereo_output;
+ ima->views_format = R_IMF_VIEWS_STEREO_3D;
+ return;
+ }
+
+ /* R_IMF_VIEWS_STEREO_3D */
/* begin of extension */
for (ext = name + strlen(name);(ext != name) && (ext[0] != '.'); ext--);
@@ -1070,9 +1096,7 @@ static bool image_open_multiview(Scene *scene, Image *ima, ReportList *reports)
}
if (prefix[0] == '\0') {
- ok = false;
- BKE_report(reports, RPT_ERROR, "Filename matches no scene views' suffix");
- goto finally;
+ goto monoview;
}
/* create all the image views */
@@ -1097,23 +1121,29 @@ static bool image_open_multiview(Scene *scene, Image *ima, ReportList *reports)
/* exists? */
file = BLI_open(str, O_BINARY | O_RDONLY, 0);
if (file == -1) {
- ok = false;
- BKE_reportf(reports, RPT_ERROR, "File %s not found", str);
- goto finally;
+ ImageView *iv_del = iv;
+ iv = iv_del->prev;
+ BLI_remlink(&ima->views, iv_del);
+ MEM_freeN(iv_del);
}
close(file);
}
/* all good */
- ima->flag |= IMA_IS_MULTIVIEW;
- if (BKE_scene_is_stereo3d(&scene->r))
- ima->flag |= IMA_IS_STEREO;
-
-finally:
- if (!ok)
+ 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);
+ }
- return ok;
+ /* monoview and multiview rely on individual images */
+ ima->views_format = R_IMF_VIEWS_INDIVIDUAL;
}
static int image_open_exec(bContext *C, wmOperator *op)
@@ -1130,7 +1160,6 @@ static int image_open_exec(bContext *C, wmOperator *op)
int frame_seq_len = 0;
int frame_ofs = 1;
- const bool is_multiview = RNA_boolean_get(op->ptr, "use_multiple_views");
const bool is_relative_path = RNA_boolean_get(op->ptr, "relative_path");
RNA_string_get(op->ptr, "filepath", path);
@@ -1157,16 +1186,12 @@ static int image_open_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- if (is_multiview) {
- if(!image_open_multiview(scene, ima, op->reports)) {
- BKE_image_free(ima);
- return OPERATOR_CANCELLED;
- }
- }
-
if (!op->customdata)
image_open_init(C, op);
+ /* handle multiview images */
+ image_open_multiview(op, scene, ima);
+
/* only image path after save, never ibuf */
if (is_relative_path) {
const char *relbase = ID_BLEND_PATH(bmain, &ima->id);
@@ -1268,7 +1293,7 @@ static int image_open_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(
image_open_init(C, op);
- /* show multiview save options only if image has multiviews */
+ /* show multiview save options only if scene has multiviews */
prop = RNA_struct_find_property(op->ptr, "use_multiple_views");
RNA_property_boolean_set(op->ptr, prop, (scene->r.scemode & R_MULTIVIEW));
diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h
index 039dcb2..31ae562 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -126,12 +126,13 @@ typedef struct Image {
ColorManagedColorspaceSettings colorspace_settings;
char alpha_mode;
- char pad[6];
+ char pad[5];
- /* multiview */
+ /* Multiview */
char eye; /* for viewer node stereoscopy */
+ char views_format;
ListBase views;
-
+ struct StereoDisplay *stereo_format;
} Image;
More information about the Bf-blender-cvs
mailing list