mirror of
https://github.com/vcmi/vcmi.git
synced 2025-02-09 13:14:02 +02:00
faster and better creature animation handling (almost finished!)
This commit is contained in:
parent
b3c69fe838
commit
bd7cf60f13
@ -783,10 +783,10 @@ int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker
|
|||||||
//frame number increased
|
//frame number increased
|
||||||
|
|
||||||
long BaseOffset,
|
long BaseOffset,
|
||||||
SpriteWidth, SpriteHeight, //format sprite'a
|
SpriteWidth, SpriteHeight, //sprite format
|
||||||
LeftMargin, RightMargin, TopMargin,BottomMargin,
|
LeftMargin, RightMargin, TopMargin,BottomMargin,
|
||||||
i, add, FullHeight,FullWidth,
|
i, add, FullHeight,FullWidth,
|
||||||
TotalRowLength, // dlugosc przeczytanego segmentu
|
TotalRowLength, // length of read segment
|
||||||
NextSpriteOffset, RowAdd;
|
NextSpriteOffset, RowAdd;
|
||||||
unsigned char SegmentType, SegmentLength;
|
unsigned char SegmentType, SegmentLength;
|
||||||
|
|
||||||
@ -808,17 +808,6 @@ int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker
|
|||||||
|
|
||||||
int ftcp = 0;
|
int ftcp = 0;
|
||||||
|
|
||||||
SDL_Surface * hlps = SDL_CreateRGBSurface(dest->flags, FullWidth+add, FullHeight, 8, 0, 0, 0, 0);
|
|
||||||
|
|
||||||
for(int b=0; b<256; ++b)
|
|
||||||
{
|
|
||||||
hlps->format->palette->ncolors = 256;
|
|
||||||
hlps->format->palette->colors[b].r = palette[b].R;
|
|
||||||
hlps->format->palette->colors[b].g = palette[b].G;
|
|
||||||
hlps->format->palette->colors[b].b = palette[b].B;
|
|
||||||
hlps->format->palette->colors[b].unused = palette[b].F;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (defType2==1) //as it should be allways in creature animations
|
if (defType2==1) //as it should be allways in creature animations
|
||||||
{
|
{
|
||||||
if (TopMargin>0)
|
if (TopMargin>0)
|
||||||
@ -849,8 +838,13 @@ int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker
|
|||||||
{
|
{
|
||||||
for (int k=0;k<=SegmentLength;k++)
|
for (int k=0;k<=SegmentLength;k++)
|
||||||
{
|
{
|
||||||
((char*)(hlps->pixels))[ftcp++]=FDef[BaseOffset+k];
|
int xB = (attacker ? ftcp%(FullWidth+add) : (FullWidth+add) - ftcp%(FullWidth+add) - 1) + x;
|
||||||
//putPixel(dest, ftcp++, palette[FDef[BaseOffset+k]], FDef[BaseOffset+k]);
|
int yB = ftcp/(FullWidth+add) + y;
|
||||||
|
if(xB>=0 && yB>=0 && xB<dest->w && yB<dest->h)
|
||||||
|
{
|
||||||
|
putPixel(dest, xB + yB*dest->w, palette[FDef[BaseOffset+k]], FDef[BaseOffset+k]);
|
||||||
|
}
|
||||||
|
ftcp++; //increment pos
|
||||||
if ((TotalRowLength+k+1)>=SpriteWidth)
|
if ((TotalRowLength+k+1)>=SpriteWidth)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -861,8 +855,13 @@ int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker
|
|||||||
{
|
{
|
||||||
for (int k=0;k<SegmentLength+1;k++)
|
for (int k=0;k<SegmentLength+1;k++)
|
||||||
{
|
{
|
||||||
((char*)(hlps->pixels))[ftcp++]=SegmentType;
|
int xB = (attacker ? ftcp%(FullWidth+add) : (FullWidth+add) - ftcp%(FullWidth+add) - 1) + x;
|
||||||
//putPixel(dest, ftcp++, palette[SegmentType], SegmentType);
|
int yB = ftcp/(FullWidth+add) + y;
|
||||||
|
if(xB>=0 && yB>=0 && xB<dest->w && yB<dest->h)
|
||||||
|
{
|
||||||
|
putPixel(dest, xB + yB*dest->w, palette[SegmentType], SegmentType);
|
||||||
|
}
|
||||||
|
ftcp++; //increment pos
|
||||||
}
|
}
|
||||||
TotalRowLength+=SegmentLength+1;
|
TotalRowLength+=SegmentLength+1;
|
||||||
}
|
}
|
||||||
@ -884,16 +883,6 @@ int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker
|
|||||||
ftcp += BottomMargin * (FullWidth+add);
|
ftcp += BottomMargin * (FullWidth+add);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!attacker)
|
|
||||||
{
|
|
||||||
SDL_Surface * h2 = CSDL_Ext::rotate01(hlps);
|
|
||||||
SDL_FreeSurface(hlps);
|
|
||||||
hlps = h2;
|
|
||||||
}
|
|
||||||
CSDL_Ext::alphaTransform(hlps);
|
|
||||||
|
|
||||||
CSDL_Ext::blit8bppAlphaTo24bpp(hlps, NULL, dest, &genRect(hlps->h, hlps->w, x, y));
|
|
||||||
SDL_FreeSurface(hlps);
|
|
||||||
|
|
||||||
//for (int i=0; i<FullHeight; ++i)
|
//for (int i=0; i<FullHeight; ++i)
|
||||||
//{
|
//{
|
||||||
@ -942,13 +931,60 @@ CCreatureAnimation::~CCreatureAnimation()
|
|||||||
delete [] RLEntries;
|
delete [] RLEntries;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCreatureAnimation::putPixel(SDL_Surface * dest, const int & ftcp, const BMPPalette & color, const unsigned char & palc)
|
void CCreatureAnimation::putPixel(SDL_Surface * dest, const int & ftcp, const BMPPalette & color, const unsigned char & palc) const
|
||||||
{
|
{
|
||||||
if(palc!=0)
|
if(palc!=0)
|
||||||
{
|
{
|
||||||
Uint8 * p = (Uint8*)dest->pixels + ftcp*3 ;
|
Uint8 * p = (Uint8*)dest->pixels + ftcp*3;
|
||||||
p[0] = color.R;
|
if(palc > 7) //normal color
|
||||||
p[1] = color.G;
|
{
|
||||||
p[2] = color.B;
|
p[0] = color.B;
|
||||||
|
p[1] = color.G;
|
||||||
|
p[2] = color.R;
|
||||||
|
}
|
||||||
|
else if(palc == 6 || palc == 7) //dark yellow border
|
||||||
|
{
|
||||||
|
p[0] = 0;
|
||||||
|
p[1] = 0xff;
|
||||||
|
p[2] = 0xff;
|
||||||
|
}
|
||||||
|
else if(palc == 5) //yellow border
|
||||||
|
{
|
||||||
|
p[0] = color.B;
|
||||||
|
p[1] = color.G;
|
||||||
|
p[2] = color.R;
|
||||||
|
}
|
||||||
|
else if(palc < 5) //shadow
|
||||||
|
{
|
||||||
|
Uint16 alpha;
|
||||||
|
switch(color.G)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
alpha = 128;
|
||||||
|
break;
|
||||||
|
case 50:
|
||||||
|
alpha = 50+32;
|
||||||
|
break;
|
||||||
|
case 100:
|
||||||
|
alpha = 100+64;
|
||||||
|
break;
|
||||||
|
case 125:
|
||||||
|
alpha = 125+64;
|
||||||
|
break;
|
||||||
|
case 128:
|
||||||
|
alpha = 128+64;
|
||||||
|
break;
|
||||||
|
case 150:
|
||||||
|
alpha = 150+64;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
alpha = 255;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//alpha counted
|
||||||
|
p[0] = (p[0] * alpha)>>8;
|
||||||
|
p[1] = (p[1] * alpha)>>8;
|
||||||
|
p[2] = (p[2] * alpha)>>8;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ private:
|
|||||||
char id[2];
|
char id[2];
|
||||||
std::string defName, curDir;
|
std::string defName, curDir;
|
||||||
int readNormalNr (int pos, int bytCon, unsigned char * str=NULL, bool cyclic=false);
|
int readNormalNr (int pos, int bytCon, unsigned char * str=NULL, bool cyclic=false);
|
||||||
void putPixel(SDL_Surface * dest, const int & ftcp, const BMPPalette & color, const unsigned char & palc);
|
void putPixel(SDL_Surface * dest, const int & ftcp, const BMPPalette & color, const unsigned char & palc) const;
|
||||||
|
|
||||||
////////////
|
////////////
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user