diff options
Diffstat (limited to 'source/blender/blenkernel/intern/rigidbody.c')
-rw-r--r-- | source/blender/blenkernel/intern/rigidbody.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index fa455fad090..22126b7e45d 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -282,6 +282,8 @@ static rbCollisionShape *rigidbody_get_shape_trimesh_from_mesh(Object *ob) MFace *mface; int totvert; int totface; + int tottris = 0; + int triangle_index = 0; dm = rigidbody_get_mesh(ob); @@ -303,32 +305,32 @@ static rbCollisionShape *rigidbody_get_shape_trimesh_from_mesh(Object *ob) else { rbMeshData *mdata; int i; + + /* count triangles */ + for (i = 0; i < totface; i++) { + (mface[i].v4) ? (tottris += 2) : (tottris += 1); + } /* init mesh data for collision shape */ - mdata = RB_trimesh_data_new(); + mdata = RB_trimesh_data_new(tottris, totvert); + + RB_trimesh_add_vertices(mdata, (float*)mvert, totvert, sizeof(MVert)); /* loop over all faces, adding them as triangles to the collision shape * (so for some faces, more than triangle will get added) */ for (i = 0; (i < totface) && (mface) && (mvert); i++, mface++) { /* add first triangle - verts 1,2,3 */ - { - MVert *va = (mface->v1 < totvert) ? (mvert + mface->v1) : (mvert); - MVert *vb = (mface->v2 < totvert) ? (mvert + mface->v2) : (mvert); - MVert *vc = (mface->v3 < totvert) ? (mvert + mface->v3) : (mvert); - - RB_trimesh_add_triangle(mdata, va->co, vb->co, vc->co); - } + RB_trimesh_add_triangle_indices(mdata, triangle_index, mface->v1, mface->v2, mface->v3); + triangle_index++; /* add second triangle if needed - verts 1,3,4 */ if (mface->v4) { - MVert *va = (mface->v1 < totvert) ? (mvert + mface->v1) : (mvert); - MVert *vb = (mface->v3 < totvert) ? (mvert + mface->v3) : (mvert); - MVert *vc = (mface->v4 < totvert) ? (mvert + mface->v4) : (mvert); - - RB_trimesh_add_triangle(mdata, va->co, vb->co, vc->co); + RB_trimesh_add_triangle_indices(mdata, triangle_index, mface->v1, mface->v3, mface->v4); + triangle_index++; } } + RB_trimesh_finish(mdata); /* construct collision shape * |