[Bf-blender-cvs] [40dbf2fc000] master: Fix T53771: missing view pixels when rendering multiview + FSAA.

Brecht Van Lommel noreply at git.blender.org
Sat Jan 13 00:01:11 CET 2018


Commit: 40dbf2fc0000f2905d436fc28b93a9b97431f72d
Author: Brecht Van Lommel
Date:   Fri Jan 12 23:47:24 2018 +0100
Branches: master
https://developer.blender.org/rB40dbf2fc0000f2905d436fc28b93a9b97431f72d

Fix T53771: missing view pixels when rendering multiview + FSAA.

This never worked, it's not due to recent refactoring.

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

M	source/blender/imbuf/intern/openexr/openexr_api.cpp
M	source/blender/imbuf/intern/openexr/openexr_multi.h
M	source/blender/imbuf/intern/openexr/openexr_stub.cpp
M	source/blender/render/intern/source/render_result.c

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

diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index ca534e3e2a8..2fa830dc42a 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -1059,11 +1059,11 @@ void IMB_exr_write_channels(void *handle)
 
 /* temporary function, used for FSA and Save Buffers */
 /* called once per tile * view */
-void IMB_exrtile_write_channels(void *handle, int partx, int party, int level, const char *viewname)
+void IMB_exrtile_write_channels(void *handle, int partx, int party, int level, const char *viewname, bool empty)
 {
+	/* Can write empty channels for incomplete renders. */
 	ExrHandle *data = (ExrHandle *)handle;
 	FrameBuffer frameBuffer;
-	ExrChannel *echan;
 	std::string view(viewname);
 	const int view_id = imb_exr_get_multiView_id(*data->multiView, view);
 
@@ -1071,28 +1071,32 @@ void IMB_exrtile_write_channels(void *handle, int partx, int party, int level, c
 	exr_printf("%s %-6s %-22s \"%s\"\n", "p", "view", "name", "internal_name");
 	exr_printf("---------------------------------------------------------------------\n");
 
-	for (echan = (ExrChannel *)data->channels.first; echan; echan = echan->next) {
+	if (!empty) {
+		ExrChannel *echan;
+
+		for (echan = (ExrChannel *)data->channels.first; echan; echan = echan->next) {
+
+			/* eventually we can make the parts' channels to include
+			   only the current view TODO */
+			if (strcmp(viewname, echan->m->view.c_str()) != 0)
+				continue;
 
-		/* eventually we can make the parts' channels to include
-		   only the current view TODO */
-		if (strcmp(viewname, echan->m->view.c_str()) != 0)
-			continue;
-
-		exr_printf("%d %-6s %-22s \"%s\"\n",
-		           echan->m->part_number,
-		           echan->m->view.c_str(),
-		           echan->m->name.c_str(),
-		           echan->m->internal_name.c_str()
-		           );
-
-		float *rect = echan->rect - echan->xstride * partx - echan->ystride * party;
-		frameBuffer.insert(echan->m->internal_name,
-		                   Slice(Imf::FLOAT,
-		                         (char *)rect,
-		                         echan->xstride * sizeof(float),
-		                         echan->ystride * sizeof(float)
-		                        )
-		                  );
+			exr_printf("%d %-6s %-22s \"%s\"\n",
+			           echan->m->part_number,
+			           echan->m->view.c_str(),
+			           echan->m->name.c_str(),
+			           echan->m->internal_name.c_str()
+			           );
+
+			float *rect = echan->rect - echan->xstride * partx - echan->ystride * party;
+			frameBuffer.insert(echan->m->internal_name,
+			                   Slice(Imf::FLOAT,
+			                         (char *)rect,
+			                         echan->xstride * sizeof(float),
+			                         echan->ystride * sizeof(float)
+			                        )
+			);
+		}
 	}
 
 	TiledOutputPart out (*data->mpofile, view_id);
diff --git a/source/blender/imbuf/intern/openexr/openexr_multi.h b/source/blender/imbuf/intern/openexr/openexr_multi.h
index d9517d13cc4..d9338c888a7 100644
--- a/source/blender/imbuf/intern/openexr/openexr_multi.h
+++ b/source/blender/imbuf/intern/openexr/openexr_multi.h
@@ -67,7 +67,7 @@ float  *IMB_exr_channel_rect(void *handle, const char *layname, const char *pass
 
 void    IMB_exr_read_channels(void *handle);
 void    IMB_exr_write_channels(void *handle);
-void    IMB_exrtile_write_channels(void *handle, int partx, int party, int level, const char *viewname);
+void    IMB_exrtile_write_channels(void *handle, int partx, int party, int level, const char *viewname, bool empty);
 void    IMB_exr_clear_channels(void *handle);
 
 void    IMB_exr_multilayer_convert(
diff --git a/source/blender/imbuf/intern/openexr/openexr_stub.cpp b/source/blender/imbuf/intern/openexr/openexr_stub.cpp
index 05fddcb5fa5..301e827d739 100644
--- a/source/blender/imbuf/intern/openexr/openexr_stub.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_stub.cpp
@@ -47,7 +47,7 @@ float  *IMB_exr_channel_rect        (void * /*handle*/, const char * /*layname*/
 
 void    IMB_exr_read_channels       (void * /*handle*/) { }
 void    IMB_exr_write_channels      (void * /*handle*/) { }
-void    IMB_exrtile_write_channels  (void * /*handle*/, int /*partx*/, int /*party*/, int /*level*/, const char * /*viewname*/) { }
+void    IMB_exrtile_write_channels  (void * /*handle*/, int /*partx*/, int /*party*/, int /*level*/, const char * /*viewname*/, bool /*empty*/) { }
 void    IMB_exr_clear_channels  (void * /*handle*/) { }
 
 void    IMB_exr_multilayer_convert(
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index 8ff485181c6..6dc3457d52e 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -1085,7 +1085,7 @@ static void save_render_result_tile(RenderResult *rr, RenderResult *rrpart, cons
 			continue;
 		}
 
-		IMB_exrtile_write_channels(rl->exrhandle, partx, party, 0, viewname);
+		IMB_exrtile_write_channels(rl->exrhandle, partx, party, 0, viewname, false);
 	}
 
 	BLI_unlock_thread(LOCK_IMAGE);
@@ -1099,13 +1099,11 @@ void render_result_save_empty_result_tiles(Render *re)
 	
 	for (rr = re->result; rr; rr = rr->next) {
 		for (rl = rr->layers.first; rl; rl = rl->next) {
-			IMB_exr_clear_channels(rl->exrhandle);
-		
 			for (pa = re->parts.first; pa; pa = pa->next) {
 				if (pa->status != PART_STATUS_MERGED) {
 					int party = pa->disprect.ymin - re->disprect.ymin + pa->crop;
 					int partx = pa->disprect.xmin - re->disprect.xmin + pa->crop;
-					IMB_exrtile_write_channels(rl->exrhandle, partx, party, 0, re->viewname);
+					IMB_exrtile_write_channels(rl->exrhandle, partx, party, 0, re->viewname, true);
 				}
 			}
 		}



More information about the Bf-blender-cvs mailing list