WIP: Geometry Nodes: Rotation type #107954

Closed
Hans Goudey wants to merge 4 commits from HooglyBoogly:geometry-nodes-rotation-type into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
16 changed files with 168 additions and 32 deletions
Showing only changes of commit 07fc1aadaf - Show all commits

View File

@ -28,6 +28,8 @@ std::optional<eCustomDataType> node_data_type_to_custom_data_type(const eNodeSoc
return CD_PROP_COLOR;
case SOCK_BOOLEAN:
return CD_PROP_BOOL;
case SOCK_ROTATION:
return CD_PROP_QUATERNION;
case SOCK_INT:
return CD_PROP_INT32;
case SOCK_STRING:

View File

@ -23,6 +23,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Color>("Value", "Value_002").field_on_all();
b.add_input<decl::Bool>("Value", "Value_003").field_on_all();
b.add_input<decl::Int>("Value", "Value_004").field_on_all();
b.add_input<decl::Rotation>("Value", "Value_005").field_on_all();
b.add_output<decl::Geometry>("Geometry").propagate_all();
b.add_output<decl::Vector>("Attribute").field_on_all();
@ -30,6 +31,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_output<decl::Color>("Attribute", "Attribute_002").field_on_all();
b.add_output<decl::Bool>("Attribute", "Attribute_003").field_on_all();
b.add_output<decl::Int>("Attribute", "Attribute_004").field_on_all();
b.add_output<decl::Rotation>("Attribute", "Attribute_005").field_on_all();
}
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
@ -60,12 +62,14 @@ static void node_update(bNodeTree *ntree, bNode *node)
bNodeSocket *socket_value_color4f = socket_value_float->next;
bNodeSocket *socket_value_boolean = socket_value_color4f->next;
bNodeSocket *socket_value_int32 = socket_value_boolean->next;
bNodeSocket *socket_value_quat = socket_value_int32->next;
bke::nodeSetSocketAvailability(ntree, socket_value_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, socket_value_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, socket_value_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, socket_value_boolean, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, socket_value_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, socket_value_quat, data_type == CD_PROP_QUATERNION);
bNodeSocket *out_socket_value_geometry = static_cast<bNodeSocket *>(node->outputs.first);
bNodeSocket *out_socket_value_vector = out_socket_value_geometry->next;
@ -73,12 +77,14 @@ static void node_update(bNodeTree *ntree, bNode *node)
bNodeSocket *out_socket_value_color4f = out_socket_value_float->next;
bNodeSocket *out_socket_value_boolean = out_socket_value_color4f->next;
bNodeSocket *out_socket_value_int32 = out_socket_value_boolean->next;
bNodeSocket *out_socket_value_quat = out_socket_value_int32->next;
bke::nodeSetSocketAvailability(ntree, out_socket_value_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, out_socket_value_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, out_socket_value_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, out_socket_value_boolean, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, out_socket_value_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, out_socket_value_quat, data_type == CD_PROP_QUATERNION);
}
static void node_gather_link_searches(GatherLinkSearchOpParams &params)
@ -115,6 +121,8 @@ static StringRefNull identifier_suffix(eCustomDataType data_type)
return "_001";
case CD_PROP_INT32:
return "_004";
case CD_PROP_QUATERNION:
return "_005";
case CD_PROP_COLOR:
return "_002";
case CD_PROP_BOOL:
@ -172,6 +180,9 @@ static void node_geo_exec(GeoNodeExecParams params)
case CD_PROP_INT32:
field = params.get_input<Field<int>>(input_identifier);
break;
case CD_PROP_QUATERNION:
field = params.get_input<Field<math::Quaternion>>(input_identifier);
break;
default:
break;
}

View File

