Skip to content

Commit

Permalink
GuiSpriteCtrl overhaul
Browse files Browse the repository at this point in the history
These changes make this control functionally similar to the Sprite class.
- fix to set the frame before waking the control
- fix to prevent the frame field from resetting when pushing/popping
- named frame support
- improved animation support
- clone functionality added (parent GuiControl is still missing this though)
  • Loading branch information
lilligreen committed Jul 5, 2014
1 parent 701f147 commit 066ef87
Show file tree
Hide file tree
Showing 3 changed files with 511 additions and 64 deletions.
204 changes: 168 additions & 36 deletions engine/source/2d/gui/guiSpriteCtrl.cc
Expand Up @@ -45,11 +45,16 @@ IMPLEMENT_CONOBJECT(GuiSpriteCtrl);
//-----------------------------------------------------------------------------

GuiSpriteCtrl::GuiSpriteCtrl( void ) :
mImageAssetId( StringTable->EmptyString ),
mAnimationAssetId( StringTable->EmptyString )
mImageAssetId(StringTable->EmptyString),
mImageFrameId(0),
mNamedImageFrameId(StringTable-> EmptyString),
mAnimationAssetId(StringTable->EmptyString)
{
// Set to self ticking.
mSelfTick = true;
// Set to self ticking.
mSelfTick = true;

// Default to static provider.
mStaticProvider = true;
}

//-----------------------------------------------------------------------------
Expand All @@ -65,9 +70,37 @@ void GuiSpriteCtrl::initPersistFields()
// Call parent.
Parent::initPersistFields();

addProtectedField( "Image", TypeAssetId, Offset(mImageAssetId, GuiSpriteCtrl), &setImage, &getImage, &writeImage, "The image asset Id used for the image." );
addProtectedField( "Frame", TypeS32, Offset(mImageFrame, GuiSpriteCtrl), &setImageFrame, &defaultProtectedGetFn, &writeImageFrame, "The image frame used for the image." );
addProtectedField( "Animation", TypeAssetId, Offset(mAnimationAssetId, GuiSpriteCtrl), &setAnimation, &getAnimation, &writeAnimation, "The animation to use.");
addProtectedField("Image", TypeAssetId, Offset(mImageAssetId, GuiSpriteCtrl), &setImage, &defaultProtectedGetFn, &writeImage, "The image asset Id used for the image.");
addProtectedField("Frame", TypeS32, Offset(mImageFrameId, GuiSpriteCtrl), &setImageFrame, &defaultProtectedGetFn, &writeImageFrame, "The image frame used for the image.");
addProtectedField("NamedFrame", TypeString, Offset(mNamedImageFrameId, GuiSpriteCtrl), &setNamedImageFrame, &defaultProtectedGetFn, &writeNamedImageFrame, "The named image frame used for the image");
addProtectedField("Animation", TypeAssetId, Offset(mAnimationAssetId, GuiSpriteCtrl), &setAnimation, &defaultProtectedGetFn, &writeAnimation, "The animation to use.");
}

//------------------------------------------------------------------------------

void GuiSpriteCtrl::copyTo(SimObject* object)
{
// Call to parent.
Parent::copyTo(object);

// Cast to control.
GuiSpriteCtrl* pGuiSpriteCtrl = static_cast<GuiSpriteCtrl*>(object);

// Sanity!
AssertFatal(pGuiSpriteCtrl != NULL, "GuiSpriteCtrl::copyTo() - Object is not the correct type.");

// Copy asset fields.
if ( mImageAssetId != StringTable->EmptyString )
{
if ( !isUsingNamedImageFrame() )
pGuiSpriteCtrl->setImage( getImage(), getImageFrame() );
else
pGuiSpriteCtrl->setImage( getImage(), getNamedImageFrame() );
}
else if ( mAnimationAssetId != StringTable->EmptyString )
{
pGuiSpriteCtrl->setAnimation( getAnimation() );
}
}

