Converted Rigid Body from DerivedMesh to Mesh

This commit is contained in:
Sybren A. Stüvel 2018-06-15 10:45:08 +02:00
parent 5073ee0bb2
commit 84c91a87a9
1 changed files with 38 additions and 53 deletions

View File

@ -48,13 +48,13 @@
#include "DNA_ID.h"
#include "DNA_group_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force_types.h"
#include "DNA_rigidbody_types.h"
#include "DNA_scene_types.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_collection.h"
#include "BKE_effect.h"
#include "BKE_global.h"
@ -62,6 +62,7 @@
#include "BKE_library.h"
#include "BKE_library_query.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
#include "BKE_object.h"
#include "BKE_pointcache.h"
#include "BKE_rigidbody.h"
@ -235,16 +236,18 @@ RigidBodyCon *BKE_rigidbody_copy_constraint(const Object *ob, const int UNUSED(f
/* Setup Utilities - Validate Sim Instances */
/* get the appropriate DerivedMesh based on rigid body mesh source */
static DerivedMesh *rigidbody_get_mesh(Object *ob)
static Mesh *rigidbody_get_mesh(Object *ob)
{
/* TODO(Sybren): turn this into a switch statement */
if (ob->rigidbody_object->mesh_source == RBO_MESH_DEFORM) {
return ob->derivedDeform;
return ob->runtime.mesh_deform_eval;
}
else if (ob->rigidbody_object->mesh_source == RBO_MESH_FINAL) {
return ob->derivedFinal;
return ob->runtime.mesh_eval;
}
else {
return CDDM_from_mesh(ob->data);
BLI_assert(ob->rigidbody_object->mesh_source == RBO_MESH_BASE);
return ob->data;
}
}
@ -252,14 +255,14 @@ static DerivedMesh *rigidbody_get_mesh(Object *ob)
static rbCollisionShape *rigidbody_get_shape_convexhull_from_mesh(Object *ob, float margin, bool *can_embed)
{
rbCollisionShape *shape = NULL;
DerivedMesh *dm = NULL;
Mesh *mesh = NULL;
MVert *mvert = NULL;
int totvert = 0;
if (ob->type == OB_MESH && ob->data) {
dm = rigidbody_get_mesh(ob);
mvert = (dm) ? dm->getVertArray(dm) : NULL;
totvert = (dm) ? dm->getNumVerts(dm) : 0;
mesh = rigidbody_get_mesh(ob);
mvert = (mesh) ? mesh->mvert : NULL;
totvert = (mesh) ? mesh->totvert : 0;
}
else {
printf("ERROR: cannot make Convex Hull collision shape for non-Mesh object\n");
@ -272,9 +275,6 @@ static rbCollisionShape *rigidbody_get_shape_convexhull_from_mesh(Object *ob, fl
printf("ERROR: no vertices to define Convex Hull collision shape with\n");
}
if (dm && ob->rigidbody_object->mesh_source == RBO_MESH_BASE)
dm->release(dm);
return shape;
}
@ -286,24 +286,24 @@ static rbCollisionShape *rigidbody_get_shape_trimesh_from_mesh(Object *ob)
rbCollisionShape *shape = NULL;
if (ob->type == OB_MESH) {
DerivedMesh *dm = NULL;
Mesh *mesh = NULL;
MVert *mvert;
const MLoopTri *looptri;
int totvert;
int tottri;
const MLoop *mloop;
dm = rigidbody_get_mesh(ob);
mesh = rigidbody_get_mesh(ob);
/* ensure mesh validity, then grab data */
if (dm == NULL)
if (mesh == NULL)
return NULL;
mvert = dm->getVertArray(dm);
totvert = dm->getNumVerts(dm);
looptri = dm->getLoopTriArray(dm);
tottri = dm->getNumLoopTri(dm);
mloop = dm->getLoopArray(dm);
mvert = mesh->mvert;
totvert = mesh->totvert;
looptri = BKE_mesh_runtime_looptri_ensure(mesh);
tottri = mesh->runtime.looptris.len;
mloop = mesh->mloop;
/* sanity checking - potential case when no data will be present */
if ((totvert == 0) || (tottri == 0)) {
@ -353,11 +353,6 @@ static rbCollisionShape *rigidbody_get_shape_trimesh_from_mesh(Object *ob)
shape = RB_shape_new_gimpact_mesh(mdata);
}
}
/* cleanup temp data */
if (ob->rigidbody_object->mesh_source == RBO_MESH_BASE) {
dm->release(dm);
}
}
else {
printf("ERROR: cannot make Triangular Mesh collision shape for non-Mesh object\n");
@ -520,30 +515,25 @@ void BKE_rigidbody_calc_volume(Object *ob, float *r_vol)
case RB_SHAPE_TRIMESH:
{
if (ob->type == OB_MESH) {
DerivedMesh *dm = rigidbody_get_mesh(ob);
Mesh *mesh = rigidbody_get_mesh(ob);
MVert *mvert;
const MLoopTri *lt = NULL;
int totvert, tottri = 0;
const MLoop *mloop = NULL;
/* ensure mesh validity, then grab data */
if (dm == NULL)
if (mesh == NULL)
return;
mvert = dm->getVertArray(dm);
totvert = dm->getNumVerts(dm);
lt = dm->getLoopTriArray(dm);
tottri = dm->getNumLoopTri(dm);
mloop = dm->getLoopArray(dm);
mvert = mesh->mvert;
totvert = mesh->totvert;
lt = BKE_mesh_runtime_looptri_ensure(mesh);
tottri = mesh->runtime.looptris.len;
mloop = mesh->mloop;
if (totvert > 0 && tottri > 0) {
BKE_mesh_calc_volume(mvert, totvert, lt, tottri, mloop, &volume, NULL);
}
/* cleanup temp data */
if (ob->rigidbody_object->mesh_source == RBO_MESH_BASE) {
dm->release(dm);
}
}
else {
/* rough estimate from boundbox as fallback */
@ -603,30 +593,25 @@ void BKE_rigidbody_calc_center_of_mass(Object *ob, float r_center[3])
case RB_SHAPE_TRIMESH:
{
if (ob->type == OB_MESH) {
DerivedMesh *dm = rigidbody_get_mesh(ob);
Mesh *mesh = rigidbody_get_mesh(ob);
MVert *mvert;
const MLoopTri *looptri;
int totvert, tottri;
const MLoop *mloop;
/* ensure mesh validity, then grab data */
if (dm == NULL)
if (mesh == NULL)
return;
mvert = dm->getVertArray(dm);
totvert = dm->getNumVerts(dm);
looptri = dm->getLoopTriArray(dm);
tottri = dm->getNumLoopTri(dm);
mloop = dm->getLoopArray(dm);
mvert = mesh->mvert;
totvert = mesh->totvert;
looptri = BKE_mesh_runtime_looptri_ensure(mesh);
tottri = mesh->runtime.looptris.len;
mloop = mesh->mloop;
if (totvert > 0 && tottri > 0) {
BKE_mesh_calc_volume(mvert, totvert, looptri, tottri, mloop, NULL, r_center);
}
/* cleanup temp data */
if (ob->rigidbody_object->mesh_source == RBO_MESH_BASE) {
dm->release(dm);
}
}
break;
}
@ -1255,10 +1240,10 @@ static void rigidbody_update_sim_ob(Depsgraph *depsgraph, Scene *scene, RigidBod
return;
if (rbo->shape == RB_SHAPE_TRIMESH && rbo->flag & RBO_FLAG_USE_DEFORM) {
DerivedMesh *dm = ob->derivedDeform;
if (dm) {
MVert *mvert = dm->getVertArray(dm);
int totvert = dm->getNumVerts(dm);
Mesh *mesh = ob->runtime.mesh_deform_eval;
if (mesh) {
MVert *mvert = mesh->mvert;
int totvert = mesh->totvert;
BoundBox *bb = BKE_object_boundbox_get(ob);
RB_shape_trimesh_update(rbo->physics_shape, (float *)mvert, totvert, sizeof(MVert), bb->vec[0], bb->vec[6]);