[Bf-blender-cvs] [fddc6bc5e95] soc-2021-simulation-display: Physics: Implemented caching previous velocity of rigid bodies so that acceleration can be calculated.

soumya pochiraju noreply at git.blender.org
Sun Aug 1 16:05:12 CEST 2021


Commit: fddc6bc5e95ab36b52095ca7ec32b445dc8d9ccc
Author: soumya pochiraju
Date:   Sun Aug 1 19:31:03 2021 +0530
Branches: soc-2021-simulation-display
https://developer.blender.org/rBfddc6bc5e95ab36b52095ca7ec32b445dc8d9ccc

Physics: Implemented caching previous velocity of rigid bodies so that acceleration can be calculated.

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

M	source/blender/blenkernel/BKE_pointcache.h
M	source/blender/blenkernel/intern/pointcache.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/draw/engines/overlay/overlay_extra.c
M	source/blender/makesdna/DNA_pointcache_types.h
M	source/blender/makesdna/DNA_rigidbody_types.h

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

diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index a7e8f66e5f3..7a78b78dd36 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -108,6 +108,7 @@ typedef struct PTCacheData {
   struct sim_data_vec norm_forces[3];
   struct sim_data_vec fric_forces[3];
   struct sim_data_vec vec_locations[3];
+  float pvel[3];
 } PTCacheData;
 
 typedef struct PTCacheFile {
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index dcc9f9b2f1d..bee1ff35530 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -131,6 +131,7 @@ static int ptcache_data_size[] = {
     sizeof(sim_data_vec[3]), /* BPHYS_DATA_NORM_FORCES */
     sizeof(sim_data_vec[3]), /* BPHYS_DATA_FRIC_FORCES */
     sizeof(sim_data_vec[3]), /* BPHYS_DATA_VEC_LOCATIONS */
+    sizeof(float[3]),        /* BHYS_DATA_PREV_VELOCITY */
 };
 
 static int ptcache_extra_datasize[] = {
@@ -789,6 +790,8 @@ static int ptcache_rigidbody_write(int index, void *rb_v, void **data, int UNUSE
       PTCACHE_DATA_FROM(data, BPHYS_DATA_NORM_FORCES, rbo->norm_forces);
       PTCACHE_DATA_FROM(data, BPHYS_DATA_FRIC_FORCES, rbo->fric_forces);
       PTCACHE_DATA_FROM(data, BPHYS_DATA_VEC_LOCATIONS, rbo->vec_locations);
+      PTCACHE_DATA_FROM(data, BPHYS_DATA_PREV_VELOCITY, rbo->pvel);
+
     }
   }
 
@@ -814,9 +817,10 @@ static void ptcache_rigidbody_read(
         memcpy(rbo->orn, data + 3, sizeof(float[4]));
         memcpy(rbo->vel, data + 7, sizeof(float[3]));
         memcpy(rbo->eff_forces, data + 10, sizeof(sim_data_vec[3]));
-        memcpy(rbo->norm_forces, data + 13, sizeof(sim_data_vec[3]));
-        memcpy(rbo->fric_forces, data + 16, sizeof(sim_data_vec[3]));
-        memcpy(rbo->vec_locations, data + 19, sizeof(sim_data_vec[3]));
+        memcpy(rbo->norm_forces, data + 19, sizeof(sim_data_vec[3]));
+        memcpy(rbo->fric_forces, data + 28, sizeof(sim_data_vec[3]));
+        memcpy(rbo->vec_locations, data + 37, sizeof(sim_data_vec[3]));
+        memcpy(rbo->pvel, data + 46, sizeof(float[3]));
       }
       else {
         PTCACHE_DATA_TO(data, BPHYS_DATA_LOCATION, 0, rbo->pos);
@@ -826,6 +830,7 @@ static void ptcache_rigidbody_read(
         PTCACHE_DATA_TO(data, BPHYS_DATA_NORM_FORCES, 0, rbo->norm_forces);
         PTCACHE_DATA_TO(data, BPHYS_DATA_FRIC_FORCES, 0, rbo->fric_forces);
         PTCACHE_DATA_TO(data, BPHYS_DATA_VEC_LOCATIONS, 0, rbo->vec_locations);
+        PTCACHE_DATA_TO(data, BPHYS_DATA_PREV_VELOCITY, 0, rbo->pvel);
       }
     }
   }