@ -97,6 +97,10 @@ static void node_gather_link_searches(GatherLinkSearchOpParams &params)
if (fixed_data_type == CD_PROP_STRING) {
return;
}
if (fixed_data_type == CD_PROP_QUATERNION) {
/* Don't implement quaternion blurring for now. */
return;
}
if (fixed_data_type == CD_PROP_BOOL) {
/* This node does not support boolean sockets, use integer instead. */
fixed_data_type = CD_PROP_INT32;

View File

@ -28,6 +28,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Vector>("Value", "Value_Vector").hide_value().field_on_all();
b.add_input<decl::Color>("Value", "Value_Color").hide_value().field_on_all();
b.add_input<decl::Bool>("Value", "Value_Bool").hide_value().field_on_all();
b.add_input<decl::Rotation>("Value", "Value_Rotation").hide_value().field_on_all();
b.add_input<decl::Float>("Factor")
.min(0.0f)
@ -44,15 +45,16 @@ static void node_declare(NodeDeclarationBuilder &b)
node_storage(node).use_all_curves = false;
});
b.add_output<decl::Float>("Value", "Value_Float").dependent_field({6, 7, 8});
b.add_output<decl::Int>("Value", "Value_Int").dependent_field({6, 7, 8});
b.add_output<decl::Vector>("Value", "Value_Vector").dependent_field({6, 7, 8});
b.add_output<decl::Color>("Value", "Value_Color").dependent_field({6, 7, 8});
b.add_output<decl::Bool>("Value", "Value_Bool").dependent_field({6, 7, 8});
b.add_output<decl::Float>("Value", "Value_Float").dependent_field({7, 8, 9});
b.add_output<decl::Int>("Value", "Value_Int").dependent_field({7, 8, 9});
b.add_output<decl::Vector>("Value", "Value_Vector").dependent_field({7, 8, 9});
b.add_output<decl::Color>("Value", "Value_Color").dependent_field({7, 8, 9});
b.add_output<decl::Bool>("Value", "Value_Bool").dependent_field({7, 8, 9});
b.add_output<decl::Rotation>("Value", "Value_Rotation").dependent_field({7, 8, 9});
b.add_output<decl::Vector>("Position").dependent_field({6, 7, 8});
b.add_output<decl::Vector>("Tangent").dependent_field({6, 7, 8});
b.add_output<decl::Vector>("Normal").dependent_field({6, 7, 8});
b.add_output<decl::Vector>("Position").dependent_field({7, 8, 9});
b.add_output<decl::Vector>("Tangent").dependent_field({7, 8, 9});
b.add_output<decl::Vector>("Normal").dependent_field({7, 8, 9});
}
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
@ -82,6 +84,7 @@ static void node_update(bNodeTree *ntree, bNode *node)
bNodeSocket *in_socket_vector = in_socket_int32->next;
bNodeSocket *in_socket_color4f = in_socket_vector->next;
bNodeSocket *in_socket_bool = in_socket_color4f->next;
bNodeSocket *in_socket_quat = in_socket_bool->next;
bNodeSocket *factor = in_socket_bool->next;
bNodeSocket *length = factor->next;
@ -96,18 +99,21 @@ static void node_update(bNodeTree *ntree, bNode *node)
bke::nodeSetSocketAvailability(ntree, in_socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, in_socket_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, in_socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, in_socket_quat, data_type == CD_PROP_QUATERNION);
bNodeSocket *out_socket_float = static_cast<bNodeSocket *>(node->outputs.first);
bNodeSocket *out_socket_int32 = out_socket_float->next;
bNodeSocket *out_socket_vector = out_socket_int32->next;
bNodeSocket *out_socket_color4f = out_socket_vector->next;
bNodeSocket *out_socket_bool = out_socket_color4f->next;
bNodeSocket *out_socket_quat = out_socket_bool->next;
bke::nodeSetSocketAvailability(ntree, out_socket_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, out_socket_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, out_socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, out_socket_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, out_socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, out_socket_quat, data_type == CD_PROP_QUATERNION);
}
static void node_gather_link_searches(GatherLinkSearchOpParams &params)
@ -464,6 +470,8 @@ static GField get_input_attribute_field(GeoNodeExecParams &params, const eCustom
return params.extract_input<Field<bool>>("Value_Bool");
case CD_PROP_INT32:
return params.extract_input<Field<int>>("Value_Int");
case CD_PROP_QUATERNION:
return params.extract_input<Field<math::Quaternion>>("Value_Rotation");
default:
BLI_assert_unreachable();
}
@ -493,6 +501,10 @@ static void output_attribute_field(GeoNodeExecParams &params, GField field)
params.set_output("Value_Int", Field<int>(field));
break;
}
case CD_PROP_QUATERNION: {
params.set_output("Value_Rotation", Field<math::Quaternion>(field));
break;
}
default:
break;
}

View File

