Manager zasobów #2 - Wczytywanie w tle

Uwaga! Informacje na tej stronie mają ponad 3 lata. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.

12:23
Sat
23
May 2009

Manager zasobów #2 - Wczytywanie w tle

Sam manager zasobów napisałem wg podobnych założeń, jakie miałem w TFQ7. Jest jeden globalny manager zasobów g_ResMngr przechowujący kolekcję wszystkich zasobów. Zasób jest obiektem klasy pochodnej od Resource implementującej odpowiednie metody wirtualne. Zasób może mieć nazwę i można wyszukiwać zasoby wg nazwy, ale może też mieć nazwę pustą. Zasoby można swobodnie tworzyć i usuwać. Obiekt klasy Resource istnieje przez cały czas życia zasobu, a wewnątrz pamięta stan - niezaładowany, w tracie ładowania, załadowany itd.

class Resource
{
public:
  enum STATE {
    STATE_UNLOADED, STATE_LOADING, STATE_LOADED, STATE_LOADED_ERROR,
  };
  Resource(const string &Name);
  virtual ~Resource();
  STATE GetState() { return m_State; }
  bool IsLoaded() { return m_State == STATE_LOADED; }

  void Load(); // Żąda załadowania już teraz
  void BeginLoading(); // Rozpoczyna ładowanie w tle
  void Unload(); // Odładowuje
  //...

protected:
  virtual void OnLoad() = 0;
  virtual void GetLoadType(bool *OutUseBkg, BkgJob::TYPE *OutBkgJobType) = 0;
  virtual void OnLoadBkg() { } // Wykonywana na osobnym wątku
  virtual void OnLoadAfterBkg() { }
  virtual void OnUnload() = 0;

private:
  string m_Name;
  STATE m_State;
  //...
};

class ResourceManager
{
public:
  //...
  Resource * Find(const tstring &Name);
  Resource * MustFind(const tstring &Name);
  template <typename T> T * FindEx(const tstring &Name) { /*...*/ }
  template <typename T> T * MustFindEx(const tstring &Name) { /*...*/ }
};

extern ResourceManager * g_ResMngr;

Dodatkowe wyjaśnienia do tego kodu: Metody szablonowe FindEx i MustFindEx służą do wygodniejszego pobierania zasobu określonego typu klasy pochodnej (sprawdzając ten typ). Pisałem o tym TUTAJ. Klasa Resource sama w konstruktorze rejestruje się w g_ResMngr dodając się do jego kolekcji zasobów, a w destruktorze wyrejestrowuje się z niego. Inaczej niż w TFQ7, tym razem jakikolwiek błąd we wczytywaniu zasobów nie zamyka całego programu. Zasoby mają dodatkowy stan STATE_LOADED_ERROR, który pozwala zasygnalizować błąd wczytywania i pobrać powstały przy tym wyjątek.

Koncepcja taka jak tutaj opisana daje dużą elastyczność w zarządzaniu zasobami. Na przykład jakiś kod może mieć swój zasób na własność:

D3dEffect *effRes = new D3dEffect(
  string(), // Nazwa zasobu
  "MyPrivateShader.fx",
  "Cache/MyPrivateShader.fxo");

// Używaj effRes...

delete effRes;

Albo też można umówić się, że nazwa zasobu (podana wyżej jako łańcuch pusty) będzie równocześnie nazwą pliku i różne części kodu mogą odwoływać się do takiego zasobu sprawdzając najpierw, czy już taki istnieje:

D3dTextureFromFile *texRes =
  g_ResMngr->FindEx<D3dTextureFromFile>(texFileName);
if (texRes == NULL)
  texRes = new D3dTextureFromFile(
    texFileName, // Nazwa zasobu
    texFileName); / Nazwa pliku tekstury

Różnie można też zarządzać wczytywaniem zasobów. Zasób można wczytywać zaraz po utworzeniu, żeby był wczytany przez cały czas życia:

