#include "CGUISpriteBank.h" #include "IGUIEnvironment.h" #include "IVideoDriver.h" #include "ITexture.h" namespace irr { namespace gui { CGUISpriteBank::CGUISpriteBank(IGUIEnvironment* env) : Environment(env), Driver(0) { if (Environment) { Driver = Environment->getVideoDriver(); if (Driver) Driver->grab(); } } CGUISpriteBank::~CGUISpriteBank() { // drop textures for (u32 i=0; idrop(); // drop video driver if (Driver) Driver->drop(); } core::array< core::rect >& CGUISpriteBank::getPositions() { return Rectangles; } core::array< SGUISprite >& CGUISpriteBank::getSprites() { return Sprites; } u32 CGUISpriteBank::getTextureCount() { return Textures.size(); } video::ITexture* CGUISpriteBank::getTexture(u32 index) { if (index < Textures.size()) return Textures[index]; else return 0; } void CGUISpriteBank::addTexture(video::ITexture* texture) { if (texture) texture->grab(); Textures.push_back(texture); } void CGUISpriteBank::setTexture(u32 index, video::ITexture* texture) { while (index > Textures.size()) Textures.push_back(0); if (Textures[index]) Textures[index]->drop(); if (texture) texture->grab(); Textures[index] = texture; } //! draws a sprite in 2d with scale and color void CGUISpriteBank::draw2DSprite(u32 index, const core::position2di& pos, const core::rect* clip, const video::SColor& color, u32 starttime, u32 currenttime, bool loop, bool center) { if (index >= Sprites.size() || Sprites[index].Frames.empty()) return; // work out frame number u32 frame = 0; if (Sprites[index].frameTime) { u32 f = ((currenttime - starttime) / Sprites[index].frameTime); if (loop) frame = f % Sprites[index].Frames.size(); else frame = (f >= Sprites[index].Frames.size()) ? Sprites[index].Frames.size() : f; } video::ITexture* tex = Textures[Sprites[index].Frames[frame].textureNumber]; if (!tex) return; u32 rn = Sprites[index].Frames[frame].rectNumber; if (rn >= Rectangles.size()) return; core::rect &r = Rectangles[rn]; if (center) { core::position2di p = pos; p -= r.getSize() / 2; Driver->draw2DImage(tex, p, r, clip, color, true); } else { Driver->draw2DImage(tex, pos, r, clip, color, true); } } } // namespace gui } // namespace irr