@ -93,24 +93,28 @@ static void node_update(bNodeTree *ntree, bNode *node)
bNodeSocket *sock_in_vector = sock_in_int->next;
bNodeSocket *sock_in_color = sock_in_vector->next;
bNodeSocket *sock_in_bool = sock_in_color->next;
bNodeSocket *sock_in_quat = sock_in_bool->next;
bNodeSocket *sock_out_float = static_cast<bNodeSocket *>(node->outputs.first);
bNodeSocket *sock_out_int = sock_out_float->next;
bNodeSocket *sock_out_vector = sock_out_int->next;
bNodeSocket *sock_out_color = sock_out_vector->next;
bNodeSocket *sock_out_bool = sock_out_color->next;
bNodeSocket *sock_out_quat = sock_out_bool->next;
bke::nodeSetSocketAvailability(ntree, sock_in_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, sock_in_int, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, sock_in_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, sock_in_color, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, sock_in_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, sock_in_quat, data_type == CD_PROP_QUATERNION);
bke::nodeSetSocketAvailability(ntree, sock_out_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, sock_out_int, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, sock_out_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, sock_out_color, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, sock_out_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, sock_out_quat, data_type == CD_PROP_QUATERNION);
}
static void node_gather_link_searches(GatherLinkSearchOpParams &params)
@ -148,6 +152,8 @@ static StringRefNull identifier_suffix(eCustomDataType data_type)
return "Color";
case CD_PROP_FLOAT3:
return "Vector";
case CD_PROP_QUATERNION:
return "Rotation";
default:
BLI_assert_unreachable();
return "";

View File

@ -22,12 +22,14 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Vector>("Value", "Value_Vector").supports_field();
b.add_input<decl::Color>("Value", "Value_Color").supports_field();
b.add_input<decl::Bool>("Value", "Value_Bool").supports_field();
b.add_input<decl::Rotation>("Value", "Value_Rotation").supports_field();
b.add_output<decl::Float>("Value", "Value_Float").field_source_reference_all();
b.add_output<decl::Int>("Value", "Value_Int").field_source_reference_all();
b.add_output<decl::Vector>("Value", "Value_Vector").field_source_reference_all();
b.add_output<decl::Color>("Value", "Value_Color").field_source_reference_all();
b.add_output<decl::Bool>("Value", "Value_Bool").field_source_reference_all();
b.add_output<decl::Rotation>("Value", "Value_Rotation").field_source_reference_all();
}
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
@ -51,24 +53,28 @@ static void node_update(bNodeTree *ntree, bNode *node)
bNodeSocket *sock_in_vector = sock_in_int->next;
bNodeSocket *sock_in_color = sock_in_vector->next;
bNodeSocket *sock_in_bool = sock_in_color->next;
bNodeSocket *sock_in_quat = sock_in_bool->next;
bNodeSocket *sock_out_float = static_cast<bNodeSocket *>(node->outputs.first);
bNodeSocket *sock_out_int = sock_out_float->next;
bNodeSocket *sock_out_vector = sock_out_int->next;
bNodeSocket *sock_out_color = sock_out_vector->next;
bNodeSocket *sock_out_bool = sock_out_color->next;
bNodeSocket *sock_out_quat = sock_out_bool->next;
bke::nodeSetSocketAvailability(ntree, sock_in_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, sock_in_int, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, sock_in_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, sock_in_color, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, sock_in_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, sock_in_quat, data_type == CD_PROP_QUATERNION);
bke::nodeSetSocketAvailability(ntree, sock_out_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, sock_out_int, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, sock_out_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, sock_out_color, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, sock_out_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, sock_out_quat, data_type == CD_PROP_QUATERNION);
}
static void node_gather_link_searches(GatherLinkSearchOpParams &params)
@ -139,6 +145,8 @@ static StringRefNull identifier_suffix(eCustomDataType data_type)
return "Color";
case CD_PROP_FLOAT3:
return "Vector";
case CD_PROP_QUATERNION:
return "Rotation";
default:
BLI_assert_unreachable();
return "";

View File

@ -22,6 +22,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_output<decl::Color>("Attribute", "Attribute_Color").field_source();
b.add_output<decl::Bool>("Attribute", "Attribute_Bool").field_source();
b.add_output<decl::Int>("Attribute", "Attribute_Int").field_source();
b.add_output<decl::Rotation>("Attribute", "Attribute_Rotation").field_source();
b.add_output<decl::Bool>("Exists").field_source();
}
@ -48,12 +49,14 @@ static void node_update(bNodeTree *ntree, bNode *node)
bNodeSocket *socket_color4f = socket_float->next;
bNodeSocket *socket_boolean = socket_color4f->next;
bNodeSocket *socket_int32 = socket_boolean->next;
bNodeSocket *socket_quat = socket_int32->next;
bke::nodeSetSocketAvailability(ntree, socket_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, socket_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, socket_boolean, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, socket_quat, data_type == CD_PROP_QUATERNION);
}
static void node_gather_link_searches(GatherLinkSearchOpParams &params)
@ -145,6 +148,9 @@ static void node_geo_exec(GeoNodeExecParams params)
case CD_PROP_INT32:
params.set_output("Attribute_Int", AttributeFieldInput::Create<int>(name));
break;
case CD_PROP_QUATERNION:
params.set_output("Attribute_Rotation", AttributeFieldInput::Create<math::Quaternion>(name));
break;
default:
break;
}

