diff options
author | Elias Fleckenstein <54945686+EliasFleckenstein03@users.noreply.github.com> | 2020-11-04 16:57:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-04 16:57:47 +0100 |
commit | 3e16c3a78fff61c20e63ba730d15e94e3bb877b4 (patch) | |
tree | c070350db219f2c4241d22bc31949685c7b42fe9 /src/client/tile.cpp | |
parent | 5d9ae5a91c544fc7fbd475decf47cef7e09ef8fc (diff) | |
parent | 6ccb5835ff55d85156be91473c598eca9d6cb9a6 (diff) | |
download | dragonfireclient-3e16c3a78fff61c20e63ba730d15e94e3bb877b4.tar.xz |
Merge branch 'master' into master
Diffstat (limited to 'src/client/tile.cpp')
-rw-r--r-- | src/client/tile.cpp | 1012 |
1 files changed, 491 insertions, 521 deletions
diff --git a/src/client/tile.cpp b/src/client/tile.cpp index dd159e909..d03588b2b 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -34,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "guiscalingfilter.h" #include "renderingengine.h" + #if ENABLE_GLES #ifdef _IRR_COMPILE_WITH_OGLES1_ #include <GLES/gl.h> @@ -61,8 +62,10 @@ static bool replace_ext(std::string &path, const char *ext) return false; // Find place of last dot, fail if \ or / found. s32 last_dot_i = -1; - for (s32 i = path.size() - 1; i >= 0; i--) { - if (path[i] == '.') { + for (s32 i=path.size()-1; i>=0; i--) + { + if (path[i] == '.') + { last_dot_i = i; break; } @@ -74,7 +77,7 @@ static bool replace_ext(std::string &path, const char *ext) if (last_dot_i == -1) return false; // Else make the new path - path = path.substr(0, last_dot_i + 1) + ext; + path = path.substr(0, last_dot_i+1) + ext; return true; } @@ -87,20 +90,24 @@ static bool replace_ext(std::string &path, const char *ext) std::string getImagePath(std::string path) { // A NULL-ended list of possible image extensions - const char *extensions[] = {"png", "jpg", "bmp", "tga", "pcx", "ppm", "psd", - "wal", "rgb", NULL}; + const char *extensions[] = { + "png", "jpg", "bmp", "tga", + "pcx", "ppm", "psd", "wal", "rgb", + NULL + }; // If there is no extension, add one if (removeStringEnd(path, extensions).empty()) path = path + ".png"; // Check paths until something is found to exist const char **ext = extensions; - do { + do{ bool r = replace_ext(path, *ext); if (!r) return ""; if (fs::PathExists(path)) return path; - } while ((++ext) != NULL); + } + while((++ext) != NULL); return ""; } @@ -145,9 +152,10 @@ std::string getTexturePath(const std::string &filename, bool *is_base_pack) /* Check from default data directory */ - if (fullpath.empty()) { - std::string base_path = porting::path_share + DIR_DELIM + "textures" + - DIR_DELIM + "base" + DIR_DELIM + "pack"; + if (fullpath.empty()) + { + std::string base_path = porting::path_share + DIR_DELIM + "textures" + + DIR_DELIM + "base" + DIR_DELIM + "pack"; std::string testpath = base_path + DIR_DELIM + filename; // Check all filename extensions. Returns "" if not found. fullpath = getImagePath(testpath); @@ -176,8 +184,12 @@ struct TextureInfo std::string name; video::ITexture *texture; - TextureInfo(const std::string &name_, video::ITexture *texture_ = NULL) : - name(name_), texture(texture_) + TextureInfo( + const std::string &name_, + video::ITexture *texture_=NULL + ): + name(name_), + texture(texture_) { } }; @@ -189,8 +201,7 @@ struct TextureInfo class SourceImageCache { public: - ~SourceImageCache() - { + ~SourceImageCache() { for (auto &m_image : m_images) { m_image.second->drop(); } @@ -200,14 +211,14 @@ public: { assert(img); // Pre-condition // Remove old image - std::map<std::string, video::IImage *>::iterator n; + std::map<std::string, video::IImage*>::iterator n; n = m_images.find(name); - if (n != m_images.end()) { + if (n != m_images.end()){ if (n->second) n->second->drop(); } - video::IImage *toadd = img; + video::IImage* toadd = img; bool need_to_grab = true; // Try to use local texture instead if asked to @@ -216,11 +227,9 @@ public: std::string path = getTexturePath(name, &is_base_pack); // Ignore base pack if (!path.empty() && !is_base_pack) { - video::IImage *img2 = - RenderingEngine::get_video_driver() - ->createImageFromFile( - path.c_str()); - if (img2) { + video::IImage *img2 = RenderingEngine::get_video_driver()-> + createImageFromFile(path.c_str()); + if (img2){ toadd = img2; need_to_grab = false; } @@ -231,9 +240,9 @@ public: toadd->grab(); m_images[name] = toadd; } - video::IImage *get(const std::string &name) + video::IImage* get(const std::string &name) { - std::map<std::string, video::IImage *>::iterator n; + std::map<std::string, video::IImage*>::iterator n; n = m_images.find(name); if (n != m_images.end()) return n->second; @@ -242,33 +251,31 @@ public: // Primarily fetches from cache, secondarily tries to read from filesystem video::IImage *getOrLoad(const std::string &name) { - std::map<std::string, video::IImage *>::iterator n; + std::map<std::string, video::IImage*>::iterator n; n = m_images.find(name); - if (n != m_images.end()) { + if (n != m_images.end()){ n->second->grab(); // Grab for caller return n->second; } video::IVideoDriver *driver = RenderingEngine::get_video_driver(); std::string path = getTexturePath(name); if (path.empty()) { - infostream << "SourceImageCache::getOrLoad(): No path found for " - "\"" - << name << "\"" << std::endl; + infostream<<"SourceImageCache::getOrLoad(): No path found for \"" + <<name<<"\""<<std::endl; return NULL; } - infostream << "SourceImageCache::getOrLoad(): Loading path \"" << path - << "\"" << std::endl; + infostream<<"SourceImageCache::getOrLoad(): Loading path \""<<path + <<"\""<<std::endl; video::IImage *img = driver->createImageFromFile(path.c_str()); - if (img) { + if (img){ m_images[name] = img; img->grab(); // Grab for caller } return img; } - private: - std::map<std::string, video::IImage *> m_images; + std::map<std::string, video::IImage*> m_images; }; /* @@ -333,9 +340,9 @@ public: and not found in cache, the call is queued to the main thread for processing. */ - video::ITexture *getTexture(u32 id); + video::ITexture* getTexture(u32 id); - video::ITexture *getTexture(const std::string &name, u32 *id = NULL); + video::ITexture* getTexture(const std::string &name, u32 *id = NULL); /* Get a texture specifically intended for mesh @@ -343,9 +350,9 @@ public: use. This texture may be a different size and may have had additional filters applied. */ - video::ITexture *getTextureForMesh(const std::string &name, u32 *id); + video::ITexture* getTextureForMesh(const std::string &name, u32 *id); - virtual Palette *getPalette(const std::string &name); + virtual Palette* getPalette(const std::string &name); bool isKnownSourceImage(const std::string &name) { @@ -371,11 +378,12 @@ public: // Shall be called from the main thread. void rebuildImagesAndTextures(); - video::ITexture *getNormalTexture(const std::string &name); + video::ITexture* getNormalTexture(const std::string &name); video::SColor getTextureAverageColor(const std::string &name); video::ITexture *getShaderFlagsTexture(bool normamap_present); private: + // The id of the thread that is allowed to use irrlicht directly std::thread::id m_main_thread; @@ -388,14 +396,14 @@ private: // Generate image based on a string like "stone.png" or "[crack:1:0". // if baseimg is NULL, it is created. Otherwise stuff is made on it. - bool generateImagePart(std::string part_of_name, video::IImage *&baseimg); + bool generateImagePart(std::string part_of_name, video::IImage *& baseimg); /*! Generates an image from a full string like * "stone.png^mineral_coal.png^[crack:1:0". * Shall be called from the main thread. * The returned Image should be dropped. */ - video::IImage *generateImage(const std::string &name); + video::IImage* generateImage(const std::string &name); // Thread-safe cache of what source images are known (true = known) MutexedMap<std::string, bool> m_source_image_existence; @@ -413,7 +421,7 @@ private: // Textures that have been overwritten with other ones // but can't be deleted because the ITexture* might still be used - std::vector<video::ITexture *> m_texture_trash; + std::vector<video::ITexture*> m_texture_trash; // Maps image file names to loaded palettes. std::unordered_map<std::string, Palette> m_palettes; @@ -452,24 +460,24 @@ TextureSource::~TextureSource() unsigned int textures_before = driver->getTextureCount(); for (const auto &iter : m_textureinfo_cache) { - // cleanup texture + //cleanup texture if (iter.texture) driver->removeTexture(iter.texture); } m_textureinfo_cache.clear(); for (auto t : m_texture_trash) { - // cleanup trashed texture + //cleanup trashed texture driver->removeTexture(t); } - infostream << "~TextureSource() before cleanup: " << textures_before - << " after: " << driver->getTextureCount() << std::endl; + infostream << "~TextureSource() before cleanup: "<< textures_before + << " after: " << driver->getTextureCount() << std::endl; } u32 TextureSource::getTextureId(const std::string &name) { - // infostream<<"getTextureId(): \""<<name<<"\""<<std::endl; + //infostream<<"getTextureId(): \""<<name<<"\""<<std::endl; { /* @@ -478,7 +486,8 @@ u32 TextureSource::getTextureId(const std::string &name) MutexAutoLock lock(m_textureinfo_cache_mutex); std::map<std::string, u32>::iterator n; n = m_name_to_id.find(name); - if (n != m_name_to_id.end()) { + if (n != m_name_to_id.end()) + { return n->second; } } @@ -490,7 +499,8 @@ u32 TextureSource::getTextureId(const std::string &name) return generateTexture(name); } - infostream << "getTextureId(): Queued: name=\"" << name << "\"" << std::endl; + + infostream<<"getTextureId(): Queued: name=\""<<name<<"\""<<std::endl; // We're gonna ask the result to be put into here static ResultQueue<std::string, u32, u8, u8> result_queue; @@ -499,18 +509,17 @@ u32 TextureSource::getTextureId(const std::string &name) m_get_texture_queue.add(name, 0, 0, &result_queue); try { - while (true) { + while(true) { // Wait result for a second - GetResult<std::string, u32, u8, u8> result = - result_queue.pop_front(1000); + GetResult<std::string, u32, u8, u8> + result = result_queue.pop_front(1000); if (result.key == name) { return result.item; } } - } catch (ItemNotFoundException &e) { - errorstream << "Waiting for texture " << name << " timed out." - << std::endl; + } catch(ItemNotFoundException &e) { + errorstream << "Waiting for texture " << name << " timed out." << std::endl; return 0; } @@ -521,13 +530,13 @@ u32 TextureSource::getTextureId(const std::string &name) // 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); +static void blit_with_alpha(video::IImage *src, video::IImage *dst, + v2s32 src_pos, v2s32 dst_pos, v2u32 size); // Like blit_with_alpha, but only modifies destination pixels that // are fully opaque -static void blit_with_alpha_overlay(video::IImage *src, video::IImage *dst, v2s32 src_pos, - v2s32 dst_pos, v2u32 size); +static void blit_with_alpha_overlay(video::IImage *src, video::IImage *dst, + v2s32 src_pos, v2s32 dst_pos, v2u32 size); // Apply a color to an image. Uses an int (0-255) to calculate the ratio. // If the ratio is 255 or -1 and keep_alpha is true, then it multiples the @@ -541,18 +550,18 @@ static void apply_multiplication(video::IImage *dst, v2u32 dst_pos, v2u32 size, const video::SColor &color); // Apply a mask to an image -static void apply_mask(video::IImage *mask, video::IImage *dst, v2s32 mask_pos, - v2s32 dst_pos, v2u32 size); +static void apply_mask(video::IImage *mask, video::IImage *dst, + v2s32 mask_pos, v2s32 dst_pos, v2u32 size); // Draw or overlay a crack -static void draw_crack(video::IImage *crack, video::IImage *dst, bool use_overlay, - s32 frame_count, s32 progression, video::IVideoDriver *driver, - u8 tiles = 1); +static void draw_crack(video::IImage *crack, video::IImage *dst, + bool use_overlay, s32 frame_count, s32 progression, + video::IVideoDriver *driver, u8 tiles = 1); // Brighten image void brighten(video::IImage *image); // Parse a transform name -u32 parseImageTransform(const std::string &s); +u32 parseImageTransform(const std::string& s); // Apply transform to image dimension core::dimension2d<u32> imageTransformDimension(u32 transform, core::dimension2d<u32> dim); // Apply transform to image data @@ -563,11 +572,11 @@ void imageTransform(u32 transform, video::IImage *src, video::IImage *dst); */ u32 TextureSource::generateTexture(const std::string &name) { - // infostream << "generateTexture(): name=\"" << name << "\"" << std::endl; + //infostream << "generateTexture(): name=\"" << name << "\"" << std::endl; // Empty name means texture 0 if (name.empty()) { - infostream << "generateTexture(): name is empty" << std::endl; + infostream<<"generateTexture(): name is empty"<<std::endl; return 0; } @@ -587,9 +596,8 @@ u32 TextureSource::generateTexture(const std::string &name) Calling only allowed from main thread */ if (std::this_thread::get_id() != m_main_thread) { - errorstream << "TextureSource::generateTexture() " - "called not from main thread" - << std::endl; + errorstream<<"TextureSource::generateTexture() " + "called not from main thread"<<std::endl; return 0; } @@ -628,17 +636,18 @@ std::string TextureSource::getTextureName(u32 id) { MutexAutoLock lock(m_textureinfo_cache_mutex); - if (id >= m_textureinfo_cache.size()) { - errorstream << "TextureSource::getTextureName(): id=" << id - << " >= m_textureinfo_cache.size()=" - << m_textureinfo_cache.size() << std::endl; + if (id >= m_textureinfo_cache.size()) + { + errorstream<<"TextureSource::getTextureName(): id="<<id + <<" >= m_textureinfo_cache.size()=" + <<m_textureinfo_cache.size()<<std::endl; return ""; } return m_textureinfo_cache[id].name; } -video::ITexture *TextureSource::getTexture(u32 id) +video::ITexture* TextureSource::getTexture(u32 id) { MutexAutoLock lock(m_textureinfo_cache_mutex); @@ -648,28 +657,28 @@ video::ITexture *TextureSource::getTexture(u32 id) return m_textureinfo_cache[id].texture; } -video::ITexture *TextureSource::getTexture(const std::string &name, u32 *id) +video::ITexture* TextureSource::getTexture(const std::string &name, u32 *id) { u32 actual_id = getTextureId(name); - if (id) { + if (id){ *id = actual_id; } return getTexture(actual_id); } -video::ITexture *TextureSource::getTextureForMesh(const std::string &name, u32 *id) +video::ITexture* TextureSource::getTextureForMesh(const std::string &name, u32 *id) { static thread_local bool filter_needed = - g_settings->getBool("texture_clean_transparent") || - ((m_setting_trilinear_filter || m_setting_bilinear_filter) && - g_settings->getS32("texture_min_size") > 1); + g_settings->getBool("texture_clean_transparent") || + ((m_setting_trilinear_filter || m_setting_bilinear_filter) && + g_settings->getS32("texture_min_size") > 1); // Avoid duplicating texture if it won't actually change if (filter_needed) return getTexture(name + "^[applyfiltersformesh", id); return getTexture(name, id); } -Palette *TextureSource::getPalette(const std::string &name) +Palette* TextureSource::getPalette(const std::string &name) { // Only the main thread may load images sanity_check(std::this_thread::get_id() == m_main_thread); @@ -683,7 +692,7 @@ Palette *TextureSource::getPalette(const std::string &name) video::IImage *img = generateImage(name); if (!img) { warningstream << "TextureSource::getPalette(): palette \"" << name - << "\" could not be loaded." << std::endl; + << "\" could not be loaded." << std::endl; return NULL; } Palette new_palette; @@ -695,15 +704,13 @@ Palette *TextureSource::getPalette(const std::string &name) return NULL; if (area > 256) { warningstream << "TextureSource::getPalette(): the specified" - << " palette image \"" << name - << "\" is larger than 256" - << " pixels, using the first 256." << std::endl; + << " palette image \"" << name << "\" is larger than 256" + << " pixels, using the first 256." << std::endl; area = 256; } else if (256 % area != 0) warningstream << "TextureSource::getPalette(): the " - << "specified palette image \"" << name - << "\" does not " - << "contain power of two pixels." << std::endl; + << "specified palette image \"" << name << "\" does not " + << "contain power of two pixels." << std::endl; // We stretch the palette so it will fit 256 values // This many param2 values will have the same color u32 step = 256 / area; @@ -731,9 +738,11 @@ void TextureSource::processQueue() /* Fetch textures */ - // NOTE this is only thread safe for ONE consumer thread! - if (!m_get_texture_queue.empty()) { - GetRequest<std::string, u32, u8, u8> request = m_get_texture_queue.pop(); + //NOTE this is only thread safe for ONE consumer thread! + if (!m_get_texture_queue.empty()) + { + GetRequest<std::string, u32, u8, u8> + request = m_get_texture_queue.pop(); /*infostream<<"TextureSource::processQueue(): " <<"got texture request with " @@ -746,7 +755,7 @@ void TextureSource::processQueue() void TextureSource::insertSourceImage(const std::string &name, video::IImage *img) { - // infostream<<"TextureSource::insertSourceImage(): name="<<name<<std::endl; + //infostream<<"TextureSource::insertSourceImage(): name="<<name<<std::endl; sanity_check(std::this_thread::get_id() == m_main_thread); @@ -762,7 +771,7 @@ void TextureSource::rebuildImagesAndTextures() sanity_check(driver); infostream << "TextureSource: recreating " << m_textureinfo_cache.size() - << " textures" << std::endl; + << " textures" << std::endl; // Recreate textures for (TextureInfo &ti : m_textureinfo_cache) { @@ -795,19 +804,16 @@ inline static void applyShadeFactor(video::SColor &color, u32 factor) } static video::IImage *createInventoryCubeImage( - video::IImage *top, video::IImage *left, video::IImage *right) + video::IImage *top, video::IImage *left, video::IImage *right) { core::dimension2du size_top = top->getDimension(); core::dimension2du size_left = left->getDimension(); core::dimension2du size_right = right->getDimension(); u32 size = npot2(std::max({ - size_top.Width, - size_top.Height, - size_left.Width, - size_left.Height, - size_right.Width, - size_right.Height, + size_top.Width, size_top.Height, + size_left.Width, size_left.Height, + size_right.Width, size_right.Height, })); // It must be divisible by 4, to let everything work correctly. @@ -822,14 +828,12 @@ static video::IImage *createInventoryCubeImage( video::IVideoDriver *driver = RenderingEngine::get_video_driver(); - auto lock_image = [size, driver](video::IImage *&image) -> const u32 * { + auto lock_image = [size, driver] (video::IImage *&image) -> const u32 * { image->grab(); core::dimension2du dim = image->getDimension(); video::ECOLOR_FORMAT format = image->getColorFormat(); - if (dim.Width != size || dim.Height != size || - format != video::ECF_A8R8G8B8) { - video::IImage *scaled = driver->createImage( - video::ECF_A8R8G8B8, {size, size}); + if (dim.Width != size || dim.Height != size || format != video::ECF_A8R8G8B8) { + video::IImage *scaled = driver->createImage(video::ECF_A8R8G8B8, {size, size}); image->copyToScaling(scaled); image->drop(); image = scaled; @@ -837,13 +841,12 @@ static video::IImage *createInventoryCubeImage( sanity_check(image->getPitch() == 4 * size); return reinterpret_cast<u32 *>(image->lock()); }; - auto free_image = [](video::IImage *image) -> void { + auto free_image = [] (video::IImage *image) -> void { image->unlock(); image->drop(); }; - video::IImage *result = - driver->createImage(video::ECF_A8R8G8B8, {cube_size, cube_size}); + video::IImage *result = driver->createImage(video::ECF_A8R8G8B8, {cube_size, cube_size}); sanity_check(result->getPitch() == 4 * cube_size); result->fill(video::SColor(0x00000000u)); u32 *target = reinterpret_cast<u32 *>(result->lock()); @@ -852,9 +855,10 @@ static video::IImage *createInventoryCubeImage( // `shade_factor` is face brightness, in range [0.0, 1.0] // (xu, xv, x1; yu, yv, y1) form coordinate transformation matrix // `offsets` list pixels to be drawn for single source pixel - auto draw_image = [=](video::IImage *image, float shade_factor, s16 xu, s16 xv, - s16 x1, s16 yu, s16 yv, s16 y1, - std::initializer_list<v2s16> offsets) -> void { + auto draw_image = [=] (video::IImage *image, float shade_factor, + s16 xu, s16 xv, s16 x1, + s16 yu, s16 yv, s16 y1, + std::initializer_list<v2s16> offsets) -> void { u32 brightness = core::clamp<u32>(256 * shade_factor, 0, 256); const u32 *source = lock_image(image); for (u16 v = 0; v < size; v++) { @@ -864,87 +868,51 @@ static video::IImage *createInventoryCubeImage( s16 x = xu * u + xv * v + x1; s16 y = yu * u + yv * v + y1; for (const auto &off : offsets) - target[(y + off.Y) * cube_size + (x + off.X) + - offset] = pixel.color; + target[(y + off.Y) * cube_size + (x + off.X) + offset] = pixel.color; source++; } } free_image(image); }; - draw_image(top, 1.000000f, 4, -4, 4 * (size - 1), 2, 2, 0, + draw_image(top, 1.000000f, + 4, -4, 4 * (size - 1), + 2, 2, 0, { - {2, 0}, - {3, 0}, - {4, 0}, - {5, 0}, - {0, 1}, - {1, 1}, - {2, 1}, - {3, 1}, - {4, 1}, - {5, 1}, - {6, 1}, - {7, 1}, - {2, 2}, - {3, 2}, - {4, 2}, - {5, 2}, + {2, 0}, {3, 0}, {4, 0}, {5, 0}, + {0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}, {6, 1}, {7, 1}, + {2, 2}, {3, 2}, {4, 2}, {5, 2}, }); - draw_image(left, 0.836660f, 4, 0, 0, 2, 5, 2 * size, + draw_image(left, 0.836660f, + 4, 0, 0, + 2, 5, 2 * size, { - {0, 0}, - {1, 0}, - {0, 1}, - {1, 1}, - {2, 1}, - {3, 1}, - {0, 2}, - {1, 2}, - {2, 2}, - {3, 2}, - {0, 3}, - {1, 3}, - {2, 3}, - {3, 3}, - {0, 4}, - {1, 4}, - {2, 4}, - {3, 4}, - {2, 5}, - {3, 5}, + {0, 0}, {1, 0}, + {0, 1}, {1, 1}, {2, 1}, {3, 1}, + {0, 2}, {1, 2}, {2, 2}, {3, 2}, + {0, 3}, {1, 3}, {2, 3}, {3, 3}, + {0, 4}, {1, 4}, {2, 4}, {3, 4}, + {2, 5}, {3, 5}, }); - draw_image(right, 0.670820f, 4, 0, 4 * size, -2, 5, 4 * size - 2, + draw_image(right, 0.670820f, + 4, 0, 4 * size, + -2, 5, 4 * size - 2, { - {2, 0}, - {3, 0}, - {0, 1}, - {1, 1}, - {2, 1}, - {3, 1}, - {0, 2}, - {1, 2}, - {2, 2}, - {3, 2}, - {0, 3}, - {1, 3}, - {2, 3}, - {3, 3}, - {0, 4}, - {1, 4}, - {2, 4}, - {3, 4}, - {0, 5}, - {1, 5}, + {2, 0}, {3, 0}, + {0, 1}, {1, 1}, {2, 1}, {3, 1}, + {0, 2}, {1, 2}, {2, 2}, {3, 2}, + {0, 3}, {1, 3}, {2, 3}, {3, 3}, + {0, 4}, {1, 4}, {2, 4}, {3, 4}, + {0, 5}, {1, 5}, }); result->unlock(); return result; } -video::IImage *TextureSource::generateImage(const std::string &name) +video::IImage* TextureSource::generateImage(const std::string &name) { // Get the base image @@ -957,7 +925,7 @@ video::IImage *TextureSource::generateImage(const std::string &name) s32 last_separator_pos = -1; u8 paren_bal = 0; for (s32 i = name.size() - 1; i >= 0; i--) { - if (i > 0 && name[i - 1] == escape) + if (i > 0 && name[i-1] == escape) continue; switch (name[i]) { case separator: @@ -969,9 +937,8 @@ video::IImage *TextureSource::generateImage(const std::string &name) case paren_open: if (paren_bal == 0) { errorstream << "generateImage(): unbalanced parentheses" - << "(extranous '(') while generating texture " - "\"" - << name << "\"" << std::endl; + << "(extranous '(') while generating texture \"" + << name << "\"" << std::endl; return NULL; } paren_bal--; @@ -985,11 +952,12 @@ video::IImage *TextureSource::generateImage(const std::string &name) } if (paren_bal > 0) { errorstream << "generateImage(): unbalanced parentheses" - << "(missing matching '(') while generating texture \"" - << name << "\"" << std::endl; + << "(missing matching '(') while generating texture \"" + << name << "\"" << std::endl; return NULL; } + video::IImage *baseimg = NULL; /* @@ -1011,15 +979,15 @@ video::IImage *TextureSource::generateImage(const std::string &name) If this name is enclosed in parentheses, generate it and blit it onto the base image */ - if (last_part_of_name[0] == paren_open && - last_part_of_name[last_part_of_name.size() - 1] == paren_close) { - std::string name2 = - last_part_of_name.substr(1, last_part_of_name.size() - 2); + if (last_part_of_name[0] == paren_open + && last_part_of_name[last_part_of_name.size() - 1] == paren_close) { + std::string name2 = last_part_of_name.substr(1, + last_part_of_name.size() - 2); video::IImage *tmp = generateImage(name2); if (!tmp) { errorstream << "generateImage(): " - "Failed to generate \"" - << name2 << "\"" << std::endl; + "Failed to generate \"" << name2 << "\"" + << std::endl; return NULL; } core::dimension2d<u32> dim = tmp->getDimension(); @@ -1032,15 +1000,14 @@ video::IImage *TextureSource::generateImage(const std::string &name) } else if (!generateImagePart(last_part_of_name, baseimg)) { // Generate image according to part of name errorstream << "generateImage(): " - "Failed to generate \"" - << last_part_of_name << "\"" << std::endl; + "Failed to generate \"" << last_part_of_name << "\"" + << std::endl; } // If no resulting image, print a warning if (baseimg == NULL) { errorstream << "generateImage(): baseimg is NULL (attempted to" - " create texture \"" - << name << "\")" << std::endl; + " create texture \"" << name << "\")" << std::endl; } return baseimg; @@ -1048,10 +1015,11 @@ video::IImage *TextureSource::generateImage(const std::string &name) #if ENABLE_GLES + static inline u16 get_GL_major_version() { const GLubyte *gl_version = glGetString(GL_VERSION); - return (u16)(gl_version[0] - '0'); + return (u16) (gl_version[0] - '0'); } /** @@ -1063,9 +1031,9 @@ bool hasNPotSupport() { // Only GLES2 is trusted to correctly report npot support // Note: we cache the boolean result, the GL context will never change. - static const bool supported = - get_GL_major_version() > 1 && glGetString(GL_EXTENSIONS) && - strstr((char *)glGetString(GL_EXTENSIONS), "GL_OES_texture_npot"); + static const bool supported = get_GL_major_version() > 1 && + glGetString(GL_EXTENSIONS) && + strstr((char *)glGetString(GL_EXTENSIONS), "GL_OES_texture_npot"); return supported; } @@ -1076,7 +1044,8 @@ bool hasNPotSupport() * @return image or copy of image aligned to npot2 */ -video::IImage *Align2Npot2(video::IImage *image, video::IVideoDriver *driver) +video::IImage * Align2Npot2(video::IImage * image, + video::IVideoDriver* driver) { if (image == NULL) return image; @@ -1086,7 +1055,7 @@ video::IImage *Align2Npot2(video::IImage *image, video::IVideoDriver *driver) core::dimension2d<u32> dim = image->getDimension(); unsigned int height = npot2(dim.Height); - unsigned int width = npot2(dim.Width); + unsigned int width = npot2(dim.Width); if (dim.Height == height && dim.Width == width) return image; @@ -1096,8 +1065,9 @@ video::IImage *Align2Npot2(video::IImage *image, video::IVideoDriver *driver) if (dim.Width > width) width *= 2; - video::IImage *targetimage = driver->createImage( - video::ECF_A8R8G8B8, core::dimension2d<u32>(width, height)); + video::IImage *targetimage = + driver->createImage(video::ECF_A8R8G8B8, + core::dimension2d<u32>(width, height)); if (targetimage != NULL) image->copyToScaling(targetimage); @@ -1124,7 +1094,8 @@ static std::string unescape_string(const std::string &str, const char esc = '\\' return out; } -bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *&baseimg) +bool TextureSource::generateImagePart(std::string part_of_name, + video::IImage *& baseimg) { const char escape = '\\'; // same as in generateImage() video::IVideoDriver *driver = RenderingEngine::get_video_driver(); @@ -1140,34 +1111,28 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& if (!part_of_name.empty()) { // Do not create normalmap dummies - if (part_of_name.find("_normal.png") != - std::string::npos) { - warningstream << "generateImage(): Could not " - "load normal map \"" - << part_of_name << "\"" - << std::endl; + if (part_of_name.find("_normal.png") != std::string::npos) { + warningstream << "generateImage(): Could not load normal map \"" + << part_of_name << "\"" << std::endl; return true; } errorstream << "generateImage(): Could not load image \"" - << part_of_name - << "\" while building texture; " - "Creating a dummy image" - << std::endl; + << part_of_name << "\" while building texture; " + "Creating a dummy image" << std::endl; } // Just create a dummy image - // core::dimension2d<u32> dim(2,2); - core::dimension2d<u32> dim(1, 1); + //core::dimension2d<u32> dim(2,2); + core::dimension2d<u32> dim(1,1); image = driver->createImage(video::ECF_A8R8G8B8, dim); sanity_check(image != NULL); /*image->setPixel(0,0, video::SColor(255,255,0,0)); image->setPixel(1,0, video::SColor(255,0,255,0)); image->setPixel(0,1, video::SColor(255,0,0,255)); image->setPixel(1,1, video::SColor(255,255,0,255));*/ - image->setPixel(0, 0, - video::SColor(255, myrand() % 256, myrand() % 256, - myrand() % 256)); + image->setPixel(0,0, video::SColor(255,myrand()%256, + myrand()%256,myrand()%256)); /*image->setPixel(1,0, video::SColor(255,myrand()%256, myrand()%256,myrand()%256)); image->setPixel(0,1, video::SColor(255,myrand()%256, @@ -1177,8 +1142,9 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& } // If base image is NULL, load as base. - if (baseimg == NULL) { - // infostream<<"Setting "<<part_of_name<<" as base"<<std::endl; + if (baseimg == NULL) + { + //infostream<<"Setting "<<part_of_name<<" as base"<<std::endl; /* Copy it this way to get an alpha channel. Otherwise images with alpha cannot be blitted on @@ -1189,15 +1155,16 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& image->copyTo(baseimg); } // Else blit on base. - else { - // infostream<<"Blitting "<<part_of_name<<" on base"<<std::endl; + else + { + //infostream<<"Blitting "<<part_of_name<<" on base"<<std::endl; // Size of the copied area core::dimension2d<u32> dim = image->getDimension(); - // core::dimension2d<u32> dim(16,16); + //core::dimension2d<u32> dim(16,16); // Position to copy the blitted to in the base image - core::position2d<s32> pos_to(0, 0); + core::position2d<s32> pos_to(0,0); // Position to copy the blitted from in the blitted image - core::position2d<s32> pos_from(0, 0); + core::position2d<s32> pos_from(0,0); // Blit /*image->copyToWithAlpha(baseimg, pos_to, core::rect<s32>(pos_from, dim), @@ -1207,23 +1174,18 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& core::dimension2d<u32> dim_dst = baseimg->getDimension(); if (dim == dim_dst) { blit_with_alpha(image, baseimg, pos_from, pos_to, dim); - } else if (dim.Width * dim.Height < - dim_dst.Width * dim_dst.Height) { + } else if (dim.Width * dim.Height < dim_dst.Width * dim_dst.Height) { // Upscale overlying image - video::IImage *scaled_image = - RenderingEngine::get_video_driver()->createImage( - video::ECF_A8R8G8B8, - dim_dst); + video::IImage *scaled_image = RenderingEngine::get_video_driver()-> + createImage(video::ECF_A8R8G8B8, dim_dst); image->copyToScaling(scaled_image); - blit_with_alpha(scaled_image, baseimg, pos_from, pos_to, - dim_dst); + blit_with_alpha(scaled_image, baseimg, pos_from, pos_to, dim_dst); scaled_image->drop(); } else { // Upscale base image - video::IImage *scaled_base = - RenderingEngine::get_video_driver()->createImage( - video::ECF_A8R8G8B8, dim); + video::IImage *scaled_base = RenderingEngine::get_video_driver()-> + createImage(video::ECF_A8R8G8B8, dim); baseimg->copyToScaling(scaled_base); baseimg->drop(); baseimg = scaled_base; @@ -1231,9 +1193,11 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& blit_with_alpha(image, baseimg, pos_from, pos_to, dim); } } - // cleanup + //cleanup image->drop(); - } else { + } + else + { // A special texture modification /*infostream<<"generateImage(): generating special " @@ -1246,11 +1210,12 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& Adds a cracking texture N = animation frame count, P = crack progression */ - if (str_starts_with(part_of_name, "[crack")) { + if (str_starts_with(part_of_name, "[crack")) + { if (baseimg == NULL) { - errorstream << "generateImagePart(): baseimg == NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + errorstream<<"generateImagePart(): baseimg == NULL " + <<"for part_of_name=\""<<part_of_name + <<"\", cancelling."<<std::endl; return false; } @@ -1280,12 +1245,12 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& horizontally tiled. */ video::IImage *img_crack = m_sourcecache.getOrLoad( - "crack_anylength.png"); + "crack_anylength.png"); if (img_crack) { - draw_crack(img_crack, baseimg, use_overlay, - frame_count, progression, driver, - tiles); + draw_crack(img_crack, baseimg, + use_overlay, frame_count, + progression, driver, tiles); img_crack->drop(); } } @@ -1294,55 +1259,53 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& [combine:WxH:X,Y=filename:X,Y=filename2 Creates a bigger texture from any amount of smaller ones */ - else if (str_starts_with(part_of_name, "[combine")) { + else if (str_starts_with(part_of_name, "[combine")) + { Strfnd sf(part_of_name); sf.next(":"); u32 w0 = stoi(sf.next("x")); u32 h0 = stoi(sf.next(":")); - core::dimension2d<u32> dim(w0, h0); + core::dimension2d<u32> dim(w0,h0); if (baseimg == NULL) { baseimg = driver->createImage(video::ECF_A8R8G8B8, dim); - baseimg->fill(video::SColor(0, 0, 0, 0)); + baseimg->fill(video::SColor(0,0,0,0)); } while (!sf.at_end()) { u32 x = stoi(sf.next(",")); u32 y = stoi(sf.next("=")); - std::string filename = unescape_string( - sf.next_esc(":", escape), escape); - infostream << "Adding \"" << filename - << "\" to combined (" << x << "," << y << ")" - << std::endl; + std::string filename = unescape_string(sf.next_esc(":", escape), escape); + infostream<<"Adding \""<<filename + <<"\" to combined ("<<x<<","<<y<<")" + <<std::endl; video::IImage *img = generateImage(filename); if (img) { core::dimension2d<u32> dim = img->getDimension(); core::position2d<s32> pos_base(x, y); - video::IImage *img2 = driver->createImage( - video::ECF_A8R8G8B8, dim); + video::IImage *img2 = + driver->createImage(video::ECF_A8R8G8B8, dim); img->copyTo(img2); img->drop(); /*img2->copyToWithAlpha(baseimg, pos_base, core::rect<s32>(v2s32(0,0), dim), video::SColor(255,255,255,255), NULL);*/ - blit_with_alpha(img2, baseimg, v2s32(0, 0), - pos_base, dim); + blit_with_alpha(img2, baseimg, v2s32(0,0), pos_base, dim); img2->drop(); } else { - errorstream << "generateImagePart(): Failed to " - "load image \"" - << filename << "\" for [combine" - << std::endl; + errorstream << "generateImagePart(): Failed to load image \"" + << filename << "\" for [combine" << std::endl; } } } /* [brighten */ - else if (str_starts_with(part_of_name, "[brighten")) { + else if (str_starts_with(part_of_name, "[brighten")) + { if (baseimg == NULL) { - errorstream << "generateImagePart(): baseimg==NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + errorstream<<"generateImagePart(): baseimg==NULL " + <<"for part_of_name=\""<<part_of_name + <<"\", cancelling."<<std::endl; return false; } @@ -1355,33 +1318,36 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& that the transparent parts don't look completely black when simple alpha channel is used for rendering. */ - else if (str_starts_with(part_of_name, "[noalpha")) { - if (baseimg == NULL) { - errorstream << "generateImagePart(): baseimg==NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + else if (str_starts_with(part_of_name, "[noalpha")) + { + if (baseimg == NULL){ + errorstream<<"generateImagePart(): baseimg==NULL " + <<"for part_of_name=\""<<part_of_name + <<"\", cancelling."<<std::endl; return false; } core::dimension2d<u32> dim = baseimg->getDimension(); // Set alpha to full - for (u32 y = 0; y < dim.Height; y++) - for (u32 x = 0; x < dim.Width; x++) { - video::SColor c = baseimg->getPixel(x, y); - c.setAlpha(255); - baseimg->setPixel(x, y, c); - } + for (u32 y=0; y<dim.Height; y++) + for (u32 x=0; x<dim.Width; x++) + { + video::SColor c = baseimg->getPixel(x,y); + c.setAlpha(255); + baseimg->setPixel(x,y,c); + } } /* [makealpha:R,G,B Convert one color to transparent. */ - else if (str_starts_with(part_of_name, "[makealpha:")) { + else if (str_starts_with(part_of_name, "[makealpha:")) + { if (baseimg == NULL) { - errorstream << "generateImagePart(): baseimg == NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + errorstream<<"generateImagePart(): baseimg == NULL " + <<"for part_of_name=\""<<part_of_name + <<"\", cancelling."<<std::endl; return false; } @@ -1398,17 +1364,18 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& oldbaseimg->drop();*/ // Set alpha to full - for (u32 y = 0; y < dim.Height; y++) - for (u32 x = 0; x < dim.Width; x++) { - video::SColor c = baseimg->getPixel(x, y); - u32 r = c.getRed(); - u32 g = c.getGreen(); - u32 b = c.getBlue(); - if (!(r == r1 && g == g1 && b == b1)) - continue; - c.setAlpha(0); - baseimg->setPixel(x, y, c); - } + for (u32 y=0; y<dim.Height; y++) + for (u32 x=0; x<dim.Width; x++) + { + video::SColor c = baseimg->getPixel(x,y); + u32 r = c.getRed(); + u32 g = c.getGreen(); + u32 b = c.getBlue(); + if (!(r == r1 && g == g1 && b == b1)) + continue; + c.setAlpha(0); + baseimg->setPixel(x,y,c); + } } /* [transformN @@ -1430,11 +1397,12 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& The resulting transform will be equivalent to one of the eight existing ones, though (see: dihedral group). */ - else if (str_starts_with(part_of_name, "[transform")) { + else if (str_starts_with(part_of_name, "[transform")) + { if (baseimg == NULL) { - errorstream << "generateImagePart(): baseimg == NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + errorstream<<"generateImagePart(): baseimg == NULL " + <<"for part_of_name=\""<<part_of_name + <<"\", cancelling."<<std::endl; return false; } @@ -1456,11 +1424,12 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& Example (a grass block (not actually used in game): "[inventorycube{grass.png{mud.png&grass_side.png{mud.png&grass_side.png" */ - else if (str_starts_with(part_of_name, "[inventorycube")) { - if (baseimg != NULL) { - errorstream << "generateImagePart(): baseimg != NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + else if (str_starts_with(part_of_name, "[inventorycube")) + { + if (baseimg != NULL){ + errorstream<<"generateImagePart(): baseimg != NULL " + <<"for part_of_name=\""<<part_of_name + <<"\", cancelling."<<std::endl; return false; } @@ -1477,10 +1446,9 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& video::IImage *img_right = generateImage(imagename_right); if (img_top == NULL || img_left == NULL || img_right == NULL) { - errorstream << "generateImagePart(): Failed to create " - "textures" - << " for inventorycube \"" << part_of_name - << "\"" << std::endl; + errorstream << "generateImagePart(): Failed to create textures" + << " for inventorycube \"" << part_of_name << "\"" + << std::endl; baseimg = generateImage(imagename_top); return true; } @@ -1498,32 +1466,32 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& [lowpart:percent:filename Adds the lower part of a texture */ - else if (str_starts_with(part_of_name, "[lowpart:")) { + else if (str_starts_with(part_of_name, "[lowpart:")) + { Strfnd sf(part_of_name); sf.next(":"); u32 percent = stoi(sf.next(":")); - std::string filename = - unescape_string(sf.next_esc(":", escape), escape); + std::string filename = unescape_string(sf.next_esc(":", escape), escape); if (baseimg == NULL) - baseimg = driver->createImage( - video::ECF_A8R8G8B8, v2u32(16, 16)); + baseimg = driver->createImage(video::ECF_A8R8G8B8, v2u32(16,16)); video::IImage *img = generateImage(filename); - if (img) { + if (img) + { core::dimension2d<u32> dim = img->getDimension(); core::position2d<s32> pos_base(0, 0); - video::IImage *img2 = driver->createImage( - video::ECF_A8R8G8B8, dim); + video::IImage *img2 = + driver->createImage(video::ECF_A8R8G8B8, dim); img->copyTo(img2); img->drop(); core::position2d<s32> clippos(0, 0); - clippos.Y = dim.Height * (100 - percent) / 100; + clippos.Y = dim.Height * (100-percent) / 100; core::dimension2d<u32> clipdim = dim; clipdim.Height = clipdim.Height * percent / 100 + 1; core::rect<s32> cliprect(clippos, clipdim); img2->copyToWithAlpha(baseimg, pos_base, - core::rect<s32>(v2s32(0, 0), dim), - video::SColor(255, 255, 255, 255), + core::rect<s32>(v2s32(0,0), dim), + video::SColor(255,255,255,255), &cliprect); img2->drop(); } @@ -1533,41 +1501,42 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& Crops a frame of a vertical animation. N = frame count, I = frame index */ - else if (str_starts_with(part_of_name, "[verticalframe:")) { + else if (str_starts_with(part_of_name, "[verticalframe:")) + { Strfnd sf(part_of_name); sf.next(":"); u32 frame_count = stoi(sf.next(":")); u32 frame_index = stoi(sf.next(":")); - if (baseimg == NULL) { - errorstream << "generateImagePart(): baseimg != NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + if (baseimg == NULL){ + errorstream<<"generateImagePart(): baseimg != NULL " + <<"for part_of_name=\""<<part_of_name + <<"\", cancelling."<<std::endl; return false; } v2u32 frame_size = baseimg->getDimension(); frame_size.Y /= frame_count; - video::IImage *img = driver->createImage( - video::ECF_A8R8G8B8, frame_size); - if (!img) { - errorstream << "generateImagePart(): Could not create " - "image " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + video::IImage *img = driver->createImage(video::ECF_A8R8G8B8, + frame_size); + if (!img){ + errorstream<<"generateImagePart(): Could not create image " + <<"for part_of_name=\""<<part_of_name + <<"\", cancelling."<<std::endl; return false; } // Fill target image with transparency - img->fill(video::SColor(0, 0, 0, 0)); + img->fill(video::SColor(0,0,0,0)); core::dimension2d<u32> dim = frame_size; core::position2d<s32> pos_dst(0, 0); core::position2d<s32> pos_src(0, frame_index * frame_size.Y); baseimg->copyToWithAlpha(img, pos_dst, core::rect<s32>(pos_src, dim), - video::SColor(255, 255, 255, 255), NULL); + video::SColor(255,255,255,255), + NULL); // Replace baseimg baseimg->drop(); baseimg = img; @@ -1576,17 +1545,17 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& [mask:filename Applies a mask to an image */ - else if (str_starts_with(part_of_name, "[mask:")) { + else if (str_starts_with(part_of_name, "[mask:")) + { if (baseimg == NULL) { errorstream << "generateImage(): baseimg == NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; return false; } Strfnd sf(part_of_name); sf.next(":"); - std::string filename = - unescape_string(sf.next_esc(":", escape), escape); + std::string filename = unescape_string(sf.next_esc(":", escape), escape); video::IImage *img = generateImage(filename); if (img) { @@ -1595,7 +1564,7 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& img->drop(); } else { errorstream << "generateImage(): Failed to load \"" - << filename << "\"."; + << filename << "\"."; } } /* @@ -1610,8 +1579,8 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& if (baseimg == NULL) { errorstream << "generateImagePart(): baseimg != NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; return false; } @@ -1620,15 +1589,15 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& if (!parseColorString(color_str, color, false)) return false; - apply_multiplication(baseimg, v2u32(0, 0), - baseimg->getDimension(), color); + apply_multiplication(baseimg, v2u32(0, 0), baseimg->getDimension(), color); } /* [colorize:color Overlays image with given color color = color as ColorString */ - else if (str_starts_with(part_of_name, "[colorize:")) { + else if (str_starts_with(part_of_name, "[colorize:")) + { Strfnd sf(part_of_name); sf.next(":"); std::string color_str = sf.next(":"); @@ -1636,8 +1605,8 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& if (baseimg == NULL) { errorstream << "generateImagePart(): baseimg != NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; return false; } @@ -1653,14 +1622,14 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& else if (ratio_str == "alpha") keep_alpha = true; - apply_colorize(baseimg, v2u32(0, 0), baseimg->getDimension(), - color, ratio, keep_alpha); + apply_colorize(baseimg, v2u32(0, 0), baseimg->getDimension(), color, ratio, keep_alpha); } /* [applyfiltersformesh Internal modifier */ - else if (str_starts_with(part_of_name, "[applyfiltersformesh")) { + else if (str_starts_with(part_of_name, "[applyfiltersformesh")) + { /* IMPORTANT: When changing this, getTextureForMesh() needs to be * updated too. */ @@ -1668,33 +1637,25 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& if (g_settings->getBool("texture_clean_transparent")) imageCleanTransparent(baseimg, 127); - /* Upscale textures to user's requested minimum size. This is a - * trick to make filters look as good on low-res textures as on - * high-res ones, by making low-res textures BECOME high-res ones. - * This is helpful for worlds that mix high- and low-res textures, - * or for mods with least-common-denominator textures that don't - * have the resources to offer high-res alternatives. + /* Upscale textures to user's requested minimum size. This is a trick to make + * filters look as good on low-res textures as on high-res ones, by making + * low-res textures BECOME high-res ones. This is helpful for worlds that + * mix high- and low-res textures, or for mods with least-common-denominator + * textures that don't have the resources to offer high-res alternatives. */ - const bool filter = m_setting_trilinear_filter || - m_setting_bilinear_filter; - const s32 scaleto = - filter ? g_settings->getS32("texture_min_size") - : 1; + const bool filter = m_setting_trilinear_filter || m_setting_bilinear_filter; + const s32 scaleto = filter ? g_settings->getS32("texture_min_size") : 1; if (scaleto > 1) { - const core::dimension2d<u32> dim = - baseimg->getDimension(); + const core::dimension2d<u32> dim = baseimg->getDimension(); - /* Calculate scaling needed to make the shortest texture - * dimension equal to the target minimum. If e.g. this is - * a vertical frames animation, the short dimension will - * be the real size. + /* Calculate scaling needed to make the shortest texture dimension + * equal to the target minimum. If e.g. this is a vertical frames + * animation, the short dimension will be the real size. */ if ((dim.Width == 0) || (dim.Height == 0)) { - errorstream << "generateImagePart(): Illegal 0 " - "dimension " - << "for part_of_name=\"" - << part_of_name << "\", cancelling." - << std::endl; + errorstream << "generateImagePart(): Illegal 0 dimension " + << "for part_of_name=\""<< part_of_name + << "\", cancelling." << std::endl; return false; } u32 xscale = scaleto / dim.Width; @@ -1705,11 +1666,9 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& if (scale > 1) { u32 w = scale * dim.Width; u32 h = scale * dim.Height; - const core::dimension2d<u32> newdim = - core::dimension2d<u32>(w, h); + const core::dimension2d<u32> newdim = core::dimension2d<u32>(w, h); video::IImage *newimg = driver->createImage( - baseimg->getColorFormat(), - newdim); + baseimg->getColorFormat(), newdim); baseimg->copyToScaling(newimg); baseimg->drop(); baseimg = newimg; @@ -1720,11 +1679,12 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& [resize:WxH Resizes the base image to the given dimensions */ - else if (str_starts_with(part_of_name, "[resize")) { + else if (str_starts_with(part_of_name, "[resize")) + { if (baseimg == NULL) { errorstream << "generateImagePart(): baseimg == NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + << "for part_of_name=\""<< part_of_name + << "\", cancelling." << std::endl; return false; } @@ -1734,9 +1694,8 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& u32 height = stoi(sf.next("")); core::dimension2d<u32> dim(width, height); - video::IImage *image = - RenderingEngine::get_video_driver()->createImage( - video::ECF_A8R8G8B8, dim); + video::IImage *image = RenderingEngine::get_video_driver()-> + createImage(video::ECF_A8R8G8B8, dim); baseimg->copyToScaling(image); baseimg->drop(); baseimg = image; @@ -1751,8 +1710,8 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& else if (str_starts_with(part_of_name, "[opacity:")) { if (baseimg == NULL) { errorstream << "generateImagePart(): baseimg == NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; return false; } @@ -1764,12 +1723,12 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& core::dimension2d<u32> dim = baseimg->getDimension(); for (u32 y = 0; y < dim.Height; y++) - for (u32 x = 0; x < dim.Width; x++) { - video::SColor c = baseimg->getPixel(x, y); - c.setAlpha(floor((c.getAlpha() * ratio) / 255 + - 0.5)); - baseimg->setPixel(x, y, c); - } + for (u32 x = 0; x < dim.Width; x++) + { + video::SColor c = baseimg->getPixel(x, y); + c.setAlpha(floor((c.getAlpha() * ratio) / 255 + 0.5)); + baseimg->setPixel(x, y, c); + } } /* [invert:mode @@ -1781,8 +1740,8 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& else if (str_starts_with(part_of_name, "[invert:")) { if (baseimg == NULL) { errorstream << "generateImagePart(): baseimg == NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; return false; } @@ -1803,11 +1762,12 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& core::dimension2d<u32> dim = baseimg->getDimension(); for (u32 y = 0; y < dim.Height; y++) - for (u32 x = 0; x < dim.Width; x++) { - video::SColor c = baseimg->getPixel(x, y); - c.color ^= mask; - baseimg->setPixel(x, y, c); - } + for (u32 x = 0; x < dim.Width; x++) + { + video::SColor c = baseimg->getPixel(x, y); + c.color ^= mask; + baseimg->setPixel(x, y, c); + } } /* [sheet:WxH:X,Y @@ -1815,11 +1775,11 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& from the base image it assumes to be a tilesheet with dimensions W,H (in tiles). */ - else if (part_of_name.substr(0, 7) == "[sheet:") { + else if (part_of_name.substr(0,7) == "[sheet:") { if (baseimg == NULL) { errorstream << "generateImagePart(): baseimg != NULL " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; return false; } @@ -1836,26 +1796,26 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& video::IImage *img = driver->createImage( video::ECF_A8R8G8B8, tile_dim); if (!img) { - errorstream << "generateImagePart(): Could not create " - "image " - << "for part_of_name=\"" << part_of_name - << "\", cancelling." << std::endl; + errorstream << "generateImagePart(): Could not create image " + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; return false; } - img->fill(video::SColor(0, 0, 0, 0)); + img->fill(video::SColor(0,0,0,0)); v2u32 vdim(tile_dim); core::rect<s32> rect(v2s32(x0 * vdim.X, y0 * vdim.Y), tile_dim); baseimg->copyToWithAlpha(img, v2s32(0), rect, - video::SColor(255, 255, 255, 255), NULL); + video::SColor(255,255,255,255), NULL); // Replace baseimg baseimg->drop(); baseimg = img; - } else { + } + else + { errorstream << "generateImagePart(): Invalid " - " modification: \"" - << part_of_name << "\"" << std::endl; + " modification: \"" << part_of_name << "\"" << std::endl; } } @@ -1870,14 +1830,13 @@ bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& pixel with alpha=64 drawn atop a pixel with alpha=128 should yield a pixel with alpha=160, while getInterpolated would yield alpha=96. */ -static inline video::SColor blitPixel( - const video::SColor &src_c, const video::SColor &dst_c, u32 ratio) +static inline video::SColor blitPixel(const video::SColor &src_c, const video::SColor &dst_c, u32 ratio) { if (dst_c.getAlpha() == 0) return src_c; video::SColor out_c = src_c.getInterpolated(dst_c, (float)ratio / 255.0f); - out_c.setAlpha(dst_c.getAlpha() + (255 - dst_c.getAlpha()) * src_c.getAlpha() * - ratio / (255 * 255)); + out_c.setAlpha(dst_c.getAlpha() + (255 - dst_c.getAlpha()) * + src_c.getAlpha() * ratio / (255 * 255)); return out_c; } @@ -1888,42 +1847,45 @@ static inline video::SColor blitPixel( 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) +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 = blitPixel(src_c, dst_c, src_c.getAlpha()); - dst->setPixel(dst_x, dst_y, dst_c); - } + 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 = blitPixel(src_c, dst_c, src_c.getAlpha()); + dst->setPixel(dst_x, dst_y, dst_c); + } } /* Draw an image on top of an another one, using the alpha channel of the source image; only modify fully opaque pixels in destinaion */ -static void blit_with_alpha_overlay(video::IImage *src, video::IImage *dst, v2s32 src_pos, - v2s32 dst_pos, v2u32 size) +static void blit_with_alpha_overlay(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); - if (dst_c.getAlpha() == 255 && src_c.getAlpha() != 0) { - dst_c = blitPixel(src_c, dst_c, src_c.getAlpha()); - dst->setPixel(dst_x, dst_y, dst_c); - } + 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); + if (dst_c.getAlpha() == 255 && src_c.getAlpha() != 0) + { + dst_c = blitPixel(src_c, dst_c, src_c.getAlpha()); + dst->setPixel(dst_x, dst_y, dst_c); } + } } // This function has been disabled because it is currently unused. @@ -1966,60 +1928,61 @@ static void apply_colorize(video::IImage *dst, v2u32 dst_pos, v2u32 size, u32 alpha = color.getAlpha(); video::SColor dst_c; if ((ratio == -1 && alpha == 255) || ratio == 255) { // full replacement of color - if (keep_alpha) { // replace the color with alpha = dest alpha * color - // alpha + if (keep_alpha) { // replace the color with alpha = dest alpha * color alpha dst_c = color; for (u32 y = dst_pos.Y; y < dst_pos.Y + size.Y; y++) - for (u32 x = dst_pos.X; x < dst_pos.X + size.X; x++) { - u32 dst_alpha = dst->getPixel(x, y).getAlpha(); - if (dst_alpha > 0) { - dst_c.setAlpha(dst_alpha * alpha / 255); - dst->setPixel(x, y, dst_c); - } + for (u32 x = dst_pos.X; x < dst_pos.X + size.X; x++) { + u32 dst_alpha = dst->getPixel(x, y).getAlpha(); + if (dst_alpha > 0) { + dst_c.setAlpha(dst_alpha * alpha / 255); + dst->setPixel(x, y, dst_c); } + } } else { // replace the color including the alpha for (u32 y = dst_pos.Y; y < dst_pos.Y + size.Y; y++) - for (u32 x = dst_pos.X; x < dst_pos.X + size.X; x++) - if (dst->getPixel(x, y).getAlpha() > 0) - dst->setPixel(x, y, color); + for (u32 x = dst_pos.X; x < dst_pos.X + size.X; x++) + if (dst->getPixel(x, y).getAlpha() > 0) + dst->setPixel(x, y, color); } - } else { // interpolate between the color and destination + } else { // interpolate between the color and destination float interp = (ratio == -1 ? color.getAlpha() / 255.0f : ratio / 255.0f); for (u32 y = dst_pos.Y; y < dst_pos.Y + size.Y; y++) - for (u32 x = dst_pos.X; x < dst_pos.X + size.X; x++) { - dst_c = dst->getPixel(x, y); - if (dst_c.getAlpha() > 0) { - dst_c = color.getInterpolated(dst_c, interp); - dst->setPixel(x, y, dst_c); - } + for (u32 x = dst_pos.X; x < dst_pos.X + size.X; x++) { + dst_c = dst->getPixel(x, y); + if (dst_c.getAlpha() > 0) { + dst_c = color.getInterpolated(dst_c, interp); + dst->setPixel(x, y, dst_c); } + } } } /* Apply color to destination */ -static void apply_multiplication( - video::IImage *dst, v2u32 dst_pos, v2u32 size, const video::SColor &color) +static void apply_multiplication(video::IImage *dst, v2u32 dst_pos, v2u32 size, + const video::SColor &color) { video::SColor dst_c; for (u32 y = dst_pos.Y; y < dst_pos.Y + size.Y; y++) - for (u32 x = dst_pos.X; x < dst_pos.X + size.X; x++) { - dst_c = dst->getPixel(x, y); - dst_c.set(dst_c.getAlpha(), - (dst_c.getRed() * color.getRed()) / 255, - (dst_c.getGreen() * color.getGreen()) / 255, - (dst_c.getBlue() * color.getBlue()) / 255); - dst->setPixel(x, y, dst_c); - } + for (u32 x = dst_pos.X; x < dst_pos.X + size.X; x++) { + dst_c = dst->getPixel(x, y); + dst_c.set( + dst_c.getAlpha(), + (dst_c.getRed() * color.getRed()) / 255, + (dst_c.getGreen() * color.getGreen()) / 255, + (dst_c.getBlue() * color.getBlue()) / 255 + ); + dst->setPixel(x, y, dst_c); + } } /* Apply mask to destination */ -static void apply_mask(video::IImage *mask, video::IImage *dst, v2s32 mask_pos, - v2s32 dst_pos, v2u32 size) +static void apply_mask(video::IImage *mask, video::IImage *dst, + v2s32 mask_pos, v2s32 dst_pos, v2u32 size) { for (u32 y0 = 0; y0 < size.Y; y0++) { for (u32 x0 = 0; x0 < size.X; x0++) { @@ -2047,15 +2010,14 @@ video::IImage *create_crack_image(video::IImage *crack, s32 frame_index, core::rect<s32> frame(v2s32(0, frame_index * frame_size.Height), frame_size); video::IImage *result = nullptr; - // extract crack frame +// extract crack frame video::IImage *crack_tile = driver->createImage(video::ECF_A8R8G8B8, tile_size); if (!crack_tile) return nullptr; if (tile_size == frame_size) { crack->copyTo(crack_tile, v2s32(0, 0), frame); } else { - video::IImage *crack_frame = - driver->createImage(video::ECF_A8R8G8B8, frame_size); + video::IImage *crack_frame = driver->createImage(video::ECF_A8R8G8B8, frame_size); if (!crack_frame) goto exit__has_tile; crack->copyTo(crack_frame, v2s32(0, 0), frame); @@ -2065,43 +2027,46 @@ video::IImage *create_crack_image(video::IImage *crack, s32 frame_index, if (tiles == 1) return crack_tile; - // tile it +// tile it result = driver->createImage(video::ECF_A8R8G8B8, size); if (!result) goto exit__has_tile; result->fill({}); for (u8 i = 0; i < tiles; i++) for (u8 j = 0; j < tiles; j++) - crack_tile->copyTo(result, - v2s32(i * tile_size.Width, j * tile_size.Height)); + crack_tile->copyTo(result, v2s32(i * tile_size.Width, j * tile_size.Height)); exit__has_tile: crack_tile->drop(); return result; } -static void draw_crack(video::IImage *crack, video::IImage *dst, bool use_overlay, - s32 frame_count, s32 progression, video::IVideoDriver *driver, u8 tiles) +static void draw_crack(video::IImage *crack, video::IImage *dst, + bool use_overlay, s32 frame_count, s32 progression, + video::IVideoDriver *driver, u8 tiles) { // Dimension of destination image core::dimension2d<u32> dim_dst = dst->getDimension(); // Limit frame_count - if (frame_count > (s32)dim_dst.Height) + if (frame_count > (s32) dim_dst.Height) frame_count = dim_dst.Height; if (frame_count < 1) frame_count = 1; // Dimension of the scaled crack stage, // which is the same as the dimension of a single destination frame - core::dimension2d<u32> frame_size(dim_dst.Width, dim_dst.Height / frame_count); - video::IImage *crack_scaled = - create_crack_image(crack, progression, frame_size, tiles, driver); + core::dimension2d<u32> frame_size( + dim_dst.Width, + dim_dst.Height / frame_count + ); + video::IImage *crack_scaled = create_crack_image(crack, progression, + frame_size, tiles, driver); if (!crack_scaled) return; auto blit = use_overlay ? blit_with_alpha_overlay : blit_with_alpha; for (s32 i = 0; i < frame_count; ++i) { v2s32 dst_pos(0, frame_size.Height * i); - blit(crack_scaled, dst, v2s32(0, 0), dst_pos, frame_size); + blit(crack_scaled, dst, v2s32(0,0), dst_pos, frame_size); } crack_scaled->drop(); @@ -2114,17 +2079,18 @@ void brighten(video::IImage *image) core::dimension2d<u32> dim = image->getDimension(); - for (u32 y = 0; y < dim.Height; y++) - for (u32 x = 0; x < dim.Width; x++) { - video::SColor c = image->getPixel(x, y); - c.setRed(0.5 * 255 + 0.5 * (float)c.getRed()); - c.setGreen(0.5 * 255 + 0.5 * (float)c.getGreen()); - c.setBlue(0.5 * 255 + 0.5 * (float)c.getBlue()); - image->setPixel(x, y, c); - } + for (u32 y=0; y<dim.Height; y++) + for (u32 x=0; x<dim.Width; x++) + { + video::SColor c = image->getPixel(x,y); + c.setRed(0.5 * 255 + 0.5 * (float)c.getRed()); + c.setGreen(0.5 * 255 + 0.5 * (float)c.getGreen()); + c.setBlue(0.5 * 255 + 0.5 * (float)c.getBlue()); + image->setPixel(x,y,c); + } } -u32 parseImageTransform(const std::string &s) +u32 parseImageTransform(const std::string& s) { int total_transform = 0; @@ -2137,20 +2103,21 @@ u32 parseImageTransform(const std::string &s) transform_names[6] = "fy"; std::size_t pos = 0; - while (pos < s.size()) { + while(pos < s.size()) + { int transform = -1; - for (int i = 0; i <= 7; ++i) { + for (int i = 0; i <= 7; ++i) + { const std::string &name_i = transform_names[i]; - if (s[pos] == ('0' + i)) { + if (s[pos] == ('0' + i)) + { transform = i; pos++; break; } - if (!(name_i.empty()) && - lowercase(s.substr(pos, name_i.size())) == - name_i) { + if (!(name_i.empty()) && lowercase(s.substr(pos, name_i.size())) == name_i) { transform = i; pos += name_i.size(); break; @@ -2198,35 +2165,35 @@ void imageTransform(u32 transform, video::IImage *src, video::IImage *dst) */ int sxn = 0; int syn = 2; - if (transform == 0) // identity - sxn = 0, syn = 2; // sx = dx, sy = dy - else if (transform == 1) // rotate by 90 degrees ccw - sxn = 3, syn = 0; // sx = (H-1) - dy, sy = dx - else if (transform == 2) // rotate by 180 degrees - sxn = 1, syn = 3; // sx = (W-1) - dx, sy = (H-1) - dy - else if (transform == 3) // rotate by 270 degrees ccw - sxn = 2, syn = 1; // sx = dy, sy = (W-1) - dx - else if (transform == 4) // flip x - sxn = 1, syn = 2; // sx = (W-1) - dx, sy = dy - else if (transform == 5) // flip x then rotate by 90 degrees ccw - sxn = 2, syn = 0; // sx = dy, sy = dx - else if (transform == 6) // flip y - sxn = 0, syn = 3; // sx = dx, sy = (H-1) - dy - else if (transform == 7) // flip y then rotate by 90 degrees ccw - sxn = 3, syn = 1; // sx = (H-1) - dy, sy = (W-1) - dx - - for (u32 dy = 0; dy < dstdim.Height; dy++) - for (u32 dx = 0; dx < dstdim.Width; dx++) { - u32 entries[4] = {dx, dstdim.Width - 1 - dx, dy, - dstdim.Height - 1 - dy}; - u32 sx = entries[sxn]; - u32 sy = entries[syn]; - video::SColor c = src->getPixel(sx, sy); - dst->setPixel(dx, dy, c); - } + if (transform == 0) // identity + sxn = 0, syn = 2; // sx = dx, sy = dy + else if (transform == 1) // rotate by 90 degrees ccw + sxn = 3, syn = 0; // sx = (H-1) - dy, sy = dx + else if (transform == 2) // rotate by 180 degrees + sxn = 1, syn = 3; // sx = (W-1) - dx, sy = (H-1) - dy + else if (transform == 3) // rotate by 270 degrees ccw + sxn = 2, syn = 1; // sx = dy, sy = (W-1) - dx + else if (transform == 4) // flip x + sxn = 1, syn = 2; // sx = (W-1) - dx, sy = dy + else if (transform == 5) // flip x then rotate by 90 degrees ccw + sxn = 2, syn = 0; // sx = dy, sy = dx + else if (transform == 6) // flip y + sxn = 0, syn = 3; // sx = dx, sy = (H-1) - dy + else if (transform == 7) // flip y then rotate by 90 degrees ccw + sxn = 3, syn = 1; // sx = (H-1) - dy, sy = (W-1) - dx + + for (u32 dy=0; dy<dstdim.Height; dy++) + for (u32 dx=0; dx<dstdim.Width; dx++) + { + u32 entries[4] = {dx, dstdim.Width-1-dx, dy, dstdim.Height-1-dy}; + u32 sx = entries[sxn]; + u32 sy = entries[syn]; + video::SColor c = src->getPixel(sx,sy); + dst->setPixel(dx,dy,c); + } } -video::ITexture *TextureSource::getNormalTexture(const std::string &name) +video::ITexture* TextureSource::getNormalTexture(const std::string &name) { if (isKnownSourceImage("override_normal.png")) return getTexture("override_normal.png"); @@ -2252,8 +2219,9 @@ video::SColor TextureSource::getTextureAverageColor(const std::string &name) video::IVideoDriver *driver = RenderingEngine::get_video_driver(); video::SColor c(0, 0, 0, 0); video::ITexture *texture = getTexture(name); - video::IImage *image = driver->createImage( - texture, core::position2d<s32>(0, 0), texture->getOriginalSize()); + video::IImage *image = driver->createImage(texture, + core::position2d<s32>(0, 0), + texture->getOriginalSize()); u32 total = 0; u32 tR = 0; u32 tG = 0; @@ -2264,7 +2232,7 @@ video::SColor TextureSource::getTextureAverageColor(const std::string &name) step = dim.Width / 16; for (u16 x = 0; x < dim.Width; x += step) { for (u16 y = 0; y < dim.Width; y += step) { - c = image->getPixel(x, y); + c = image->getPixel(x,y); if (c.getAlpha() > 0) { total++; tR += c.getRed(); @@ -2283,6 +2251,7 @@ video::SColor TextureSource::getTextureAverageColor(const std::string &name) return c; } + video::ITexture *TextureSource::getShaderFlagsTexture(bool normalmap_present) { std::string tname = "__shaderFlagsTexture"; @@ -2294,13 +2263,14 @@ video::ITexture *TextureSource::getShaderFlagsTexture(bool normalmap_present) video::IVideoDriver *driver = RenderingEngine::get_video_driver(); video::IImage *flags_image = driver->createImage( - video::ECF_A8R8G8B8, core::dimension2d<u32>(1, 1)); + video::ECF_A8R8G8B8, core::dimension2d<u32>(1, 1)); sanity_check(flags_image != NULL); video::SColor c(255, normalmap_present ? 255 : 0, 0, 0); flags_image->setPixel(0, 0, c); insertSourceImage(tname, flags_image); flags_image->drop(); return getTexture(tname); + } std::vector<std::string> getTextureDirs() |