Blender V4.5
GEO_realize_instances_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "BLI_array_utils.hh"
6
7#include "BKE_curves.hh"
8#include "BKE_geometry_set.hh"
9#include "BKE_idtype.hh"
10#include "BKE_instances.hh"
11#include "BKE_lib_id.hh"
12
13#include "DNA_curves_types.h"
14
16
17#include "CLG_log.h"
18
19#include "testing/testing.h"
20
21using namespace blender::bke;
22
24
25class RealizeInstancesTest : public testing::Test {
26 public:
27 static void SetUpTestSuite()
28 {
29 CLG_init();
31 }
32
33 static void TearDownTestSuite()
34 {
35 CLG_exit();
36 }
37};
38
40{
41 BLI_assert(!offsets.is_empty());
42 const int curves_num = offsets.size() - 1;
43 const int points_num = offsets.last();
44
45 curves.resize(points_num, curves_num);
46 curves.offsets_for_write().copy_from(offsets);
47
48 /* Attribute storing original indices to test point remapping. */
49 SpanAttributeWriter<int> test_indices_writer =
50 curves.attributes_for_write().lookup_or_add_for_write_span<int>(
52 array_utils::fill_index_range(test_indices_writer.span);
53 test_indices_writer.finish();
54}
55
56/* Regression test for builtin curve attributes:
57 * The attribute can be added with arbitrary type/domain on instances,
58 * but is built-in and restricted on curves, which will not allow writing it
59 * to the realized curves geometry. #142163 */
60TEST_F(RealizeInstancesTest, InstanceAttributeToBuiltinCurvesAttribute)
61{
62 Curves *curves_id = BKE_id_new_nomain<Curves>("TestCurves");
63 create_test_curves(curves_id->geometry.wrap(), {0, 3});
64 bke::GeometrySet curves_geometry = GeometrySet::from_curves(curves_id);
65
66 Instances *instances = new Instances();
67 const int handle = instances->add_reference(bke::InstanceReference{curves_geometry});
68 /* The issue only occurs with 2 or more instances. In case of a single instance the code takes a
69 * special path that does not run cause this problem. */
70 instances->add_instance(handle, float4x4::identity());
71 instances->add_instance(handle, float4x4::identity());
72 /* This attribute will be converted to the point domain, where it is invalid on curves. */
73 instances->attributes_for_write().add<float>(
75 bke::GeometrySet instances_geometry = GeometrySet::from_instances(instances);
76
78 options.realize_instance_attributes = true;
79 GeometrySet realized_geometry_set = geometry::realize_instances(instances_geometry, options);
80}
81
82} // namespace blender::geometry::tests
Low-level operations for curves.
void BKE_idtype_init()
Definition idtype.cc:122
void * BKE_id_new_nomain(short type, const char *name)
Definition lib_id.cc:1500
#define BLI_assert(a)
Definition BLI_assert.h:46
void CLG_exit(void)
Definition clog.c:704
void CLG_init(void)
Definition clog.c:697
constexpr int64_t size() const
Definition BLI_span.hh:252
constexpr const T & last(const int64_t n=0) const
Definition BLI_span.hh:325
constexpr bool is_empty() const
Definition BLI_span.hh:260
int add_reference(const InstanceReference &reference)
Definition instances.cc:271
void add_instance(int instance_handle, const float4x4 &transform)
Definition instances.cc:203
bke::MutableAttributeAccessor attributes_for_write()
Definition instances.cc:68
bool add(const StringRef attribute_id, const AttrDomain domain, const eCustomDataType data_type, const AttributeInit &initializer)
CCL_NAMESPACE_BEGIN struct Options options
void fill_index_range(MutableSpan< T > span, const T start=0)
TEST_F(RealizeInstancesTest, InstanceAttributeToBuiltinCurvesAttribute)
static bke::CurvesGeometry create_test_curves(Span< int > offsets, Span< bool > cyclic)
bke::GeometrySet realize_instances(bke::GeometrySet geometry_set, const RealizeInstancesOptions &options)
CurvesGeometry geometry
static GeometrySet from_instances(Instances *instances, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
static GeometrySet from_curves(Curves *curves, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)