forked from Mirrorlandia_minetest/irrlicht
GUIText
a) SpriteBank. error check on non existing textureNumber. Seen in broken Fonts. unified getFrameNr b) CBillboardTextSceneNode. use getOriginalSize git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6368 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
parent
61bc7d3a22
commit
d19d6939d4
@ -32,10 +32,7 @@ CGUISpriteBank::CGUISpriteBank(IGUIEnvironment* env) :
|
|||||||
|
|
||||||
CGUISpriteBank::~CGUISpriteBank()
|
CGUISpriteBank::~CGUISpriteBank()
|
||||||
{
|
{
|
||||||
// drop textures
|
clear();
|
||||||
for (u32 i=0; i<Textures.size(); ++i)
|
|
||||||
if (Textures[i])
|
|
||||||
Textures[i]->drop();
|
|
||||||
|
|
||||||
// drop video driver
|
// drop video driver
|
||||||
if (Driver)
|
if (Driver)
|
||||||
@ -133,15 +130,38 @@ s32 CGUISpriteBank::addTextureAsSprite(video::ITexture* texture)
|
|||||||
return Sprites.size() - 1;
|
return Sprites.size() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get FrameNr for time. return true on exisiting frame
|
||||||
|
inline bool CGUISpriteBank::getFrameNr(u32& frame,u32 index, u32 time, bool loop) const
|
||||||
|
{
|
||||||
|
frame = 0;
|
||||||
|
if (index >= Sprites.size())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const SGUISprite& sprite = Sprites[index];
|
||||||
|
const u32 frameSize = sprite.Frames.size();
|
||||||
|
if (frameSize < 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (sprite.frameTime)
|
||||||
|
{
|
||||||
|
u32 f = (time / sprite.frameTime);
|
||||||
|
if (loop)
|
||||||
|
frame = f % frameSize;
|
||||||
|
else
|
||||||
|
frame = (f >= frameSize) ? frameSize - 1 : f;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//! draws a sprite in 2d with scale and color
|
//! draws a sprite in 2d with scale and color
|
||||||
void CGUISpriteBank::draw2DSprite(u32 index, const core::position2di& pos,
|
void CGUISpriteBank::draw2DSprite(u32 index, const core::position2di& pos,
|
||||||
const core::rect<s32>* clip, const video::SColor& color,
|
const core::rect<s32>* clip, const video::SColor& color,
|
||||||
u32 starttime, u32 currenttime, bool loop, bool center)
|
u32 starttime, u32 currenttime, bool loop, bool center)
|
||||||
{
|
{
|
||||||
if (index >= Sprites.size() || Sprites[index].Frames.empty() )
|
u32 frame = 0;
|
||||||
|
if (!getFrameNr(frame, index, currenttime - starttime, loop))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
u32 frame = getFrameNr(index, currenttime - starttime, loop);
|
|
||||||
const video::ITexture* tex = getTexture(Sprites[index].Frames[frame].textureNumber);
|
const video::ITexture* tex = getTexture(Sprites[index].Frames[frame].textureNumber);
|
||||||
if (!tex)
|
if (!tex)
|
||||||
return;
|
return;
|
||||||
@ -163,10 +183,10 @@ void CGUISpriteBank::draw2DSprite(u32 index, const core::rect<s32>& destRect,
|
|||||||
const core::rect<s32>* clip, const video::SColor * const colors,
|
const core::rect<s32>* clip, const video::SColor * const colors,
|
||||||
u32 timeTicks, bool loop)
|
u32 timeTicks, bool loop)
|
||||||
{
|
{
|
||||||
if (index >= Sprites.size() || Sprites[index].Frames.empty() )
|
u32 frame = 0;
|
||||||
|
if (!getFrameNr(frame,index, timeTicks, loop))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
u32 frame = getFrameNr(index, timeTicks, loop);
|
|
||||||
const video::ITexture* tex = getTexture(Sprites[index].Frames[frame].textureNumber);
|
const video::ITexture* tex = getTexture(Sprites[index].Frames[frame].textureNumber);
|
||||||
if (!tex)
|
if (!tex)
|
||||||
return;
|
return;
|
||||||
@ -201,21 +221,16 @@ void CGUISpriteBank::draw2DSpriteBatch( const core::array<u32>& indices,
|
|||||||
{
|
{
|
||||||
const u32 index = indices[i];
|
const u32 index = indices[i];
|
||||||
|
|
||||||
if (index >= Sprites.size() || Sprites[index].Frames.empty() )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// work out frame number
|
// work out frame number
|
||||||
u32 frame = 0;
|
u32 frame = 0;
|
||||||
if (Sprites[index].frameTime)
|
if (!getFrameNr(frame, index, currenttime - starttime, loop))
|
||||||
{
|
return;
|
||||||
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()-1 : f;
|
|
||||||
}
|
|
||||||
|
|
||||||
const u32 texNum = Sprites[index].Frames[frame].textureNumber;
|
const u32 texNum = Sprites[index].Frames[frame].textureNumber;
|
||||||
|
if (texNum >= drawBatches.size())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
SDrawBatch& currentBatch = drawBatches[texNum];
|
SDrawBatch& currentBatch = drawBatches[texNum];
|
||||||
|
|
||||||
const u32 rn = Sprites[index].Frames[frame].rectNumber;
|
const u32 rn = Sprites[index].Frames[frame].rectNumber;
|
||||||
|
@ -67,19 +67,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
inline u32 getFrameNr(u32 index, u32 time, bool loop) const
|
bool getFrameNr(u32& frameNr, u32 index, u32 time, bool loop) const;
|
||||||
{
|
|
||||||
u32 frame = 0;
|
|
||||||
if (Sprites[index].frameTime && Sprites[index].Frames.size() )
|
|
||||||
{
|
|
||||||
u32 f = (time / Sprites[index].frameTime);
|
|
||||||
if (loop)
|
|
||||||
frame = f % Sprites[index].Frames.size();
|
|
||||||
else
|
|
||||||
frame = (f >= Sprites[index].Frames.size()) ? Sprites[index].Frames.size()-1 : f;
|
|
||||||
}
|
|
||||||
return frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SDrawBatch
|
struct SDrawBatch
|
||||||
{
|
{
|
||||||
|
@ -215,8 +215,9 @@ void CBillboardTextSceneNode::setText(const wchar_t* text)
|
|||||||
u32 rectno = sprites[spriteno].Frames[0].rectNumber;
|
u32 rectno = sprites[spriteno].Frames[0].rectNumber;
|
||||||
u32 texno = sprites[spriteno].Frames[0].textureNumber;
|
u32 texno = sprites[spriteno].Frames[0].textureNumber;
|
||||||
|
|
||||||
dim[0] = core::reciprocal ( (f32) Font->getSpriteBank()->getTexture(texno)->getSize().Width );
|
const core::dimension2d<u32>& texSize = Font->getSpriteBank()->getTexture(texno)->getOriginalSize();
|
||||||
dim[1] = core::reciprocal ( (f32) Font->getSpriteBank()->getTexture(texno)->getSize().Height );
|
dim[0] = core::reciprocal((f32)texSize.Width);
|
||||||
|
dim[1] = core::reciprocal((f32)texSize.Height);
|
||||||
|
|
||||||
const core::rect<s32>& s = sourceRects[rectno];
|
const core::rect<s32>& s = sourceRects[rectno];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user