[Bf-blender-cvs] [55cf770] particles_refactor: Merge branch 'master' into particles_refactor

Lukas Tönne noreply at git.blender.org
Mon Jul 14 15:03:31 CEST 2014


Commit: 55cf7703fd71f79e3f9ae9e523e27ce33396f276
Author: Lukas Tönne
Date:   Mon Jul 14 14:23:50 2014 +0200
https://developer.blender.org/rB55cf7703fd71f79e3f9ae9e523e27ce33396f276

Merge branch 'master' into particles_refactor

Conflicts:
	source/blender/blenkernel/intern/object.c
	source/blender/blenkernel/intern/rigidbody.c
	source/blender/blenloader/intern/writefile.c
	source/blender/python/intern/bpy_interface.c
	source/creator/CMakeLists.txt

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



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

diff --cc source/blender/blenkernel/BKE_rigidbody.h
index 46a835c,c946f3a..05a6e48
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@@ -60,11 -67,11 +60,14 @@@ struct RigidBodyWorld *BKE_rigidbody_wo
  void BKE_rigidbody_world_groups_relink(struct RigidBodyWorld *rbw);
  
  /* 'validate' (i.e. make new or replace old) Physics-Engine objects */
 +struct rbRigidBody *BKE_rigidbody_body_ensure_alloc(struct RigidBodyWorld *rbw, struct rbRigidBody *body, bool rebuild);
 +void BKE_rigidbody_body_tag_used(struct rbRigidBody *body);
 +void BKE_rigidbody_validate_sim_shape(Object *ob, bool rebuild);
  void BKE_rigidbody_validate_sim_world(struct Scene *scene, struct RigidBodyWorld *rbw, bool rebuild);
  
+ void BKE_rigidbody_calc_volume(struct Object *ob, float *r_vol);
+ void BKE_rigidbody_calc_center_of_mass(struct Object *ob, float r_com[3]);
+ 
  /* -------------- */
  /* Utilities */
  
diff --cc source/blender/blenkernel/intern/object.c
index 7585691,3490bb9..290a9e0
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@@ -98,8 -95,6 +95,7 @@@
  #include "BKE_editmesh.h"
  #include "BKE_mball.h"
  #include "BKE_modifier.h"
- #include "BKE_node.h"
 +#include "BKE_nparticle.h"
  #include "BKE_object.h"
  #include "BKE_paint.h"
  #include "BKE_particle.h"
diff --cc source/blender/blenkernel/intern/rigidbody.c
index d159f49,2aaf8ad..2046fbd
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@@ -47,11 -46,8 +47,9 @@@
  #  include "RBI_api.h"
  #endif
  
- #include "DNA_anim_types.h"
  #include "DNA_group_types.h"
- #include "DNA_mesh_types.h"
  #include "DNA_meshdata_types.h"
 +#include "DNA_nparticle_types.h"
  #include "DNA_object_types.h"
  #include "DNA_object_force.h"
  #include "DNA_rigidbody_types.h"
@@@ -60,11 -56,8 +58,9 @@@
  #include "BKE_cdderivedmesh.h"
  #include "BKE_effect.h"
  #include "BKE_global.h"
- #include "BKE_group.h"
  #include "BKE_library.h"
  #include "BKE_mesh.h"
 +#include "BKE_nparticle.h"
  #include "BKE_object.h"
  #include "BKE_pointcache.h"
  #include "BKE_rigidbody.h"
