[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