[Bf-blender-cvs] [1ddeff9999b] soc-2021-simulation-display: Physics: Added basic visualisation for collisions, plus some cleanups to the Forces code

soumya pochiraju noreply at git.blender.org
Sat Jun 19 19:32:14 CEST 2021


Commit: 1ddeff9999b8fe979eeb760d0ec2795a6b944b47
Author: soumya pochiraju
Date:   Sat Jun 19 22:59:17 2021 +0530
Branches: soc-2021-simulation-display
https://developer.blender.org/rB1ddeff9999b8fe979eeb760d0ec2795a6b944b47

Physics: Added basic visualisation for collisions, plus some cleanups to the Forces code

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

M	intern/rigidbody/rb_bullet_api.cpp
M	release/datafiles/locale
M	release/scripts/addons
M	release/scripts/addons_contrib
M	release/scripts/startup/bl_ui/properties_physics_rigidbody.py
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_extra.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_shader.c
A	source/blender/draw/engines/overlay/shaders/collision_display_box_vert.glsl
A	source/blender/draw/engines/overlay/shaders/collision_display_cylinder_vert.glsl
M	source/blender/makesdna/DNA_rigidbody_types.h
M	source/blender/makesrna/intern/rna_rigidbody.c
M	source/tools

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

diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index 20e104b4b49..62ea7e302a2 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -274,7 +274,6 @@ void RB_dworld_get_impulse(rbDynamicsWorld *world,
           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++;
           }
         }
@@ -290,6 +289,23 @@ void RB_dworld_step_simulation(rbDynamicsWorld *world,
                                float timeSubStep)
 {
   world->dynamicsWorld->stepSimulation(timeStep, maxSubSteps, timeSubStep);
+  //printf("step\n");
+  int numManifolds = world->dispatcher->getNumManifolds();
+  for (int i = 0; i < numManifolds; i++)
+  {
+      btPersistentManifold* contactManifold =  world->dispatcher->getManifoldByIndexInternal(i);
+      const void *obA = contactManifold->getBody0();
+      const void *obB = contactManifold->getBody1();
+      int numContacts = contactManifold->getNumContacts();
+      for (int j = 0; j < numContacts; j++)
+      {
+        btManifoldPoint& pt = contactManifold->getContactPoint(j);
+        if (pt.getAppliedImpulse() > 0.f)
+        {
+          //printf("%d,%f %f %f\n",j,pt.getPositionWorldOnB().getX(), pt.getPositionWorldOnB().getY(), pt.getPositionWorldOnB().getZ());
+        }
+      }
+  }
 }
 
 /* Export -------------------------- */
diff --git a/release/datafiles/locale b/release/datafiles/locale
index 4833954c0ac..5ab29b1331d 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit 4833954c0ac85cc407e1d5a153aa11b1d1823ec0
+Subproject commit 5ab29b1331d2103dae634b987f121c4599459d7f
diff --git a/release/scripts/addons b/release/scripts/addons
index f86f25e6221..437ce51ab70 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit f86f25e62217264495d05f116ccb09d575fe9841
+Subproject commit 437ce51ab70d18668b699883299ff82d9ed5f4e7
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 5a82baad9f9..7d78c8a63f2 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 5a82baad9f986722104280e8354a4427d8e9eab1
+Subproject commit 7d78c8a63f2f4b146f9327ddc0d567a5921b94ea
diff --git a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
index 827a7b777fd..058fbc5c295 100644
--- a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
+++ b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
@@ -323,6 +323,7 @@ class PHYSICS_PT_rigid_body_display_options(PHYSICS_PT_rigidbody_panel, Panel):
         col.prop(rbo, "display_data_text")
         col.prop(rbo, "display_acceleration")
         col.prop(rbo, "display_velocity")
+        col.prop(rbo, "display_collisions")
 
 class PHYSICS_PT_rigid_body_display_force_types(PHYSICS_PT_rigidbody_panel, Panel):
     bl_label = "Forces"
