[Bf-blender-cvs] [6e3ae36a987] soc-2019-cycles-procedural: Added Shader Map Range node.
OmarSquircleArt
noreply at git.blender.org
Wed Jun 5 19:14:49 CEST 2019
Commit: 6e3ae36a987d52c0517ad00fd2caf55c063063a7
Author: OmarSquircleArt
Date: Wed Jun 5 19:15:38 2019 +0200
Branches: soc-2019-cycles-procedural
https://developer.blender.org/rB6e3ae36a987d52c0517ad00fd2caf55c063063a7
Added Shader Map Range node.
===================================================================
M intern/cycles/blender/blender_shader.cpp
M intern/cycles/kernel/CMakeLists.txt
M intern/cycles/kernel/shaders/CMakeLists.txt
A intern/cycles/kernel/shaders/node_map_range.osl
M intern/cycles/kernel/svm/svm.h
A intern/cycles/kernel/svm/svm_map_range.h
M intern/cycles/kernel/svm/svm_types.h
M intern/cycles/render/nodes.cpp
M intern/cycles/render/nodes.h
M release/scripts/startup/nodeitems_builtins.py
M source/blender/blenkernel/BKE_node.h
M source/blender/blenkernel/intern/node.c
M source/blender/gpu/shaders/gpu_shader_material.glsl
M source/blender/nodes/CMakeLists.txt
M source/blender/nodes/NOD_shader.h
M source/blender/nodes/NOD_static_types.h
A source/blender/nodes/shader/nodes/node_shader_mapRange.c
===================================================================
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index 33fef9e2528..da038c2a527 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -297,6 +297,9 @@ static ShaderNode *add_node(Scene *scene,
else if (b_node.is_a(&RNA_ShaderNodeRGBToBW)) {
node = new RGBToBWNode();
}
+ else if (b_node.is_a(&RNA_ShaderNodeMapRange)) {
+ node = new MapRangeNode();
+ }
else if (b_node.is_a(&RNA_ShaderNodeMath)) {
BL::ShaderNodeMath b_math_node(b_node);
MathNode *math = new MathNode();
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index c1bc73257eb..26f56b36f3b 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -198,6 +198,7 @@ set(SRC_SVM_HEADERS
svm/svm_invert.h
svm/svm_light_path.h
svm/svm_magic.h
+ svm/svm_map_range.h
svm/svm_mapping.h
svm/svm_mapping_util.h
svm/svm_math.h
diff --git a/intern/cycles/kernel/shaders/CMakeLists.txt b/intern/cycles/kernel/shaders/CMakeLists.txt
index b42b9b2fe64..89243f2267e 100644
--- a/intern/cycles/kernel/shaders/CMakeLists.txt
+++ b/intern/cycles/kernel/shaders/CMakeLists.txt
@@ -89,6 +89,7 @@ set(SRC_OSL
node_uv_map.osl
node_principled_bsdf.osl
node_rgb_to_bw.osl
+ node_map_range.osl
)
set(SRC_OSL_HEADERS
diff --git a/intern/cycles/kernel/shaders/node_map_range.osl b/intern/cycles/kernel/shaders/node_map_range.osl
new file mode 100644
index 00000000000..346247644b0
--- /dev/null
+++ b/intern/cycles/kernel/shaders/node_map_range.osl
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2011-2013 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "stdosl.h"
+
+shader node_map_range(float ValueIn = 0.0, float FromMin = 0.0, float FromMax = 1.0,
+ float ToMin = 0.0, float ToMax = 1.0, output float ValueOut = 0.0)
+{
+ if (FromMax != FromMin && ToMax != ToMin) {
+ ValueOut = ToMin + ((ValueIn - FromMin) / (FromMax - FromMin)) * (ToMax - ToMin);
+ }
+ else {
+ ValueOut = 0.0;
+ }
+}
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index 5eb8331b046..b232e14cba9 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -193,6 +193,7 @@ CCL_NAMESPACE_END
#include "kernel/svm/svm_vector_transform.h"
#include "kernel/svm/svm_voxel.h"
#include "kernel/svm/svm_bump.h"
+#include "kernel/svm/svm_map_range.h"
#ifdef __SHADER_RAYTRACE__
# include "kernel/svm/svm_ao.h"
@@ -490,6 +491,9 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg,
case NODE_BLACKBODY:
svm_node_blackbody(kg, sd, stack, node.y, node.z);
break;
+ case NODE_MAP_RANGE:
+ svm_node_map_range(kg, sd, stack, node.y, node.z, node.w, &offset);
+ break;
# endif /* __EXTRA_NODES__ */
# if NODES_FEATURE(NODE_FEATURE_VOLUME)
case NODE_TEX_VOXEL:
diff --git a/intern/cycles/kernel/svm/svm_map_range.h b/intern/cycles/kernel/svm/svm_map_range.h
new file mode 100644
index 00000000000..53fbf1f10a0
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_map_range.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2011-2013 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+/* Map Range Node */
+
+ccl_device void svm_node_map_range(KernelGlobals *kg,
+ ShaderData *sd,
+ float *stack,
+ uint value_offset,
+ uint fromMin_offset,
+ uint fromMax_offset,
+ int *offset)
+{
+ uint4 node1 = read_node(kg, offset);
+
+ float value = stack_load_float(stack, value_offset);
+ float fromMin = stack_load_float(stack, fromMin_offset);
+ float fromMax = stack_load_float(stack, fromMax_offset);
+ float toMin = stack_load_float(stack, node1.y);
+ float toMax = stack_load_float(stack, node1.z);
+
+ float r;
+ if (fromMax != fromMin && toMax != toMin) {
+ r = toMin + ((value - fromMin) / (fromMax - fromMin)) * (toMax - toMin);
+ }
+ else {
+ r = 0.0f;
+ }
+ stack_store_float(stack, node1.w, r);
+}
+
+CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index a2468fc83d5..9e073068a4f 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -139,6 +139,7 @@ typedef enum ShaderNodeType {
NODE_PRINCIPLED_VOLUME,
NODE_IES,
NODE_TEXTURE_MAPPING,
+ NODE_MAP_RANGE,
} ShaderNodeType;
typedef enum NodeAttributeType {
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 57c1437a6fd..b36a771141b 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -5286,6 +5286,66 @@ void OutputNode::compile(OSLCompiler &compiler)
compiler.add(this, "node_output_displacement");
}
+/* Blackbody */
+
+NODE_DEFINE(MapRangeNode)
+{
+ NodeType *type = NodeType::add("map_range", create, NodeType::SHADER);
+
+ SOCKET_IN_FLOAT(value_in, "Value", 0.0f);
+ SOCKET_IN_FLOAT(fromMin, "From Min", 0.0f);
+ SOCKET_IN_FLOAT(fromMax, "From Max", 1.0f);
+ SOCKET_IN_FLOAT(toMin, "To Min", 0.0f);
+ SOCKET_IN_FLOAT(toMax, "To Max", 1.0f);
+
+ SOCKET_OUT_FLOAT(value_out, "Value");
+
+ return type;
+}
+
+MapRangeNode::MapRangeNode() : ShaderNode(node_type)
+{
+}
+
+void MapRangeNode::constant_fold(const ConstantFolder &folder)
+{
+ if (folder.all_inputs_constant()) {
+ float r;
+ if (fromMax != fromMin && toMax != toMin) {
+ r = toMin + ((value_in - fromMin) / (fromMax - fromMin)) * (toMax - toMin);
+ }
+ else {
+ r = 0.0f;
+ }
+ folder.make_constant(r);
+ }
+}
+
+void MapRangeNode::compile(SVMCompiler &compiler)
+{
+ ShaderInput *value_in = input("Value");
+ ShaderInput *fromMin_in = input("From Min");
+ ShaderInput *fromMax_in = input("From Max");
+ ShaderInput *toMin_in = input("To Min");
+ ShaderInput *toMax_in = input("To Max");
+
+ ShaderOutput *value_out = output("Value");
+
+ int toMin_stack = compiler.stack_assign(toMin_in);
+ int toMax_stack = compiler.stack_assign(toMax_in);
+
+ compiler.add_node(NODE_MAP_RANGE,
+ compiler.stack_assign(value_in),
+ compiler.stack_assign(fromMin_in),
+ compiler.stack_assign(fromMax_in));
+ compiler.add_node(NODE_MAP_RANGE, toMin_stack, toMax_stack, compiler.stack_assign(value_out));
+}
+
+void MapRangeNode::compile(OSLCompiler &compiler)
+{
+ compiler.add(this, "node_map_range");
+}
+
/* Math */
NODE_DEFINE(MathNode)
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index 3916425e486..f02d4aef342 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -1229,6 +1229,17 @@ class BlackbodyNode : public ShaderNode {
float temperature;
};
+class MapRangeNode : public ShaderNode {
+ public:
+ SHADER_NODE_CLASS(MapRangeNode)
+ void constant_fold(const ConstantFolder &folder);
+ virtual int get_group()
+ {
+ return NODE_GROUP_LEVEL_3;
+ }
+ float value_in, fromMin, fromMax, toMin, toMax;
+};
+
class MathNode : public ShaderNode {
public:
SHADER_NODE_CLASS(MathNode)
diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 01ae9c48fd2..25c20f5810c 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -258,6 +258,7 @@ shader_node_categories = [
NodeItem("ShaderNodeVectorTransform"),
]),
ShaderNodeCategory("SH_NEW_CONVERTOR", "Converter", items=[
+ NodeItem("ShaderNodeMapRange"),
NodeItem("ShaderNodeMath"),
NodeItem("ShaderNodeValToRGB"),
NodeItem("ShaderNodeRGBToBW"),
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index fb6096cd82f..521a552b2d3 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -973,6 +973,7 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree,
#define SH_NODE_VOLUME_PRINCIPLED 200
/* 201..700 occupied by other node types, continue from 701 */
#define SH_NODE_BSDF_HAIR_PRINCIPLED 701
+#define SH_NODE_MAP_RANGE 702
/* custom defines options for Material node */
#define SH_NODE_MAT_DIFF 1
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index d8b63dac99d..0738506fb4a 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -3853,6 +3853,7 @@ static void registerShaderNodes(void)
register_node_type_sh_mapping();
register_node_type_sh_curve_vec();
register_node_type_sh_curve_rgb();
+ register_node_type_sh_map_range();
register_node_type_sh_math();
register_node_type_sh_vect_math();
register_node_type_sh_vect_transform();
diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl
index a6dfb5ee931..14ebc81ae0b 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list