C++ (Qt)void DrawEngine3D::Draw( void ){ ... Texture * txtr = it->GetTexture(); // есть текстура, ее надо рисовать ... if (!this->TextureAdded(txtr)) // машине уже известна такая текстура ? this->AddTexture(txtr); // если нет, регистрируем текстуру Image * img = txtr->Image(); // получили картинку для рисования БЕЗ увеличения счетчика ссылок на нее ... // используем картинку} bool DrawEngine3D::AddTexture( Texture * txtr ){ if (mTextures.find(txtr) != mTextures.end()) return false; // такая уже есть mTextures.insert(txtr); // запомнили txtr->AddToEngine(this); // говорим текстуре "подключиться" к машине return true;} bool Texture::AddToEngine( DrawEngine3D * engine ){ if (mEngines.find(engine) != mEngines.end()) return false; // такая уже есть ? mEngines.insert(engine); // запомнили this->LoadImage(); // загружаем имедж, +1 к счетчику return true;}
C++ (Qt)Texture::~Texture( void ){ .. RemoveFromAllEngines(); // теперь текстура отключена от всех машин, счетчик ссылок на картинку Ok ..} void Texture::RemoveFromAllEngines( void ){ typedef std::set <DrawEngine3D *> TEngineSet; TEngineSet temp = mEngines; // нужна копия for (TEngineSet::iterator it = temp.begin(); it != temp.end(); ++it) (*it)->RemoveTexture(this); mEngines.clear();}
C++ (Qt)DrawEngine3D eng( ... );...eng.draw(); // Загрузили одну текстуру...eng.draw(); // а здесь другую