//-----------------------------------------------------------------------------
Expand All @@ -81,13 +114,26 @@ bool GuiSpriteCtrl::onWake()
// Are we in static mode?
if ( mImageAssetId != StringTable->EmptyString )
{
// Set image asset.
ImageFrameProvider::setImage( mImageAssetId );
if ( mNamedImageFrameId != StringTable->EmptyString)
{
// Set the image asset and named frame
ImageFrameProvider::setImage( mImageAssetId, mNamedImageFrameId );
}
else
{
// Set image asset and numerical frame.
ImageFrameProvider::setImage( mImageAssetId, mImageFrameId );
}
}
else if ( mAnimationAssetId != StringTable->EmptyString )
{
// Play animation asset.
ImageFrameProvider::setAnimation( mAnimationAssetId );
ImageFrameProvider::setAnimation( mAnimationAssetId );
}
else
{
// Not good, so warn.
Con::warnf("GuiSpriteCtrl::onWake() - No Image or Animation Asset defined.");
}

return true;
Expand All @@ -98,54 +144,138 @@ bool GuiSpriteCtrl::onWake()
void GuiSpriteCtrl::onSleep()
{
// Clear assets.
ImageFrameProvider::clearAssets();
ImageFrameProvider::clearAssets();

// Call parent.
Parent::onSleep();
}

//-----------------------------------------------------------------------------

bool GuiSpriteCtrl::setImage( const char* pImageAssetId )
bool GuiSpriteCtrl::setImage( const char* pImageAssetId, const U32 frame )
{
// Sanity!
AssertFatal( pImageAssetId != NULL, "Cannot use a NULL asset Id." );

// Reset animation.
if ( mAnimationAssetId != StringTable->EmptyString )
mAnimationAssetId = StringTable->EmptyString;

// Fetch the asset Id.
if ( mImageAssetId != pImageAssetId )
mImageAssetId = StringTable->insert(pImageAssetId);

// Set the image frame if the image asset was set.
if ( mImageAssetId != StringTable->EmptyString )
setImageFrame(frame);

// Finish if not awake.
if ( !isAwake() )
return true;

// Call parent.
if ( !ImageFrameProvider::setImage(pImageAssetId, frame) )
return false;

// Update control.
setUpdate();

return true;
}

//-----------------------------------------------------------------------------

bool GuiSpriteCtrl::setImage( const char* pImageAssetId, const char* pNamedFrame )
{
// Sanity!
AssertFatal( pImageAssetId != NULL, "Cannot use a NULL asset Id." );

// Reset animation.
mAnimationAssetId = StringTable->EmptyString;
if ( mAnimationAssetId != StringTable->EmptyString )
mAnimationAssetId = StringTable->EmptyString;

// Fetch the asset Id.
mImageAssetId = StringTable->insert(pImageAssetId);
if ( mImageAssetId != pImageAssetId )
mImageAssetId = StringTable->insert(pImageAssetId);

// Reset image frame.
mImageFrame = 0;
// Set the image frame if the image asset was set.
if ( mImageAssetId != StringTable->EmptyString )
setNamedImageFrame(pNamedFrame);

// Finish if not awake.
// Finish if not awake.
if ( !isAwake() )
return true;
return true;

// Call parent.
if ( !ImageFrameProvider::setImage( pImageAssetId, mImageFrame ) )
return false;
// Call parent.
if ( !ImageFrameProvider::setImage(pImageAssetId, pNamedFrame) )
return false;

// Update control.
setUpdate();

return true;
return true;
}

//-----------------------------------------------------------------------------

