[Bf-blender-cvs] [fe9e0e2337d] refactor-mesh-material-index-generic: Avoid retrieving material indices many times in draw code

Hans Goudey noreply at git.blender.org
Sat Aug 27 16:36:00 CEST 2022


Commit: fe9e0e2337d2c8a2df47ed03e759f8219b4d215e
Author: Hans Goudey
Date:   Sat Aug 27 09:35:37 2022 -0500
Branches: refactor-mesh-material-index-generic
https://developer.blender.org/rBfe9e0e2337d2c8a2df47ed03e759f8219b4d215e

Avoid retrieving material indices many times in draw code

===================================================================

M	source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh.hh

===================================================================

diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
index b933f1f4916..e07fe81840e 100644
--- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
+++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
@@ -229,13 +229,10 @@ static void mesh_render_data_polys_sorted_build(MeshRenderData *mr, MeshBufferCa
     }
   }
   else {
-    const blender::VArraySpan<int> material_indices =
-        blender::bke::mesh_attributes(*mr->me).lookup_or_default<int>(
-            "material_index", ATTR_DOMAIN_FACE, 0);
     for (int i = 0; i < mr->poly_len; i++) {
       if (!(mr->use_hide && mr->hide_poly && mr->hide_poly[i])) {
         const MPoly *mp = &mr->mpoly[i];
-        const int mat = min_ii(material_indices[i], mat_last);
+        const int mat = min_ii(mr->material_indices ? mr->material_indices[i] : 0, mat_last);
         tri_first_index[i] = mat_tri_offs[mat];
         mat_tri_offs[mat] += mp->totloop - 2;
       }
@@ -271,13 +268,10 @@ static void mesh_render_data_mat_tri_len_mesh_range_fn(void *__restrict userdata
 {
   MeshRenderData *mr = static_cast<MeshRenderData *>(userdata);
   int *mat_tri_len = static_cast<int *>(tls->userdata_chunk);
-  const blender::VArraySpan<int> material_indices =
-      blender::bke::mesh_attributes(*mr->me).lookup_or_default<int>(
-          "material_index", ATTR_DOMAIN_FACE, 0);
 
   const MPoly *mp = &mr->mpoly[iter];
   if (!(mr->use_hide && mr->hide_poly && mr->hide_poly[iter])) {
-    int mat = min_ii(material_indices[iter], mr->mat_len - 1);
+    int mat = min_ii(mr->material_indices ? mr->material_indices[iter] : 0, mr->mat_len - 1);
     mat_tri_len[mat] += mp->totloop - 2;
   }
 }
@@ -583,6 +577,9 @@ MeshRenderData *mesh_render_data_create(Object *object,
     mr->e_origindex = static_cast<const int *>(CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX));
     mr->p_origindex = static_cast<const int *>(CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX));
 
+    mr->material_indices = static_cast<const int *>(
+        CustomData_get_layer_named(&me->pdata, CD_PROP_INT32, "material_index"));
+
     mr->hide_vert = static_cast<const bool *>(
         CustomData_get_layer_named(&me->vdata, CD_PROP_BOOL, ".hide_vert"));
     mr->hide_edge = static_cast<const bool *>(
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh.hh b/source/blender/draw/intern/mesh_extractors/extract_mesh.hh
index 5d55af904e8..10b94291e35 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh.hh
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh.hh
@@ -80,6 +80,7 @@ struct MeshRenderData {
   BMFace *efa_act_uv;
   /* Data created on-demand (usually not for #BMesh based data). */
   MLoopTri *mlooptri;
+  const int *material_indices;
   const float (*vert_normals)[3];
   const float (*poly_normals)[3];
   const bool *hide_vert;



More information about the Bf-blender-cvs mailing list