Merge branch 'blender-v4.0-release'

This commit is contained in:
Hans Goudey
2023-11-01 11:12:04 +01:00
2 changed files with 83 additions and 19 deletions

View File

@@ -236,11 +236,22 @@ static Depsgraph *build_depsgraph_from_indirect_ids(Main &bmain,
Scene &scene,
ViewLayer &view_layer,
const bNodeTree &node_tree_orig,
const Span<const Object *> objects)
const Span<const Object *> objects,
const IDProperty &properties)
{
Set<ID *> ids_for_relations;
bool needs_own_transform_relation = false;
nodes::find_node_tree_dependencies(node_tree_orig, ids_for_relations, needs_own_transform_relation);
nodes::find_node_tree_dependencies(
node_tree_orig, ids_for_relations, needs_own_transform_relation);
IDP_foreach_property(
&const_cast<IDProperty &>(properties),
IDP_TYPE_FILTER_ID,
[](IDProperty *property, void *user_data) {
if (ID *id = IDP_Id(property)) {
static_cast<Set<ID *> *>(user_data)->add(id);
}
},
&ids_for_relations);
Vector<const ID *> ids;
ids.append(&node_tree_orig.id);
@@ -252,6 +263,24 @@ static Depsgraph *build_depsgraph_from_indirect_ids(Main &bmain,
return depsgraph;
}
static IDProperty *replace_inputs_evaluated_data_blocks(const IDProperty &op_properties,
const Depsgraph &depsgraph)
{
/* We just create a temporary copy, so don't adjust data-block user count. */
IDProperty *properties = IDP_CopyProperty_ex(&op_properties, LIB_ID_CREATE_NO_USER_REFCOUNT);
IDP_foreach_property(
properties,
IDP_TYPE_FILTER_ID,
[](IDProperty *property, void *user_data) {
if (ID *id = IDP_Id(property)) {
Depsgraph *depsgraph = static_cast<Depsgraph *>(user_data);
property->data.pointer = DEG_get_evaluated_id(depsgraph, id);
}
},
&const_cast<Depsgraph &>(depsgraph));
return properties;
}
static int run_node_group_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
@@ -277,7 +306,7 @@ static int run_node_group_exec(bContext *C, wmOperator *op)
BLI_SCOPED_DEFER([&]() { MEM_SAFE_FREE(objects); });
Depsgraph *depsgraph = build_depsgraph_from_indirect_ids(
*bmain, *scene, *view_layer, *node_tree_orig, {objects, objects_len});
*bmain, *scene, *view_layer, *node_tree_orig, {objects, objects_len}, *op->properties);
DEG_evaluate_on_refresh(depsgraph);
BLI_SCOPED_DEFER([&]() { DEG_graph_free(depsgraph); });
@@ -296,6 +325,9 @@ static int run_node_group_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
IDProperty *properties = replace_inputs_evaluated_data_blocks(*op->properties, *depsgraph);
BLI_SCOPED_DEFER([&]() { IDP_FreeProperty_ex(properties, false); });
OperatorComputeContext compute_context(op->type->idname);
for (Object *object : Span(objects, objects_len)) {
@@ -311,7 +343,7 @@ static int run_node_group_exec(bContext *C, wmOperator *op)
bke::GeometrySet new_geometry = nodes::execute_geometry_nodes_on_geometry(
*node_tree,
op->properties,
properties,
compute_context,
std::move(geometry_orig),
[&](nodes::GeoNodesLFUserData &user_data) {

View File

@@ -108,6 +108,34 @@ static void remove_non_propagated_attributes(
}
}
static void remove_unsupported_vert_data(Mesh &mesh)
{
CustomData_free_layers(&mesh.vert_data, CD_ORCO, mesh.totvert);
CustomData_free_layers(&mesh.vert_data, CD_SHAPEKEY, mesh.totvert);
CustomData_free_layers(&mesh.vert_data, CD_CLOTH_ORCO, mesh.totvert);
CustomData_free_layers(&mesh.vert_data, CD_MVERT_SKIN, mesh.totvert);
}
static void remove_unsupported_edge_data(Mesh &mesh)
{
CustomData_free_layers(&mesh.edge_data, CD_FREESTYLE_EDGE, mesh.totedge);
}
static void remove_unsupported_face_data(Mesh &mesh)
{
CustomData_free_layers(&mesh.face_data, CD_FREESTYLE_FACE, mesh.faces_num);
}
static void remove_unsupported_corner_data(Mesh &mesh)
{
CustomData_free_layers(&mesh.loop_data, CD_MDISPS, mesh.totloop);
CustomData_free_layers(&mesh.loop_data, CD_TANGENT, mesh.totloop);
CustomData_free_layers(&mesh.loop_data, CD_PAINT_MASK, mesh.totloop);
CustomData_free_layers(&mesh.loop_data, CD_MLOOPTANGENT, mesh.totloop);
CustomData_free_layers(&mesh.loop_data, CD_GRID_PAINT_MASK, mesh.totloop);
CustomData_free_layers(&mesh.loop_data, CD_CUSTOMLOOPNORMAL, mesh.totloop);
}
static void expand_mesh(Mesh &mesh,
const int vert_expand,
const int edge_expand,
@@ -116,10 +144,6 @@ static void expand_mesh(Mesh &mesh,
{
/* Remove types that aren't supported for interpolation in this node. */
if (vert_expand != 0) {
CustomData_free_layers(&mesh.vert_data, CD_ORCO, mesh.totvert);
CustomData_free_layers(&mesh.vert_data, CD_SHAPEKEY, mesh.totvert);
CustomData_free_layers(&mesh.vert_data, CD_CLOTH_ORCO, mesh.totvert);
CustomData_free_layers(&mesh.vert_data, CD_MVERT_SKIN, mesh.totvert);
const int old_verts_num = mesh.totvert;
mesh.totvert += vert_expand;
CustomData_realloc(&mesh.vert_data, old_verts_num, mesh.totvert);
@@ -129,13 +153,11 @@ static void expand_mesh(Mesh &mesh,
mesh.attributes_for_write().add(
".edge_verts", ATTR_DOMAIN_EDGE, CD_PROP_INT32_2D, bke::AttributeInitConstruct());
}
CustomData_free_layers(&mesh.edge_data, CD_FREESTYLE_EDGE, mesh.totedge);
const int old_edges_num = mesh.totedge;
mesh.totedge += edge_expand;
CustomData_realloc(&mesh.edge_data, old_edges_num, mesh.totedge);
}
if (face_expand != 0) {
CustomData_free_layers(&mesh.face_data, CD_FREESTYLE_FACE, mesh.faces_num);
const int old_faces_num = mesh.faces_num;
mesh.faces_num += face_expand;
CustomData_realloc(&mesh.face_data, old_faces_num, mesh.faces_num);
@@ -148,12 +170,6 @@ static void expand_mesh(Mesh &mesh,
mesh.face_offset_indices[mesh.faces_num] = mesh.totloop + loop_expand;
}
if (loop_expand != 0) {
CustomData_free_layers(&mesh.loop_data, CD_MDISPS, mesh.totloop);
CustomData_free_layers(&mesh.loop_data, CD_TANGENT, mesh.totloop);
CustomData_free_layers(&mesh.loop_data, CD_PAINT_MASK, mesh.totloop);
CustomData_free_layers(&mesh.loop_data, CD_MLOOPTANGENT, mesh.totloop);
CustomData_free_layers(&mesh.loop_data, CD_GRID_PAINT_MASK, mesh.totloop);
CustomData_free_layers(&mesh.loop_data, CD_CUSTOMLOOPNORMAL, mesh.totloop);
const int old_loops_num = mesh.totloop;
mesh.totloop += loop_expand;
CustomData_realloc(&mesh.loop_data, old_loops_num, mesh.totloop);
@@ -253,8 +269,14 @@ static void extrude_mesh_vertices(Mesh &mesh,
evaluator.set_selection(selection_field);
evaluator.evaluate();
const IndexMask selection = evaluator.get_evaluated_selection_as_mask();
if (selection.is_empty()) {
return;
}
remove_non_propagated_attributes(mesh.attributes_for_write(), propagation_info);
MutableAttributeAccessor attributes = mesh.attributes_for_write();
remove_non_propagated_attributes(attributes, propagation_info);
remove_unsupported_vert_data(mesh);
remove_unsupported_edge_data(mesh);
Set<AttributeIDRef> point_ids;
Set<AttributeIDRef> edge_ids;
@@ -291,8 +313,6 @@ static void extrude_mesh_vertices(Mesh &mesh,
new_edges[i_selection] = int2(index, new_vert_range[i_selection]);
});
MutableAttributeAccessor attributes = mesh.attributes_for_write();
/* New vertices copy the attribute values from their source vertex. */
for (const AttributeIDRef &id : point_ids) {
GSpanAttributeWriter attribute = attributes.lookup_for_write_span(id);
@@ -474,6 +494,10 @@ static void extrude_mesh_edges(Mesh &mesh,
const IndexRange new_loop_range{orig_loop_size, new_face_range.size() * 4};
remove_non_propagated_attributes(mesh.attributes_for_write(), propagation_info);
remove_unsupported_vert_data(mesh);
remove_unsupported_edge_data(mesh);
remove_unsupported_face_data(mesh);
remove_unsupported_corner_data(mesh);
expand_mesh(mesh,
new_vert_range.size(),
connect_edge_range.size() + duplicate_edge_range.size(),
@@ -830,6 +854,10 @@ static void extrude_mesh_face_regions(Mesh &mesh,
const IndexRange side_loop_range{orig_corner_verts.size(), side_face_range.size() * 4};
remove_non_propagated_attributes(mesh.attributes_for_write(), propagation_info);
remove_unsupported_vert_data(mesh);
remove_unsupported_edge_data(mesh);
remove_unsupported_face_data(mesh);
remove_unsupported_corner_data(mesh);
expand_mesh(mesh,
new_vert_range.size(),
connect_edge_range.size() + boundary_edge_range.size() + new_inner_edge_range.size(),
@@ -1154,6 +1182,10 @@ static void extrude_individual_mesh_faces(
const IndexRange side_loop_range{orig_loop_size, side_face_range.size() * 4};
remove_non_propagated_attributes(mesh.attributes_for_write(), propagation_info);
remove_unsupported_vert_data(mesh);
remove_unsupported_edge_data(mesh);
remove_unsupported_face_data(mesh);
remove_unsupported_corner_data(mesh);
expand_mesh(mesh,
new_vert_range.size(),
connect_edge_range.size() + duplicate_edge_range.size(),