Merge branch 'blender-v4.0-release'
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user