[Bf-blender-cvs] [390320a151e] master: Mesh: Fix quadratic cost for accessing normals with RNA

Hans Goudey noreply at git.blender.org
Wed Sep 14 18:12:38 CEST 2022


Commit: 390320a151e23cd1ab9a3d5a44abee2897c133d4
Author: Hans Goudey
Date:   Wed Sep 14 11:12:27 2022 -0500
Branches: master
https://developer.blender.org/rB390320a151e23cd1ab9a3d5a44abee2897c133d4

Mesh: Fix quadratic cost for accessing normals with RNA

Same as eb3a561a7fe0b22abc1, but for the mesh normal arrays
introduced in b7fe27314b25a7220a.

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

M	source/blender/makesrna/intern/rna_mesh.c

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

diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index 28ceb0d1d9d..222e4ac0371 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -1571,6 +1571,19 @@ static int rna_Mesh_vertex_normals_length(PointerRNA *ptr)
   return mesh->totvert;
 }
 
+int rna_Mesh_vertex_normals_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
+{
+  const Mesh *mesh = rna_mesh(ptr);
+  if (index < 0 || index >= mesh->totvert) {
+    return false;
+  }
+  /* Casting away const is okay because this RNA type doesn't allow changing the value. */
+  r_ptr->owner_id = (ID *)&mesh->id;
+  r_ptr->type = &RNA_MeshNormalValue;
+  r_ptr->data = (float *)BKE_mesh_vertex_normals_ensure(mesh)[index];
+  return true;
+}
+
 static void rna_Mesh_poly_normals_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
 {
   const Mesh *mesh = rna_mesh(ptr);
@@ -1584,6 +1597,19 @@ static int rna_Mesh_poly_normals_length(PointerRNA *ptr)
   return mesh->totpoly;
 }
 
+int rna_Mesh_poly_normals_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
+{
+  const Mesh *mesh = rna_mesh(ptr);
+  if (index < 0 || index >= mesh->totpoly) {
+    return false;
+  }
+  /* Casting away const is okay because this RNA type doesn't allow changing the value. */
+  r_ptr->owner_id = (ID *)&mesh->id;
+  r_ptr->type = &RNA_MeshNormalValue;
+  r_ptr->data = (float *)BKE_mesh_poly_normals_ensure(mesh)[index];
+  return true;
+}
+
 static char *rna_MeshUVLoop_path(const PointerRNA *ptr)
 {
   return rna_LoopCustomData_data_path(ptr, "uv_layers", CD_MLOOPUV);
@@ -3462,7 +3488,7 @@ static void rna_def_mesh(BlenderRNA *brna)
                                     "rna_iterator_array_end",
                                     "rna_iterator_array_get",
                                     "rna_Mesh_vertex_normals_length",
-                                    NULL,
+                                    "rna_Mesh_vertex_normals_lookup_int",
                                     NULL,
                                     NULL);
 
@@ -3479,7 +3505,7 @@ static void rna_def_mesh(BlenderRNA *brna)
                                     "rna_iterator_array_end",
                                     "rna_iterator_array_get",
                                     "rna_Mesh_poly_normals_length",
-                                    NULL,
+                                    "rna_Mesh_poly_normals_lookup_int",
                                     NULL,
                                     NULL);



More information about the Bf-blender-cvs mailing list