[Bf-blender-cvs] [8b58d6dff9f] soc-2020-soft-body: added versioning

mattoverby noreply at git.blender.org
Thu Aug 20 18:43:11 CEST 2020


Commit: 8b58d6dff9fadd817567e6cbfc4ab7220a20f795
Author: mattoverby
Date:   Thu Aug 20 11:43:00 2020 -0500
Branches: soc-2020-soft-body
https://developer.blender.org/rB8b58d6dff9fadd817567e6cbfc4ab7220a20f795

added versioning

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

M	source/blender/blenkernel/BKE_softbody.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/softbody.c
M	source/blender/blenloader/intern/versioning_290.c
M	source/blender/makesdna/DNA_object_force_types.h

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

diff --git a/source/blender/blenkernel/BKE_softbody.h b/source/blender/blenkernel/BKE_softbody.h
index 8fe3130744b..f0bc521664f 100644
--- a/source/blender/blenkernel/BKE_softbody.h
+++ b/source/blender/blenkernel/BKE_softbody.h
@@ -50,8 +50,11 @@ typedef struct BodyPoint {
 /* allocates and initializes general main data */
 extern struct SoftBody *sbNew(struct Scene *scene);
 
-/* copies custom solver data from src to dest */
-extern void sbCustomCopy(struct Object *dest, struct Object *src);
+/* copies external solver data from src to dest */
+extern void sbExternalCopy(struct Object *dest, struct Object *src);
+
+/* initializes settings for external solvers */
+extern void sbExternalSetDefault(struct SoftBody *sb);
 
 /* frees internal data and softbody itself */
 extern void sbFree(struct Object *ob);
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 214c8ca8d8b..8d098999f9f 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1407,7 +1407,7 @@ void BKE_object_copy_softbody(struct Object *ob_dst, const struct Object *ob_src
 
   sbn = MEM_dupallocN(sb);
 
-  sbCustomCopy(ob_dst,ob_src);
+  sbExternalCopy(ob_dst,ob_src);
 
   if ((flag & LIB_ID_COPY_CACHES) == 0) {
     sbn->totspring = sbn->totpoint = 0;
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index c59b8701dbc..cfcac7c3dd2 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -3126,27 +3126,6 @@ SoftBody *sbNew(Scene *scene)
   SoftBody *sb;
   sb = MEM_callocN(sizeof(SoftBody), "softbody");
 
-  sb->solver_mode = SOLVER_MODE_LEGACY;
-  sb->admmpd_mesh_mode = 0; /* Embedded. */
-  sb->admmpd_substeps = 1;
-  sb->admmpd_max_admm_iters = 20;
-  sb->admmpd_self_collision = 0;
-  sb->admmpd_material = 0;  /* ARAP. */
-  sb->admmpd_embed_res = 3; /* Max subdivisions for embedded lattice. */
-  sb->admmpd_converge_eps = 1e-4; /* Solver residual stop condition. */
-  sb->admmpd_youngs_exp = 6; /* Exponent of Young's mod. */
-  sb->admmpd_poisson = 0.399; 
-  sb->admmpd_density_kgm3 = 1522; /* Density of rubber. */
-  sb->admmpd_ck_exp = 7; /* Exponent of collision stiffness. */
-  sb->admmpd_pk_exp = 4; /* Exponent of pin stiffness. */
-  sb->admmpd_floor_z = -999;
-  sb->admmpd_gravity = -9.8;
-  sb->admmpd_strainlimit_min = 0;    /* 0 = compression allowed. */
-  sb->admmpd_strainlimit_max = 100;  /* 100 = 100x strech allowed. */
-  sb->admmpd_maxthreads = -1; /* Auto detect. */
-  sb->admmpd_loglevel = 1;   /* Low terminal output. */
-  sb->admmpd_linsolver = 1;  /* PCG solver. */
-
   sb->mediafrict = 0.5f;
   sb->nodemass = 1.0f;
   sb->grav = 9.8f;
@@ -3186,7 +3165,8 @@ SoftBody *sbNew(Scene *scene)
 
   sb->shared = MEM_callocN(sizeof(*sb->shared), "SoftBody_Shared");
   sb->shared->pointcache = BKE_ptcache_add(&sb->shared->ptcaches);
-  sb->shared->admmpd_list = MEM_callocN(sizeof(ListBase), "SoftBody_ADMMPD_List");
+
+  sbExternalSetDefault(sb);
 
   if (!sb->effector_weights) {
     sb->effector_weights = BKE_effector_add_weights(NULL);
@@ -3682,33 +3662,69 @@ static void update_collider_admmpd(Depsgraph *depsgraph,
   BKE_collision_objects_free(objects);
 }
 
-void sbCustomCopy(Object *dest, Object *src)
+void sbExternalCopy(Object *dest_ob, Object *src_ob)
 {
-  (void)(src);
-  SoftBody *sb_dest = dest->soft;
-  if (!sb_dest) {
-    CLOG_ERROR(&LOG, "No softbody in sbCustomCopy");
+  (void)(src_ob);
+  if (!dest_ob) {
+    CLOG_ERROR(&LOG, "No dest object in sbExternalCopy");
     return;
   }
-  if (!sb_dest->shared) {
-    CLOG_ERROR(&LOG, "No shared in sbCustomCopy");
+  SoftBody *dest = dest_ob->soft;
+  if (!dest) {
+    CLOG_ERROR(&LOG, "No softbody in sbExternalCopy");
+    return;
+  }
+  if (!dest->shared) {
+    CLOG_ERROR(&LOG, "No shared in sbExternalCopy");
     return;
   }
-
   /* This can happen on readfile: */
-  if (!sb_dest->shared->admmpd_list) {
-    sb_dest->shared->admmpd_list = MEM_callocN(sizeof(ListBase), "SoftBody_ADMMPD_List");
+  if (!dest->shared->admmpd_list) {
+    dest->shared->admmpd_list = MEM_callocN(sizeof(ListBase), "SoftBody_ADMMPD_List");
   }
-
   /* Create ADMM-PD data for this object if it does not already exist. */
-  ADMMPDInterfaceData *admmpd = get_admmpd_for_object(dest);
+  ADMMPDInterfaceData *admmpd = get_admmpd_for_object(dest_ob);
   if (admmpd==NULL) {
     admmpd = MEM_callocN(sizeof(ADMMPDInterfaceData), "ADMMPD");
-    strcpy(admmpd->name, dest->id.name);
-    BLI_addtail(sb_dest->shared->admmpd_list, admmpd);
+    strcpy(admmpd->name, dest_ob->id.name);
+    BLI_addtail(dest->shared->admmpd_list, admmpd);
   }
 }
 
+void sbExternalSetDefault(SoftBody *sb)
+{
+  if (!sb) {
+    return;
+  }
+  if (sb->shared == NULL) {
+    sb->shared = MEM_callocN(sizeof(*sb->shared), "SoftBody_Shared");
+  }
+  if (sb->shared->admmpd_list == NULL) {
+    sb->shared->admmpd_list = MEM_callocN(sizeof(ListBase), "SoftBody_ADMMPD_List");
+  }
+
+  sb->solver_mode = SOLVER_MODE_LEGACY;
+  sb->admmpd_mesh_mode = 0; /* Embedded. */
+  sb->admmpd_substeps = 1;
+  sb->admmpd_max_admm_iters = 20;
+  sb->admmpd_self_collision = 0;
+  sb->admmpd_material = 0;  /* ARAP. */
+  sb->admmpd_embed_res = 3; /* Max subdivisions for embedded lattice. */
+  sb->admmpd_converge_eps = 1e-4; /* Solver residual stop condition. */
+  sb->admmpd_youngs_exp = 6; /* Exponent of Young's mod. */
+  sb->admmpd_poisson = 0.399; 
+  sb->admmpd_density_kgm3 = 1522; /* Density of rubber. */
+  sb->admmpd_ck_exp = 7; /* Exponent of collision stiffness. */
+  sb->admmpd_pk_exp = 4; /* Exponent of pin stiffness. */
+  sb->admmpd_floor_z = -999;
+  sb->admmpd_gravity = -9.8;
+  sb->admmpd_strainlimit_min = 0;    /* 0 = compression allowed. */
+  sb->admmpd_strainlimit_max = 100;  /* 100 = 100x strech allowed. */
+  sb->admmpd_maxthreads = -1; /* Auto detect. */
+  sb->admmpd_loglevel = 1;   /* Low terminal output. */
+  sb->admmpd_linsolver = 1;  /* PCG solver. */
+}
+
 /* simulates one step. framenr is in frames */
 void sbObjectStep(struct Depsgraph *depsgraph,
                   Scene *scene,
diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c
index 12b5a297df5..3c96d383434 100644
--- a/source/blender/blenloader/intern/versioning_290.c
+++ b/source/blender/blenloader/intern/versioning_290.c
@@ -33,6 +33,7 @@
 #include "DNA_gpencil_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
+#include "DNA_object_force_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_shader_fx_types.h"
 
@@ -42,6 +43,7 @@
 #include "BKE_lib_id.h"
 #include "BKE_main.h"
 #include "BKE_node.h"
+#include "BKE_softbody.h"
 
 #include "BLO_readfile.h"
 #include "readfile.h"
@@ -407,6 +409,14 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
     }
   }
 
+  if (!DNA_struct_elem_find(fd->filesdna, "SoftBody", "int", "solver_mode")) {
+    for (Object *ob = bmain->objects.first; ob != NULL; ob = ob->id.next) {
+      if (ob->soft != NULL) {
+        sbExternalSetDefault(ob->soft);
+      }
+    }
+  }
+
   /**
    * Versioning code until next subversion bump goes here.
    *
diff --git a/source/blender/makesdna/DNA_object_force_types.h b/source/blender/makesdna/DNA_object_force_types.h
index 79717c008be..da9ea45d5d4 100644
--- a/source/blender/makesdna/DNA_object_force_types.h
+++ b/source/blender/makesdna/DNA_object_force_types.h
@@ -193,8 +193,6 @@ typedef struct SBVertex {
   float vec[4];
 } SBVertex;
 
-typedef struct ADMMPDInterfaceData ADMMPDInterfaceData;
-
 /* Container for data that is shared among CoW copies.
  *
  * This is placed in a separate struct so that values can be changed
@@ -214,7 +212,7 @@ typedef struct SoftBody {
   struct BodySpring *bspring;
 
   /* ADMM-PD settings */
-  int solver_mode;               /* 0=admmpd, 1=legacy */
+  int solver_mode;               /* 0=legacy, 0=admmpd */
   int admmpd_mesh_mode;          /* 0=embedded, 1=tetgen, 2=cloth */
   int admmpd_substeps;           /* break time step into smaller bits */
   int admmpd_max_admm_iters;     /* max solver iterations */
@@ -433,8 +431,8 @@ typedef struct SoftBody {
 #define SBC_MODE_AVGMINMAX 4
 
 /* sb->solver_mode */
-#define SOLVER_MODE_ADMMPD 0
-#define SOLVER_MODE_LEGACY 1
+#define SOLVER_MODE_LEGACY 0
+#define SOLVER_MODE_ADMMPD 1
 
 #ifdef __cplusplus
 }



More information about the Bf-blender-cvs mailing list