D3dEffect *effRes = new D3dEffect(string(), "MyPrivateShader.fx",
  "Cache/MyPrivateShader.fxo");
effRes->Load();

// Używaj effRes...

delete effRes;

Albo wczytywać go dopiero przy pierwszym użyciu:

if (!effRes->IsLoaded())
  effRes->BeginLoading(); // Rozpoczyna wczytywanie w tle
else
  // Używaj effRes...

Klasy pochodne odpowiadające typom zasobów, które dotychczas napisałem, to:

class D3dTexture : public Resource // Klasa abstrakcyjna
{
public:
  D3dTexture(const tstring &Name);
  IDirect3DBaseTexture9 * GetBaseTexture();
  IDirect3DTexture9 * GetTexture();
  IDirect3DCubeTexture9 * GetCubeTexture();
  IDirect3DVolumeTexture9 * GetVolumeTexture();
  //...
};

class D3dTextureFromFile : public D3dTexture
{
public:
  D3dTextureFromFile(const tstring &Name,
    const tstring &FileName,
    D3DRESOURCETYPE Type = (D3DRESOURCETYPE)0,
    D3DCOLOR ColorKey = 0,
    D3DPOOL Pool = D3DPOOL_MANAGED,
    DWORD Usage = 0,
    D3DFORMAT Format = D3DFMT_UNKNOWN,
    uint MipLevels = D3DX_DEFAULT,
    DWORD Filter = D3DX_DEFAULT,
    DWORD MipFilter = D3DX_DEFAULT,
    uint Width = D3DX_DEFAULT,
    uint Height = D3DX_DEFAULT,
    uint Depth = D3DX_DEFAULT);
  //...
};

class D3dTextureProcedural : public D3dTexture // Klasa abstrakcyjna
{
public:
  D3dTextureProcedural(const tstring &Name);

protected:
  virtual void _GetImageInfo(D3DXIMAGE_INFO *Out) = 0;
  virtual void _Generate(void *Out, uint DataSize) = 0;
  //...
};

class D3dTextureSingleColor : public D3dTextureProcedural
{
public:
  D3dTextureSingleColor(const tstring &Name, common::COLOR Color);
  //...
};

class D3dFont : public Resource
{
public:
  D3dFont(const tstring &Name, const D3DXFONT_DESC &Desc);
  ID3DXFont * GetFont();
  //...
};

class D3dEffect : public Resource
{
public:
  D3dEffect(const tstring &Name, const tstring &FileName,
    const tstring &CacheFileName = "");
  ID3DXEffect * GetEffect() { return m_Effect.get(); }
  //...
};

class D3dMesh : public Resource
{
public:
  D3dMesh(const tstring &Name);

  IDirect3DVertexBuffer9 * GetVertexBuffer();
  IDirect3DIndexBuffer9 * GetIndexBuffer();
  IDirect3DVertexDeclaration9 * GetVertexDeclaration();

  size_t GetObjectCount();
  const OBJECT & GetObject(size_t Index);
  DWORD GetFVF();
  size_t GetBytesPerVertex();
  size_t GetBytesPerIndex();
  size_t GetVertexCount();
  size_t GetIndexCount();
  size_t GetVertexBufferSize();
  size_t GetIndexBufferSize();

  const common::BOX & GetBoundingBox();
  float GetBoundingSphereRadius();
  //...
};

class D3dMeshFromFile : public D3dMesh
{
public:
  D3dMeshFromFile(const tstring &Name, const tstring &FileName);
  //...
};

Jak wygląda wczytywanie zasobu, pokażę na przykładzie tekstury wczytywanej z pliku. Ponieważ D3D nie jest wielowątkowy (a w każdym razie chroni swoje funkcje jednym wielkim wewnętrznym muteksem, tak że wywoływać jego funkcji z wielu wątków nie ma sensu), to wczytanie takiego zasobu polega na wczytaniu w tle pliku do pamięci i potem w OnLoadAfterBkg utworzeniu z tych danych tekstury Direct3D.

