[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57642] branches/soc-2013-rigid_body_sim: rigidbody: Avoid unnecessary reallocations when creating mesh shapes

Sergej Reich sergej.reich at googlemail.com
Fri Jun 21 20:01:17 CEST 2013


Revision: 57642
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57642
Author:   sergof
Date:     2013-06-21 18:01:17 +0000 (Fri, 21 Jun 2013)
Log Message:
-----------
rigidbody: Avoid unnecessary reallocations when creating mesh shapes

Modified Paths:
--------------
    branches/soc-2013-rigid_body_sim/intern/rigidbody/RBI_api.h
    branches/soc-2013-rigid_body_sim/intern/rigidbody/rb_bullet_api.cpp
    branches/soc-2013-rigid_body_sim/source/blender/blenkernel/intern/rigidbody.c

Modified: branches/soc-2013-rigid_body_sim/intern/rigidbody/RBI_api.h
===================================================================
--- branches/soc-2013-rigid_body_sim/intern/rigidbody/RBI_api.h	2013-06-21 18:01:14 UTC (rev 57641)
+++ branches/soc-2013-rigid_body_sim/intern/rigidbody/RBI_api.h	2013-06-21 18:01:17 UTC (rev 57642)
@@ -227,7 +227,7 @@
 /* Setup (Triangle Mesh) ---------- */
 
 /* 1 */
-extern rbMeshData *RB_trimesh_data_new(void);
+extern rbMeshData *RB_trimesh_data_new(int num_tris, int num_verts);
 extern void RB_trimesh_add_triangle(rbMeshData *mesh, const float v1[3], const float v2[3], const float v3[3]);
 /* 2a - Triangle Meshes */
 extern rbCollisionShape *RB_shape_new_trimesh(rbMeshData *mesh);

Modified: branches/soc-2013-rigid_body_sim/intern/rigidbody/rb_bullet_api.cpp
===================================================================
--- branches/soc-2013-rigid_body_sim/intern/rigidbody/rb_bullet_api.cpp	2013-06-21 18:01:14 UTC (rev 57641)
+++ branches/soc-2013-rigid_body_sim/intern/rigidbody/rb_bullet_api.cpp	2013-06-21 18:01:17 UTC (rev 57642)
@@ -752,10 +752,15 @@
  * we get nasty crashes...
  */
 
-rbMeshData *RB_trimesh_data_new()
+rbMeshData *RB_trimesh_data_new(int num_tris, int num_verts)
 {
 	// XXX: welding threshold?
-	return (rbMeshData *) new btTriangleMesh(true, false);
+	btTriangleMesh *mesh = new btTriangleMesh(true, false);
+	
+	mesh->preallocateIndices(num_tris * 3);
+	mesh->preallocateVertices(num_verts);
+	
+	return (rbMeshData *) mesh;
 }
  
 void RB_trimesh_add_triangle(rbMeshData *mesh, const float v1[3], const float v2[3], const float v3[3])

Modified: branches/soc-2013-rigid_body_sim/source/blender/blenkernel/intern/rigidbody.c
===================================================================
--- branches/soc-2013-rigid_body_sim/source/blender/blenkernel/intern/rigidbody.c	2013-06-21 18:01:14 UTC (rev 57641)
+++ branches/soc-2013-rigid_body_sim/source/blender/blenkernel/intern/rigidbody.c	2013-06-21 18:01:17 UTC (rev 57642)
@@ -267,6 +267,7 @@
 		MFace *mface;
 		int totvert;
 		int totface;
+		int tottris = 0;
 
 		/* ensure mesh validity, then grab data */
 		BLI_assert(dm!= NULL); // RB_TODO need to make sure there's no case where deform derived mesh doesn't exist
@@ -285,8 +286,13 @@
 			rbMeshData *mdata;
 			int i;
 
+			/* count triangles */
+			for (i = 0; (i < totface) && (mface); i++) {
+				(mface->v4) ? (tottris += 2) : (tottris += 1);
+			}
+
 			/* init mesh data for collision shape */
-			mdata = RB_trimesh_data_new();
+			mdata = RB_trimesh_data_new(tottris, totvert);
 
 			/* loop over all faces, adding them as triangles to the collision shape
 			 * (so for some faces, more than triangle will get added)




More information about the Bf-blender-cvs mailing list