[Bf-blender-cvs] [7852fc8] master: Freestyle: Proper support for alpha transparency in line style shader nodes for Cycles.

Tamito Kajiyama noreply at git.blender.org
Tue Aug 12 03:18:18 CEST 2014


Commit: 7852fc8bcd8c8b010aea56fc680d5c8372383b73
Author: Tamito Kajiyama
Date:   Mon Jul 21 15:08:07 2014 +0900
Branches: master
https://developer.blender.org/rB7852fc8bcd8c8b010aea56fc680d5c8372383b73

Freestyle: Proper support for alpha transparency in line style shader nodes for Cycles.

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

M	source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp

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

diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
index 209f0f2..399470c 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
@@ -239,6 +239,7 @@ Material* BlenderStrokeRenderer::GetStrokeShader(bContext *C, Main *bmain, bNode
 	bNode *output_linestyle = NULL;
 	bNodeSocket *fromsock, *tosock;
 	PointerRNA fromptr, toptr;
+	NodeShaderAttribute *storage;
 
 	if (iNodeTree) {
 		// make a copy of linestyle->nodetree
@@ -258,17 +259,31 @@ Material* BlenderStrokeRenderer::GetStrokeShader(bContext *C, Main *bmain, bNode
 	ma->nodetree = ntree;
 	ma->use_nodes = 1;
 
-	bNode *input_attribute = nodeAddStaticNode(C, ntree, SH_NODE_ATTRIBUTE);
-	input_attribute->locx = 0.0f;
-	input_attribute->locy = -200.0f;
-	NodeShaderAttribute *storage = (NodeShaderAttribute *)input_attribute->storage;
-	BLI_strncpy(storage->name, "Col", sizeof(storage->name));
-
-	bNode *color_mix_rgb = nodeAddStaticNode(C, ntree, SH_NODE_MIX_RGB);
-	color_mix_rgb->custom1 = MA_RAMP_BLEND; // Mix
-	color_mix_rgb->locx = 200.0f;
-	color_mix_rgb->locy = -200.0f;
-	tosock = (bNodeSocket *)BLI_findlink(&color_mix_rgb->inputs, 0); // Fac
+	bNode *input_attr_color = nodeAddStaticNode(C, ntree, SH_NODE_ATTRIBUTE);
+	input_attr_color->locx = 0.0f;
+	input_attr_color->locy = -200.0f;
+	storage = (NodeShaderAttribute *)input_attr_color->storage;
+	BLI_strncpy(storage->name, "color", sizeof(storage->name));
+
+	bNode *mix_rgb_color = nodeAddStaticNode(C, ntree, SH_NODE_MIX_RGB);
+	mix_rgb_color->custom1 = MA_RAMP_BLEND; // Mix
+	mix_rgb_color->locx = 200.0f;
+	mix_rgb_color->locy = -200.0f;
+	tosock = (bNodeSocket *)BLI_findlink(&mix_rgb_color->inputs, 0); // Fac
+	RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, tosock, &toptr);
+	RNA_float_set(&toptr, "default_value", 0.0f);
+
+	bNode *input_attr_alpha = nodeAddStaticNode(C, ntree, SH_NODE_ATTRIBUTE);
+	input_attr_alpha->locx = 400.0f;
+	input_attr_alpha->locy = 300.0f;
+	storage = (NodeShaderAttribute *)input_attr_alpha->storage;
+	BLI_strncpy(storage->name, "alpha", sizeof(storage->name));
+
+	bNode *mix_rgb_alpha = nodeAddStaticNode(C, ntree, SH_NODE_MIX_RGB);
+	mix_rgb_alpha->custom1 = MA_RAMP_BLEND; // Mix
+	mix_rgb_alpha->locx = 600.0f;
+	mix_rgb_alpha->locy = 300.0f;
+	tosock = (bNodeSocket *)BLI_findlink(&mix_rgb_color->inputs, 0); // Fac
 	RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, tosock, &toptr);
 	RNA_float_set(&toptr, "default_value", 0.0f);
 
@@ -280,46 +295,70 @@ Material* BlenderStrokeRenderer::GetStrokeShader(bContext *C, Main *bmain, bNode
 	input_light_path->locx = 400.0f;
 	input_light_path->locy = 100.0f;
 
-	bNode *shader_mix = nodeAddStaticNode(C, ntree, SH_NODE_MIX_SHADER);
-	shader_mix->locx = 600.0f;
-	shader_mix->locy = 100.0f;
+	bNode *mix_shader_color = nodeAddStaticNode(C, ntree, SH_NODE_MIX_SHADER);
+	mix_shader_color->locx = 600.0f;
+	mix_shader_color->locy = -100.0f;
+
+	bNode *shader_transparent = nodeAddStaticNode(C, ntree, SH_NODE_BSDF_TRANSPARENT);
+	shader_transparent->locx = 600.0f;
+	shader_transparent->locy = 100.0f;
+
+	bNode *mix_shader_alpha = nodeAddStaticNode(C, ntree, SH_NODE_MIX_SHADER);
+	mix_shader_alpha->locx = 800.0f;
+	mix_shader_alpha->locy = 100.0f;
 
 	bNode *output_material = nodeAddStaticNode(C, ntree, SH_NODE_OUTPUT_MATERIAL);
-	output_material->locx = 800.0f;
+	output_material->locx = 1000.0f;
 	output_material->locy = 100.0f;
 
-	fromsock = (bNodeSocket *)BLI_findlink(&input_attribute->outputs, 0); // Color
-	tosock = (bNodeSocket *)BLI_findlink(&color_mix_rgb->inputs, 1); // Color1
-	nodeAddLink(ntree, input_attribute, fromsock, color_mix_rgb, tosock);
+	fromsock = (bNodeSocket *)BLI_findlink(&input_attr_color->outputs, 0); // Color
+	tosock = (bNodeSocket *)BLI_findlink(&mix_rgb_color->inputs, 1); // Color1
+	nodeAddLink(ntree, input_attr_color, fromsock, mix_rgb_color, tosock);
 
-	fromsock = (bNodeSocket *)BLI_findlink(&color_mix_rgb->outputs, 0); // Color
+	fromsock = (bNodeSocket *)BLI_findlink(&mix_rgb_color->outputs, 0); // Color
 	tosock = (bNodeSocket *)BLI_findlink(&shader_emission->inputs, 0); // Color
-	nodeAddLink(ntree, color_mix_rgb, fromsock, shader_emission, tosock);
+	nodeAddLink(ntree, mix_rgb_color, fromsock, shader_emission, tosock);
 
 	fromsock = (bNodeSocket *)BLI_findlink(&shader_emission->outputs, 0); // Emission
-	tosock = (bNodeSocket *)BLI_findlink(&shader_mix->inputs, 2); // Shader (second)
-	nodeAddLink(ntree, shader_emission, fromsock, shader_mix, tosock);
+	tosock = (bNodeSocket *)BLI_findlink(&mix_shader_color->inputs, 2); // Shader (second)
+	nodeAddLink(ntree, shader_emission, fromsock, mix_shader_color, tosock);
 
 	fromsock = (bNodeSocket *)BLI_findlink(&input_light_path->outputs, 0); // In Camera Ray
-	tosock = (bNodeSocket *)BLI_findlink(&shader_mix->inputs, 0); // Fac
-	nodeAddLink(ntree, input_light_path, fromsock, shader_mix, tosock);
+	tosock = (bNodeSocket *)BLI_findlink(&mix_shader_color->inputs, 0); // Fac
+	nodeAddLink(ntree, input_light_path, fromsock, mix_shader_color, tosock);
+
+	fromsock = (bNodeSocket *)BLI_findlink(&mix_rgb_alpha->outputs, 0); // Color
+	tosock = (bNodeSocket *)BLI_findlink(&mix_shader_alpha->inputs, 0); // Fac
+	nodeAddLink(ntree, mix_rgb_alpha, fromsock, mix_shader_alpha, tosock);
+
+	fromsock = (bNodeSocket *)BLI_findlink(&input_attr_alpha->outputs, 0); // Color
+	tosock = (bNodeSocket *)BLI_findlink(&mix_rgb_alpha->inputs, 1); // Color1
+	nodeAddLink(ntree, input_attr_alpha, fromsock, mix_rgb_alpha, tosock);
+
+	fromsock = (bNodeSocket *)BLI_findlink(&shader_transparent->outputs, 0); // BSDF
+	tosock = (bNodeSocket *)BLI_findlink(&mix_shader_alpha->inputs, 1); // Shader (first)
+	nodeAddLink(ntree, shader_transparent, fromsock, mix_shader_alpha, tosock);
 
-	fromsock = (bNodeSocket *)BLI_findlink(&shader_mix->outputs, 0); // Shader
+	fromsock = (bNodeSocket *)BLI_findlink(&mix_shader_color->outputs, 0); // Shader
+	tosock = (bNodeSocket *)BLI_findlink(&mix_shader_alpha->inputs, 2); // Shader (second)
+	nodeAddLink(ntree, mix_shader_color, fromsock, mix_shader_alpha, tosock);
+
+	fromsock = (bNodeSocket *)BLI_findlink(&mix_shader_alpha->outputs, 0); // Shader
 	tosock = (bNodeSocket *)BLI_findlink(&output_material->inputs, 0); // Surface
-	nodeAddLink(ntree, shader_mix, fromsock, output_material, tosock);
+	nodeAddLink(ntree, mix_shader_alpha, fromsock, output_material, tosock);
 
 	if (output_linestyle) {
 		bNodeSocket *outsock;
 		bNodeLink *link;
 
-		color_mix_rgb->custom1 = output_linestyle->custom1; // blend_type
-		color_mix_rgb->custom2 = output_linestyle->custom2; // use_clamp
+		mix_rgb_color->custom1 = output_linestyle->custom1; // blend_type
+		mix_rgb_color->custom2 = output_linestyle->custom2; // use_clamp
 
 		outsock = (bNodeSocket *)BLI_findlink(&output_linestyle->inputs, 0); // Color
-		tosock = (bNodeSocket *)BLI_findlink(&color_mix_rgb->inputs, 2); // Color2
+		tosock = (bNodeSocket *)BLI_findlink(&mix_rgb_color->inputs, 2); // Color2
 		link = (bNodeLink *)BLI_findptr(&ntree->links, outsock, offsetof(bNodeLink, tosock));
 		if (link) {
-			nodeAddLink(ntree, link->fromnode, link->fromsock, color_mix_rgb, tosock);
+			nodeAddLink(ntree, link->fromnode, link->fromsock, mix_rgb_color, tosock);
 		}
 		else {
 			float color[4];
@@ -330,10 +369,10 @@ Material* BlenderStrokeRenderer::GetStrokeShader(bContext *C, Main *bmain, bNode
 		}
 
 		outsock = (bNodeSocket *)BLI_findlink(&output_linestyle->inputs, 1); // Color Fac
-		tosock = (bNodeSocket *)BLI_findlink(&color_mix_rgb->inputs, 0); // Fac
+		tosock = (bNodeSocket *)BLI_findlink(&mix_rgb_color->inputs, 0); // Fac
 		link = (bNodeLink *)BLI_findptr(&ntree->links, outsock, offsetof(bNodeLink, tosock));
 		if (link) {
-			nodeAddLink(ntree, link->fromnode, link->fromsock, color_mix_rgb, tosock);
+			nodeAddLink(ntree, link->fromnode, link->fromsock, mix_rgb_color, tosock);
 		}
 		else {
 			RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, outsock, &fromptr);
@@ -341,10 +380,32 @@ Material* BlenderStrokeRenderer::GetStrokeShader(bContext *C, Main *bmain, bNode
 			RNA_float_set(&toptr, "default_value", RNA_float_get(&fromptr, "default_value"));
 		}
 
-#if 0 // TODO
 		outsock = (bNodeSocket *)BLI_findlink(&output_linestyle->inputs, 2); // Alpha
+		tosock = (bNodeSocket *)BLI_findlink(&mix_rgb_alpha->inputs, 2); // Color2
+		link = (bNodeLink *)BLI_findptr(&ntree->links, outsock, offsetof(bNodeLink, tosock));
+		if (link) {
+			nodeAddLink(ntree, link->fromnode, link->fromsock, mix_rgb_alpha, tosock);
+		}
+		else {
+			float color[4];
+			RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, outsock, &fromptr);
+			RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, tosock, &toptr);
+			color[0] = color[1] = color[2] = RNA_float_get(&fromptr, "default_value");
+			color[3] = 1.0f;
+			RNA_float_set_array(&toptr, "default_value", color);
+		}
+
 		outsock = (bNodeSocket *)BLI_findlink(&output_linestyle->inputs, 3); // Alpha Fac
-#endif
+		tosock = (bNodeSocket *)BLI_findlink(&mix_rgb_alpha->inputs, 0); // Fac
+		link = (bNodeLink *)BLI_findptr(&ntree->links, outsock, offsetof(bNodeLink, tosock));
+		if (link) {
+			nodeAddLink(ntree, link->fromnode, link->fromsock, mix_rgb_alpha, tosock);
+		}
+		else {
+			RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, outsock, &fromptr);
+			RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, tosock, &toptr);
+			RNA_float_set(&toptr, "default_value", RNA_float_get(&fromptr, "default_value"));
+		}
 
 		for (bNode *node = (bNode *)ntree->nodes.first; node; node = node->next) {
 			if (node->type == SH_NODE_UVALONGSTROKE) {
@@ -375,7 +436,7 @@ Material* BlenderStrokeRenderer::GetStrokeShader(bContext *C, Main *bmain, bNode
 		}
 	}
 
-	nodeSetActive(ntree, shader_mix);
+	nodeSetActive(ntree, output_material);
 	ntreeUpdateTree(bmain, ntree);
 
 	return ma;
@@ -568,8 +629,9 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const
 	mesh->totloop = totloop; // visible_faces * 3;
 	mesh->mloop = (MLoop *)CustomData_add_layer(&mesh->ldata, CD_MLOOP, CD_CAL

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list