[Bf-blender-cvs] [337eb4306cb] soc-2021-simulation-display: Physics: Added visualisation for frictional forces, plus some clean-ups to previous commit

soumya pochiraju noreply at git.blender.org
Mon Jun 14 13:21:25 CEST 2021


Commit: 337eb4306cb24b066e86dd70f0d6e25672dbaada
Author: soumya pochiraju
Date:   Sat Jun 12 17:24:17 2021 +0530
Branches: soc-2021-simulation-display
https://developer.blender.org/rB337eb4306cb24b066e86dd70f0d6e25672dbaada

Physics: Added visualisation for frictional forces, plus some clean-ups to previous commit

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

M	intern/rigidbody/RBI_api.h
M	intern/rigidbody/rb_bullet_api.cpp
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/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h
index 81c7c442706..cde25ec8991 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -87,7 +87,10 @@ void RB_dworld_get_impulse(rbDynamicsWorld *world,
                            rbRigidBody *rbo,
                            float timeSubStep,
                            float norm_forces[3][3],
-                           float vec_locations[3][3]);
+                           float fric_forces[3][3],
+                           float vec_locations[3][3],
+                           int norm_flag,
+                           int fric_flag);
 
 /* Simulation ----------------------- */
 
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index 639c4a13c79..20e104b4b49 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -210,26 +210,31 @@ void RB_dworld_get_impulse(rbDynamicsWorld *world,
                            rbRigidBody *rbo,
                            float timeSubStep,
                            float norm_forces[3][3],
-                           float vec_locations[3][3])
+                           float fric_forces[3][3],
+                           float vec_locations[3][3],
+                           int norm_flag,
+                           int fric_flag)
 {
     int numManifolds = world->dispatcher->getNumManifolds();
-    int num_forces = 0;
+    int num_norm_forces = 0;
+    int num_fric_forces = 0;
     for (int i = 0; i < numManifolds; i++)
     {
         btPersistentManifold* contactManifold =  world->dispatcher->getManifoldByIndexInternal(i);
         const void *obA = contactManifold->getBody0();
         const void *obB = contactManifold->getBody1();
-        if(num_forces>2)
+        if(num_norm_forces>2)
           break;
         if(obA != rbo->body && obB != rbo->body)
         {
-          printf("%p,%p,\n",rbo,obA);
           continue;
         }
         else
         {
           btVector3 tot_impulse = btVector3(0.0,0.0,0.0);
           btVector3 final_loc =  btVector3(0.0,0.0,0.0);
+          btScalar tot_impulse_magnitude=0.f;
+          btVector3 tot_lat_impulse = btVector3(0.0,0.0,0.0);
           int numContacts = contactManifold->getNumContacts();
           int num_impulse_points = 0;
           for (int j = 0; j < numContacts; j++)
@@ -245,19 +250,33 @@ void RB_dworld_get_impulse(rbDynamicsWorld *world,
             btManifoldPoint& pt = contactManifold->getContactPoint(j);
             if (pt.getAppliedImpulse() > 0.f)
             {
-               const btVector3& loc = pt.getPositionWorldOnB();
-               const btVector3 lat_imp1 = pt.m_appliedImpulseLateral1 * pt.m_lateralFrictionDir1;
-               const btVector3 lat_imp2 = pt.m_appliedImpulseLateral2 * pt.m_lateralFrictionDir2;
-               printf("%f,%f,%f     %f,%f,%f\n",lat_imp1.getX(),lat_imp1.getY(),lat_imp1.getZ(),lat_imp2.getX(), lat_imp2.getY(),lat_imp2.getZ());
-               const btVector3 imp = (rbo->body == obB)? -pt.m_normalWorldOnB * pt.getAppliedImpulse()/timeSubStep:pt.m_normalWorldOnB * pt.getAppliedImpulse()/timeSubStep;
-
-               tot_impulse += imp;
-               final_loc += num_impulse_points>1 ? loc * pt.getAppliedImpulse() / numContacts : loc;
+                 const btVector3& loc = pt.getPositionWorldOnB();
+                 const btVector3 imp = (rbo->body == obB)? -pt.m_normalWorldOnB * pt.getAppliedImpulse()/timeSubStep:pt.m_normalWorldOnB * pt.getAppliedImpulse()/timeSubStep;
+                 tot_impulse_magnitude += pt.getAppliedImpulse();
+                 tot_impulse += imp;
+                 final_loc += num_impulse_points>1 ? loc * pt.getAppliedImpulse() : loc;
+               if (fric_flag)
+               {
+                   const btVector3 lat_imp1 = (rbo->body == obB)? -pt.m_appliedImpulseLateral1 * pt.m_lateralFrictionDir1/timeSubStep : pt.m_appliedImpulseLateral1 * pt.m_lateralFrictionDir1/timeSubStep;
+                   const btVector3 lat_imp2 = (rbo->body == obB)? -pt.m_appliedImpulseLateral2 * pt.m_lateralFrictionDir2/timeSubStep : pt.m_appliedImpulseLateral2 * pt.m_lateralFrictionDir2/timeSubStep;
+                   tot_lat_impulse += lat_imp1 + lat_imp2;
+               }
             }
           }
-          copy_v3_btvec3(norm_forces[num_forces],tot_impulse);
-          copy_v3_btvec3(vec_locations[num_forces],final_loc);
-          num_forces++;
+
+          if(num_impulse_points >1) final_loc = final_loc / tot_impulse_magnitude;
+          copy_v3_btvec3(vec_locations[num_norm_forces],final_loc);
+          if(norm_flag)
+          {
+            copy_v3_btvec3(norm_forces[num_norm_forces],tot_impulse);
+            num_norm_forces++;
+          }
+          if(fric_flag)
+          {
+            copy_v3_btvec3(fric_forces[num_fric_forces], tot_lat_impulse);
+            printf("%f %f %f\n", tot_lat_impulse.getX(), tot_lat_impulse.getY(),tot_lat_impulse.getZ());
+            num_fric_forces++;
+          }
         }
 
      }
diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index bb3e5710582..4e5939e0337 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -104,8 +104,10 @@ typedef struct PTCacheData {
   float size;
   float times[3];
   struct BoidData boids;
-  struct force_vec eff_forces[3];
-  struct force_vec norm_forces[3];
+  struct sim_data_vec eff_forces[3];
+  struct sim_data_vec norm_forces[3];
+  struct sim_data_vec fric_forces[3];
+  struct sim_data_vec vec_locations[3];
 } PTCacheData;
 
 typedef struct PTCacheFile {
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 27a6773a8a7..8ba6958f08f 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -127,8 +127,10 @@ static int ptcache_data_size[] = {
     sizeof(float),        /* BPHYS_DATA_SIZE */
     sizeof(float[3]),     /* BPHYS_DATA_TIMES */
     sizeof(BoidData),     /* case BPHYS_DATA_BOIDS */
-    sizeof(force_vec[3]), /* BPHYS_DATA_EFF_FORCES */
-    sizeof(force_vec[3]), /* BPHYS_DATA_NORM_FORCES */
+    sizeof(sim_data_vec[3]), /* BPHYS_DATA_EFF_FORCES */
+    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 */
 };
 
 static int ptcache_extra_datasize[] = {
@@ -784,6 +786,8 @@ static int ptcache_rigidbody_write(int index, void *rb_v, void **data, int UNUSE
       PTCACHE_DATA_FROM(data, BPHYS_DATA_ROTATION, rbo->orn);
       PTCACHE_DATA_FROM(data, BPHYS_DATA_EFF_FORCES, rbo->eff_forces);
       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);
     }
   }
 
@@ -813,6 +817,8 @@ static void ptcache_rigidbody_read(
         PTCACHE_DATA_TO(data, BPHYS_DATA_ROTATION, 0, rbo->orn);
         PTCACHE_DATA_TO(data, BPHYS_DATA_EFF_FORCES, 0 ,rbo->eff_forces);
         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);
       }
     }
   }