View File

@ -32,6 +32,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Color>("Attribute", "Attribute_002").hide_value().field_on_all();
b.add_input<decl::Bool>("Attribute", "Attribute_003").hide_value().field_on_all();
b.add_input<decl::Int>("Attribute", "Attribute_004").hide_value().field_on_all();
b.add_input<decl::Rotation>("Attribute", "Attribute_005").hide_value().field_on_all();
b.add_input<decl::Vector>("Source Position").implicit_field(implicit_field_inputs::position);
b.add_input<decl::Vector>("Ray Direction").default_value({0.0f, 0.0f, -1.0f}).supports_field();
@ -51,6 +52,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_output<decl::Color>("Attribute", "Attribute_002").dependent_field({6, 7, 8});
b.add_output<decl::Bool>("Attribute", "Attribute_003").dependent_field({6, 7, 8});
b.add_output<decl::Int>("Attribute", "Attribute_004").dependent_field({6, 7, 8});
b.add_output<decl::Rotation>("Attribute", "Attribute_005").dependent_field({6, 7, 8});
}
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
@ -77,24 +79,28 @@ static void node_update(bNodeTree *ntree, bNode *node)
bNodeSocket *socket_color4f = socket_float->next;
bNodeSocket *socket_boolean = socket_color4f->next;
bNodeSocket *socket_int32 = socket_boolean->next;
bNodeSocket *socket_quat = socket_boolean->next;
bke::nodeSetSocketAvailability(ntree, socket_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, socket_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, socket_boolean, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, socket_quat, data_type == CD_PROP_QUATERNION);
bNodeSocket *out_socket_vector = static_cast<bNodeSocket *>(BLI_findlink(&node->outputs, 4));
bNodeSocket *out_socket_float = out_socket_vector->next;
bNodeSocket *out_socket_color4f = out_socket_float->next;
bNodeSocket *out_socket_boolean = out_socket_color4f->next;
bNodeSocket *out_socket_int32 = out_socket_boolean->next;
bNodeSocket *out_socket_quat = out_socket_boolean->next;
bke::nodeSetSocketAvailability(ntree, out_socket_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, out_socket_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, out_socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, out_socket_boolean, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, out_socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, out_socket_quat, data_type == CD_PROP_QUATERNION);
}
static void node_gather_link_searches(GatherLinkSearchOpParams &params)

View File

@ -65,14 +65,16 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Vector>("Value", "Value_Vector").hide_value().field_on_all();
b.add_input<decl::Color>("Value", "Value_Color").hide_value().field_on_all();
b.add_input<decl::Bool>("Value", "Value_Bool").hide_value().field_on_all();
b.add_input<decl::Rotation>("Value", "Value_Rotation").hide_value().field_on_all();
b.add_input<decl::Int>("Index").supports_field().description(
"Which element to retrieve a value from on the geometry");
b.add_output<decl::Float>("Value", "Value_Float").dependent_field({6});
b.add_output<decl::Int>("Value", "Value_Int").dependent_field({6});
b.add_output<decl::Vector>("Value", "Value_Vector").dependent_field({6});
b.add_output<decl::Color>("Value", "Value_Color").dependent_field({6});
b.add_output<decl::Bool>("Value", "Value_Bool").dependent_field({6});
b.add_output<decl::Float>("Value", "Value_Float").dependent_field({7});
b.add_output<decl::Int>("Value", "Value_Int").dependent_field({7});
b.add_output<decl::Vector>("Value", "Value_Vector").dependent_field({7});
b.add_output<decl::Color>("Value", "Value_Color").dependent_field({7});
b.add_output<decl::Bool>("Value", "Value_Bool").dependent_field({7});
b.add_output<decl::Rotation>("Value", "Value_Rotation").dependent_field({7});
}
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
@ -101,24 +103,28 @@ static void node_update(bNodeTree *ntree, bNode *node)
bNodeSocket *in_socket_vector = in_socket_int32->next;
bNodeSocket *in_socket_color4f = in_socket_vector->next;
bNodeSocket *in_socket_bool = in_socket_color4f->next;
bNodeSocket *in_socket_quat = in_socket_bool->next;
bke::nodeSetSocketAvailability(ntree, in_socket_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, in_socket_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, in_socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, in_socket_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, in_socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, in_socket_quat, data_type == CD_PROP_QUATERNION);
bNodeSocket *out_socket_float = static_cast<bNodeSocket *>(node->outputs.first);
bNodeSocket *out_socket_int32 = out_socket_float->next;
bNodeSocket *out_socket_vector = out_socket_int32->next;
bNodeSocket *out_socket_color4f = out_socket_vector->next;
bNodeSocket *out_socket_bool = out_socket_color4f->next;
bNodeSocket *out_socket_quat = out_socket_bool->next;
bke::nodeSetSocketAvailability(ntree, out_socket_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, out_socket_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, out_socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, out_socket_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, out_socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, out_socket_quat, data_type == CD_PROP_QUATERNION);
}
static void node_gather_link_searches(GatherLinkSearchOpParams &params)

