void Sprite::SetTexture( RageTexture *pTexture ) { ASSERT( pTexture != NULL ); if( m_pTexture != pTexture ) { UnloadTexture(); m_pTexture = pTexture; } ASSERT( m_pTexture->GetTextureWidth() >= 0 ); ASSERT( m_pTexture->GetTextureHeight() >= 0 ); // the size of the sprite is the size of the image before it was scaled Sprite::m_size.x = (float)m_pTexture->GetSourceFrameWidth(); Sprite::m_size.y = (float)m_pTexture->GetSourceFrameHeight(); // apply clipping (if any) if( m_fRememberedClipWidth != -1 && m_fRememberedClipHeight != -1 ) ScaleToClipped( m_fRememberedClipWidth, m_fRememberedClipHeight ); // Load default states if we haven't before. if( m_States.empty() ) LoadStatesFromTexture(); }
bool Sprite::LoadFromTexture( RageTextureID ID ) { LOG->Trace( "Sprite::LoadFromTexture( %s )", ID.filename.c_str() ); if( !m_pTexture || !(m_pTexture->GetID() == ID) ) { /* Load the texture if it's not already loaded. We still need * to do the rest, even if it's the same texture, since we need * to reset Sprite::m_size, etc. */ UnloadTexture(); m_pTexture = TEXTUREMAN->LoadTexture( ID ); ASSERT( m_pTexture->GetTextureWidth() >= 0 ); ASSERT( m_pTexture->GetTextureHeight() >= 0 ); } ASSERT( m_pTexture != NULL ); /* Hack: if we load "_blank", mark the actor hidden, so we can short-circuit * rendering later on. (This helps NoteField rendering.) */ if( !SetExtension(Basename(ID.filename), "").CompareNoCase("_blank") ) this->SetHidden( true ); // the size of the sprite is the size of the image before it was scaled Sprite::m_size.x = (float)m_pTexture->GetSourceFrameWidth(); Sprite::m_size.y = (float)m_pTexture->GetSourceFrameHeight(); // Assume the frames of this animation play in sequential order with 0.1 second delay. m_States.clear(); for( int i=0; i<m_pTexture->GetNumFrames(); i++ ) { State newState = { i, 0.1f }; m_States.push_back( newState ); } // apply clipping (if any) if( m_fRememberedClipWidth != -1 && m_fRememberedClipHeight != -1 ) ScaleToClipped( m_fRememberedClipWidth, m_fRememberedClipHeight ); return true; }