diff --git a/Engine/source/T3D/tsStatic.cpp b/Engine/source/T3D/tsStatic.cpp index 78240ce16..6c401e952 100644 --- a/Engine/source/T3D/tsStatic.cpp +++ b/Engine/source/T3D/tsStatic.cpp @@ -520,10 +520,15 @@ void TSStatic::reSkin() void TSStatic::processTick( const Move *move ) { - AssertFatal( mPlayAmbient && mAmbientThread, "TSSTatic::adanceTime called with nothing to play." ); - - if ( isServerObject() ) + if ( isServerObject() && mPlayAmbient && 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 ) @@ -532,14 +537,20 @@ void TSStatic::interpolateTick( F32 delta ) void TSStatic::advanceTime( F32 dt ) { - AssertFatal( mPlayAmbient && mAmbientThread, "TSSTatic::advanceTime called with nothing to play." ); - - mShapeInstance->advanceTime( dt, mAmbientThread ); + if ( mPlayAmbient && mAmbientThread ) + mShapeInstance->advanceTime( dt, mAmbientThread ); + + if ( isMounted() ) + { + MatrixF mat( true ); + mMount.object->getRenderMountTransform( dt, mMount.node, mMount.xfm, &mat ); + setRenderTransform( mat ); + } } void TSStatic::_updateShouldTick() { - bool shouldTick = mPlayAmbient && mAmbientThread; + bool shouldTick = (mPlayAmbient && mAmbientThread) || isMounted(); if ( isTicking() != shouldTick ) setProcessTick( shouldTick ); @@ -708,12 +719,15 @@ void TSStatic::onScaleChanged() else _updatePhysics(); } + + setMaskBits( ScaleMask ); } void TSStatic::setTransform(const MatrixF & mat) { Parent::setTransform(mat); - setMaskBits( TransformMask ); + if ( !isMounted() ) + setMaskBits( TransformMask ); if ( mPhysicsRep ) mPhysicsRep->setTransform( mat ); @@ -734,9 +748,15 @@ U32 TSStatic::packUpdate(NetConnection *con, U32 mask, BitStream *stream) { U32 retMask = Parent::packUpdate(con, mask, stream); - mathWrite( *stream, getTransform() ); - mathWrite( *stream, getScale() ); - stream->writeString( mShapeName ); + if ( stream->writeFlag( mask & TransformMask ) ) + mathWrite( *stream, getTransform() ); + + 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 ) ) stream->write( (U32)mCollisionType ); @@ -744,17 +764,20 @@ U32 TSStatic::packUpdate(NetConnection *con, U32 mask, BitStream *stream) if ( stream->writeFlag( mask & SkinMask ) ) 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( mMeshCulling ); - stream->writeFlag( mUseOriginSort ); + stream->writeFlag( mAllowPlayerStep ); + stream->writeFlag( mMeshCulling ); + 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) ) { @@ -777,14 +800,25 @@ void TSStatic::unpackUpdate(NetConnection *con, BitStream *stream) { Parent::unpackUpdate(con, stream); - MatrixF mat; - Point3F scale; - mathRead( *stream, &mat ); - mathRead( *stream, &scale ); - setScale( scale); - setTransform(mat); + if ( stream->readFlag() ) // TransformMask + { + MatrixF mat; + mathRead( *stream, &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 { @@ -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(); - mMeshCulling = stream->readFlag(); - mUseOriginSort = stream->readFlag(); + stream->read( (U32*)&mDecalType ); - 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(); if (mUseAlphaFade) @@ -1160,6 +1196,19 @@ void TSStaticPolysoupConvex::getFeatures(const MatrixF& mat,const VectorF& n, Co // 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. //They each function a little differently; but achieve the same purpose of gathering diff --git a/Engine/source/T3D/tsStatic.h b/Engine/source/T3D/tsStatic.h index 5bf4b5353..57a7fc695 100644 --- a/Engine/source/T3D/tsStatic.h +++ b/Engine/source/T3D/tsStatic.h @@ -218,6 +218,8 @@ public: void onScaleChanged(); void prepRenderImage( SceneRenderState *state ); 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. MeshType getCollisionType() const { return mCollisionType; }