[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