Fix for Issue #96 for DAE updating crash

This commit is contained in:
DavidWyand-GG 2012-10-17 14:45:13 -04:00
parent 9ed0f467d8
commit 89ad23a925
4 changed files with 22 additions and 2 deletions

View file

@ -42,6 +42,8 @@ class PhysicsWorld
{
protected:
Signal<void()> mStaticChangedSignal;
Signal<void()> mUpdateSignal;
/// The current gravity force.
@ -58,6 +60,9 @@ public:
///
Signal<void()>& getUpdateSignal() { return mUpdateSignal; }
// Called when a static body in the scene has been removed.
Signal<void()>& getStaticChangedSignal() { return mStaticChangedSignal; }
/// Overloaded to do debug drawing.
///
/// It is assumed the GFX state is setup prior to this call for

View file

@ -53,7 +53,8 @@ void PxPlayer::_releaseController()
if ( mController )
{
mController->getActor()->userData = NULL;
mWorld->releaseController( *mController );
mWorld->getStaticChangedSignal().remove( this, &PxPlayer::_onStaticChanged );
mWorld->releaseController( *mController );
mController = NULL;
}
}
@ -99,6 +100,8 @@ void PxPlayer::init( const char *type,
//mOriginOffset = 1.0f;
}
mWorld->getStaticChangedSignal().notify( this, &PxPlayer::_onStaticChanged );
// Put the kinematic actor on group 29.
NxActor *kineActor = mController->getActor();
kineActor->setGroup( 29 );
@ -110,6 +113,11 @@ void PxPlayer::init( const char *type,
kineActor->userData = &mUserData;
}
void PxPlayer::_onStaticChanged()
{
mController->reportSceneChanged();
}
void PxPlayer::_onPhysicsReset( PhysicsResetEvent reset )
{
// The PhysX controller will crash out if it doesn't clear its

View file

@ -71,6 +71,8 @@ protected:
void _onPhysicsReset( PhysicsResetEvent reset );
void _onStaticChanged();
public:
PxPlayer();

View file

@ -569,9 +569,11 @@ void PxWorld::_releaseQueues()
mReleaseJointQueue.clear();
// Now release any actors still pending in the queue.
bool staticChanged = false;
for ( S32 i = 0; i < mReleaseActorQueue.size(); i++ )
{
NxActor *currActor = mReleaseActorQueue[i];
NxActor *currActor = mReleaseActorQueue[i];
staticChanged |= !currActor->isDynamic();
mScene->releaseActor( *currActor );
}
@ -618,6 +620,9 @@ void PxWorld::_releaseQueues()
mScene->releaseFluid( *currFluid );
}
mReleaseFluidQueue.clear();
if ( staticChanged )
mStaticChangedSignal.trigger();
}
void PxWorld::setEnabled( bool enabled )