View File

@ -30,6 +30,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Vector>("Value", "Value_Vector").hide_value().field_on_all();
b.add_input<decl::Color>("Value", "Value_Color").hide_value().field_on_all();
b.add_input<decl::Bool>("Value", "Value_Bool").hide_value().field_on_all();
b.add_input<decl::Rotation>("Value", "Value_Rotation").hide_value().field_on_all();
b.add_input<decl::Vector>("Sample Position").implicit_field(implicit_field_inputs::position);
@ -38,6 +39,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_output<decl::Vector>("Value", "Value_Vector").dependent_field({6});
b.add_output<decl::Color>("Value", "Value_Color").dependent_field({6});
b.add_output<decl::Bool>("Value", "Value_Bool").dependent_field({6});
b.add_output<decl::Rotation>("Value", "Value_Rotation").dependent_field({6});
}
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
@ -60,24 +62,28 @@ static void node_update(bNodeTree *ntree, bNode *node)
bNodeSocket *in_socket_vector = in_socket_int32->next;
bNodeSocket *in_socket_color4f = in_socket_vector->next;
bNodeSocket *in_socket_bool = in_socket_color4f->next;
bNodeSocket *in_socket_quat = in_socket_bool->next;
bke::nodeSetSocketAvailability(ntree, in_socket_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, in_socket_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, in_socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, in_socket_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, in_socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, in_socket_quat, data_type == CD_PROP_QUATERNION);
bNodeSocket *out_socket_float = static_cast<bNodeSocket *>(node->outputs.first);
bNodeSocket *out_socket_int32 = out_socket_float->next;
bNodeSocket *out_socket_vector = out_socket_int32->next;
bNodeSocket *out_socket_color4f = out_socket_vector->next;
bNodeSocket *out_socket_bool = out_socket_color4f->next;
bNodeSocket *out_socket_quat = out_socket_bool->next;
bke::nodeSetSocketAvailability(ntree, out_socket_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, out_socket_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, out_socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, out_socket_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, out_socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, out_socket_quat, data_type == CD_PROP_QUATERNION);
}
static void node_gather_link_searches(GatherLinkSearchOpParams &params)
@ -162,6 +168,8 @@ static GField get_input_attribute_field(GeoNodeExecParams &params, const eCustom
return params.extract_input<Field<bool>>("Value_Bool");
case CD_PROP_INT32:
return params.extract_input<Field<int>>("Value_Int");
case CD_PROP_QUATERNION:
return params.extract_input<Field<math::Quaternion>>("Value_Rotation");
default:
BLI_assert_unreachable();
}
@ -191,6 +199,10 @@ static void output_attribute_field(GeoNodeExecParams &params, GField field)
params.set_output("Value_Int", Field<int>(field));
break;
}
case CD_PROP_QUATERNION: {
params.set_output("Value_Rotation", Field<math::Quaternion>(field));
break;
}
default:
break;
}

View File

