diff --git a/scripts/startup/bl_ui/node_add_menu_shader.py b/scripts/startup/bl_ui/node_add_menu_shader.py index 6dc04c01db5..bf52bfb3c5d 100644 --- a/scripts/startup/bl_ui/node_add_menu_shader.py +++ b/scripts/startup/bl_ui/node_add_menu_shader.py @@ -348,6 +348,7 @@ class NODE_MT_category_goo_engine(Menu): node_add_menu.add_node_type(layout, "ShaderNodeSdfOp") node_add_menu.add_node_type(layout, "ShaderNodeSdfVectorOp") node_add_menu.add_node_type(layout, "ShaderNodeSdfNoise") + node_add_menu.add_node_type(layout, "ShaderNodeTwirl") class NODE_MT_category_shader_script(Menu): diff --git a/source/blender/blenkernel/BKE_node.hh b/source/blender/blenkernel/BKE_node.hh index 99a2f82b17b..6896a40c962 100644 --- a/source/blender/blenkernel/BKE_node.hh +++ b/source/blender/blenkernel/BKE_node.hh @@ -1012,6 +1012,7 @@ void node_tree_remove_layer_n(bNodeTree *ntree, Scene *scene, int layer_index); #define SH_NODE_COLOR_PALETTE 900 #define SH_NODE_LIGHT_INFO 901 #define SH_NODE_TEX_HEXAGON 902 +#define SH_NODE_TWIRL 903 /** \} */ diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 141a97775ce..6a6e4b71d01 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -629,6 +629,7 @@ set(GLSL_SRC shaders/material/gpu_shader_material_texture_coordinates.glsl shaders/material/gpu_shader_material_tex_voronoi.glsl shaders/material/gpu_shader_material_tex_hexagon.glsl + shaders/material/gpu_shader_material_twirl.glsl shaders/material/gpu_shader_material_tex_wave.glsl shaders/material/gpu_shader_material_tex_white_noise.glsl shaders/material/gpu_shader_material_toon.glsl diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_twirl.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_twirl.glsl new file mode 100644 index 00000000000..41967a17c7f --- /dev/null +++ b/source/blender/gpu/shaders/material/gpu_shader_material_twirl.glsl @@ -0,0 +1,16 @@ +#pragma BLENDER_REQUIRE(gpu_shader_common_math_utils.glsl) + +void node_twirl(vec3 vector, vec3 center, float amount, out vec3 result) +{ + /* Only use X/Y for 2D twirl, Z is passed through. */ + float uv_x = vector.x - center.x; + float uv_y = vector.y - center.y; + float radius = sqrt(uv_x * uv_x + uv_y * uv_y); + float angle = atan(uv_y, uv_x); // Changed from atan2 to atan + angle += radius * amount; + float shifted_x = cos(angle) * radius; + float shifted_y = sin(angle) * radius; + result.x = shifted_x + center.x; + result.y = shifted_y + center.y; + result.z = vector.z; +} \ No newline at end of file diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index ea27c7e480f..5d6ee00f470 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -1538,6 +1538,13 @@ typedef struct NodeTexHexagon { int use_clamp; } NodeTexHexagon; +typedef struct NodeTwirl { + NodeTexBase base; + float amount; + float center[2]; + char _pad[4]; +} NodeTwirl; + typedef struct NodeSunBeams { float source[2]; diff --git a/source/blender/makesrna/intern/rna_nodetree.cc b/source/blender/makesrna/intern/rna_nodetree.cc index 4636ee09b91..e1b0eb01669 100644 --- a/source/blender/makesrna/intern/rna_nodetree.cc +++ b/source/blender/makesrna/intern/rna_nodetree.cc @@ -5778,6 +5778,12 @@ static void def_sh_shader_info(StructRNA *srna) RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); } +static void def_sh_twirl(StructRNA *srna) +{ + RNA_def_struct_sdna_from(srna, "NodeTwirl", "storage"); + def_sh_tex(srna); +} + static void def_sh_tex_hexagon(StructRNA *srna) { static const EnumPropertyItem prop_hexagon_coords_items[] = { diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index a8960e12a5b..aeb7fbc8ae3 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -131,11 +131,11 @@ DefNode(ShaderNode, SH_NODE_SEPARATE_COLOR, def_sh_combsep_color, "SEP DefNode(ShaderNode, SH_NODE_MIX, def_sh_mix, "MIX", Mix, "Mix", "Mix values by a factor") DefNode(ShaderNode, SH_NODE_SHADER_INFO, def_sh_shader_info, "SHADERINFO", ShaderInfo, "Shader Info", "Separate internal lighting into multiple outputs, and allow for per-node light-groups.") DefNode(ShaderNode, SH_NODE_TEX_HEXAGON, def_sh_tex_hexagon, "TEX_HEXAGON", TexHexagon, "Hex Grid Texture", "" ) +DefNode(ShaderNode, SH_NODE_TWIRL, def_sh_twirl, "TWIRL", Twirl, "Twirl", "Twirl the input vector around a center point by a specified amount") DefNode(ShaderNode, SH_NODE_SCREENSPACE_INFO, 0, "SCREENSPACEINFO", ScreenspaceInfo, "Screenspace Info", "Sample internal colour and depth buffers") DefNode(ShaderNode, SH_NODE_SET_DEPTH, 0, "SET_DEPTH", SetDepth, "Set Depth", "Pixel depth offset") -DefNode(ShaderNode, SH_NODE_CURVATURE, 0, "CURVATURE", Curvature, "Curvature", "" ) +DefNode(ShaderNode, SH_NODE_CURVATURE, 0, "CURVATURE", Curvature, "Curvature", "" ) DefNode(ShaderNode, SH_NODE_SDF_NOISE, 0, "SDF_NOISE", SdfNoise, "Sdf Noise", "" ) - DefNode(CompositorNode, CMP_NODE_VIEWER, def_cmp_viewer, "VIEWER", Viewer, "Viewer", "Visualize data from inside a node graph, in the image editor or as a backdrop") DefNode(CompositorNode, CMP_NODE_RGB, 0, "RGB", RGB, "RGB", "A color picker") DefNode(CompositorNode, CMP_NODE_VALUE, 0, "VALUE", Value, "Value", "Input numerical values to other nodes in the node graph") diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index 9e59f914219..0dab7296e93 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -49,6 +49,7 @@ set(SRC nodes/node_shader_clamp.cc nodes/node_shader_color_ramp.cc nodes/node_shader_tex_hexagon.cc + nodes/node_shader_twirl.cc nodes/node_shader_common.cc nodes/node_shader_curvature.cc nodes/node_shader_curves.cc diff --git a/source/blender/nodes/shader/node_shader_register.cc b/source/blender/nodes/shader/node_shader_register.cc index 55c4a15fb88..7b135f1bbfc 100644 --- a/source/blender/nodes/shader/node_shader_register.cc +++ b/source/blender/nodes/shader/node_shader_register.cc @@ -40,6 +40,7 @@ void register_shader_nodes() register_node_type_sh_combrgb(); register_node_type_sh_combxyz(); register_node_type_sh_tex_hexagon(); + register_node_type_sh_twirl(); register_node_type_sh_curvature(); register_node_type_sh_curve_float(); register_node_type_sh_curve_rgb(); diff --git a/source/blender/nodes/shader/node_shader_register.hh b/source/blender/nodes/shader/node_shader_register.hh index 4e7316c8e47..b3ddf270a15 100644 --- a/source/blender/nodes/shader/node_shader_register.hh +++ b/source/blender/nodes/shader/node_shader_register.hh @@ -36,6 +36,7 @@ void register_node_type_sh_combhsv(); void register_node_type_sh_combrgb(); void register_node_type_sh_combxyz(); void register_node_type_sh_tex_hexagon(); +void register_node_type_sh_twirl(); void register_node_type_sh_curvature(); void register_node_type_sh_curve_float(); void register_node_type_sh_curve_rgb(); diff --git a/source/blender/nodes/shader/nodes/node_shader_twirl.cc b/source/blender/nodes/shader/nodes/node_shader_twirl.cc new file mode 100644 index 00000000000..33722811694 --- /dev/null +++ b/source/blender/nodes/shader/nodes/node_shader_twirl.cc @@ -0,0 +1,35 @@ +#include "node_shader_util.hh" + +namespace blender::nodes::node_shader_twirl_cc { + +static void node_declare(NodeDeclarationBuilder &b) +{ + b.add_input("Vector").default_value({0.0f, 0.0f, 0.0f}); + b.add_input("Center").default_value({0.5f, 0.5f, 0.0f}).min(0.0f).max(1.0f); + b.add_input("Amount").default_value(0.0f).min(-10.0f).max(10.0f); + b.add_output("Vector"); +} + +static int gpu_shader_twirl(GPUMaterial *mat, + bNode *node, + bNodeExecData * /*execdata*/, + GPUNodeStack *in, + GPUNodeStack *out) +{ + return GPU_stack_link(mat, node, "node_twirl", in, out); +} + +} // namespace blender::nodes::node_shader_twirl_cc + +void register_node_type_sh_twirl(void) +{ + namespace file_ns = blender::nodes::node_shader_twirl_cc; + + static blender::bke::bNodeType ntype; + + sh_node_type_base(&ntype, SH_NODE_TWIRL, "Twirl", NODE_CLASS_OP_VECTOR); + ntype.declare = file_ns::node_declare; + ntype.gpu_fn = file_ns::gpu_shader_twirl; + + node_register_type(&ntype); +} \ No newline at end of file