diff --git a/OgreMain/include/OgreTextureUnitState.h b/OgreMain/include/OgreTextureUnitState.h index c768bdf6feb..bdb5a64fd53 100644 --- a/OgreMain/include/OgreTextureUnitState.h +++ b/OgreMain/include/OgreTextureUnitState.h @@ -1176,7 +1176,6 @@ namespace Ogre { // Complex members (those that can't be copied using memcpy) are at the end to // allow for fast copying of the basic members. // - vector::type mFrames; mutable vector::type mFramePtrs; String mName; ///< Optional name for the TUS. String mTextureNameAlias; ///< Optional alias for texture frames. @@ -1212,7 +1211,7 @@ namespace Ogre { /** Internal method for ensuring the texture for a given frame is loaded. */ void ensureLoaded(size_t frame) const; - + TexturePtr retrieveTexture(const String& name); }; /** @} */ diff --git a/OgreMain/src/OgreTextureUnitState.cpp b/OgreMain/src/OgreTextureUnitState.cpp index 7c23b1e3d0e..3472a44a211 100644 --- a/OgreMain/src/OgreTextureUnitState.cpp +++ b/OgreMain/src/OgreTextureUnitState.cpp @@ -154,9 +154,8 @@ namespace Ogre { removeAllEffects(); // copy basic members (int's, real's) - memcpy( this, &oth, (const uchar *)(&oth.mFrames) - (const uchar *)(&oth) ); + memcpy( this, &oth, (const uchar *)(&oth.mFramePtrs) - (const uchar *)(&oth) ); // copy complex members - mFrames = oth.mFrames; mFramePtrs = oth.mFramePtrs; mName = oth.mName; mEffects = oth.mEffects; @@ -188,50 +187,21 @@ namespace Ogre { const String& TextureUnitState::getTextureName(void) const { // Return name of current frame - if (mCurrentFrame < mFrames.size()) - return mFrames[mCurrentFrame]; + if (mCurrentFrame < mFramePtrs.size()) + return mFramePtrs[mCurrentFrame]->getName(); else return BLANKSTRING; } //----------------------------------------------------------------------- void TextureUnitState::setTextureName( const String& name, TextureType texType) { - setContentType(CONTENT_NAMED); - mTextureLoadFailed = false; - - if (texType == TEX_TYPE_CUBE_MAP) - { - // delegate to cubic texture implementation - setCubicTextureName(name, true); - } - else - { - mFrames.resize(1); - mFramePtrs.resize(1); - mFrames[0] = name; - mFramePtrs[0].reset(); - // defer load until used, so don't grab pointer yet - mCurrentFrame = 0; - mCubic = false; - mTextureType = texType; - if (name.empty()) - { - return; - } + TexturePtr tex = retrieveTexture(name); - - // Load immediately ? - if (isLoaded()) - { - _load(); // reload - } - // Tell parent to recalculate hash - if( Pass::getHashFunction() == Pass::getBuiltinHashFunction( Pass::MIN_TEXTURE_CHANGE ) ) - { - mParent->_dirtyHash(); - } - } + if(!tex) + return; + tex->setTextureType(texType); + setTexture(tex); } //----------------------------------------------------------------------- void TextureUnitState::setTexture( const TexturePtr& texPtr) @@ -253,11 +223,9 @@ namespace Ogre { } else { - mFrames.resize(1); mFramePtrs.resize(1); - mFrames[0] = texPtr->getName(); mFramePtrs[0] = texPtr; - // defer load until used, so don't grab pointer yet + mCurrentFrame = 0; mCubic = false; mTextureType = texPtr->getTextureType(); @@ -291,8 +259,6 @@ namespace Ogre { mContentType = ct; if (ct == CONTENT_SHADOW || ct == CONTENT_COMPOSITOR) { - // Clear out texture frames, not applicable - mFrames.clear(); // One reference space, set manually through _setTexturePtr mFramePtrs.resize(1); mFramePtrs[0].reset(); @@ -312,8 +278,6 @@ namespace Ogre { } else { - setContentType(CONTENT_NAMED); - mTextureLoadFailed = false; String ext; String baseName; StringUtil::splitBaseFilename(name, baseName, ext); @@ -332,40 +296,26 @@ namespace Ogre { //----------------------------------------------------------------------- void TextureUnitState::setCubicTextureName(const String* const names, bool forUVW) { - setContentType(CONTENT_NAMED); - mTextureLoadFailed = false; - mFrames.resize(forUVW ? 1 : 6); - // resize pointers, but don't populate until asked for mFramePtrs.resize(forUVW ? 1 : 6); - mAnimDuration = 0; - mCurrentFrame = 0; - mCubic = true; - mTextureType = forUVW ? TEX_TYPE_CUBE_MAP : TEX_TYPE_2D; - - for (unsigned int i = 0; i < mFrames.size(); ++i) + for (unsigned int i = 0; i < mFramePtrs.size(); ++i) { - mFrames[i] = names[i]; - mFramePtrs[i].reset(); + mFramePtrs[i] = retrieveTexture(names[i]); } - // Tell parent we need recompiling, will cause reload too - mParent->_notifyNeedsRecompile(); + setCubicTexture(&mFramePtrs[0], forUVW); } //----------------------------------------------------------------------- void TextureUnitState::setCubicTexture( const TexturePtr* const texPtrs, bool forUVW ) { setContentType(CONTENT_NAMED); mTextureLoadFailed = false; - mFrames.resize(forUVW ? 1 : 6); - // resize pointers, but don't populate until asked for mFramePtrs.resize(forUVW ? 1 : 6); mAnimDuration = 0; mCurrentFrame = 0; mCubic = true; mTextureType = forUVW ? TEX_TYPE_CUBE_MAP : TEX_TYPE_2D; - for (unsigned int i = 0; i < mFrames.size(); ++i) + for (unsigned int i = 0; i < mFramePtrs.size(); ++i) { - mFrames[i] = texPtrs[i]->getName(); mFramePtrs[i] = texPtrs[i]; } // Tell parent we need recompiling, will cause reload too @@ -392,11 +342,9 @@ namespace Ogre { void TextureUnitState::setFrameTextureName(const String& name, unsigned int frameNumber) { mTextureLoadFailed = false; - if (frameNumber < mFrames.size()) + if (frameNumber < mFramePtrs.size()) { - mFrames[frameNumber] = name; - // reset pointer (don't populate until requested) - mFramePtrs[frameNumber].reset(); + mFramePtrs[frameNumber] = retrieveTexture(name); if (isLoaded()) { @@ -421,7 +369,6 @@ namespace Ogre { setContentType(CONTENT_NAMED); mTextureLoadFailed = false; - mFrames.push_back(name); // Add blank pointer, load on demand mFramePtrs.push_back(TexturePtr()); @@ -441,9 +388,8 @@ namespace Ogre { void TextureUnitState::deleteFrameTextureName(const size_t frameNumber) { mTextureLoadFailed = false; - if (frameNumber < mFrames.size()) + if (frameNumber < mFramePtrs.size()) { - mFrames.erase(mFrames.begin() + frameNumber); mFramePtrs.erase(mFramePtrs.begin() + frameNumber); if (isLoaded()) @@ -476,19 +422,17 @@ namespace Ogre { baseName = name.substr(0, pos); ext = name.substr(pos); - mFrames.resize(numFrames); // resize pointers, but don't populate until needed mFramePtrs.resize(numFrames); mAnimDuration = duration; mCurrentFrame = 0; mCubic = false; - for (unsigned int i = 0; i < mFrames.size(); ++i) + for (unsigned int i = 0; i < mFramePtrs.size(); ++i) { StringStream str; str << baseName << "_" << i << ext; - mFrames[i] = str.str(); - mFramePtrs[i].reset(); + mFramePtrs[i] = retrieveTexture(str.str()); } // Load immediately if Material loaded @@ -509,17 +453,15 @@ namespace Ogre { setContentType(CONTENT_NAMED); mTextureLoadFailed = false; - mFrames.resize(numFrames); // resize pointers, but don't populate until needed mFramePtrs.resize(numFrames); mAnimDuration = duration; mCurrentFrame = 0; mCubic = false; - for (unsigned int i = 0; i < mFrames.size(); ++i) + for (unsigned int i = 0; i < mFramePtrs.size(); ++i) { - mFrames[i] = names[i]; - mFramePtrs[i].reset(); + mFramePtrs[i] = retrieveTexture(names[i]); } // Load immediately if Material loaded @@ -539,7 +481,7 @@ namespace Ogre { TexturePtr tex = _getTexturePtr(frame); if (!tex) - OGRE_EXCEPT( Exception::ERR_ITEM_NOT_FOUND, "Could not find texture " + mFrames[ frame ], + OGRE_EXCEPT( Exception::ERR_ITEM_NOT_FOUND, "Could not find texture " + StringConverter::toString(frame), "TextureUnitState::getTextureDimensions" ); return std::pair< size_t, size_t >( tex->getWidth(), tex->getHeight() ); @@ -547,7 +489,7 @@ namespace Ogre { //----------------------------------------------------------------------- void TextureUnitState::setCurrentFrame(unsigned int frameNumber) { - if (frameNumber < mFrames.size()) + if (frameNumber < mFramePtrs.size()) { mCurrentFrame = frameNumber; // this will affect the hash @@ -571,18 +513,18 @@ namespace Ogre { //----------------------------------------------------------------------- unsigned int TextureUnitState::getNumFrames(void) const { - return (unsigned int)mFrames.size(); + return (unsigned int)mFramePtrs.size(); } //----------------------------------------------------------------------- const String& TextureUnitState::getFrameTextureName(unsigned int frameNumber) const { - if (frameNumber >= mFrames.size()) + if (frameNumber >= mFramePtrs.size()) { OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "frameNumber parameter value exceeds number of stored frames.", "TextureUnitState::getFrameTextureName"); } - return mFrames[frameNumber]; + return mFramePtrs[frameNumber]->getName(); } //----------------------------------------------------------------------- void TextureUnitState::setDesiredFormat(PixelFormat desiredFormat) @@ -754,10 +696,10 @@ namespace Ogre { //----------------------------------------------------------------------- bool TextureUnitState::isBlank(void) const { - if (mFrames.empty()) + if (mFramePtrs.empty()) return true; else - return mFrames[0].empty() || mTextureLoadFailed; + return !mFramePtrs[0]|| mTextureLoadFailed; } //----------------------------------------------------------------------- @@ -1065,7 +1007,7 @@ namespace Ogre { //_unload(); // Load textures - for (unsigned int i = 0; i < mFrames.size(); ++i) + for (unsigned int i = 0; i < mFramePtrs.size(); ++i) { ensurePrepared(i); } @@ -1075,7 +1017,7 @@ namespace Ogre { { // Load textures - for (unsigned int i = 0; i < mFrames.size(); ++i) + for (unsigned int i = 0; i < mFramePtrs.size(); ++i) { ensureLoaded(i); } @@ -1101,7 +1043,7 @@ namespace Ogre { { if (mContentType == CONTENT_NAMED) { - if (frame < mFrames.size() && !mTextureLoadFailed) + if (frame < mFramePtrs.size() && !mTextureLoadFailed) { ensureLoaded(frame); return mFramePtrs[frame]; @@ -1134,62 +1076,53 @@ namespace Ogre { mFramePtrs[frame] = texptr; } //----------------------------------------------------------------------- + TexturePtr TextureUnitState::retrieveTexture(const String& name) { + // Ensure texture is loaded, specified number of mipmaps and + // priority + try { + TextureManager::ResourceCreateOrRetrieveResult res; + res = TextureManager::getSingleton().createOrRetrieve( + name, mParent->getResourceGroup()); + return static_pointer_cast(res.first); + } + catch (Exception &e) { + String msg = "retrieving texture " + name + + ". Texture layer will be blank: " + e.getFullDescription(); + LogManager::getSingleton().logError(msg); + mTextureLoadFailed = true; + } + + return TexturePtr(); + } + //----------------------------------------------------------------------- void TextureUnitState::ensurePrepared(size_t frame) const { - if (!mFrames[frame].empty() && !mTextureLoadFailed) - { - // Ensure texture is loaded, specified number of mipmaps and - // priority - if (!mFramePtrs[frame]) - { - try { - mFramePtrs[frame] = - TextureManager::getSingleton().prepare(mFrames[frame], - mParent->getResourceGroup(), mTextureType, - mTextureSrcMipmaps, mGamma, mIsAlpha, mDesiredFormat, mHwGamma); - } - catch (Exception &e) { - String msg = "preparing texture " + mFrames[frame] + - ". Texture layer will be blank: " + e.getFullDescription(); - LogManager::getSingleton().logError(msg); - mTextureLoadFailed = true; - } - } - else - { - // Just ensure existing pointer is prepared - mFramePtrs[frame]->prepare(); - } - } + const TexturePtr& tex = mFramePtrs[frame]; + if (!tex || mTextureLoadFailed) + return; + + tex->setTextureType(mTextureType); + tex->setFormat(mDesiredFormat); + tex->setGamma(mGamma); + tex->setNumMipmaps(mTextureSrcMipmaps); + tex->setHardwareGammaEnabled(mHwGamma); + tex->setTreatLuminanceAsAlpha(mIsAlpha); + tex->prepare(); } //----------------------------------------------------------------------- void TextureUnitState::ensureLoaded(size_t frame) const { - if (!mFrames[frame].empty() && !mTextureLoadFailed) - { - // Ensure texture is loaded, specified number of mipmaps and - // priority - if (!mFramePtrs[frame]) - { - try { - mFramePtrs[frame] = - TextureManager::getSingleton().load(mFrames[frame], - mParent->getResourceGroup(), mTextureType, - mTextureSrcMipmaps, mGamma, mIsAlpha, mDesiredFormat, mHwGamma); - } - catch (Exception &e) { - String msg = "loading texture " + mFrames[frame] + - ". Texture layer will be blank: " + e.getFullDescription(); - LogManager::getSingleton().logError(msg); - mTextureLoadFailed = true; - } - } - else - { - // Just ensure existing pointer is loaded - mFramePtrs[frame]->load(); - } - } + const TexturePtr& tex = mFramePtrs[frame]; + if (!tex || mTextureLoadFailed) + return; + + tex->setTextureType(mTextureType); + tex->setFormat(mDesiredFormat); + tex->setGamma(mGamma); + tex->setNumMipmaps(mTextureSrcMipmaps); + tex->setHardwareGammaEnabled(mHwGamma); + tex->setTreatLuminanceAsAlpha(mIsAlpha); + tex->load(); } //----------------------------------------------------------------------- void TextureUnitState::createAnimController(void) @@ -1377,13 +1310,7 @@ namespace Ogre { //----------------------------------------------------------------------- void TextureUnitState::_unprepare(void) { - // Unreference textures - vector::type::iterator ti, tiend; - tiend = mFramePtrs.end(); - for (ti = mFramePtrs.begin(); ti != tiend; ++ti) - { - ti->reset(); - } + // don't unload textures. may be used elsewhere } //----------------------------------------------------------------------- void TextureUnitState::_unload(void) @@ -1405,13 +1332,7 @@ namespace Ogre { } } - // Unreference but don't unload textures. may be used elsewhere - vector::type::iterator ti, tiend; - tiend = mFramePtrs.end(); - for (ti = mFramePtrs.begin(); ti != tiend; ++ti) - { - ti->reset(); - } + // don't unload textures. may be used elsewhere } //----------------------------------------------------------------------------- bool TextureUnitState::isLoaded(void) const @@ -1503,9 +1424,9 @@ namespace Ogre { else { // if more than one frame then assume animated frames - if (mFrames.size() > 1) + if (mFramePtrs.size() > 1) setAnimatedTextureName(aliasEntry->second, - static_cast(mFrames.size()), mAnimDuration); + static_cast(mFramePtrs.size()), mAnimDuration); else setTextureName(aliasEntry->second, mTextureType); } @@ -1553,7 +1474,6 @@ namespace Ogre { memSize += sizeof(ContentType); memSize += sizeof(String) * 4; - memSize += mFrames.size() * sizeof(String); memSize += mFramePtrs.size() * sizeof(TexturePtr); memSize += mEffects.size() * sizeof(TextureEffect); diff --git a/Samples/Compositor/include/Compositor.h b/Samples/Compositor/include/Compositor.h index b9c6c5630ae..4720c8616ee 100644 --- a/Samples/Compositor/include/Compositor.h +++ b/Samples/Compositor/include/Compositor.h @@ -613,6 +613,13 @@ void Sample_Compositor::createTextures(void) TU_DYNAMIC_WRITE_ONLY ); + MaterialManager::getSingleton() + .getByName("Ogre/Compositor/Halftone", "General") + ->getTechnique(0) + ->getPass(0) + ->getTextureUnitState("noise") + ->setTexture(tex); + if(tex) { HardwarePixelBufferSharedPtr ptr = tex->getBuffer(0,0); @@ -656,6 +663,13 @@ void Sample_Compositor::createTextures(void) TU_DYNAMIC_WRITE_ONLY ); + MaterialManager::getSingleton() + .getByName("Ogre/Compositor/Dither", "General") + ->getTechnique(0) + ->getPass(0) + ->getTextureUnitState("noise") + ->setTexture(tex2); + HardwarePixelBufferSharedPtr ptr2 = tex2->getBuffer(0,0); ptr2->lock(HardwareBuffer::HBL_DISCARD); const PixelBox &pb2 = ptr2->getCurrentLock(); diff --git a/Samples/CubeMapping/include/CubeMapping.h b/Samples/CubeMapping/include/CubeMapping.h index 9ef7f04a0db..1d78b27efe5 100644 --- a/Samples/CubeMapping/include/CubeMapping.h +++ b/Samples/CubeMapping/include/CubeMapping.h @@ -114,6 +114,13 @@ class _OgreSampleClassExport Sample_CubeMapping : public SdkSample, public Rende TexturePtr tex = TextureManager::getSingleton().createManual("dyncubemap", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_CUBE_MAP, 128, 128, 0, PF_R8G8B8, TU_RENDERTARGET); + MaterialManager::getSingleton() + .getByName("Examples/DynamicCubeMap", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME) + ->getTechnique(0) + ->getPass(0) + ->getTextureUnitState(0) + ->setCubicTexture(&tex, true); + // assign our camera to all 6 render targets of the texture (1 for each direction) for (unsigned int i = 0; i < 6; i++) { diff --git a/Samples/DynTex/include/DynTex.h b/Samples/DynTex/include/DynTex.h index 98346976ba4..110b20b59ec 100644 --- a/Samples/DynTex/include/DynTex.h +++ b/Samples/DynTex/include/DynTex.h @@ -98,6 +98,12 @@ class _OgreSampleClassExport Sample_DynTex : public SdkSample // create our dynamic texture with 8-bit luminance texels TexturePtr tex = TextureManager::getSingleton().createManual("thaw", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, TEXTURE_SIZE, TEXTURE_SIZE, 0, PF_L8, TU_DYNAMIC_WRITE_ONLY); + MaterialManager::getSingleton() + .getByName("Examples/Frost", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME) + ->getTechnique(0) + ->getPass(0) + ->getTextureUnitState(1) + ->setTexture(tex); mTexBuf = tex->getBuffer(); // save off the texture buffer diff --git a/Samples/Fresnel/include/Fresnel.h b/Samples/Fresnel/include/Fresnel.h index e73e0fd2a3a..bac4da12996 100644 --- a/Samples/Fresnel/include/Fresnel.h +++ b/Samples/Fresnel/include/Fresnel.h @@ -132,6 +132,13 @@ class _OgreSampleClassExport Sample_Fresnel : public SdkSample, public RenderTar TexturePtr tex = TextureManager::getSingleton().createManual(i == 0 ? "refraction" : "reflection", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, 512, 512, 0, PF_R8G8B8, TU_RENDERTARGET); + MaterialManager::getSingleton() + .getByName("Examples/FresnelReflectionRefraction", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME) + ->getTechnique(0) + ->getPass(0) + ->getTextureUnitState(tex->getName()) + ->setTexture(tex); + RenderTarget* rtt = tex->getBuffer()->getRenderTarget(); rtt->addViewport(mCamera)->setOverlaysEnabled(false); rtt->addListener(this); diff --git a/Samples/Media/materials/scripts/Dither.material b/Samples/Media/materials/scripts/Dither.material index f363ad19b4e..5f3a8987db8 100644 --- a/Samples/Media/materials/scripts/Dither.material +++ b/Samples/Media/materials/scripts/Dither.material @@ -60,7 +60,6 @@ material Ogre/Compositor/Dither texture_unit noise { - texture DitherTex tex_address_mode wrap tex_coord_set 1 filtering none diff --git a/Samples/Media/materials/scripts/Examples-Advanced.material b/Samples/Media/materials/scripts/Examples-Advanced.material index ff14d7e01b8..3628bfc7803 100644 --- a/Samples/Media/materials/scripts/Examples-Advanced.material +++ b/Samples/Media/materials/scripts/Examples-Advanced.material @@ -720,17 +720,13 @@ material Examples/FresnelReflectionRefraction filtering linear linear none } // Reflection - texture_unit + texture_unit reflection { - // Will be filled in at runtime - texture reflection tex_address_mode clamp } // Refraction - texture_unit + texture_unit refraction { - // Will be filled in at runtime - texture refraction tex_address_mode clamp } } @@ -987,13 +983,6 @@ material Examples/TextureArray fragment_program_ref Examples/TextureArrayPSglsl { } - - texture_unit - { - // Will be filled in at runtime - texture TextureArrayTex - tex_address_mode clamp - } } } @@ -1008,13 +997,6 @@ material Examples/TextureArray fragment_program_ref Examples/TextureArrayPSglsles { } - - texture_unit - { - // Will be filled in at runtime - texture TextureArrayTex - tex_address_mode clamp - } } } diff --git a/Samples/Media/materials/scripts/Examples-DynTex.material b/Samples/Media/materials/scripts/Examples-DynTex.material index 10e9ac31e65..62f6ca318b1 100644 --- a/Samples/Media/materials/scripts/Examples-DynTex.material +++ b/Samples/Media/materials/scripts/Examples-DynTex.material @@ -124,7 +124,6 @@ material Examples/Frost texture_unit 1 { - texture thaw } } } diff --git a/Samples/Media/materials/scripts/Examples.material b/Samples/Media/materials/scripts/Examples.material index f4c3294d2dd..3c98aeaad48 100644 --- a/Samples/Media/materials/scripts/Examples.material +++ b/Samples/Media/materials/scripts/Examples.material @@ -349,8 +349,6 @@ material Examples/DynamicCubeMap { texture_unit { - // will be filled in at runtime - cubic_texture dyncubemap combinedUVW tex_address_mode clamp env_map cubic_reflection } diff --git a/Samples/Media/materials/scripts/Halftone.material b/Samples/Media/materials/scripts/Halftone.material index 148a71e8a95..2e462d8e03d 100644 --- a/Samples/Media/materials/scripts/Halftone.material +++ b/Samples/Media/materials/scripts/Halftone.material @@ -83,7 +83,6 @@ material Ogre/Compositor/Halftone texture_unit noise { - texture HalftoneVolume tex_coord_set 0 filtering trilinear tex_address_mode clamp