[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