Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2021-09-27 18:35:26 +0300
committerJacques Lucke <jacques@blender.org>2021-09-27 18:35:45 +0300
commit0559971ab3772e3b5efb0fcad396735ea4ac22fe (patch)
treee373f64625d71d643e03f28a1383ee7c9b276d42 /source/blender/blenkernel/intern/geometry_component_instances.cc
parent2189dfd6e25a7bb6b734116619d87bc2d2a535ff (diff)
Geometry Nodes: add utility to process all instances separately
This adds a new `GeometrySet::modify_geometry_sets` method that can be used to update each sub-geometry-set separately without making any instances real. Differential Revision: https://developer.blender.org/D12650
Diffstat (limited to 'source/blender/blenkernel/intern/geometry_component_instances.cc')
-rw-r--r--source/blender/blenkernel/intern/geometry_component_instances.cc34
1 files changed, 2 insertions, 32 deletions
diff --git a/source/blender/blenkernel/intern/geometry_component_instances.cc b/source/blender/blenkernel/intern/geometry_component_instances.cc
index f1f60266545..4204d62e1a7 100644
--- a/source/blender/blenkernel/intern/geometry_component_instances.cc
+++ b/source/blender/blenkernel/intern/geometry_component_instances.cc
@@ -125,44 +125,14 @@ blender::Span<int> InstancesComponent::instance_ids() const
}
/**
- * 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
* changed. This is a function on the component rather than each reference to ensure `const`
* correctness for that reason.
*/
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 or that the
+ * reference can't be converted to a geometry set. */
BLI_assert(references_[reference_index].type() == InstanceReference::Type::GeometrySet);
/* The const cast is okay because the instance's hash in the set