Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/geometry_component_instances.cc
| Show First 20 Lines • Show All 119 Lines • ▼ Show 20 Lines | blender::MutableSpan<int> InstancesComponent::instance_ids() | ||||
| return instance_ids_; | return instance_ids_; | ||||
| } | } | ||||
| blender::Span<int> InstancesComponent::instance_ids() const | blender::Span<int> InstancesComponent::instance_ids() const | ||||
| { | { | ||||
| return instance_ids_; | return instance_ids_; | ||||
| } | } | ||||
| /** | /** | ||||
| * If references have a collection or object type, convert them into geometry instances. This | |||||
| * will join geometry components from nested instances if necessary. After that, the geometry | |||||
| * sets can be edited. | |||||
| */ | |||||
| void InstancesComponent::ensure_geometry_instances() | |||||
| { | |||||
| VectorSet<InstanceReference> new_references; | |||||
| new_references.reserve(references_.size()); | |||||
| for (const InstanceReference &reference : references_) { | |||||
| if (reference.type() == InstanceReference::Type::Object) { | |||||
| GeometrySet geometry_set; | |||||
| InstancesComponent &instances = geometry_set.get_component_for_write<InstancesComponent>(); | |||||
| const int handle = instances.add_reference(reference.object()); | |||||
| instances.add_instance(handle, float4x4::identity()); | |||||
| new_references.add_new(geometry_set); | |||||
| } | |||||
| else if (reference.type() == InstanceReference::Type::Collection) { | |||||
| GeometrySet geometry_set; | |||||
| InstancesComponent &instances = geometry_set.get_component_for_write<InstancesComponent>(); | |||||
| const int handle = instances.add_reference(reference.collection()); | |||||
| instances.add_instance(handle, float4x4::identity()); | |||||
| new_references.add_new(geometry_set); | |||||
| } | |||||
| else { | |||||
| new_references.add_new(reference); | |||||
| } | |||||
| } | |||||
| references_ = std::move(new_references); | |||||
| } | |||||
| /** | |||||
| * With write access to the instances component, the data in the instanced geometry sets can be | * With write access to the instances component, the data in the instanced geometry sets can be | ||||
| * changed. This is a function on the component rather than each reference to ensure `const` | * changed. This is a function on the component rather than each reference to ensure `const` | ||||
| * correctness for that reason. | * correctness for that reason. | ||||
| */ | */ | ||||
| GeometrySet &InstancesComponent::geometry_set_from_reference(const int reference_index) | GeometrySet &InstancesComponent::geometry_set_from_reference(const int reference_index) | ||||
| { | { | ||||
| /* If this assert fails, it means #ensure_geometry_instances must be called first. */ | /* If this assert fails, it means #ensure_geometry_instances must be called first. */ | ||||
| BLI_assert(references_[reference_index].type() == InstanceReference::Type::GeometrySet); | BLI_assert(references_[reference_index].type() == InstanceReference::Type::GeometrySet); | ||||
| ▲ Show 20 Lines • Show All 281 Lines • Show Last 20 Lines | |||||