@ -29,6 +29,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Vector>("Value", "Value_Vector").hide_value().field_on_all();
b.add_input<decl::Color>("Value", "Value_Color").hide_value().field_on_all();
b.add_input<decl::Bool>("Value", "Value_Bool").hide_value().field_on_all();
b.add_input<decl::Rotation>("Value", "Value_Rotation").hide_value().field_on_all();
b.add_input<decl::Vector>("Source UV Map")
.hide_value()
@ -43,6 +44,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_output<decl::Vector>("Value", "Value_Vector").dependent_field({7});
b.add_output<decl::Color>("Value", "Value_Color").dependent_field({7});
b.add_output<decl::Bool>("Value", "Value_Bool").dependent_field({7});
b.add_output<decl::Rotation>("Value", "Value_Rotation").dependent_field({7});
b.add_output<decl::Bool>("Is Valid")
.dependent_field({7})
@ -69,24 +71,28 @@ static void node_update(bNodeTree *ntree, bNode *node)
bNodeSocket *in_socket_vector = in_socket_int32->next;
bNodeSocket *in_socket_color4f = in_socket_vector->next;
bNodeSocket *in_socket_bool = in_socket_color4f->next;
bNodeSocket *in_socket_quat = in_socket_bool->next;
bke::nodeSetSocketAvailability(ntree, in_socket_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, in_socket_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, in_socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, in_socket_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, in_socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, in_socket_quat, data_type == CD_PROP_QUATERNION);
bNodeSocket *out_socket_float = static_cast<bNodeSocket *>(node->outputs.first);
bNodeSocket *out_socket_int32 = out_socket_float->next;
bNodeSocket *out_socket_vector = out_socket_int32->next;
bNodeSocket *out_socket_color4f = out_socket_vector->next;
bNodeSocket *out_socket_bool = out_socket_color4f->next;
bNodeSocket *out_socket_quat = out_socket_bool->next;
bke::nodeSetSocketAvailability(ntree, out_socket_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, out_socket_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, out_socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, out_socket_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, out_socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, out_socket_quat, data_type == CD_PROP_QUATERNION);
}
static void node_gather_link_searches(GatherLinkSearchOpParams &params)
@ -188,6 +194,8 @@ static GField get_input_attribute_field(GeoNodeExecParams &params, const eCustom
return params.extract_input<Field<bool>>("Value_Bool");
case CD_PROP_INT32:
return params.extract_input<Field<int>>("Value_Int");
case CD_PROP_QUATERNION:
return params.extract_input<Field<math::Quaternion>>("Value_Rotation");
default:
BLI_assert_unreachable();
}
@ -217,6 +225,10 @@ static void output_attribute_field(GeoNodeExecParams &params, GField field)
params.set_output("Value_Int", Field<int>(field));
break;
}
case CD_PROP_QUATERNION: {
params.set_output("Value_Rotation", Field<math::Quaternion>(field));
break;
}
default:
break;
}

View File

