[Bf-blender-cvs] [dad9f45561a] master: Cleanup: move run-time members of SurfaceModifierData into a struct

Campbell Barton noreply at git.blender.org
Tue Jan 10 07:26:07 CET 2023


Commit: dad9f45561a1cd129d86cbdd93b883dcaef0df26
Author: Campbell Barton
Date:   Tue Jan 10 17:07:30 2023 +1100
Branches: master
https://developer.blender.org/rBdad9f45561a1cd129d86cbdd93b883dcaef0df26

Cleanup: move run-time members of SurfaceModifierData into a struct

Using run-time members in the surface modifier complicated code-review
and caused an unnecessary renaming in `dna_rename_defs.h`.

Also rename:
- `x` -> `vert_positions_prev`.
- `v` -> `vert_velocities`.
- `cfra` -> `cfra_prev`.

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

M	source/blender/blenkernel/intern/effect.c
M	source/blender/makesdna/DNA_modifier_defaults.h
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesdna/intern/dna_rename_defs.h
M	source/blender/modifiers/intern/MOD_surface.c

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

diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 84fda9034cb..3c8b76380ee 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -644,13 +644,13 @@ bool closest_point_on_surface(SurfaceModifierData *surmd,
                               float surface_nor[3],
                               float surface_vel[3])
 {
+  BVHTreeFromMesh *bvhtree = surmd->runtime.bvhtree;
   BVHTreeNearest nearest;
 
   nearest.index = -1;
   nearest.dist_sq = FLT_MAX;
 
-  BLI_bvhtree_find_nearest(
-      surmd->bvhtree->tree, co, &nearest, surmd->bvhtree->nearest_callback, surmd->bvhtree);
+  BLI_bvhtree_find_nearest(bvhtree->tree, co, &nearest, bvhtree->nearest_callback, bvhtree);
 
   if (nearest.index != -1) {
     copy_v3_v3(surface_co, nearest.co);
@@ -660,12 +660,12 @@ bool closest_point_on_surface(SurfaceModifierData *surmd,
     }
 
     if (surface_vel) {
-      const MLoop *mloop = surmd->bvhtree->loop;
-      const MLoopTri *lt = &surmd->bvhtree->looptri[nearest.index];
+      const MLoop *mloop = bvhtree->loop;
+      const MLoopTri *lt = &bvhtree->looptri[nearest.index];
 
-      copy_v3_v3(surface_vel, surmd->v[mloop[lt->tri[0]].v]);
-      add_v3_v3(surface_vel, surmd->v[mloop[lt->tri[1]].v]);
-      add_v3_v3(surface_vel, surmd->v[mloop[lt->tri[2]].v]);
+      copy_v3_v3(surface_vel, surmd->runtime.vert_velocities[mloop[lt->tri[0]].v]);
+      add_v3_v3(surface_vel, surmd->runtime.vert_velocities[mloop[lt->tri[1]].v]);
+      add_v3_v3(surface_vel, surmd->runtime.vert_velocities[mloop[lt->tri[2]].v]);
 
       mul_v3_fl(surface_vel, (1.0f / 3.0f));
     }
@@ -684,7 +684,8 @@ bool get_effector_data(EffectorCache *eff,
 
   /* In case surface object is in Edit mode when loading the .blend,
    * surface modifier is never executed and bvhtree never built, see T48415. */
-  if (eff->pd && eff->pd->shape == PFIELD_SHAPE_SURFACE && eff->surmd && eff->surmd->bvhtree) {
+  if (eff->pd && eff->pd->shape == PFIELD_SHAPE_SURFACE && eff->surmd &&
+      eff->surmd->runtime.bvhtree) {
     /* closest point in the object surface is an effector */
     float vec[3];
 
diff --git a/source/blender/makesdna/DNA_modifier_defaults.h b/source/blender/makesdna/DNA_modifier_defaults.h
index 92a65a50bd4..6ba973ee4ec 100644
--- a/source/blender/makesdna/DNA_modifier_defaults.h
+++ b/source/blender/makesdna/DNA_modifier_defaults.h
@@ -616,12 +616,7 @@
 
 #define _DNA_DEFAULT_SurfaceModifierData \
   { \
-    .x = NULL, \
-    .v = NULL, \
-    .mesh = NULL, \
-    .bvhtree = NULL, \
-    .cfra = 0, \
-    .verts_num = 0, \
+    /* Intentionally empty (all run-time data). */ \
   }
 
 #define _DNA_DEFAULT_SurfaceDeformModifierData \
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 170fa0b4351..aa7df999cf5 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -877,20 +877,24 @@ typedef struct CollisionModifierData {
   struct BVHTree *bvhtree;
 } CollisionModifierData;
 
-typedef struct SurfaceModifierData {
-  ModifierData modifier;
+typedef struct SurfaceModifierData_Runtime {
 
-  /** Old position. */
-  float (*x)[3];
-  /** Velocity. */
-  float (*v)[3];
+  float (*vert_positions_prev)[3];
+  float (*vert_velocities)[3];
 
   struct Mesh *mesh;
 
   /** Bounding volume hierarchy of the mesh faces. */
   struct BVHTreeFromMesh *bvhtree;
 
-  int cfra, verts_num;
+  int cfra_prev, verts_num;
+
+} SurfaceModifierData_Runtime;
+
+typedef struct SurfaceModifierData {
+  ModifierData modifier;
+
+  SurfaceModifierData_Runtime runtime;
 } SurfaceModifierData;
 
 typedef struct BooleanModifierData {
diff --git a/source/blender/makesdna/intern/dna_rename_defs.h b/source/blender/makesdna/intern/dna_rename_defs.h
index 6d4592bb338..dce7d353fe6 100644
--- a/source/blender/makesdna/intern/dna_rename_defs.h
+++ b/source/blender/makesdna/intern/dna_rename_defs.h
@@ -125,7 +125,6 @@ DNA_STRUCT_RENAME_ELEM(SpaceSeq, overlay_type, overlay_frame_type)
 DNA_STRUCT_RENAME_ELEM(SurfaceDeformModifierData, num_mesh_verts, mesh_verts_num)
 DNA_STRUCT_RENAME_ELEM(SurfaceDeformModifierData, numpoly, target_polys_num)
 DNA_STRUCT_RENAME_ELEM(SurfaceDeformModifierData, numverts, bind_verts_num)
-DNA_STRUCT_RENAME_ELEM(SurfaceModifierData, numverts, verts_num)
 DNA_STRUCT_RENAME_ELEM(Text, name, filepath)
 DNA_STRUCT_RENAME_ELEM(ThemeSpace, scrubbing_background, time_scrub_background)
 DNA_STRUCT_RENAME_ELEM(ThemeSpace, show_back_grad, background_type)
diff --git a/source/blender/modifiers/intern/MOD_surface.c b/source/blender/modifiers/intern/MOD_surface.c
index ba63468d075..00fe739b49c 100644
--- a/source/blender/modifiers/intern/MOD_surface.c
+++ b/source/blender/modifiers/intern/MOD_surface.c
@@ -56,10 +56,7 @@ static void copyData(const ModifierData *md_src, ModifierData *md_dst, const int
 
   BKE_modifier_copydata_generic(md_src, md_dst, flag);
 
-  surmd_dst->bvhtree = NULL;
-  surmd_dst->mesh = NULL;
-  surmd_dst->x = NULL;
-  surmd_dst->v = NULL;
+  memset(&surmd_dst->runtime, 0, sizeof(surmd_dst->runtime));
 }
 
 static void freeData(ModifierData *md)
@@ -67,19 +64,19 @@ static void freeData(ModifierData *md)
   SurfaceModifierData *surmd = (SurfaceModifierData *)md;
 
   if (surmd) {
-    if (surmd->bvhtree) {
-      free_bvhtree_from_mesh(surmd->bvhtree);
-      MEM_SAFE_FREE(surmd->bvhtree);
+    if (surmd->runtime.bvhtree) {
+      free_bvhtree_from_mesh(surmd->runtime.bvhtree);
+      MEM_SAFE_FREE(surmd->runtime.bvhtree);
     }
 
-    if (surmd->mesh) {
-      BKE_id_free(NULL, surmd->mesh);
-      surmd->mesh = NULL;
+    if (surmd->runtime.mesh) {
+      BKE_id_free(NULL, surmd->runtime.mesh);
+      surmd->runtime.mesh = NULL;
     }
 
-    MEM_SAFE_FREE(surmd->x);
+    MEM_SAFE_FREE(surmd->runtime.vert_positions_prev);
 
-    MEM_SAFE_FREE(surmd->v);
+    MEM_SAFE_FREE(surmd->runtime.vert_velocities);
   }
 }
 
@@ -98,23 +95,24 @@ static void deformVerts(ModifierData *md,
   const int cfra = (int)DEG_get_ctime(ctx->depsgraph);
 
   /* Free mesh and BVH cache. */
-  if (surmd->bvhtree) {
-    free_bvhtree_from_mesh(surmd->bvhtree);
-    MEM_SAFE_FREE(surmd->bvhtree);
+  if (surmd->runtime.bvhtree) {
+    free_bvhtree_from_mesh(surmd->runtime.bvhtree);
+    MEM_SAFE_FREE(surmd->runtime.bvhtree);
   }
 
-  if (surmd->mesh) {
-    BKE_id_free(NULL, surmd->mesh);
-    surmd->mesh = NULL;
+  if (surmd->runtime.mesh) {
+    BKE_id_free(NULL, surmd->runtime.mesh);
+    surmd->runtime.mesh = NULL;
   }
 
   if (mesh) {
     /* Not possible to use get_mesh() in this case as we'll modify its vertices
      * and get_mesh() would return 'mesh' directly. */
-    surmd->mesh = (Mesh *)BKE_id_copy_ex(NULL, (ID *)mesh, NULL, LIB_ID_COPY_LOCALIZE);
+    surmd->runtime.mesh = (Mesh *)BKE_id_copy_ex(NULL, (ID *)mesh, NULL, LIB_ID_COPY_LOCALIZE);
   }
   else {
-    surmd->mesh = MOD_deform_mesh_eval_get(ctx->object, NULL, NULL, NULL, verts_num, false);
+    surmd->runtime.mesh = MOD_deform_mesh_eval_get(
+        ctx->object, NULL, NULL, NULL, verts_num, false);
   }
 
   if (!ctx->object->pd) {
@@ -122,61 +120,61 @@ static void deformVerts(ModifierData *md,
     return;
   }
 
-  if (surmd->mesh) {
+  if (surmd->runtime.mesh) {
     uint mesh_verts_num = 0, i = 0;
     int init = 0;
 
-    BKE_mesh_vert_coords_apply(surmd->mesh, vertexCos);
+    BKE_mesh_vert_coords_apply(surmd->runtime.mesh, vertexCos);
 
-    mesh_verts_num = surmd->mesh->totvert;
+    mesh_verts_num = surmd->runtime.mesh->totvert;
 
-    if (mesh_verts_num != surmd->verts_num || surmd->x == NULL || surmd->v == NULL ||
-        cfra != surmd->cfra + 1) {
-      if (surmd->x) {
-        MEM_freeN(surmd->x);
-        surmd->x = NULL;
-      }
-      if (surmd->v) {
-        MEM_freeN(surmd->v);
-        surmd->v = NULL;
-      }
+    if ((mesh_verts_num != surmd->runtime.verts_num) ||
+        (surmd->runtime.vert_positions_prev == NULL) || (surmd->runtime.vert_velocities == NULL) ||
+        (cfra != surmd->runtime.cfra_prev + 1)) {
+
+      MEM_SAFE_FREE(surmd->runtime.vert_positions_prev);
+      MEM_SAFE_FREE(surmd->runtime.vert_velocities);
 
-      surmd->x = MEM_calloc_arrayN(mesh_verts_num, sizeof(float[3]), __func__);
-      surmd->v = MEM_calloc_arrayN(mesh_verts_num, sizeof(float[3]), __func__);
+      surmd->runtime.vert_positions_prev = MEM_calloc_arrayN(
+          mesh_verts_num, sizeof(float[3]), __func__);
+      surmd->runtime.vert_velocities = MEM_calloc_arrayN(
+          mesh_verts_num, sizeof(float[3]), __func__);
 
-      surmd->verts_num = mesh_verts_num;
+      surmd->runtime.verts_num = mesh_verts_num;
 
       init = 1;
     }
 
     /* convert to global coordinates and calculate velocity */
-    float(*positions)[3] = BKE_mesh_vert_positions_for_write(surmd->mesh);
+    float(*positions)[3] = BKE_mesh_vert_positions_for_write(surmd->runtime.mesh);
     for (i = 0; i < mesh_verts_num; i++) {
       float *vec = positions[i];
       mul_m4_v3(ctx->object->object_to_world, vec);
 
       if (init) {
-        surmd->v[i][0] = surmd->v[i][1] = surmd->v[i][2] = 0.0f;
+        zero_v3(surmd->runtime.vert_velocities[i]);
       }
       else {
-        sub_v3_v3v3(surmd->v[i], vec, surmd->x[i]);
+        sub_v3_v3v3(surmd->runtime.vert_velocities[i], vec, surmd->runtime.vert_positions_prev[i]);
       }
 
-      copy_v3_v3(surmd->x[i], vec);
+      copy_v3_v3(surmd->runtime.vert_positions_prev[i], vec);
     }
 
-    surmd->cfra = cfra;
+    surmd->runtime.cfra_prev = cfra;
 
-    const bool has_poly = surmd->mesh->totpoly > 0;
-    const bool has_edge = surmd->mesh->totedge > 0;
+    const bool has_poly = surmd->runtime.mesh->totpoly > 0;
+    const bool has_edge = surmd->runtime.mesh->totedge > 0;
     if (has_poly || has_edge) {
-      surmd->bvhtree = MEM_callocN(sizeof(BVHTreeFromMesh), "BVHTreeFromMesh");
+      surmd->runtime.bvhtree = MEM_callocN(sizeof(BVHTreeFromMesh), "BVHTreeFromMesh");
 
       if (has_poly) {
-        BKE_bvhtree_from_mesh_get(surmd->bvhtree, surmd->mesh, BVHTREE_FROM_LOOPTRI, 2);
+        BKE_bvhtree_from_mesh_get(
+            surmd->runtime.bvhtree, surmd

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list