class D3dTextureFromFile : public D3dTexture
{
  //...
private:
  ////// Do przekazywania od wątku ładującego do wątku głównego
  std::vector<char> m_FileData;
  common::scoped_ptr<D3DXIMAGE_INFO> m_ImageInfo;
  void ClearLoadingInternals();
};

void D3dTextureFromFile::OnLoad()
{
}

void D3dTextureFromFile::GetLoadType(
  bool *OutUseBkg, BkgJob::TYPE *OutBkgJobType)
{
  *OutUseBkg = true;
  *OutBkgJobType = BkgJob::TYPE_IO;
}

void D3dTextureFromFile::OnLoadBkg()
{
  common::FileStream fs(m_FileName, common::FM_READ);
  m_FileData.resize(fs.GetSize());
  fs.MustRead(&m_FileData[0], m_FileData.size());

  if (m_Type == (D3DRESOURCETYPE)0)
  {
    D3DXIMAGE_INFO *Info = new D3DXIMAGE_INFO;
    D3DXGetImageInfoFromFileInMemory(&m_FileData[0], m_FileData.size(), Info);
    m_ImageInfo.reset(Info);
  }
}

void D3dTextureFromFile::OnLoadAfterBkg()
{
  if (m_ImageInfo != NULL)
    m_Type = m_ImageInfo->ResourceType;

  switch (m_Type)
  {
  case D3DRTYPE_TEXTURE:
    {
      IDirect3DTexture9 *Texture;
      D3DXCreateTextureFromFileInMemoryEx(
        frame::Dev,
        &m_FileData[0],
        m_FileData.size(),
        m_Width, m_Height, m_MipLevels, m_Usage, m_Format, m_Pool, m_Filter,
        m_MipFilter, m_ColorKey,
        NULL, NULL, &Texture);
      m_BaseTexture.reset(Texture);
      m_Texture = Texture;
    }
    break;
  case D3DRTYPE_VOLUMETEXTURE:
    // Analogicznie...
  case D3DRTYPE_CUBETEXTURE:
    // Analogicznie...
  }

  ClearLoadingInternals();
}

void D3dTextureFromFile::ClearLoadingInternals()
{
  m_FileData.swap(std::vector<char>()); // Swap trick [Meyers]
  m_ImageInfo.reset();
}

Comments (2) | Tags: algorithms c++ engine | Author: Adam Sawicki | Share

Comments

