Commit: a0519f26837cacd9736d63b1608d0ab79b4a219b
Author: Hans Goudey
Date: Sun Aug 28 12:20:15 2022 -0500
Branches: refactor-mesh-material-index-generic
https://developer.blender.org/rBa0519f26837cacd9736d63b1608d0ab79b4a219b
Fix empty material mapping in the realize instances node
===================================================================
M source/blender/blenlib/BLI_vector_set.hh
M source/blender/geometry/intern/realize_instances.cc
===================================================================
diff --git a/source/blender/blenlib/BLI_vector_set.hh
b/source/blender/blenlib/BLI_vector_set.hh
index b0a3696f245..1a42e776d3d 100644
--- a/source/blender/blenlib/BLI_vector_set.hh
+++ b/source/blender/blenlib/BLI_vector_set.hh
@@ -358,7 +358,7 @@ class VectorSet {
}
/**
- * Return the location of the key in the vector. It is assumed, that the key
is in the vector
+ * Return the location of the key in the vector. It is assumed that the key
is in the vector
* set. If this is not necessarily the case, use `index_of_try`.
*/
int64_t index_of(const Key &key) const
diff --git a/source/blender/geometry/intern/realize_instances.cc
b/source/blender/geometry/intern/realize_instances.cc
index 368b056b219..25ff705385c 100644
--- a/source/blender/geometry/intern/realize_instances.cc
+++ b/source/blender/geometry/intern/realize_instances.cc
@@ -843,9 +843,15 @@ static AllMeshesInfo preprocess_meshes(const GeometrySet
&geometry_set,
gather_meshes_to_realize(geometry_set, info.order);
for (const Mesh *mesh : info.order) {
- for (const int slot_index : IndexRange(mesh->totcol)) {
- Material *material = mesh->mat[slot_index];
- info.materials.add(material);
+ if (mesh->totcol == 0) {
+ /* Add an empty material slot for the default material. */
+ info.materials.add(nullptr);
+ }
+ else {
+ for (const int slot_index : IndexRange(mesh->totcol)) {
+ Material *material = mesh->mat[slot_index];
+ info.materials.add(material);
+ }
}
}
info.realize_info.reinitialize(info.order.size());
@@ -855,11 +861,16 @@ static AllMeshesInfo preprocess_meshes(const GeometrySet
&geometry_set,
mesh_info.mesh = mesh;
/* Create material index mapping. */
- mesh_info.material_index_map.reinitialize(mesh->totcol);
- for (const int old_slot_index : IndexRange(mesh->totcol)) {
- Material *material = mesh->mat[old_slot_index];
- const int new_slot_index = info.materials.index_of(material);
- mesh_info.material_index_map[old_slot_index] = new_slot_index;
+ mesh_info.material_index_map.reinitialize(std::max<int>(mesh->totcol, 1));
+ if (mesh->totcol == 0) {
+ mesh_info.material_index_map.first() = info.materials.index_of(nullptr);
+ }
+ else {
+ for (const int old_slot_index : IndexRange(mesh->totcol)) {
+ Material *material = mesh->mat[old_slot_index];
+ const int new_slot_index = info.materials.index_of(material);
+ mesh_info.material_index_map[old_slot_index] = new_slot_index;
+ }
}
/* Access attributes. */
@@ -950,20 +961,26 @@ static void execute_realize_mesh_task(const
RealizeInstancesOptions &options,
});
if (!all_dst_material_indices.is_empty()) {
MutableSpan<int> dst_material_indices =
all_dst_material_indices.slice(dst_poly_range);
- if (mesh_info.material_indices.is_single()) {
- const int src_index = mesh_info.material_indices.get_internal_single();
- const bool valid = IndexRange(mesh.totcol).contains(src_index);
- dst_material_indices.fill(valid ? material_index_map[src_index] : 0);
+ if (mesh.totcol == 0) {
+ /* The material index map contains the index of the null material in the
result. */
+ dst_material_indices.fill(material_index_map.first());
}
else {
- VArraySpan<int> indices_span(mesh_info.material_indices);
- threading::parallel_for(src_polys.index_range(), 1024, [&](const
IndexRange poly_range) {
- for (const int i : poly_range) {
- const int src_index = indices_span[i];
- const bool valid = IndexRange(mesh.totcol).contains(src_index);
- dst_material_indices[i] = valid ? material_index_map[src_index] : 0;
- }
- });
+ if (mesh_info.material_indices.is_single()) {
+ const int src_index = mesh_info.material_indices.get_internal_single();
+ const bool valid = IndexRange(mesh.totcol).contains(src_index);
+ dst_material_indices.fill(valid ? material_index_map[src_index] : 0);
+ }
+ else {
+ VArraySpan<int> indices_span(mesh_info.material_indices);
+ threading::parallel_for(src_polys.index_range(), 1024, [&](const
IndexRange poly_range) {
+ for (const int i : poly_range) {
+ const int src_index = indices_span[i];
+ const bool valid = IndexRange(mesh.totcol).contains(src_index);
+ dst_material_indices[i] = valid ? material_index_map[src_index] :
0;
+ }
+ });
+ }
}
}
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs