WIP: Geometry Nodes: Rotation type #107954
|
@ -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:
|
||||
|
|
|
@ -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 ¶ms)
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -97,6 +97,10 @@ static void node_gather_link_searches(GatherLinkSearchOpParams ¶ms)
|
|||
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;
|
||||
|
|
|
@ -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 ¶ms)
|
||||
|
@ -464,6 +470,8 @@ static GField get_input_attribute_field(GeoNodeExecParams ¶ms, 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 ¶ms, 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;
|
||||
}
|
||||
|
|
|
@ -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 ¶ms)
|
||||
|
@ -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 "";
|
||||
|
|
|
@ -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 ¶ms)
|
||||
|
@ -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 "";
|
||||
|
|
|
@ -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 ¶ms)
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 ¶ms)
|
||||
|
|
|
@ -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 ¶ms)
|
||||
|
|
|
@ -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 ¶ms)
|
||||
|
@ -162,6 +168,8 @@ static GField get_input_attribute_field(GeoNodeExecParams ¶ms, 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 ¶ms, 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;
|
||||
}
|
||||
|
|
|
@ -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 ¶ms)
|
||||
|
@ -188,6 +194,8 @@ static GField get_input_attribute_field(GeoNodeExecParams ¶ms, 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 ¶ms, 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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 ¶ms)
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 ¶ms)
|
|||
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 ¶ms) {
|
||||
bNode &node = params.add_node("GeometryNodeViewer");
|
||||
node_storage(node).data_type = *type;
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue