[Bf-blender-cvs] [afe8054] multiview: Image support to multiview (not only RenderResult/Multilayer)

Dalai Felinto noreply at git.blender.org
Sun Sep 7 01:17:40 CEST 2014


Commit: afe805459667c41aebfdc9a3237f5e5ae69df98f
Author: Dalai Felinto
Date:   Thu Sep 4 15:29:33 2014 +0200
Branches: multiview
https://developer.blender.org/rBafe805459667c41aebfdc9a3237f5e5ae69df98f

Image support to multiview (not only RenderResult/Multilayer)

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

M	source/blender/blenkernel/BKE_image.h
M	source/blender/blenkernel/intern/image.c
M	source/blender/blenloader/intern/versioning_270.c
M	source/blender/compositor/nodes/COM_SplitViewerNode.cpp
M	source/blender/compositor/nodes/COM_ViewerNode.cpp
M	source/blender/compositor/operations/COM_ViewerOperation.cpp
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/makesdna/DNA_image_types.h
M	source/blender/windowmanager/intern/wm_operators.c

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

diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index c0221a5..169e869 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -52,8 +52,8 @@ struct Main;
 void   BKE_images_init(void);
 void   BKE_images_exit(void);
 
-void    BKE_image_free_cached_frames(struct Image *image);
 int     BKE_image_cache_count(struct Image *image);
+void    BKE_image_free_views(struct Image *image);
 void    BKE_image_free_buffers(struct Image *image);
 /* call from library */
 void    BKE_image_free(struct Image *image);
@@ -184,7 +184,7 @@ void BKE_image_walk_all_users(const struct Main *mainp, void *customdata,
 /* ensures an Image exists for viewing nodes or render */
 struct Image *BKE_image_verify_viewer(int type, const char *name);
 /* reset viewer nodes cache when the number of cache doesn't match the needed cached views */
-void BKE_image_verify_viewer_cache(const struct RenderData *rd, struct Image *ima, struct ImageUser *iuser);
+void BKE_image_verify_viewer_views(const struct RenderData *rd, struct Image *ima, struct ImageUser *iuser);
 
 /* force an ImBuf to become part of Image */
 void BKE_image_assign_ibuf(struct Image *ima, struct ImBuf *ibuf);
@@ -199,8 +199,11 @@ void BKE_image_update_frame(const struct Main *bmain, int cfra);
 /* sets index offset for multilayer files */
 struct RenderPass *BKE_image_multilayer_index(struct RenderResult *rr, struct ImageUser *iuser);
 
+/* sets index offset for multiview files */
+void BKE_image_multiview_index(struct Image *ima, struct ImageUser *iuser);
+
 /* for multilayer images as well as for render-viewer */
-bool BKE_image_is_stereo(struct Scene *scene, struct Image *ima);
+bool BKE_image_is_multilayer(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 7b591b0..ab3e5e3 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -256,11 +256,6 @@ static void image_free_cahced_frames(Image *image)
 	}
 }
 
-void BKE_image_free_cached_frames(Image *image)
-{
-	image_free_cahced_frames(image);
-}
-
 int BKE_image_cache_count(Image *image)
 {
 	if (image->cache)
@@ -269,6 +264,20 @@ int BKE_image_cache_count(Image *image)
 		return 0;
 }
 
+static void image_free_views(Image *ima)
+{
+	while (ima->views.last) {
+		ImageView *iv = ima->views.last;
+		BLI_remlink(&ima->views, iv);
+		MEM_freeN(iv);
+	}
+}
+
+void BKE_image_free_views(Image *image)
+{
+	image_free_views(image);
+}
+
 /**
  * Simply free the image data from memory,
  * on display the image can load again (except for render buffers).
@@ -311,6 +320,8 @@ void BKE_image_free(Image *ima)
 			ima->renders[a] = NULL;
 		}
 	}
+
+	image_free_views(ima);
 }
 
 /* only image block itself */
@@ -2170,27 +2181,58 @@ Image *BKE_image_verify_viewer(int type, const char *name)
 	return ima;
 }
 
+static void image_viewer_create_views(const RenderData *rd, Image *ima)
+{
+	SceneRenderView *srv;
+	ImageView *iv;
+	for (srv = rd->views.first; srv; srv = srv->next) {
+		if (BKE_scene_render_view_active(rd, srv) == false)
+			continue;
+		iv = MEM_mallocN(sizeof(ImageView), "Viewer Image View");
+		BLI_strncpy(iv->name, srv->name, sizeof(iv->name));
+		BLI_addtail(&ima->views, iv);
+	}
+}
+
 /* Reset the rederout or nodes image cache when the number of cache
  * doesn't match the needed cached views */
