Blender V5.0
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 curves.update_curve_types();
48
49 /* Attribute storing original indices to test point remapping. */
50 SpanAttributeWriter<int> test_indices_writer =
51 curves.attributes_for_write().lookup_or_add_for_write_span<int>(
53 array_utils::fill_index_range(test_indices_writer.span);
54 test_indices_writer.finish();
55}
56
57/* Regression test for builtin curve attributes:
58 * The attribute can be added with arbitrary type/domain on instances,
59 * but is built-in and restricted on curves, which will not allow writing it
60 * to the realized curves geometry. #142163 */
61TEST_F(RealizeInstancesTest, InstanceAttributeToBuiltinCurvesAttribute)
62{
63 Curves *curves_id = BKE_id_new_nomain<Curves>("TestCurves");
64 create_test_curves(curves_id->geometry.wrap(), {0, 3});
65 bke::GeometrySet curves_geometry = GeometrySet::from_curves(curves_id);
66
67 Instances *instances = new Instances();
68 const int handle = instances->add_reference(bke::InstanceReference{curves_geometry});
69 /* The issue only occurs with 2 or more instances. In case of a single instance the code takes a
70 * special path that does not run cause this problem. */
71 instances->add_instance(handle, float4x4::identity());
72 instances->add_instance(handle, float4x4::identity());
73 /* This attribute will be converted to the point domain, where it is invalid on curves. */
74 instances->attributes_for_write().add<float>(
76 bke::GeometrySet instances_geometry = GeometrySet::from_instances(instances);
77
79 options.realize_instance_attributes = true;
80 GeometrySet realized_geometry_set =
81 geometry::realize_instances(instances_geometry, options).geometry;
82}
83
84} // namespace blender::geometry::tests
Low-level operations for curves.
void BKE_idtype_init()
Definition idtype.cc:121
void * BKE_id_new_nomain(short type, const char *name)
Definition lib_id.cc:1519
#define BLI_assert(a)
Definition BLI_assert.h:46
void CLG_exit()
Definition clog.cc:880
void CLG_init()
Definition clog.cc:873
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:261
void add_instance(int instance_handle, const float4x4 &transform)
Definition instances.cc:204
bke::MutableAttributeAccessor attributes_for_write()
Definition instances.cc:69
bool add(const StringRef attribute_id, const AttrDomain domain, const AttrType 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)
RealizeInstancesResult 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)