From 1704badc306fc8c7c6609aff9f809aee3ac00d3a Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Thu, 10 Feb 2011 02:13:03 +0200 Subject: work-in-progress texture atlas optimization --- src/irrlichtwrapper.cpp | 165 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 146 insertions(+), 19 deletions(-) (limited to 'src/irrlichtwrapper.cpp') diff --git a/src/irrlichtwrapper.cpp b/src/irrlichtwrapper.cpp index 4ad647194..4a1f2c413 100644 --- a/src/irrlichtwrapper.cpp +++ b/src/irrlichtwrapper.cpp @@ -11,8 +11,22 @@ IrrlichtWrapper::IrrlichtWrapper(IrrlichtDevice *device) m_device = device; } +IrrlichtWrapper::~IrrlichtWrapper() +{ +#if 0 + // Clear image cache + for(core::map::Iterator + i = m_imagecache.getIterator(); + i.atEnd() == false; i++) + { + i.getNode()->getValue()->drop(); + } +#endif +} + void IrrlichtWrapper::Run() { +#if 0 /* Fetch textures */ @@ -34,6 +48,7 @@ void IrrlichtWrapper::Run() request.dest->push_back(result); } +#endif } void IrrlichtWrapper::Shutdown(bool shutdown) @@ -41,6 +56,18 @@ void IrrlichtWrapper::Shutdown(bool shutdown) m_running = !shutdown; } +IrrlichtDevice* IrrlichtWrapper::getDevice() +{ + if(get_current_thread_id() != m_main_thread) + { + dstream<<"WARNING: IrrlichtWrapper::getDevice() called " + "not from main thread"<::Node *n; + n = m_imagecache.find(texture_name); + if(n != NULL) + { + video::IImage *image = n->getValue(); + + core::dimension2d dim = image->getDimension(); + baseimg = driver->createImage(video::ECF_A8R8G8B8, dim); + image->copyTo(baseimg); + dstream<<"INFO: getTextureDirect(): Loaded \"" + < dim = image->getDimension(); //core::dimension2d dim(16,16); @@ -229,27 +280,85 @@ video::ITexture* IrrlichtWrapper::getTextureDirect(const TextureSpec &spec) else { // A special texture modification - dstream<<"getTextureDirect(): generating \""< dim(16, 16); + core::dimension2d dim_base = baseimg->getDimension(); + // Crack will be drawn at this size + u32 cracksize = 16; // Size of the crack image - //core::dimension2d dim_crack(16, 16 * CRACK_ANIMATION_LENGTH); - // Position to copy the crack to in the base image - core::position2d pos_base(0, 0); + core::dimension2d dim_crack(cracksize,cracksize); // Position to copy the crack from in the crack image core::position2d pos_other(0, 16 * progression); video::IImage *crackimage = driver->createImageFromFile( porting::getDataPath("crack.png").c_str()); - crackimage->copyToWithAlpha(baseimg, v2s32(0,0), - core::rect(pos_other, dim), - video::SColor(255,255,255,255), - NULL); - crackimage->drop(); + + if(crackimage) + { + /*crackimage->copyToWithAlpha(baseimg, v2s32(0,0), + core::rect(pos_other, dim_base), + video::SColor(255,255,255,255), + NULL);*/ + + for(u32 y0=0; y0 pos_base(x0*cracksize, y0*cracksize); + crackimage->copyToWithAlpha(baseimg, pos_base, + core::rect(pos_other, dim_crack), + video::SColor(255,255,255,255), + NULL); + } + + crackimage->drop(); + } + } + else if(name.substr(0,8) == "[combine") + { + // "[combine:16x128:0,0=stone.png:0,16=grass.png" + Strfnd sf(name); + sf.next(":"); + u32 w0 = stoi(sf.next("x")); + u32 h0 = stoi(sf.next(":")); + dstream<<"INFO: combined w="<createImageFromFile( + porting::getDataPath(filename.c_str()).c_str()); + if(img) + { + core::dimension2d dim = img->getDimension(); + dstream<<"INFO: Size "< pos_base(x, y); + video::IImage *img2 = + driver->createImage(video::ECF_A8R8G8B8, dim); + img->copyTo(img2); + img->drop(); + img2->copyToWithAlpha(baseimg, pos_base, + core::rect(v2s32(0,0), dim), + video::SColor(255,255,255,255), + NULL); + img2->drop(); + } + else + { + dstream<<"WARNING: img==NULL"<::Node *n; + n = m_imagecache.find(texture_name); + if(n != NULL) + { + video::IImage *img = n->getValue(); + if(img != baseimg) + { + img->drop(); + } + } + + m_imagecache[texture_name] = baseimg; + } } // If no resulting image, return NULL if(baseimg == NULL) { - dstream<<"getTextureDirect(): baseimg is NULL (attempted to" + dstream<<"WARNING: getTextureDirect(): baseimg is NULL (attempted to" " create texture \""<addTexture(texture_name.c_str(), baseimg); - baseimg->drop(); - dstream<<"getTextureDirect(): created texture \""<