[Bf-blender-cvs] [0ccbeb64f80] soc-2021-simulation-display: Physics: Added visualisation for trimesh collision shape type

soumya pochiraju noreply at git.blender.org
Thu Jul 15 11:17:56 CEST 2021


Commit: 0ccbeb64f80e1dfe2b0609a0494f0bdf466b9b86
Author: soumya pochiraju
Date:   Sun Jul 11 10:22:25 2021 +0530
Branches: soc-2021-simulation-display
https://developer.blender.org/rB0ccbeb64f80e1dfe2b0609a0494f0bdf466b9b86

Physics: Added visualisation for trimesh collision shape type

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

M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/draw/engines/overlay/overlay_extra.c

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 745a4853ac1..a88dd689324 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -461,7 +461,9 @@ static void rigidbody_store_convex_hull_draw_data(Object *ob) {
         int reverse_index = plConvexHullGetReversedLoopIndex(hull, i);
         mloop_src[i].e = edge_index;
         mloop_src[reverse_index].e = edge_index;
+        printf("edge verts:%d %d  loop,rev:%d,%d, edge:%d\n", v_from, v_to, i, reverse_index, (int)edge_index);
         edge_index++;
+
       }
     }
 
@@ -486,6 +488,7 @@ static void rigidbody_store_convex_hull_draw_data(Object *ob) {
         loop->v = src_loop.v;
         loop->e = src_loop.e;
         loop++;
+        printf("loop: v:%d e:%d\n", (int)src_loop.v, (int)src_loop.e);
       }
       j += len;
       MEM_freeN(loops);
@@ -494,6 +497,54 @@ static void rigidbody_store_convex_hull_draw_data(Object *ob) {
     ob->rigidbody_object->col_shape_draw_data = hull_draw_data;
 
 }
+
+static void rigidbody_store_trimesh_draw_data(Object *ob) {
+
+    Mesh *mesh = NULL;
+    Mesh *trimesh_draw_data;
+    MLoop *mloop;
+    const MLoopTri *looptri;
+    int tottri;
+
+
+    int num_verts;
+    int num_loops;
+
+    mesh = rigidbody_get_mesh(ob);
+
+    if(mesh != NULL) {
+        looptri = BKE_mesh_runtime_looptri_ensure(mesh);
+        tottri = mesh->runtime.looptris.len;
+
+        num_verts = mesh->totvert;
+        num_loops = tottri*3;
+        mloop = mesh->mloop;
+
+        trimesh_draw_data = BKE_mesh_new_nomain(num_verts, 0, tottri, num_loops, 0);
+        for(int i=0; i<num_verts; i++){
+            MVert *vert = &(trimesh_draw_data->mvert[i]);
+            copy_v3_v3(vert->co, mesh->mvert[i].co);
+        }
+
+        for (int i = 0; i < tottri; i++) {
+          /* add first triangle - verts 1,2,3 */
+          const MLoopTri *lt = &looptri[i];
+          MFace *face = &(trimesh_draw_data->mface[i]);
+
+          face->v1 = mloop[lt->tri[0]].v;
+          face->v2 = mloop[lt->tri[1]].v;
+          face->v3 = mloop[lt->tri[2]].v;
+
+        }
+        BKE_mesh_convert_mfaces_to_mpolys(trimesh_draw_data);
+        BKE_mesh_calc_edges(trimesh_draw_data, false, false);
+
+        ob->rigidbody_object->col_shape_draw_data = trimesh_draw_data;
+
+    }
+
+}
+
 /* create collision shape of mesh - triangulated mesh
  * returns NULL if creation fails.
  */
@@ -576,6 +627,7 @@ static rbCollisionShape *rigidbody_get_shape_trimesh_from_mesh(Object *ob)
     CLOG_ERROR(&LOG, "cannot make Triangular Mesh collision shape for non-Mesh object");
   }
 
+  rigidbody_store_trimesh_draw_data(ob);
   return shape;
 }
 
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 55ee1b67f51..31e2631b927 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -372,19 +372,17 @@ void OVERLAY_empty_cache_populate(OVERLAY_Data *vedata, Object *ob)
 }
 
 
-static void OVERLAY_convex_hull_collision_shape(OVERLAY_ExtraCallBuffers *cb,
-                                                OVERLAY_Data *data,
-                                                Object *ob)
+static void OVERLAY_non_primitive_collision_shape(OVERLAY_ExtraCallBuffers *cb,
+                                                Object *ob,
+                                                const float *color)
 {
 
-    float color[4] = {0.0f, 0.0f, 0.0f, 1.0f};
     if(ob->rigidbody_object){
-          if(ob->rigidbody_object->col_shape_draw_data){
+          if(ob->rigidbody_object->col_shape_draw_data != NULL){
               const DRWContextState *draw_ctx = DRW_context_state_get();
               DRW_mesh_batch_cache_validate(ob->rigidbody_object->col_shape_draw_data);
 
               GPUBatch *geom = DRW_mesh_batch_cache_get_all_edges(ob->rigidbody_object->col_shape_draw_data);
-
               if(geom){
                   OVERLAY_extra_wire(cb, geom, ob->obmat, color);
               }
@@ -511,7 +509,7 @@ static void OVERLAY_bounds(OVERLAY_ExtraCallBuffers *cb,
     copy_m4_m4(mat, tmp);
 }
 
-static void OVERLAY_collision(OVERLAY_ExtraCallBuffers *cb, OVERLAY_Data *data, Object *ob, const float *color)
+static void OVERLAY_collision(OVERLAY_ExtraCallBuffers *cb, Object *ob, const float *color)
 {
   switch (ob->rigidbody_object->shape) {
     case RB_SHAPE_BOX:
@@ -530,7 +528,11 @@ static void OVERLAY_collision(OVERLAY_ExtraCallBuffers *cb, OVERLAY_Data *data,
       OVERLAY_bounds(cb, ob, color, OB_BOUND_CAPSULE, true, NULL);
       break;
     case RB_SHAPE_CONVEXH:
-      OVERLAY_convex_hull_collision_shape(cb, data, ob);
+      OVERLAY_non_primitive_collision_shape(cb, ob, color);
+      break;
+    case RB_SHAPE_TRIMESH:
+      OVERLAY_non_primitive_collision_shape(cb, ob, color);
+      break;
   }
 }
 
@@ -2114,7 +2116,7 @@ void OVERLAY_extra_cache_populate(OVERLAY_Data *vedata, Object *ob)
         OVERLAY_indicate_collision(vedata, ob);
       }
       else {
-        OVERLAY_collision(cb, vedata, ob, color);
+        OVERLAY_collision(cb, ob, color);
       }
 #ifdef WITH_BULLET
       if (ob->rigidbody_object->sim_display_options & RB_SIM_FORCES)



More information about the Bf-blender-cvs mailing list