Adventures with Porting Code to Visual Studio 2015 and No DirectX SDK

22:40
Sat
08
Aug 2015

Adventures with Porting Code to Visual Studio 2015 and No DirectX SDK

I just installed new Visual Studio 2015 Community Edition and ported my personal project to it. At the same time, I uninstalled old DirectX SDK Jun 2010 and started using new DirectX headers bundled with Windows SDK, which is installed together with Visual Studio. These two transitions are not connected - I could already switch to new DX headers years ago, but I decided to do it now. While transition to VS 2015 was smooth, abandoning DirectX SDK caused some problems, because new DirectX doesn't contain D3DX library. Here is a dump of the problems and solutions that I encountered during this effort:

1. I uninstalled DirectX SDK Jun 2010, Visual Studio 2013 Community Edition and all other components that seemed related to it, like Microsoft SQL. I left all "Microsoft Visual C++ XX Redistributable" though, because these are required by many applications and intended to be installed on target machine, not necessarily as a part of development environment.

Next, I downloaded and installed new Visual Studio 2015 Community Edition. During this long process, I was thinking what should I expect from the new IDE... Whether Microsoft did a good job this time? On one hand, it is suprising that C++ is now an optional installation component, so it seems like native code is in shadow comparing to all these new and trendy cloud/web/mobile/managed technologies. On the other hand, table: C++11/14/17 Features In VS 2015 RTM shows that the new C++ compiler caught up with many features of new C++11/14/17 language, which gives hope that authors still treat native code development seriously.

2. The looks of new IDE is so similar to the previous version it is hard to notice any differences. After launching it, I had to first recompile static libraries that my project depends on. That was zlib 1.2.8 and my CommonLib. Converting project to new version, as well as the build itself went smoothly, without any problems - which is unusual with C/C++ libraries :) Just as in previous version, headers and libs of standard C library, standard C++ library (STL) and WinAPI are already bundled with the Visual Studio, so there is no need to install or configure anything additional before you can use them.

3. Here comes the real issue: headers and libs of DirectX 9/10/11/12 are now also bundled with Visual Studio, but they don't contain D3DX library and some other deprecated DirectX libraries. I knew about that and that's why I postponed the transition so long. Now I had to finally learn what to replace these functions with. The best article about leaving D3DX behind is probably: Living without D3DX. Fortunately I didn't use many of D3DX features, like effects, sprites, fonts or math functions, because I have my own. I did use three things though: error reporting, texture loading and shader compilation.

3.1. For obtaining error message from DirectX error code of type HRESULT I used header <DxErr.h>, library dxerr.lib and functions: DXGetErrorString and DXGetErrorDescription. They no longer exist in new Windows SDK. A standard FormatMessage function should be used instead, which also returns message for WinAPI error codes obtained from GetLastError. I used this function before for WinAPI errors, so for me it was following code change in a constructor of my DirectX exception class:

DirectXError::DirectXError(HRESULT hr, const tstring &Msg, const tstring &File, int Line)
{
    Push(
        _T("(DirectXError,0x") +
        common::UintToStrR<uint32_t>((uint32_t)hr, 16) +
        _T(") ") +
        tstring(DXGetErrorString(hr)) +
        _T(" (") +
        tstring(DXGetErrorDescription(hr)) +
        _T(")") );
    Push(Msg, File, Line);
}

-->

DirectXError::DirectXError(HRESULT hr, const tstring &Msg, const tstring &File, int Line)
{
    tstring s =
        _T("(DirectXError,0x") +
        common::UintToStrR<uint32>((uint32_t)hr, 16) +
        _T(") ");
    tchar *msg = 0;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, // dwFlags
        0, // lpSource
        (DWORD)hr, // dwMessageId
        0, // dwLanguageId
        (tchar*)&msg, // lpBuffer (Intentional cast from tchar** to tchar*!)
        0, // nSize
        0); // Arguments
    Push(s + msg);
    LocalFree(msg);
    Push(Msg, File, Line);
}

3.2. I no longer have D3DX11CreateTextureFromFile function available that I used to load textures in various image formats, like JPG, PNG, TGA etc. By reading some web pages I found that there are multiple options to replace it.

Of course the recommended solution is to prepare all textures, shaders and other assets offline in some custom binary format that can be loaded directly into DirectX, but I don't want to do that currently.

I decided to use DirectXTex (GitHub, Documentation) - an open-source, MIT-licensed Microsoft library that provides texture operations. I logged in to GitHub, downloaded the repository and compiled its DirectXTex project in my Visual Studio 2015 as a static library without any problems. I then copied LIB files, as well as public headers (DirectXTex.h, DirectXTex.inl) into a special directory and included it in my project.

