BGE Animations: Shape drivers are now working again.

This commit is contained in:
Mitchell Stokes 2011-06-30 19:33:13 +00:00
parent 038feabedd
commit 12596969af
2 changed files with 17 additions and 39 deletions

@ -44,13 +44,12 @@
#include "RAS_MeshObject.h"
//#include "BL_ArmatureController.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
#include "DNA_action_types.h"
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_ipo_types.h"
#include "DNA_curve_types.h"
#include "BKE_armature.h"
#include "BKE_action.h"
#include "BKE_key.h"
@ -59,6 +58,7 @@
extern "C"{
#include "BKE_lattice.h"
#include "BKE_animsys.h"
}
@ -73,7 +73,8 @@ BL_ShapeDeformer::BL_ShapeDeformer(BL_DeformableGameObject *gameobj,
RAS_MeshObject *mesh)
:
BL_SkinDeformer(gameobj,bmeshobj, mesh),
m_lastShapeUpdate(-1)
m_lastShapeUpdate(-1),
m_useShapeDrivers(false)
{
m_key = m_bmesh->key;
m_bmesh->key = copy_key(m_key);
@ -89,7 +90,8 @@ BL_ShapeDeformer::BL_ShapeDeformer(BL_DeformableGameObject *gameobj,
BL_ArmatureObject* arma)
:
BL_SkinDeformer(gameobj, bmeshobj_old, bmeshobj_new, mesh, release_object, recalc_normal, arma),
m_lastShapeUpdate(-1)
m_lastShapeUpdate(-1),
m_useShapeDrivers(false)
{
m_key = m_bmesh->key;
m_bmesh->key = copy_key(m_key);
@ -121,45 +123,23 @@ void BL_ShapeDeformer::ProcessReplica()
bool BL_ShapeDeformer::LoadShapeDrivers(Object* arma)
{
IpoCurve *icu;
// This used to check if we had drivers from this armature,
// now we just assume we want to use shape drivers
// and let the animsys handle things.
m_useShapeDrivers = true;
m_shapeDrivers.clear();
// check if this mesh has armature driven shape keys
if (m_bmesh->key && m_bmesh->key->ipo) {
for(icu= (IpoCurve*)m_bmesh->key->ipo->curve.first; icu; icu= (IpoCurve*)icu->next) {
if(icu->driver &&
(icu->flag & IPO_MUTE) == 0 &&
icu->driver->type == IPO_DRIVER_TYPE_NORMAL &&
icu->driver->ob == arma &&
icu->driver->blocktype == ID_AR) {
// this shape key ipo curve has a driver on the parent armature
// record this curve in the shape deformer so that the corresponding
m_shapeDrivers.push_back(icu);
}
}
}
return !m_shapeDrivers.empty();
return true;
}
bool BL_ShapeDeformer::ExecuteShapeDrivers(void)
{
if (!m_shapeDrivers.empty() && PoseUpdated()) {
vector<IpoCurve*>::iterator it;
// void *poin;
// int type;
if (m_useShapeDrivers && PoseUpdated()) {
// the shape drivers use the bone matrix as input. Must
// update the matrix now
m_armobj->ApplyPose();
for (it=m_shapeDrivers.begin(); it!=m_shapeDrivers.end(); it++) {
// no need to set a specific time: this curve has a driver
// XXX IpoCurve *icu = *it;
//calc_icu(icu, 1.0f);
//poin = get_ipo_poin((ID*)m_bmesh->key, icu, &type);
//if (poin)
// write_ipo_poin(poin, type, icu->curval);
}
// We don't need an actual time, just use 0
BKE_animsys_evaluate_animdata(&GetKey()->id, GetKey()->adt, 0.f, ADT_RECALC_DRIVERS);
ForceUpdate();
m_armobj->RestorePose();

@ -42,8 +42,6 @@
#include "BL_DeformableGameObject.h"
#include <vector>
struct IpoCurve;
class BL_ShapeDeformer : public BL_SkinDeformer
{
public:
@ -77,9 +75,9 @@ public:
};
protected:
vector<IpoCurve*> m_shapeDrivers;
double m_lastShapeUpdate;
struct Key* m_key;
bool m_useShapeDrivers;
double m_lastShapeUpdate;
struct Key* m_key;
#ifdef WITH_CXX_GUARDEDALLOC