Allow node cracking animations of any length

This commit is contained in:
Perttu Ahola 2012-06-16 18:02:56 +03:00
parent 2b500d72e5
commit 07ccc15fc2
4 changed files with 49 additions and 7 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

View File

@ -1225,6 +1225,16 @@ void the_game(
*/
Inventory local_inventory(itemdef);
/*
Find out size of crack animation
*/
int crack_animation_length = 5;
{
video::ITexture *t = tsrc->getTextureRaw("crack_anylength.png");
v2u32 size = t->getOriginalSize();
crack_animation_length = size.Y / size.X;
}
/*
Add some gui stuff
*/
@ -2271,20 +2281,20 @@ void the_game(
if(dig_time_complete >= 0.001)
{
dig_index = (u16)((float)CRACK_ANIMATION_LENGTH
dig_index = (u16)((float)crack_animation_length
* dig_time/dig_time_complete);
}
// This is for torches
else
{
dig_index = CRACK_ANIMATION_LENGTH;
dig_index = crack_animation_length;
}
// Don't show cracks if not diggable
if(dig_time_complete >= 100000.0)
{
}
else if(dig_index < CRACK_ANIMATION_LENGTH)
else if(dig_index < crack_animation_length)
{
//TimeTaker timer("client.setTempMod");
//infostream<<"dig_index="<<dig_index<<std::endl;
@ -2302,7 +2312,7 @@ void the_game(
digging = false;
nodig_delay_timer = dig_time_complete
/ (float)CRACK_ANIMATION_LENGTH;
/ (float)crack_animation_length;
// We don't want a corresponding delay to
// very time consuming nodes

View File

@ -502,6 +502,11 @@ u32 TextureSource::getTextureId(const std::string &name)
// Overlay image on top of another image (used for cracks)
void overlay(video::IImage *image, video::IImage *overlay);
// Draw an image on top of an another one, using the alpha channel of the
// source image
static void blit_with_alpha(video::IImage *src, video::IImage *dst,
v2s32 src_pos, v2s32 dst_pos, v2u32 size);
// Brighten image
void brighten(video::IImage *image);
// Parse a transform name
@ -1266,7 +1271,8 @@ bool generate_image(std::string part_of_name, video::IImage *& baseimg,
It is an image with a number of cracking stages
horizontally tiled.
*/
video::IImage *img_crack = sourcecache->getOrLoad("crack.png", device);
video::IImage *img_crack = sourcecache->getOrLoad(
"crack_anylength.png", device);
if(img_crack && progression >= 0)
{
@ -1305,11 +1311,13 @@ bool generate_image(std::string part_of_name, video::IImage *& baseimg,
}
else
{
img_crack_scaled->copyToWithAlpha(
/*img_crack_scaled->copyToWithAlpha(
baseimg,
v2s32(0,0),
core::rect<s32>(v2s32(0,0), dim_base),
video::SColor(255,255,255,255));
video::SColor(255,255,255,255));*/
blit_with_alpha(img_crack_scaled, baseimg,
v2s32(0,0), v2s32(0,0), dim_base);
}
}
@ -1721,6 +1729,30 @@ void overlay(video::IImage *image, video::IImage *overlay)
}
}
/*
Draw an image on top of an another one, using the alpha channel of the
source image
This exists because IImage::copyToWithAlpha() doesn't seem to always
work.
*/
static void blit_with_alpha(video::IImage *src, video::IImage *dst,
v2s32 src_pos, v2s32 dst_pos, v2u32 size)
{
for(u32 y0=0; y0<size.Y; y0++)
for(u32 x0=0; x0<size.X; x0++)
{
s32 src_x = src_pos.X + x0;
s32 src_y = src_pos.Y + y0;
s32 dst_x = dst_pos.X + x0;
s32 dst_y = dst_pos.Y + y0;
video::SColor src_c = src->getPixel(src_x, src_y);
video::SColor dst_c = dst->getPixel(dst_x, dst_y);
dst_c = src_c.getInterpolated(dst_c, (float)src_c.getAlpha()/255.0f);
dst->setPixel(dst_x, dst_y, dst_c);
}
}
void brighten(video::IImage *image)
{
if(image == NULL)