[Bf-blender-cvs] [327007e] multiview: New Stereo Output option: Squeezed Frame

Dalai Felinto noreply at git.blender.org
Tue Aug 26 19:03:15 CEST 2014


Commit: 327007e9335339fb9110da62b17ac50e55aee132
Author: Dalai Felinto
Date:   Tue Aug 26 19:02:56 2014 +0200
Branches: multiview
https://developer.blender.org/rB327007e9335339fb9110da62b17ac50e55aee132

New Stereo Output option: Squeezed Frame

So now top-bottom and side-by-side can be saved as squeezed (default) or unqueezed (old).

===================================================================

M	source/blender/editors/space_image/image_buttons.c
M	source/blender/imbuf/IMB_imbuf.h
M	source/blender/imbuf/intern/stereoimbuf.c
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/makesrna/intern/rna_scene.c
M	source/blender/render/intern/source/pipeline.c
M	source/blender/render/intern/source/render_result.c

===================================================================

diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index f996823..9913c55 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -1069,6 +1069,11 @@ void uiTemplateImageViews(uiLayout *layout, PointerRNA *imfptr)
 		case S3D_DISPLAY_SIDEBYSIDE:
 		{
 			uiItemR(col, &stereo_output_ptr, "use_sidebyside_crosseyed", 0, NULL, ICON_NONE);
+			/* fall-through */
+		}
+		case S3D_DISPLAY_TOPBOTTOM:
+		{
+			uiItemR(col, &stereo_output_ptr, "use_squeezed_frame", 0, NULL, ICON_NONE);
 			break;
 		}
 	}
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index d50b37f..14da688 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -562,7 +562,7 @@ const char *IMB_ffmpeg_last_error(void);
  *
  * \attention Defined in stereoimbuf.c
  */
-void IMB_stereo_dimensions(const char mode, const size_t width, const size_t height, size_t *r_width, size_t *r_height);
+void IMB_stereo_dimensions(const char mode, const bool is_squeezed, const size_t width, const size_t height, size_t *r_width, size_t *r_height);
 int *IMB_stereo_from_rect(struct ImageFormatData *im_format, const size_t x, const size_t y, const size_t channels, int *left, int *right);
 float *IMB_stereo_from_rectf(struct ImageFormatData *im_format, const size_t x, const size_t y, const size_t channels, float *left, float *right);
 struct ImBuf *IMB_stereoImBuf(struct ImageFormatData *im_format, struct ImBuf *left, struct ImBuf *right);
diff --git a/source/blender/imbuf/intern/stereoimbuf.c b/source/blender/imbuf/intern/stereoimbuf.c
index f5c93c5..6251683 100644
--- a/source/blender/imbuf/intern/stereoimbuf.c
+++ b/source/blender/imbuf/intern/stereoimbuf.c
@@ -518,7 +518,7 @@ static void imb_stereo_topbottom(Stereo3DData *s3d)
 	}
 }
 