@ -64,6 +64,11 @@ static std::unique_ptr<SocketDeclaration> socket_declaration_for_simulation_item
decl->input_field_type = InputSocketFieldType::IsSupported;
decl->output_field_dependency = OutputFieldDependency::ForPartiallyDependentField({index});
break;
case SOCK_ROTATION:
decl = std::make_unique<decl::Rotation>();
decl->input_field_type = InputSocketFieldType::IsSupported;
decl->output_field_dependency = OutputFieldDependency::ForPartiallyDependentField({index});
break;
case SOCK_INT:
decl = std::make_unique<decl::Int>();
decl->input_field_type = InputSocketFieldType::IsSupported;
@ -214,6 +219,7 @@ void simulation_state_to_values(const Span<NodeSimulationItem> node_simulation_i
case SOCK_VECTOR:
case SOCK_INT:
case SOCK_BOOLEAN:
case SOCK_ROTATION:
case SOCK_RGBA: {
const fn::ValueOrFieldCPPType &value_or_field_type =
*fn::ValueOrFieldCPPType::get_from_self(cpp_type);
@ -311,6 +317,7 @@ void values_to_simulation_state(const Span<NodeSimulationItem> node_simulation_i
case SOCK_VECTOR:
case SOCK_INT:
case SOCK_BOOLEAN:
case SOCK_ROTATION:
case SOCK_RGBA: {
const CPPType &type = get_simulation_item_cpp_type(item);
const fn::ValueOrFieldCPPType &value_or_field_type =
@ -616,6 +623,7 @@ static void mix_simulation_state(const NodeSimulationItem &item,
case SOCK_VECTOR:
case SOCK_INT:
case SOCK_BOOLEAN:
case SOCK_ROTATION:
case SOCK_RGBA: {
const CPPType &type = get_simulation_item_cpp_type(item);
const fn::ValueOrFieldCPPType &value_or_field_type = *fn::ValueOrFieldCPPType::get_from_self(
@ -1005,6 +1013,7 @@ bool NOD_geometry_simulation_output_item_socket_type_supported(
SOCK_VECTOR,
SOCK_RGBA,
SOCK_BOOLEAN,
SOCK_ROTATION,
SOCK_INT,
SOCK_STRING,
SOCK_GEOMETRY);

View File

@ -29,6 +29,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Color>("Value", "Value_Color").field_on_all();
b.add_input<decl::Bool>("Value", "Value_Bool").field_on_all();
b.add_input<decl::Int>("Value", "Value_Int").field_on_all();
b.add_input<decl::Rotation>("Value", "Value_Rotation").field_on_all();
b.add_output<decl::Geometry>("Geometry").propagate_all();
}
@ -61,6 +62,7 @@ static void node_update(bNodeTree *ntree, bNode *node)
bNodeSocket *socket_color4f = socket_float->next;
bNodeSocket *socket_boolean = socket_color4f->next;
bNodeSocket *socket_int32 = socket_boolean->next;
bNodeSocket *socket_quat = socket_int32->next;
bke::nodeSetSocketAvailability(
ntree, socket_vector, ELEM(data_type, CD_PROP_FLOAT2, CD_PROP_FLOAT3));
@ -69,6 +71,7 @@ static void node_update(bNodeTree *ntree, bNode *node)
ntree, socket_color4f, ELEM(data_type, CD_PROP_COLOR, CD_PROP_BYTE_COLOR));
bke::nodeSetSocketAvailability(ntree, socket_boolean, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, socket_quat, data_type == CD_PROP_QUATERNION);
}
static void node_gather_link_searches(GatherLinkSearchOpParams &params)
@ -142,6 +145,9 @@ static void node_geo_exec(GeoNodeExecParams params)
case CD_PROP_INT32:
field = params.get_input<Field<int>>("Value_Int");
break;
case CD_PROP_QUATERNION:
field = params.get_input<Field<math::Quaternion>>("Value_Rotation");
break;
default:
break;
}

View File

@ -50,6 +50,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Material>("True", "True_010");
b.add_input<decl::Image>("False", "False_011");
b.add_input<decl::Image>("True", "True_011");
b.add_input<decl::Rotation>("False", "False_012").supports_field();
b.add_input<decl::Rotation>("True", "True_012").supports_field();
b.add_output<decl::Float>("Output").dependent_field().reference_pass_all();
b.add_output<decl::Int>("Output", "Output_001").dependent_field().reference_pass_all();
@ -63,6 +65,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_output<decl::Texture>("Output", "Output_009");
b.add_output<decl::Material>("Output", "Output_010");
b.add_output<decl::Image>("Output", "Output_011");
b.add_output<decl::Rotation>("Output", "Output_012").propagate_all().reference_pass_all();
}
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
@ -84,8 +87,14 @@ static void node_update(bNodeTree *ntree, bNode *node)
bNodeSocket *field_switch = static_cast<bNodeSocket *>(node->inputs.first);
bNodeSocket *non_field_switch = static_cast<bNodeSocket *>(field_switch->next);
const bool fields_type = ELEM(
storage.input_type, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_VECTOR, SOCK_RGBA, SOCK_STRING);
const bool fields_type = ELEM(storage.input_type,
SOCK_FLOAT,
SOCK_INT,
SOCK_BOOLEAN,
SOCK_VECTOR,
SOCK_RGBA,
SOCK_STRING,
SOCK_ROTATION);
bke::nodeSetSocketAvailability(ntree, field_switch, fields_type);
bke::nodeSetSocketAvailability(ntree, non_field_switch, !fields_type);
@ -150,7 +159,8 @@ class LazyFunctionForSwitchNode : public LazyFunction {
{
const NodeSwitch &storage = node_storage(node);
const eNodeSocketDatatype data_type = eNodeSocketDatatype(storage.input_type);
can_be_field_ = ELEM(data_type, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_VECTOR, SOCK_RGBA);
can_be_field_ = ELEM(
data_type, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_VECTOR, SOCK_RGBA, SOCK_ROTATION);
const bNodeSocketType *socket_type = nullptr;
for (const bNodeSocket *socket : node.output_sockets()) {
@ -236,20 +246,25 @@ class LazyFunctionForSwitchNode : public LazyFunction {
const MultiFunction &get_switch_multi_function(const CPPType &type) const
{
const MultiFunction *switch_multi_function = nullptr;
type.to_static_type_tag<float, int, bool, float3, ColorGeometry4f, std::string>(
[&](auto type_tag) {
using T = typename decltype(type_tag)::type;
if constexpr (std::is_void_v<T>) {
BLI_assert_unreachable();
}
else {
static auto switch_fn = mf::build::SI3_SO<bool, T, T, T>(
"Switch", [](const bool condition, const T &false_value, const T &true_value) {
return condition ? true_value : false_value;
});
switch_multi_function = &switch_fn;
}
});
type.to_static_type_tag<float,
int,
bool,
float3,
ColorGeometry4f,
std::string,
math::Quaternion>([&](auto type_tag) {
using T = typename decltype(type_tag)::type;
if constexpr (std::is_void_v<T>) {
BLI_assert_unreachable();
}
else {
static auto switch_fn = mf::build::SI3_SO<bool, T, T, T>(
"Switch", [](const bool condition, const T &false_value, const T &true_value) {
return condition ? true_value : false_value;
});
switch_multi_function = &switch_fn;
}
});
BLI_assert(switch_multi_function != nullptr);
return *switch_multi_function;
}

View File

@ -26,6 +26,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Color>("Value", "Value_002").field_on_all().hide_value();
b.add_input<decl::Int>("Value", "Value_003").field_on_all().hide_value();
b.add_input<decl::Bool>("Value", "Value_004").field_on_all().hide_value();
b.add_input<decl::Rotation>("Value", "Value_005").field_on_all().hide_value();
}
static void node_init(bNodeTree * /*tree*/, bNode *node)
@ -60,6 +61,8 @@ static eNodeSocketDatatype custom_data_type_to_socket_type(const eCustomDataType
return SOCK_BOOLEAN;
case CD_PROP_COLOR:
return SOCK_RGBA;
case CD_PROP_QUATERNION:
return SOCK_ROTATION;
default:
BLI_assert_unreachable();
return SOCK_FLOAT;
@ -103,8 +106,14 @@ static void node_gather_link_searches(GatherLinkSearchOpParams &params)
set_active_fn(params, node);
});
}
if (type &&
ELEM(type, CD_PROP_FLOAT, CD_PROP_BOOL, CD_PROP_INT32, CD_PROP_FLOAT3, CD_PROP_COLOR)) {
if (type && ELEM(type,
CD_PROP_FLOAT,
CD_PROP_BOOL,
CD_PROP_INT32,
CD_PROP_FLOAT3,
CD_PROP_COLOR,
CD_PROP_QUATERNION))
{
params.add_item(IFACE_("Value"), [type, set_active_fn](LinkSearchOpParams &params) {
bNode &node = params.add_node("GeometryNodeViewer");
node_storage(node).data_type = *type;

View File

@ -4,6 +4,8 @@
* \ingroup nodes
*/
#include "BLI_math_quaternion.hh"
#include "NOD_geometry_nodes_execute.hh"
#include "NOD_geometry_nodes_lazy_function.hh"
#include "NOD_node_declaration.hh"
@ -115,6 +117,9 @@ std::unique_ptr<IDProperty, bke::idprop::IDPropertyDeleter> id_property_create_f
ui_data->default_value = value->value != 0;
return property;
}
case SOCK_ROTATION: {
return nullptr;
}
case SOCK_STRING: {
const bNodeSocketValueString *value = static_cast<const bNodeSocketValueString *>(
socket.default_value);
@ -166,6 +171,7 @@ bool id_property_type_matches_socket(const bNodeSocket &socket, const IDProperty
case SOCK_VECTOR:
return property.type == IDP_ARRAY && property.subtype == IDP_FLOAT && property.len == 3;
case SOCK_RGBA:
case SOCK_ROTATION:
return property.type == IDP_ARRAY && property.subtype == IDP_FLOAT && property.len == 4;
case SOCK_BOOLEAN:
return property.type == IDP_BOOLEAN;
@ -218,6 +224,12 @@ static void init_socket_cpp_value_from_property(const IDProperty &property,
new (r_value) fn::ValueOrField<bool>(value);
break;
}
case SOCK_ROTATION: {
const math::Quaternion value = math::Quaternion(
float4(static_cast<const float *>(IDP_Array(&property))));
new (r_value) fn::ValueOrField<math::Quaternion>(value);
break;
}
case SOCK_STRING: {
std::string value = IDP_String(&property);
new (r_value) fn::ValueOrField<std::string>(std::move(value));