Commit: 361b417984b37fc110fe3b04108fc77c66fc7ed7 Author: OmarSquircleArt Date: Mon Aug 5 14:49:59 2019 +0200 Branches: soc-2019-cycles-procedural https://developer.blender.org/rB361b417984b37fc110fe3b04108fc77c66fc7ed7
Refactor and clean up Mapping node. =================================================================== M intern/cycles/blender/blender_shader.cpp M intern/cycles/kernel/shaders/node_mapping.osl M intern/cycles/kernel/svm/svm_mapping.h M intern/cycles/kernel/svm/svm_mapping_util.h M intern/cycles/render/nodes.cpp M intern/cycles/render/nodes.h M source/blender/gpu/shaders/gpu_shader_material.glsl M source/blender/makesrna/intern/rna_nodetree.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 f7e50839437..c98d7122144 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -335,7 +335,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(); - mapping->vector_type = (NodeMappingType)b_mapping_node.vector_type(); + mapping->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 7e1591e7ff3..98590c64fcc 100644 --- a/intern/cycles/kernel/shaders/node_mapping.osl +++ b/intern/cycles/kernel/shaders/node_mapping.osl @@ -49,20 +49,22 @@ matrix euler_to_mat(point euler){ return mat; } -shader node_mapping(string vector_type = "point", - point VectorIn = point(0.0, 0.0, 0.0), +shader node_mapping(string type = "point", + point Vector = 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)) + output point Result = 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))); + if (type == "point") { + Result = transform(euler_to_mat(Rotation), (Vector * Scale)) + Location; + } else if (type == "texture") { + Result = safe_divide(transform(euler_to_mat(-Rotation), (Vector - Location)), Scale); + } else if (type == "vector") { + Result = transform(euler_to_mat(Rotation), (Vector * Scale)); + } else if (type == "normal") { + Result = normalize(transform(euler_to_mat(Rotation), safe_divide(Vector, Scale))); + } else { + warning("%s", "Unknown Mapping vector type!"); } } diff --git a/intern/cycles/kernel/svm/svm_mapping.h b/intern/cycles/kernel/svm/svm_mapping.h index c59db8b7390..997b09fe82f 100644 --- a/intern/cycles/kernel/svm/svm_mapping.h +++ b/intern/cycles/kernel/svm/svm_mapping.h @@ -18,6 +18,27 @@ CCL_NAMESPACE_BEGIN /* Mapping Node */ +ccl_device void svm_node_mapping(KernelGlobals *kg, + ShaderData *sd, + float *stack, + uint type, + uint vector_offset, + uint location_offset, + int *offset) +{ + uint4 node1 = read_node(kg, offset); + + float3 vector = stack_load_float3(stack, vector_offset); + float3 location = stack_load_float3(stack, location_offset); + float3 rotation = stack_load_float3(stack, node1.y); + float3 scale = stack_load_float3(stack, node1.z); + + float3 result = svm_mapping((NodeMappingType)type, vector, location, rotation, scale); + stack_store_float3(stack, node1.w, result); +} + +/* Texture Mapping */ + ccl_device void svm_node_texture_mapping( KernelGlobals *kg, ShaderData *sd, float *stack, uint vec_offset, uint out_offset, int *offset) { @@ -32,27 +53,6 @@ ccl_device void svm_node_texture_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; - svm_mapping(&r, vec_type, vec, loc, rot, size); - 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_mapping_util.h b/intern/cycles/kernel/svm/svm_mapping_util.h index 0c9f22a8a22..a278a2a5c2a 100644 --- a/intern/cycles/kernel/svm/svm_mapping_util.h +++ b/intern/cycles/kernel/svm/svm_mapping_util.h @@ -16,33 +16,30 @@ CCL_NAMESPACE_BEGIN -ccl_device void svm_mapping( - float3 *outVec, NodeMappingType vecType, float3 vecIn, float3 loc, float3 rot, float3 size) +ccl_device float3 +svm_mapping(NodeMappingType type, float3 vector, float3 location, float3 rotation, float3 scale) { - Transform rot_t; - if (vecType == NODE_MAPPING_TYPE_TEXTURE) { - rot_t = euler_to_transform(-rot); + Transform rotationTransform; + if (type == NODE_MAPPING_TYPE_TEXTURE) { + rotationTransform = euler_to_transform(-rotation); } else { - rot_t = euler_to_transform(rot); + rotationTransform = euler_to_transform(rotation); } - switch (vecType) { + switch (type) { case NODE_MAPPING_TYPE_POINT: - *outVec = transform_direction(&rot_t, (vecIn * size)) + loc; - break; + return transform_direction(&rotationTransform, (vector * scale)) + location; case NODE_MAPPING_TYPE_TEXTURE: - *outVec = safe_divide_float3_float3(transform_direction(&rot_t, (vecIn - loc)), size); - break; + return safe_divide_float3_float3( + transform_direction(&rotationTransform, (vector - location)), scale); case NODE_MAPPING_TYPE_VECTOR: - *outVec = transform_direction(&rot_t, (vecIn * size)); - break; + return transform_direction(&rotationTransform, (vector * scale)); case NODE_MAPPING_TYPE_NORMAL: - *outVec = safe_normalize( - transform_direction(&rot_t, safe_divide_float3_float3(vecIn, size))); - break; + return safe_normalize( + transform_direction(&rotationTransform, safe_divide_float3_float3(vector, scale))); default: - *outVec = make_float3(0.0f, 0.0f, 0.0f); + return make_float3(0.0f, 0.0f, 0.0f); } } diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 60abb97d669..e8fc74154d3 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1751,14 +1751,14 @@ NODE_DEFINE(MappingNode) 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_ENUM(type, "Type", type_enum, NODE_MAPPING_TYPE_POINT); - SOCKET_IN_POINT(vector_in, "Vector", make_float3(0.0f, 0.0f, 0.0f)); + 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_out, "Vector"); + SOCKET_OUT_POINT(result, "Result"); return type; } @@ -1769,39 +1769,35 @@ MappingNode::MappingNode() : ShaderNode(node_type) void MappingNode::constant_fold(const ConstantFolder &folder) { - float3 vector_out; - if (folder.all_inputs_constant()) { - svm_mapping(&vector_out, vector_type, vector_in, location, rotation, scale); - folder.make_constant(vector_out); + float3 result = svm_mapping((NodeMappingType)type, vector, location, rotation, scale); + folder.make_constant(result); } else { - folder.fold_mapping((NodeMappingType)vector_type); + folder.fold_mapping((NodeMappingType)type); } } void MappingNode::compile(SVMCompiler &compiler) { ShaderInput *vector_in = input("Vector"); - ShaderInput *location = input("Location"); - ShaderInput *rotation = input("Rotation"); - ShaderInput *scale = input("Scale"); + ShaderInput *location_in = input("Location"); + ShaderInput *rotation_in = input("Rotation"); + ShaderInput *scale_in = input("Scale"); - ShaderOutput *vector_out = output("Vector"); + ShaderOutput *result_out = output("Result"); - int rotation_stack = compiler.stack_assign(rotation); - int scale_stack = compiler.stack_assign(scale); + int rotation_stack = compiler.stack_assign(rotation_in); + int scale_stack = compiler.stack_assign(scale_in); - compiler.add_node(NODE_MAPPING, - vector_type, - compiler.stack_assign(vector_in), - compiler.stack_assign(location)); - compiler.add_node(NODE_MAPPING, rotation_stack, scale_stack, compiler.stack_assign(vector_out)); + compiler.add_node( + NODE_MAPPING, type, compiler.stack_assign(vector_in), compiler.stack_assign(location_in)); + compiler.add_node(NODE_MAPPING, rotation_stack, scale_stack, compiler.stack_assign(result_out)); } void MappingNode::compile(OSLCompiler &compiler) { - compiler.parameter(this, "vector_type"); + compiler.parameter(this, "type"); compiler.add(this, "node_mapping"); } diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index 43eb259d903..1a83d68c156 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -394,8 +394,8 @@ class MappingNode : public ShaderNode { } void constant_fold(const ConstantFolder &folder); - float3 vector_in, location, rotation, scale; - NodeMappingType vector_type; + float3 vector, location, rotation, scale; + NodeMappingType type; }; class RGBToBWNode : publi @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs