Geometry Nodes: Add selection and depth options to realize instances #104832
|
@ -10,7 +10,9 @@ namespace blender::geometry {
|
||||||
* Join all src_components and add the resulting component to result.
|
* Join all src_components and add the resulting component to result.
|
||||||
*/
|
*/
|
||||||
template<typename Component>
|
template<typename Component>
|
||||||
void GEO_join_component_type(Span<const Component *> src_components, GeometrySet &result);
|
void GEO_join_component_type(Span<const Component *> src_components,
|
||||||
|
GeometrySet &result,
|
||||||
|
const bke::AnonymousAttributePropagationInfo &propagation_info);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Join InstancesComponents and apply corresponding transforms for each.
|
* Join InstancesComponents and apply corresponding transforms for each.
|
||||||
|
|
|
@ -26,7 +26,7 @@ static Map<AttributeIDRef, AttributeMetaData> get_final_attribute_info(
|
||||||
for (const GeometryComponent *component : components) {
|
for (const GeometryComponent *component : components) {
|
||||||
component->attributes()->for_all(
|
component->attributes()->for_all(
|
||||||
[&](const bke::AttributeIDRef &attribute_id, const AttributeMetaData &meta_data) {
|
[&](const bke::AttributeIDRef &attribute_id, const AttributeMetaData &meta_data) {
|
||||||
if (attribute_id.is_named() && ignored_attributes.contains(attribute_id.name())) {
|
if (ignored_attributes.contains(attribute_id.name())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (meta_data.data_type == CD_PROP_STRING) {
|
if (meta_data.data_type == CD_PROP_STRING) {
|
||||||
|
@ -146,7 +146,9 @@ static void join_components(Span<const VolumeComponent *> /*src_components*/,
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Component>
|
template<typename Component>
|
||||||
void GEO_join_component_type(Span<const Component *> src_components, GeometrySet &result)
|
void GEO_join_component_type(Span<const Component *> src_components,
|
||||||
|
GeometrySet &result,
|
||||||
|
const bke::AnonymousAttributePropagationInfo &propagation_info)
|
||||||
{
|
{
|
||||||
if (src_components.size() == 0) {
|
if (src_components.size() == 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -176,7 +178,8 @@ void GEO_join_component_type(Span<const Component *> src_components, GeometrySet
|
||||||
{true,
|
{true,
|
||||||
false,
|
false,
|
||||||
IndexMask(instances->instances_num()),
|
IndexMask(instances->instances_num()),
|
||||||
VArray<int>::ForSingle(-1, instances->instances_num())});
|
VArray<int>::ForSingle(-1, instances->instances_num()),
|
||||||
|
propagation_info});
|
||||||
result.add(joined_components.get_component_for_write<Component>());
|
result.add(joined_components.get_component_for_write<Component>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -195,15 +198,23 @@ void GEO_join_transform_instance_components(Span<const InstancesComponent *> src
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Explicit template instantiation for all GeometryComponent subclasses. */
|
/** Explicit template instantiation for all GeometryComponent subclasses. */
|
||||||
template void GEO_join_component_type<MeshComponent>(Span<const MeshComponent *>, GeometrySet &);
|
template void GEO_join_component_type<MeshComponent>(
|
||||||
template void GEO_join_component_type<PointCloudComponent>(Span<const PointCloudComponent *>,
|
Span<const MeshComponent *>, GeometrySet &, const bke::AnonymousAttributePropagationInfo &);
|
||||||
GeometrySet &);
|
template void GEO_join_component_type<PointCloudComponent>(
|
||||||
template void GEO_join_component_type<InstancesComponent>(Span<const InstancesComponent *>,
|
Span<const PointCloudComponent *>,
|
||||||
GeometrySet &);
|
GeometrySet &,
|
||||||
template void GEO_join_component_type<VolumeComponent>(Span<const VolumeComponent *>,
|
const bke::AnonymousAttributePropagationInfo &);
|
||||||
GeometrySet &);
|
template void GEO_join_component_type<InstancesComponent>(
|
||||||
template void GEO_join_component_type<CurveComponent>(Span<const CurveComponent *>, GeometrySet &);
|
Span<const InstancesComponent *>,
|
||||||
|
GeometrySet &,
|
||||||
|
const bke::AnonymousAttributePropagationInfo &);
|
||||||
|
template void GEO_join_component_type<VolumeComponent>(
|
||||||
|
Span<const VolumeComponent *>, GeometrySet &, const bke::AnonymousAttributePropagationInfo &);
|
||||||
|
template void GEO_join_component_type<CurveComponent>(
|
||||||
|
Span<const CurveComponent *>, GeometrySet &, const bke::AnonymousAttributePropagationInfo &);
|
||||||
template void GEO_join_component_type<GeometryComponentEditData>(
|
template void GEO_join_component_type<GeometryComponentEditData>(
|
||||||
Span<const GeometryComponentEditData *>, GeometrySet &);
|
Span<const GeometryComponentEditData *>,
|
||||||
|
GeometrySet &,
|
||||||
|
const bke::AnonymousAttributePropagationInfo &);
|
||||||
|
|
||||||
} // namespace blender::geometry
|
} // namespace blender::geometry
|
||||||
|
|
|
@ -1495,9 +1495,11 @@ static void remove_id_attribute_from_instances(GeometrySet &geometry_set)
|
||||||
|
|
||||||
/** Propagate instances from the old geometry set to the new geometry set if they are not realized.
|
/** Propagate instances from the old geometry set to the new geometry set if they are not realized.
|
||||||
*/
|
*/
|
||||||
static void propagate_instances_to_keep(const GeometrySet &geometry_set,
|
static void propagate_instances_to_keep(
|
||||||
IndexMask selection,
|
const GeometrySet &geometry_set,
|
||||||
GeometrySet &new_geometry_set)
|
IndexMask selection,
|
||||||
|
GeometrySet &new_geometry_set,
|
||||||
|
const bke::AnonymousAttributePropagationInfo &propagation_info)
|
||||||
{
|
{
|
||||||
const Instances *instances = geometry_set.get_instances_for_read();
|
const Instances *instances = geometry_set.get_instances_for_read();
|
||||||
|
|
||||||
ab_stanton marked this conversation as resolved
|
|||||||
|
@ -1513,7 +1515,7 @@ static void propagate_instances_to_keep(const GeometrySet &geometry_set,
|
||||||
new_geometry_set.get_component_for_write<InstancesComponent>();
|
new_geometry_set.get_component_for_write<InstancesComponent>();
|
||||||
|
|
||||||
std::unique_ptr<Instances> new_instances = std::make_unique<Instances>(*instances);
|
std::unique_ptr<Instances> new_instances = std::make_unique<Instances>(*instances);
|
||||||
new_instances->remove(inverse_selection);
|
new_instances->remove(inverse_selection, propagation_info);
|
||||||
new_instances_components.replace(new_instances.release(), GeometryOwnershipType::Owned);
|
new_instances_components.replace(new_instances.release(), GeometryOwnershipType::Owned);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1531,7 +1533,8 @@ GeometrySet realize_instances(GeometrySet geometry_set, const RealizeInstancesOp
|
||||||
}
|
}
|
||||||
|
|
||||||
GeometrySet temp_geometry_set;
|
GeometrySet temp_geometry_set;
|
||||||
propagate_instances_to_keep(geometry_set, options.selection, temp_geometry_set);
|
propagate_instances_to_keep(
|
||||||
|
geometry_set, options.selection, temp_geometry_set, options.propagation_info);
|
||||||
|
|
||||||
if (options.keep_original_ids) {
|
if (options.keep_original_ids) {
|
||||||
remove_id_attribute_from_instances(geometry_set);
|
remove_id_attribute_from_instances(geometry_set);
|
||||||
|
|
Loading…
Reference in New Issue
Add a null check or use a reference here with
*