[Bf-blender-cvs] [c56fb3d] particles_refactor: Make the btRigidBody a direct component of the rbRigidBody wrapper struct. This avoids one pointer indirection and makes future memory management possible. Requires a constructur/destructor pair to initialize the 'body' member correctly.

Lukas Tönne noreply at git.blender.org
Tue Apr 22 12:06:31 CEST 2014


Commit: c56fb3d108b041df5b9ef6950ef3d15bf1a2b91b
Author: Lukas Tönne
Date:   Tue Dec 31 09:52:16 2013 +0100
https://developer.blender.org/rBc56fb3d108b041df5b9ef6950ef3d15bf1a2b91b

Make the btRigidBody a direct component of the rbRigidBody wrapper
struct. This avoids one pointer indirection and makes future memory
management possible. Requires a constructur/destructor pair to
initialize the 'body' member correctly.

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

M	intern/rigidbody/rb_bullet_api.cpp

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

diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index 7d5654e..074d363 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -83,7 +83,13 @@ struct rbDynamicsWorld {
 };
 
 struct rbRigidBody {
-	btRigidBody *body;
+	rbRigidBody(const btRigidBody::btRigidBodyConstructionInfo& constructionInfo) :
+	    body(constructionInfo)
+	{}
+	~rbRigidBody()
+	{}
+	
+	btRigidBody body;
 	int col_groups;
 };
 
@@ -253,7 +259,7 @@ void RB_dworld_export(rbDynamicsWorld *world, const char *filename)
 
 void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *object, int col_groups)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	object->col_groups = col_groups;
 	
 	world->dynamicsWorld->addRigidBody(body);
@@ -261,7 +267,7 @@ void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *object, int col_gro
 
 void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *object)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	
 	world->dynamicsWorld->removeRigidBody(body);
 }
@@ -273,7 +279,7 @@ void RB_world_convex_sweep_test(
         const float loc_start[3], const float loc_end[3],
         float v_location[3],  float v_hitpoint[3],  float v_normal[3], int *r_hit)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	btCollisionShape *collisionShape = body->getCollisionShape();
 	/* only convex shapes are supported, but user can specify a non convex shape */
 	if (collisionShape->isConvex()) {
@@ -323,7 +329,6 @@ void RB_world_convex_sweep_test(
 
 rbRigidBody *RB_body_new(rbCollisionShape *shape, const float loc[3], const float rot[4])
 {
-	rbRigidBody *object = new rbRigidBody;
 	/* current transform */
 	btTransform trans;
 	trans.setOrigin(btVector3(loc[0], loc[1], loc[2]));
@@ -335,16 +340,15 @@ rbRigidBody *RB_body_new(rbCollisionShape *shape, const float loc[3], const floa
 	/* make rigidbody */
 	btRigidBody::btRigidBodyConstructionInfo rbInfo(1.0f, motionState, shape->cshape);
 	
-	object->body = new btRigidBody(rbInfo);
-	
-	object->body->setUserPointer(object);
+	rbRigidBody *object = new rbRigidBody(rbInfo);
+	object->body.setUserPointer(object);
 	
 	return object;
 }
 
 void RB_body_delete(rbRigidBody *object)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	
 	/* motion state */
 	btMotionState *ms = body->getMotionState();
@@ -362,7 +366,6 @@ void RB_body_delete(rbRigidBody *object)
 		body->removeConstraintRef(con);
 	}
 	
-	delete body;
 	delete object;
 }
 
@@ -370,7 +373,7 @@ void RB_body_delete(rbRigidBody *object)
 
 void RB_body_set_collision_shape(rbRigidBody *object, rbCollisionShape *shape)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	
 	/* set new collision shape */
 	body->setCollisionShape(shape->cshape);
@@ -383,7 +386,7 @@ void RB_body_set_collision_shape(rbRigidBody *object, rbCollisionShape *shape)
 
 float RB_body_get_mass(rbRigidBody *object)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	
 	/* there isn't really a mass setting, but rather 'inverse mass'  
 	 * which we convert back to mass by taking the reciprocal again 
@@ -398,7 +401,7 @@ float RB_body_get_mass(rbRigidBody *object)
 
 void RB_body_set_mass(rbRigidBody *object, float value)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	btVector3 localInertia(0, 0, 0);
 	
 	/* calculate new inertia if non-zero mass */
@@ -414,33 +417,33 @@ void RB_body_set_mass(rbRigidBody *object, float value)
 
 float RB_body_get_friction(rbRigidBody *object)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	return body->getFriction();
 }
 
 void RB_body_set_friction(rbRigidBody *object, float value)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	body->setFriction(value);
 }
 
 
 float RB_body_get_restitution(rbRigidBody *object)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	return body->getRestitution();
 }
 
 void RB_body_set_restitution(rbRigidBody *object, float value)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	body->setRestitution(value);
 }
 
 
 float RB_body_get_linear_damping(rbRigidBody *object)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	return body->getLinearDamping();
 }
 
@@ -451,7 +454,7 @@ void RB_body_set_linear_damping(rbRigidBody *object, float value)
 
 float RB_body_get_angular_damping(rbRigidBody *object)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	return body->getAngularDamping();
 }
 