This library is able to load textures from files in various formats, but it's not so easy as a single function call. First, there are actually 3 different code paths for loading images. Most of the formats (including JPG, PNG, BMP, TIF, GIF, ICO) is handled by function LoadFromWICFile, which uses WIC - Windows Imaging Component, a part of WinAPI. But it cannot handle all the formats popular among game developers, so there is separate function that handles TGA files: LoadFromTGAFile and another one that handles DirectX native format DDS: LoadFromDDSFile. Only these three functions cover all the formats that were handled by the old D3DX.

Second, the loading is done to a CPU memory contained in data structures like class ScratchImage, struct Image or TexMetadata. It must be then transferred to GPU to create a DirectX texture by separate call to function CreateTexture.

I came up with a simple solution of implementing my own version of nonexistent function D3DX11CreateTextureFromFile in following way:

typedef struct ID3DX11ThreadPump ID3DX11ThreadPump;
typedef struct D3DX11_IMAGE_LOAD_INFO D3DX11_IMAGE_LOAD_INFO;

HRESULT D3DX11CreateTextureFromFile(
    _In_  ID3D11Device           *pDevice,
    _In_  LPCTSTR                pSrcFile,
    _In_  D3DX11_IMAGE_LOAD_INFO *pLoadInfo,
    _In_  ID3DX11ThreadPump      *pPump,
    _Out_ ID3D11Resource         **ppTexture,
    _Out_ HRESULT                *pHResult)
{
    assert(pLoadInfo == nullptr);
    assert(pPump == nullptr);

    DirectX::ScratchImage image;
    HRESULT hr = S_OK;
    if (common::StrEnds(pSrcFile, L".dds", false))
        hr = DirectX::LoadFromDDSFile(pSrcFile, DirectX::DDS_FLAGS_NONE, nullptr, image);
    else if (common::StrEnds(pSrcFile, L".tga", false))
        hr = DirectX::LoadFromTGAFile(pSrcFile, nullptr, image);
    else
        hr = DirectX::LoadFromWICFile(pSrcFile, DirectX::WIC_FLAGS_NONE, nullptr, image);
    if (FAILED(hr))
        return hr;

    hr = DirectX::CreateTextureEx(
        pDevice,
        image.GetImages(),
        image.GetImageCount(),
        image.GetMetadata(),
        D3D11_USAGE_IMMUTABLE,
        D3D11_BIND_SHADER_RESOURCE,
        0, // cpuAccessFlags
        0, // miscFlags
        false, // forceSRGB
        ppTexture);
    return hr;
}

It worked perfectly, except this code doesn't create mipmaps, so after some more coding, I ended up with this:

CTexture::CTexture(
    const wchar_t* filePath,
    bool generateMipMaps,
    const D3D11_SHADER_RESOURCE_VIEW_DESC* shaderResourceViewDesc) :
    m_FilePath(filePath)
{
    ERR_TRY

    ZeroMemory(&m_Desc, sizeof m_Desc);

    wprintf(L"Loading texture \"%s\"\n", filePath);

    assert(g_App && g_App->Dev());
    ID3D11Device* dev = g_App->Dev();

    ID3D11Resource *resource;
    DirectX::ScratchImage image;

    HRESULT hr = S_OK;
    if (common::StrEnds(filePath, L".dds", false))
    {
        ERR_GUARD_DIRECTX( DirectX::LoadFromDDSFile(filePath, DirectX::DDS_FLAGS_NONE, nullptr, image) );
    }
    else if (common::StrEnds(filePath, L".tga", false))
    {
        ERR_GUARD_DIRECTX( DirectX::LoadFromTGAFile(filePath, nullptr, image) );
    }
    else
    {
        ERR_GUARD_DIRECTX( DirectX::LoadFromWICFile(filePath, DirectX::WIC_FLAGS_NONE, nullptr, image) );
    }

    DirectX::ScratchImage imageWithMipMaps;
    DirectX::ScratchImage* finalImage = &image;
    if(generateMipMaps && image.GetMetadata().mipLevels == 1)
    {
        const DirectX::Image* origImg = image.GetImage(0, 0, 0);
        assert(origImg);
        ERR_GUARD_DIRECTX( DirectX::GenerateMipMaps(
            *origImg,
            0, // filter
            0, // levels
            imageWithMipMaps) );
        finalImage = &imageWithMipMaps;
    }

    ERR_GUARD_DIRECTX( DirectX::CreateTextureEx(
        dev,
        finalImage->GetImages(),
        finalImage->GetImageCount(),
        finalImage->GetMetadata(),
        D3D11_USAGE_IMMUTABLE,
        D3D11_BIND_SHADER_RESOURCE,
        0, // cpuAccessFlags
        0, // miscFlags
        false, // forceSRGB
        &resource) );

    D3D11_RESOURCE_DIMENSION resDim;
    resource->GetType(&resDim);
    if(resDim != D3D11_RESOURCE_DIMENSION_TEXTURE2D)
    {
        resource->Release();
        THROW_ERR(Format_r(L"\"%s\" is not 2D texture.", filePath));
    }

    m_Texture.reset((ID3D11Texture2D*)resource);

    D3D11_SHADER_RESOURCE_VIEW_DESC defaultSRVDesc;
    if(!shaderResourceViewDesc)
    {
        defaultSRVDesc.Format = DXGI_FORMAT_UNKNOWN;
        defaultSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
        defaultSRVDesc.Texture2D.MostDetailedMip = 0;
        defaultSRVDesc.Texture2D.MipLevels = UINT_MAX;

        shaderResourceViewDesc = &defaultSRVDesc;
    }

    ID3D11ShaderResourceView* shaderResourceView;
    ERR_GUARD_DIRECTX( dev->CreateShaderResourceView(m_Texture.get(), shaderResourceViewDesc, &shaderResourceView) );
    m_ShaderResourceView.reset(shaderResourceView);

    ERR_CATCH( Format_r(L"Cannot load texture \"%s\".", filePath) )
}

