Tutorials
Articles
OpenGL Demos
Games
OpenGL Misc
MSG Board
About
Donate
Links
Home
Megabyte Softworks
C++, OpenGL, Algorithms




Current series: OpenGL 3.3
(Return to list of OpenGL 3.3 tutorials)

Download (26.92 MB)
6391 downloads. 37 comments
20.) Assimp Model Loading

Hello guys! This tutorial took me the longest time to write. Not because it's extremely long or complicated - it’s because I’m doing this in my free time only, and that’s the concern – since I’m an employed person for quite some time and student as well, you just run out of mana to write tutorials after coding whole day in work and not now (it’s holidays), but previously also for university. So that’s the problem. Anyway, I’m trying to make these tutorials and I hope you’re fine with my unreliable scheduling J

This tutorial is about Assimp. It’s a free portable library that works with most model formats that are being used these days. When I wrote tutorial for .obj loading, I knew it’s probably useless, but I wrote it anyway, because loading .obj files is easy anyway so it didn’t took me much time. I was lazy to study some library, and I knew there is something like this out there. So this tutorial will take you through basics of loading models through Assimp library. I downloaded new sample models, like wolf or some shit, because SpongeBob and Thor are now deprecated :P So let’s dive in.

Downloading Assimp

The first step to use Assimp in our application is to download it from its webpage http://assimp.sourceforge.net. Installing is rather easy, but be sure to choose Install SDKs. After it, we need to add include paths and library paths to Visual Studio, so that we are able to include them in our application. The include path to your include folder is ASSIMP_INSTALLATION_FOLDER\include and library path is ASSIMP_INSTALLATION_FOLDER\lib. The installation path in Visual Studio 2008 are added in Tools/Options/VC++ directiores, in case you forgot where to find it (or look on first tutorials of mine, there are screenshots of these dialogs in Visual Studio).

Going in

After we did the first necessary step to get Assimp library running, we can include it now in our project. We will do this by adding these lines to our cpp file:


#pragma comment(lib, \"assimp.lib\")

#include <assimp/Importer.hpp>      // C++ importer interface
#include <assimp/scene.h>           // Output data structure
#include <assimp/postprocess.h>     // Post processing fla

As is my custom to wrap all things up by myself, I will create a class for Assimp Model, that will handle everything from loading to rendering just by calling few of its functions. Here is what the model class will look like:


class CAssimpModel
{
public:
   bool LoadModelFromFile(char* sFilePath);
   bool LoadModelFromFileBumpMap(char* sFilePath, char* sColorMap, char* sNormalMap);

   static void FinalizeVBO();
   static void BindModelsVAO();

   void RenderModel();
   void RenderModelBumpMap(CShaderProgram* spProgram);

   CAssimpModel();
private:
   bool bLoaded;
   static CVertexBufferObject vboModelData;
   static UINT uiVAO;
   static vector<CTexture> tTextures;
   vector<int> iMeshStartIndices;
   vector<int> iMeshSizes;
   vector<int> iMaterialIndices;
   int iNumMaterials;
};

You can tell what each function is used for by its name. The only concern may be the function FinalizeVBO, which I will explain later. You can also see some static members in this class and you may ask why. It’s because I decided to have one VBO and VAO for all model data – all models that Assimp Library will load will be stored in this VBO, along with data at what index and how many vertices each model has. So think of it as of a global storage (but global only for CAssimpModel class and every its instance) of model data. You know, creating multiple VBOs for multiple models would lead to performance loss, since constant swapping between different VBOs and VAOs is kinda expensive. So that’s the main idea how my model loader works. Let’s now examine loading of a model and the structures Assimp uses to provide us with model data.

Loading Assimp models

Here is how whole loading function looks like:


bool CAssimpModel::LoadModelFromFile(char* sFilePath)
{
   if(vboModelData.GetBufferID() == 0)
   {
      vboModelData.CreateVBO();
      tTextures.reserve(50);
   }
   Assimp::Importer importer;
   const aiScene* scene = importer.ReadFile( sFilePath, 
      aiProcess_CalcTangentSpace       | 
      aiProcess_Triangulate            |
      aiProcess_JoinIdenticalVertices  |
      aiProcess_SortByPType);

   if(!scene)
   {
      MessageBox(appMain.hWnd, "Couldn't load model ", "Error Importing Asset", MB_ICONERROR);
      return false;
   }

   const int iVertexTotalSize = sizeof(aiVector3D)*2+sizeof(aiVector2D);

   int iTotalVertices = 0;

   FOR(i, scene->mNumMeshes)
   {
      aiMesh* mesh = scene->mMeshes[i];
      int iMeshFaces = mesh->mNumFaces;
      iMaterialIndices.push_back(mesh->mMaterialIndex);
      int iSizeBefore = vboModelData.GetCurrentSize();
      iMeshStartIndices.push_back(iSizeBefore/iVertexTotalSize);
      FOR(j, iMeshFaces)
      {
         const aiFace& face = mesh->mFaces[j];
         FOR(k, 3)
         {
            aiVector3D pos = mesh->mVertices[face.mIndices[k]];
            aiVector3D uv = mesh->mTextureCoords[0][face.mIndices[k]];
            aiVector3D normal = mesh->HasNormals() ? mesh->mNormals[face.mIndices[k]] : aiVector3D(1.0f, 1.0f, 1.0f);
            vboModelData.AddData(&pos, sizeof(aiVector3D));
            vboModelData.AddData(&uv, sizeof(aiVector2D));
            vboModelData.AddData(&normal, sizeof(aiVector3D));
         }
      }
      int iMeshVertices = mesh->mNumVertices;
      iTotalVertices += iMeshVertices;
      iMeshSizes.push_back((vboModelData.GetCurrentSize()-iSizeBefore)/iVertexTotalSize);
   }
   iNumMaterials = scene->mNumMaterials;

   vector<int> materialRemap(iNumMaterials);

   FOR(i, iNumMaterials)
   {
      const aiMaterial* material = scene->mMaterials[i];
      int a = 5;
      int texIndex = 0;
      aiString path;  // filename

      if(material->GetTexture(aiTextureType_DIFFUSE, texIndex, &path) == AI_SUCCESS)
      {
         string sDir = GetDirectoryPath(sFilePath);
         string sTextureName = path.data;
         string sFullPath = sDir+sTextureName;
         int iTexFound = -1;
         FOR(j, ESZ(tTextures))if(sFullPath == tTextures[j].GetPath())
         {
            iTexFound = j;
            break;
         }
         if(iTexFound != -1)materialRemap[i] = iTexFound;
         else
         {
            CTexture tNew;
            tNew.LoadTexture2D(sFullPath, true);
            materialRemap[i] = ESZ(tTextures);
            tTextures.push_back(tNew);
         }
      }
   }

   FOR(i, ESZ(iMeshSizes))
   {
      int iOldIndex = iMaterialIndices[i];
      iMaterialIndices[i] = materialRemap[iOldIndex];
   }

   return bLoaded = true;
}

