/* void TextureAsset::RegenerateAllMipLevels() { if (ogreTexture.isNull()) return; ///\todo This function does not quite work, since ogreTexture->getNumMipmaps() will return 0 to denote a "full mipmap chain". for(int f = 0; f < ogreTexture->getNumFaces(); ++f) for(int i = 1; i < ogreTexture->getNumMipmaps(); ++i) { Ogre::HardwarePixelBufferSharedPtr src = ogreTexture->getBuffer(f, i-1); Ogre::Box srcSize(0, 0, src->getWidth(), src->getHeight()); Ogre::HardwarePixelBufferSharedPtr dst = ogreTexture->getBuffer(f, i); Ogre::Box dstSize(0, 0, dst->getWidth(), dst->getHeight()); dst->blit(src, srcSize, dstSize); } } */ bool TextureAsset::SerializeTo(std::vector<u8> &data, const QString &serializationParameters) const { if (ogreTexture.isNull()) { LogWarning("SerializeTo: Called on an unloaded texture \"" + Name().toStdString() + "\"."); return false; } try { Ogre::Image new_image; // From Ogre 1.7 Texture::convertToImage() size_t numMips = 1; size_t dataSize = Ogre::Image::calculateSize(numMips, ogreTexture->getNumFaces(), ogreTexture->getWidth(), ogreTexture->getHeight(), ogreTexture->getDepth(), ogreTexture->getFormat()); void* pixData = OGRE_MALLOC(dataSize, Ogre::MEMCATEGORY_GENERAL); // if there are multiple faces and mipmaps we must pack them into the data // faces, then mips void* currentPixData = pixData; for (size_t face = 0; face < ogreTexture->getNumFaces(); ++face) { for (size_t mip = 0; mip < numMips; ++mip) { size_t mipDataSize = Ogre::PixelUtil::getMemorySize(ogreTexture->getWidth(), ogreTexture->getHeight(), ogreTexture->getDepth(), ogreTexture->getFormat()); Ogre::PixelBox pixBox(ogreTexture->getWidth(), ogreTexture->getHeight(), ogreTexture->getDepth(), ogreTexture->getFormat(), currentPixData); ogreTexture->getBuffer(face, mip)->blitToMemory(pixBox); currentPixData = (void*)((char*)currentPixData + mipDataSize); } } // load, and tell Image to delete the memory when it's done. new_image.loadDynamicImage((Ogre::uchar*)pixData, ogreTexture->getWidth(), ogreTexture->getHeight(), ogreTexture->getDepth(), ogreTexture->getFormat(), true, ogreTexture->getNumFaces(), numMips - 1); Ogre::DataStreamPtr imageStream = new_image.encode(serializationParameters.toStdString()); if (imageStream.get() && imageStream->size() > 0) { data.resize(imageStream->size()); imageStream->read(&data[0], data.size()); } } catch (std::exception &e) { LogError("SerializeTo: Failed to export Ogre texture " + Name().toStdString() + ":"); if (e.what()) OgreRenderer::OgreRenderingModule::LogError(e.what()); return false; } return true; }
//--------------------------------------------------------------------- void Texture::convertToImage(Image& destImage, bool includeMipMaps) { size_t numMips = includeMipMaps? getNumMipmaps() + 1 : 1; size_t dataSize = Image::calculateSize(numMips, getNumFaces(), getWidth(), getHeight(), getDepth(), getFormat()); void* pixData = OGRE_MALLOC(dataSize, Ogre::MEMCATEGORY_GENERAL); // if there are multiple faces and mipmaps we must pack them into the data // faces, then mips void* currentPixData = pixData; for (size_t face = 0; face < getNumFaces(); ++face) { uint32 width = getWidth(); uint32 height = getHeight(); uint32 depth = getDepth(); for (size_t mip = 0; mip < numMips; ++mip) { size_t mipDataSize = PixelUtil::getMemorySize(width, height, depth, getFormat()); Ogre::PixelBox pixBox(width, height, depth, getFormat(), currentPixData); getBuffer(face, mip)->blitToMemory(pixBox); currentPixData = (void*)((char*)currentPixData + mipDataSize); if(width != 1) width /= 2; if(height != 1) height /= 2; if(depth != 1) depth /= 2; } } // load, and tell Image to delete the memory when it's done. destImage.loadDynamicImage((Ogre::uchar*)pixData, getWidth(), getHeight(), getDepth(), getFormat(), true, getNumFaces(), numMips - 1); }