@@ -462,14 +465,14 @@ void RB_body_set_angular_damping(rbRigidBody *object, float value)
 
 void RB_body_set_damping(rbRigidBody *object, float linear, float angular)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	body->setDamping(linear, angular);
 }
 
 
 float RB_body_get_linear_sleep_thresh(rbRigidBody *object)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	return body->getLinearSleepingThreshold();
 }
 
@@ -480,7 +483,7 @@ void RB_body_set_linear_sleep_thresh(rbRigidBody *object, float value)
 
 float RB_body_get_angular_sleep_thresh(rbRigidBody *object)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	return body->getAngularSleepingThreshold();
 }
 
@@ -491,7 +494,7 @@ void RB_body_set_angular_sleep_thresh(rbRigidBody *object, float value)
 
 void RB_body_set_sleep_thresh(rbRigidBody *object, float linear, float angular)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	body->setSleepingThresholds(linear, angular);
 }
 
@@ -499,14 +502,14 @@ void RB_body_set_sleep_thresh(rbRigidBody *object, float linear, float angular)
 
 void RB_body_get_linear_velocity(rbRigidBody *object, float v_out[3])
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	
 	copy_v3_btvec3(v_out, body->getLinearVelocity());
 }
 
 void RB_body_set_linear_velocity(rbRigidBody *object, const float v_in[3])
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	
 	body->setLinearVelocity(btVector3(v_in[0], v_in[1], v_in[2]));
 }
@@ -514,27 +517,27 @@ void RB_body_set_linear_velocity(rbRigidBody *object, const float v_in[3])
 
 void RB_body_get_angular_velocity(rbRigidBody *object, float v_out[3])
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	
 	copy_v3_btvec3(v_out, body->getAngularVelocity());
 }
 
 void RB_body_set_angular_velocity(rbRigidBody *object, const float v_in[3])
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	
 	body->setAngularVelocity(btVector3(v_in[0], v_in[1], v_in[2]));
 }
 
 void RB_body_set_linear_factor(rbRigidBody *object, float x, float y, float z)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	body->setLinearFactor(btVector3(x, y, z));
 }
 
 void RB_body_set_angular_factor(rbRigidBody *object, float x, float y, float z)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	body->setAngularFactor(btVector3(x, y, z));
 }
 
@@ -542,7 +545,7 @@ void RB_body_set_angular_factor(rbRigidBody *object, float x, float y, float z)
 
 void RB_body_set_kinematic_state(rbRigidBody *object, int kinematic)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	if (kinematic)
 		body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
 	else
@@ -553,7 +556,7 @@ void RB_body_set_kinematic_state(rbRigidBody *object, int kinematic)
 
 void RB_body_set_activation_state(rbRigidBody *object, int use_deactivation)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	if (use_deactivation)
 		body->forceActivationState(ACTIVE_TAG);
 	else
@@ -561,12 +564,12 @@ void RB_body_set_activation_state(rbRigidBody *object, int use_deactivation)
 }
 void RB_body_activate(rbRigidBody *object)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	body->setActivationState(ACTIVE_TAG);
 }
 void RB_body_deactivate(rbRigidBody *object)
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	body->setActivationState(ISLAND_SLEEPING);
 }
 
@@ -582,7 +585,7 @@ void RB_body_deactivate(rbRigidBody *object)
 
 void RB_body_get_transform_matrix(rbRigidBody *object, float m_out[4][4])
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	btMotionState *ms = body->getMotionState();
 	
 	btTransform trans;
@@ -593,7 +596,7 @@ void RB_body_get_transform_matrix(rbRigidBody *object, float m_out[4][4])
 
 void RB_body_set_loc_rot(rbRigidBody *object, const float loc[3], const float rot[4])
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	btMotionState *ms = body->getMotionState();
 	
 	/* set transform matrix */
@@ -606,7 +609,7 @@ void RB_body_set_loc_rot(rbRigidBody *object, const float loc[3], const float ro
 
 void RB_body_set_scale(rbRigidBody *object, const float scale[3])
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	
 	/* apply scaling factor from matrix above to the collision shape */
 	btCollisionShape *cshape = body->getCollisionShape();
@@ -624,14 +627,14 @@ void RB_body_set_scale(rbRigidBody *object, const float scale[3])
 
 void RB_body_get_position(rbRigidBody *object, float v_out[3])
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	
 	copy_v3_btvec3(v_out, body->getWorldTransform().getOrigin());
 }
 
 void RB_body_get_orientation(rbRigidBody *object, float v_out[4])
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	
 	copy_quat_btquat(v_out, body->getWorldTransform().getRotation());
 }
@@ -641,7 +644,7 @@ void RB_body_get_orientation(rbRigidBody *object, float v_out[4])
 
 void RB_body_apply_central_force(rbRigidBody *object, const float v_in[3])
 {
-	btRigidBody *body = object->body;
+	btRigidBody *body = &object->body;
 	
 	body->applyCentralForce(btVector3(v_in[0], v_in[1], v_in[2]));
 }
@@ -864,8 +867,8 @

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list