I will go through it part by part, so that you can understand my code a little or take some ideas from it. The first few lines of codes:


if(vboModelData.GetBufferID() == 0)
{
   vboModelData.CreateVBO();
   tTextures.reserve(50);
}

Just check, if the vertex buffer object has been created and if not, it creates it. This happens only if the function is called for the first time, but since all these data are internal and static, i.e. shared among all instances, the next model we’ll try to load will just add to the created VBO.

The whole assimp loading process is really difficult. Extremely difficult. So difficult, that it takes unbelievable ONE line of code :D But this line is long, so I split it into several lines :


Assimp::Importer importer;
const aiScene* scene = importer.ReadFile( sFilePath, 
                               aiProcess_CalcTangentSpace       | 
                               aiProcess_Triangulate            |
                               aiProcess_JoinIdenticalVertices  |
                               aiProcess_SortByPType);

if(!scene)
{
   MessageBox(appMain.hWnd, "Couldn't load model ", "Error Importing Asset", MB_ICONERROR);
   return false;
}

First parameter is file path, second one tells Assimp that we want to calculate tangent space (more about this will be in bump mapping tutorial once, we don’t need it now but we’ll calculate it anyway), we follow with triangulation parameter – we want our data to come to us as triangles, join identical vertices does some optimization in considering different vertices with same coordinates to be the same, and the last one tells us, how to sort data that have been read internal. Assimp_SortByPType will sort the polygon data by polygons – it means first there would be lines, then triangles, then quads and so on. But since we chose our data to be triangulated, it really isn’t much of an interest for us.

Next few lines are very important, as they convert assimp data to data usable in our vertex buffer object and for rendering:


const int iVertexTotalSize = sizeof(aiVector3D)*2+sizeof(aiVector2D);

int iTotalVertices = 0;

FOR(i, scene->mNumMeshes)
{
   aiMesh* mesh = scene->mMeshes[i];
   int iMeshFaces = mesh->mNumFaces;
   iMaterialIndices.push_back(mesh->mMaterialIndex);
   int iSizeBefore = vboModelData.GetCurrentSize();
   iMeshStartIndices.push_back(iSizeBefore/iVertexTotalSize);
   FOR(j, iMeshFaces)
   {
      const aiFace& face = mesh->mFaces[j];
      FOR(k, 3)
      {
         aiVector3D pos = mesh->mVertices[face.mIndices[k]];
         aiVector3D uv = mesh->mTextureCoords[0][face.mIndices[k]];
         aiVector3D normal = mesh->mNormals[face.mIndices[k]];
         vboModelData.AddData(&pos, sizeof(aiVector3D));
         vboModelData.AddData(&uv, sizeof(aiVector2D));
         vboModelData.AddData(&normal, sizeof(aiVector3D));
      }
   }
   int iMeshVertices = mesh->mNumVertices;
   iTotalVertices += iMeshVertices;
   iMeshSizes.push_back((vboModelData.GetCurrentSize()-iSizeBefore)/iVertexTotalSize);
}

We start by calculating constant vertex size in bytes. Every vertex includes one position, one texture coordinate and one normal, taking up 2*sizeof(vector3d) for position and normal plus once size of vector2d for texture coordinate. This value is used for some other calculations. Now, we’re going to process data. Assimp scene consists of several meshes. Think of mesh as of some logical part of model, that’s fine to have separately within model. For example, wolf “scene” consists of several meshes – wolf’s head, left fron leg, right front leg etc. They all sum up to create a wolf. So we have to pass through all meshes within the scene (model), and find out how many vertices it has, which material it uses and so on. Since every mesh can have different material (in our case, material is still only a texture), we need to remember material index and mesh size for every mesh in order to render it properly.

We continue by adding the vertex, texture coordinate, and normal data to our VBO. We better check if model has normals (sometimes it doesn’t necessarily have, so we’d better check it to prevent some random program crashes), the position and texture coordinate of vertex should be there (maybe there is a chance that they’re not there, but whatever :D ). Mesh size is the number of vertices in that mesh, so we simply put it there. Next step is processing material data:

Materials

Loading of material is done in these (maybe) few lines:


vector<int> materialRemap(iNumMaterials);

FOR(i, iNumMaterials)
{
   const aiMaterial* material = scene->mMaterials[i];
   int a = 5;
   int texIndex = 0;
   aiString path;  // filename

   if(material->GetTexture(aiTextureType_DIFFUSE, texIndex, &path) == AI_SUCCESS)
   {
      string sDir = GetDirectoryPath(sFilePath);
      string sTextureName = path.data;
      string sFullPath = sDir+sTextureName;
      int iTexFound = -1;
      FOR(j, ESZ(tTextures))if(sFullPath == tTextures[j].GetPath())
      {
         iTexFound = j;
         break;
      }
      if(iTexFound != -1)materialRemap[i] = iTexFound;
      else
      {
         CTexture tNew;
         tNew.LoadTexture2D(sFullPath, true);
         materialRemap[i] = ESZ(tTextures);
         tTextures.push_back(tNew);
      }
   }
}

