Changeset 10597

Show
Ignore:
Timestamp:
09/27/09 17:14:57 (5 years ago)
Author:
robert
Message:

Added handling of resetting of the texture object format

Location:
OpenSceneGraph/trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/include/osg/Texture

    r10594 r10597  
    976976            inline void setAllocated(bool allocated=true) { _allocated = allocated; } 
    977977 
    978             inline void setAllocated(GLint     numMipmapLevels, 
     978            void setAllocated(GLint     numMipmapLevels, 
    979979                              GLenum    internalFormat, 
    980980                              GLsizei   width, 
    981981                              GLsizei   height, 
    982982                              GLsizei   depth, 
    983                               GLint     border) 
    984             { 
    985                 _allocated=true; 
    986                 _profile.set(numMipmapLevels,internalFormat,width,height,depth,border); 
    987             } 
     983                              GLint     border); 
    988984 
    989985            inline bool isAllocated() const { return _allocated; } 
     
    10201016            void addToBack(TextureObject* to); 
    10211017            void orphan(TextureObject* to); 
     1018            void remove(TextureObject* to); 
     1019 
    10221020            unsigned int size() const { return _profile._size * _numOfTextureObjects; } 
    10231021 
     
    10251023 
    10261024            bool checkConsistency() const; 
     1025 
     1026            TextureObjectManager* getParent() { return _parent; } 
    10271027 
    10281028        protected: 
     
    10861086            void releaseTextureObject(TextureObject* to); 
    10871087 
     1088            TextureObjectSet* getTextureObjectSet(const TextureProfile& profile); 
    10881089 
    10891090            void newFrame(osg::FrameStamp* fs); 
  • OpenSceneGraph/trunk/src/osg/Texture.cpp

    r10595 r10597  
    7777} 
    7878 
     79void Texture::TextureObject::setAllocated(GLint     numMipmapLevels, 
     80                                          GLenum    internalFormat, 
     81                                          GLsizei   width, 
     82                                          GLsizei   height, 
     83                                          GLsizei   depth, 
     84                                          GLint     border) 
     85{ 
     86    _allocated=true; 
     87    if (!match(_profile._target,numMipmapLevels,internalFormat,width,height,depth,border)) 
     88    { 
     89        _profile.set(numMipmapLevels,internalFormat,width,height,depth,border); 
     90 
     91        if (_set) 
     92        { 
     93            // remove self from original set 
     94            _set->remove(this); 
     95 
     96            // get the new set for the new profile 
     97            _set = _set->getParent()->getTextureObjectSet(_profile); 
     98 
     99            // register self with new set. 
     100            _set->addToBack(this); 
     101        } 
     102    } 
     103} 
     104 
    79105void Texture::TextureProfile::computeSize() 
    80106{ 
     
    210236        _orphanedTextureObjects.push_back(to); 
    211237 
    212         if (to->_previous!=0) 
    213         { 
    214             (to->_previous)->_next = to->_next; 
    215         } 
    216         else 
    217         { 
    218             // 'to' was head so assign _head to the next in list 
    219             _head = to->_next; 
    220         } 
    221  
    222         if (to->_next!=0) 
    223         { 
    224             (to->_next)->_previous = to->_previous; 
    225         } 
    226         else 
    227         { 
    228             // 'to' was tail so assing tail to the previous in list 
    229             _tail = to->_previous; 
    230         } 
    231  
    232         // reset the 'to' list pointers as it's no longer in the active list. 
    233         to->_next = 0; 
    234         to->_previous = 0; 
     238        remove(to); 
    235239 
    236240#if 0 
     
    571575#endif 
    572576} 
     577 
     578void Texture::TextureObjectSet::remove(Texture::TextureObject* to) 
     579{ 
     580    if (to->_previous!=0) 
     581    { 
     582        (to->_previous)->_next = to->_next; 
     583    } 
     584    else 
     585    { 
     586        // 'to' was head so assign _head to the next in list 
     587        _head = to->_next; 
     588    } 
     589 
     590    if (to->_next!=0) 
     591    { 
     592        (to->_next)->_previous = to->_previous; 
     593    } 
     594    else 
     595    { 
     596        // 'to' was tail so assing tail to the previous in list 
     597        _tail = to->_previous; 
     598    } 
     599 
     600    // reset the 'to' list pointers as it's no longer in the active list. 
     601    to->_next = 0; 
     602    to->_previous = 0; 
     603} 
     604 
    573605 
    574606Texture::TextureObjectManager::TextureObjectManager(unsigned int contextID): 
     
    632664 
    633665    Texture::TextureProfile profile(target,numMipmapLevels,internalFormat,width,height,depth,border); 
     666    TextureObjectSet* tos = getTextureObjectSet(profile); 
     667    return tos->takeOrGenerate(const_cast<Texture*>(texture)); 
     668} 
     669 
     670Texture::TextureObjectSet* Texture::TextureObjectManager::getTextureObjectSet(const TextureProfile& profile) 
     671{ 
    634672    osg::ref_ptr<Texture::TextureObjectSet>& tos = _textureSetMap[profile]; 
    635673    if (!tos) tos = new Texture::TextureObjectSet(this, profile); 
    636     return tos->takeOrGenerate(const_cast<Texture*>(texture)); 
     674    return tos.get(); 
    637675} 
    638676 
  • OpenSceneGraph/trunk/src/osgWrappers/osg/Texture.cpp

    r10595 r10597  
    886886                  "", 
    887887                  ""); 
     888        I_Method1(osg::Texture::TextureObjectSet *, getTextureObjectSet, IN, const osg::Texture::TextureProfile &, profile, 
     889                  Properties::NON_VIRTUAL, 
     890                  __TextureObjectSet_P1__getTextureObjectSet__C5_TextureProfile_R1, 
     891                  "", 
     892                  ""); 
    888893        I_Method1(void, newFrame, IN, osg::FrameStamp *, fs, 
    889894                  Properties::NON_VIRTUAL, 
     
    10341039                  "", 
    10351040                  ""); 
     1041        I_Method1(void, remove, IN, osg::Texture::TextureObject *, to, 
     1042                  Properties::NON_VIRTUAL, 
     1043                  __void__remove__TextureObject_P1, 
     1044                  "", 
     1045                  ""); 
    10361046        I_Method0(unsigned int, size, 
    10371047                  Properties::NON_VIRTUAL, 
     
    10491059                  "", 
    10501060                  ""); 
     1061        I_Method0(osg::Texture::TextureObjectManager *, getParent, 
     1062                  Properties::NON_VIRTUAL, 
     1063                  __TextureObjectManager_P1__getParent, 
     1064                  "", 
     1065                  ""); 
     1066        I_SimpleProperty(osg::Texture::TextureObjectManager *, Parent,  
     1067                         __TextureObjectManager_P1__getParent,  
     1068                         0); 
    10511069END_REFLECTOR 
    10521070