diff options
author | Charlie Jolly <mistajolly@gmail.com> | 2020-02-25 17:52:01 +0300 |
---|---|---|
committer | Charlie Jolly <mistajolly@gmail.com> | 2020-03-02 15:49:19 +0300 |
commit | 847c091ae838a0e5268fc327dac931c810d88d9b (patch) | |
tree | 0284badd5653d67447fc692bd61230bfc9def8b6 /source | |
parent | 493c99078a8fbd8807f137401c11d401b85ba0e7 (diff) |
Shading: Add invert option to Vector Rotate Node
Checkbox to invert rotation angle, suggested by @simonthommes
Differential Revision: https://developer.blender.org/D6932
Diffstat (limited to 'source')
4 files changed, 19 insertions, 11 deletions
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 8633ebca8d6..7ba033432c0 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -748,6 +748,7 @@ static void node_shader_buts_mapping(uiLayout *layout, bContext *UNUSED(C), Poin static void node_shader_buts_vector_rotate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { uiItemR(layout, ptr, "rotation_type", 0, NULL, ICON_NONE); + uiItemR(layout, ptr, "invert", 0, NULL, 0); } static void node_shader_buts_vect_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) 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 index 405821e01e3..41ad16cce0b 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_vector_rotate.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_vector_rotate.glsl @@ -20,33 +20,34 @@ vec3 rotate_around_axis(vec3 p, vec3 axis, float angle) } void node_vector_rotate_axis_angle( - vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec) + vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, float invert, out vec3 vec) { vec = (length(axis) != 0.0) ? - rotate_around_axis(vector_in - center, normalize(axis), angle) + center : + rotate_around_axis(vector_in - center, normalize(axis), angle * invert) + center : vector_in; } void node_vector_rotate_axis_x( - vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec) + vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, float invert, out vec3 vec) { - vec = rotate_around_axis(vector_in - center, vec3(1.0, 0.0, 0.0), angle) + center; + vec = rotate_around_axis(vector_in - center, vec3(1.0, 0.0, 0.0), angle * invert) + center; } void node_vector_rotate_axis_y( - vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec) + vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, float invert, out vec3 vec) { - vec = rotate_around_axis(vector_in - center, vec3(0.0, 1.0, 0.0), angle) + center; + vec = rotate_around_axis(vector_in - center, vec3(0.0, 1.0, 0.0), angle * invert) + center; } void node_vector_rotate_axis_z( - vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec) + vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, float invert, out vec3 vec) { - vec = rotate_around_axis(vector_in - center, vec3(0.0, 0.0, 1.0), angle) + center; + vec = rotate_around_axis(vector_in - center, vec3(0.0, 0.0, 1.0), angle * invert) + center; } void node_vector_rotate_euler_xyz( - vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, out vec3 vec) + vec3 vector_in, vec3 center, vec3 axis, float angle, vec3 rotation, float invert, out vec3 vec) { - vec = euler_to_mat3(rotation) * (vector_in - center) + center; + mat3 rmat = (invert < 0.0) ? transpose(euler_to_mat3(rotation)) : euler_to_mat3(rotation); + vec = rmat * (vector_in - center) + center; } diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index a0f7f9b585e..e5445546491 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -4166,6 +4166,11 @@ static void def_sh_vector_rotate(StructRNA *srna) 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"); + + prop = RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "custom2", 0); + RNA_def_property_ui_text(prop, "Invert", "Invert angle"); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); } static void def_sh_attribute(StructRNA *srna) diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.c b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.c index bee5377c438..c94cb903bf3 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.c +++ b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.c @@ -51,7 +51,8 @@ static int gpu_shader_vector_rotate(GPUMaterial *mat, }; if (node->custom1 < ARRAY_SIZE(names) && names[node->custom1]) { - return GPU_stack_link(mat, node, names[node->custom1], in, out); + float invert = (node->custom2) ? -1.0 : 1.0; + return GPU_stack_link(mat, node, names[node->custom1], in, out, GPU_constant(&invert)); } else { return 0; |