@@ -1116,7 +1121,7 @@ void BKE_ptcache_id_from_rigidbody(PTCacheID *pid, Object *ob, RigidBodyWorld *r
   pid->data_types = (1 << BPHYS_DATA_LOCATION) | (1 << BPHYS_DATA_ROTATION) |
                     (1 << BPHYS_DATA_VELOCITY) | (1 << BPHYS_DATA_EFF_FORCES) |
                     (1 << BPHYS_DATA_NORM_FORCES) | (1 << BPHYS_DATA_FRIC_FORCES) |
-                    (1 << BPHYS_DATA_VEC_LOCATIONS);
+                    (1 << BPHYS_DATA_VEC_LOCATIONS) | (1<<BPHYS_DATA_PREV_VELOCITY);
   pid->info_types = 0;
 
   pid->stack_index = pid->cache->index;
@@ -1766,6 +1771,9 @@ static void ptcache_file_pointers_init(PTCacheFile *pf)
   pf->cur[BPHYS_DATA_VEC_LOCATIONS] = (data_types & (1 << BPHYS_DATA_VEC_LOCATIONS)) ?
                                           &pf->data.vec_locations :
                                           NULL;
+  pf->cur[BPHYS_DATA_PREV_VELOCITY] = (data_types & (1 << BPHYS_DATA_PREV_VELOCITY)) ?
+                                          &pf->data.pvel :
+                                          NULL;
 }
 
 /* Check to see if point number "index" is in pm, uses binary search for index data. */
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index fe3230f3d23..0ddc9527212 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2438,6 +2438,7 @@ void BKE_rigidbody_do_simulation(Depsgraph *depsgraph, Scene *scene, float ctime
         if (ob->rigidbody_object != NULL) {
           rbRigidBody *rbo = (rbRigidBody *)(ob->rigidbody_object->shared->physics_object);
           /* Get velocity. */
+          copy_v3_v3(ob->rigidbody_object->pvel, ob->rigidbody_object->vel);
           RB_body_get_linear_velocity(rbo, ob->rigidbody_object->vel);
 
           bool norm_flag = (ob->rigidbody_object->display_force_types & RB_SIM_NORMAL) ||
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index aca267574c4..b0a021578eb 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -1800,11 +1800,8 @@ static void OVERLAY_acceleration_extra(OVERLAY_Data *data,
   const float frame_diff = ctime - scene->rigidbody_world->ltime;
   const float timestep = 1.0f / (float)FPS * frame_diff * scene->rigidbody_world->time_scale;
 
-  rbRigidBody *rb = rbo->shared->physics_object;
   float acc[3];
-  RB_body_get_linear_velocity(rb, acc);
-  sub_v3_v3(acc, rbo->vel);
-  RB_body_get_linear_velocity(rb, rbo->vel);
+  sub_v3_v3v3(acc, rbo->pvel, rbo->vel);
   mul_v3_fl(acc, 1 / timestep);
   OVERLAY_vector_extra(data, acc, rbo->pos, scale, min_clamp, color, text_flag);
 }
diff --git a/source/blender/makesdna/DNA_pointcache_types.h b/source/blender/makesdna/DNA_pointcache_types.h
index b5c39acbd53..de420d123c2 100644
--- a/source/blender/makesdna/DNA_pointcache_types.h
+++ b/source/blender/makesdna/DNA_pointcache_types.h
@@ -49,8 +49,9 @@ extern "C" {
 #define BPHYS_DATA_NORM_FORCES 9
 #define BPHYS_DATA_FRIC_FORCES 10
 #define BPHYS_DATA_VEC_LOCATIONS 11
+#define BPHYS_DATA_PREV_VELOCITY 12
 
-#define BPHYS_TOT_DATA 12
+#define BPHYS_TOT_DATA 13
 
 #define BPHYS_EXTRA_FLUID_SPRINGS 1
 #define BPHYS_EXTRA_CLOTH_ACCELERATION 2
diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h
index 700600685f4..5b78c4d35a6 100644
--- a/source/blender/makesdna/DNA_rigidbody_types.h
+++ b/source/blender/makesdna/DNA_rigidbody_types.h
@@ -171,11 +171,13 @@ typedef struct RigidBodyOb {
   char _pad1[4];
   /** This pointer is shared between all evaluated copies. */
   struct RigidBodyOb_Shared *shared;
-  /** Options for display simulation data. */
+
+  /** Options for debug drawing. */
   short sim_display_options;
   short display_force_types;
   char _pad2[4];
 
+  /** Force vectors. */
   sim_data_vec eff_forces[3];
   char _pad3[4];
   sim_data_vec norm_forces[3];
@@ -184,8 +186,11 @@ typedef struct RigidBodyOb {
   char _pad5[4];
   sim_data_vec vec_locations[3];
 
-  /** Velocity, to display sim data */
+  /** Velocity */
   float vel[3];
+  /** Previous velocity, to calculate acceleration. */
+  float pvel[3];
+  char _pad6[4];
 
   Mesh *col_shape_draw_data;



More information about the Bf-blender-cvs mailing list