[Bf-blender-cvs] [1d67149] object_nodes: Use the material blending function for the RGB mix node for the time being.

Lukas Tönne noreply at git.blender.org
Tue Nov 24 09:44:07 CET 2015


Commit: 1d67149c5938d739ea9486801132e94b0cbd417f
Author: Lukas Tönne
Date:   Fri Nov 6 11:47:45 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB1d67149c5938d739ea9486801132e94b0cbd417f

Use the material blending function for the RGB mix node for the time being.

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

M	source/blender/blenvm/bvm/bvm_eval.cc
M	source/blender/blenvm/bvm/bvm_opcode.h
M	source/blender/blenvm/compile/bvm_nodegraph.cc
M	source/blender/blenvm/intern/bvm_api.cc
M	source/blender/blenvm/util/bvm_util_typedesc.h

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

diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index 757afe0..4e57a9d 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -38,6 +38,7 @@ extern "C" {
 
 #include "BKE_bvhutils.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_material.h"
 }
 
 #include "bvm_eval.h"
@@ -382,6 +383,17 @@ static void eval_op_normalize_float3(float *stack, StackIndex offset, StackIndex
 	stack_store_float(stack, offset_val, l);
 }
 
+static void eval_op_mix_rgb(float *stack, int mode, StackIndex offset_col_a, StackIndex offset_col_b, StackIndex offset_fac, StackIndex offset_r)
+{
+	float4 a = stack_load_float4(stack, offset_col_a);
+	float4 b = stack_load_float4(stack, offset_col_b);
+	float f = stack_load_float(stack, offset_fac);
+	
+	ramp_blend(mode, a.data(), f, b.data());
+	
+	stack_store_float4(stack, offset_r, a);
+}
+
 static void eval_op_tex_coord(const EvalData *data, float *stack, StackIndex offset)
 {
 	stack_store_float3(stack, offset, data->texture.co);
@@ -776,6 +788,16 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
 				break;
 			}
 			
