Merge branch 'blender-v5.0-release'

This commit is contained in:
Hans Goudey
2025-10-14 10:58:36 -04:00
7 changed files with 64 additions and 21 deletions

View File

@@ -422,7 +422,7 @@ void mesh_calc_edges(Mesh &mesh,
array_utils::scatter<int2>(
edge_map.as_span().cast<int2>(),
edge_map_to_result_index.as_span().slice(edge_offsets[task_index]),
edge_verts.slice(edge_offsets[task_index]));
edge_verts);
});
calc_edges::update_edge_indices_in_face_loops(

View File

@@ -137,7 +137,7 @@ static bool node_insert_link(bke::NodeInsertLinkParams &params)
static void node_register()
{
static blender::bke::bNodeType ntype;
common_node_type_base(&ntype, "NodeClosureInput", NODE_CLOSURE_INPUT);
sh_geo_node_type_base(&ntype, "NodeClosureInput", NODE_CLOSURE_INPUT);
ntype.ui_name = "Closure Input";
ntype.nclass = NODE_CLASS_INTERFACE;
ntype.declare = node_declare;
@@ -271,7 +271,7 @@ static void node_blend_read(bNodeTree & /*tree*/, bNode &node, BlendDataReader &
static void node_register()
{
static blender::bke::bNodeType ntype;
common_node_type_base(&ntype, "NodeClosureOutput", NODE_CLOSURE_OUTPUT);
sh_geo_node_type_base(&ntype, "NodeClosureOutput", NODE_CLOSURE_OUTPUT);
ntype.ui_name = "Closure Output";
ntype.nclass = NODE_CLASS_INTERFACE;
ntype.declare = node_declare;

View File

@@ -192,7 +192,7 @@ static void node_register()
{
static blender::bke::bNodeType ntype;
common_node_type_base(&ntype, "NodeCombineBundle", NODE_COMBINE_BUNDLE);
sh_geo_node_type_base(&ntype, "NodeCombineBundle", NODE_COMBINE_BUNDLE);
ntype.ui_name = "Combine Bundle";
ntype.ui_description = "Combine multiple socket values into one.";
ntype.nclass = NODE_CLASS_CONVERTER;

View File

@@ -220,7 +220,7 @@ static void node_register()
{
static blender::bke::bNodeType ntype;
common_node_type_base(&ntype, "NodeEvaluateClosure", NODE_EVALUATE_CLOSURE);
sh_geo_node_type_base(&ntype, "NodeEvaluateClosure", NODE_EVALUATE_CLOSURE);
ntype.ui_name = "Evaluate Closure";
ntype.ui_description = "Execute a given closure";
ntype.nclass = NODE_CLASS_CONVERTER;

View File

@@ -43,6 +43,45 @@ static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
layout->prop(ptr, "data_type", UI_ITEM_NONE, "", ICON_NONE);
}
#ifdef WITH_OPENVDB
static std::optional<SocketValueVariant> try_get_named_grid(
GeoNodeExecParams &params,
Volume &volume,
const StringRef grid_name,
const bool remove_grid,
const eNodeSocketDatatype desired_socket_type)
{
const bke::VolumeGridData *grid = BKE_volume_grid_find(&volume, grid_name);
if (!grid) {
return std::nullopt;
}
const VolumeGridType stored_grid_type = grid->grid_type();
const std::optional<eNodeSocketDatatype> current_socket_type = bke::grid_type_to_socket_type(
stored_grid_type);
if (!current_socket_type) {
return std::nullopt;
}
/* Increment user count before removing from volume. */
grid->add_user();
if (remove_grid) {
BKE_volume_grid_remove(&volume, grid);
}
SocketValueVariant value_variant = SocketValueVariant::From(bke::GVolumeGrid(grid));
if (current_socket_type != desired_socket_type) {
std::optional<SocketValueVariant> converted_value = implicitly_convert_socket_value(
*bke::node_socket_type_find_static(*current_socket_type),
value_variant,
*bke::node_socket_type_find_static(desired_socket_type));
if (!converted_value) {
return std::nullopt;
}
params.error_message_add(NodeWarningType::Info, "Implicit grid type conversion");
value_variant = std::move(*converted_value);
}
return value_variant;
}
#endif
static void node_geo_exec(GeoNodeExecParams params)
{
#ifdef WITH_OPENVDB
@@ -50,25 +89,29 @@ static void node_geo_exec(GeoNodeExecParams params)
GeometrySet geometry_set = params.extract_input<GeometrySet>("Volume");
const std::string grid_name = params.extract_input<std::string>("Name");
const bool remove_grid = params.extract_input<bool>("Remove");
const VolumeGridType grid_type = *bke::socket_type_to_grid_type(
eNodeSocketDatatype(node.custom1));
const eNodeSocketDatatype socket_type = eNodeSocketDatatype(node.custom1);
if (Volume *volume = geometry_set.get_volume_for_write()) {
if (const bke::VolumeGridData *grid = BKE_volume_grid_find(volume, grid_name)) {
/* Increment user count before removing from volume. */
grid->add_user();
if (remove_grid) {
BKE_volume_grid_remove(volume, grid);
}
params.set_output("Grid", bke::GVolumeGrid(grid));
params.set_output("Volume", geometry_set);
if (std::optional<SocketValueVariant> value_variant = try_get_named_grid(
params, *volume, grid_name, remove_grid, socket_type))
{
params.set_output("Grid", std::move(*value_variant));
params.set_output("Volume", std::move(geometry_set));
return;
}
}
if (!grid_name.empty()) {
params.error_message_add(NodeWarningType::Warning,
"No supported grid found with the given name");
}
if (std::optional<VolumeGridType> grid_type = bke::socket_type_to_grid_type(socket_type)) {
params.set_output("Grid", bke::GVolumeGrid(*grid_type));
params.set_output("Volume", std::move(geometry_set));
return;
}
params.set_output("Volume", std::move(geometry_set));
params.set_default_remaining_outputs();
params.set_output("Grid", bke::GVolumeGrid(grid_type));
params.set_output("Volume", geometry_set);
#else
node_geo_exec_with_missing_openvdb(params);
#endif

View File

@@ -145,7 +145,7 @@ static int node_shader_fn(GPUMaterial *mat,
static void node_register()
{
static blender::bke::bNodeType ntype;
common_node_type_base(&ntype, "GeometryNodeRepeatInput", GEO_NODE_REPEAT_INPUT);
sh_geo_node_type_base(&ntype, "GeometryNodeRepeatInput", GEO_NODE_REPEAT_INPUT);
ntype.ui_name = "Repeat Input";
ntype.enum_name_legacy = "REPEAT_INPUT";
ntype.nclass = NODE_CLASS_INTERFACE;
@@ -305,7 +305,7 @@ static int node_shader_fn(GPUMaterial *mat,
static void node_register()
{
static blender::bke::bNodeType ntype;
common_node_type_base(&ntype, "GeometryNodeRepeatOutput", GEO_NODE_REPEAT_OUTPUT);
sh_geo_node_type_base(&ntype, "GeometryNodeRepeatOutput", GEO_NODE_REPEAT_OUTPUT);
ntype.ui_name = "Repeat Output";
ntype.enum_name_legacy = "REPEAT_OUTPUT";
ntype.nclass = NODE_CLASS_INTERFACE;

View File

@@ -238,7 +238,7 @@ static void node_register()
{
static blender::bke::bNodeType ntype;
common_node_type_base(&ntype, "NodeSeparateBundle", NODE_SEPARATE_BUNDLE);
sh_geo_node_type_base(&ntype, "NodeSeparateBundle", NODE_SEPARATE_BUNDLE);
ntype.ui_name = "Separate Bundle";
ntype.ui_description = "Split a bundle into multiple sockets.";
ntype.nclass = NODE_CLASS_CONVERTER;