[Bf-blender-cvs] [ab18171fdf4] soc-2019-cycles-procedural: Initial implementation of the new Mapping node.
OmarSquircleArt
noreply at git.blender.org
Mon Jun 3 18:02:01 CEST 2019
Commit: ab18171fdf4a82cd8e403edf669abd0475b57b4b
Author: OmarSquircleArt
Date: Mon Jun 3 17:58:43 2019 +0200
Branches: soc-2019-cycles-procedural
https://developer.blender.org/rBab18171fdf4a82cd8e403edf669abd0475b57b4b
Initial implementation of the new Mapping node.
===================================================================
M intern/cycles/blender/blender_shader.cpp
M intern/cycles/kernel/shaders/node_mapping.osl
M intern/cycles/kernel/svm/svm.h
M intern/cycles/kernel/svm/svm_mapping.h
M intern/cycles/kernel/svm/svm_math_util.h
M intern/cycles/kernel/svm/svm_types.h
M intern/cycles/render/nodes.cpp
M intern/cycles/render/nodes.h
M intern/cycles/util/util_math_float3.h
M intern/cycles/util/util_transform.h
M source/blender/editors/space_node/drawnode.c
M source/blender/gpu/shaders/gpu_shader_material.glsl
M source/blender/makesdna/DNA_node_types.h
M source/blender/makesrna/RNA_enum_types.h
M source/blender/makesrna/intern/rna_nodetree.c
M source/blender/makesrna/intern/rna_texture.c
M source/blender/nodes/shader/node_shader_util.c
M source/blender/nodes/shader/nodes/node_shader_mapping.c
===================================================================
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index 13097f6bf8e..33fef9e2528 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -208,24 +208,6 @@ static void get_tex_mapping(TextureMapping *mapping, BL::TexMapping &b_mapping)
mapping->z_mapping = (TextureMapping::Mapping)b_mapping.mapping_z();
}
-static void get_tex_mapping(TextureMapping *mapping, BL::ShaderNodeMapping &b_mapping)
-{
- if (!b_mapping)
- return;
-
- mapping->translation = get_float3(b_mapping.translation());
- mapping->rotation = get_float3(b_mapping.rotation());
- mapping->scale = get_float3(b_mapping.scale());
- mapping->type = (TextureMapping::Type)b_mapping.vector_type();
-
- mapping->use_minmax = b_mapping.use_min() || b_mapping.use_max();
-
- if (b_mapping.use_min())
- mapping->min = get_float3(b_mapping.min());
- if (b_mapping.use_max())
- mapping->max = get_float3(b_mapping.max());
-}
-
static ShaderNode *add_node(Scene *scene,
BL::RenderEngine &b_engine,
BL::BlendData &b_data,
@@ -348,9 +330,7 @@ static ShaderNode *add_node(Scene *scene,
else if (b_node.is_a(&RNA_ShaderNodeMapping)) {
BL::ShaderNodeMapping b_mapping_node(b_node);
MappingNode *mapping = new MappingNode();
-
- get_tex_mapping(&mapping->tex_mapping, b_mapping_node);
-
+ mapping->vector_type = (NodeMappingType)b_mapping_node.vector_type();
node = mapping;
}
else if (b_node.is_a(&RNA_ShaderNodeFresnel)) {
diff --git a/intern/cycles/kernel/shaders/node_mapping.osl b/intern/cycles/kernel/shaders/node_mapping.osl
index f5cc2d1c5dd..7e1591e7ff3 100644
--- a/intern/cycles/kernel/shaders/node_mapping.osl
+++ b/intern/cycles/kernel/shaders/node_mapping.osl
@@ -16,17 +16,53 @@
#include "stdosl.h"
-shader node_mapping(matrix Matrix = matrix(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
- point mapping_min = point(0.0, 0.0, 0.0),
- point mapping_max = point(0.0, 0.0, 0.0),
- int use_minmax = 0,
- point VectorIn = point(0.0, 0.0, 0.0),
- output point VectorOut = point(0.0, 0.0, 0.0))
+point safe_divide(point a, point b)
{
- point p = transform(Matrix, VectorIn);
+ return point((b[0] != 0.0) ? a[0] / b[0] : 0.0,
+ (b[1] != 0.0) ? a[1] / b[1] : 0.0,
+ (b[2] != 0.0) ? a[2] / b[2] : 0.0);
+}
+
+matrix euler_to_mat(point euler){
+ matrix mat = matrix(1.0);
+ float c1, c2, c3, s1, s2, s3;
+
+ c1 = cos(euler[0]);
+ c2 = cos(euler[1]);
+ c3 = cos(euler[2]);
+ s1 = sin(euler[0]);
+ s2 = sin(euler[1]);
+ s3 = sin(euler[2]);
+
+ mat[0][0] = c2 * c3;
+ mat[0][1] = c1 * s3 + c3 * s1 * s2;
+ mat[0][2] = s1 * s3 - c1 * c3 * s2;
- if (use_minmax)
- p = min(max(mapping_min, p), mapping_max);
+ mat[1][0] = -c2 * s3;
+ mat[1][1] = c1 * c3 - s1 * s2 * s3;
+ mat[1][2] = c3 * s1 + c1 * s2 * s3;
- VectorOut = p;
+ mat[2][0] = s2;
+ mat[2][1] = -c2 * s1;
+ mat[2][2] = c1 * c2;
+
+ return mat;
+}
+
+shader node_mapping(string vector_type = "point",
+ point VectorIn = point(0.0, 0.0, 0.0),
+ point Location = point(0.0, 0.0, 0.0),
+ point Rotation = point(0.0, 0.0, 0.0),
+ point Scale = point(1.0, 1.0, 1.0),
+ output point VectorOut = point(0.0, 0.0, 0.0))
+{
+ if (vector_type == "texture") {
+ VectorOut = safe_divide(transform(euler_to_mat(-Rotation), (VectorIn - Location)), Scale);
+ } else if (vector_type == "point") {
+ VectorOut = transform(euler_to_mat(Rotation), (VectorIn * Scale)) + Location;
+ } else if (vector_type == "vector") {
+ VectorOut = transform(euler_to_mat(Rotation), (VectorIn * Scale));
+ } else if (vector_type == "normal") {
+ VectorOut = normalize(transform(euler_to_mat(Rotation), safe_divide(VectorIn, Scale)));
+ }
}
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index 4a386afa5de..5c609e8fee5 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -393,8 +393,11 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg,
#endif /* NODES_GROUP(NODE_GROUP_LEVEL_1) */
#if NODES_GROUP(NODE_GROUP_LEVEL_2)
+ case NODE_TEXTURE_MAPPING:
+ svm_node_texture_mapping(kg, sd, stack, node.y, node.z, &offset);
+ break;
case NODE_MAPPING:
- svm_node_mapping(kg, sd, stack, node.y, node.z, &offset);
+ svm_node_mapping(kg, sd, stack, node.y, node.z, node.w, &offset);
break;
case NODE_MIN_MAX:
svm_node_min_max(kg, sd, stack, node.y, node.z, &offset);
diff --git a/intern/cycles/kernel/svm/svm_mapping.h b/intern/cycles/kernel/svm/svm_mapping.h
index 998a29912d4..a0889e32ed6 100644
--- a/intern/cycles/kernel/svm/svm_mapping.h
+++ b/intern/cycles/kernel/svm/svm_mapping.h
@@ -18,7 +18,7 @@ CCL_NAMESPACE_BEGIN
/* Mapping Node */
-ccl_device void svm_node_mapping(
+ccl_device void svm_node_texture_mapping(
KernelGlobals *kg, ShaderData *sd, float *stack, uint vec_offset, uint out_offset, int *offset)
{
float3 v = stack_load_float3(stack, vec_offset);
@@ -32,6 +32,50 @@ ccl_device void svm_node_mapping(
stack_store_float3(stack, out_offset, r);
}
+ccl_device void svm_node_mapping(KernelGlobals *kg,
+ ShaderData *sd,
+ float *stack,
+ uint vector_type,
+ uint vec_offset,
+ uint loc_offset,
+ int *offset)
+{
+ uint4 node1 = read_node(kg, offset);
+
+ NodeMappingType vec_type = (NodeMappingType)vector_type;
+ float3 vec = stack_load_float3(stack, vec_offset);
+ float3 loc = stack_load_float3(stack, loc_offset);
+ float3 rot = stack_load_float3(stack, node1.y);
+ float3 size = stack_load_float3(stack, node1.z);
+
+ float3 r;
+ Transform rot_t;
+ if (vec_type == NODE_MAPPING_TYPE_TEXTURE) {
+ rot_t = euler_to_transform(-rot);
+ }
+ else {
+ rot_t = euler_to_transform(rot);
+ }
+
+ switch (vec_type) {
+ case NODE_MAPPING_TYPE_POINT:
+ r = transform_direction(&rot_t, (vec * size)) + loc;
+ break;
+ case NODE_MAPPING_TYPE_TEXTURE:
+ r = safe_divide_float3(transform_direction(&rot_t, (vec - loc)), size);
+ break;
+ case NODE_MAPPING_TYPE_VECTOR:
+ r = transform_direction(&rot_t, (vec * size));
+ break;
+ case NODE_MAPPING_TYPE_NORMAL:
+ r = safe_normalize(transform_direction(&rot_t, safe_divide_float3(vec, size)));
+ break;
+ default:
+ r = make_float3(0.0f, 0.0f, 0.0f);
+ }
+ stack_store_float3(stack, node1.w, r);
+}
+
ccl_device void svm_node_min_max(
KernelGlobals *kg, ShaderData *sd, float *stack, uint vec_offset, uint out_offset, int *offset)
{
diff --git a/intern/cycles/kernel/svm/svm_math_util.h b/intern/cycles/kernel/svm/svm_math_util.h
index cc505e1791e..c1eebfcc50a 100644
--- a/intern/cycles/kernel/svm/svm_math_util.h
+++ b/intern/cycles/kernel/svm/svm_math_util.h
@@ -33,9 +33,7 @@ ccl_device void svm_vector_math(
*Fac = 0.0f;
break;
case NODE_VECTOR_MATH_DIVIDE:
- *Vector = make_float3(safe_divide(Vector1.x, Vector2.x),
- safe_divide(Vector1.y, Vector2.y),
- safe_divide(Vector1.z, Vector2.z));
+ *Vector = safe_divide_float3(Vector1, Vector2);
*Fac = 0.0f;
break;
case NODE_VECTOR_MATH_CROSS_PRODUCT:
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index c49898d4691..a2468fc83d5 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -138,6 +138,7 @@ typedef enum ShaderNodeType {
NODE_VECTOR_DISPLACEMENT,
NODE_PRINCIPLED_VOLUME,
NODE_IES,
+ NODE_TEXTURE_MAPPING,
} ShaderNodeType;
typedef enum NodeAttributeType {
@@ -295,6 +296,13 @@ typedef enum NodeVectorMath {
NODE_VECTOR_MATH_MAX,
} NodeVectorMath;
+typedef enum NodeMappingType {
+ NODE_MAPPING_TYPE_POINT,
+ NODE_MAPPING_TYPE_TEXTURE,
+ NODE_MAPPING_TYPE_VECTOR,
+ NODE_MAPPING_TYPE_NORMAL
+} NodeMappingType;
+
typedef enum NodeVectorTransformType {
NODE_VECTOR_TRANSFORM_TYPE_VECTOR,
NODE_VECTOR_TRANSFORM_TYPE_POINT,
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index e51ff956065..c82e8be08d5 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -149,7 +149,7 @@ bool TextureMapping::skip()
void TextureMapping::compile(SVMCompiler &compiler, int offset_in, int offset_out)
{
- compiler.add_node(NODE_MAPPING, offset_in, offset_out);
+ compiler.add_node(NODE_TEXTURE_MAPPING, offset_in, offset_out);
Transform tfm = compute_transform();
compiler.add_node(tfm.x);
@@ -1659,9 +1659,18 @@ NODE_DEFINE(MappingNode)
{
NodeType *type = NodeType::add("mapping", create, NodeType::SHADER);
- TEXTURE_MAPPING_DEFINE(MappingNode);
+ static NodeEnum type_enum;
+ type_enum.insert("point", NODE_MAPPING_TYPE_POINT);
+ type_enum.insert("texture", NODE_MAPPING_TYPE_TEXTURE);
+ type_enum.insert("vector", NODE_MAPPING_TYPE_VECTOR);
+ type_enum.insert("normal", NODE_MAPPING_TYPE_NORMAL);
+ SOCKET_ENUM(vector_type, "Type", type_enum, NODE_MAPPING_TYPE_TEXTURE);
SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f));
+ SOCKET_IN_POINT(location, "Location", make_float3(0.0f, 0.0f, 0.0f));
+ SOCKET_IN_POINT(rotation, "Rotation", make_float3(0.0f, 0.0f, 0.0f));
+ SOCKET_IN_POINT(scale, "Scale", make_float3(1.0f, 1.0f, 1.0f));
+
SOCKET_OUT_POINT(vector, "Vector");
return type;
@@ -1674,19 +1683,25 @@ MappingNode::MappingNode() : ShaderNode(node_type)
void MappingNode::compile(SVMCompiler &compiler)
{
ShaderInput *vector_in = input("Vector");
+ ShaderInput *location = input("Location");
+ ShaderInput *rotation = input("Rotation");
+ ShaderInput *scale = input("Scale");
+
ShaderOutput *vector_out = output("Vector");
- tex_mapping.compile(
- compiler, compiler.stack_assign(vector_in), c
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list