Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/geometry_set_instances.cc
| Show First 20 Lines • Show All 131 Lines • ▼ Show 20 Lines | static void geometry_set_collect_recursive(const GeometrySet &geometry_set, | ||||
| r_sets.append({geometry_set, {transform}}); | r_sets.append({geometry_set, {transform}}); | ||||
| if (geometry_set.has_instances()) { | if (geometry_set.has_instances()) { | ||||
| const InstancesComponent &instances_component = | const InstancesComponent &instances_component = | ||||
| *geometry_set.get_component_for_read<InstancesComponent>(); | *geometry_set.get_component_for_read<InstancesComponent>(); | ||||
| Span<float4x4> transforms = instances_component.transforms(); | Span<float4x4> transforms = instances_component.transforms(); | ||||
| Span<InstancedData> instances = instances_component.instanced_data(); | Span<InstancedData> instances = instances_component.instanced_data(); | ||||
| for (const int i : instances.index_range()) { | for (const int i : iter_indices(instances)) { | ||||
| const InstancedData &data = instances[i]; | const InstancedData &data = instances[i]; | ||||
| const float4x4 instance_transform = transform * transforms[i]; | const float4x4 instance_transform = transform * transforms[i]; | ||||
| if (data.type == INSTANCE_DATA_TYPE_OBJECT) { | if (data.type == INSTANCE_DATA_TYPE_OBJECT) { | ||||
| BLI_assert(data.data.object != nullptr); | BLI_assert(data.data.object != nullptr); | ||||
| const Object &object = *data.data.object; | const Object &object = *data.data.object; | ||||
| geometry_set_collect_recursive_object(object, instance_transform, r_sets); | geometry_set_collect_recursive_object(object, instance_transform, r_sets); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 320 Lines • ▼ Show 20 Lines | for (const GeometryInstanceGroup &set_group : set_groups) { | ||||
| continue; /* Domain size is 0, so no need to increment the offset. */ | continue; /* Domain size is 0, so no need to increment the offset. */ | ||||
| } | } | ||||
| GVArrayPtr source_attribute = component.attribute_try_get_for_read( | GVArrayPtr source_attribute = component.attribute_try_get_for_read( | ||||
| name, domain_output, data_type_output); | name, domain_output, data_type_output); | ||||
| if (source_attribute) { | if (source_attribute) { | ||||
| fn::GVArray_GSpan src_span{*source_attribute}; | fn::GVArray_GSpan src_span{*source_attribute}; | ||||
| const void *src_buffer = src_span.data(); | const void *src_buffer = src_span.data(); | ||||
| for (const int UNUSED(i) : set_group.transforms.index_range()) { | for (const int UNUSED(i) : iter_indices(set_group.transforms)) { | ||||
| void *dst_buffer = dst_span[offset]; | void *dst_buffer = dst_span[offset]; | ||||
| cpp_type->copy_to_initialized_n(src_buffer, dst_buffer, domain_size); | cpp_type->copy_to_initialized_n(src_buffer, dst_buffer, domain_size); | ||||
| offset += domain_size; | offset += domain_size; | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| offset += domain_size * set_group.transforms.size(); | offset += domain_size * set_group.transforms.size(); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 110 Lines • Show Last 20 Lines | |||||