DirectXTex library can do much more than that. It turns out it can:

so it's very useful library. The code comes with some other projects as well, like DDSTextureLoader (a lightweight loader for DDS format only), DDSView, Texconv and Texassemble (console tools).

There is another open-source Microsoft library like this: DirectXTK (GitHub, Documentation), but it serves slightly different purpose - next to texture loading, it also provides some facilities for sprites, effects, models, fonts and other useful stuff for DX11. For sure it would be interesting to learn more about this library as well.

3.3. Ideally shaders should also be compiled to binary form offline by fxc.exe program (now shipped with Visual Studio as well), but fortunately the HLSL compiler in form of a library isn't gone, it just changed its name. Now without D3DX, it is a separate library called D3DCompile. It requires including <D3Dcompiler.h>, linking with d3dcompiler.lib and shipping your code with d3dcompiler_47.dll file. (Yes, that's what Microsoft recommends - shipping the DLL with your program, not requiring installation of another package, like Visual C++ Redistributable!) Functions changed their names, but they take pretty much the same parameters. Only pPump and pHResult are gone, which I didn't use anyway. So in my case, the change looked like this:

HRESULT hr = D3DX11CompileFromFile(
    filePath, // pSrcFile
    nullptr, // pDefines
    nullptr, // pInclude
    functionName, // pFunctionName
    profile, // pProfile
    0, // Flags1
    0, // Flags2
    nullptr, // pPump
    &shaderBlob, // ppShader
    &errorBlob, // ppErrorMsgs
    NULL); // pHResult

-->

HRESULT hr = D3DCompileFromFile(
    filePath, // pFileName
    nullptr, // pDefines
    nullptr, // pInclude
    functionName, // pEntrypoint
    profile, // pTarget
    0, // Flags1
    0, // Flags2
    &shaderBlob, // ppCode
    &errorBlob); // ppErrorMsgs

4. Finally, I noticed some new warnings when building my projects. I use /W3 warning level and try to keep my code clean from any warnings, so I was glad to see that new Visual found some issues in my code, like:

visualscene.cpp(200): warning C4476: 'wprintf' : unknown type field character 'M' in format specifier
visualscene.cpp(200): warning C4474: 'wprintf' : too many arguments passed for format string
wprintf(L"%MaskEnable = true\n", GetIndent(indent + 1));
-->
wprintf(L"%sMaskEnable = true\n", GetIndent(indent + 1));

I don't like this one, but I made the change just to silence the warning:

engine.cpp(566): warning C4838: conversion from 'int' to 'uint' requires a narrowing conversion
uint macroValues[] = {
    constantAmbientEnabled      ? 1 : 0,
    hemisphereAmbientEnabled    ? 1 : 0,
    directionalLightEnabled     ? 1 : 0,
    directionalLightDualEnabled ? 1 : 0,
};

-->

uint macroValues[] = {
    constantAmbientEnabled      ? 1u : 0u,
    hemisphereAmbientEnabled    ? 1u : 0u,
    directionalLightEnabled     ? 1u : 0u,
    directionalLightDualEnabled ? 1u : 0u,
};

As a conclusion, I would say that the new Visual Studio 2015 Community Edition is good and worth upgrading. IDE looks similar to 2013 version. I also didn't notice any slowdown comparing to the old one. C++ compiler is improved, with new warnings, more modern C++ features and certainly many other improvements and bug fixes.

Transition from 5-year-old DirectX SDK to new DirectX headers included in Windows SDK is not that simple, depending on how many features of D3DX do you use, but in my case it was easier than I expected. It may seem that Microsoft makes our lives harder by breaking backward compatibility, but at same time they provide nice replacements in form of open-source libraries and encourage transition to better practices, like offline asset preparation.

Comments (2) | Tags: visual studio directx c++ | Author: Adam Sawicki | Share

Comments

rouncer
2015-10-18 11:04:32
Thanks for making this, I was feeling terrible - once I accidentally installed windows 10, then all the deprecation shockback happened.

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

www.lululemonoutlet.gb.net

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-2016 Adam Sawicki
Copyright © 2004-2016 Adam Sawicki