GOOENGINE: Twirl Node

Patches originally written by Joseph and Thorn. Thank you!

Adds a twirl vector node
This commit is contained in:
2025-10-17 16:39:27 -05:00
parent 7d81a8b19e
commit 0deb24b0c7
11 changed files with 72 additions and 2 deletions
@@ -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):
+1
View File
@@ -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
/** \} */
+1
View File
@@ -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
@@ -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;
}
+7
View File
@@ -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];
@@ -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[] = {
+2 -2
View File
@@ -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")
@@ -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
@@ -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();
@@ -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();
@@ -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<decl::Vector>("Vector").default_value({0.0f, 0.0f, 0.0f});
b.add_input<decl::Vector>("Center").default_value({0.5f, 0.5f, 0.0f}).min(0.0f).max(1.0f);
b.add_input<decl::Float>("Amount").default_value(0.0f).min(-10.0f).max(10.0f);
b.add_output<decl::Vector>("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);
}