From 9f882bf74d452521cb7fb1806ab453aaa28da343 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Wed, 26 Jan 2011 00:41:06 +0200 Subject: Reworked texture, material, mineral and whatever handling --- src/irrlichtwrapper.cpp | 297 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 231 insertions(+), 66 deletions(-) (limited to 'src/irrlichtwrapper.cpp') diff --git a/src/irrlichtwrapper.cpp b/src/irrlichtwrapper.cpp index e26cbfd15..4e1ebdd74 100644 --- a/src/irrlichtwrapper.cpp +++ b/src/irrlichtwrapper.cpp @@ -1,5 +1,7 @@ #include "irrlichtwrapper.h" #include "constants.h" +#include "string.h" +#include "strfnd.h" IrrlichtWrapper::IrrlichtWrapper(IrrlichtDevice *device) { @@ -15,13 +17,13 @@ void IrrlichtWrapper::Run() */ if(m_get_texture_queue.size() > 0) { - GetRequest + GetRequest request = m_get_texture_queue.pop(); - dstream<<"got texture request with key.name=" - < + GetResult result = result_queue.pop_front(1000); // Check that at least something worked OK - assert(result.key.name == spec.name); + assert(result.key == spec); t = result.item; } @@ -74,44 +79,63 @@ video::ITexture* IrrlichtWrapper::getTexture(TextureSpec spec) } // Add to cache and return - m_texturecache.set(spec.name, t); + m_texturecache.set(spec, t); return t; } -video::ITexture* IrrlichtWrapper::getTexture(const std::string &path) -{ - return getTexture(TextureSpec(path, path, NULL)); -} - /* Non-thread-safe functions */ -video::ITexture* IrrlichtWrapper::getTextureDirect(TextureSpec spec) +/* + Texture modifier functions +*/ + +// blitted_name = eg. "mineral_coal.png" +video::ITexture * make_blitname(const std::string &blitted_name, + video::ITexture *original, + const char *newname, video::IVideoDriver* driver) { - video::IVideoDriver* driver = m_device->getVideoDriver(); + if(original == NULL) + return NULL; - if(spec.mod == NULL) - { - dstream<<"IrrlichtWrapper::getTextureDirect: Loading texture " - <getTexture(spec.path.c_str()); - } - - dstream<<"IrrlichtWrapper::getTextureDirect: Loading and modifying " - "texture "< dim(16, 16); + // Position to copy the blitted to in the base image + core::position2d pos_base(0, 0); + // Position to copy the blitted from in the blitted image + core::position2d pos_other(0, 0); - video::ITexture *base = driver->getTexture(spec.path.c_str()); - video::ITexture *result = spec.mod->make(base, spec.name.c_str(), driver); + video::IImage *baseimage = driver->createImage(original, pos_base, dim); + assert(baseimage); - delete spec.mod; + video::IImage *blittedimage = driver->createImageFromFile(porting::getDataPath(blitted_name.c_str()).c_str()); + assert(blittedimage); + + // Then copy the right part of blittedimage to baseimage + + blittedimage->copyToWithAlpha(baseimage, v2s32(0,0), + core::rect(pos_other, dim), + video::SColor(255,255,255,255), + NULL); - return result; + blittedimage->drop(); + + // Create texture from resulting image + + video::ITexture *newtexture = driver->addTexture(newname, baseimage); + + baseimage->drop(); + + return newtexture; } -video::ITexture * CrackTextureMod::make(video::ITexture *original, +video::ITexture * make_crack(u16 progression, video::ITexture *original, const char *newname, video::IVideoDriver* driver) { + if(original == NULL) + return NULL; + // Size of the base image core::dimension2d dim(16, 16); // Size of the crack image @@ -127,36 +151,6 @@ video::ITexture * CrackTextureMod::make(video::ITexture *original, video::IImage *crackimage = driver->createImageFromFile(porting::getDataPath("crack.png").c_str()); assert(crackimage); -#if 0 - video::ITexture *other = driver->getTexture(porting::getDataPath("crack.png").c_str()); - - dstream<<__FUNCTION_NAME<<": crack texture size is " - <getSize().Width<<"x" - <getSize().Height<createImage( - other, core::position2d(0,0), other->getSize()); - - assert(otherimage); - - // Now, the image might be 80 or 128 high depending on the computer - // Let's make an image of the right size and copy the possibly - // wrong sized one with scaling - // NOTE: This is an ugly hack. - - video::IImage *crackimage = driver->createImage( - baseimage->getColorFormat(), dim_crack); - - assert(crackimage); - - otherimage->copyToScaling(crackimage); - otherimage->drop(); -#endif - // Then copy the right part of crackimage to baseimage crackimage->copyToWithAlpha(baseimage, v2s32(0,0), @@ -175,9 +169,13 @@ video::ITexture * CrackTextureMod::make(video::ITexture *original, return newtexture; } -video::ITexture * SideGrassTextureMod::make(video::ITexture *original, +#if 0 +video::ITexture * make_sidegrass(video::ITexture *original, const char *newname, video::IVideoDriver* driver) { + if(original == NULL) + return NULL; + // Size of the base image core::dimension2d dim(16, 16); // Position to copy the grass to in the base image @@ -208,10 +206,14 @@ video::ITexture * SideGrassTextureMod::make(video::ITexture *original, return newtexture; } +#endif -video::ITexture * ProgressBarTextureMod::make(video::ITexture *original, +video::ITexture * make_progressbar(float value, video::ITexture *original, const char *newname, video::IVideoDriver* driver) { + if(original == NULL) + return NULL; + core::position2d pos_base(0, 0); core::dimension2d dim = original->getOriginalSize(); @@ -251,3 +253,166 @@ video::ITexture * ProgressBarTextureMod::make(video::ITexture *original, return newtexture; } +/* + Texture fetcher/maker function, called always from the main thread +*/ + +video::ITexture* IrrlichtWrapper::getTextureDirect(const std::string &spec) +{ + if(spec == "") + return NULL; + + video::IVideoDriver* driver = m_device->getVideoDriver(); + + /* + Input (spec) is something like this: + "/usr/share/minetest/stone.png[[mod:mineral0[[mod:crack3" + */ + + video::ITexture* t = NULL; + std::string modmagic = "[[mod:"; + Strfnd f(spec); + std::string path = f.next(modmagic); + t = driver->getTexture(path.c_str()); + std::string texture_name = path; + while(f.atend() == false) + { + std::string mod = f.next(modmagic); + texture_name += modmagic + mod; + dstream<<"Making texture \""<= spec.size()) + { + strcache[length] = '\0'; + // Now our string is in strcache, ending in \0 + + if(readmode == READMODE_PATH) + { + // Get initial texture (strcache is path) + assert(t == NULL); + t = driver->getTexture(strcache); + readmode = READMODE_MOD; + path = strcache; + strcache = (char*)malloc(specsize); + assert(strcache); + } + else + { + dstream<<"Parsing mod \""<= spec.size()) + break; + } + + /*if(spec.mod == NULL) + { + dstream<<"IrrlichtWrapper::getTextureDirect: Loading texture " + <getTexture(spec.path.c_str()); + } + + dstream<<"IrrlichtWrapper::getTextureDirect: Loading and modifying " + "texture "<getTexture(spec.path.c_str()); + video::ITexture *result = spec.mod->make(base, spec.name.c_str(), driver); + + delete spec.mod;*/ + + if(strcache) + free(strcache); + if(path) + free(path); + + return t; +#endif +} + + -- cgit v1.2.3