bool GuiSpriteCtrl::setImageFrame( const U32 frame )
{
// Call parent.
if ( !ImageFrameProvider::setImageFrame( frame ) )
return false;
// Check Existing Image.
if ( mImageAssetId == StringTable->EmptyString )
{
// Warn.
Con::warnf("GuiSpriteCtrl::setImageFrame() - Cannot set frame without existing asset Id.");

// Return Here.
return false;
}

// Set frame.
mImageFrameId = frame;

// Finish if not awake.
if ( !isAwake() )
return true;

// Call parent.
if ( !ImageFrameProvider::setImageFrame(frame) )
return false;

// Update control.
setUpdate();

return true;
}

//-----------------------------------------------------------------------------

bool GuiSpriteCtrl::setNamedImageFrame( const char* pNamedFrame )
{
// Check Existing Image.
if ( mImageAssetId == StringTable->EmptyString )
{
// Warn.
Con::warnf("GuiSpriteCtrl::setNamedImageFrame() - Cannot set named frame without existing asset Id.");

// Return Here.
return false;
}

// Set named frame.
mNamedImageFrameId = StringTable->insert(pNamedFrame);

// Finish if not awake.
if ( !isAwake() )
return true;

// Call parent.
if ( !ImageFrameProvider::setNamedImageFrame(pNamedFrame) )
return false;

// Update control.
setUpdate();

return true;
return true;
}

//-----------------------------------------------------------------------------
Expand All @@ -155,35 +285,37 @@ bool GuiSpriteCtrl::setAnimation( const char* pAnimationAssetId )
// Sanity!
AssertFatal( pAnimationAssetId != NULL, "Cannot use a NULL asset Id." );

// Fetch the asset Id.
mAnimationAssetId = StringTable->insert(pAnimationAssetId);

// Reset the image asset Id.
mImageAssetId = StringTable->EmptyString;
if ( mImageAssetId != StringTable->EmptyString )
mImageAssetId = StringTable->EmptyString;

// Fetch the asset Id.
if ( mAnimationAssetId != pAnimationAssetId )
mAnimationAssetId = StringTable->insert(pAnimationAssetId);

// Finish if not awake.
if ( !isAwake() )
return true;
return true;

// Play animation asset if it's valid.
if ( mAnimationAssetId != StringTable->EmptyString )
ImageFrameProvider::setAnimation( mAnimationAssetId );
ImageFrameProvider::setAnimation( mAnimationAssetId );

return true;
return true;
}

//-----------------------------------------------------------------------------

void GuiSpriteCtrl::onRender( Point2I offset, const RectI &updateRect)
{
// Call parent.
ImageFrameProvider::renderGui( *this, offset, updateRect );
// Call parent.
ImageFrameProvider::renderGui( *this, offset, updateRect );
}

//------------------------------------------------------------------------------

void GuiSpriteCtrl::onAnimationEnd( void )
{
// Clear assets.
ImageFrameProvider::clearAssets();
ImageFrameProvider::clearAssets();
}
25 changes: 18 additions & 7 deletions engine/source/2d/gui/guiSpriteCtrl.h
Expand Up @@ -36,6 +36,8 @@ class GuiSpriteCtrl : public GuiControl, public ImageFrameProvider

protected:
StringTableEntry mImageAssetId;
U32 mImageFrameId;
StringTableEntry mNamedImageFrameId;
StringTableEntry mAnimationAssetId;

public:
Expand All @@ -46,10 +48,19 @@ class GuiSpriteCtrl : public GuiControl, public ImageFrameProvider
void onRender(Point2I offset, const RectI &updateRect);
static void initPersistFields();

/// Static and Animated Assets.
virtual bool setImage( const char* pImageAssetId );
virtual void copyTo(SimObject* object);

// Static and Animated Assets.
inline bool setImage( const char* pImageAssetId ) { return setImage( pImageAssetId, mImageFrame ); }
virtual bool setImage( const char* pImageAssetId, const U32 frame );
virtual bool setImage( const char* pImageAssetId, const char* pNamedFrame );
inline StringTableEntry getImage( void ) const{ return mImageAssetId; }
virtual bool setImageFrame( const U32 frame );
inline U32 getImageFrame( void ) const { return mImageFrameId; }
virtual bool setNamedImageFrame ( const char* namedFrame );
inline StringTableEntry getNamedImageFrame( void ) const { return mNamedImageFrameId; }
virtual bool setAnimation( const char* pAnimationAssetId );
inline StringTableEntry getAnimation( void ) const { return mAnimationAssetId; }

