diff options
author | Sergej Reich <sergej.reich@googlemail.com> | 2013-12-26 20:49:08 +0400 |
---|---|---|
committer | Sergej Reich <sergej.reich@googlemail.com> | 2013-12-26 21:38:06 +0400 |
commit | c96601138dfe08705fd4375527d322176b8fa126 (patch) | |
tree | e9f73027e591774e5a1a90c50730bac966d14df1 /source/blender/blenkernel/intern | |
parent | 2260a7dbc0b6150489832dd94160512d1760fb00 (diff) |
Rigidbody: Use own structure to store mesh data for collision shapes
This gives us better access to the data and should also be faster to
create.
Diffstat (limited to 'source/blender/blenkernel/intern')
-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 * |