TSStatic Mounting

This commit is contained in:
OTHGMars 2014-06-16 21:11:15 -04:00 committed by Azaezel
parent 937b8830e1
commit a9f77c4ffd
2 changed files with 83 additions and 32 deletions

View file

@ -520,10 +520,15 @@ void TSStatic::reSkin()
void TSStatic::processTick( const Move *move ) void TSStatic::processTick( const Move *move )
{ {
AssertFatal( mPlayAmbient && mAmbientThread, "TSSTatic::adanceTime called with nothing to play." ); if ( isServerObject() && mPlayAmbient && mAmbientThread )
if ( isServerObject() )
mShapeInstance->advanceTime( TickSec, mAmbientThread ); mShapeInstance->advanceTime( TickSec, mAmbientThread );
if ( isMounted() )
{
MatrixF mat( true );
mMount.object->getMountTransform(mMount.node, mMount.xfm, &mat );
setTransform( mat );
}
} }
void TSStatic::interpolateTick( F32 delta ) void TSStatic::interpolateTick( F32 delta )
@ -532,14 +537,20 @@ void TSStatic::interpolateTick( F32 delta )
void TSStatic::advanceTime( F32 dt ) void TSStatic::advanceTime( F32 dt )
{ {
AssertFatal( mPlayAmbient && mAmbientThread, "TSSTatic::advanceTime called with nothing to play." ); if ( mPlayAmbient && mAmbientThread )
mShapeInstance->advanceTime( dt, mAmbientThread );
mShapeInstance->advanceTime( dt, mAmbientThread ); if ( isMounted() )
{
MatrixF mat( true );
mMount.object->getRenderMountTransform( dt, mMount.node, mMount.xfm, &mat );
setRenderTransform( mat );
}
} }
void TSStatic::_updateShouldTick() void TSStatic::_updateShouldTick()
{ {
bool shouldTick = mPlayAmbient && mAmbientThread; bool shouldTick = (mPlayAmbient && mAmbientThread) || isMounted();
if ( isTicking() != shouldTick ) if ( isTicking() != shouldTick )
setProcessTick( shouldTick ); setProcessTick( shouldTick );
@ -708,12 +719,15 @@ void TSStatic::onScaleChanged()
else else
_updatePhysics(); _updatePhysics();
} }
setMaskBits( ScaleMask );
} }
void TSStatic::setTransform(const MatrixF & mat) void TSStatic::setTransform(const MatrixF & mat)
{ {
Parent::setTransform(mat); Parent::setTransform(mat);
setMaskBits( TransformMask ); if ( !isMounted() )
setMaskBits( TransformMask );
if ( mPhysicsRep ) if ( mPhysicsRep )
mPhysicsRep->setTransform( mat ); mPhysicsRep->setTransform( mat );
@ -734,9 +748,15 @@ U32 TSStatic::packUpdate(NetConnection *con, U32 mask, BitStream *stream)
{ {
U32 retMask = Parent::packUpdate(con, mask, stream); U32 retMask = Parent::packUpdate(con, mask, stream);
mathWrite( *stream, getTransform() ); if ( stream->writeFlag( mask & TransformMask ) )
mathWrite( *stream, getScale() ); mathWrite( *stream, getTransform() );
stream->writeString( mShapeName );
if ( stream->writeFlag( mask & ScaleMask ) )
{
// Only write one bit if the scale is one.
if ( stream->writeFlag( mObjScale != Point3F::One ) )
mathWrite( *stream, mObjScale );
}
if ( stream->writeFlag( mask & UpdateCollisionMask ) ) if ( stream->writeFlag( mask & UpdateCollisionMask ) )
stream->write( (U32)mCollisionType ); stream->write( (U32)mCollisionType );
@ -744,17 +764,20 @@ U32 TSStatic::packUpdate(NetConnection *con, U32 mask, BitStream *stream)
if ( stream->writeFlag( mask & SkinMask ) ) if ( stream->writeFlag( mask & SkinMask ) )
con->packNetStringHandleU( stream, mSkinNameHandle ); con->packNetStringHandleU( stream, mSkinNameHandle );
stream->write( (U32)mDecalType ); if ( stream->writeFlag( mask & AdvancedStaticOptionsMask ) )
{
stream->writeString( mShapeName );
stream->write( (U32)mDecalType );
stream->writeFlag( mAllowPlayerStep ); stream->writeFlag( mAllowPlayerStep );
stream->writeFlag( mMeshCulling ); stream->writeFlag( mMeshCulling );
stream->writeFlag( mUseOriginSort ); stream->writeFlag( mUseOriginSort );
stream->write( mRenderNormalScalar ); stream->write( mRenderNormalScalar );
stream->write( mForceDetail ); stream->write( mForceDetail );
stream->writeFlag( mPlayAmbient ); stream->writeFlag( mPlayAmbient );
if ( stream->writeFlag(mUseAlphaFade) ) if ( stream->writeFlag(mUseAlphaFade) )
{ {
@ -777,14 +800,25 @@ void TSStatic::unpackUpdate(NetConnection *con, BitStream *stream)
{ {
Parent::unpackUpdate(con, stream); Parent::unpackUpdate(con, stream);
MatrixF mat; if ( stream->readFlag() ) // TransformMask
Point3F scale; {
mathRead( *stream, &mat ); MatrixF mat;
mathRead( *stream, &scale ); mathRead( *stream, &mat );
setScale( scale); setTransform(mat);
setTransform(mat); setRenderTransform(mat);
}
mShapeName = stream->readSTString(); if ( stream->readFlag() ) // ScaleMask
{
if ( stream->readFlag() )
{
VectorF scale;
mathRead( *stream, &scale );
setScale( scale );
}
else
setScale( Point3F::One );
}
if ( stream->readFlag() ) // UpdateCollisionMask if ( stream->readFlag() ) // UpdateCollisionMask
{ {
@ -812,17 +846,19 @@ void TSStatic::unpackUpdate(NetConnection *con, BitStream *stream)
} }
} }
stream->read( (U32*)&mDecalType ); if ( stream->readFlag() ) // AdvancedStaticOptionsMask
{
mShapeName = stream->readSTString();
mAllowPlayerStep = stream->readFlag(); stream->read( (U32*)&mDecalType );
mMeshCulling = stream->readFlag();
mUseOriginSort = stream->readFlag();
stream->read( &mRenderNormalScalar ); mAllowPlayerStep = stream->readFlag();
mMeshCulling = stream->readFlag();
mUseOriginSort = stream->readFlag();
stream->read( &mForceDetail ); stream->read( &mRenderNormalScalar );
mPlayAmbient = stream->readFlag(); stream->read( &mForceDetail );
mUseAlphaFade = stream->readFlag(); mUseAlphaFade = stream->readFlag();
if (mUseAlphaFade) if (mUseAlphaFade)
@ -1160,6 +1196,19 @@ void TSStaticPolysoupConvex::getFeatures(const MatrixF& mat,const VectorF& n, Co
// All done! // All done!
} }
void TSStatic::onMount( SceneObject *obj, S32 node )
{
Parent::onMount(obj, node);
_updateShouldTick();
}
void TSStatic::onUnmount( SceneObject *obj, S32 node )
{
Parent::onUnmount( obj, node );
setMaskBits( TransformMask );
_updateShouldTick();
}
//------------------------------------------------------------------------ //------------------------------------------------------------------------
//These functions are duplicated in tsStatic and shapeBase. //These functions are duplicated in tsStatic and shapeBase.
//They each function a little differently; but achieve the same purpose of gathering //They each function a little differently; but achieve the same purpose of gathering

View file

@ -218,6 +218,8 @@ public:
void onScaleChanged(); void onScaleChanged();
void prepRenderImage( SceneRenderState *state ); void prepRenderImage( SceneRenderState *state );
void inspectPostApply(); void inspectPostApply();
virtual void onMount( SceneObject *obj, S32 node );
virtual void onUnmount( SceneObject *obj, S32 node );
/// The type of mesh data use for collision queries. /// The type of mesh data use for collision queries.
MeshType getCollisionType() const { return mCollisionType; } MeshType getCollisionType() const { return mCollisionType; }