// Declare type.
DECLARE_CONOBJECT(GuiSpriteCtrl);
Expand All @@ -59,13 +70,13 @@ class GuiSpriteCtrl : public GuiControl, public ImageFrameProvider

protected:
static bool setImage(void* obj, const char* data) { static_cast<GuiSpriteCtrl*>(obj)->setImage( data ); return false; }
static const char* getImage(void* obj, const char* data) { return DYNAMIC_VOID_CAST_TO(GuiSpriteCtrl, ImageFrameProvider, obj)->getImage(); }
static bool writeImage( void* obj, StringTableEntry pFieldName ) { GuiSpriteCtrl* pCastObject = static_cast<GuiSpriteCtrl*>(obj); if ( !pCastObject->isStaticFrameProvider() ) return false; return pCastObject->mImageAssetId != StringTable->EmptyString; }
static bool writeImage(void* obj, StringTableEntry pFieldName) { GuiSpriteCtrl* pCastObject = static_cast<GuiSpriteCtrl*>(obj); if ( !pCastObject->isStaticFrameProvider() ) return false; return pCastObject->mImageAssetId != StringTable->EmptyString; }
static bool setImageFrame(void* obj, const char* data) { static_cast<GuiSpriteCtrl*>(obj)->setImageFrame( dAtoi(data) ); return false; }
static bool writeImageFrame( void* obj, StringTableEntry pFieldName ) { GuiSpriteCtrl* pCastObject = static_cast<GuiSpriteCtrl*>(obj); return pCastObject->isStaticFrameProvider() && pCastObject->getImageFrame() > 0; }
static bool writeImageFrame(void* obj, StringTableEntry pFieldName) { GuiSpriteCtrl* pCastObject = static_cast<GuiSpriteCtrl*>(obj); if ( !pCastObject->isStaticFrameProvider() || pCastObject->isUsingNamedImageFrame() ) return false; return pCastObject->getImageFrame() > 0; }
static bool setNamedImageFrame(void* obj, const char* data) { static_cast<GuiSpriteCtrl*>(obj)->setNamedImageFrame(data); return false; }
static bool writeNamedImageFrame(void* obj, StringTableEntry pFieldName) { GuiSpriteCtrl* pCastObject = static_cast<GuiSpriteCtrl*>(obj); if ( !pCastObject->isStaticFrameProvider() || !pCastObject->isUsingNamedImageFrame() ) return false; return pCastObject->mNamedImageFrameId != StringTable->EmptyString; }
static bool setAnimation(void* obj, const char* data) { static_cast<GuiSpriteCtrl*>(obj)->setAnimation(data); return false; };
static const char* getAnimation(void* obj, const char* data) { return DYNAMIC_VOID_CAST_TO(GuiSpriteCtrl, ImageFrameProvider, obj)->getAnimation(); }
static bool writeAnimation( void* obj, StringTableEntry pFieldName ) { GuiSpriteCtrl* pCastObject = static_cast<GuiSpriteCtrl*>(obj); if ( pCastObject->isStaticFrameProvider() ) return false; return pCastObject->mAnimationAssetId != StringTable->EmptyString; }
static bool writeAnimation(void* obj, StringTableEntry pFieldName) { GuiSpriteCtrl* pCastObject = static_cast<GuiSpriteCtrl*>(obj); if ( pCastObject->isStaticFrameProvider() ) return false; return pCastObject->mAnimationAssetId != StringTable->EmptyString; }
};

#endif //_GUISPRITECTRL_H_

0 comments on commit 066ef87

Please sign in to comment.