]> git.lizzy.rs Git - irrlicht.git/commitdiff
SpriteBank: error check on non existing textureNumber
authorengineer_apple <engineer_apple@dfc29bdd-3216-0410-991c-e03cc46cb475>
Sun, 1 May 2022 09:50:32 +0000 (09:50 +0000)
committersfan5 <sfan5@live.de>
Fri, 24 Mar 2023 16:09:11 +0000 (17:09 +0100)
seen in broken Fonts. unified getFrameNr

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6368 dfc29bdd-3216-0410-991c-e03cc46cb475

source/Irrlicht/CGUISpriteBank.cpp
source/Irrlicht/CGUISpriteBank.h

index 8f5fb67345e50bea20aa71fab8b225d3ab5916af..6dd7aa3f19638260df34b132b10f52ee2748aaab 100644 (file)
@@ -31,10 +31,7 @@ CGUISpriteBank::CGUISpriteBank(IGUIEnvironment* env) :
 \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
@@ -132,15 +129,38 @@ s32 CGUISpriteBank::addTextureAsSprite(video::ITexture* texture)
        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
@@ -162,10 +182,10 @@ void CGUISpriteBank::draw2DSprite(u32 index, const core::rect<s32>& destRect,
                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
@@ -200,21 +220,16 @@ void CGUISpriteBank::draw2DSpriteBatch(   const core::array<u32>& indices,
        {\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
index affd6bfd3fc2dd6c4d2433a5b3f8fb1387743975..5bd115bc8e65645ec98f13a9acf59109ab6d6b55 100644 (file)
@@ -64,19 +64,7 @@ public:
 \r
 protected:\r
 \r
-       inline u32 getFrameNr(u32 index, u32 time, bool loop) const\r
-       {\r
-               u32 frame = 0;\r
-               if (Sprites[index].frameTime && Sprites[index].Frames.size() )\r
-               {\r
-                       u32 f = (time / 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
-               return frame;\r
-       }\r
+       bool getFrameNr(u32& frameNr, u32 index, u32 time, bool loop) const;\r
 \r
        struct SDrawBatch\r
        {\r