[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54395] trunk/blender/source/blender: Corrections to alpha pipeline do_versions

Sergey Sharybin sergey.vfx at gmail.com
Fri Feb 8 17:25:35 CET 2013


Revision: 54395
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54395
Author:   nazgul
Date:     2013-02-08 16:25:35 +0000 (Fri, 08 Feb 2013)
Log Message:
-----------
Corrections to alpha pipeline do_versions

Basically they're aimed to solve issues when scene with sky
was used for compositing. If compo used alpha output result
of current trunk would be completely different form hwo it
was before.

Two heuristics here:
- If there's no world or world color is black, it completely
  equals to straight alpha mode, no further magic is needed
  to preserve compatibility

- If scene is used as Render Layer node and something is
  connected to Alpha output of this node, ensure alpha mode
  for this scene is set to Premultiplied.

Basically it shall give better compatibility and make
4K mango project just happy! :)

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/render/intern/source/pipeline.c

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2013-02-08 16:18:24 UTC (rev 54394)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2013-02-08 16:25:35 UTC (rev 54395)
@@ -8649,6 +8649,7 @@
 
 		for (scene = main->scene.first; scene; scene = scene->id.next) {
 			Sequence *seq;
+			bool set_premul = false;
 
 			SEQ_BEGIN (scene->ed, seq)
 			{
@@ -8659,6 +8660,23 @@
 
 			if (scene->r.bake_samples == 0)
 			scene->r.bake_samples = 256;
+
+			if (scene->world) {
+				World *world = blo_do_versions_newlibadr(fd, scene->id.lib, scene->world);
+
+				if (is_zero_v3(&world->horr)) {
+					if ((world->skytype & WO_SKYBLEND) == 0 || is_zero_v3(&world->zenr)) {
+						set_premul = true;
+					}
+				}
+			}
+			else
+				set_premul = true;
+
+			if (set_premul) {
+				printf("2.66 versioning fix: replacing black sky with premultiplied alpha for scene %s\n", scene->id.name + 2);
+				scene->r.alphamode = R_ALPHAPREMUL;
+			}
 		}
 
 		for (image = main->image.first; image; image = image->id.next) {

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c	2013-02-08 16:18:24 UTC (rev 54394)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c	2013-02-08 16:25:35 UTC (rev 54395)
@@ -1355,6 +1355,19 @@
 	return 0;
 }
 
+static bool rlayer_node_uses_alpha(bNodeTree *ntree, bNode *node)
+{
+	bNodeSocket *sock;
+
+	for (sock = node->outputs.first; sock; sock = sock->next) {
+		/* Weak! but how to make it better? */
+		if (!strcmp(sock->name, "Alpha") && nodeCountSocketLinks(ntree, sock) > 0)
+			return true;
+	}
+
+	return false;
+}
+
 static void tag_scenes_for_render(Render *re)
 {
 	bNode *node;
@@ -1372,6 +1385,21 @@
 	for (node = re->scene->nodetree->nodes.first; node; node = node->next) {
 		if (node->type == CMP_NODE_R_LAYERS) {
 			if (node->id) {
+				if (!MAIN_VERSION_ATLEAST(re->main, 265, 5)) {
+					if (rlayer_node_uses_alpha(re->scene->nodetree, node)) {
+						Scene *scene = (Scene*) node->id;
+
+						if (scene->r.alphamode != R_ALPHAPREMUL) {
+							BKE_reportf(re->reports, RPT_WARNING, "Setting scene %s alpha mode to Premul\n", scene->id.name + 2);
+
+							/* also print, so feedback is immediate */
+							printf("2.66 versioning fix: setting scene %s alpha mode to Premul\n", scene->id.name + 2);
+
+							scene->r.alphamode = R_ALPHAPREMUL;
+						}
+					}
+				}
+
 				if (node->id != (ID *)re->scene)
 					node->id->flag |= LIB_DOIT;
 			}




More information about the Bf-blender-cvs mailing list