Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCharlie Jolly <charlie>2020-02-17 18:15:46 +0300
committerCharlie Jolly <mistajolly@gmail.com>2020-02-17 18:43:18 +0300
commit20a4cdfd700d3722fdcaa3b3952ccea1b0e6ee47 (patch)
tree16eee69e8e1d3bdfb902e05df15b055f7141fd4d /source
parentab3a6e050c856345d10f8e36155913288559e4dc (diff)
Cycles: Vector Rotate Node using Axis and Angle method
This node provides the ability to rotate a vector around a `center` point using either `Axis Angle` , `Single Axis` or `Euler` methods. Reviewed By: #cycles, brecht Differential Revision: https://developer.blender.org/D3789
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_node.h1
-rw-r--r--source/blender/blenkernel/intern/node.c1
-rw-r--r--source/blender/editors/space_node/drawnode.c8
-rw-r--r--source/blender/gpu/CMakeLists.txt1
-rw-r--r--source/blender/gpu/intern/gpu_material_library.c8
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_vector_rotate.glsl82
-rw-r--r--source/blender/makesdna/DNA_node_types.h14
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c54
-rw-r--r--source/blender/nodes/CMakeLists.txt1
-rw-r--r--source/blender/nodes/NOD_shader.h1
-rw-r--r--source/blender/nodes/NOD_static_types.h1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_vector_rotate.c96
12 files changed, 267 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index a8305862d89..712e97a77f0 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -994,6 +994,7 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree,
#define SH_NODE_VOLUME_INFO 705
#define SH_NODE_VERTEX_COLOR 706
#define SH_NODE_OUTPUT_AOV 707
+#define SH_NODE_VECTOR_ROTATE 708
/* 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 2a8c9f2a40b..3d413b8fd62 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -3975,6 +3975,7 @@ static void registerShaderNodes(void)
register_node_type_sh_clamp();
register_node_type_sh_math();
register_node_type_sh_vect_math();
+ register_node_type_sh_vector_rotate();
register_node_type_sh_vect_transform();
register_node_type_sh_squeeze();
register_node_type_sh_invert();
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index a00006f7025..8633ebca8d6 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -745,6 +745,11 @@ static void node_shader_buts_mapping(uiLayout *layout, bContext *UNUSED(C), Poin
uiItemR(layout, ptr, "vector_type", 0, NULL, ICON_NONE);
}
+static void node_shader_buts_vector_rotate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "rotation_type", 0, NULL, ICON_NONE);
+}
+
static void node_shader_buts_vect_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
@@ -1207,6 +1212,9 @@ static void node_shader_set_butfunc(bNodeType *ntype)
case SH_NODE_VECTOR_MATH:
ntype->draw_buttons = node_shader_buts_vect_math;
break;
+ case SH_NODE_VECTOR_ROTATE:
+ ntype->draw_buttons = node_shader_buts_vector_rotate;
+ break;
case SH_NODE_VECT_TRANSFORM:
ntype->draw_buttons = node_shader_buts_vect_transform;
break;
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 0ab3e775566..8a900938d2a 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -303,6 +303,7 @@ data_to_c_simple(shaders/material/gpu_shader_material_uv_map.glsl SRC)
data_to_c_simple(shaders/material/gpu_shader_material_vector_curves.glsl SRC)
data_to_c_simple(shaders/material/gpu_shader_material_vector_displacement.glsl SRC)
data_to_c_simple(shaders/material/gpu_shader_material_vector_math.glsl SRC)
+data_to_c_simple(shaders/material/gpu_shader_material_vector_rotate.glsl SRC)
data_to_c_simple(shaders/material/gpu_shader_material_velvet.glsl SRC)
data_to_c_simple(shaders/material/gpu_shader_material_vertex_color.glsl SRC)
data_to_c_simple(shaders/material/gpu_shader_material_volume_absorption.glsl SRC)
diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c
index e7ec1bb12a2..959e5ef7440 100644
--- a/source/blender/gpu/intern/gpu_material_library.c
+++ b/source/blender/gpu/intern/gpu_material_library.c
@@ -119,6 +119,7 @@ extern char datatoc_gpu_shader_material_uv_map_glsl[];
extern char datatoc_gpu_shader_material_vector_curves_glsl[];
extern char datatoc_gpu_shader_material_vector_displacement_glsl[];
extern char datatoc_gpu_shader_material_vector_math_glsl[];
+extern char datatoc_gpu_shader_material_vector_rotate_glsl[];
extern char datatoc_gpu_shader_material_velvet_glsl[];
extern char datatoc_gpu_shader_material_vertex_color_glsl[];
extern char datatoc_gpu_shader_material_volume_absorption_glsl[];
@@ -527,6 +528,11 @@ static GPUMaterialLibrary gpu_shader_material_vector_math_library = {
.dependencies = {&gpu_shader_material_math_util_library, NULL},
};
+static GPUMaterialLibrary gpu_shader_material_vector_rotate_library = {
+ .code = datatoc_gpu_shader_material_vector_rotate_glsl,
+ .dependencies = {&gpu_shader_material_math_util_library, NULL},
+};
+
static GPUMaterialLibrary gpu_shader_material_velvet_library = {
.code = datatoc_gpu_shader_material_velvet_glsl,
.dependencies = {&gpu_shader_material_diffuse_library, NULL},
@@ -647,6 +653,7 @@ static GPUMaterialLibrary *gpu_material_libraries[] = {
&gpu_shader_material_vector_curves_library,
&gpu_shader_material_vector_displacement_library,
&gpu_shader_material_vector_math_library,
+ &gpu_shader_material_vector_rotate_library,
&gpu_shader_material_velvet_library,
&gpu_shader_material_vertex_color_library,
&gpu_shader_material_volume_absorption_library,
@@ -879,4 +886,3 @@ char *gpu_material_library_generate_code(GSet *used_libraries, const char *frag_
return result;
}
-
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_vector_rotate.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_vector_rotate.glsl
new file mode 100644
index 00000000000..7d707706a03
--- /dev/null
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_vector_rotate.glsl
@@ -0,0 +1,82 @@
+vec3 rotate_around_axis(vec3 p, vec3 axis, float angle)
+{
+ float costheta = cos(angle);
+ float sintheta = sin(angle);
+ vec3 r;
+
+ r.x = ((costheta + (1.0 - costheta) * axis.x * axis.x) * p.x) +
+ (((1.0 - costheta) * axis.x * axis.y - axis.z * sintheta) * p.y) +
+ (((1.0 - costheta) * axis.x * axis.z + axis.y * sintheta) * p.z);
+
+ r.y = (((1.0 - costheta) * axis.x * axis.y + axis.z * sintheta) * p.x) +
+ ((costheta + (1.0 - costheta) * axis.y * axis.y) * p.y) +
+ (((1.0 - costheta) * axis.y * axis.z - axis.x * sintheta) * p.z);
+
+ r.z = (((1.0 - costheta) * axis.x * axis.z - axis.y * sintheta) * p.x) +
+ (((1.0 - costheta) * axis.y * axis.z + axis.x * sintheta) * p.y) +
+ ((costheta + (1.0 - costheta) * axis.z * axis.z) * p.z);
+
+ return r;
+}
+
+void node_vector_rotate_axis_angle(
+ vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec)
+{
+ vec = (length(axis) != 0.0) ?
+ rotate_around_axis(vector_in - center, normalize(axis), angle) + center :
+ vector_in;
+}
+
+void node_vector_rotate_axis_x(
+ vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec)
+{
+ vec = rotate_around_axis(vector_in - center, vec3(1.0, 0.0, 0.0), angle) + center;
+}
+
+void node_vector_rotate_axis_y(
+ vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec)
+{
+ vec = rotate_around_axis(vector_in - center, vec3(0.0, 1.0, 0.0), angle) + center;
+}
+
+void node_vector_rotate_axis_z(
+ vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec)
+{
+ vec = rotate_around_axis(vector_in - center, vec3(0.0, 0.0, 1.0), angle) + center;
+}
+
+void node_vector_rotate_euler_xyz(
+ vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec)
+{
+ vec = euler_to_mat3(rotation) * (vector_in - center) + center;
+}
+
+void node_vector_rotate_euler_xzy(
+ vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec)
+{
+ vec = euler_to_mat3(-rotation.xzy) * (vector_in - center) + center;
+}
+
+void node_vector_rotate_euler_yxz(
+ vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec)
+{
+ vec = euler_to_mat3(-rotation.yxz) * (vector_in - center) + center;
+}
+
+void node_vector_rotate_euler_yzx(
+ vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec)
+{
+ vec = euler_to_mat3(rotation.yzx) * (vector_in - center) + center;
+}
+
+void node_vector_rotate_euler_zxy(
+ vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec)
+{
+ vec = euler_to_mat3(rotation.zxy) * (vector_in - center) + center;
+}
+
+void node_vector_rotate_euler_zyx(
+ vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec)
+{
+ vec = euler_to_mat3(-rotation.zyx) * (vector_in - center) + center;
+}
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index a8f33072915..071dc70af55 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1212,6 +1212,20 @@ enum {
NODE_MAPPING_TYPE_NORMAL = 3,
};
+/* Rotation node vector types */
+enum {
+ NODE_VECTOR_ROTATE_TYPE_AXIS = 0,
+ NODE_VECTOR_ROTATE_TYPE_AXIS_X = 1,
+ NODE_VECTOR_ROTATE_TYPE_AXIS_Y = 2,
+ NODE_VECTOR_ROTATE_TYPE_AXIS_Z = 3,
+ NODE_VECTOR_ROTATE_TYPE_EULER_XYZ = 4,
+ NODE_VECTOR_ROTATE_TYPE_EULER_XZY = 5,
+ NODE_VECTOR_ROTATE_TYPE_EULER_YXZ = 6,
+ NODE_VECTOR_ROTATE_TYPE_EULER_YZX = 7,
+ NODE_VECTOR_ROTATE_TYPE_EULER_ZXY = 8,
+ NODE_VECTOR_ROTATE_TYPE_EULER_ZYX = 9,
+};
+
/* math node clamp */
#define SHD_MATH_CLAMP 1
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index e17fdb5359d..36bb65294fb 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -122,6 +122,49 @@ const EnumPropertyItem rna_enum_mapping_type_items[] = {
{0, NULL, 0, NULL, NULL},
};
+const EnumPropertyItem rna_enum_vector_rotate_type_items[] = {
+ {NODE_VECTOR_ROTATE_TYPE_AXIS,
+ "AXIS_ANGLE",
+ 0,
+ "Axis Angle",
+ "Rotate a point using axis angle"},
+ {NODE_VECTOR_ROTATE_TYPE_AXIS_X, "X_AXIS", 0, "X Axis", "Rotate a point using X axis"},
+ {NODE_VECTOR_ROTATE_TYPE_AXIS_Y, "Y_AXIS", 0, "Y Axis", "Rotate a point using Y axis"},
+ {NODE_VECTOR_ROTATE_TYPE_AXIS_Z, "Z_AXIS", 0, "Z Axis", "Rotate a point using Z axis"},
+ {NODE_VECTOR_ROTATE_TYPE_EULER_XYZ,
+ "EULER_XYZ",
+ 0,
+ "XYZ Euler",
+ "Rotate a point using XYZ order"},
+
+ {NODE_VECTOR_ROTATE_TYPE_EULER_XZY,
+ "EULER_XZY",
+ 0,
+ "XZY Euler",
+ "Rotate a point using XZY order"},
+ {NODE_VECTOR_ROTATE_TYPE_EULER_YXZ,
+ "EULER_YXZ",
+ 0,
+ "YXZ Euler",
+ "Rotate a point using YXZ order"},
+ {NODE_VECTOR_ROTATE_TYPE_EULER_YZX,
+ "EULER_YZX",
+ 0,
+ "YZX Euler",
+ "Rotate a point using YZX order"},
+ {NODE_VECTOR_ROTATE_TYPE_EULER_ZXY,
+ "EULER_ZXY",
+ 0,
+ "ZXY Euler",
+ "Rotate a point using ZXY order"},
+ {NODE_VECTOR_ROTATE_TYPE_EULER_ZYX,
+ "EULER_ZYX",
+ 0,
+ "XZY Euler",
+ "Rotate a point using ZYX order"},
+ {0, NULL, 0, NULL, NULL},
+};
+
const EnumPropertyItem rna_enum_node_math_items[] = {
{0, "", 0, N_("Functions"), ""},
{NODE_MATH_ADD, "ADD", 0, "Add", "A + B"},
@@ -4141,6 +4184,17 @@ static void def_sh_mapping(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
}
+static void def_sh_vector_rotate(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "rotation_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "custom1");
+ RNA_def_property_enum_items(prop, rna_enum_vector_rotate_type_items);
+ RNA_def_property_ui_text(prop, "Type", "Type of rotation");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
+}
+
static void def_sh_attribute(StructRNA *srna)
{
PropertyRNA *prop;
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index e15eb5af2c4..41227a14fb3 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -206,6 +206,7 @@ set(SRC
shader/nodes/node_shader_uvmap.c
shader/nodes/node_shader_valToRgb.c
shader/nodes/node_shader_value.c
+ shader/nodes/node_shader_vector_rotate.c
shader/nodes/node_shader_vectTransform.c
shader/nodes/node_shader_vector_displacement.c
shader/nodes/node_shader_vector_math.c
diff --git a/source/blender/nodes/NOD_shader.h b/source/blender/nodes/NOD_shader.h
index 69d779c9b7f..a89a9e927b9 100644
--- a/source/blender/nodes/NOD_shader.h
+++ b/source/blender/nodes/NOD_shader.h
@@ -85,6 +85,7 @@ void register_node_type_sh_volume_info(void);
void register_node_type_sh_script(void);
void register_node_type_sh_normal_map(void);
void register_node_type_sh_tangent(void);
+void register_node_type_sh_vector_rotate(void);
void register_node_type_sh_vect_transform(void);
void register_node_type_sh_vertex_color(void);
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index 2b141e1a639..7fec3324aab 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -117,6 +117,7 @@ DefNode(ShaderNode, SH_NODE_TEX_CHECKER, def_sh_tex_checker, "TEX
DefNode(ShaderNode, SH_NODE_TEX_BRICK, def_sh_tex_brick, "TEX_BRICK", TexBrick, "Brick Texture", "" )
DefNode(ShaderNode, SH_NODE_TEX_POINTDENSITY, def_sh_tex_pointdensity,"TEX_POINTDENSITY", TexPointDensity, "Point Density", "" )
DefNode(ShaderNode, SH_NODE_TEX_COORD, def_sh_tex_coord, "TEX_COORD", TexCoord, "Texture Coordinate","" )
+DefNode(ShaderNode, SH_NODE_VECTOR_ROTATE, def_sh_vector_rotate, "VECTOR_ROTATE", VectorRotate, "Vector Rotate", "" )
DefNode(ShaderNode, SH_NODE_VECT_TRANSFORM, def_sh_vect_transform, "VECT_TRANSFORM", VectorTransform, "Vector Transform", "" )
DefNode(ShaderNode, SH_NODE_SEPHSV, 0, "SEPHSV", SeparateHSV, "Separate HSV", "" )
DefNode(ShaderNode, SH_NODE_COMBHSV, 0, "COMBHSV", CombineHSV, "Combine HSV", "" )
diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.c b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.c
new file mode 100644
index 00000000000..3fd627cd886
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.c
@@ -0,0 +1,96 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2013 Blender Foundation.
+ * All rights reserved.
+ */
+
+/** \file
+ * \ingroup shdnodes
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** Vector Rotate ******************** */
+static bNodeSocketTemplate sh_node_vector_rotate_in[] = {
+ {SOCK_VECTOR, 1, N_("Vector"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
+ {SOCK_VECTOR, 1, N_("Center"), 0.0f, 0.0f, 0.0f, 1.0f, -FLT_MAX, FLT_MAX, PROP_NONE},
+ {SOCK_VECTOR, 1, N_("Axis"), 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 1.0f, PROP_NONE, PROP_NONE},
+ {SOCK_FLOAT, 1, N_("Angle"), 0.0f, 0.0f, 0.0f, 1.0f, -FLT_MAX, FLT_MAX, PROP_ANGLE, PROP_NONE},
+ {SOCK_VECTOR, 1, N_("Rotation"), 0.0f, 0.0f, 0.0f, 1.0f, -FLT_MAX, FLT_MAX, PROP_EULER},
+ {-1, 0, ""}};
+
+static bNodeSocketTemplate sh_node_vector_rotate_out[] = {{SOCK_VECTOR, 0, N_("Vector")},
+ {-1, 0, ""}};
+
+static int gpu_shader_vector_rotate(GPUMaterial *mat,
+ bNode *node,
+ bNodeExecData *UNUSED(execdata),
+ GPUNodeStack *in,
+ GPUNodeStack *out)
+{
+
+ static const char *names[] = {
+ [NODE_VECTOR_ROTATE_TYPE_AXIS] = "node_vector_rotate_axis_angle",
+ [NODE_VECTOR_ROTATE_TYPE_AXIS_X] = "node_vector_rotate_axis_x",
+ [NODE_VECTOR_ROTATE_TYPE_AXIS_Y] = "node_vector_rotate_axis_y",
+ [NODE_VECTOR_ROTATE_TYPE_AXIS_Z] = "node_vector_rotate_axis_z",
+ [NODE_VECTOR_ROTATE_TYPE_EULER_XYZ] = "node_vector_rotate_euler_xyz",
+ [NODE_VECTOR_ROTATE_TYPE_EULER_XZY] = "node_vector_rotate_euler_xzy",
+ [NODE_VECTOR_ROTATE_TYPE_EULER_YXZ] = "node_vector_rotate_euler_yxz",
+ [NODE_VECTOR_ROTATE_TYPE_EULER_YZX] = "node_vector_rotate_euler_yzx",
+ [NODE_VECTOR_ROTATE_TYPE_EULER_ZXY] = "node_vector_rotate_euler_zxy",
+ [NODE_VECTOR_ROTATE_TYPE_EULER_ZYX] = "node_vector_rotate_euler_zyx",
+ };
+
+ if (node->custom1 < ARRAY_SIZE(names) && names[node->custom1]) {
+ return GPU_stack_link(mat, node, names[node->custom1], in, out);
+ }
+ else {
+ return 0;
+ }
+}
+
+static void node_shader_update_vector_rotate(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ bNodeSocket *sock_rotation = nodeFindSocket(node, SOCK_IN, "Rotation");
+ nodeSetSocketAvailability(sock_rotation,
+ !ELEM(node->custom1,
+ NODE_VECTOR_ROTATE_TYPE_AXIS,
+ NODE_VECTOR_ROTATE_TYPE_AXIS_X,
+ NODE_VECTOR_ROTATE_TYPE_AXIS_Y,
+ NODE_VECTOR_ROTATE_TYPE_AXIS_Z));
+ bNodeSocket *sock_axis = nodeFindSocket(node, SOCK_IN, "Axis");
+ nodeSetSocketAvailability(sock_axis, ELEM(node->custom1, NODE_VECTOR_ROTATE_TYPE_AXIS));
+ bNodeSocket *sock_angle = nodeFindSocket(node, SOCK_IN, "Angle");
+ nodeSetSocketAvailability(sock_angle,
+ ELEM(node->custom1,
+ NODE_VECTOR_ROTATE_TYPE_AXIS,
+ NODE_VECTOR_ROTATE_TYPE_AXIS_X,
+ NODE_VECTOR_ROTATE_TYPE_AXIS_Y,
+ NODE_VECTOR_ROTATE_TYPE_AXIS_Z));
+}
+
+void register_node_type_sh_vector_rotate(void)
+{
+ static bNodeType ntype;
+
+ sh_node_type_base(&ntype, SH_NODE_VECTOR_ROTATE, "Vector Rotate", NODE_CLASS_OP_VECTOR, 0);
+ node_type_socket_templates(&ntype, sh_node_vector_rotate_in, sh_node_vector_rotate_out);
+ node_type_gpu(&ntype, gpu_shader_vector_rotate);
+ node_type_update(&ntype, node_shader_update_vector_rotate);
+
+ nodeRegisterType(&ntype);
+}