-void BKE_image_verify_viewer_cache(const RenderData *rd, Image *ima, ImageUser *iuser)
+void BKE_image_verify_viewer_views(const RenderData *rd, Image *ima, ImageUser *iuser)
 {
-	size_t num_views, num_caches;
+	bool do_reset;
 
 	BLI_lock_thread(LOCK_DRAW_IMAGE);
 
 	if (BKE_scene_is_stereo3d(rd)) {
 		ima->flag |= IMA_IS_STEREO;
+		ima->flag |= IMA_IS_MULTIVIEW;
 	}
 	else {
 		ima->flag &= ~IMA_IS_STEREO;
+		ima->flag &= ~IMA_IS_MULTIVIEW;
 		iuser->flag &= ~IMA_SHOW_STEREO;
 	}
 
-	num_views = BKE_scene_num_views(rd);
-	num_caches = BKE_image_cache_count(ima);
+	/* see if all scene render views are in the image view list */
+	do_reset = (BKE_scene_num_views(rd) != BLI_countlist(&ima->views));
+	if (!do_reset) {
+		SceneRenderView *srv;
+		ImageView *iv;
+
+		for (iv = ima->views.first; iv; iv = iv->next) {
+			srv = BLI_findstring(&rd->views, iv->name, offsetof(SceneRenderView, name));
+			if ((srv == NULL) || (BKE_scene_render_view_active(rd, srv) == false)) {
+				do_reset = true;
+				break;
+			}
+		}
+	}
+
+	if (do_reset) {
+		image_free_cahced_frames(ima);
+		BKE_image_free_views(ima);
 
-	if (num_views != num_caches) {
-		BKE_image_free_cached_frames(ima);
+		/* add new views */
+		image_viewer_create_views(rd, ima);
 	}
 
 	BLI_unlock_thread(LOCK_DRAW_IMAGE);
@@ -2425,7 +2467,8 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
 			for (rpass = rl->passes.first; rpass; rpass = rpass->next, index++, rp_index++) {
 				if (iuser->layer == rl_index &&
 				    iuser->passtype == rpass->passtype &&
-				    rv_index == rpass->view_id) {
+				    rv_index == rpass->view_id)
+				{
 					break;
 				}
 			}
@@ -2451,37 +2494,50 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
 	return rpass;
 }
 
-bool BKE_image_is_stereo(Scene *scene, Image *ima)
+void BKE_image_multiview_index(Image *ima, ImageUser *iuser)
 {
-	if (ima->rr) {
-		return (ima->flag & IMA_IS_STEREO) != 0;
+	if (iuser) {
+		bool is_stereo = (ima->flag & IMA_IS_STEREO) && (iuser->flag & IMA_SHOW_STEREO);
+		iuser->multi_index = is_stereo ? iuser->eye : iuser->view;
 	}
-	else if (ima->type == IMA_TYPE_R_RESULT) {
-		RenderResult *rr;
-		if (ima->render_slot == ima->last_render_slot)
-			rr =  RE_AcquireResultRead(RE_GetRender(scene->id.name));
-		else
-			rr = ima->renders[ima->render_slot];
+}
 
-		return RE_RenderResult_is_stereo(rr);
+/* if layer or pass changes, we need an index for the imbufs list */
+/* note it is called for rendered results, but it doesnt use the index! */
+/* and because rendered results use fake layer/passes, don't correct for wrong indices here */
+bool BKE_image_is_multilayer(Image *ima)
+{
+	if (ELEM(ima->source, IMA_SRC_FILE, IMA_SRC_SEQUENCE)) {
+		if (ima->type == IMA_TYPE_MULTILAYER) {
+			return true;
+		}
 	}
-	else
-		return false;
+	else if (ima->source == IMA_SRC_VIEWER) {
+		if (ima->type == IMA_TYPE_R_RESULT) {
+			return true;
+		}
+	}
+	return false;
 }
 
-static void image_set_stereo_flag(Image *ima, RenderResult *rr)
+static void image_init_multilayer_multiview_flag(Image *ima, RenderResult *rr)
 {
 	if (rr) {
-		if (RE_RenderResult_is_stereo(rr))
+		if (RE_RenderResult_is_stereo(rr)) {
 			ima->flag |= IMA_IS_STEREO;
-		else
+			ima->flag |= IMA_IS_MULTIVIEW;
+		}
+		else {
 			ima->flag &= ~IMA_IS_STEREO;
-	}
-	else if (ima->source == IMA_SRC_VIEWER &&
-	         ima->type == IMA_TYPE_COMPOSITE) {
+			if (BLI_countlist(&rr->views) > 1)
+				ima->flag |= IMA_IS_MULTIVIEW;
+			else
+				ima->flag &= IMA_IS_MULTIVIEW;
+		}
 	}
 	else {
 		ima->flag &= ~IMA_IS_STEREO;
+		ima->flag &= ~IMA_IS_MULTIVIEW;
 	}
 }
 
@@ -2496,9 +2552,11 @@ RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima)
 			rr = RE_AcquireResultRead(RE_GetRender(scene->id.name));
 		else
 			rr = ima->renders[ima->render_slot];
+
+		/* set proper multiview flag */
+		image_init_multilayer_multiview_flag(ima, rr);
 	}
 
-	image_set_stereo_flag(ima, rr);
 	return rr;
 }
 
@@ -2550,20 +2608,8 @@ static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr)
 	if (ima->rr)
 		ima->rr->framenr = framenr;
 
-	image_set_stereo_flag(ima, ima->rr);
-}
-
-static void image_check_stereo(Image *ima)
-{
-	if (!ima->rr) {
-		ima->flag &= ~IMA_IS_STEREO;
-		return;
-	}
-
-	if (RE_RenderResult_is_stereo(ima->rr))
-		ima->flag |= IMA_IS_STEREO;
-	else
-		ima->flag &= ~IMA_IS_STEREO;
+	/* set proper multiview flag */
+	image_init_multilayer_multiview_flag(ima, ima->rr);
 }
 
 /* common stuff to do with images after loading */
@@ -2582,9 +2628,6 @@ static void image_initialize_after_load(Image *ima, ImBuf *ibuf)
 	BKE_image_tag_time(ima);
 
 	ima->ok = IMA_OK_LOADED;
-
-	/* set proper stereo 3d flag */
-	image_check_stereo(ima);
 }
 
 static int imbuf_alpha_flags_for_image(Image *ima)
@@ -2755,66 +2798,140 @@ static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame)
 	return ibuf;
 }
 
+/* the number of files will vary according to the stereo format */
+static size_t image_num_files(Image *ima)
+{
+	const bool is_multiview = (ima->flag & IMA_IS_MULTIVIEW) != 0;
+
+	if (!is_multiview) {
+		return 1;
+	}
+	else if(false){
+		/* XXX MV not supported yet R_IMF_VIEWS_STEREO_3D */
+		return 1;
+	}
+	/* R_IMF_VIEWS_INDIVIDUAL */
+	else {
+		return BLI_countlist(&ima->views);
+	}
+}
+
 /* warning, 'iuser' can be NULL */
 static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
 {
-	struct ImBuf *ibuf;
-	char str[FILE_MAX];
-	int assign = 0, flag;
+	struct ImBuf **ibuf;
+	struct ImBuf *r_ibuf;
+	char **str;
+	bool assign = false;
+	int flag;
+	const bool is_multiview = (ima->flag & IMA_IS_MULTIVIEW) != 0;
+	const size_t totfiles = image_num_files(ima);
+	const size_t totviews = is_multiview ? BLI_countlist(&ima->views) : 1;
+	size_t i;
 
 	/* always ensure clean ima */
 	BKE_image_free_buffers(ima);
 
+	ibuf = MEM_mallocN(sizeof(ImBuf *) * totviews, "Image Views Imbufs");
+	str = MEM_mallocN(sizeof(char *) * totviews, "Image filepaths");
+	for (i = 0; i < totfiles; i++)
+		str[i] = MEM_mallocN(sizeof(char) * FILE_MAX, "Image filepath");
+
 	/* is there a PackedFile with this image ? */
 	if (ima->packedfile) {
 		flag = IB_rect | IB_multilayer;
 		flag |= imbuf_alpha_flags_for_image(ima);
 
-		ibuf = IMB_ibImageFromMemory((unsigned char *)ima->packedfile->data, ima->packedfile->size, flag,
-		                             ima->colorspace_settings.name, "<packed data>");
+#if 0
+		//XXX MV PACK
+		for (i = 0; i < totfiles; i++) {
+			ibuf[i] = IMB_ibImageFromMemory((unsigned char *)ima->packedfile[i]->data, ima->packedfile[i]->si

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list