+			case OP_MIX_RGB: {
+				int mode = expr->read_int(&instr);
+				StackIndex offset_fac = expr->read_stack_index(&instr);
+				StackIndex offset_col_a = expr->read_stack_index(&instr);
+				StackIndex offset_col_b = expr->read_stack_index(&instr);
+				StackIndex offset_r = expr->read_stack_index(&instr);
+				eval_op_mix_rgb(stack, mode, offset_col_a, offset_col_b, offset_fac, offset_r);
+				break;
+			}
+			
 			case OP_TEX_COORD: {
 				StackIndex offset = expr->read_stack_index(&instr);
 				eval_op_tex_coord(data, stack, offset);
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h b/source/blender/blenvm/bvm/bvm_opcode.h
index f531774..eab0287 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -90,6 +90,8 @@ enum OpCode {
 	OP_CROSS_FLOAT3,
 	OP_NORMALIZE_FLOAT3,
 	
+	OP_MIX_RGB,
+	
 	OP_TEX_COORD,
 	OP_TEX_PROC_VORONOI,
 	OP_TEX_PROC_BLEND,
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index 9aecf79..03bd547 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -785,6 +785,8 @@ OpCode get_opcode_from_node_type(const string &node)
 	NODETYPE(CROSS_FLOAT3);
 	NODETYPE(NORMALIZE_FLOAT3);
 	
+	NODETYPE(MIX_RGB);
+	
 	NODETYPE(TEX_COORD);
 	NODETYPE(TEX_PROC_VORONOI);
 	
@@ -948,6 +950,13 @@ void register_opcode_node_types()
 	nt->add_output("vector", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
 	nt->add_output("value", BVM_FLOAT, 0.0f);
 	
+	nt = NodeGraph::add_node_type("MIX_RGB");
+	nt->add_input("mode", BVM_INT, 0, true);
+	nt->add_input("factor", BVM_FLOAT, 0.0f);
+	nt->add_input("color1", BVM_FLOAT4, float4(0.0f, 0.0f, 0.0f, 1.0f));
+	nt->add_input("color2", BVM_FLOAT4, float4(0.0f, 0.0f, 0.0f, 1.0f));
+	nt->add_output("color", BVM_FLOAT4, float4(0.0f, 0.0f, 0.0f, 1.0f));
+	
 	nt = NodeGraph::add_node_type("TEX_COORD");
 	nt->add_output("value", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
 	
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index 5daa193..2e4abf1 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -392,59 +392,48 @@ struct bNodeCompiler {
 	
 	/* --------------------------------------------------------------------- */
 	
-	SocketPair node_one_minus_fl(const SocketPair &a)
+	SocketPair node_value_fl(float v)
 	{
-		NodeInstance *node = add_node("SUB_FLOAT");
-		node->set_input_value("value_a", 1.0f);
-		add_link_intern(a, node->input("value_b"));
+		NodeInstance *node = add_node("PASS_FLOAT");
+		node->set_input_value("value", v);
 		return node->output("value");
 	}
 	
-	SocketPair node_one_minus_v3(const SocketPair &a)
+	SocketPair node_value_v3(float3 v)
 	{
-		NodeInstance *node = add_node("SUB_FLOAT3");
-		node->set_input_value("value_a", float3(1.0f, 1.0f, 1.0f));
-		add_link_intern(a, node->input("value_b"));
+		NodeInstance *node = add_node("PASS_FLOAT3");
+		node->set_input_value("value", v);
 		return node->output("value");
 	}
 	
-	SocketPair node_add_fl_fl(const SocketPair &a, const SocketPair &b)
-	{
-		NodeInstance *node = add_node("ADD_FLOAT");
-		add_link_intern(a, node->input("value_a"));
-		add_link_intern(b, node->input("value_b"));
-		return node->output("value");
-	}
-	
-	SocketPair node_sub_fl_fl(const SocketPair &a, const SocketPair &b)
+	SocketPair node_one_minus_fl(const SocketPair &a)
 	{
 		NodeInstance *node = add_node("SUB_FLOAT");
-		add_link_intern(a, node->input("value_a"));
-		add_link_intern(b, node->input("value_b"));
+		node->set_input_value("value_a", 1.0f);
+		add_link_intern(a, node->input("value_b"));
 		return node->output("value");
 	}
 	
-	SocketPair node_add_v3_v3(const SocketPair &a, const SocketPair &b)
+	SocketPair node_one_minus_v3(const SocketPair &a)
 	{
-		NodeInstance *node = add_node("ADD_FLOAT3");
-		add_link_intern(a, node->input("value_a"));
-		add_link_intern(b, node->input("value_b"));
+		NodeInstance *node = add_node("SUB_FLOAT3");
+		node->set_input_value("value_a", float3(1.0f, 1.0f, 1.0f));
+		add_link_intern(a, node->input("value_b"));
 		return node->output("value");
 	}
 	
-	SocketPair node_sub_v3_v3(const SocketPair &a, const SocketPair &b)
+	SocketPair node_math_binary(const char *mode, const SocketPair &a, const SocketPair &b)
 	{
-		NodeInstance *node = add_node("SUB_FLOAT3");
+		NodeInstance *node = add_node(mode);
 		add_link_intern(a, node->input("value_a"));
 		add_link_intern(b, node->input("value_b"));
 		return node->output("value");
 	}
 	
-	SocketPair node_mul_v3_v3(const SocketPair &a, const SocketPair &b)
+	SocketPair node_math_unary(const char *mode, const SocketPair &a)
 	{
-		NodeInstance *node = add_node("MUL_FLOAT3");
-		add_link_intern(a, node->input("value_a"));
-		add_link_intern(b, node->input("value_b"));
+		NodeInstance *node = add_node(mode);
+		add_link_intern(a, node->input("value"));
 		return node->output("value");
 	}
 	
@@ -461,7 +450,7 @@ struct bNodeCompiler {
 		SocketPair facinv = node_one_minus_fl(fac);
 		SocketPair mul_a = node_mul_v3_fl(a, facinv);
 		SocketPair mul_b = node_mul_v3_fl(b, fac);
-		return node_add_v3_v3(mul_a, mul_b);
+		return node_math_binary("ADD_FLOAT3", mul_a, mul_b);
 	}
 	
 	SocketPair node_compose_v4(const SocketPair &x, const SocketPair &y, const SocketPair &z, const SocketPair &w)
@@ -578,6 +567,33 @@ static void convert_tex_node(bNodeCompiler *comp, PointerRNA *bnode_ptr)
 		int mode = RNA_enum_get(bnode_ptr, "blend_type");
 		bool use_alpha = RNA_boolean_get(bnode_ptr, "use_alpha");
 		bool use_clamp = RNA_boolean_get(bnode_ptr, "use_clamp");
+		
+		SocketPair fac = comp->add_input_proxy(0);
+		SocketPair col_a = comp->add_input_proxy(1);
+		SocketPair col_b = comp->add_input_proxy(2);
+		if (use_alpha) {
+			SocketPair alpha;
+			comp->node_decompose_v4(col_b, NULL, NULL, NULL, &alpha);
+			fac = comp->node_math_binary("MUL_FLOAT", fac, alpha);
+		}
+		
+		NodeInstance *node = comp->add_node("MIX_RGB");
+		node->set_input_value("mode", mode);
+		comp->add_link_intern(fac, node->input("factor"));
+		comp->add_link_intern(col_a, node->input("color1"));
+		comp->add_link_intern(col_b, node->input("color2"));
+		SocketPair color = node->output("color");
+		
+		if (use_clamp) {
+			// TODO
+		}
+		
+		comp->map_output_socket(0, color);
+		
+		/* TODO converting the blend function into atomic nodes
+		 * should be done eventually
+		 */
+#if 0
 		SocketPair fac = comp->add_input_proxy(0);
 		SocketPair col_a = comp->add_input_proxy(1);
 		SocketPair col_b = comp->add_input_proxy(2);
@@ -589,12 +605,12 @@ static void convert_tex_node(bNodeCompiler *comp, PointerRNA *bnode_ptr)
 				break;
 			}
 			case MA_RAMP_ADD: {
-				SocketPair add = comp->node_add_v3_v3(col_a, col_b);
+				SocketPair add = comp->node_math_binary("ADD_FLOAT3", col_a, col_b);
 				result = comp->node_blend(col_a, add, fac);
 				break;
 			}
 			case MA_RAMP_MULT: {
-				SocketPair mul = comp->node_mul_v3_v3(col_a, col_b);
+				SocketPair mul = comp->node_math_binary("MUL_FLOAT3", col_a, col_b);
 				result = comp->node_blend(col_a, mul, fac);
 				break;
 			}
@@ -602,207 +618,31 @@ static void convert_tex_node(bNodeCompiler *comp, PointerRNA *bnode_ptr)
 				SocketPair facinv = comp->node_one_minus_fl(fac);
 				SocketPair inv_a = comp->node_one_minus_v3(col_a);
 				SocketPair inv_b = comp->node_one_minus_v3(col_a);
-				SocketPair screen = comp->node_add_v3_v3(facinv, comp->node_mul_v3_fl(inv_b, fac));
-				SocketPair col = comp->node_mul_v3_v3(screen, inv_a);
+				SocketPair screen = comp->node_math_binary("ADD_FLOAT3", facinv, comp->node_mul_v3_fl(inv_b, fac));
+				SocketPair col = comp->node_math_binary("MUL_FLOAT3", screen, inv_a);
 				result = comp->node_one_minus_v3(col);
 				break;
 			}
-			case MA_RAMP_OVERLAY: {
-				SocketPair x, y, z;
-				comp->node_decompose_v4(col_a, &x, &y, &z, NULL);
-				break;
-			}
-#if 0
 			case MA_RAMP_OVERLAY:
-				if (r_col[0] < 0.5f)
-					r_col[0] *= (facm + 2.0f * fac * col[0]);
-				else
-					r_col[0] = 1.0f - (facm + 2.0f * fac * (1.0f - col[0])) * (1.0f - r_col[0]);
-				if (r_col[1] < 0.5f)
-					r_col[1] *= (facm + 2.0f * fac * col[1]);
-				else
-					r_col[1] = 1.0f - (facm + 2.0f * fac * (1.0f - col[1])) * (1.0f - r_col[1]);
-				if (r_col[2] < 0.5f)
-					r_col[2] *= (facm + 2.0f * fac * col[2]);
-				else
-					r_col[2] = 1.0f - (facm + 2.0f * fac * (1.0f - col[2])) * (1.0f - r_col[2]);
-				break;
 			case MA_RAMP_SUB:
-				r_col[0] -= fac * col[0];
-				r_col[1] -= fac * col[1];
-				r_col[2] -= fac * col[2];
-				break;
 			case MA_RAMP_DIV:
-				if (col[0] != 0.0f)
-					r_col[0] = facm * (r_col[0]) + fac * (r_col[0]) / col[0];
-				if (col[1] != 0.0f)
-					r_col[1] = facm * (r_col[1]) + fac * (r_col[1]) / col[1];
-				if (col[2] != 0.0f)
-					r_col[2] = facm * (r_col[2]) + fac * (r_col[2]) / col[2];
-				break;
 			case MA_RAMP_DIFF:
-				r_col[0] = facm * (r_col[0]) + fac * fabsf(r_col[0] - col[0]);
-				r_col[1] = facm * (r_col[1]) + fac * fabsf(r

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list