[Bf-blender-cvs] [0a84cc691d7] master: Cleanup: Move subdiv_mesh.c to C++

Hans Goudey noreply at git.blender.org
Thu Aug 18 00:11:15 CEST 2022


Commit: 0a84cc691d7945624ff83256ba083d35f80c3191
Author: Hans Goudey
Date:   Wed Aug 17 18:11:01 2022 -0400
Branches: master
https://developer.blender.org/rB0a84cc691d7945624ff83256ba083d35f80c3191

Cleanup: Move subdiv_mesh.c to C++

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

M	source/blender/blenkernel/CMakeLists.txt
R091	source/blender/blenkernel/intern/subdiv_mesh.c	source/blender/blenkernel/intern/subdiv_mesh.cc

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

diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 820d051f087..1183a05c3ea 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -279,7 +279,7 @@ set(SRC
   intern/subdiv_displacement_multires.c
   intern/subdiv_eval.c
   intern/subdiv_foreach.c
-  intern/subdiv_mesh.c
+  intern/subdiv_mesh.cc
   intern/subdiv_modifier.c
   intern/subdiv_stats.c
   intern/subdiv_topology.c
diff --git a/source/blender/blenkernel/intern/subdiv_mesh.c b/source/blender/blenkernel/intern/subdiv_mesh.cc
similarity index 91%
rename from source/blender/blenkernel/intern/subdiv_mesh.c
rename to source/blender/blenkernel/intern/subdiv_mesh.cc
index 433bad34479..d914318b8a5 100644
--- a/source/blender/blenkernel/intern/subdiv_mesh.c
+++ b/source/blender/blenkernel/intern/subdiv_mesh.cc
@@ -11,7 +11,7 @@
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 
-#include "BLI_alloca.h"
+#include "BLI_array.hh"
 #include "BLI_bitmap.h"
 #include "BLI_math_vector.h"
 
@@ -29,7 +29,7 @@
 /** \name Subdivision Context
  * \{ */
 
-typedef struct SubdivMeshContext {
+struct SubdivMeshContext {
   const SubdivToMeshSettings *settings;
   const Mesh *coarse_mesh;
   Subdiv *subdiv;
@@ -48,15 +48,15 @@ typedef struct SubdivMeshContext {
   /* Per-subdivided vertex counter of averaged values. */
   int *accumulated_counters;
   bool have_displacement;
-} SubdivMeshContext;
+};
 
 static void subdiv_mesh_ctx_cache_uv_layers(SubdivMeshContext *ctx)
 {
   Mesh *subdiv_mesh = ctx->subdiv_mesh;
   ctx->num_uv_layers = CustomData_number_of_layers(&subdiv_mesh->ldata, CD_MLOOPUV);
   for (int layer_index = 0; layer_index < ctx->num_uv_layers; layer_index++) {
-    ctx->uv_layers[layer_index] = CustomData_get_layer_n(
-        &subdiv_mesh->ldata, CD_MLOOPUV, layer_index);
+    ctx->uv_layers[layer_index] = static_cast<MLoopUV *>(
+        CustomData_get_layer_n(&subdiv_mesh->ldata, CD_MLOOPUV, layer_index));
   }
 }
 
@@ -64,15 +64,20 @@ static void subdiv_mesh_ctx_cache_custom_data_layers(SubdivMeshContext *ctx)
 {
   Mesh *subdiv_mesh = ctx->subdiv_mesh;
   /* Pointers to original indices layers. */
-  ctx->vert_origindex = CustomData_get_layer(&subdiv_mesh->vdata, CD_ORIGINDEX);
-  ctx->edge_origindex = CustomData_get_layer(&subdiv_mesh->edata, CD_ORIGINDEX);
-  ctx->loop_origindex = CustomData_get_layer(&subdiv_mesh->ldata, CD_ORIGINDEX);
-  ctx->poly_origindex = CustomData_get_layer(&subdiv_mesh->pdata, CD_ORIGINDEX);
+  ctx->vert_origindex = static_cast<int *>(
+      CustomData_get_layer(&subdiv_mesh->vdata, CD_ORIGINDEX));
+  ctx->edge_origindex = static_cast<int *>(
+      CustomData_get_layer(&subdiv_mesh->edata, CD_ORIGINDEX));
+  ctx->loop_origindex = static_cast<int *>(
+      CustomData_get_layer(&subdiv_mesh->ldata, CD_ORIGINDEX));
+  ctx->poly_origindex = static_cast<int *>(
+      CustomData_get_layer(&subdiv_mesh->pdata, CD_ORIGINDEX));
   /* UV layers interpolation. */
   subdiv_mesh_ctx_cache_uv_layers(ctx);
   /* Orco interpolation. */
-  ctx->orco = CustomData_get_layer(&subdiv_mesh->vdata, CD_ORCO);
-  ctx->cloth_orco = CustomData_get_layer(&subdiv_mesh->vdata, CD_CLOTH_ORCO);
+  ctx->orco = static_cast<float(*)[3]>(CustomData_get_layer(&subdiv_mesh->vdata, CD_ORCO));
+  ctx->cloth_orco = static_cast<float(*)[3]>(
+      CustomData_get_layer(&subdiv_mesh->vdata, CD_CLOTH_ORCO));
 }
 
 static void subdiv_mesh_prepare_accumulator(SubdivMeshContext *ctx, int num_vertices)
@@ -80,8 +85,8 @@ static void subdiv_mesh_prepare_accumulator(SubdivMeshContext *ctx, int num_vert
   if (!ctx->have_displacement) {
     return;
   }
-  ctx->accumulated_counters = MEM_calloc_arrayN(
-      num_vertices, sizeof(*ctx->accumulated_counters), "subdiv accumulated counters");
+  ctx->accumulated_counters = static_cast<int *>(
+      MEM_calloc_arrayN(num_vertices, sizeof(*ctx->accumulated_counters), __func__));
 }
 
 static void subdiv_mesh_context_free(SubdivMeshContext *ctx)
@@ -95,7 +100,7 @@ static void subdiv_mesh_context_free(SubdivMeshContext *ctx)
 /** \name Loop custom data copy helpers
  * \{ */
 
-typedef struct LoopsOfPtex {
+struct LoopsOfPtex {
   /* First loop of the ptex, starts at ptex (0, 0) and goes in u direction. */
   const MLoop *first_loop;
   /* Last loop of the ptex, starts at ptex (0, 0) and goes in v direction. */
@@ -103,7 +108,7 @@ typedef struct LoopsOfPtex {
   /* For quad coarse faces only. */
   const MLoop *second_loop;
   const MLoop *third_loop;
-} LoopsOfPtex;
+};
 
 static void loops_of_ptex_get(const SubdivMeshContext *ctx,
                               LoopsOfPtex *loops_of_ptex,
@@ -126,8 +131,8 @@ static void loops_of_ptex_get(const SubdivMeshContext *ctx,
     loops_of_ptex->third_loop = loops_of_ptex->first_loop + 2;
   }
   else {
-    loops_of_ptex->second_loop = NULL;
-    loops_of_ptex->third_loop = NULL;
+    loops_of_ptex->second_loop = nullptr;
+    loops_of_ptex->third_loop = nullptr;
   }
 }
 
@@ -140,7 +145,7 @@ static void loops_of_ptex_get(const SubdivMeshContext *ctx,
 /* TODO(sergey): Somehow de-duplicate with loops storage, without too much
  * exception cases all over the code. */
 
-typedef struct VerticesForInterpolation {
+struct VerticesForInterpolation {
   /* This field points to a vertex data which is to be used for interpolation.
    * The idea is to avoid unnecessary allocations for regular faces, where
    * we can simply use corner vertices. */
@@ -159,7 +164,7 @@ typedef struct VerticesForInterpolation {
   /* Indices within vertex_data to interpolate for. The indices are aligned
    * with uv coordinates in a similar way as indices in loop_data_storage. */
   int vertex_indices[4];
-} VerticesForInterpolation;
+};
 
 static void vertex_interpolation_init(const SubdivMeshContext *ctx,
                                       VerticesForInterpolation *vertex_interpolation,
@@ -192,17 +197,17 @@ static void vertex_interpolation_init(const SubdivMeshContext *ctx,
     /* Interpolate center of poly right away, it stays unchanged for all
      * ptex faces. */
     const float weight = 1.0f / (float)coarse_poly->totloop;
-    float *weights = BLI_array_alloca(weights, coarse_poly->totloop);
-    int *indices = BLI_array_alloca(indices, coarse_poly->totloop);
+    blender::Array<float, 32> weights(coarse_poly->totloop);
+    blender::Array<int, 32> indices(coarse_poly->totloop);
     for (int i = 0; i < coarse_poly->totloop; i++) {
       weights[i] = weight;
       indices[i] = coarse_mloop[coarse_poly->loopstart + i].v;
     }
     CustomData_interp(&coarse_mesh->vdata,
                       &vertex_interpolation->vertex_data_storage,
-                      indices,
-                      weights,
-                      NULL,
+                      indices.data(),
+                      weights.data(),
+                      nullptr,
                       coarse_poly->totloop,
                       2);
   }
@@ -237,26 +242,27 @@ static void vertex_interpolation_from_corner(const SubdivMeshContext *ctx,
     const int first_loop_index = loops_of_ptex.first_loop - coarse_mloop;
     const int last_loop_index = loops_of_ptex.last_loop - coarse_mloop;
     const int first_indices[2] = {
-        coarse_mloop[first_loop_index].v,
-        coarse_mloop[coarse_poly->loopstart +
-                     (first_loop_index - coarse_poly->loopstart + 1) % coarse_poly->totloop]
-            .v};
+        static_cast<int>(coarse_mloop[first_loop_index].v),
+        static_cast<int>(
+            coarse_mloop[coarse_poly->loopstart +
+                         (first_loop_index - coarse_poly->loopstart + 1) % coarse_poly->totloop]
+                .v)};
     const int last_indices[2] = {
-        coarse_mloop[first_loop_index].v,
-        coarse_mloop[last_loop_index].v,
+        static_cast<int>(coarse_mloop[first_loop_index].v),
+        static_cast<int>(coarse_mloop[last_loop_index].v),
     };
     CustomData_interp(vertex_data,
                       &vertex_interpolation->vertex_data_storage,
                       first_indices,
                       weights,
-                      NULL,
+                      nullptr,
                       2,
                       1);
     CustomData_interp(vertex_data,
                       &vertex_interpolation->vertex_data_storage,
                       last_indices,
                       weights,
-                      NULL,
+                      nullptr,
                       2,
                       3);
   }
@@ -275,7 +281,7 @@ static void vertex_interpolation_end(VerticesForInterpolation *vertex_interpolat
 /** \name Loop custom data interpolation helpers
  * \{ */
 
-typedef struct LoopsForInterpolation {
+struct LoopsForInterpolation {
   /* This field points to a loop data which is to be used for interpolation.
    * The idea is to avoid unnecessary allocations for regular faces, where
    * we can simply interpolate corner vertices. */
@@ -294,7 +300,7 @@ typedef struct LoopsForInterpolation {
   /* Infices within loop_data to interpolate for. The indices are aligned with
    * uv coordinates in a similar way as indices in loop_data_storage. */
   int loop_indices[4];
-} LoopsForInterpolation;
+};
 
 static void loop_interpolation_init(const SubdivMeshContext *ctx,
                                     LoopsForInterpolation *loop_interpolation,
@@ -326,17 +332,17 @@ static void loop_interpolation_init(const SubdivMeshContext *ctx,
     /* Interpolate center of poly right away, it stays unchanged for all
      * ptex faces. */
     const float weight = 1.0f / (float)coarse_poly->totloop;
-    float *weights = BLI_array_alloca(weights, coarse_poly->totloop);
-    int *indices = BLI_array_alloca(indices, coarse_poly->totloop);
+    blender::Array<float, 32> weights(coarse_poly->totloop);
+    blender::Array<int, 32> indices(coarse_poly->totloop);
     for (int i = 0; i < coarse_poly->totloop; i++) {
       weights[i] = weight;
       indices[i] = coarse_poly->loopstart + i;
     }
     CustomData_interp(&coarse_mesh->ldata,
                       &loop_interpolation->loop_data_storage,
-                      indices,
-                      weights,
-                      N

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list