@@@ -425,124 -456,417 +420,300 @@@ void BKE_rigidbody_validate_sim_shape(O
  
  /* --------------------- */
  
+ /* helper function to calculate volume of rigidbody object */
+ // TODO: allow a parameter to specify method used to calculate this?
+ void BKE_rigidbody_calc_volume(Object *ob, float *r_vol)
+ {
+ 	RigidBodyOb *rbo = ob->rigidbody_object;
+ 
+ 	float size[3]  = {1.0f, 1.0f, 1.0f};
+ 	float radius = 1.0f;
+ 	float height = 1.0f;
+ 
+ 	float volume = 0.0f;
+ 
+ 	/* if automatically determining dimensions, use the Object's boundbox
+ 	 *	- assume that all quadrics are standing upright on local z-axis
+ 	 *	- assume even distribution of mass around the Object's pivot
+ 	 *	  (i.e. Object pivot is centralised in boundbox)
+ 	 *	- boundbox gives full width
+ 	 */
+ 	// XXX: all dimensions are auto-determined now... later can add stored settings for this
+ 	BKE_object_dimensions_get(ob, size);
+ 
+ 	if (ELEM3(rbo->shape, RB_SHAPE_CAPSULE, RB_SHAPE_CYLINDER, RB_SHAPE_CONE)) {
+ 		/* take radius as largest x/y dimension, and height as z-dimension */
+ 		radius = MAX2(size[0], size[1]) * 0.5f;
+ 		height = size[2];
+ 	}
+ 	else if (rbo->shape == RB_SHAPE_SPHERE) {
+ 		/* take radius to the the largest dimension to try and encompass everything */
+ 		radius = max_fff(size[0], size[1], size[2]) * 0.5f;
+ 	}
+ 
+ 	/* calculate volume as appropriate  */
+ 	switch (rbo->shape) {
+ 		case RB_SHAPE_BOX:
+ 			volume = size[0] * size[1] * size[2];
+ 			break;
+ 
+ 		case RB_SHAPE_SPHERE:
+ 			volume = 4.0f / 3.0f * (float)M_PI * radius * radius * radius;
+ 			break;
+ 
+ 		/* for now, assume that capsule is close enough to a cylinder... */
+ 		case RB_SHAPE_CAPSULE:
+ 		case RB_SHAPE_CYLINDER:
+ 			volume = (float)M_PI * radius * radius * height;
+ 			break;
+ 
+ 		case RB_SHAPE_CONE:
+ 			volume = (float)M_PI / 3.0f * radius * radius * height;
+ 			break;
+ 
+ 		case RB_SHAPE_CONVEXH:
+ 		case RB_SHAPE_TRIMESH:
+ 		{
+ 			if (ob->type == OB_MESH) {
+ 				DerivedMesh *dm = rigidbody_get_mesh(ob);
+ 				MVert *mvert;
+ 				MFace *mface;
+ 				int totvert, totface;
+ 				
+ 				/* ensure mesh validity, then grab data */
+ 				if (dm == NULL)
+ 					return;
+ 			
+ 				DM_ensure_tessface(dm);
+ 			
+ 				mvert   = (dm) ? dm->getVertArray(dm) : NULL;
+ 				totvert = (dm) ? dm->getNumVerts(dm) : 0;
+ 				mface   = (dm) ? dm->getTessFaceArray(dm) : NULL;
+ 				totface = (dm) ? dm->getNumTessFaces(dm) : 0;
+ 				
+ 				if (totvert > 0 && totface > 0) {
+ 					BKE_mesh_calc_volume(mvert, totvert, mface, totface, &volume, NULL);
+ 				}
+ 				
+ 				/* cleanup temp data */
+ 				if (dm && ob->rigidbody_object->mesh_source == RBO_MESH_BASE) {
+ 					dm->release(dm);
+ 				}
+ 			}
+ 			else {
+ 				/* rough estimate from boundbox as fallback */
+ 				/* XXX could implement other types of geometry here (curves, etc.) */
+ 				volume = size[0] * size[1] * size[2];
+ 			}
+ 			break;
+ 		}
+ 
+ #if 0 // XXX: not defined yet
+ 		case RB_SHAPE_COMPOUND:
+ 			volume = 0.0f;
+ 			break;
+ #endif
+ 	}
+ 
+ 	/* return the volume calculated */
+ 	if (r_vol) *r_vol = volume;
+ }
+ 
+ void BKE_rigidbody_calc_center_of_mass(Object *ob, float r_com[3])
+ {
+ 	RigidBodyOb *rbo = ob->rigidbody_object;
+ 
+ 	float size[3]  = {1.0f, 1.0f, 1.0f};
+ 	float height = 1.0f;
+ 
+ 	zero_v3(r_com);
+ 
+ 	/* if automatically determining dimensions, use the Object's boundbox
+ 	 *	- assume that all quadrics are standing upright on local z-axis
+ 	 *	- assume even distribution of mass around the Object's pivot
+ 	 *	  (i.e. Object pivot is centralised in boundbox)
+ 	 *	- boundbox gives full width
+ 	 */
+ 	// XXX: all dimensions are auto-determined now... later can add stored settings for this
+ 	BKE_object_dimensions_get(ob, size);
+ 
+ 	/* calculate volume as appropriate  */
+ 	switch (rbo->shape) {
+ 		case RB_SHAPE_BOX:
+ 		case RB_SHAPE_SPHERE:
+ 		case RB_SHAPE_CAPSULE:
+ 		case RB_SHAPE_CYLINDER:
+ 			break;
+ 
+ 		case RB_SHAPE_CONE:
+ 			/* take radius as largest x/y dimension, and height as z-dimension */
+ 			height = size[2];
+ 			/* cone is geometrically centered on the median,
+ 			 * center of mass is 1/4 up from the base
+ 			 */
+ 			r_com[2] = -0.25f * height;
+ 			break;
+ 
+ 		case RB_SHAPE_CONVEXH:
+ 		case RB_SHAPE_TRIMESH:
+ 		{
+ 			if (ob->type == OB_MESH) {
+ 				DerivedMesh *dm = rigidbody_get_mesh(ob);
+ 				MVert *mvert;
+ 				MFace *mface;
+ 				int totvert, totface;
+ 				
+ 				/* ensure mesh validity, then grab data */
+ 				if (dm == NULL)
+ 					return;
+ 			
+ 				DM_ensure_tessface(dm);
+ 			
+ 				mvert   = (dm) ? dm->getVertArray(dm) : NULL;
+ 				totvert = (dm) ? dm->getNumVerts(dm) : 0;
+ 				mface   = (dm) ? dm->getTessFaceArray(dm) : NULL;
+ 				totface = (dm) ? dm->getNumTessFaces(dm) : 0;
+ 				
+ 				if (totvert > 0 && totface > 0) {
+ 					BKE_mesh_calc_volume(mvert, totvert, mface, totface, NULL, r_com);
+ 				}
+ 				
+ 				/* cleanup temp data */
+ 				if (dm && ob->rigidbody_object->mesh_source == RBO_MESH_BASE) {
+ 					dm->release(dm);
+ 				}
+ 			}
+ 			break;
+ 		}
+ 
+ #if 0 // XXX: not defined yet
+ 		case RB_SHAPE_COMPOUND:
+ 			volume = 0.0f;
+ 			break;
+ #endif
+ 	}
+ }
+ 
+ /* --------------------- */
+ 
 -/**
 - * Create physics sim representation of object given RigidBody settings
 - *
 - * \param rebuild Even if an instance already exists, replace it
 - */
 -static void rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, bool rebuild)
 +static rbRigidBody *rigidbody_validate_particle(RigidBodyWorld *rbw, Object *UNUSED(ob),
 +                                                NParticleDisplayDupliObject *dupli, int totdupli,
 +                                                NParticleIterator *iter, bool rebuild)
  {
 -	RigidBodyOb *rbo = (ob) ? ob->rigidbody_object : NULL;
 +	int dupli_index;
 +	NParticleDisplayDupliObject *dob;
  	float loc[3];
  	float rot[4];
 -
 -	/* sanity checks:
 -	 *	- object doesn't have RigidBody info already: then why is it here?
 -	 */
 -	if (rbo == NULL)
 -		return;
 -
 +	rbRigidBody *body;
 +	rbCollisionShape *shape = NULL;
 +	
 +	dupli_index = BKE_nparticle_iter_get_int(iter, "dupli");
 +	if (dupli_index < 0 || dupli_index >= totdupli)
 +		return NULL;
 +	dob = &dupli[dupli_index];
 +	if (!dob->object || !dob->object->rigidbody_object)
 +		return NULL;
 +	
  	/* make sure collision shape exists */
  	/* FIXME we shouldn't always have to rebuild collision shapes when rebuilding objects, but it's needed for constraints to update correctly */
 -	if (rbo->physics_shape == NULL || rebuild)
 -		rigidbody_validate_sim_shape(ob, true);
 -
 -	if (rbo->physics_object && rebuild == false) {
 -		RB_dworld_remove_body(rbw->physics_world, rbo->physics_object);
 -	}
 -	if (!rbo->physics_object || rebuild) {
 -		/* remove rigid body if it already exists before creating a new one */
 -		if (rbo->physics_object) {
 -			RB_body_delete(rbo->physics_object);
 +	if (dob->object->rigidbody_object->physics_shape == NULL || rebuild)
 +		BKE_rigidbody_validate_sim_shape(dob->object, true);
 +	shape = dob->object->rigidbody_object->physics_shape;
 +	
 +	BKE_nparticle_iter_get_vector(iter, "position", loc);
 +	BKE_nparticle_iter_get_quaternion(iter, "rotation", rot);
 +	
 +	body = BKE_nparticle_iter_get_pointer(iter, "rigid_body");
 +	if (!body || rebuild) {
 +		if (body) {
 +			/* free the existing rigid body, memory reused below */
 +			RB_body_free(body);
  		}
 +		else {
 +			/* only allocate if no rigid body exists yet,
 +			 * otherwise previous memory is reused
 +			 */
 +			body = BLI_mempool_alloc(rbw->body_pool);
 +		}
 +	}
 +	else
 +		RB_dworld_remove_body(rbw->physics_world, body);
 +	
 +	RB_body_init(body, shape, loc, rot);
 +	BKE_nparticle_iter_set_pointer(iter, "rigid_body", body);
 +	
 +	RB_body_set_friction(body, 0.5f);
 +	RB_body_set_restitution(body, 0.0f);
  
 -		mat4_to_loc_quat(loc, rot, ob->obmat);
 -
 -		rbo->physics_object = RB_body_new(rbo->physics_shape, loc, rot);
 -
 -		RB_body_set_friction(rbo->physics_object, rbo->friction);
 -		RB_body_set_restitut

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list