Merge branch 'blender-v5.0-release'
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -137,7 +137,7 @@ static bool node_insert_link(bke::NodeInsertLinkParams ¶ms)
|
||||
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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ¶ms,
|
||||
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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user