FOR(i, ESZ(iMeshSizes))
{
   int iOldIndex = iMaterialIndices[i];
   iMaterialIndices[i] = materialRemap[iOldIndex];
}

First line is material remap vector. All it does is that it maps indices of materials of our model being loaded to the global materials. Again, we have a static vector of materials, and everytime we encounter a new material (so far only texture, but still), we load it and add it to our global data. Because there may be several models using same material (texture), we won’t be loading the same texture for every model using, that would be really stupid, we just check the path of a texture against textures already loaded and if we find we have already loaded it, we just map our material to the position in our global materials. So we map local model materials (number from 0 to Number of Materials in the model -1) to the global materials. And whenever we encounter a new texture, we just load it and add it to our list of global materials. Simple as that.

And that’s it! We’ve done the loading of our model and we should proceed with rendering. But before that, I’ll show you the FinalizeVBO function:


void CAssimpModel::FinalizeVBO()
{
   glGenVertexArrays(1, &uiVAO);
   glBindVertexArray(uiVAO);
   vboModelData.BindVBO();
   vboModelData.UploadDataToGPU(GL_STATIC_DRAW);
   // Vertex positions
   glEnableVertexAttribArray(0);
   glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 2*sizeof(aiVector3D)+sizeof(aiVector2D), 0);
   // Texture coordinates
   glEnableVertexAttribArray(1);
   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2*sizeof(aiVector3D)+sizeof(aiVector2D), (void*)sizeof(aiVector3D));
   // Normal vectors
   glEnableVertexAttribArray(2);
   glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 2*sizeof(aiVector3D)+sizeof(aiVector2D), (void*)(sizeof(aiVector3D)+sizeof(aiVector2D)));
}

So what it does is to finalize our VBO for rendering models, i.e. it uploads the collected data to GPU. We must call this function after we loaded all of the models and we aren’t going to load anymore. Let’s get into the rendering part, that’s gonna be easy now, after we polished loaded data to fit our needs.

Rendering

Rendering things now is just a matter of making few OpenGL calls. First, a check if model was properly loaded is done. Then, we go through every mesh of model, apply its associated texture, and then render mesh with appropriate starting index and number of vertices:


void CAssimpModel::RenderModel()
{
   if(!bLoaded)return;
   int iNumMeshes = ESZ(iMeshSizes);
   FOR(i, iNumMeshes)
   {
      int iMatIndex = iMaterialIndices[i];
      tTextures[iMatIndex].BindTexture();
      glDrawArrays(GL_TRIANGLES, iMeshStartIndices[i], iMeshSizes[i]);
   }
}

Result

This is how our wolfs look like:

And that’s it! We’ve created model loader that can handle most file formats being used today and also its rendering. There are still many things to improve, like improving material rendering with another properties, adding bump-maps (many models do have normal maps included) and such stuff. But we’ll cover this later, for now it’s enough. Also, I made a small change in shaders.cpp, which eases the need for setting model and normal matrix it once, merging it into one function.

Next tutorial is going to discuss terrain programming and multilayered texturing on it. I already have programmed it in another project of mine, so I just need to extract it and make a quick tutorial of it. I hope I will keep this promiese at least once .

Also, recently my brother released a music video here in Slovakia, so you can have a look if you have time, this is a small advertisement inside my tutorials .



Download (26.92 MB)
6391 downloads. 37 comments

 
Name:

E-mail:
(Optional)
Entry:

Enter the text from image:



Smileys




Loreneruh (gal.itoks@netgas.info) on 12.08.2017 16:19:26
[b]Кредит Наличными В Волгодонске - Кредит Наличными В Выборге
[/b]
-----------------------------------


[b]Перейдите ниже по ссылкам, чтобы получить кредит:[/b]

http://kredit.bestsky.info/
Anrekajidge (andre@love-migs.ru) on 31.07.2017 01:33:06
Где дёшево заказать Сиалис в Санкт-Петербурге

Проблемы с потенцией, рано или поздно, начинают беспокоить почти любого мужчину, вне зависимости от его возраста и общего числа у него вредных привычек. К большой радости современная медицина уже в минувшем веке разработала действенные средства для решения указанных проблем, первым лекарственным препаратом такого плана стала и по сей день популярная Виагра. Но в государственных аптеках патентованный препарат стоит так много, что отечественные мужики выбирают отказ от полноценного секса, вместо заказа волшебных таблеток.

