void GLES2Texture::loadImpl() { if (mUsage & TU_RENDERTARGET) { createRenderTexture(); return; } // Now the only copy is on the stack and will be cleaned in case of // exceptions being thrown from _loadImages LoadedImages loadedImages = mLoadedImages; mLoadedImages.setNull(); // Call internal _loadImages, not loadImage since that's external and // will determine load status etc again ConstImagePtrList imagePtrs; for (size_t i = 0; i < loadedImages->size(); ++i) { imagePtrs.push_back(&(*loadedImages)[i]); } _loadImages(imagePtrs); if((mUsage & TU_AUTOMIPMAP) && mNumRequestedMipmaps && mMipmapsHardwareGenerated) { OGRE_CHECK_GL_ERROR(glGenerateMipmap(getGLES2TextureTarget())); } }
void GLTexture::loadImpl() { if( mUsage & TU_RENDERTARGET ) { createRenderTexture(); return; } // Now the only copy is on the stack and will be cleaned in case of // exceptions being thrown from _loadImages LoadedImages loadedImages = mLoadedImages; mLoadedImages.setNull(); // Call internal _loadImages, not loadImage since that's external and // will determine load status etc again ConstImagePtrList imagePtrs; for (size_t i=0 ; i<loadedImages->size() ; ++i) { imagePtrs.push_back(&(*loadedImages)[i]); } _loadImages(imagePtrs); // Generate mipmaps after all texture levels have been loaded // This is required for compressed formats such as DXT // If we can do automip generation and the user desires this, do so if((mUsage & TU_AUTOMIPMAP) && mNumRequestedMipmaps && mMipmapsHardwareGenerated) { glGenerateMipmapEXT(getGLTextureTarget()); } }
//---------------------------------------------------------------------- void DefaultTextureLoadContext::apply(Resource* _destResource) { Texture* texture = static_cast<Texture*>(_destResource); ConstImagePtrList imagePtrs; imagePtrs.push_back(&mImage); texture->_loadImages( imagePtrs ); }
void GL3PlusTexture::loadImpl() { if (mUsage & TU_RENDERTARGET) { createRenderTexture(); return; } // Now the only copy is on the stack and will be cleaned in case of // exceptions being thrown from _loadImages LoadedImages loadedImages = mLoadedImages; mLoadedImages.setNull(); // Call internal _loadImages, not loadImage since that's external and // will determine load status etc again ConstImagePtrList imagePtrs; for (size_t i = 0; i < loadedImages->size(); ++i) { imagePtrs.push_back(&(*loadedImages)[i]); } _loadImages(imagePtrs); // Generate mipmaps after all texture levels have been loaded // This is required for compressed formats such as DXT if (mUsage & TU_AUTOMIPMAP) { OGRE_CHECK_GL_ERROR(glGenerateMipmap(getGL3PlusTextureTarget())); } }
//------------------------------------------------------------------------------// void Texture::_loadImages(const ConstImagePtrList& images) { if(images.size() < 1) TITAN_EXCEPT_INVALIDPARAMS( "image list is empty" ); mWidth = images[0]->getWidth(); mHeight = images[0]->getHeight(); mPixelFormat = images[0]->getFormat(); _loadImgsImpl(images); }
void GLTexture::loadImpl() { if( mUsage & TU_RENDERTARGET ) { createRenderTexture(); return; } // Now the only copy is on the stack and will be cleaned in case of // exceptions being thrown from _loadImages LoadedImages loadedImages = mLoadedImages; mLoadedImages.setNull(); // Call internal _loadImages, not loadImage since that's external and // will determine load status etc again ConstImagePtrList imagePtrs; for (size_t i=0 ; i<loadedImages->size() ; ++i) { imagePtrs.push_back(&(*loadedImages)[i]); } _loadImages(imagePtrs); }
//-------------------------------------------------------------------------- void Texture::_loadImages( const ConstImagePtrList& images ) { if(images.size() < 1) OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Cannot load empty vector of images", "Texture::loadImages"); // Set desired texture size and properties from images[0] mSrcWidth = mWidth = images[0]->getWidth(); mSrcHeight = mHeight = images[0]->getHeight(); mSrcDepth = mDepth = images[0]->getDepth(); // Get source image format and adjust if required mSrcFormat = images[0]->getFormat(); if (mTreatLuminanceAsAlpha && mSrcFormat == PF_L8) { mSrcFormat = PF_A8; } if (mDesiredFormat != PF_UNKNOWN) { // If have desired format, use it mFormat = mDesiredFormat; } else { // Get the format according with desired bit depth mFormat = PixelUtil::getFormatForBitDepths(mSrcFormat, mDesiredIntegerBitDepth, mDesiredFloatBitDepth); } // The custom mipmaps in the image have priority over everything size_t imageMips = images[0]->getNumMipmaps(); if(imageMips > 0) { mNumMipmaps = mNumRequestedMipmaps = images[0]->getNumMipmaps(); // Disable flag for auto mip generation mUsage &= ~TU_AUTOMIPMAP; } // Create the texture createInternalResources(); // Check if we're loading one image with multiple faces // or a vector of images representing the faces size_t faces; bool multiImage; // Load from multiple images? if(images.size() > 1) { faces = images.size(); multiImage = true; } else { faces = images[0]->getNumFaces(); multiImage = false; } // Check wether number of faces in images exceeds number of faces // in this texture. If so, clamp it. if(faces > getNumFaces()) faces = getNumFaces(); if (TextureManager::getSingleton().getVerbose()) { // Say what we're doing StringUtil::StrStreamType str; str << "Texture: " << mName << ": Loading " << faces << " faces" << "(" << PixelUtil::getFormatName(images[0]->getFormat()) << "," << images[0]->getWidth() << "x" << images[0]->getHeight() << "x" << images[0]->getDepth() << ") with "; if (!(mMipmapsHardwareGenerated && mNumMipmaps == 0)) str << mNumMipmaps; if(mUsage & TU_AUTOMIPMAP) { if (mMipmapsHardwareGenerated) str << " hardware"; str << " generated mipmaps"; } else { str << " custom mipmaps"; } if(multiImage) str << " from multiple Images."; else str << " from Image."; // Scoped { // Print data about first destination surface HardwarePixelBufferSharedPtr buf = getBuffer(0, 0); str << " Internal format is " << PixelUtil::getFormatName(buf->getFormat()) << "," << buf->getWidth() << "x" << buf->getHeight() << "x" << buf->getDepth() << "."; } LogManager::getSingleton().logMessage( LML_NORMAL, str.str()); } // Main loading loop // imageMips == 0 if the image has no custom mipmaps, otherwise contains the number of custom mips for(size_t mip = 0; mip<=imageMips; ++mip) { for(size_t i = 0; i < faces; ++i) { PixelBox src; if(multiImage) { // Load from multiple images src = images[i]->getPixelBox(0, mip); } else { // Load from faces of images[0] src = images[0]->getPixelBox(i, mip); } // Sets to treated format in case is difference src.format = mSrcFormat; if(mGamma != 1.0f) { // Apply gamma correction // Do not overwrite original image but do gamma correction in temporary buffer MemoryDataStreamPtr buf; // for scoped deletion of conversion buffer buf.bind(OGRE_NEW MemoryDataStream( PixelUtil::getMemorySize( src.getWidth(), src.getHeight(), src.getDepth(), src.format))); PixelBox corrected = PixelBox(src.getWidth(), src.getHeight(), src.getDepth(), src.format, buf->getPtr()); PixelUtil::bulkPixelConversion(src, corrected); Image::applyGamma(static_cast<uint8*>(corrected.data), mGamma, corrected.getConsecutiveSize(), static_cast<uchar>(PixelUtil::getNumElemBits(src.format))); // Destination: entire texture. blitFromMemory does the scaling to // a power of two for us when needed getBuffer(i, mip)->blitFromMemory(corrected); } else { // Destination: entire texture. blitFromMemory does the scaling to // a power of two for us when needed getBuffer(i, mip)->blitFromMemory(src); } } } // Update size (the final size, not including temp space) mSize = getNumFaces() * PixelUtil::getMemorySize(mWidth, mHeight, mDepth, mFormat); }
void GLTexture::loadImpl() { if( mUsage & TU_RENDERTARGET ) { createRenderTexture(); } else { String baseName, ext; size_t pos = mName.find_last_of("."); if( pos == String::npos ) OGRE_EXCEPT( Exception::ERR_INVALIDPARAMS, "Unable to load image file '"+ mName + "' - invalid extension.", "GLTexture::loadImpl" ); baseName = mName.substr(0, pos); ext = mName.substr(pos+1); if(mTextureType == TEX_TYPE_1D || mTextureType == TEX_TYPE_2D || mTextureType == TEX_TYPE_3D) { Image img; // find & load resource data intro stream to allow resource // group changes if required DataStreamPtr dstream = ResourceGroupManager::getSingleton().openResource( mName, mGroup, true, this); img.load(dstream, ext); // If this is a cube map, set the texture type flag accordingly. if (img.hasFlag(IF_CUBEMAP)) mTextureType = TEX_TYPE_CUBE_MAP; // If this is a volumetric texture set the texture type flag accordingly. if(img.getDepth() > 1) mTextureType = TEX_TYPE_3D; // Call internal _loadImages, not loadImage since that's external and // will determine load status etc again ConstImagePtrList imagePtrs; imagePtrs.push_back(&img); _loadImages( imagePtrs ); } else if (mTextureType == TEX_TYPE_CUBE_MAP) { if(StringUtil::endsWith(getName(), ".dds")) { // XX HACK there should be a better way to specify whether // all faces are in the same file or not Image img; // find & load resource data intro stream to allow resource // group changes if required DataStreamPtr dstream = ResourceGroupManager::getSingleton().openResource( mName, mGroup, true, this); img.load(dstream, ext); // Call internal _loadImages, not loadImage since that's external and // will determine load status etc again ConstImagePtrList imagePtrs; imagePtrs.push_back(&img); _loadImages( imagePtrs ); } else { std::vector<Image> images(6); ConstImagePtrList imagePtrs; static const String suffixes[6] = {"_rt", "_lf", "_up", "_dn", "_fr", "_bk"}; for(size_t i = 0; i < 6; i++) { String fullName = baseName + suffixes[i] + "." + ext; // find & load resource data intro stream to allow resource // group changes if required DataStreamPtr dstream = ResourceGroupManager::getSingleton().openResource( fullName, mGroup, true, this); images[i].load(dstream, ext); imagePtrs.push_back(&images[i]); } _loadImages( imagePtrs ); } } else OGRE_EXCEPT( Exception::ERR_NOT_IMPLEMENTED, "**** Unknown texture type ****", "GLTexture::load" ); } }