\r
CGUISpriteBank::~CGUISpriteBank()\r
{\r
- // drop textures\r
- for (u32 i=0; i<Textures.size(); ++i)\r
- if (Textures[i])\r
- Textures[i]->drop();\r
+ clear();\r
\r
// drop video driver\r
if (Driver)\r
return Sprites.size() - 1;\r
}\r
\r
+// get FrameNr for time. return true on exisiting frame\r
+inline bool CGUISpriteBank::getFrameNr(u32& frame,u32 index, u32 time, bool loop) const\r
+{\r
+ frame = 0;\r
+ if (index >= Sprites.size())\r
+ return false;\r
+\r
+ const SGUISprite& sprite = Sprites[index];\r
+ const u32 frameSize = sprite.Frames.size();\r
+ if (frameSize < 1)\r
+ return false;\r
+\r
+ if (sprite.frameTime)\r
+ {\r
+ u32 f = (time / sprite.frameTime);\r
+ if (loop)\r
+ frame = f % frameSize;\r
+ else\r
+ frame = (f >= frameSize) ? frameSize - 1 : f;\r
+ }\r
+ return true;\r
+}\r
+\r
//! draws a sprite in 2d with scale and color\r
void CGUISpriteBank::draw2DSprite(u32 index, const core::position2di& pos,\r
const core::rect<s32>* clip, const video::SColor& color,\r
u32 starttime, u32 currenttime, bool loop, bool center)\r
{\r
- if (index >= Sprites.size() || Sprites[index].Frames.empty() )\r
+ u32 frame = 0;\r
+ if (!getFrameNr(frame, index, currenttime - starttime, loop))\r
return;\r
\r
- u32 frame = getFrameNr(index, currenttime - starttime, loop);\r
const video::ITexture* tex = getTexture(Sprites[index].Frames[frame].textureNumber);\r
if (!tex)\r
return;\r
const core::rect<s32>* clip, const video::SColor * const colors,\r
u32 timeTicks, bool loop)\r
{\r
- if (index >= Sprites.size() || Sprites[index].Frames.empty() )\r
+ u32 frame = 0;\r
+ if (!getFrameNr(frame,index, timeTicks, loop))\r
return;\r
\r
- u32 frame = getFrameNr(index, timeTicks, loop);\r
const video::ITexture* tex = getTexture(Sprites[index].Frames[frame].textureNumber);\r
if (!tex)\r
return;\r
{\r
const u32 index = indices[i];\r
\r
- if (index >= Sprites.size() || Sprites[index].Frames.empty() )\r
- continue;\r
-\r
// work out frame number\r
u32 frame = 0;\r
- if (Sprites[index].frameTime)\r
- {\r
- u32 f = ((currenttime - starttime) / Sprites[index].frameTime);\r
- if (loop)\r
- frame = f % Sprites[index].Frames.size();\r
- else\r
- frame = (f >= Sprites[index].Frames.size()) ? Sprites[index].Frames.size()-1 : f;\r
- }\r
+ if (!getFrameNr(frame, index, currenttime - starttime, loop))\r
+ return;\r
\r
const u32 texNum = Sprites[index].Frames[frame].textureNumber;\r
+ if (texNum >= drawBatches.size())\r
+ {\r
+ continue;\r
+ }\r
SDrawBatch& currentBatch = drawBatches[texNum];\r
\r
const u32 rn = Sprites[index].Frames[frame].rectNumber;\r