[Bf-blender-cvs] [0258e36774e] refactor-mesh-remove-pointers: Add empty checks for safety in Cycles mesh reading

Hans Goudey noreply at git.blender.org
Thu Sep 1 23:55:17 CEST 2022


Commit: 0258e36774edfd12ef13278a5a6e9c41512b10c0
Author: Hans Goudey
Date:   Thu Sep 1 16:19:27 2022 -0500
Branches: refactor-mesh-remove-pointers
https://developer.blender.org/rB0258e36774edfd12ef13278a5a6e9c41512b10c0

Add empty checks for safety in Cycles mesh reading

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

M	intern/cycles/blender/mesh.cpp

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

diff --git a/intern/cycles/blender/mesh.cpp b/intern/cycles/blender/mesh.cpp
index e6f6ba5e3bd..01ce771b466 100644
--- a/intern/cycles/blender/mesh.cpp
+++ b/intern/cycles/blender/mesh.cpp
@@ -312,9 +312,12 @@ static void fill_generic_attribute(BL::Mesh &b_mesh,
   switch (b_domain) {
     case BL::Attribute::domain_CORNER: {
       if (subdivision) {
+        const int polys_num = b_mesh.polygons.length();
+        if (polys_num == 0) {
+          return;
+        }
         const BlenderPolygon *polys = static_cast<const BlenderPolygon *>(
             b_mesh.polygons[0].ptr.data);
-        const int polys_num = b_mesh.polygons.length();
         for (int i = 0; i < polys_num; i++) {
           const BlenderPolygon &b_poly = polys[i];
           for (int j = 0; j < b_poly.totloop; j++) {
@@ -335,6 +338,10 @@ static void fill_generic_attribute(BL::Mesh &b_mesh,
       break;
     }
     case BL::Attribute::domain_EDGE: {
+      const size_t edges_num = b_mesh.edges.length();
+      if (edges_num == 0) {
+        return;
+      }
       if constexpr (std::is_same_v<TypeInCycles, uchar4>) {
         /* uchar4 edge attributes do not exist, and averaging in place
          * would not work. */
@@ -343,7 +350,6 @@ static void fill_generic_attribute(BL::Mesh &b_mesh,
       else {
         const BlenderEdge *edges = static_cast<const BlenderEdge *>(b_mesh.edges[0].ptr.data);
         const size_t verts_num = b_mesh.vertices.length();
-        const size_t edges_num = b_mesh.edges.length();
         vector<int> count(verts_num, 0);
 
         /* Average edge attributes at vertices. */
@@ -641,13 +647,16 @@ static void attr_create_uv_map(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh)
 
 static void attr_create_subd_uv_map(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, bool subdivide_uvs)
 {
+  const int polys_num = b_mesh.polygons.length();
+  if (polys_num == 0) {
+    return;
+  }
+  const BlenderPolygon *polys = static_cast<const BlenderPolygon *>(b_mesh.polygons[0].ptr.data);
+
   if (!b_mesh.uv_layers.empty()) {
     BL::Mesh::uv_layers_iterator l;
     int i = 0;
 
-    const BlenderPolygon *polys = static_cast<const BlenderPolygon *>(b_mesh.polygons[0].ptr.data);
-    const int polys_num = b_mesh.polygons.length();
-
     for (b_mesh.uv_layers.begin(l); l != b_mesh.uv_layers.end(); ++l, ++i) {
       bool active_render = l->active_render();
       AttributeStandard uv_std = (active_render) ? ATTR_STD_UV : ATTR_STD_NONE;
@@ -903,6 +912,7 @@ static void attr_create_random_per_island(Scene *scene,
     return;
   }
 
+  const int polys_num = b_mesh.polygons.length();
   int number_of_vertices = b_mesh.vertices.length();
   if (number_of_vertices == 0) {
     return;
@@ -927,13 +937,15 @@ static void attr_create_random_per_island(Scene *scene,
     }
   }
   else {
-    const BlenderPolygon *polys = static_cast<const BlenderPolygon *>(b_mesh.polygons[0].ptr.data);
-    const int polys_num = b_mesh.polygons.length();
-    const BlenderLoop *loops = static_cast<const BlenderLoop *>(b_mesh.loops[0].ptr.data);
-    for (int i = 0; i < polys_num; i++) {
-      const BlenderPolygon &b_poly = polys[i];
-      const BlenderLoop &b_loop = loops[b_poly.loopstart];
-      data[i] = hash_uint_to_float(vertices_sets.find(b_loop.v));
+    if (polys_num != 0) {
+      const BlenderPolygon *polys = static_cast<const BlenderPolygon *>(
+          b_mesh.polygons[0].ptr.data);
+      const BlenderLoop *loops = static_cast<const BlenderLoop *>(b_mesh.loops[0].ptr.data);
+      for (int i = 0; i < polys_num; i++) {
+        const BlenderPolygon &b_poly = polys[i];
+        const BlenderLoop &b_loop = loops[b_poly.loopstart];
+        data[i] = hash_uint_to_float(vertices_sets.find(b_loop.v));
+      }
     }
   }
 }
@@ -968,6 +980,7 @@ static void create_mesh(Scene *scene,
 {
   /* count vertices and faces */
   int numverts = b_mesh.vertices.length();
+  const int polys_num = b_mesh.polygons.length();
   int numfaces = (!subdivision) ? b_mesh.loop_triangles.length() : b_mesh.polygons.length();
   int numtris = 0;
   int numcorners = 0;
@@ -987,7 +1000,6 @@ static void create_mesh(Scene *scene,
   }
   else {
     const BlenderPolygon *polys = static_cast<const BlenderPolygon *>(b_mesh.polygons[0].ptr.data);
-    const int polys_num = b_mesh.polygons.length();
     for (int i = 0; i < polys_num; i++) {
       const BlenderPolygon &b_poly = polys[i];
       numngons += (b_poly.totloop == 4) ? 0 : 1;
@@ -1142,32 +1154,33 @@ static void create_subd_mesh(Scene *scene,
 
   create_mesh(scene, mesh, b_mesh, used_shaders, need_motion, motion_scale, true, subdivide_uvs);
 
-  /* export creases */
-  size_t num_creases = 0;
-
-  const BlenderEdge *edges = static_cast<BlenderEdge *>(b_mesh.edges[0].ptr.data);
   const int edges_num = b_mesh.edges.length();
 
-  for (int i = 0; i < edges_num; i++) {
-    const BlenderEdge &b_edge = edges[i];
-    if (b_edge.crease != 0) {
-      num_creases++;
+  if (edges_num != 0) {
+    size_t num_creases = 0;
+    const BlenderEdge *edges = static_cast<BlenderEdge *>(b_mesh.edges[0].ptr.data);
+
+    for (int i = 0; i < edges_num; i++) {
+      const BlenderEdge &b_edge = edges[i];
+      if (b_edge.crease != 0) {
+        num_creases++;
+      }
     }
-  }
 
-  mesh->reserve_subd_creases(num_creases);
+    mesh->reserve_subd_creases(num_creases);
 
-  for (int i = 0; i < edges_num; i++) {
-    const BlenderEdge &b_edge = edges[i];
-    if (b_edge.crease != 0) {
-      mesh->add_edge_crease(b_edge.v1, b_edge.v2, float(b_edge.crease) / 255.0f);
+    for (int i = 0; i < edges_num; i++) {
+      const BlenderEdge &b_edge = edges[i];
+      if (b_edge.crease != 0) {
+        mesh->add_edge_crease(b_edge.v1, b_edge.v2, float(b_edge.crease) / 255.0f);
+      }
     }
-  }
 
-  for (BL::MeshVertexCreaseLayer &c : b_mesh.vertex_creases) {
-    for (int i = 0; i < c.data.length(); ++i) {
-      if (c.data[i].value() != 0.0f) {
-        mesh->add_vertex_crease(i, c.data[i].value());
+    for (BL::MeshVertexCreaseLayer &c : b_mesh.vertex_creases) {
+      for (int i = 0; i < c.data.length(); ++i) {
+        if (c.data[i].value() != 0.0f) {
+          mesh->add_vertex_crease(i, c.data[i].value());
+        }
       }
     }
   }
@@ -1284,6 +1297,12 @@ void BlenderSync::sync_mesh_motion(BL::Depsgraph b_depsgraph,
     b_mesh = object_to_mesh(b_data, b_ob_info, b_depsgraph, false, Mesh::SUBDIVISION_NONE);
   }
 
+  const int b_verts_num = b_mesh.vertices.length();
+  if (b_verts_num == 0) {
+    free_object_to_mesh(b_data, b_ob_info, b_mesh);
+    return;
+  }
+
   const std::string ob_name = b_ob_info.real_object.name();
 
   /* TODO(sergey): Perform preliminary check for number of vertices. */
@@ -1307,7 +1326,6 @@ void BlenderSync::sync_mesh_motion(BL::Depsgraph b_depsgraph,
     float3 *mN = (attr_mN) ? attr_mN->data_float3() + motion_step * numverts : NULL;
 
     const BlenderVertex *verts = static_cast<const BlenderVertex *>(b_mesh.vertices[0].ptr.data);
-    const int b_verts_num = b_mesh.vertices.length();
 
     /* NOTE: We don't copy more that existing amount of vertices to prevent
      * possible memory corruption.



More information about the Bf-blender-cvs mailing list