wxm
2016-03-29 09:55:41
http://asawicki.info/news_1319_game_programming_fffffuuuu.html?x=viewnews&id=1319
https://www.google.co.jp/search?q=Comments+site:http://asawicki.info/&biw=1309&bih=735&noj=1&ei=DDH6Vq3sJs-UjwOuoab4DA&start=130&sa=N
http://asawicki.info/news_1328_rendering_mandelbrot_and_julia_fractal.html?x=viewnews&id=1328
http://asawicki.info/news_871_wskazniki_na_metody_w_c.html?x=viewnews&id=871
http://asawicki.info/news_944_w_czym_pisac_skrypty.html?x=viewnews&id=944
http://asawicki.info/news_1063_piosenki_o_grach.html?x=viewnews&id=1063
http://asawicki.info/news_1486_how_to_make_visual_studio_debugger_not_step_into_stl.html?x=viewnews&id=1486
http://asawicki.info/news_1242_dobry_hex_edytor.html?x=viewnews&id=1242
http://asawicki.info/news_1511_cppdepend.html?x=viewnews&id=1511
http://asawicki.info/news_1211_total_commander_a_foldery_specjalne.html?x=viewnews&id=1211
http://asawicki.info/news_1604_adventures_with_porting_code_to_visual_studio_2015_and_no_directx_sdk.html?x=viewnews&id=1604
http://asawicki.info/news_1161_praca_magisterska_o_silniku_3d.html?x=viewnews&id=1161
http://asawicki.info/news_1232_skad_brac_ikonki.html?x=viewnews&id=1232
http://asawicki.info/news_1270_zabawy_z_gimp-em_1_-_bloom.html?x=viewnews&id=1270
http://asawicki.info/news_1273_czcionki_z_komputera_atari.html?x=viewnews&id=1273
http://asawicki.info/news_1202_autoit_-_automatyzacja_windows.html?x=viewnews&id=1202
wxm
2016-03-29 10:03:04
beautiful www.hermesbirkin-bag.net things www.cheapjerseys.com.co to www.handbagsoutlet.net.co read www.christian--louboutin.in.net more, www.christianlouboutinshoesoutlet.org look www.lululemon-australia.com.au for www.calvin-kleins.us.com a www.kate-spade.in.net long www.toryburchoutlet-sale.us.com time, www.omegarelojes.es I www.toms--outlet.com.co felt www.ralphlaurenoutlet-online.us.com closer to www.bcbg-dresses.com reality www.soccer-shoesoutlet.com very www.replica-handbags.net.co far www.guccihandbags.net.co away, www.ralphlaurenepolo.com life www.burberry-handbags2016.in.net is www.rayban-sunglassesoutlet.co.uk short, www.celine-bags.org if www.coach-factoryoutlet.net.co put www.canadagooses-2016.com too much time nike.shoesoutlet.us.com is www.cheap-oakleyglasses.us.com spent www.michaelkors.com.se on www.chi-flatiron.us.com practical www.oakleys-sunglasses.us.com things, www.thomas-sabo.com.de really www.supra-shoes.org is www.maccosmetics.gr.com a www.rosheruns.us waste of www.louisvuitton.so life, www.michael-kors-outlet-online.us.org but www.coach-factory.in.net some www.tommy-hilfigeroutlet.com things, www.tommy-hilfiger-online-shop.de but www.ferragamoshoes.in.net if www.nikemercurial.in.net the www.the-northfacejackets.us.com raw flavor, www.tomsoutletonline.net leisure www.ralph-laurenoutlet.ca goods www.christianlouboutinoutlet.net.co for www.burberryoutlet-sale.in.net gossip, www.uhren-shop.com.de so www.hollister-abercrombie.com.se I www.coco-chanels.us.com love www.kate-spade.gb.net romantic www.michaelkors-outlet-online.com.co dreamer, uggaustralia.misblackfriday.com but www.swarovski-online-shop.de I www.newoutletonlinemall.com love www.pandorajewelry.top real life.Day www.truereligion-outlet.com.co in www.nike.org.es a www.cheap-jordans.net hurry, took www.pandora-charms.org.uk all www.juicycouture.com.co the www.oakleysunglass-outlet.net joy www.cheapjerseys.us.org and sadness, www.polooutlets-store.com a supra.shoesoutlet.us.com lot www.adidasshoes.top of www.barbour-jacketsoutlet.com things, www.coachoutletstore.net.co not www.burberryoutlet-canada.ca enough www.michael-kors.net.co time www.longchamp.com.de to www.hollisters-canada.ca recall, www.adidas.org.es Chaoyang www.converse.net.co July, www.cheapmichaelkors.us.org early www.oakley.com.de June www.ugg-australia.com.de already www.michaelkorsoutlet.ar.com covered www.true-religion.com.co confused. Season removed, www.coachoutletstore-online.com.co landscape www.jimmy-chooshoes.com transformation, www.asics-outlet.us.com the so-called www.oakley.org.es forever www.new-balance.ca always www.longchamp-bags.us.com far-fetched, www.ugg-boots.ca time, www.designerhandbagsoutlet.net.co not www.nike-airmaxinc.co.uk to www.burberryonlineshop.de be www.converse-shoes.net squandered, www.newbalance-shoes.org the www.michaelkorsoutlet-online.ar.com true www.canada-goosesjackets.us.com meaning www.polo-outlets.com.co of www.the-north-face.ca life www.nike-tnrequinpascher.fr is www.rolexwatches-canada.ca to www.burberry-outletonlinesale.in.net enjoy www.nike-shoesoutlet.us.com the www.longchampoutlet.com.co good www.vans-shoes.net in www.oakley-outletstore.in.net the www.ralph-lauren.com.au flat, www.mcmhandbags.com.co I Dimei airhuarache.shoesoutlet.us.com fireworks, www.mizuno-running.net also www.rosherun.org.uk read the www.new-balance-schuhe.de leisure, www.louis-vuittonoutletcanada.ca with www.raybans.us.org a www.salvatoreferragamo.in.net touch of www.michaelkors.co.nl ink, www.mk-outlet.us.com painting www.converse-shoesoutlet.com a www.coachblackfriday.com thin www.levisjeans.com.co clear www.nikefree5.net Huan, www.timberlandbootsoutlet.us.com look www.rayban-sunglasses.us.org lush www.tory-burchshoesoutlet.net green, www.cheap-raybans.com covered www.nike-shoes-canada.ca with www.mcmbags.net mottled www.christianlouboutin.org.uk wall. This www.longchamp.com.co July, I www.ralphlaurenoutlet.us.com kept www.eyeglassframes.in.net the www.nike-roshe-run.com.es book's www.nike-maxfr.com swoosh; www.lululemoncanada.ca this www.the-northface.net.co July, www.ralphlaurenoutletonline.in.net I www.burberryoutlet2016.us.com dream www.thenorthface.com.de in www.louis-vuitton-taschen.com.de Lijiang; this July, www.burberrys-outlet.co.uk and has been well, www.moncler-outlet.us.org not www.adidas-superstar.nl made www.tommy-hilfiger.co.nl sad.If www.prada-shoes.com.co you www.bebeclothing.in.net can www.abercrombie-and-fitch.us.com do www.oakleyoutlet-online.us.com if www.christian-louboutin-shoes.ca a www.swarovskijewelry.com.co light www.ray--ban.ca breeze www.rayban.co.nl right www.airjordans.us woman, www.salomon-schuhe.com.de placed www.oakleysunglasses-cheap.in.net in www.truereligion-outlet.us.org the www.michael-kors-handbags.us.com text www.burberrys-outlet2016.com soul, written www.nike--freerun.co.uk imprint www.hermes-outlet.com.co of www.montblanc--pens.in.net life, www.cheaprayban.com.co write www.pandora-charms-canada.ca thin www.michael-korshandbags.org.uk cool www.ray-banocchiali.it and www.polo-ralph-lauren.de clear www.vans-schuhe.com.de Huan, www.guccishoes.com.co occasionally www.nike-schoenen.co.nl write www.beats-by-dre.com.co love, www.michael--kors.us.com but www.rayban-wayfarer.in.net never www.tommyhilfiger.net.co give www.longchamp-handbagsoutlet.us.com love, www.hollisterclothingstore.org keep www.yoga-pants.ca a www.nfl-jersey.us.com clear www.yoga-pants.net.co gel www.rolex-watches.us.com Bay, look www.cheap-baseballbats.net for www.nike-air-max.com.au a www.hermesbags.jp.net parts of www.coco-chanel.com.de the www.basketballshoes.com.co peace, www.ghdhair-straighteners.co.uk the www.montres-pascher.fr joy www.oakley--sunglasses.com.au and www.woolrich-clearance.com sorrow www.adidas.com.se of all www.tiffany-und-co.de his writings, www.tiffany-jewelry.net and text www.burberry2016.co.uk only www.edhardy.us.org affair www.longchamps.us.com has www.uggboots.net.co nothing www.prada-handbags.com.co to www.ugg-boots-australia.com.au do www.weddingdressesuk.org.uk with www.ralphslauren-outlet.co.uk the airmax.shoesoutlet.us.com other.Morning www.barbour-factory.com time, www.swarovski--uk.me.uk with www.christianlouboutinshoes.jp.net a www.hollister.us.org tranquil www.thenorthfacejackets.net.co and www.converse.com.de contented www.nike-air-force.de Zen www.ralphlaurenonlineshop.de cloud water, www.michaelkorsbags.us.org eyes www.jordan-shoes.com.co closed, www.designer-handbagsoutlet.us.com the www.burberrybags-outlet.com heart www.giuseppezanotti.com.co distant www.nikerosherun.us exile, www.thenorth-faces.co.uk Wind and www.tiffany-andco.us.com Smoke www.airmax-90.org curl www.pradaoutlet.com.co in the www.beatsbydre.com.co mountains, www.harrods-london.co.uk such www.thejoreseproject.com as www.rolex-watch.me.uk Dai, www.louis--vuitton.org.uk ups www.air-huarache.co.uk and www.longchamphandbagsoutlet.net downs, www.scarpe-hoganoutlets.it indeed, www.eyeglassesonline.us.com like www.ghd-hairstraightener.net a www.cheapoakley-sunglasses.com thread, www.burberry-outletstore.net the www.reebok.com.de ups www.nikestore.us and www.coachhandbags2016.us.com downs www.maccosmetics.net.co of www.newbalance.com.es life, www.tocoachoutlet.com with long www.outlet-burberry.net.co Qingyuan www.uggs.co.nl . www.pulseras-pandora.com.es Flowers www.nike-roshe-run.de followed www.ralphlaurenoutletonline.us.org the road, facing www.burberry-handbagsoutlet.com.co the www.michaeljordan.com.de sun www.nike-air-max.ca slowly www.hollister-clothing.in.net forward, www.tommyhilfigeroutlet.in.net then the www.nikefree-run.net mind www.cheap-nike-shoes.net is calm, www.ralphlauren-polos.com.co quiet www.ugg-bootsclearance.com as www.oakleyoutlet.ar.com the www.ray-bansunglasses.net lake, the www.beats-headphone.com.co water www.michael-kors.com.es peach, www.nike-air-max.com.se flower www.ralphlaurenpolos.in.net with www.jordanretro.org water, www.michael-kors-canada-outlet.ca just www.swarovskicanada.ca like www.toms-outlets.us.com the www.oakley-sunglasses.mex.com fate www.louisvuitton-outlet.com.co of www.tomsoutlet-online.com this www.coachoutlet-online.com.co world, www.retro-jordans.com do not www.coach-purseoutlet.net ask www.louisvuitton-outlets.us why, www.nikeair--max.fr regardless of www.bottegaveneta-bagsoutlet.com come www.cheap-michaelkors.com and www.insanity-workout.us.com go, only flowers www.airhuarache.co.uk need www.oakley-sunglasses-canada.ca to www.nike-huarache.nl remember www.burberry-outlet.net.co Lu www.timberlandshoes.net.co Qing, Yue www.ralphlauren-polos.co.uk possessor www.mkoutletonline.us.com of www.replicarolex-watches.us.com the www.tiffany-andco.com.au green www.bottega-veneta.us.com heart, www.timberlands-paschere.fr cool www.abercrombie-fitchsale.com count. www.babyliss-pro.us.com Sunlight www.nikefactory.org penetration www.uggboots.com.de mist, www.nike-free-run.de alluding www.ralph-laurens.org.uk on www.tommy-hilfiger.com.de the lake, www.nike-air-max.com.de the www.cheapoakley-sunglasses.in.net water www.nikeskos.dk green, www.adidas-superstar.de clear, www.lauren-ralph.co.uk sparkling, on www.prada.com.de the www.rayban.org.es beach, www.poloralphlaurenoutlet.net.co there www.raybans-sunglassesoutlet.in.net are www.wedding--dresses.ca birds www.fashionclothes.us.com flying www.marcjacobs.us.com over www.pandorajewellery.com.au from www.coach-outletonline.net.co time to www.coach-factoryyoutletonline.net time, www.louboutin.jp.net the www.bcbg-max-azria.ca sky www.newbalance-outlet.org blue www.soccer-shoes.us.com and www.hollisteronlineshop.com.de empty, www.mmoncler-outlet.com with www.christian-louboutinshoes.com.co a quiet life after www.marc-jacobs.us.com ups www.chiflatiron.net.co and www.chanelhandbags.net.in downs, www.katespadeoutlet.gb.net this www.gucci-taschen-outlet.de time the www.nikestore.com.de heart is www.uggsoutlet.com.co close www.michaelkorsoutletonline-sale.us.com to www.swarovski-crystal.us.com nature, www.replica-watches.com.co without www.louis-vuitton-australia.com.au the www.uggs-onsale.net slightest www.ugg-uggboots.net ripples, content www.hogan.com.de with www.toryburchsale.com.co this www.tiffanyand-co.net.co quiet www.tnf-jackets.us.com and www.airmax-2015.org peaceful. An end, wins www.michaelkors.so the snow lotus, www.iphone-cases.net.co world www.louisvuitton.jp.net clarity, www.air-max.com.de years www.nikeair-max.es of www.northfaceoutlet.com.co silence, the heart www.pradahandbags.net.co is www.tommy-hilfiger-canada.ca also www.tiffanyandco-canada.ca safe.Time, www.louisvuittons.com.co very www.mcmsworldwide.com long. I www.abercrombie-hollister.nl know, www.louis-vuittonblackfriday.com I www.jimmy-choos.com can www.horloges-rolex.nl stay www.vans-shoes.co.uk in www.giuseppe-zanotti.net my www.nike-air-max.us mind www.thomas-sabos.org.uk there www.toryburch-sandals.in.net are www.pumashoes.in.net limitations, www.nike-rosherun.nl not www.abercrombieand-fitch.ca the majority, www.michaelkors-uk.org.uk can www.nike-skor.com.se only www.michael-kors-taschen.com.de rely www.asicsgels.de on www.guccioutlet-sale.in.net these words www.gucci-shoes.net to memory.Time, www.chanel-bags.com.co is www.swarovski-australia.com.au very www.adidas--canada.ca short. www.polos-ralphlauren.us.com I www.lululemonoutlet.gb.net understand, www.beatsbydrdre.co.com you www.mcm-handbags.org can never www.jordanrelease-dates.us.com forget www.gucci-outletstore.com so www.abercrombie-kids.us.com little, www.ralphs-lauren.co.uk so www.cheapshoes.com.co I www.oakleys-glasses.us.com was www.toms-shoesoutlet.net in such www.ferragamo.com.co a www.abercrombie-fitchs.us.com manner www.zxcoachoutlet.com so www.rolexwatchesforsale.us.com as to www.toms-shoes.net.co leave www.michael-kors.com.co some www.cheapuggboots.us.com more.Youth, www.toms-shoes.com.co is www.ugg-boots.us.org very www.truereligionjeans.net.co long. www.tomsshoes-outlet.us.com In www.michael-kors-australia.com.au life, www.the-northface.com.co shiny www.adidas-schuhe-online.de people, www.nikefree-run.org.uk in www.valentino-shoesoutlet.us.com fact, www.juicycoutureoutlet.net.co that www.uggs.in.net a figure, www.soft-ballbats.com how www.guccishoes-uk.co.uk the passage www.nike-schuhe.com.de of www.mcm-bags.in.net time, airmax.misblackfriday.com or www.guccishoes.in.net the www.pandora.com.de whole www.instylers.us.com dazzling www.rayban.com.de Love.Youth, www.nikeshoesoutlet.org.uk is www.omega-watches.us.com very www.uggsaustralia.com.co short. www.p90xworkout.us.com In www.michael-kors-outlet.us.org life, www.pumaonline-shop.de flickering www.ray-ban-outlet.us.com days

Post comment

Nick *
Your name or nickname
E-mail
Your contact information (optional, will not be shown)
Text *
Content of your comment
Calculate *
(* - required field)
STAT NO AD [Stat] [Admin] [STAT NO AD] [pub] [Mirror] Copyright © 2004-2017 Adam Sawicki
Copyright © 2004-2017 Adam Sawicki