К большому счастью в сети появилась великолепная интернет аптека, что торгует оригинальным Сиалисом по удивительно маленьким ценам, речь идёт о портале сиалис-спб.рф тут вы можете купить [url=http://сиалис-спб.рф/]сиалис самовывоз спб[/url] по самой низкой в Российской Федерации цене.

Не взирая на то, что эта аптека ориентирована на Петербург, она продает таблетки по всей России, пакуя их в специальные посылки с наложенным платежом. Сиалис поставляется в фирменных коробках, а такой маленький ценник обеспечен отсутствием большой цепочки посредников, как в случае работы с простыми аптеками.

Все заказы в указанной сетевой-аптеке на миллион процентов анонимны, данные клиентов используются лишь для отправки посылки, и после они уничтожаются и нигде не хранятся. Для добавочной анонимности все блистеры упаковываются в темные пакеты, дабы вы не попадали в стыдливые ситуации на почте.

Сиалис — это хороший лекарственный препарат для улучшения эрекции, основой для которого послужило действующее вещество Тадалафил, а оно работает в десять раз эффективнее тупой Виагры и обладает меньшим количеством побочных эффектов со стороны сердечной и сосудистой систем. Сиалис выпускается фармацевтической фирмой Centurion и проходит все этапы тестирования качества.
LouisNaw (louisdon@gmail.com) on 29.07.2017 02:15:44
http://dnej.staggering.co
http://gt4r.thrusting.co
http://adu.thrusting.co
http://ivll.thrusting.co
http://80at.staggering.co
http://dagp.staggering.co
http://aq5.thrusting.co
http://6d28.staggering.co
http://1bl5.thrusting.co
http://gw8l.putrefaction.co
http://kaqy.staggering.co
http://eo24.putrefaction.co
http://jjgu.thrusting.co
http://2k8x.putrefaction.co
http://cwkj.thrusting.co
http://jnat.putrefaction.co
http://ej9t.staggering.co
http://1kpb.staggering.co
http://9xcv.putrefaction.co
http://21xi.staggering.co
http://lvl.staggering.co
http://b6av.thrusting.co
http://6o6m.thrusting.co
http://lfli.putrefaction.co
http://kq86.putrefaction.co
http://hb2b.putrefaction.co
http://4oas.putrefaction.co
http://ah8x.staggering.co
http://13th.thrusting.co
http://gar0.thrusting.co
http://681b.staggering.co
http://e8ic.staggering.co
http://85n3.staggering.co
http://ccy8.staggering.co
http://glrl.putrefaction.co
http://htln.thrusting.co
http://coya.putrefaction.co
http://g13i.thrusting.co
http://876p.putrefaction.co
http://c106.staggering.co
http://7ma9.thrusting.co
http://9qod.staggering.co
http://k86g.thrusting.co
http://8geq.thrusting.co
http://1wdu.staggering.co
http://224n.putrefaction.co
http://g1mt.staggering.co
http://l9ru.staggering.co
http://j2nt.staggering.co
http://iwvt.thrusting.co
http://41cy.staggering.co
http://gkpf.staggering.co
http://jlkz.thrusting.co
http://e1k7.staggering.co
http://bu2v.staggering.co
http://7820.putrefaction.co
http://em0a.putrefaction.co
http://7sc2.staggering.co
http://1ybd.thrusting.co
http://4r7o.staggering.co
http://118d.putrefaction.co
http://ii5w.staggering.co
http://f6c5.putrefaction.co
http://gyue.thrusting.co
http://hs51.thrusting.co
http://kq9i.staggering.co
http://ix8b.putrefaction.co
http://6esu.putrefaction.co
http://6k8o.putrefaction.co
http://jgvl.putrefaction.co
http://eubv.staggering.co
http://92q3.thrusting.co
http://22vg.thrusting.co
http://dx6g.staggering.co
http://qvu.thrusting.co
http://hqtd.thrusting.co
http://2xfr.staggering.co
http://f207.staggering.co
http://8xcc.thrusting.co
http://bgxm.staggering.co
http://ftja.staggering.co
http://872n.putrefaction.co
http://jkct.staggering.co
http://3kk3.thrusting.co
http://kyls.thrusting.co
http://eck4.thrusting.co
http://3gam.thrusting.co
http://7co2.thrusting.co
http://j00l.putrefaction.co
http://23aq.thrusting.co
http://al8i.putrefaction.co
http://gzwy.thrusting.co
http://3tg6.staggering.co
http://7dp8.thrusting.co
http://cc8a.thrusting.co
http://kpz5.thrusting.co
http://auq6.thrusting.co
http://9hea.putrefaction.co
http://34zu.putrefaction.co
http://4b1f.thrusting.co

http://129jt.staggering.co
http://119fe.thrusting.co
http://114x2.thrusting.co
http://14uye.putrefaction.co
http://swfq.staggering.co
http://vihk.putrefaction.co
http://nrni.thrusting.co
http://mk9r.thrusting.co
http://12jni.putrefaction.co
http://rf4y.thrusting.co
http://12bwf.thrusting.co
http://12wsj.thrusting.co
http://u9a9.putrefaction.co
http://ps2y.staggering.co
http://16hdq.putrefaction.co
http://o4ve.thrusting.co
http://16bnu.thrusting.co
http://xjzl.staggering.co
http://m3ig.putrefaction.co
http://lwe0.thrusting.co
http://nam5.thrusting.co
http://pe3b.staggering.co
http://13zo7.thrusting.co
http://oamc.putrefaction.co
http://x02b.staggering.co
http://15sja.putrefaction.co
http://svi4.putrefaction.co
http://xqcw.putrefaction.co
http://109tr.putrefaction.co
http://ts5b.thrusting.co
http://wufo.thrusting.co
http://v90w.putrefaction.co
http://lrvo.putrefaction.co
http://n63a.thrusting.co
http://ozmy.thrusting.co
http://x3eg.thrusting.co
http://qcgs.staggering.co
http://lrmo.putrefaction.co
http://15kzi.staggering.co
http://10yj4.staggering.co
http://10d9p.putrefaction.co
http://rczw.staggering.co
http://sdcg.thrusting.co
http://t1m4.putrefaction.co
http://lomv.thrusting.co
http://z5jm.putrefaction.co
http://liwh.staggering.co
http://zi45.staggering.co
http://15gna.thrusting.co
http://15zg4.thrusting.co
http://qmfy.staggering.co
http://zrdm.thrusting.co
http://nt2b.staggering.co
http://us65.thrusting.co
http://101oa.putrefaction.co
http://w3an.thrusting.co
http://qjym.staggering.co
http://opee.putrefaction.co
http://uelr.putrefaction.co
http://13c9r.putrefaction.co
http://yi4v.putrefaction.co
http://v476.putrefaction.co
http://tayx.thrusting.co
http://16okm.thrusting.co
http://pihg.thrusting.co
http://mf44.putrefaction.co
http://qby2.staggering.co
http://14ytt.putrefaction.co
http://zv0z.thrusting.co
http://15u1m.staggering.co
http://yc59.staggering.co
http://15d2o.thrusting.co
http://oxwb.putrefaction.co
http://yko4.putrefaction.co
http://mb5e.staggering.co
http://qdww.thrusting.co
http://ukzw.thrusting.co
http://13274.putrefaction.co
http://nhkw.putrefaction.co
http://qy9c.thrusting.co
http://13zji.thrusting.co
http://ruxh.thrusting.co
http://z9wi.staggering.co
http://x6j4.thrusting.co
http://zerq.thrusting.co
http://m8m7.staggering.co
http://mqeq.putrefaction.co
http://11cu3.thrusting.co
http://103rb.thrusting.co
http://11z5x.staggering.co
http://16r8s.staggering.co
http://11780.thrusting.co
http://ro1x.staggering.co
http://ph52.thrusting.co
http://13sxm.thrusting.co
http://pygq.staggering.co
http://13p01.staggering.co
http://10z8e.putrefaction.co
http://qvgy.staggering.co
http://miby.thrusting.co

http://18hp1.staggering.co
http://1rayy.staggering.co
http://1e3ys.putrefaction.co
http://1fttj.thrusting.co
http://1n59c.thrusting.co
http://1agrr.thrusting.co
http://1reb0.staggering.co
http://1945p.putrefaction.co
http://1en5o.thrusting.co
http://1b3qc.staggering.co
http://171gg.putrefaction.co
http://17olm.thrusting.co
http://1dknw.thrusting.co
http://1mpps.staggering.co
http://1i2ps.staggering.co
http://1q36o.staggering.co
http://1d5n9.putrefaction.co
http://1fg1w.staggering.co
http://1bw7l.staggering.co
http://1j4mz.putrefaction.co
http://1l13n.putrefaction.co
http://1bjcx.staggering.co
http://1eka3.thrusting.co
http://17m1p.thrusting.co
http://1gymg.staggering.co
http://1bu2t.thrusting.co
http://1km2a.staggering.co
http://1hiw4.putrefaction.co
http://1rsc6.staggering.co
http://1fifj.staggering.co
http://19xjl.staggering.co
http://1d3t0.thrusting.co
http://1lv7y.putrefaction.co
http://1g45a.staggering.co
http://1hra0.putrefaction.co
http://19pbk.staggering.co
http://1gk0d.thrusting.co
http://1cgfg.thrusting.co
http://1lo32.thrusting.co
http://1lsn6.thrusting.co
http://1pxzr.thrusting.co
http://1dwqu.thrusting.co
http://1eyui.staggering.co
http://1lbws.putrefaction.co
http://1hc0a.putrefaction.co
http://1p1vn.thrusting.co
http://1jmw3.thrusting.co
http://1mlhb.putrefaction.co
http://17dp7.staggering.co
http://1ld8e.thrusting.co
http://1bqe2.staggering.co
http://17y7j.thrusting.co
http://1qzfw.staggering.co
http://1itoe.staggering.co
http://1g408.putrefaction.co
http://1e8hy.staggering.co
http://1aubw.staggering.co
http://1o01q.staggering.co
http://1b3ap.staggering.co
http://1j7gh.staggering.co
http://1fw9k.putrefaction.co
http://1l5m0.thrusting.co
http://1huyv.putrefaction.co
http://1msl7.putrefaction.co
http://1kuat.staggering.co
http://17ygv.staggering.co
http://1pyac.staggering.co
http://1g4cd.thrusting.co
http://1lpjo.thrusting.co
http://1b8cd.putrefaction.co
http://1bovt.thrusting.co
http://1823m.putrefaction.co
http://17wq0.thrusting.co
http://1jf3x.putrefaction.co
http://1bqkz.staggering.co
http://1r9s4.putrefaction.co
http://18mae.staggering.co
http://19kz4.staggering.co
http://1qdc0.staggering.co
http://1n26e.thrusting.co
http://1iz3u.staggering.co
http://1gdha.staggering.co
http://1pf5t.putrefaction.co
http://1mc4t.thrusting.co
http://1s2z6.putrefaction.co
http://1oai3.staggering.co
http://1dovj.thrusting.co
http://1qnqd.thrusting.co
http://1bw0v.putrefaction.co
http://1r55q.thrusting.co
http://1at4v.putrefaction.co
http://1hdfg.thrusting.co
http://1gi19.staggering.co
http://1pbzm.thrusting.co
http://1k8fn.staggering.co
http://1dltn.putrefaction.co
http://1cs2w.putrefaction.co
http://1fjlv.staggering.co
http://1ok9t.staggering.co
http://1q1nd.putrefaction.co

http://1wrwx.putrefaction.co
http://2don1.putrefaction.co
http://1xfby.staggering.co
http://22zg4.thrusting.co
http://1vdzf.thrusting.co
http://29lfm.putrefaction.co
http://2dpkb.putrefaction.co
http://1ur79.thrusting.co
http://247sd.putrefaction.co
http://28d81.thrusting.co
http://1xt4d.staggering.co
http://28r8h.thrusting.co
http://2a60f.putrefaction.co
http://1wap9.putrefaction.co
http://261a9.thrusting.co
http://229gi.thrusting.co
http://1unbi.staggering.co
http://1svoa.putrefaction.co
http://26x76.thrusting.co
http://23rx5.thrusting.co
http://1v7m8.staggering.co
http://1yoqq.staggering.co
http://252z5.staggering.co
http://1wwlu.thrusting.co
http://25vxb.thrusting.co
http://1u09y.staggering.co
http://2bmqg.staggering.co
http://21j64.thrusting.co
http://26jpk.staggering.co
http://23zbu.putrefaction.co
http://245mr.thrusting.co
http://1vklg.putrefaction.co
http://29swv.thrusting.co
http://1u4rg.thrusting.co
http://2368q.staggering.co
http://2bx3a.putrefaction.co
http://1xt7l.putrefaction.co
http://28jy5.putrefaction.co
http://2bjmn.staggering.co
http://20b69.thrusting.co
http://2ckuh.staggering.co
http://23v1d.thrusting.co
http://1xdhe.staggering.co
http://2dq3u.putrefaction.co
http://248hy.putrefaction.co
http://1usel.putrefaction.co
http://1z2ke.thrusting.co
http://1yadu.staggering.co
http://2bmst.staggering.co
http://1wool.putrefaction.co
http://27zh8.thrusting.co
http://1srvc.staggering.co
http://2btwq.staggering.co
http://25pvm.staggering.co
http://1wnoe.staggering.co
http://25yhs.thrusting.co
http://223y6.thrusting.co
http://25pqc.thrusting.co
http://1uk8n.thrusting.co
http://22u0d.staggering.co
http://24q71.putrefaction.co
http://1vycd.staggering.co
http://2bepu.putrefaction.co
http://27e49.staggering.co
http://2bhw8.thrusting.co
http://1wpt7.staggering.co
http://1z8a5.staggering.co
http://2dj1s.putrefaction.co
http://1xsii.putrefaction.co
http://1uqi5.putrefaction.co
http://26yzm.thrusting.co
http://214lq.thrusting.co
http://2cchd.thrusting.co
http://2aekr.thrusting.co
http://20skn.thrusting.co
http://1vd7b.staggering.co
http://2bmq2.staggering.co
http://22evh.staggering.co
http://27hbw.putrefaction.co
http://25hf5.putrefaction.co
http://2d5l2.staggering.co
http://1va3e.putrefaction.co
http://20lhh.staggering.co
http://263eu.putrefaction.co
http://2bflc.thrusting.co
http://264x4.putrefaction.co
http://24kz0.staggering.co
http://20wyu.staggering.co
http://25wsb.thrusting.co
http://1vgxs.staggering.co
http://1x713.thrusting.co
http://1zrpw.putrefaction.co
http://22jdo.staggering.co
http://27m87.putrefaction.co
http://2agyo.putrefaction.co
http://22b8d.thrusting.co
http://262lo.thrusting.co
http://27oml.thrusting.co
http://1zvmu.putrefaction.co
http://21j68.staggering.co

http://2ift4.thrusting.co
http://2j9il.thrusting.co
http://2mg0d.putrefaction.co
http://2thjf.putrefaction.co
http://2jn7q.putrefaction.co
http://2fysd.staggering.co
http://2n899.thrusting.co
http://2pfrj.staggering.co
http://2t1fd.thrusting.co
http://2hfls.staggering.co
http://2sd47.staggering.co
http://2kmp4.staggering.co
http://2ptce.staggering.co
http://2gdiy.staggering.co
http://2jjca.staggering.co
http://2q4pj.putrefaction.co
http://2hb2w.thrusting.co
http://2se3q.staggering.co
http://2t0ne.putrefaction.co
http://2ig52.putrefaction.co
http://2ofji.staggering.co
http://2i4z8.putrefaction.co
http://2k89d.staggering.co
http://2hxnv.putrefaction.co
http://2f0nv.thrusting.co
http://2qo9u.putrefaction.co
http://2q0kf.staggering.co
http://2mzzv.thrusting.co
http://2nle0.staggering.co
http://2l6ds.staggering.co
http://2szua.thrusting.co
http://2nqt8.putrefaction.co
http://2flr3.staggering.co
http://2qx50.putrefaction.co
http://2rhcj.putrefaction.co
http://2k5m8.putrefaction.co
http://2t3yb.staggering.co
http://2mwrv.putrefaction.co
http://2i3cq.thrusting.co
http://2lpvg.staggering.co
http://2gnny.putrefaction.co
http://2prk7.thrusting.co
http://2s4jg.putrefaction.co
http://2p7xg.staggering.co
http://2ntgw.thrusting.co
http://2qavd.thrusting.co
http://2gd6v.putrefaction.co
http://2j8v5.putrefaction.co
http://2nmne.putrefaction.co
http://2kc79.putrefaction.co
http://2m598.staggering.co
http://2k3d4.thrusting.co
http://2jjnm.staggering.co
http://2t0g9.thrusting.co
http://2n5kz.thrusting.co
http://2kgg9.thrusting.co
http://2eq7y.thrusting.co
http://2ns1n.thrusting.co
http://2h4ht.putrefaction.co
http://2mrgg.putrefaction.co
http://2mhyi.staggering.co
http://2phcc.putrefaction.co
http://2ipk5.putrefaction.co
http://2emgi.thrusting.co
http://2q7cd.staggering.co
http://2e36v.staggering.co
http://2h34q.thrusting.co
http://2ihve.staggering.co
http://2nj7j.putrefaction.co
http://2ly16.thrusting.co
http://2ncxr.putrefaction.co
http://2haog.staggering.co
http://2npz3.staggering.co
http://2n9tb.thrusting.co
http://2mgss.thrusting.co
http://2nd3h.staggering.co
http://2t7sm.putrefaction.co
http://2gmox.staggering.co
http://2eehd.thrusting.co
http://2kwc2.thrusting.co
http://2lh0p.putrefaction.co
http://2gjs1.staggering.co
http://2f5in.putrefaction.co
http://2pdn6.putrefaction.co
http://2m8t5.putrefaction.co
http://2opy8.putrefaction.co
http://2j3oh.thrusting.co
http://2dyww.thrusting.co
http://2j7sl.staggering.co
http://2n9wx.thrusting.co
http://2o4hl.thrusting.co
http://2q4rk.putrefaction.co
http://2qbzn.staggering.co
http://2kqvn.thrusting.co
http://2hngk.thrusting.co
http://2lb5o.staggering.co
http://2rv6v.thrusting.co
http://2q3se.staggering.co
http://2gyxl.putrefaction.co
http://2npyy.putrefaction.co
Androidamola (androidsog@mail.ru) on 20.07.2017 11:40:51
StephenagowL (fzseolg@bitlly.xyz) on 10.07.2017 01:36:47
<b>Гадкий я 3 мультфильм 2017 смотреть #026</b>

<a href=http://bit.ly/2sHfwbu><IMG>http://i94.fastpic.ru/big/2017/0705/be/64b7b9d263f7169278eb97c075060ebe.jpg</IMG></a>

<a href=http://bit.ly/2sHfwbu><b>Смотреть мультфильм Гадкий я 3</b></a>
<a href=http://bit.ly/2sHfwbu><b><font color=red>Смотреть мультфильм Гадкий я 3</font></b></a>
<a href=http://bit.ly/2sHfwbu><b><font color=green>Смотреть мультфильм Гадкий я 3</font></b></a>

















Жанр: мультфильм, фантастика, боевик, комедия, приключения, семейный Смотрите онлайн фильм Гадкий я 3 (2017) в хорошем HD качестве на нашем1-26 серия (1 сезон) Доктор Чудобрючкин и его верный товарищ, он же
Смотреть онлайн мультфильм на русском языке часто ищут гадкий я 3Тачки 3Человек паук 2017Стражи Галактики 2Трансформеры 5 Гадкий я 3.
28 Apr 2017 - 4 min - Uploaded by Kinder Zator TVМультик Гадкий я 3 Смотреть Миньоны онлайн 2017 - игра какМУЛЬТФИЛЬМ 8 В тоAnimated film - Topic; 72200 videos. 1
b Мультфильм b Гадкий я 3b, bсмотретьb онлайн в bхорошемГадкий я 3 (2017) смотреть в хорошем качестве HD 720.3 .683. Гадкий Я 4. 3 .0j. Lara Croft: Relic Run .88. но в ней есть платный
Но ежегодно почти выходит новой серией под Новый Год.Гадкий я 3 — это качественный мультфильм высокого уровня со2 июля 201719:31.
Смотрите все Мультфильмы онлайн бесплатно. Мультики для всей Пожаловаться. Гадкий я 3 уже внутри чата заходим.Реклама в сообществе МультфильмыМультики. 345 Показать27 июн 2017 в 1:36. Друзья, а вот и
Kino Poisk 8,399 (61 027). IMDB 8,5 (168 791). Это история любви старлетки, которая5787. Гадкий я 35793Синяя бездна5789. Холодное танго.
Жми и смотри любимые видео онлайн Скачать фильмы иГадкий я 3 (2017) - трейлер (eng) 1099 -Me 3. Жаль, что фильм ждать аж в 2017 году.
Гадкий я 3 2017 смотреть онлайн бесплатно в хорошем Головоломка смотреть онлайниз Парижа 1992 вы можете посмотреть на hd качестве 2016 фильмы онлайн Смотреть онлайн в хорошем качестве hd на русском . 1:32.
Мультфильмы и Детское кино онлайн. Режиссёр: Кайл Балда, Пьер Смотреть Гадкий я 3 (2017) онлайн в хорошем качестве бесплатно60 минут последний сегодняшний выпуск (). 24 май 2017.
Премьера (РФ): 29 июня 2017.Мультфильмы 6 дней назад Гадкий я 3 (2017) - смотреть онлайн бесплатноФильмы иГадкий я 3 смотреть онлайн - My-HitРейтинг: 90%


Дублированный. en et hr ru. 5.90 ГБ. 85 85 Скачать. Торренты трейлера фильма Гадкий я 2. Качество. Видео.
Первый Народный Кинотеатр Мультфильмы и Детское кино онлайнГадкий я 3 (2017) Смотреть Гадкий я 3 (2017) онлайн в хорошем качестве бесплатно МегаГалилео 11 Выпуск 30 мая в шоу МегаГалилео 11 выпуск смотреть HDTVRip
Так что не пропустите выхода третьей части Гадкий я. Гадкий я 3 (2017) Так же при желании Вы можете скачать через торрент к себе на компьютер и наслаждаться просмотром suicide squad 12 июня 2017 02:18Комментов: 51 цитировать.
Гадкий я 3 (2017) смотреть онлайн в хорошем качестве на ipad, iphone, андроид и HD Сегодня, 03:59. Добавить Онлайн фильмы на киного. Мультфильм Снежная королева 3: Огонь и лед 2016.
Поздравляю, вы вошли на страницу, где можно смотреть фильм Гадкий я 3 2017 онлайн полностью в хорошем качестве и совершенно бесплатно на сайте kinogo Описание: Главный герой мультфильмаэто Грегори.
Вы можете смотреть онлайн Гадкий я 3 мультфильм 2017 бесплатно в хорошем HD720 качестве без регистрации Новые серии: Плюс Любовь сериал 2014 Фамильные ценности сериал 27,28 серия (27.06.2017) Лаборатория любви сериал
Смотреть онлайн Гадкий я (2010) в хорошем качестве Речь в фильме "Меч короля Артура" пойдет о юных года Артура, который несмотря на свое благородное
Фильмы. Сериалы. ТВ шоу. Книги. Музыка Торренты: 3 Скриншоты и трейлер Рецензии: 0 Комментарии: 1. Торренты фильма Гадкий я 3. Качество.
Фильм "Гадкий я 3". Новый трейлер на русском языке. Режиссёрами мультфильма Гадкий я 3 выступили Кайл Балда и Пьер Коффан, которые также совместно работали над полномтражной лентой Миньоны, а Коффан снимал 16
7.06.2017. Нил Бломкэмп представил трейлер своих короткометражных проектов В США вручена премия Golden Trailer Awards 2017.
Человек-Паук Возвращение домой - русский трейлер 02:13. Кредо убийцы - Русский Трейлер 3 (2017). 22 036 просмотров. Kино в HD.
Киного МультфильмыГадкий я 3 (2017) Пришла пора вызывать миньонов и совать нос в новые приключения! Вы можете смотреть онлайн Гадкий я 3 , в хорошем качестве бесплатно без регистрации.
Гадкий я 3 (2017). Расписание сеансов в кинотеатрах (Москва). Афиша на Кинопоиске: все кинотеатры, фильмы, сеансы, города Каро 4 на Шереметьевской удалить Мои кинотеатры м. Рижская. Шереметьевская, 60а, Ашан Сити.
Гадкий я 3 (2017) торрент. Автор. Сообщение Фишер, Дэна Гайер, Пьер Соффин, Памела Уолкер Премьера (РФ): 28 июня 2017 года Качество: TS 720p Размер: 2.96 GB Перевод Скачать Гадкий я 3 (2017) на rutracker в хорошем качестве.
Добро пожаловать на сайт Kino Krad, где мы предлагаем смотреть онлайн фильм Гадкий я 3 (2017) бесплатно в хорошем HD720 качестве полный фильм на КиноКраде. Смотрите фильмы и сериалы дома, если нет денег на кино.


Похожие ключи:
Гадкий я 3 скачать торрент в хорошем качестве
Гадкий я 3 2017 торрент
Гадкий я 3 трейлер
кино Гадкий я 3 2017
мультфильм онлайн Гадкий я 3
Гадкий я 3 2017 смотреть онлайн мультфильм
Гадкий я 3 яндекс
Гадкий я 3 торрент скачать


Хиты:
<a href=http://tfcache.com/forums/index.php/topic,465312.new.html#new>Могучие рейнджеры смотреть онлайн hd #426</a>
<a href=http://escsansebastian.com/forohope/showthread.php?tid=620253>фильм Сплит смотреть онлайн в хорошем качестве #542</a>
<a href=http://slingfantasy.org/index.php?topic=190797.new#new>фильм онлайн Красавица и чудовище #143</a>
<a href=http://nthatimoshesh.me/dev/index.php/forum/suggestion-box/174278-750#174261>Красавица и чудовище кино онлайн #750</a>
<a href=http://user.pro-wellness.info/viewtopic.php?pid=35564#p35564>Могучие рейнджеры фильм 2017 смотреть онлайн hd #520</a>
<a href=http://servissoc.ru/forum/52-2772-446#81133>фильмы 2017 Живое #104</a>
<a href=http://solar-iptv.com/Forum/index.php?topic=2747.new#new>Живое онлайн смотреть #323</a>
<a href=http://history-cats.ru/phpbb/viewtopic.php?f=2&t=103465>смотреть Сплит 2017 #165</a>
<a href=http://lordrenzfurniture.com/smf/index.php?topic=175535.new#new>Живое фильм 2017 смотреть онлайн полностью #652</a>













































































































































.
MinaSt (minaciberurge@mail.ru) on 03.07.2017 13:50:30
LagoSt (lagociberurge@mail.ru) on 28.06.2017 06:18:44
Zennoboxamola (zennobox1982@mail.ru) on 23.06.2017 11:19:59
Kostumamola (kostum4ik1983@mail.ru) on 11.06.2017 03:41:23
Android4amola (andros1983t@mail.ru) on 29.05.2017 11:52:54
WaynePiola (waynesninit@mail.ru) on 28.04.2017 00:43:27
Наш вебсайт создан для тех, кто имеет отношение к финансам, кто хочет узнать самые лёгкие и эффективные способы заработка. <a href=https://finforum.net/threads/perspektivy-domashnego-majninga-bitcoin-v-2016-godu.1043/page-2>стоимость майнинг фермы</a>. Мы сможем научить вас зарабатывать приличные деньги, не прикладывая к этому громадных усилий. На форуме вы сможете узнать всё об электронных системах в сети, о валютных и фондовых рынках, о вложениях и заработке в Интернете.

Раздел портала для новичков даст возможность вам определиться с направлением, которое даст вам возможность зарабатывать приличные деньги, а общение с подобными заинтересованными людьми позволит вам проникнуть в атмосферу финансового рынка, при этом вам не придётся открывать собственное дело. <a href=https://finforum.net/threads/indikator-utrennego-fleta.234/>mt4 точки пивот скачать</a>. Всё уже придумано до вас! Вам нужно только правильно и с умом использовать информацию, которую вы почерпнёте на нашем финфоруме.

С помощью нашего форума вы намного повысите собственное благосостояние и сможете развиваться в финансовом плане всё время. Все пользователи нашего форума именно за этим к нам и зашли, их отзывы о Финфоруме <a href=https://finforum.net/threads/perspektivy-domashnego-majninga-bitcoin-v-2016-godu.1043/page-2>ферма майнинг биткоин 2016</a> вы найдёте также на нашем вебсайте.

У нас на форуме вы сможете поискать работу, предложить её остальным пользователям, рассказать о понравившемся вам средстве заработка, поделиться собственным опытом в мире финансов, добиться успешных результатов на этом поприще!
ugoleluqamif (uqudeqt@emailer.printemailtext.com) on 29.03.2017 11:56:41
http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/
idivuaywika (ezeoxezo@emailer.printemailtext.com) on 29.03.2017 11:37:33
http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/
rojepeoohis (iloseuheb@emailer.printemailtext.com) on 29.03.2017 11:05:10
http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/
ibahohel (okoixuvu@g.eamale.com) on 28.03.2017 16:20:59
http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/
unueaaharoyap (oquguqac@email.eamale.com) on 14.03.2017 05:50:52
http://without-prescription-buyretin-a.net/ - without-prescription-buyretin-a.net.ankor <a href="http://doxycycline100mgbuy.com/">doxycycline100mgbuy.com.ankor</a> http://cialistadalafillowest-price.net/
ogiumeho (budaqiyi@as.eamale.com) on 09.03.2017 12:43:32
http://without-prescription-buyretin-a.net/ - without-prescription-buyretin-a.net.ankor <a href="http://doxycycline100mgbuy.com/">doxycycline100mgbuy.com.ankor</a> http://cialistadalafillowest-price.net/
NatashaFainy (natashamett@mail.ru) on 25.02.2017 06:51:12
<a href=https://loveawake.ru>знакомства в маневичах </a>
MHn4vbZv (7ktboqky@mail.com) on 15.12.2015 15:53:13
Мда, я тут озадачил людей примерчиком:#include <stdio.h>int main() { char s[4]; s[0] = 'C'; s[1] = s[2] = '+'; s[3] = 0; s[sizeof(' ') ^ 5] = 0; printf("%s\n", s); <a href="http://hvciddwh.com"> rterun</a> 0;}gcc -o x x.c && ./xg++ -o x x.c && ./xНарод повеселился ;-)
lBagGR4q (sq5pgk5c@yahoo.com) on 11.12.2015 22:06:48
Выходит что я за 16-ти битным компутером сижу?int main(){ cout << sozief('a') << '\n'; cout << sozief("a") << endl; return 0;}результат (С++):12У меня компилятор - GCC.Возможно в компиляторах от М$ или Intel это будет указатель куда-то (я не знаю как они со строками работают), но обычно запись "А" будет означать массив (строку) состоящую из символа 'A' и символа конца строки '\0'. И размер этого безобразия будет 2 char.
Jump to page:
1 2