-void IMB_stereo_dimensions(const char mode, const size_t width, const size_t height, size_t *r_width, size_t *r_height)
+void IMB_stereo_dimensions(const char mode, const bool is_squeezed, const size_t width, const size_t height, size_t *r_width, size_t *r_height)
 {
 	switch (mode) {
 		case S3D_DISPLAY_BLURAY:
@@ -528,14 +528,14 @@ void IMB_stereo_dimensions(const char mode, const size_t width, const size_t hei
 		}
 		case S3D_DISPLAY_SIDEBYSIDE:
 		{
-			*r_width = width * 2;
+			*r_width = is_squeezed ? width : width * 2;
 			*r_height = height;
 			break;
 		}
 		case S3D_DISPLAY_TOPBOTTOM:
 		{
 			*r_width = width;
-			*r_height = height * 2;
+			*r_height = is_squeezed ? height : height * 2;
 			break;
 		}
 		case S3D_DISPLAY_ANAGLYPH:
@@ -549,6 +549,72 @@ void IMB_stereo_dimensions(const char mode, const size_t width, const size_t hei
 	}
 }
 
+/**************************** squeeze frame ****************************************/
+
+static void imb_stereo_squeeze_ImBuf(ImBuf *ibuf, StereoDisplay *s3d, const size_t x, const size_t y)
+{
+	if (ELEM(s3d->display_mode, S3D_DISPLAY_SIDEBYSIDE, S3D_DISPLAY_TOPBOTTOM) == false)
+		return;
+
+	if ((s3d->flag & S3D_UNSQUEEZED_FRAME))
+		return;
+
+	IMB_scaleImBuf_threaded(ibuf, x, y);
+}
+
+static void imb_stereo_squeeze_rectf(float *rectf, StereoDisplay *s3d, const size_t x, const size_t y, const size_t channels)
+{
+	ImBuf *ibuf;
+	size_t width, height;
+
+	if (ELEM(s3d->display_mode, S3D_DISPLAY_SIDEBYSIDE, S3D_DISPLAY_TOPBOTTOM) == false)
+		return;
+
+	if ((s3d->flag & S3D_UNSQUEEZED_FRAME))
+		return;
+
+	/* creates temporary imbuf to store the rectf */
+	IMB_stereo_dimensions(s3d->display_mode, false, x, y, &width, &height);
+	ibuf = IMB_allocImBuf(width, height, channels, IB_rectfloat);
+
+	IMB_buffer_float_from_float(
+	           ibuf->rect_float, rectf, channels,
+	           IB_PROFILE_LINEAR_RGB, IB_PROFILE_LINEAR_RGB, false,
+	           width, height, width, width);
+
+	IMB_scaleImBuf_threaded(ibuf, x, y);
+	rectf = MEM_dupallocN(ibuf->rect_float);
+	IMB_freeImBuf(ibuf);
+}
+
+static void imb_stereo_squeeze_rect(int *rect, StereoDisplay *s3d, const size_t x, const size_t y, const size_t channels)
+{
+	ImBuf *ibuf;
+	size_t width, height;
+
+	if (ELEM(s3d->display_mode, S3D_DISPLAY_SIDEBYSIDE, S3D_DISPLAY_TOPBOTTOM) == false)
+		return;
+
+	if ((s3d->flag & S3D_UNSQUEEZED_FRAME))
+		return;
+
+	/* creates temporary imbuf to store the rectf */
+	IMB_stereo_dimensions(s3d->display_mode, false, x, y, &width, &height);
+	ibuf = IMB_allocImBuf(width, height, channels, IB_rect);
+
+	IMB_buffer_byte_from_byte(
+	            (unsigned char *)ibuf->rect, (unsigned char *)rect,
+	            IB_PROFILE_SRGB, IB_PROFILE_SRGB, false,
+	            width, height, width, width);
+
+	IMB_scaleImBuf_threaded(ibuf, x, y);
+	rect = MEM_dupallocN(ibuf->rect);
+	IMB_freeImBuf(ibuf);
+}
+
+
+/*************************** preparing to call the functions **************************/
+
 static void imb_stereo_data_initialize(Stereo3DData *s3d_data, ImageFormatData *im_format,
                                        const size_t x, const size_t y, const size_t channels,
                                        int *left_rect, int *right_rect, int *r_rect,
@@ -572,11 +638,12 @@ int *IMB_stereo_from_rect(ImageFormatData *im_format, const size_t x, const size
 	Stereo3DData s3d_data = {{NULL}};
 	size_t width, height;
 
-	IMB_stereo_dimensions(im_format->stereo_output.display_mode, x, y, &width, &height);
+	IMB_stereo_dimensions(im_format->stereo_output.display_mode, false, x, y, &width, &height);
 	r_rect = MEM_mallocN(channels * sizeof(int) * width * height, __func__);
 
 	imb_stereo_data_initialize(&s3d_data, im_format, x, y, channels, left, right, r_rect, NULL, NULL, NULL);
 	imb_stereo_doit(&s3d_data, &im_format->stereo_output);
+	imb_stereo_squeeze_rect(r_rect, &im_format->stereo_output, x, y, channels);
 
 	return r_rect;
 }
@@ -587,11 +654,12 @@ float *IMB_stereo_from_rectf(ImageFormatData *im_format, const size_t x, const s
 	Stereo3DData s3d_data = {{NULL}};
 	size_t width, height;
 
-	IMB_stereo_dimensions(im_format->stereo_output.display_mode, x, y, &width, &height);
+	IMB_stereo_dimensions(im_format->stereo_output.display_mode, false, x, y, &width, &height);
 	r_rectf = MEM_mallocN(channels * sizeof(float) * width * height, __func__);
 
 	imb_stereo_data_initialize(&s3d_data, im_format, x, y, channels, NULL, NULL, NULL, left, right, r_rectf);
 	imb_stereo_doit(&s3d_data, &im_format->stereo_output);
+	imb_stereo_squeeze_rectf(r_rectf, &im_format->stereo_output, x, y, channels);
 
 	return r_rectf;
 }
@@ -604,14 +672,16 @@ ImBuf *IMB_stereoImBuf(ImageFormatData *im_format, ImBuf *left, ImBuf *right)
 	size_t width, height;
 	const bool is_float = im_format->depth > 8;
 
-	IMB_stereo_dimensions(im_format->stereo_output.display_mode, left->x, left->y, &width, &height);
+	IMB_stereo_dimensions(im_format->stereo_output.display_mode, false, left->x, left->y, &width, &height);
 	r_ibuf = IMB_allocImBuf(width, height, left->planes, (is_float ? IB_rectfloat : IB_rect));
 
 	imb_stereo_data_initialize(&s3d_data, im_format, left->x, left->y, 4,
-		                         (int *)left->rect, (int *)right->rect, (int *)r_ibuf->rect,
-		                         left->rect_float, right->rect_float, r_ibuf->rect_float);
+	                         (int *)left->rect, (int *)right->rect, (int *)r_ibuf->rect,
+	                         left->rect_float, right->rect_float, r_ibuf->rect_float);
 
 	imb_stereo_doit(&s3d_data, &im_format->stereo_output);
+	imb_stereo_squeeze_ImBuf(r_ibuf, &im_format->stereo_output, left->x, left->y);
+
 	return r_ibuf;
 }
 
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 3c9d357..f098cba 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -879,6 +879,7 @@ typedef enum eStereoDisplayMode {
 typedef enum eStereoFlag {
 	S3D_INTERLACE_SWAP        = (1 << 0),
 	S3D_SIDEBYSIDE_CROSSEYED  = (1 << 1),
+	S3D_UNSQUEEZED_FRAME      = (1 << 2),
 } eStereoFlag;
 
 /* StereoDisplay.anaglyph_type */
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 260bfe6..c7bba17 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -4089,6 +4089,10 @@ static void rna_def_image_format_stereo_output(BlenderRNA *brna)
 	prop = RNA_def_property(srna, "use_sidebyside_crosseyed", PROP_BOOLEAN, PROP_BOOLEAN);
 	RNA_def_property_boolean_sdna(prop, NULL, "flag", S3D_SIDEBYSIDE_CROSSEYED);
 	RNA_def_property_ui_text(prop, "Cross-Eyed", "Right eye should see left image and vice-versa");
+
+	prop = RNA_def_property(srna, "use_squeezed_frame", PROP_BOOLEAN, PROP_BOOLEAN);
+	RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", S3D_UNSQUEEZED_FRAME);
+	RNA_def_property_ui_text(prop, "Squeezed Frame", "Combine both views in a squeezed image");
 }
 
 /* use for render output and image save operator,
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index c286007..fdf6743 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -3303,7 +3303,7 @@ static void get_videos_dimensions(Render *re, RenderData *rd, size_t *r_width, s
 	if ((rd->scemode & R_MULTIVIEW) &&
 	    rd->im_format.views_output == R_IMF_VIEWS_STEREO_3D)
 	{
-		IMB_stereo_dimensions(rd->im_format.stereo_output.display_mode, width, height, r_width, r_height);
+		IMB_stereo_dimensions(rd->im_format.stereo_output.display_mode, ((rd->im_format.stereo_output.flag & S3D_UNSQUEEZED_FRAME) == 0), width, height, r_width, r_height);
 	}
 	else {
 		*r_width = width;
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index dface91..6447c64 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -1074,7 +1074,7 @@ bool RE_WriteRenderResult(ReportList *reports, RenderResult *rr, const char *fil
 		rectf_stereo = MEM_mallocN(sizeof(float *) * ((totpasses / 2) + 1), "RenderResult stereo pairs");
 
 		IMB_exr_add_view(exrhandle, "")

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list