@@ -356,6 +357,7 @@ class PHYSICS_PT_rigid_body_display_force_types(PHYSICS_PT_rigidbody_panel, Pane
         col.prop(rbo, "show_effectors_force")
         col.prop(rbo, "show_normal_force")
         col.prop(rbo, "show_frictional_force")
+        col.prop(rbo, "show_net_force")
 
 classes = (
     PHYSICS_PT_rigid_body,
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 2b02127265d..68e7ae3148e 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2262,7 +2262,6 @@ void BKE_rigidbody_do_simulation(Depsgraph *depsgraph, Scene *scene, float ctime
     float cur_interp_val = interp_step;
 
     for (int i = 0; i < rbw->substeps_per_frame; i++) {
-      printf("substep%d\n",i);
       rigidbody_update_kinematic_obj_substep(&substep_targets, cur_interp_val);
       RB_dworld_step_simulation(rbw->shared->physics_world, substep, 0, substep);
       cur_interp_val += interp_step;
@@ -2274,8 +2273,11 @@ void BKE_rigidbody_do_simulation(Depsgraph *depsgraph, Scene *scene, float ctime
         Object *ob = rbw->objects[j];
         if(ob->rigidbody_object != NULL){
           rbRigidBody *rbo = (rbRigidBody*)(ob->rigidbody_object->shared->physics_object);
-          int norm_flag = (ob->rigidbody_object->display_force_types & RB_SIM_NORMAL);
-          int fric_flag = (ob->rigidbody_object->display_force_types & RB_SIM_FRICTION);
+          int norm_flag = (ob->rigidbody_object->display_force_types & RB_SIM_NORMAL) ||
+                  (ob->rigidbody_object->display_force_types & RB_SIM_NET_FORCE) ||
+                  (ob->rigidbody_object->sim_display_options & RB_SIM_COLLISIONS);
+          int fric_flag = (ob->rigidbody_object->display_force_types & RB_SIM_FRICTION) ||
+                  (ob->rigidbody_object->display_force_types & RB_SIM_NET_FORCE);
           if(norm_flag || fric_flag){
             RB_dworld_get_impulse(rbw->shared->physics_world, rbo ,substep, norm_forces, fric_forces, vec_locations, norm_flag, fric_flag);
             copy_v3_v3(ob->rigidbody_object->vec_locations[0].vector,vec_locations[0]);
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 388613dfb80..075ad9dd789 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -381,6 +381,8 @@ data_to_c_simple(engines/overlay/shaders/armature_wire_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/armature_wire_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/background_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/clipbound_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/collision_display_box_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/collision_display_cylinder_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/depth_only_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_curve_handle_geom.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_curve_handle_vert.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 4cbfbeccd6c..b7ddd98c52c 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -364,7 +364,8 @@ static void OVERLAY_bounds(OVERLAY_ExtraCallBuffers *cb,
                            Object *ob,
                            const float *color,
                            char boundtype,
-                           bool around_origin)
+                           bool around_origin,
+                           float mat[4][4])
 {
   float center[3], size[3], tmp[4][4], final_mat[4][4];
   BoundBox bb_local;
@@ -441,25 +442,27 @@ static void OVERLAY_bounds(OVERLAY_ExtraCallBuffers *cb,
       DRW_buffer_add_entry(cb->empty_capsule_body, color, final_mat);
       break;
   }
+  if(mat != NULL)
+    copy_m4_m4(mat,tmp);
 }
 
 static void OVERLAY_collision(OVERLAY_ExtraCallBuffers *cb, Object *ob, const float *color)
 {
   switch (ob->rigidbody_object->shape) {
     case RB_SHAPE_BOX:
-      OVERLAY_bounds(cb, ob, color, OB_BOUND_BOX, true);
+      OVERLAY_bounds(cb, ob, color, OB_BOUND_BOX, true, NULL);
       break;
     case RB_SHAPE_SPHERE:
-      OVERLAY_bounds(cb, ob, color, OB_BOUND_SPHERE, true);
+      OVERLAY_bounds(cb, ob, color, OB_BOUND_SPHERE, true, NULL);
       break;
     case RB_SHAPE_CONE:
-      OVERLAY_bounds(cb, ob, color, OB_BOUND_CONE, true);
+      OVERLAY_bounds(cb, ob, color, OB_BOUND_CONE, true, NULL);
       break;
     case RB_SHAPE_CYLINDER:
-      OVERLAY_bounds(cb, ob, color, OB_BOUND_CYLINDER, true);
+      OVERLAY_bounds(cb, ob, color, OB_BOUND_CYLINDER, true, NULL);
       break;
     case RB_SHAPE_CAPSULE:
-      OVERLAY_bounds(cb, ob, color, OB_BOUND_CAPSULE, true);
+      OVERLAY_bounds(cb, ob, color, OB_BOUND_CAPSULE, true, NULL);
       break;
   }
 }
@@ -1566,6 +1569,9 @@ static void OVERLAY_object_name(Object *ob, int theme_id)
 
 static void scale_vec_by_magnitude(float vector[3], float min_clamp, float scale, float pos[3])
 {
+    /* Vectors as scaled by multiplying by Scale and then adding "min_clamp"
+     * Vectors are only drawn if they are greater than 0
+     * Otherwise zero vectors will be drawn with magnitude = min_clamp". */
     float min_clamp_vec[3];
     float vec_len = len_v3(vector);
     normalize_v3(vector);
@@ -1591,7 +1597,7 @@ static void OVERLAY_vector_extra(OVERLAY_Data *data, float vector[3], float pos[
     scale_vec_by_magnitude(vector_head_pos, min_clamp, scale, pos);
 
     GPUShader *sh = OVERLAY_shader_vector();
-    DRWShadingGroup *grp = DRW_shgroup_create(sh, data->psl->extra_ps[0]);
+    DRWShadingGroup *grp = DRW_shgroup_create(sh, data->psl->extra_ps[1]);
     DRW_shgroup_uniform_vec3_copy(grp, "objPosition", pos);
     DRW_shgroup_uniform_vec3_copy(grp, "vector", vector);
     DRW_shgroup_uniform_float_copy(grp, "scale", scale);
@@ -1599,6 +1605,7 @@ static void OVERLAY_vector_extra(OVERLAY_Data *data, float vector[3], float pos[
     DRW_shgroup_uniform_vec3_copy(grp, "colour", color);
     DRW_shgroup_call_procedural_lines(grp, NULL, 3);
 
+    /* Draw magnitude of vector as text */
     if(text_flag)
     {
       struct DRWTextStore *dt = DRW_text_cache_ensure();
@@ -1621,23 +1628,28 @@ static void OVERLAY_forces_extra(OVERLAY_Data *data,
     float scale = 0.05f;
     float min_clamp = 2.0f;
     float vector[3] = {0.0f};
-    float color1[3] = {1.0,0.0,1.0};
-    float color2[3] = {0.0,1.0,0.5};
-    float color3[3] = {1.0,1.0,0.0};
-
-    float net_force[3];
-    copy_v3_v3(net_force, scene->physics_settings.gravity);
-    mul_v3_fl(net_force, rbo->mass);
-    for(int i=0; i<3; i++){
-      add_v3_v3(net_force, rbo->eff_forces[i].vector);
-      add_v3_v3(net_force, rbo->norm_forces[i].vector);
-    }
+    float color1[3] = {1.0,0.0,1.0};   /* Pink. */
+    float color2[3] = {0.0,1.0,0.5};   /* Cyan. */
+    float color3[3] = {1.0,1.0,0.0};   /* Yellow. */
 
     int text_flag = rbo->sim_display_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list