@@ -1100,7 +1106,7 @@ void BKE_ptcache_id_from_rigidbody(PTCacheID *pid, Object *ob, RigidBodyWorld *r
   pid->write_header = ptcache_basic_header_write;
   pid->read_header = ptcache_basic_header_read;
 
-  pid->data_types = (1 << BPHYS_DATA_LOCATION) | (1 << BPHYS_DATA_ROTATION) | (1 << BPHYS_DATA_EFF_FORCES) | (1 << BPHYS_DATA_NORM_FORCES);
+  pid->data_types = (1 << BPHYS_DATA_LOCATION) | (1 << BPHYS_DATA_ROTATION) | (1 << BPHYS_DATA_EFF_FORCES) |  (1 << BPHYS_DATA_NORM_FORCES) | (1 << BPHYS_DATA_FRIC_FORCES) | (1 << BPHYS_DATA_VEC_LOCATIONS);
   pid->info_types = 0;
 
   pid->stack_index = pid->cache->index;
@@ -1739,7 +1745,9 @@ static void ptcache_file_pointers_init(PTCacheFile *pf)
   pf->cur[BPHYS_DATA_TIMES] = (data_types & (1 << BPHYS_DATA_TIMES)) ? &pf->data.times : NULL;
   pf->cur[BPHYS_DATA_BOIDS] = (data_types & (1 << BPHYS_DATA_BOIDS)) ? &pf->data.boids : NULL;
   pf->cur[BPHYS_DATA_EFF_FORCES] = (data_types & (1 << BPHYS_DATA_EFF_FORCES)) ? &pf->data.eff_forces : NULL;
-  pf->cur[BPHYS_DATA_NORM_FORCES] = (data_types & (1 << BPHYS_DATA_NORM_FORCES)) ? &pf->data.eff_forces : NULL;
+  pf->cur[BPHYS_DATA_NORM_FORCES] = (data_types & (1 << BPHYS_DATA_NORM_FORCES)) ? &pf->data.norm_forces : NULL;
+  pf->cur[BPHYS_DATA_FRIC_FORCES] = (data_types & (1 << BPHYS_DATA_FRIC_FORCES)) ? &pf->data.fric_forces : NULL;
+  pf->cur[BPHYS_DATA_VEC_LOCATIONS] = (data_types & (1 << BPHYS_DATA_VEC_LOCATIONS)) ? &pf->data.vec_locations : 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 ad736d9e16c..634df6aee35 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1286,15 +1286,18 @@ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type)
 
   rbo->col_groups = 1;
 
-  zero_v3(rbo->eff_forces[0].force);
-  zero_v3(rbo->eff_forces[1].force);
-  zero_v3(rbo->eff_forces[2].force);
-  zero_v3(rbo->norm_forces[0].force);
-  zero_v3(rbo->norm_forces[1].force);
-  zero_v3(rbo->norm_forces[2].force);
-  zero_v3(rbo->norm_forces[0].loc);
-  zero_v3(rbo->norm_forces[1].loc);
-  zero_v3(rbo->norm_forces[2].loc);
+  zero_v3(rbo->eff_forces[0].vector);
+  zero_v3(rbo->eff_forces[1].vector);
+  zero_v3(rbo->eff_forces[2].vector);
+  zero_v3(rbo->norm_forces[0].vector);
+  zero_v3(rbo->norm_forces[1].vector);
+  zero_v3(rbo->norm_forces[2].vector);
+  zero_v3(rbo->fric_forces[0].vector);
+  zero_v3(rbo->fric_forces[1].vector);
+  zero_v3(rbo->fric_forces[2].vector);
+  zero_v3(rbo->vec_locations[0].vector);
+  zero_v3(rbo->vec_locations[1].vector);
+  zero_v3(rbo->vec_locations[2].vector);
 
   /* us

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list