diff --git a/source/blender/blenkernel/BKE_instances.hh b/source/blender/blenkernel/BKE_instances.hh index 4e191eb8153..74d1ee5389c 100644 --- a/source/blender/blenkernel/BKE_instances.hh +++ b/source/blender/blenkernel/BKE_instances.hh @@ -103,7 +103,8 @@ class Instances { mutable blender::Array almost_unique_ids_; CustomDataAttributes attributes_; - + std::string default_color_attribute_; + std::string active_color_attribute_; public: Instances() = default; Instances(const Instances &other); @@ -176,6 +177,10 @@ class Instances { bool owns_direct_data() const; void ensure_owns_direct_data(); + + void set_color_attribute_metadata(const char *default_color_attribute, const char *active_color_attribute); + const std::string &default_color_attribute_name() const { return default_color_attribute_; } + const std::string &active_color_attribute_name() const { return active_color_attribute_; } }; /* -------------------------------------------------------------------- */ diff --git a/source/blender/blenkernel/intern/instances.cc b/source/blender/blenkernel/intern/instances.cc index 8384566f4dd..5c14f12f3ba 100644 --- a/source/blender/blenkernel/intern/instances.cc +++ b/source/blender/blenkernel/intern/instances.cc @@ -330,4 +330,14 @@ Span Instances::almost_unique_ids() const return almost_unique_ids_; } +void Instances::set_color_attribute_metadata(const char *default_color_attribute, const char *active_color_attribute) +{ + if (default_color_attribute) { + default_color_attribute_ = default_color_attribute; + } + if (active_color_attribute) { + active_color_attribute_ = active_color_attribute; + } +} + } // namespace blender::bke diff --git a/source/blender/geometry/intern/realize_instances.cc b/source/blender/geometry/intern/realize_instances.cc index c7e24edcbdc..e28eccbe490 100644 --- a/source/blender/geometry/intern/realize_instances.cc +++ b/source/blender/geometry/intern/realize_instances.cc @@ -206,6 +206,8 @@ struct AllMeshesInfo { /** True if we know that there are no loose edges in any of the input meshes. */ bool no_loose_edges_hint = false; bool no_loose_verts_hint = false; + char const *active_color_attribute = nullptr; + char const *default_color_attribute = nullptr; }; struct AllCurvesInfo { @@ -902,6 +904,13 @@ static AllMeshesInfo preprocess_meshes(const bke::GeometrySet &geometry_set, info.materials.add(material); } } + if (info.default_color_attribute == nullptr) { + info.default_color_attribute = mesh->default_color_attribute; + } + if (info.active_color_attribute == nullptr) { + info.active_color_attribute = mesh->active_color_attribute; + } + } info.create_material_index_attribute |= info.materials.size() > 1; info.realize_info.reinitialize(info.order.size()); @@ -1558,6 +1567,23 @@ bke::GeometrySet realize_instances(bke::GeometrySet geometry_set, new_geometry_set.add(*gather_info.r_tasks.first_edit_data); } + if (new_geometry_set.has_mesh()) + { + Mesh *dst_mesh = new_geometry_set.get_mesh_for_write(); + + /* Get the default color attribute from the instance domain, this + * corresponds to the default specified on the instancer. */ + const std::string &default_color_attribute = geometry_set.get_instances_for_read()->default_color_attribute_name(); + if (default_color_attribute.size()) { + BKE_id_attributes_default_color_set(&dst_mesh->id, default_color_attribute.c_str()); + } + + const std::string &active_color_attribute = geometry_set.get_instances_for_read()->active_color_attribute_name(); + if (active_color_attribute.size()) { + BKE_id_attributes_active_color_set(&dst_mesh->id, active_color_attribute.c_str()); + } + } + return new_geometry_set; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc b/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc index dba27756be0..07b6b06213b 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc @@ -15,6 +15,8 @@ #include "BKE_attribute_math.hh" #include "BKE_instances.hh" +#include "DNA_mesh_types.h" + #include "node_geometry_util.hh" namespace blender::nodes::node_geo_instance_on_points_cc { @@ -218,6 +220,10 @@ static void node_geo_exec(GeoNodeExecParams params) instance, params, attributes_to_propagate); + if (type == GeometryComponent::Type::Mesh) { + const Mesh *src_mesh = geometry_set.get_mesh_for_read(); + dst_instances->set_color_attribute_metadata(src_mesh->default_color_attribute, src_mesh->active_color_attribute); + } } } geometry_set.remove_geometry_during_modify();