[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